dango_generator 0.0.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }