dango_generator 0.0.38

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/LICENSE +16 -0
  2. data/README.txt +41 -0
  3. data/dango_generator.rb +99 -0
  4. data/templates/as3/as3corelib-license.txt +33 -0
  5. data/templates/as3/as3corelib-readme.txt +5 -0
  6. data/templates/as3/com/adobe/crypto/MD5.as +256 -0
  7. data/templates/as3/com/adobe/crypto/SHA1.as +268 -0
  8. data/templates/as3/com/adobe/crypto/SHA224.as +255 -0
  9. data/templates/as3/com/adobe/crypto/SHA256.as +260 -0
  10. data/templates/as3/com/adobe/crypto/WSSEUsernameToken.as +117 -0
  11. data/templates/as3/com/adobe/errors/IllegalStateError.as +66 -0
  12. data/templates/as3/com/adobe/images/BitString.as +42 -0
  13. data/templates/as3/com/adobe/images/JPGEncoder.as +651 -0
  14. data/templates/as3/com/adobe/images/PNGEncoder.as +144 -0
  15. data/templates/as3/com/adobe/net/DynamicURLLoader.as +58 -0
  16. data/templates/as3/com/adobe/net/IURIResolver.as +79 -0
  17. data/templates/as3/com/adobe/net/URI.as +2469 -0
  18. data/templates/as3/com/adobe/net/URIEncodingBitmap.as +142 -0
  19. data/templates/as3/com/adobe/net/proxies/RFC2817Socket.as +204 -0
  20. data/templates/as3/com/adobe/serialization/json/JSON.as +88 -0
  21. data/templates/as3/com/adobe/serialization/json/JSONDecoder.as +218 -0
  22. data/templates/as3/com/adobe/serialization/json/JSONEncoder.as +302 -0
  23. data/templates/as3/com/adobe/serialization/json/JSONParseError.as +90 -0
  24. data/templates/as3/com/adobe/serialization/json/JSONToken.as +107 -0
  25. data/templates/as3/com/adobe/serialization/json/JSONTokenType.as +70 -0
  26. data/templates/as3/com/adobe/serialization/json/JSONTokenizer.as +550 -0
  27. data/templates/as3/com/adobe/utils/ArrayUtil.as +190 -0
  28. data/templates/as3/com/adobe/utils/DateUtil.as +666 -0
  29. data/templates/as3/com/adobe/utils/DictionaryUtil.as +90 -0
  30. data/templates/as3/com/adobe/utils/IntUtil.as +69 -0
  31. data/templates/as3/com/adobe/utils/NumberFormatter.as +77 -0
  32. data/templates/as3/com/adobe/utils/StringUtil.as +257 -0
  33. data/templates/as3/com/adobe/utils/XMLUtil.as +171 -0
  34. data/templates/as3/com/adobe/webapis/ServiceBase.as +51 -0
  35. data/templates/as3/com/adobe/webapis/URLLoaderBase.as +111 -0
  36. data/templates/as3/com/adobe/webapis/events/ServiceEvent.as +78 -0
  37. data/templates/as3/org/rubyforge/dango/DangoClientFramework.as +426 -0
  38. data/templates/as3/org/rubyforge/dango/DangoError.as +11 -0
  39. data/templates/as3/org/rubyforge/dango/DangoErrorCode.as +7 -0
  40. data/templates/as3/org/rubyforge/dango/DangoErrorEvent.as +23 -0
  41. data/templates/as3/org/rubyforge/dango/DangoReceiveEvent.as +21 -0
  42. data/templates/as3/org/rubyforge/dango/DangoURLLoader.as +127 -0
  43. data/templates/as3/org/rubyforge/dango/DangoURLLoaderEvent.as +29 -0
  44. data/templates/as3/org/rubyforge/dango/DangoUtil.as +84 -0
  45. data/templates/dango/config/development.yml +28 -0
  46. data/templates/dango/config/production.yml +3 -0
  47. data/templates/dango/config/system_message.yml +5 -0
  48. data/templates/dango/config/test.yml +3 -0
  49. data/templates/dango/server/99_dango_server.rb +22 -0
  50. data/templates/lib/dango_monitor_client.rb +1 -0
  51. data/templates/lib/dango_tester_client.rb +1 -0
  52. data/templates/script/dango_server +36 -0
  53. data/templates/tasks/dango.rake +2 -0
  54. metadata +108 -0
