OSDN Git Service

8e1e63da0e572e50be941ac30106dbebd9ea7e8e
[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         // <script>, <link>\r
57         \r
58         'amountQueue' : function(){\r
59                 return X_NET_QUEUE_LIST.length;\r
60         }\r
61 \r
62 };\r
63 \r
64 /*\r
65  * @interface\r
66  */\r
67 var X_NET_IWrapper = function(){};\r
68         X_NET_IWrapper.prototype.load   = function(){};\r
69         X_NET_IWrapper.prototype.cancel = function(){};\r
70         X_NET_IWrapper.prototype.reset  = function(){};\r
71 \r
72 \r
73 var X_NET_TYPE_XHR   = 1,\r
74         X_NET_TYPE_JSONP = 2,\r
75         X_NET_TYPE_FORM  = 3,\r
76         X_NET_TYPE_IMAGE = 4,\r
77 \r
78         X_NET_QUEUE_LIST = [],\r
79 \r
80         X_NET_XHRWrapper,\r
81         X_NET_JSONPWrapper,\r
82         X_NET_FormWrapper,\r
83         X_NET_ImageWrapper,\r
84 \r
85         X_NET_currentWrapper,\r
86         X_NET_currentQueue;\r
87 \r
88 /**\r
89  * フレームワークによってラップされたネットワーク機能にアクセスするためのクラス。\r
90  *      \r
91  * @alias X_NET_Queue\r
92  * @class X_NET_Queue\r
93  * @constructs X_NET_Queue\r
94  * @extends {EventDispatcher}\r
95  */\r
96 var X_NET_Queue = X_EventDispatcher[ 'inherits' ](\r
97                 'XNetQueue',\r
98                 X_Class.POOL_OBJECT,\r
99                 \r
100                 /** @lends X_NET_Queue.prototype */\r
101                 {\r
102                         type : 0,\r
103                         data : null,\r
104                         \r
105                         'Constructor' : function( type, data ){\r
106                                 this.type = type;\r
107                                 this.data = data;\r
108                                 \r
109                                 //this[ 'listenOnce' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch );\r
110                                 X_EventDispatcher_systemListen( this, X_EVENT_COMPLETE, X_NET_proxyDispatch );\r
111                                 \r
112                                 X_NET_QUEUE_LIST[ X_NET_QUEUE_LIST.length ] = this;\r
113                                 !X_NET_currentQueue && X_NET_shiftQueue();\r
114                         },\r
115                         \r
116                         'busy' : function(){\r
117                                 return this === X_NET_currentQueue && X_NET_currentWrapper._busy;\r
118                         },\r
119                         \r
120                         'cancel' : function(){\r
121                                 var i = X_NET_QUEUE_LIST.indexOf( this );\r
122                                 if( i !== -1 ){\r
123                                         X_NET_QUEUE_LIST.splice( i, 1 );\r
124                                         this[ 'asyncDispatch' ]( X_EVENT_CANCELED );\r
125                                         this[ 'asyncDispatch' ]( 16, X_EVENT_COMPLETE );\r
126                                 } else\r
127                                 if( this === X_NET_currentQueue ){\r
128                                         X_NET_currentWrapper.cancel();\r
129                                 };\r
130                         }\r
131                 }\r
132         );\r
133 \r
134 function X_NET_proxyDispatch( e ){\r
135         switch( e.type ){\r
136                 case X_EVENT_BEFORE_KILL_INSTANCE :\r
137                         break;\r
138                 case X_EVENT_KILL_INSTANCE :\r
139                         break;                  \r
140                 case X_EVENT_KILL_INSTANCE_CANCELED :\r
141                         break;\r
142                 case X_EVENT_PROGRESS :\r
143                         this[ 'dispatch' ]( e );\r
144                         break;\r
145                 case X_EVENT_SUCCESS :\r
146                 case X_EVENT_ERROR :\r
147                 case X_EVENT_TIMEOUT :\r
148                 case X_EVENT_CANCELED :\r
149                         this[ 'dispatch' ]( e );\r
150                         this[ 'asyncDispatch' ]( X_EVENT_COMPLETE );\r
151                         break;\r
152                 case X_EVENT_COMPLETE :\r
153                         this[ 'kill' ]();\r
154                         X_NET_shiftQueue();\r
155                         break;\r
156         };\r
157 };\r
158 \r
159 function X_NET_shiftQueue(){\r
160         var queue;\r
161         \r
162         if( X_NET_currentQueue ){\r
163                 console.log( 'X_NET_shiftQueue ' + X_NET_currentWrapper._busy );\r
164                 if( X_NET_currentWrapper._busy ) return;\r
165                 X_NET_currentWrapper\r
166                         [ 'unlisten' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR, X_EVENT_TIMEOUT, X_EVENT_CANCELED ], X_NET_currentQueue, X_NET_proxyDispatch )\r
167                         .reset();\r
168                 X_NET_currentQueue = X_NET_currentWrapper = null;\r
169         };\r
170         \r
171         if( !X_NET_QUEUE_LIST.length ) return;\r
172 \r
173         queue = X_NET_QUEUE_LIST.shift();\r
174         \r
175         switch( queue.type ){\r
176                 case X_NET_TYPE_XHR :\r
177                         X_NET_currentWrapper = X_NET_XHRWrapper;\r
178                         break;\r
179                 case X_NET_TYPE_JSONP :\r
180                         X_NET_currentWrapper = X_NET_JSONPWrapper;\r
181                         break;\r
182                 case X_NET_TYPE_FORM :\r
183                         X_NET_currentWrapper = X_NET_FormWrapper;\r
184                         break;\r
185                 case X_NET_TYPE_IMAGE :\r
186                         X_NET_currentWrapper = X_NET_ImageWrapper;\r
187                         break;\r
188         };\r
189         \r
190         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
191         \r
192         X_NET_currentWrapper.load( queue.data );\r
193 };\r
194 \r