OSDN Git Service

Version 0.6.143, fix X.UI.ScrollBox for iOS3.
[pettanr/clientJs.git] / 0.6.x / js / 06_net / 00_XNet.js
1 // TODO  onlineevent offlineevent, netspeed\r
2 // local への通信に対しては、netspeed を更新しない\r
3 \r
4 // http://bugs.jquery.com/ticket/2709\r
5 // <head><base> がある場合、<script>の追加に失敗する\r
6 X[ 'Net' ] = {\r
7 \r
8         'xhrGet' : function( url, obj ){\r
9                 if( X_Type_isString( url ) ){\r
10                         if( obj ){\r
11                                 obj[ 'url' ] = url;\r
12                         } else {\r
13                                 obj = { 'url' : url };\r
14                         };\r
15                 } else {\r
16                         obj = url;\r
17                 };\r
18                 obj[ 'method' ] = 'GET';\r
19                 return new X_NET_Queue( X_NET_TYPE_XHR, obj );\r
20         },\r
21         \r
22         'xhrPost' : function( url, postbody, obj ){\r
23                 if( X_Type_isString( url ) ){\r
24                         if( obj ){\r
25                                 obj[ 'url' ] = url;\r
26                         } else {\r
27                                 obj = { 'url' : url };\r
28                         };\r
29                 } else {\r
30                         obj = url;\r
31                 };\r
32                 obj[ 'method' ] = 'POST';\r
33                 obj[ 'postbody' ] = postbody;\r
34                 return new X_NET_Queue( X_NET_TYPE_XHR, obj );\r
35         },\r
36         \r
37         'formGet' : function(){\r
38                 \r
39         },\r
40         \r
41         'formPost' : function(){\r
42                 \r
43         },\r
44         \r
45         // TODO chashe\r
46         // TODO iframe useful or not. TODO dynamicIframe\r
47         // TODO file: では http: は使えない\r
48         'jsonp' : function( url, useIframe ){\r
49                 return new X_NET_Queue( X_NET_TYPE_JSONP, url );\r
50         },\r
51         \r
52         'image' : function( url, needSize, delay, timeout ){\r
53                 return new X_NET_Queue( X_NET_TYPE_IMAGE, { url : url, needSize : needSize } );\r
54         },\r
55         \r
56         'gadget' : function( obj ){\r
57                 return new X_NET_Queue( 5, obj );\r
58         },\r
59         // <script>, <link>\r
60         \r
61         'amountQueue' : function(){\r
62                 return X_NET_QUEUE_LIST.length;\r
63         }\r
64 \r
65 };\r
66 \r
67 /*\r
68  * @interface\r
69  */\r
70 var X_NET_IWrapper = function(){};\r
71         X_NET_IWrapper.prototype.load   = function(){};\r
72         X_NET_IWrapper.prototype.cancel = function(){};\r
73         X_NET_IWrapper.prototype.reset  = function(){};\r
74 \r
75 \r
76 var X_NET_TYPE_XHR   = 1,\r
77         X_NET_TYPE_JSONP = 2,\r
78         X_NET_TYPE_FORM  = 3,\r
79         X_NET_TYPE_IMAGE = 4,\r
80 \r
81         X_NET_QUEUE_LIST = [],\r
82 \r
83         X_NET_XHRWrapper,\r
84         X_NET_JSONPWrapper,\r
85         X_NET_FormWrapper,\r
86         X_NET_ImageWrapper,\r
87         X_NET_GIMRWrapper,\r
88 \r
89         X_NET_currentWrapper,\r
90         X_NET_currentQueue;\r
91 \r
92 /**\r
93  * フレームワークによってラップされたネットワーク機能にアクセスするためのクラス。\r
94  *      \r
95  * @alias X_NET_Queue\r
96  * @class X_NET_Queue\r
97  * @constructs X_NET_Queue\r
98  * @extends {EventDispatcher}\r
99  */\r
100 var X_NET_Queue = X_EventDispatcher[ 'inherits' ](\r
101                 'XNetQueue',\r
102                 X_Class.POOL_OBJECT,\r
103                 \r
104                 /** @lends X_NET_Queue.prototype */\r
105                 {\r
106                         type : 0,\r
107                         data : null,\r
108                         \r
109                         'Constructor' : function( type, data ){\r
110                                 this.type = type;\r
111                                 this.data = data;\r
112                                 \r
113                                 //this[ 'listenOnce' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch );\r
114                                 X_EventDispatcher_systemListen( this, X_EVENT_COMPLETE, X_NET_proxyDispatch );\r
115                                 \r
116                                 X_NET_QUEUE_LIST[ X_NET_QUEUE_LIST.length ] = this;\r
117                                 !X_NET_currentQueue && X_NET_shiftQueue();\r
118                         },\r
119                         \r
120                         'busy' : function(){\r
121                                 return this === X_NET_currentQueue && X_NET_currentWrapper._busy;\r
122                         },\r
123                         \r
124                         'cancel' : function(){\r
125                                 var i = X_NET_QUEUE_LIST.indexOf( this );\r
126                                 if( i !== -1 ){\r
127                                         X_NET_QUEUE_LIST.splice( i, 1 );\r
128                                         this[ 'asyncDispatch' ]( X_EVENT_CANCELED );\r
129                                         this[ 'asyncDispatch' ]( 16, X_EVENT_COMPLETE );\r
130                                 } else\r
131                                 if( this === X_NET_currentQueue ){\r
132                                         X_NET_currentWrapper.cancel();\r
133                                 };\r
134                         }\r
135                 }\r
136         );\r
137 \r
138 function X_NET_proxyDispatch( e ){\r
139         switch( e.type ){\r
140                 case X_EVENT_BEFORE_KILL_INSTANCE :\r
141                         break;\r
142                 case X_EVENT_KILL_INSTANCE :\r
143                         break;                  \r
144                 case X_EVENT_KILL_INSTANCE_CANCELED :\r
145                         break;\r
146                 case X_EVENT_PROGRESS :\r
147                         this[ 'dispatch' ]( e );\r
148                         break;\r
149                 case X_EVENT_SUCCESS :\r
150                 case X_EVENT_ERROR :\r
151                 case X_EVENT_TIMEOUT :\r
152                 case X_EVENT_CANCELED :\r
153                         this[ 'dispatch' ]( e );\r
154                         this[ 'asyncDispatch' ]( X_EVENT_COMPLETE );\r
155                         break;\r
156                 case X_EVENT_COMPLETE :\r
157                         this[ 'kill' ]();\r
158                         X_NET_shiftQueue();\r
159                         break;\r
160         };\r
161 };\r
162 \r
163 function X_NET_shiftQueue(){\r
164         var queue;\r
165         \r
166         if( X_NET_currentQueue ){\r
167                 console.log( 'X_NET_shiftQueue ' + X_NET_currentWrapper._busy );\r
168                 if( X_NET_currentWrapper._busy ) return;\r
169                 X_NET_currentWrapper\r
170                         [ 'unlisten' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR, X_EVENT_TIMEOUT, X_EVENT_CANCELED ], X_NET_currentQueue, X_NET_proxyDispatch )\r
171                         .reset();\r
172                 X_NET_currentQueue = X_NET_currentWrapper = null;\r
173         };\r
174         \r
175         if( !X_NET_QUEUE_LIST.length ) return;\r
176 \r
177         queue = X_NET_QUEUE_LIST.shift();\r
178         \r
179         switch( queue.type ){\r
180                 case X_NET_TYPE_XHR :\r
181                         X_NET_currentWrapper = X_NET_XHRWrapper;\r
182                         break;\r
183                 case X_NET_TYPE_JSONP :\r
184                         X_NET_currentWrapper = X_NET_JSONPWrapper; // X_NET_JSONPWrapper || createJSONPWrapper\r
185                         break;\r
186                 case X_NET_TYPE_FORM :\r
187                         X_NET_currentWrapper = X_NET_FormWrapper;\r
188                         break;\r
189                 case X_NET_TYPE_IMAGE :\r
190                         X_NET_currentWrapper = X_NET_ImageWrapper;\r
191                         break;\r
192                 case 5 :\r
193                         X_NET_currentWrapper = X_NET_GIMRWrapper;\r
194                         break;\r
195         };\r
196         \r
197         X_NET_currentWrapper[ 'listen' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR, X_EVENT_TIMEOUT, X_EVENT_CANCELED ], X_NET_currentQueue = queue, X_NET_proxyDispatch );\r
198         \r
199         X_NET_currentWrapper.load( queue.data );\r
200 };\r
201 \r