@@ -0,0 +1,51 @@
1
+ /*
2
+ Adobe Systems Incorporated(r) Source Code License Agreement
3
+ Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
4
+
5
+ Please read this Source Code License Agreement carefully before using
6
+ the source code.
7
+
8
+ Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
9
+ no-charge, royalty-free, irrevocable copyright license, to reproduce,
10
+ prepare derivative works of, publicly display, publicly perform, and
11
+ distribute this source code and such derivative works in source or
12
+ object code form without any attribution requirements.
13
+
14
+ The name "Adobe Systems Incorporated" must not be used to endorse or promote products
15
+ derived from the source code without prior written permission.
16
+
17
+ You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
18
+ against any loss, damage, claims or lawsuits, including attorney's
19
+ fees that arise or result from your use or distribution of the source
20
+ code.
21
+
22
+ THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
23
+ ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
24
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
26
+ NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
27
+ OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
30
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
32
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
33
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
+ */
35
+
36
+
37
+ package com.adobe.webapis
38
+ {
39
+ import flash.events.EventDispatcher;
40
+
41
+ /**
42
+ * Base class for remote service classes.
43
+ */
44
+ public class ServiceBase extends EventDispatcher
45
+ {
46
+ public function ServiceBase()
47
+ {
48
+ }
49
+
50
+ }
51
+ }
@@ -0,0 +1,111 @@
1
+ /*
2
+ Adobe Systems Incorporated(r) Source Code License Agreement
3
+ Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
4
+
5
+ Please read this Source Code License Agreement carefully before using
6
+ the source code.
7
+
8
+ Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
9
+ no-charge, royalty-free, irrevocable copyright license, to reproduce,
10
+ prepare derivative works of, publicly display, publicly perform, and
11
+ distribute this source code and such derivative works in source or
12
+ object code form without any attribution requirements.
13
+
14
+ The name "Adobe Systems Incorporated" must not be used to endorse or promote products
15
+ derived from the source code without prior written permission.
16
+
17
+ You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
18
+ against any loss, damage, claims or lawsuits, including attorney's
19
+ fees that arise or result from your use or distribution of the source
20
+ code.
21
+
22
+ THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
23
+ ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
24
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
26
+ NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
27
+ OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
30
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
32
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
33
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
+ */
35
+
36
+ package com.adobe.webapis
37
+ {
38
+ import flash.events.IOErrorEvent;
39
+ import flash.events.SecurityErrorEvent;
40
+ import flash.events.ProgressEvent;
41
+
42
+ import com.adobe.net.DynamicURLLoader;
43
+
44
+ /**
45
+ * Dispatched when data is
46
+ * received as the download operation progresses.
47
+ *
48
+ * @eventType flash.events.ProgressEvent.PROGRESS
49
+ *
50
+ * @langversion ActionScript 3.0
51
+ * @playerversion Flash 9.0
52
+ */
53
+ [Event(name="progress", type="flash.events.ProgressEvent")]
54
+
55
+ /**
56
+ * Dispatched if a call to the server results in a fatal
57
+ * error that terminates the download.
58
+ *
59
+ * @eventType flash.events.IOErrorEvent.IO_ERROR
60
+ *
61
+ * @langversion ActionScript 3.0
62
+ * @playerversion Flash 9.0
63
+ */
64
+ [Event(name="ioError", type="flash.events.IOErrorEvent")]
65
+
66
+ /**
67
+ * A securityError event occurs if a call attempts to
68
+ * load data from a server outside the security sandbox.
69
+ *
70
+ * @eventType flash.events.SecurityErrorEvent.SECURITY_ERROR
71
+ *
72
+ * @langversion ActionScript 3.0
73
+ * @playerversion Flash 9.0
74
+ */
75
+ [Event(name="securityError", type="flash.events.SecurityErrorEvent")]
76
+
77
+ /**
78
+ * Base class for services that utilize URLLoader
79
+ * to communicate with remote APIs / Services.
80
+ *
81
+ * @langversion ActionScript 3.0
82
+ * @playerversion Flash 9.0
83
+ */
84
+ public class URLLoaderBase extends ServiceBase
85
+ {
86
+ protected function getURLLoader():DynamicURLLoader
87
+ {
88
+ var loader:DynamicURLLoader = new DynamicURLLoader();
89
+ loader.addEventListener("progress", onProgress);
90
+ loader.addEventListener("ioError", onIOError);
91
+ loader.addEventListener("securityError", onSecurityError);
92
+
93
+ return loader;
94
+ }
95
+
96
+ private function onIOError(event:IOErrorEvent):void
97
+ {
98
+ dispatchEvent(event);
99
+ }
100
+
101
+ private function onSecurityError(event:SecurityErrorEvent):void
102
+ {
103
+ dispatchEvent(event);
104
+ }
105
+
106
+ private function onProgress(event:ProgressEvent):void
107
+ {
108
+ dispatchEvent(event);
109
+ }
110
+ }
111
+ }
@@ -0,0 +1,78 @@
1
+ /*
2
+ Adobe Systems Incorporated(r) Source Code License Agreement
3
+ Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
4
+
5
+ Please read this Source Code License Agreement carefully before using
6
+ the source code.
7
+
8
+ Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
9
+ no-charge, royalty-free, irrevocable copyright license, to reproduce,
10
+ prepare derivative works of, publicly display, publicly perform, and
11
+ distribute this source code and such derivative works in source or
12
+ object code form without any attribution requirements.
13
+
14
+ The name "Adobe Systems Incorporated" must not be used to endorse or promote products
15
+ derived from the source code without prior written permission.
16
+
17
+ You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
18
+ against any loss, damage, claims or lawsuits, including attorney's
19
+ fees that arise or result from your use or distribution of the source
20
+ code.
21
+
22
+ THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
23
+ ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
24
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
26
+ NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
27
+ OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
30
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
32
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
33
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
+ */
35
+
36
+
37
+ package com.adobe.webapis.events
38
+ {
39
+
40
+ import flash.events.Event;
41
+
42
+ /**
43
+ * Event class that contains data loaded from remote services.
44
+ *
45
+ * @author Mike Chambers
46
+ */
47
+ public class ServiceEvent extends Event
48
+ {
49
+ private var _data:Object = new Object();;
50
+
51
+ /**
52
+ * Constructor for ServiceEvent class.
53
+ *
54
+ * @param type The type of event that the instance represents.
55
+ */
56
+ public function ServiceEvent(type:String, bubbles:Boolean = false,
57
+ cancelable:Boolean=false)
58
+ {
59
+ super(type, bubbles, cancelable);
60
+ }
61
+
62
+ /**
63
+ * This object contains data loaded in response
64
+ * to remote service calls, and properties associated with that call.
65
+ */
66
+ public function get data():Object
67
+ {
68
+ return _data;
69
+ }
70
+
71
+ public function set data(d:Object):void
72
+ {
73
+ _data = d;
74
+ }
75
+
76
+
77
+ }
78
+ }
@@ -0,0 +1,426 @@
1
+
2
+ package org.rubyforge.dango {
3
+ /**
4
+ * Dangoのクライアントフレームワーク本体のクラス
5
+ *
6
+ */
7
+
8
+ import flash.net.*;
9
+ import flash.events.*;
10
+ import flash.text.*;
11
+ import flash.utils.*;
12
+ import flash.system.*;
13
+ import mx.utils.ObjectUtil;
14
+
15
+ import com.adobe.serialization.json.JSON;
16
+
17
+ import flash.events.IEventDispatcher;
18
+ import flash.events.EventDispatcher;
19
+ import flash.events.Event;
20
+
21
+ import org.rubyforge.dango.DangoUtil;
22
+ import org.rubyforge.dango.DangoErrorCode;
23
+
24
+ public class DangoClientFramework implements IEventDispatcher {
25
+
26
+ private var socket:Socket; //ソケット
27
+ private var dispatcher:EventDispatcher; // Event送出用
28
+
29
+ private var is_debug:Boolean; // Debugモードかどうかのフラグ
30
+ private var is_connect:Boolean = false; // 接続完了しているかどうか
31
+
32
+ private var receve_count:uint = 0; // データ受信回数
33
+
34
+ private var recv_not_yet_size:uint = 0; // データ受信時のキャッシュ
35
+ private var recv_not_yet_str:String = ""; // データ受信時のキャッシュ
36
+
37
+ private var polling_timer:Timer; // ポーリング(ハートビート)用タイマーの設定
38
+ private var polling_timer_msec:uint = 5000; // ポーリング(ハートビート)用タイマーのミリ秒
39
+
40
+ private var delay_send_timer:Timer; // 遅延送信用のタイマーの設定
41
+ private var delay_send_timer_msec:uint = 1500; // 遅延送信用のタイマーのミリ秒
42
+ private var delay_send_cache:Array = []; // 遅延送信用のキャッシュ
43
+
44
+ // private var server_host:String = "172.31.1.74";
45
+ // private var server_host:String = "localhost";
46
+ // private var server_port:int = 15000;
47
+ private var server_host:String;
48
+ private var server_port:int;
49
+
50
+ public var sid:int;
51
+
52
+ /**
53
+ * コンストラクタ
54
+ *
55
+ */
56
+ public function DangoClientFramework(config:*, d:Boolean = false){
57
+ is_debug = d; // Debugモードかどうかのフラグ
58
+
59
+ // 設定ファイルの読み込み
60
+ server_host = config.server_host;
61
+ server_port = config.server_port;
62
+ // is_debug = config.debug;
63
+ is_debug = true;
64
+
65
+ var policy_file_protocol:String = config.policy_file_protocol;
66
+ var policy_file_port:uint = config.policy_file_port;
67
+ var policy_file_path:String = config.policy_file_path;
68
+
69
+
70
+ // Event送出用
71
+ dispatcher = new EventDispatcher(this);
72
+
73
+ // Security.sandboxType
74
+ trace("Security.sandboxType:" + Security.sandboxType);
75
+
76
+ // policy_file
77
+ // if(!policy_file_protocol){ policy_file_protocol = "http" };
78
+ if(!policy_file_path) { policy_file_path = "/crossdomain.xml" };
79
+
80
+ // ソケットの生成
81
+ socket = new Socket();
82
+
83
+ // ソケットのイベントリスナーの追加
84
+ socket.addEventListener(Event.CONNECT, connectHandler, false);
85
+ socket.addEventListener(Event.CONNECT, connectHandler, true);
86
+ socket.addEventListener(Event.CLOSE, closeHandler, false);
87
+ socket.addEventListener(Event.CLOSE, closeHandler, true);
88
+ socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler, false);
89
+ socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler, true);
90
+ socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler, false);
91
+ socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler, true);
92
+ socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler, false);
93
+ socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler, true);
94
+ trace("registered event handling.");
95
+
96
+ // ポリシーファイルの読み込み
97
+ var url_load_policy_file:String;
98
+ // url_load_policy_file = "xmlsocket://" + server_host + ":" + server_port;
99
+ // url_load_policy_file = "http://aiarebaba.hi-fi-net.com/crossdomain.xml";
100
+ url_load_policy_file = "http://" + server_host + policy_file_path;
101
+ trace("url_load_policy_file=" + url_load_policy_file);
102
+ Security.loadPolicyFile(url_load_policy_file);
103
+
104
+ // 接続
105
+ try{
106
+ trace("connectiong... host=" + server_host + " port=" + server_port);
107
+ socket.connect(server_host, server_port);
108
+ trace("connected host=" + server_host + " port=" + server_port);
109
+ } catch(err:Error){
110
+ trace("connect error err=" + err + " name=" + err.name + " message=" + err.message);
111
+ return(void);
112
+ }
113
+
114
+ // polling用タイマーの設定
115
+ var polling_timer:Timer = new Timer(polling_timer_msec, 0); // タイマーの追加
116
+ polling_timer.addEventListener(TimerEvent.TIMER, polling_callback); // イベントリスナーの発行
117
+ polling_timer.start(); // タイマーの作動開始
118
+
119
+ // 遅延送信用タイマーの設定
120
+ var delay_send_timer:Timer = new Timer(delay_send_timer_msec, 0); // タイマーの追加
121
+ delay_send_timer.addEventListener(TimerEvent.TIMER, delay_send_callback); // イベントリスナーの発行
122
+ delay_send_timer.start(); // タイマーの作動開始
123
+ }
124
+
125
+ //接続イベントの処理
126
+ private function connectHandler(evt:Event):void {
127
+ is_connect = true;
128
+ var msg:String = "DangoClientFramework:connectHandler";
129
+ if(is_debug){ trace(msg); }
130
+ }
131
+
132
+ //切断イベントの処理
133
+ private function closeHandler(evt:Event):void {
134
+ // タイマーが動いていれば止める
135
+ if(polling_timer != null && polling_timer.running){ polling_timer.stop(); }
136
+
137
+ is_connect = false;
138
+ var msg:String = "DangoClientFramework:closeHandler";
139
+ if(is_debug){ trace(msg); }
140
+ this.dispatchEvent(new DangoErrorEvent("DangoError", DangoErrorCode.CloseError, msg));
141
+ }
142
+
143
+ //セキュリティエラーイベントの処理
144
+ private function securityErrorHandler(evt:SecurityErrorEvent):void {
145
+ // タイマーが動いていれば止める
146
+ if(polling_timer != null && polling_timer.running){ polling_timer.stop(); }
147
+
148
+ is_connect = false;
149
+ var msg:String = "DangoClientFramework:securityErrorHandler:text=" + evt.text ;
150
+
151
+ if(is_debug){ trace(msg); }
152
+ this.dispatchEvent(new DangoErrorEvent("DangoError", DangoErrorCode.SecurityError, msg));
153
+ }
154
+
155
+ //IOエラーイベントの処理
156
+ private function ioErrorHandler(evt:IOErrorEvent):void {
157
+ // タイマーが動いていれば止める
158
+ if(polling_timer != null && polling_timer.running){ polling_timer.stop(); }
159
+
160
+ is_connect = false;
161
+ var msg:String = "DangoClientFramework:ioErrorHandler";
162
+ if(is_debug){ trace(msg); }
163
+ this.dispatchEvent(new DangoErrorEvent("DangoError", DangoErrorCode.IOError, msg));
164
+ }
165
+
166
+ //プログレスイベントの処理(呼び出し用イベントのディスパッチ)
167
+ private function socketDataHandler(evt:ProgressEvent):void {
168
+ receve_count ++;
169
+ if(is_debug){ trace("DangoClientFramework:socketDataHandler:" + receve_count); }
170
+ var receive_data:Object = this.receive_notice();
171
+
172
+ if(recv_not_yet_size == 0){ // 未受信データが無ければ
173
+ if(receive_data != {}){ // データが空なら無視する
174
+ var notice_name:String = receive_data["notice"];
175
+
176
+ if(notice_name == "_notice_sid"){ // 接続直後のsid通知なら
177
+ this.sid = receive_data["_sid"];
178
+ // if(is_debug){ trace("DangoClientFramework:this.sid=" + this.sid + ":" + DangoUtil.now2str()); }
179
+ if(is_debug){ trace("DangoClientFramework:this.sid=" + this.sid + ":" + receve_count); }
180
+
181
+ } else if(notice_name == "_heart_beat"){ // heart beat通知なら
182
+ if(is_debug){ trace("DangoClientFramework:_heart_beat:" + receve_count); }
183
+
184
+ } else { // 通常のデータならイベント発生
185
+ if(is_debug){ trace("DangoClientFramework:dispatchEvent:dango_" + notice_name + ":" + receve_count); }
186
+ this.dispatchEvent(new DangoReceiveEvent("dango_" + notice_name, receive_data));
187
+ }
188
+ } else { // データが空なら
189
+ // if(is_debug){ trace("DangoClientFramework:receive_data is empty." + DangoUtil.now2str()); }
190
+ if(is_debug){ trace("DangoClientFramework:receive_data is empty."); }
191
+ }
192
+ }
193
+ }
194
+
195
+ // Event送出用
196
+ public function addEventListener(type:String, listener:Function,
197
+ useCapture:Boolean = false,
198
+ priority:int = 0,
199
+ useWeakReference:Boolean = false):void{
200
+ dispatcher.addEventListener(type, listener, useCapture, priority);
201
+ }
202
+ public function dispatchEvent(evt:Event):Boolean{
203
+ return dispatcher.dispatchEvent(evt);
204
+ }
205
+ public function hasEventListener(type:String):Boolean{
206
+ return dispatcher.hasEventListener(type);
207
+ }
208
+ public function removeEventListener(type:String, listener:Function,
209
+ useCapture:Boolean = false):void{
210
+ dispatcher.removeEventListener(type, listener, useCapture);
211
+ }
212
+ public function willTrigger(type:String):Boolean {
213
+ return dispatcher.willTrigger(type);
214
+ }
215
+
216
+
217
+ /**
218
+ * polling_callback
219
+ * ハートビートを送る
220
+ *
221
+ * @param evt:TimerEvent
222
+ * @return void
223
+ */
224
+ public function polling_callback(evt:TimerEvent):void {
225
+ if(is_debug){ trace("DangoClientFramework:polling_callback:" + DangoUtil.now2str() ); }
226
+ if(socket.connected){
227
+ // var send_obj:Object = null;
228
+ // this.send_data_to_server(send_obj);
229
+
230
+ var hb_id:String = String((new Date()).time) + String(this.sid);
231
+ if(is_debug){ trace("DangoClientFramework:send _notice_heart_beat:" + hb_id + ":" + DangoUtil.now2str()); }
232
+ this.send_action("_notice_heart_beat", { "_hb_id": hb_id}); // ハートビート送信
233
+ }
234
+ }
235
+
236
+ /**
237
+ * delay_send_callback
238
+ * 遅延送信用タイマーコールバック
239
+ *
240
+ * @param socket:Socket
241
+ * @param send_obj:Object
242
+ * @return void
243
+ */
244
+ public function delay_send_callback(evt:TimerEvent):void {
245
+ // if(is_debug){ trace("DangoClientFramework:delay_send_callback:evt:" + evt); }
246
+ if(!is_connect){ return(void); }
247
+ if(socket.connected){
248
+ var send_obj_dup:Object;
249
+ var i:uint;
250
+
251
+ for (i = 0; i < 5; i++) {
252
+ if(delay_send_cache.length == 0) { break; }
253
+ send_obj_dup = delay_send_cache.pop();
254
+ // データをすぐ送信
255
+ this.send_data_to_server(send_obj_dup);
256
+ if(is_debug){ trace("DangoClientFramework:delay_send_callback:sent:" + DangoUtil.now2str()); }
257
+ }
258
+ }
259
+ }
260
+
261
+ /**
262
+ * send data to server.
263
+ * クライアント側から使うサーバーへのデータ送信メソッド
264
+ *
265
+ * @param socket:Socket
266
+ * @param send_obj:Object
267
+ * @return void
268
+ */
269
+ public function send_action(action_name:String, send_obj:Object, delay:Boolean=false):void {
270
+ if(is_debug){ trace("DangoClientFramework:send_action:start:" + action_name + ":" + DangoUtil.now2str()); }
271
+
272
+ // if(!is_connect){ throw new DangoError("error:not connect" , 29); } // 接続されていない場合はエラー
273
+
274
+ // 送信データの作成
275
+ var send_obj_dup:Object = ObjectUtil.copy(send_obj);
276
+ send_obj_dup["action"] = action_name;
277
+
278
+ // delayフラグがあったり、接続がまだなら、遅延送信用のキャッシュにデータを入れる
279
+ if(delay || !is_connect){
280
+ delay_send_cache.push(send_obj_dup);
281
+
282
+ if(is_debug){ trace("DangoClientFramework:send_action:delay_pull:" + action_name + ":" + DangoUtil.now2str()); }
283
+ return(void);
284
+ }
285
+
286
+ // データをすぐ送信
287
+ this.send_data_to_server(send_obj_dup);
288
+ if(is_debug){ trace("DangoClientFramework:send_action:end:" + action_name + ":" + DangoUtil.now2str()); }
289
+ }
290
+
291
+ /**
292
+ * send data to server.
293
+ * フレームワーク側のデータ送信の一般処理
294
+ *
295
+ * @param socket:Socket
296
+ * @param send_obj:Object
297
+ * @return void
298
+ */
299
+ public function send_data_to_server( send_obj:Object ):void {
300
+ // if(is_debug){ trace("DangoClientFramework:send_data_to_server:send_obj=" + ObjectUtil.toString(send_obj)); }
301
+
302
+ var type:int = 0;
303
+
304
+ // データが空ならJSONencodeしない
305
+ var send_obj_str:String;
306
+ if(send_obj == null){
307
+ send_obj_str = "\n";
308
+ } else {
309
+ send_obj_str = JSON.encode(send_obj) + "\n";
310
+ }
311
+
312
+ var send_obj_size:int = DangoUtil.string_byte_length(send_obj_str);
313
+
314
+ // if(is_debug){ trace("DangoClientFramework:send:" + type + ":" + send_obj_size + ":" + send_obj_str); }
315
+
316
+ // 長さ送信
317
+ var byte_array:ByteArray = new ByteArray;
318
+ byte_array.writeByte(type);
319
+ byte_array.writeUnsignedInt(send_obj_size);
320
+
321
+ socket.writeBytes(byte_array, 0, 5);
322
+ socket.writeUTFBytes("\n");
323
+ socket.flush();
324
+
325
+ // データ送信
326
+ socket.writeUTFBytes(send_obj_str);
327
+ socket.flush();
328
+
329
+ // if(is_debug){ trace("DangoClientFramework:send_obj_str:" + send_obj_str + ":" + DangoUtil.now2str()); }
330
+ }
331
+
332
+ /**
333
+ * receive data from server.
334
+ * フレームワーク側のデータ受信の一般処理
335
+ *
336
+ * @return Object
337
+ */
338
+ public function receive_notice():Object {
339
+ if(is_debug){ trace("DangoClientFramework:receive_notice:" + receve_count + ":" + DangoUtil.now2str()); }
340
+
341
+ // 変数定義
342
+ var recv_data_orig:String = "";
343
+ var bytes_available:uint;
344
+
345
+ // まず読めるデータをすべてByteArrayに入れる
346
+ var byte_array:ByteArray = new ByteArray;
347
+ socket.readBytes(byte_array, 0, socket.bytesAvailable);
348
+ var byte_read_size:uint = byte_array.length;
349
+
350
+ if(recv_not_yet_size == 0){ // 未受信データが無ければ
351
+ // if(is_debug){ trace("DangoClientFramework:recv_not_yet_size==0"); }
352
+
353
+ if(byte_read_size < 6){ // きちんとデータが届いていなければ
354
+ this.dispatchEvent(new DangoErrorEvent("DangoError", DangoErrorCode.IOError, "byte_read_size is too short."));
355
+ return({});
356
+ }
357
+
358
+ // 長さを取得
359
+ var byte_array_size:ByteArray = new ByteArray;
360
+ try{
361
+ byte_array.readBytes(byte_array_size, 0, 5);
362
+ } catch(err:Error){
363
+ this.dispatchEvent(new DangoErrorEvent("DangoError", DangoErrorCode.IOError, "failed to byte_array.readBytes."));
364
+ return({});
365
+ }
366
+
367
+ var type:int = byte_array_size.readByte();
368
+ recv_not_yet_size = byte_array_size.readUnsignedInt();
369
+ var crlf:String = byte_array.readUTFBytes(1);
370
+ byte_read_size -= 6;
371
+ // if(is_debug){ trace("DangoClientFramework:recv_not_yet_size=" + recv_not_yet_size); }
372
+ }
373
+
374
+ // 読めているだけ読んで、その分recv_not_yet_sizeを減らす
375
+ if(recv_not_yet_size > byte_read_size){
376
+ // if(is_debug){ trace("DangoClientFramework:byte_read_size=" + byte_read_size); }
377
+ recv_data_orig = byte_array.readUTFBytes(byte_read_size);
378
+ recv_not_yet_size -= byte_read_size;
379
+ }else{
380
+ // if(is_debug){ trace("DangoClientFramework:recv_not_yet_size=" + recv_not_yet_size); }
381
+ recv_data_orig = byte_array.readUTFBytes(recv_not_yet_size);
382
+ recv_not_yet_size = 0;
383
+ }
384
+
385
+ // if(is_debug){ trace("DangoClientFramework:recv_data_orig:" + recv_data_orig); }
386
+
387
+ // 全データを受信したかどうかを確認
388
+ if(recv_not_yet_size == 0){ // 受信完了ならJSONパース
389
+ var recv_data:String = recv_not_yet_str + recv_data_orig;
390
+ recv_not_yet_str = "";
391
+
392
+ // if(is_debug){ trace("DangoClientFramework:recieve:data=" + ObjectUtil.toString(recv_data)); }
393
+
394
+ var ret_obj_data:Object;
395
+ if(recv_data && recv_data != "" && recv_data != "\n"){ // データが空じゃないならdecode
396
+ ret_obj_data = JSON.decode(recv_data) as Object;
397
+
398
+ } else { // データが空なら空データを作ってreturn
399
+ ret_obj_data = {};
400
+ return(ret_obj_data);
401
+ }
402
+
403
+ // ret_obj_dataがObjectでnoticeが存在しているかのチェック
404
+ if(!(ret_obj_data is Object) || !(ret_obj_data["notice"] is String)){
405
+ if(!is_connect){ throw new DangoError("error:recieve data is invalid." , 29); }
406
+ }
407
+
408
+ if(ret_obj_data["notice"] == "_notice_sid"){
409
+ if(is_debug){ trace("DangoClientFramework:recieve:_notice_sid:no response:" + receve_count + ":" + DangoUtil.now2str()); }
410
+ }else{
411
+ var response_notice_name:String;
412
+ response_notice_name = "_response";
413
+ if(is_debug){ trace("DangoClientFramework:sending:response:notice_name=" + ret_obj_data["notice"] + ":" + ret_obj_data["_id"] + ":" + receve_count + ":" + DangoUtil.now2str()); }
414
+
415
+ this.send_action(response_notice_name, {"_id":ret_obj_data["_id"]}); // 受信完了確認の為に空データを送る
416
+ }
417
+ return(ret_obj_data);
418
+
419
+ } else { // まだデータが残っているなら空を返す
420
+ recv_not_yet_str += recv_data_orig;
421
+ return({});
422
+ }
423
+ }
424
+
425
+ }
426
+ }
@@ -0,0 +1,11 @@
1
+ //参考:http://livedocs.adobe.com/flex/2_jp/docs/wwhelp/wwhimpl/js/html/wwhelp.htm?href=Part5_ProgAS.html
2
+
3
+ package org.rubyforge.dango {
4
+ import flash.events.*;
5
+
6
+ public class DangoError extends Error {
7
+ public function DangoError(message:String, errorID:int) {
8
+ super(message, errorID);
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,7 @@
1
+ package org.rubyforge.dango {
2
+ public class DangoErrorCode {
3
+ public static var CloseError:uint = 1; // 接続が切れたときのエラーコード
4
+ public static var SecurityError:uint = 2; // セキュリティエラー(crossdomainとか)のエラーコード
5
+ public static var IOError:uint = 3; // IOの失敗時のエラーコード
6
+ }
7
+ }