OSDN Git Service

Version 0.6.134, add comments for closure compiler.
[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, type ){\r
9                 return new X_NET_Queue( X_NET_TYPE_XHR, { method : 'GET', url : url, type : type } );\r
10         },\r
11         \r
12         'xhrPost' : function( url, type, postbody ){\r
13                 return new X_NET_Queue( X_NET_TYPE_XHR, { method : 'POST', url : url, type : type, postbody : postbody } );\r
14         },\r
15         \r
16         'formGet' : function(){\r
17                 \r
18         },\r
19         \r
20         'formPost' : function(){\r
21                 \r
22         },\r
23         \r
24         // TODO chashe\r
25         // TODO iframe useful or not. TODO dynamicIframe\r
26         // TODO file: では http: は使えない\r
27         'jsonp' : function( url, useIframe ){\r
28                 return new X_NET_Queue( X_NET_TYPE_JSONP, url );\r
29         },\r
30         \r
31         'image' : function( url, needSize, delay, timeout ){\r
32                 return new X_NET_Queue( X_NET_TYPE_IMAGE, { url : url, needSize : needSize } );\r
33         },\r
34         \r
35         // <script>, <link>\r
36         \r
37         'amountQueue' : function(){\r
38                 return X_NET_QUEUE_LIST.length;\r
39         }\r
40 \r
41 };\r
42 \r
43 /*\r
44  * @interface\r
45  */\r
46 var X_NET_IWrapper = function(){};\r
47         X_NET_IWrapper.prototype.load   = function(){};\r
48         X_NET_IWrapper.prototype.cancel = function(){};\r
49         X_NET_IWrapper.prototype.reset  = function(){};\r
50 \r
51 \r
52 var X_NET_TYPE_XHR   = 1,\r
53         X_NET_TYPE_JSONP = 2,\r
54         X_NET_TYPE_FORM  = 3,\r
55         X_NET_TYPE_IMAGE = 4,\r
56 \r
57         X_NET_QUEUE_LIST = [],\r
58 \r
59         X_NET_XHRWrapper,\r
60         X_NET_JSONPWrapper,\r
61         X_NET_FormWrapper,\r
62         X_NET_ImageWrapper,\r
63 \r
64         X_NET_currentWrapper,\r
65         X_NET_currentQueue;\r
66 \r
67 /**\r
68  * フレームワークによってラップされたネットワーク機能にアクセスするためのクラス。\r
69  *      \r
70  * @alias X_NET_Queue\r
71  * @class X_NET_Queue\r
72  * @constructs X_NET_Queue\r
73  * @extends {EventDispatcher}\r
74  */\r
75 var X_NET_Queue = X_EventDispatcher[ 'inherits' ](\r
76                 'XNetQueue',\r
77                 X.Class.POOL_OBJECT,\r
78                 \r
79                 /** @lends X_NET_Queue.prototype */\r
80                 {\r
81                         type : 0,\r
82                         data : null,\r
83                         \r
84                         'Constructor' : function( type, data ){\r
85                                 this.type = type;\r
86                                 this.data = data;                               \r
87                                 \r
88                                 //this[ 'listenOnce' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch );\r
89                                 X_EventDispatcher_systemListen( this, X_EVENT_COMPLETE, X_NET_proxyDispatch );\r
90                                 \r
91                                 X_NET_QUEUE_LIST[ X_NET_QUEUE_LIST.length ] = this;\r
92                                 !X_NET_currentQueue && X_NET_shiftQueue();\r
93                         },\r
94                         \r
95                         'busy' : function(){\r
96                                 return this === X_NET_currentQueue && X_NET_currentWrapper._busy;\r
97                         },\r
98                         \r
99                         'cancel' : function(){\r
100                                 var i = X_NET_QUEUE_LIST.indexOf( this );\r
101                                 if( i !== -1 ){\r
102                                         X_NET_QUEUE_LIST.splice( i, 1 );\r
103                                         this[ 'asyncDispatch' ]( X_EVENT_CANCELED );\r
104                                         this[ 'asyncDispatch' ]( 16, X_EVENT_COMPLETE );\r
105                                 } else\r
106                                 if( this === X_NET_currentQueue ){\r
107                                         X_NET_currentWrapper.cancel();\r
108                                 };\r
109                         }\r
110                 }\r
111         );\r
112 \r
113 function X_NET_proxyDispatch( e ){\r
114         switch( e.type ){\r
115                 case X_EVENT_BEFORE_KILL_INSTANCE :\r
116                         break;\r
117                 case X_EVENT_KILL_INSTANCE :\r
118                         break;                  \r
119                 case X_EVENT_KILL_INSTANCE_CANCELED :\r
120                         break;\r
121                 case X_EVENT_PROGRESS :\r
122                         this[ 'dispatch' ]( e );\r
123                         break;\r
124                 case X_EVENT_SUCCESS :\r
125                 case X_EVENT_ERROR :\r
126                 case X_EVENT_TIMEOUT :\r
127                 case X_EVENT_CANCELED :\r
128                         this[ 'dispatch' ]( e );\r
129                         this[ 'asyncDispatch' ]( X_EVENT_COMPLETE );\r
130                         break;\r
131                 case X_EVENT_COMPLETE :\r
132                         this[ 'kill' ]();\r
133                         X_NET_shiftQueue();\r
134                         break;\r
135         };\r
136 };\r
137 \r
138 function X_NET_shiftQueue(){\r
139         var queue;\r
140         \r
141         if( X_NET_currentQueue ){\r
142                 console.log( 'X_NET_shiftQueue ' + X_NET_currentWrapper._busy );\r
143                 if( X_NET_currentWrapper._busy ) return;\r
144                 X_NET_currentWrapper\r
145                         [ 'unlisten' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR, X_EVENT_TIMEOUT, X_EVENT_CANCELED ], X_NET_currentQueue, X_NET_proxyDispatch )\r
146                         .reset();\r
147                 X_NET_currentQueue = X_NET_currentWrapper = null;\r
148         };\r
149         \r
150         if( !X_NET_QUEUE_LIST.length ) return;\r
151 \r
152         queue = X_NET_QUEUE_LIST.shift();\r
153         \r
154         switch( queue.type ){\r
155                 case X_NET_TYPE_XHR :\r
156                         X_NET_currentWrapper = X_NET_XHRWrapper;\r
157                         break;\r
158                 case X_NET_TYPE_JSONP :\r
159                         X_NET_currentWrapper = X_NET_JSONPWrapper;\r
160                         break;\r
161                 case X_NET_TYPE_FORM :\r
162                         X_NET_currentWrapper = X_NET_FormWrapper;\r
163                         break;\r
164                 case X_NET_TYPE_IMAGE :\r
165                         X_NET_currentWrapper = X_NET_ImageWrapper;\r
166                         break;\r
167         };\r
168         \r
169         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
170         \r
171         X_NET_currentWrapper.load( queue.data );\r
172 };\r
173 \r