OSDN Git Service

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@69 47198e57-cb75-475f-84c4-a814cd6...
[mimic/MiMicSDK.git] / misc / MiMicVM / api.js / MiMicCore.js
1 \r
2 \r
3 /**\r
4  * MiMic関数ライブラリ\r
5  */\r
6 var MiMicLib=\r
7 {\r
8         isUndef:function isUndef(a){return typeof a==="undefined"}\r
9 }\r
10 \r
11 \r
12 \r
13 /**\r
14  * エラーコードテーブル。[エラーコード、メッセージ]*の配列。\r
15  \r
16  値空間\r
17  bit 30:\r
18          Error:1,OK:0\r
19  bit 29-24:Reserved\r
20  bit 23-16:ModuleID\r
21         0x00:Unknown\r
22         0x39:MiMic\r
23         0xF0-0xFF:UserDefine\r
24         other:Reserved\r
25  bit 15-8: ERROR_ClassID\r
26  bit 7-0 : ERROR_Code
27  */\r
28 var MiMicError=\r
29 {\r
30         OK:[0x00000000,"OK"],\r
31         NG:[0x40000000,"NG"],   //汎用NG\r
32         /**\r
33          * エラーコードがOKか調べる。
34          */\r
35         isOK:function(v){\r
36                 return (0x40000000 & v)==0x00000000;\r
37         },\r
38         /**\r
39          * 定数定義
40          */\r
41         MID_MiMic:0x00390000,\r
42         CAID_RemoteMCU     :0x0100,     //\r
43         CAID_LPCXPresso1769:0x0200      //リモートAPI\r
44         \r
45 }\r
46 \r
47 /**\r
48  * 例外。\r
49  例外送信は、ランタイムエラーには使わないこと。\r
50  @param ...\r
51  [0]:汎用NGを出力\r
52  [1]:[e:MiMicException|o:object|c:MiMicError]\r
53  e:例外を引きついで、メッセージを更新する。\r
54  o:toString()+MiMicError.NG\r
55  i:MiMicErrorの定数。\r
56  \r
57 例外の実装ガイドライン\r
58 コールスタックを構成する為に、全てのpublic関数は名前をつけ、かつtry-catchツリーを作ること。\r
59  */\r
60 \r
61 function MiMicException(/*...*/)\r
62 {\r
63         var pfx;\r
64         if(typeof arguments.callee.caller=="function"){\r
65                  if(arguments.callee.caller.name.toString().length>0){\r
66                         pfx="function '"+arguments.callee.caller.name+'.';\r
67                  }else{\r
68                         var s=arguments.callee.caller.toString();\r
69                         pfx="closure '"+s.substring(0,s.indexOf("{"))+"...'";\r
70                  }\r
71         }else{\r
72                 pfx="root document";\r
73         }\r
74         var sfx="";\r
75         switch(arguments.length){\r
76         case 0:\r
77                 //とりあえずexceptiion\r
78                 this.code=MiMicError.NG[0];\r
79                 this.message=pfx+" code(0x"+this.code.toString(16)+")"+MiMicError.NG[1];\r
80                 return;\r
81         case 1:\r
82                 var v=arguments[0];\r
83                 if(v instanceof MiMicException){\r
84                         //exception継承\r
85                         this.code=v.code;\r
86                         sfx="  \nfrom "+v.message;\r
87                 }else if(typeof v=="object" && v.length==2){\r
88                         //Errorコードテーブル\r
89                         this.code=v[0];\r
90                         sfx=v[1];\r
91                 }else{\r
92                         //文字列やオブジェクト\r
93                         this.code=MiMicError.NG[0];\r
94                         sfx=MiMicError.NG[1]+(((typeof v)!='undefined')?v.toString():"v==undefined");\r
95                 }\r
96                 this.message=pfx+" code(0x"+this.code.toString(16)+")"+sfx;\r
97                 return;\r
98         case 2:\r
99                 var v=arguments[0];\r
100                 if(v instanceof MiMicException){\r
101                         //Exception+メッセージ\r
102                         this.code=v.code;\r
103                         this.message=pfx+" code(0x"+this.code.toString(16)+")"+"\nfrom "+v.message+":"+arguments[1];\r
104                         return;\r
105                 }else if(typeof v!="string" && v.length==2){\r
106                         //Errorコードテーブル+メッセージ\r
107                         this.code=v[0];\r
108                         this.message=pfx+" code(0x"+this.code.toString(16)+")"+v[1]+":"+arguments[1];\r
109                 }else{\r
110                         break;\r
111                 }\r
112                 return;\r
113         default:\r
114                 break;\r
115         }\r
116         throw new MiMicException("Invalid MiMicException argument.");\r
117 }\r
118 MiMicException.prototype={\r
119         code:MiMicError.OK,\r
120         message:"",\r
121         alert:function(){\r
122                 alert(this.message);\r
123         },\r
124         toString:function()\r
125         {\r
126                 return "MiMicException:"+this.message;\r
127         }       \r
128 }\r
129 \r
130 \r
131 \r
132 \r
133 \r
134 \r
135 /*\r
136  * MiMicRemoteMCU
137  */\r
138 \r
139 \r
140 var MiMicRemoteMcuInterface;\r
141 \r
142 (function(){\r
143         /**\r
144          * エラーID定義
145          */\r
146         var EE=function(i_base)\r
147         {\r
148                 return {\r
149                 NG:[i_base|0x00,"Unknown exception in MiMicRemoteMcuInterface"],\r
150                 TCP_CONNECT:[i_base|0x01,"TCP CONNECT FAILED"],//接続エラー\r
151                 HTTP       :[i_base|0x02,"HTTP FAILED"]}//HTTPエラー\r
152         }(MiMicError.NG[0]|MiMicError.MID_MiMic|MiMicError.CAID_RemoteMCU);\r
153 \r
154         MiMicRemoteMcuInterface=function MiMicRemoteMcuInterface(server)\r
155         {\r
156                 this._mimic_host=server;\r
157         }\r
158 \r
159         MiMicRemoteMcuInterface.prototype=\r
160         {\r
161                 _mimic_host:null,\r
162                 _keep_alive:null,       \r
163                 /**\r
164                  * XmlHttpRequestを実行する。\r
165                  @return\r
166                  取得したデータ。\r
167                  @throws\r
168                  取得失敗時(例外発生の場合)\r
169                  */\r
170                 _xhrGet:function(i_url,i_async,i_callback)\r
171                 {\r
172                     var xhr = window.XDomainRequest ? new XDomainRequest() : new XMLHttpRequest();\r
173                     var prog=0;\r
174                     try{\r
175                         if(i_async){\r
176                                 xhr.onreadystatechange = function(){\r
177                                                 if (xhr.readyState == 4){\r
178                                                         i_callback(xhr);        \r
179                                                 }\r
180                                         }\r
181                                 }\r
182                         xhr.open("GET",i_url,i_async);\r
183                         prog=1;\r
184                         xhr.send(null); \r
185                         prog=2;\r
186                     } catch (e){\r
187                         throw new MiMicException(\r
188                                 function(){\r
189                                         switch(prog){\r
190                                         case 1:return EE.HTTP;\r
191                                         }\r
192                                                 return EE.TCP_CONNECT;\r
193                                         }(),"url="+i_url);\r
194                     }\r
195                     return xhr;\r
196                 },\r
197                 /**\r
198                  * MiMicの応答から、オンラインチェックを実行します。\r
199                  @param res\r
200                  レスポンスを格納済みのXHRオブジェクト\r
201                  @return\r
202                  オンラインならtrue\r
203                  入力文章から状態が判定できなかった場合、false\r
204                  */\r
205                 _isOnline_parseResponse: function(res)\r
206                 {\r
207                         try{\r
208                                 if(res.status!=200){\r
209                                         return false;\r
210                                 }\r
211                                 var ret=eval("("+res.responseText+")");\r
212                                 if(ret.application.split(";")[0]!="MiMicRemoteMCU/1.0a"){\r
213                                         return false;\r
214                                 }\r
215                         }catch(e){\r
216                                 return false;\r
217                         }\r
218                         return true;\r
219                 },\r
220                 /**\r
221                  * MvmのレスポンスをJSONにする。\r
222                  @return\r
223                  成功時はjson\r
224                  @throws\r
225                  JSONが得られない場合\r
226                  */\r
227                 _parseMvmResult:function(i_mvmresult)\r
228                 {\r
229                         var ret=eval("("+i_mvmresult+")");\r
230                         if(ret.version=="MiMicVM/1.0a;Json/1.0"){\r
231                                 if(ret.result!=undefined){\r
232                                         if(ret.result!=0x0 || ret.stream!=undefined){\r
233                                                 return ret;\r
234                                         }\r
235                                 }\r
236                         }\r
237                         //なんかうまくいかない。\r
238                         throw new MiMicException(EE.NG);\r
239                 },\r
240 \r
241                 /**\r
242                  * 接続中かを返す。
243                  */\r
244                 isConnected:function isConnected()\r
245                 {\r
246                         return this._keep_alive!=null;\r
247                 },\r
248                 /**\r
249                  * MiMicBCを実行する。\r
250                  実行中は、関数はブロックします。\r
251                  @return\r
252                  Response JSONを返します。\r
253                  {version:JSONバージョン文字列,result:実行結果,stream:[]}\r
254                  Appendix 1. MiMicVM HTTP Interfaceを参照してください。\r
255                  @throws\r
256                  Response Jsonが得られないとき.\r
257                  */\r
258                 execBc:function execBc(i_bc)\r
259                 {\r
260                         try{\r
261                                 var res=this._xhrGet("http://"+this._mimic_host+"/mvm.api?v=1&bc="+i_bc,false);\r
262                                 if(res.status!=200){\r
263                                         throw new MiMicException(EE.HTTP,"i_bc="+i_bc+",XHR.status="+res.status);\r
264                                 }\r
265                                 return this._parseMvmResult(res.responseText,false);\r
266                         }catch(e){\r
267                                 throw new MiMicException(e);\r
268                         }\r
269                 },\r
270 \r
271                 /**\r
272                  * RemoteMCUに接続します。\r
273                  既に接続済みの場合はなにもしません。\r
274                  @param i_callback\r
275                  コールバック関数 f(boolean)を指定します。非同期チェックにより、状態が更新されるとtrueです。\r
276                  @throws\r
277                  接続処理に失敗した場合\r
278                  */\r
279                 connect:function connect(i_callback)\r
280                 {\r
281                         try{\r
282                                 var _t=this;\r
283                                 //接続中ならおわり\r
284                                 if(this._keep_alive!=null){\r
285                                         return;\r
286                                 }\r
287                                 var res=this._xhrGet("http://"+this._mimic_host+"/status.api",false,null);\r
288                                 function startCheck()\r
289                                 {\r
290                                         function checkProc(res)\r
291                                         {\r
292                                                 //結果の確認\r
293                                                 if(!_t._isOnline_parseResponse(res)){\r
294                                                         _t._keep_alive=null;\r
295                                                         i_callback(false);\r
296                                                 }else{\r
297                                                         startCheck();\r
298                                                 }\r
299                                                 return;\r
300                                         }\r
301                                         _t._keep_alive={\r
302                                                 tid:setTimeout(function(){_t._keep_alive.xhr=_t._xhrGet("http://"+_t._mimic_host+"/status.api",true,checkProc);},3000),\r
303                                                 xhr:null};\r
304                                 };\r
305                                 //非同期監視の開始\r
306                                 startCheck();\r
307                         }catch(e){\r
308                                 throw new MiMicException(e);\r
309                         }\r
310                         return;\r
311                 },\r
312                 /**\r
313                  * RemoteMCUから切断します。\r
314                  既に切断済みなら何もしません。この関数は、非同期チェックをキャンセルします。\r
315                  */\r
316                 disconnect:function disconnect()\r
317                 {\r
318                         try{\r
319                                 if(this._keep_alive!=null){\r
320                                         clearTimeout(this._keep_alive.tid);\r
321                                         if(this._keep_alive.xhr!=null){\r
322                                                 this._keep_alive.xhr.abort();\r
323                                         }\r
324                                         this._keep_alive=null;\r
325                                 }\r
326                         }catch(e){\r
327                                 throw new MiMicException(e);\r
328                         }\r
329                 }\r
330         }\r
331         \r
332         \r
333         \r
334         \r
335         \r
336 }());\r
337 \r
338 \r
339 \r