* along with this program. If not, see <http://www.gnu.org/licenses/>.\r
*\r
* For further information please contact.\r
- * http://nyatla.jp/\r
- * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * http://nyatla.jp/\r
+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
*\r
*********************************************************************************/\r
#include "NyLPC_cModRemoteMcu.h"\r
#define SIZE_OF_IBUF 256\r
struct TModMiMicRemoteMcuHeader\r
{\r
- struct NyLPC_THttpBasicHeader super;\r
- NyLPC_TUInt8 _content_id;\r
- //解析用\r
- NyLPC_TUInt8 _qery_name_id;\r
- NyLPC_TUInt8 _astate;\r
- NyLPC_TInt16 _prefix_len;\r
- NyLPC_TcStr_t _tstr;\r
- NyLPC_TChar _tstr_buf[16];\r
- struct NyLPC_TUInt32ArrayPtr _binarray;\r
- /** 文字列のパーサ*/\r
- NyLPC_TcMiMicDbCompiler_t _binparser;\r
- NyLPC_TcMiMicTxtCompiler_t _txtcmp;\r
- union{\r
- struct{\r
- NyLPC_TUInt8 v;//バージョン\r
- NyLPC_TUInt8 o;//outputスタイル\r
- /**\r
- * il_bufはbcとdbの2パートのデータを格納します。\r
- * 先頭からbc_lenの長さのBCパートと、db_partからdb_lenの長さのデータです。\r
- */\r
- struct{\r
- /** MiMicVMインストラクションの蓄積用。前半にTXT,後半にDBを格納する。 */\r
- NyLPC_TUInt32 bc_buf[SIZE_OF_IBUF];\r
- /** MiMicVM入力ストリーム(MimicDB)の開始位置(bufの一部を指す) */\r
- const NyLPC_TUInt32* db_part;\r
- /** MiMicTXTのワード長(1ワード32bit)*/\r
- NyLPC_TUInt16 txt_len;\r
- /** MiMicDBのワード長(1ワード32bit)*/\r
- NyLPC_TUInt16 db_len;\r
- }vm_instruction;\r
- }mvm;\r
- struct{\r
- /**\r
- * 不明な名前の場合は、ここに名前をコピー\r
- */\r
- NyLPC_TChar path[32];\r
- }unknown;\r
- }content;\r
+ struct NyLPC_THttpBasicHeader super;\r
+ NyLPC_TUInt8 _content_id;\r
+ //解析用\r
+ NyLPC_TUInt8 _qery_name_id;\r
+ NyLPC_TUInt8 _astate;\r
+ NyLPC_TInt16 _prefix_len;\r
+ NyLPC_TcStr_t _tstr;\r
+ NyLPC_TChar _tstr_buf[16];\r
+ struct NyLPC_TUInt32ArrayPtr _binarray;\r
+ /** 文字列のパーサ*/\r
+ NyLPC_TcMiMicDbCompiler_t _binparser;\r
+ NyLPC_TcMiMicTxtCompiler_t _txtcmp;\r
+ union{\r
+ struct{\r
+ NyLPC_TUInt8 v;//バージョン\r
+ NyLPC_TUInt8 o;//outputスタイル\r
+ /**\r
+ * il_bufはbcとdbの2パートのデータを格納します。\r
+ * 先頭からbc_lenの長さのBCパートと、db_partからdb_lenの長さのデータです。\r
+ */\r
+ struct{\r
+ /** MiMicVMインストラクションの蓄積用。前半にTXT,後半にDBを格納する。 */\r
+ NyLPC_TUInt32 bc_buf[SIZE_OF_IBUF];\r
+ /** MiMicVM入力ストリーム(MimicDB)の開始位置(bufの一部を指す) */\r
+ const NyLPC_TUInt32* db_part;\r
+ /** MiMicTXTのワード長(1ワード32bit)*/\r
+ NyLPC_TUInt16 txt_len;\r
+ /** MiMicDBのワード長(1ワード32bit)*/\r
+ NyLPC_TUInt16 db_len;\r
+ }vm_instruction;\r
+ }mvm;\r
+ struct{\r
+ /**\r
+ * 不明な名前の場合は、ここに名前をコピー\r
+ */\r
+ NyLPC_TChar path[32];\r
+ }unknown;\r
+ }content;\r
};\r
\r
\r
\r
#define ST_PARSE_PATH 1\r
#define ST_PARSE_QUERY_NAME 2\r
-#define ST_PARSE_QUERY_VALUE 3 //Query読み出し中\r
+#define ST_PARSE_QUERY_VALUE 3 //Query読み出し中\r
#define ST_PARSE_QUERY_VALUE_V 4\r
#define ST_PARSE_QUERY_VALUE_O 5\r
#define ST_PARSE_QUERY_VALUE_BC 6\r
#define CONTENT_ID_UNKNOWN 0\r
\r
\r
-#define QNAME_ID_V 1\r
-#define QNAME_ID_O 2\r
-#define QNAME_ID_BC 3\r
+#define QNAME_ID_V 1\r
+#define QNAME_ID_O 2\r
+#define QNAME_ID_BC 3\r
#define QNAME_ID_UNKNOWN 0\r
\r
/**\r
* TRemoteMcuRequest.content.mvm.oの値\r
*/\r
-#define QVAL_O_UNKNOWN 0 //default\r
+#define QVAL_O_UNKNOWN 0 //default\r
#define QVAL_O_XML 1\r
#define QVAL_O_JSON 2\r
\r
-#define QVAL_V_UNKNOWN 0\r
-#define QVAL_V_1 1\r
+#define QVAL_V_UNKNOWN 0\r
+#define QVAL_V_1 1\r
\r
\r
static const struct NyLPC_TTextIdTbl url_tbl[]=\r
{\r
- {"mvm.api",CONTENT_ID_MVM},\r
- {"status.api",CONTENT_ID_STATUS},\r
- {NULL,CONTENT_ID_UNKNOWN}\r
+ {"mvm.api",CONTENT_ID_MVM},\r
+ {"status.api",CONTENT_ID_STATUS},\r
+ {NULL,CONTENT_ID_UNKNOWN}\r
};\r
\r
static const struct NyLPC_TTextIdTbl qname_id_table[]=\r
{\r
- {"o",QNAME_ID_O},\r
- {"bc",QNAME_ID_BC},\r
- {"v",QNAME_ID_V},\r
- {NULL,QNAME_ID_UNKNOWN}\r
+ {"o",QNAME_ID_O},\r
+ {"bc",QNAME_ID_BC},\r
+ {"v",QNAME_ID_V},\r
+ {NULL,QNAME_ID_UNKNOWN}\r
};\r
\r
\r
\r
static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)\r
{\r
- NyLPC_TUInt16 ol;\r
- struct TModMiMicRemoteMcuHeader* out=(struct TModMiMicRemoteMcuHeader*)o_out;\r
- //読み飛ばし\r
- if(out->_prefix_len<0){\r
- out->_prefix_len++;\r
- return NyLPC_TBool_TRUE;//読み飛ばし\r
- }\r
- if(out->_astate==ST_PARSE_PATH){\r
- if(i_c!='\0' && i_c!='?'){\r
- if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
- //ERROR\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- }else{\r
- out->_content_id=NyLPC_TTextIdTbl_getMatchId(NyLPC_cStr_str(&(out->_tstr)),url_tbl);\r
- switch(out->_content_id)\r
- {\r
- case CONTENT_ID_MVM:\r
- out->content.mvm.vm_instruction.txt_len=0;\r
- out->content.mvm.vm_instruction.db_len=0;\r
- out->content.mvm.vm_instruction.db_part=NULL;\r
- NyLPC_TUInt32ArrayPtr_setBuf(&out->_binarray,out->content.mvm.vm_instruction.bc_buf,SIZE_OF_IBUF);\r
- out->content.mvm.o=QVAL_O_JSON;\r
- out->content.mvm.v=QVAL_V_UNKNOWN;\r
- break;\r
- default:\r
- break;\r
- }\r
- NyLPC_cStr_clear(&(out->_tstr));\r
- out->_astate=ST_PARSE_QUERY_NAME;//クエリ名解析へ\r
- }\r
- return NyLPC_TBool_TRUE;\r
- }\r
- switch(out->_content_id)\r
- {\r
- case CONTENT_ID_MVM:\r
- switch(out->_astate){\r
- case ST_PARSE_QUERY_NAME:\r
- if(i_c!='\0' && i_c!='&' && i_c!='='){\r
- if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- }else{\r
- //Query確定。\r
- out->_qery_name_id=NyLPC_TTextIdTbl_getMatchId(NyLPC_cStr_str(&(out->_tstr)),qname_id_table);\r
- NyLPC_cStr_clear(&(out->_tstr));\r
- //クエリ値がある場合\r
- switch(out->_qery_name_id){\r
- case QNAME_ID_O:\r
- out->_astate=ST_PARSE_QUERY_VALUE_O;//MIMICBCのDBパラメータパーサを借用。\r
- break;\r
- case QNAME_ID_V:\r
- out->_astate=ST_PARSE_QUERY_VALUE_V;\r
- break;\r
- case QNAME_ID_BC:\r
- out->_astate=ST_PARSE_QUERY_VALUE_BC;\r
- break;\r
- default:\r
- out->_astate=ST_PARSE_QUERY_VALUE;\r
- break;\r
- }\r
- }\r
- return NyLPC_TBool_TRUE;\r
- case ST_PARSE_QUERY_VALUE:\r
- //未知のクエリは無視\r
- if(i_c!='\0' && i_c!='&'){\r
- }else{\r
- //クエリ値解析完了\r
- out->_astate=ST_PARSE_QUERY_NAME;\r
- }\r
- return NyLPC_TBool_TRUE;\r
- case ST_PARSE_QUERY_VALUE_O:\r
- if(i_c!='\0' && i_c!='&'){\r
- if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- }else{\r
- if(NyLPC_cStr_isEqual(&(out->_tstr),"j")){\r
- out->content.mvm.o=QVAL_O_JSON;\r
- }else if(NyLPC_cStr_isEqual(&(out->_tstr),"x")){\r
- out->content.mvm.o=QVAL_O_XML;\r
- }\r
- out->_astate=ST_PARSE_QUERY_NAME;\r
- NyLPC_cStr_clear(&(out->_tstr));\r
- }\r
- return NyLPC_TBool_TRUE;\r
- case ST_PARSE_QUERY_VALUE_V:\r
- if(i_c!='\0' && i_c!='&'){\r
- if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- }else{\r
- if(NyLPC_cStr_isEqual(&(out->_tstr),"1")){\r
- out->content.mvm.v=QVAL_V_1;\r
- }\r
- out->_astate=ST_PARSE_QUERY_NAME;\r
- NyLPC_cStr_clear(&(out->_tstr));\r
- }\r
- return NyLPC_TBool_TRUE;\r
- case ST_PARSE_QUERY_VALUE_BC:\r
- if(i_c!='\0' && i_c!='&'){\r
- //コンパイル\r
- switch(NyLPC_cMiMicTxtCompiler_compileFragment2(&(out->_txtcmp),i_c,&(out->_binarray),&ol))\r
- {\r
- case NyLPC_TcMiMicTxtCompiler_RET_OK:\r
- //命令確定。\r
- break;\r
- case NyLPC_TcMiMicTxtCompiler_RET_OK_END:\r
- //命令終端検出->モード切替\r
- out->content.mvm.vm_instruction.txt_len=SIZE_OF_IBUF-out->_binarray.len+ol;\r
- out->content.mvm.vm_instruction.db_part=out->content.mvm.vm_instruction.bc_buf+out->content.mvm.vm_instruction.txt_len;\r
- out->_astate=ST_PARSE_QUERY_VALUE_DB;\r
- break;\r
- case NyLPC_TcMiMicTxtCompiler_RET_CONTINUE:\r
- //何もしない\r
- break;\r
- case NyLPC_TcMiMicTxtCompiler_RET_NG:\r
- default:\r
- //ERROR\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- }\r
- return NyLPC_TBool_TRUE;\r
-// //フラグメント終端が検出できない終了はエラー\r
-// NyLPC_OnErrorGoto(ERROR);\r
- case ST_PARSE_QUERY_VALUE_DB:\r
- if(i_c!='\0' && i_c!='&'){\r
- switch(NyLPC_cMiMicDbCompiler_compileFragment2(&(out->_binparser),i_c,out->_binarray.ptr))\r
- {\r
- case NyLPC_TcMiMicDbCompiler_RET_CONTINUE:\r
- break;\r
- case NyLPC_TcMiMicDbCompiler_RET_OK:\r
- //\r
- if(!NyLPC_TUInt32ArrayPtr_seek(&(out->_binarray),1)){\r
- //ERROR\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicDbCompiler_RET_ERROR:\r
- default:\r
- //ERROR\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- }else{\r
- //区切りのいいところで終わってる?\r
- if(NyLPC_cMiMicDbCompiler_hasFragment(&(out->_binparser))){\r
- //ERROR\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- out->content.mvm.vm_instruction.db_len=((NyLPC_TUInt8*)(out->_binarray.ptr)-(NyLPC_TUInt8*)(out->content.mvm.vm_instruction.db_part))/sizeof(NyLPC_TUInt32);\r
-\r
- //終端しているなら、次のクエリへ\r
- out->_astate=ST_PARSE_QUERY_NAME;\r
- }\r
- return NyLPC_TBool_TRUE;\r
- default:\r
- break;\r
- }\r
- NyLPC_OnErrorGoto(ERROR);\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- return NyLPC_TBool_TRUE;\r
+ NyLPC_TUInt16 ol;\r
+ struct TModMiMicRemoteMcuHeader* out=(struct TModMiMicRemoteMcuHeader*)o_out;\r
+ //読み飛ばし\r
+ if(out->_prefix_len<0){\r
+ out->_prefix_len++;\r
+ return NyLPC_TBool_TRUE;//読み飛ばし\r
+ }\r
+ if(out->_astate==ST_PARSE_PATH){\r
+ if(i_c!='\0' && i_c!='?'){\r
+ if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
+ //ERROR\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ }else{\r
+ out->_content_id=NyLPC_TTextIdTbl_getMatchId(NyLPC_cStr_str(&(out->_tstr)),url_tbl);\r
+ switch(out->_content_id)\r
+ {\r
+ case CONTENT_ID_MVM:\r
+ out->content.mvm.vm_instruction.txt_len=0;\r
+ out->content.mvm.vm_instruction.db_len=0;\r
+ out->content.mvm.vm_instruction.db_part=NULL;\r
+ NyLPC_TUInt32ArrayPtr_setBuf(&out->_binarray,out->content.mvm.vm_instruction.bc_buf,SIZE_OF_IBUF);\r
+ out->content.mvm.o=QVAL_O_JSON;\r
+ out->content.mvm.v=QVAL_V_UNKNOWN;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ NyLPC_cStr_clear(&(out->_tstr));\r
+ out->_astate=ST_PARSE_QUERY_NAME;//クエリ名解析へ\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
+ }\r
+ switch(out->_content_id)\r
+ {\r
+ case CONTENT_ID_MVM:\r
+ switch(out->_astate){\r
+ case ST_PARSE_QUERY_NAME:\r
+ if(i_c!='\0' && i_c!='&' && i_c!='='){\r
+ if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ }else{\r
+ //Query確定。\r
+ out->_qery_name_id=NyLPC_TTextIdTbl_getMatchId(NyLPC_cStr_str(&(out->_tstr)),qname_id_table);\r
+ NyLPC_cStr_clear(&(out->_tstr));\r
+ //クエリ値がある場合\r
+ switch(out->_qery_name_id){\r
+ case QNAME_ID_O:\r
+ out->_astate=ST_PARSE_QUERY_VALUE_O;//MIMICBCのDBパラメータパーサを借用。\r
+ break;\r
+ case QNAME_ID_V:\r
+ out->_astate=ST_PARSE_QUERY_VALUE_V;\r
+ break;\r
+ case QNAME_ID_BC:\r
+ out->_astate=ST_PARSE_QUERY_VALUE_BC;\r
+ break;\r
+ default:\r
+ out->_astate=ST_PARSE_QUERY_VALUE;\r
+ break;\r
+ }\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
+ case ST_PARSE_QUERY_VALUE:\r
+ //未知のクエリは無視\r
+ if(i_c!='\0' && i_c!='&'){\r
+ }else{\r
+ //クエリ値解析完了\r
+ out->_astate=ST_PARSE_QUERY_NAME;\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
+ case ST_PARSE_QUERY_VALUE_O:\r
+ if(i_c!='\0' && i_c!='&'){\r
+ if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ }else{\r
+ if(NyLPC_cStr_isEqual(&(out->_tstr),"j")){\r
+ out->content.mvm.o=QVAL_O_JSON;\r
+ }else if(NyLPC_cStr_isEqual(&(out->_tstr),"x")){\r
+ out->content.mvm.o=QVAL_O_XML;\r
+ }\r
+ out->_astate=ST_PARSE_QUERY_NAME;\r
+ NyLPC_cStr_clear(&(out->_tstr));\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
+ case ST_PARSE_QUERY_VALUE_V:\r
+ if(i_c!='\0' && i_c!='&'){\r
+ if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ }else{\r
+ if(NyLPC_cStr_isEqual(&(out->_tstr),"1")){\r
+ out->content.mvm.v=QVAL_V_1;\r
+ }\r
+ out->_astate=ST_PARSE_QUERY_NAME;\r
+ NyLPC_cStr_clear(&(out->_tstr));\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
+ case ST_PARSE_QUERY_VALUE_BC:\r
+ if(i_c!='\0' && i_c!='&'){\r
+ //コンパイル\r
+ switch(NyLPC_cMiMicTxtCompiler_compileFragment2(&(out->_txtcmp),i_c,&(out->_binarray),&ol))\r
+ {\r
+ case NyLPC_TcMiMicTxtCompiler_RET_OK:\r
+ //命令確定。\r
+ break;\r
+ case NyLPC_TcMiMicTxtCompiler_RET_OK_END:\r
+ //命令終端検出->モード切替\r
+ out->content.mvm.vm_instruction.txt_len=SIZE_OF_IBUF-out->_binarray.len+ol;\r
+ out->content.mvm.vm_instruction.db_part=out->content.mvm.vm_instruction.bc_buf+out->content.mvm.vm_instruction.txt_len;\r
+ out->_astate=ST_PARSE_QUERY_VALUE_DB;\r
+ break;\r
+ case NyLPC_TcMiMicTxtCompiler_RET_CONTINUE:\r
+ //何もしない\r
+ break;\r
+ case NyLPC_TcMiMicTxtCompiler_RET_NG:\r
+ default:\r
+ //ERROR\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
+// //フラグメント終端が検出できない終了はエラー\r
+// NyLPC_OnErrorGoto(ERROR);\r
+ case ST_PARSE_QUERY_VALUE_DB:\r
+ if(i_c!='\0' && i_c!='&'){\r
+ switch(NyLPC_cMiMicDbCompiler_compileFragment2(&(out->_binparser),i_c,out->_binarray.ptr))\r
+ {\r
+ case NyLPC_TcMiMicDbCompiler_RET_CONTINUE:\r
+ break;\r
+ case NyLPC_TcMiMicDbCompiler_RET_OK:\r
+ //\r
+ if(!NyLPC_TUInt32ArrayPtr_seek(&(out->_binarray),1)){\r
+ //ERROR\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicDbCompiler_RET_ERROR:\r
+ default:\r
+ //ERROR\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ }else{\r
+ //区切りのいいところで終わってる?\r
+ if(NyLPC_cMiMicDbCompiler_hasFragment(&(out->_binparser))){\r
+ //ERROR\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ out->content.mvm.vm_instruction.db_len=((NyLPC_TUInt8*)(out->_binarray.ptr)-(NyLPC_TUInt8*)(out->content.mvm.vm_instruction.db_part))/sizeof(NyLPC_TUInt32);\r
+\r
+ //終端しているなら、次のクエリへ\r
+ out->_astate=ST_PARSE_QUERY_NAME;\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
+ default:\r
+ break;\r
+ }\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
ERROR:\r
- return NyLPC_TBool_FALSE;\r
+ return NyLPC_TBool_FALSE;\r
}\r
/**\r
* デフォルトハンドラ\r
*/\r
static const struct NyLPC_TcHttpBasicHeaderParser_Handler handler=\r
{\r
- NULL,\r
- urlHandler\r
+ NULL,\r
+ urlHandler\r
};\r
\r
\r
*/\r
void NyLPC_cModRemoteMcu_initialize(NyLPC_TcModRemoteMcu_t* i_inst,const NyLPC_TChar* i_ref_root_path)\r
{\r
- NyLPC_cModRomFiles_initialize(&i_inst->super,i_ref_root_path,NULL,0);\r
+ NyLPC_cModRomFiles_initialize(&i_inst->super,i_ref_root_path,NULL,0);\r
}\r
void NyLPC_cModRemoteMcu_finalize(NyLPC_TcModRemoteMcu_t* i_inst)\r
{\r
- NyLPC_cModRomFiles_finalize(&i_inst->super);\r
+ NyLPC_cModRomFiles_finalize(&i_inst->super);\r
}\r
/**\r
* モジュールがコネクションをハンドリングできるかを返します。\r
*/\r
NyLPC_TBool NyLPC_cModRemoteMcu_canHandle(NyLPC_TcModRemoteMcu_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection)\r
{\r
- return NyLPC_cModRomFiles_canHandle(&i_inst->super,i_connection);\r
+ return NyLPC_cModRomFiles_canHandle(&i_inst->super,i_connection);\r
}\r
\r
static struct TModMiMicRemoteMcuHeader single_header;\r
*/\r
NyLPC_TBool NyLPC_cModRemoteMcu_execute(NyLPC_TcModRemoteMcu_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection)\r
{\r
- NyLPC_TcHttpBasicHeaderParser_t parser;\r
- NyLPC_TUInt8 method_type;\r
- //リクエストParse済へ遷移(この関数の後はModが責任を持ってリクエストを返却)\r
- NyLPC_cHttpdConnection_setReqStatusParsed(i_connection);\r
-\r
-\r
- //VM起動の為の排他ロック\r
- NyLPC_cHttpdConnection_lock(i_connection);\r
-\r
-\r
- //URL解析の準備\r
- single_header._prefix_len=-((NyLPC_TInt16)strlen(i_inst->super._ref_root_path)+2);\r
- single_header._astate=ST_PARSE_PATH;\r
- NyLPC_cStr_initialize(&single_header._tstr,single_header._tstr_buf,16);\r
- NyLPC_cMiMicDbCompiler_initialize(&single_header._binparser);\r
- NyLPC_cMiMicTxtCompiler_initialize(&single_header._txtcmp);\r
-\r
- NyLPC_cHttpBasicHeaderParser_initialize(&parser,&handler);\r
-\r
-\r
- //プリフェッチしたデータを流す\r
- NyLPC_cHttpBasicHeaderParser_parseInit(&parser,&(single_header.super));\r
- NyLPC_cHttpdConnection_pushPrefetchInfo(i_connection,&parser,&single_header.super);\r
- //後続をストリームから取り込む\r
- if(!NyLPC_cHttpBasicHeaderParser_parseStream(&parser,NyLPC_cHttpdConnection_refStream(i_connection),&(single_header.super))){\r
- NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);\r
- NyLPC_OnErrorGoto(Error1);\r
- }\r
- if(!NyLPC_cHttpBasicHeaderParser_parseFinish(&parser,&(single_header.super))){\r
- NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);\r
- NyLPC_OnErrorGoto(Error1);\r
- }\r
- //GETかHEADに制限\r
- method_type=NyLPC_cHttpdConnection_getMethod(i_connection);\r
- if(method_type!=NyLPC_THttpMethodType_GET && method_type!=NyLPC_THttpMethodType_HEAD)\r
- {\r
- NyLPC_cHttpdUtils_sendErrorResponse(i_connection,405);\r
- NyLPC_OnErrorGoto(Error1);\r
- }\r
- //Request::ConnectionがClose設定,又はHTTP1.1では無い場合,CLOSE\r
- if(single_header.super.connection==NyLPC_THttpMessgeHeader_Connection_CLOSE || single_header.super.startline.req.version!=NyLPC_THttpVersion_11)\r
- {\r
- NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
- }\r
- //CGIの実行\r
- switch(single_header._content_id)\r
- {\r
- case CONTENT_ID_MVM:\r
- mvm(i_connection,&single_header);\r
- break;\r
- case CONTENT_ID_STATUS:\r
- status(i_connection);\r
- break;\r
- default:\r
- NyLPC_cHttpdUtils_sendErrorResponse(i_connection,400);\r
- NyLPC_OnErrorGoto(Error1);\r
- }\r
- NyLPC_cStr_finalize(&single_header._tstr);\r
- NyLPC_cMiMicDbCompiler_finalize(&single_header._binparser);\r
- NyLPC_cMiMicTxtCompiler_finalize(&single_header._txtcmp);\r
- NyLPC_cHttpBasicHeaderParser_finalize(&parser);\r
+ NyLPC_TcHttpBasicHeaderParser_t parser;\r
+ NyLPC_TUInt8 method_type;\r
+ //リクエストParse済へ遷移(この関数の後はModが責任を持ってリクエストを返却)\r
+ NyLPC_cHttpdConnection_setReqStatusParsed(i_connection);\r
+\r
+\r
+ //VM起動の為の排他ロック\r
+ NyLPC_cHttpdConnection_lock(i_connection);\r
+\r
+\r
+ //URL解析の準備\r
+ single_header._prefix_len=-((NyLPC_TInt16)strlen(i_inst->super._ref_root_path)+2);\r
+ single_header._astate=ST_PARSE_PATH;\r
+ NyLPC_cStr_initialize(&single_header._tstr,single_header._tstr_buf,16);\r
+ NyLPC_cMiMicDbCompiler_initialize(&single_header._binparser);\r
+ NyLPC_cMiMicTxtCompiler_initialize(&single_header._txtcmp);\r
+\r
+ NyLPC_cHttpBasicHeaderParser_initialize(&parser,&handler);\r
+\r
+\r
+ //プリフェッチしたデータを流す\r
+ NyLPC_cHttpBasicHeaderParser_parseInit(&parser,&(single_header.super));\r
+ NyLPC_cHttpdConnection_pushPrefetchInfo(i_connection,&parser,&single_header.super);\r
+ //後続をストリームから取り込む\r
+ if(!NyLPC_cHttpBasicHeaderParser_parseStream(&parser,NyLPC_cHttpdConnection_refStream(i_connection),&(single_header.super))){\r
+ NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);\r
+ NyLPC_OnErrorGoto(Error1);\r
+ }\r
+ if(!NyLPC_cHttpBasicHeaderParser_parseFinish(&parser,&(single_header.super))){\r
+ NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);\r
+ NyLPC_OnErrorGoto(Error1);\r
+ }\r
+ //GETかHEADに制限\r
+ method_type=NyLPC_cHttpdConnection_getMethod(i_connection);\r
+ if(method_type!=NyLPC_THttpMethodType_GET && method_type!=NyLPC_THttpMethodType_HEAD)\r
+ {\r
+ NyLPC_cHttpdUtils_sendErrorResponse(i_connection,405);\r
+ NyLPC_OnErrorGoto(Error1);\r
+ }\r
+ //Request::ConnectionがClose設定,又はHTTP1.1では無い場合,CLOSE\r
+ if(single_header.super.connection==NyLPC_THttpMessgeHeader_Connection_CLOSE || single_header.super.startline.req.version!=NyLPC_THttpVersion_11)\r
+ {\r
+ NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
+ }\r
+ //CGIの実行\r
+ switch(single_header._content_id)\r
+ {\r
+ case CONTENT_ID_MVM:\r
+ mvm(i_connection,&single_header);\r
+ break;\r
+ case CONTENT_ID_STATUS:\r
+ status(i_connection);\r
+ break;\r
+ default:\r
+ NyLPC_cHttpdUtils_sendErrorResponse(i_connection,400);\r
+ NyLPC_OnErrorGoto(Error1);\r
+ }\r
+ NyLPC_cStr_finalize(&single_header._tstr);\r
+ NyLPC_cMiMicDbCompiler_finalize(&single_header._binparser);\r
+ NyLPC_cMiMicTxtCompiler_finalize(&single_header._txtcmp);\r
+ NyLPC_cHttpBasicHeaderParser_finalize(&parser);\r
//占有解除\r
- NyLPC_cHttpdConnection_unlock(i_connection);\r
- return NyLPC_TBool_TRUE;\r
+ NyLPC_cHttpdConnection_unlock(i_connection);\r
+ return NyLPC_TBool_TRUE;\r
Error1:\r
- NyLPC_cStr_finalize(&single_header._tstr);\r
- NyLPC_cMiMicDbCompiler_finalize(&single_header._binparser);\r
- NyLPC_cMiMicTxtCompiler_finalize(&single_header._txtcmp);\r
- NyLPC_cHttpBasicHeaderParser_finalize(&parser);\r
- //VM排他ロックの解除\r
- NyLPC_cHttpdConnection_unlock(i_connection);\r
- return NyLPC_TBool_FALSE;\r
+ NyLPC_cStr_finalize(&single_header._tstr);\r
+ NyLPC_cMiMicDbCompiler_finalize(&single_header._binparser);\r
+ NyLPC_cMiMicTxtCompiler_finalize(&single_header._txtcmp);\r
+ NyLPC_cHttpBasicHeaderParser_finalize(&parser);\r
+ //VM排他ロックの解除\r
+ NyLPC_cHttpdConnection_unlock(i_connection);\r
+ return NyLPC_TBool_FALSE;\r
}\r
\r
\r
*/\r
struct TVmEventHandler\r
{\r
- struct NyLPC_TcMiMicVM_TEvent super;\r
- const struct TModMiMicRemoteMcuHeader* req;\r
- NyLPC_TcHttpdConnection_t* connection;\r
- NyLPC_TUInt16 db_pos;\r
- /** ストリームへ出力したデータの数*/\r
- NyLPC_TUInt16 st_len;\r
- /** Bodyを送信するかのフラグ*/\r
- NyLPC_TBool is_send_body;\r
+ struct NyLPC_TcMiMicVM_TEvent super;\r
+ const struct TModMiMicRemoteMcuHeader* req;\r
+ NyLPC_TcHttpdConnection_t* connection;\r
+ NyLPC_TUInt16 db_pos;\r
+ /** ストリームへ出力したデータの数*/\r
+ NyLPC_TUInt16 st_len;\r
+ /** Bodyを送信するかのフラグ*/\r
+ NyLPC_TBool is_send_body;\r
};\r
\r
/**\r
*/\r
static NyLPC_TBool mvmputs_json(struct NyLPC_TcMiMicVM_TEvent* i_eh,NyLPC_TUInt32 i_val)\r
{\r
- struct TVmEventHandler* eh=(struct TVmEventHandler*)i_eh;\r
- if(eh->is_send_body){\r
- if(eh->st_len>0){\r
- eh->st_len++;\r
- return NyLPC_cHttpdConnection_sendResponseBodyF(eh->connection,",%u",i_val);\r
- }else{\r
- eh->st_len++;\r
- return NyLPC_cHttpdConnection_sendResponseBodyF(eh->connection,"%u",i_val);\r
- }\r
- }\r
- return NyLPC_TBool_TRUE;\r
+ struct TVmEventHandler* eh=(struct TVmEventHandler*)i_eh;\r
+ if(eh->is_send_body){\r
+ if(eh->st_len>0){\r
+ eh->st_len++;\r
+ return NyLPC_cHttpdConnection_sendResponseBodyF(eh->connection,",%u",i_val);\r
+ }else{\r
+ eh->st_len++;\r
+ return NyLPC_cHttpdConnection_sendResponseBodyF(eh->connection,"%u",i_val);\r
+ }\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
}\r
\r
/**\r
*/\r
static NyLPC_TBool mvmgets(struct NyLPC_TcMiMicVM_TEvent* i_eh,NyLPC_TUInt32* o_val)\r
{\r
- struct TVmEventHandler* eh=(struct TVmEventHandler*)i_eh;\r
- //読み出し済みDBサイズの確認\r
- if(eh->req->content.mvm.vm_instruction.db_len<=eh->db_pos){\r
- //読めない\r
- return NyLPC_TBool_FALSE;\r
- }\r
- *o_val=eh->req->content.mvm.vm_instruction.db_part[eh->db_pos];\r
- eh->db_pos++;\r
- return NyLPC_TBool_TRUE;\r
+ struct TVmEventHandler* eh=(struct TVmEventHandler*)i_eh;\r
+ //読み出し済みDBサイズの確認\r
+ if(eh->req->content.mvm.vm_instruction.db_len<=eh->db_pos){\r
+ //読めない\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ *o_val=eh->req->content.mvm.vm_instruction.db_part[eh->db_pos];\r
+ eh->db_pos++;\r
+ return NyLPC_TBool_TRUE;\r
}\r
/**\r
* ネイティブCALLハンドラ\r
*/\r
static NyLPC_TUInt32 nativeCall(struct NyLPC_TcMiMicVM_TEvent* i_evh,NyLPC_TUInt32 i_id,NyLPC_TcMiMicVM_t* i_vm)\r
{\r
- (void)i_evh;\r
-// NyLPC_TNativeFunction f=getNativeFunctionById(i_id);\r
-// if(f==NULL){\r
-// return NyLPC_cMiMicVM_RESULT_RUNTIME_NG_UNKNOWN_CALL;\r
-// }\r
-// return f(i_vm)?NyLPC_cMiMicVM_RESULT_OK:NyLPC_cMiMicVM_RESULT_RUNTIME_NG_CALL;\r
- return NyLPC_cMiMicVM_RESULT_RUNTIME_NG_CALL;\r
+ (void)i_evh;\r
+// NyLPC_TNativeFunction f=getNativeFunctionById(i_id);\r
+// if(f==NULL){\r
+// return NyLPC_cMiMicVM_RESULT_RUNTIME_NG_UNKNOWN_CALL;\r
+// }\r
+// return f(i_vm)?NyLPC_cMiMicVM_RESULT_OK:NyLPC_cMiMicVM_RESULT_RUNTIME_NG_CALL;\r
+ return NyLPC_cMiMicVM_RESULT_RUNTIME_NG_CALL;\r
}\r
\r
\r
static void mvmsleep(struct NyLPC_TcMiMicVM_TEvent* i_eh,NyLPC_TUInt32 i_sleep_in_msec)\r
{\r
- (void)i_eh;\r
- NyLPC_cThread_sleep(i_sleep_in_msec);\r
+ (void)i_eh;\r
+ NyLPC_cThread_sleep(i_sleep_in_msec);\r
}\r
\r
/**\r
* RemoteMCUのステータスを返す。基本的にjson\r
* {\r
- * application:"[VERSION]"\r
+ * application:"[VERSION]"\r
* }\r
*/\r
static void status(NyLPC_TcHttpdConnection_t* i_connection)\r
{\r
- if(!NyLPC_cHttpdUtils_sendJsonHeader(i_connection)){\r
- return;\r
- }\r
- //JSONを書く。\r
- if(NyLPC_cHttpdConnection_getMethod(i_connection)==NyLPC_THttpMethodType_GET){\r
- NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"{\"application\":\""MVM_VERSION"\"}");\r
- }\r
- return;\r
+ if(!NyLPC_cHttpdUtils_sendJsonHeader(i_connection)){\r
+ return;\r
+ }\r
+ //JSONを書く。\r
+ if(NyLPC_cHttpdConnection_getMethod(i_connection)==NyLPC_THttpMethodType_GET){\r
+ NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"{\"application\":\""MVM_VERSION"\"}");\r
+ }\r
+ return;\r
}\r
/**\r
* MimicVMの起動と,ResponseJSONの起動\r
*/\r
static void mvm(NyLPC_TcHttpdConnection_t* i_connection,const struct TModMiMicRemoteMcuHeader* i_rqh)\r
{\r
- struct TVmEventHandler he;\r
- NyLPC_TcMiMicVM_t vm;\r
- NyLPC_TUInt32 vmret;\r
- if(i_rqh->content.mvm.v!=QVAL_V_1 || i_rqh->content.mvm.o!=QVAL_O_JSON)\r
- {\r
- NyLPC_cHttpdUtils_sendErrorResponse(i_connection,400);\r
- return;\r
- }\r
-\r
- //Bodyを書く\r
- //ハンドラインスタンスの設定\r
- if(!NyLPC_cHttpdUtils_sendJsonHeader(i_connection)){\r
- NyLPC_OnErrorGoto(Error1);\r
- }\r
-\r
- he.super.get_stream=mvmgets;\r
- he.super.put_stream=mvmputs_json;\r
- he.super.native_call=nativeCall;\r
- he.super.sleep=mvmsleep;\r
- he.db_pos=0;\r
- he.st_len=0;\r
- he.connection=i_connection;\r
- he.req=i_rqh;\r
- he.is_send_body=(NyLPC_cHttpdConnection_getMethod(i_connection)==NyLPC_THttpMethodType_GET);\r
-\r
- //起動VMの初期化\r
- NyLPC_cMiMicVM_initialize(&vm,(struct NyLPC_TcMiMicVM_TEvent*)&(he.super));\r
-\r
- //JSONを書く。\r
- if(he.is_send_body){\r
- if(!NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"{\"version\":\""MVM_VERSION"\",\"stream\":[")){\r
- NyLPC_OnErrorGoto(Error1);\r
- }\r
- }\r
- //VMの実行\r
- vmret=NyLPC_cMiMicVM_run(&(vm),i_rqh->content.mvm.vm_instruction.bc_buf,i_rqh->content.mvm.vm_instruction.txt_len);\r
- //only GET method\r
- if(he.is_send_body){\r
- if(!NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"],\"result\":%u}",vmret)){\r
- NyLPC_OnErrorGoto(Error1);\r
- }\r
- }\r
- NyLPC_cMiMicVM_finalize(&vm);\r
- return;\r
+ struct TVmEventHandler he;\r
+ NyLPC_TcMiMicVM_t vm;\r
+ NyLPC_TUInt32 vmret;\r
+ if(i_rqh->content.mvm.v!=QVAL_V_1 || i_rqh->content.mvm.o!=QVAL_O_JSON)\r
+ {\r
+ NyLPC_cHttpdUtils_sendErrorResponse(i_connection,400);\r
+ return;\r
+ }\r
+\r
+ //Bodyを書く\r
+ //ハンドラインスタンスの設定\r
+ if(!NyLPC_cHttpdUtils_sendJsonHeader(i_connection)){\r
+ NyLPC_OnErrorGoto(Error1);\r
+ }\r
+\r
+ he.super.get_stream=mvmgets;\r
+ he.super.put_stream=mvmputs_json;\r
+ he.super.native_call=nativeCall;\r
+ he.super.sleep=mvmsleep;\r
+ he.db_pos=0;\r
+ he.st_len=0;\r
+ he.connection=i_connection;\r
+ he.req=i_rqh;\r
+ he.is_send_body=(NyLPC_cHttpdConnection_getMethod(i_connection)==NyLPC_THttpMethodType_GET);\r
+\r
+ //起動VMの初期化\r
+ NyLPC_cMiMicVM_initialize(&vm,(struct NyLPC_TcMiMicVM_TEvent*)&(he.super));\r
+\r
+ //JSONを書く。\r
+ if(he.is_send_body){\r
+ if(!NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"{\"version\":\""MVM_VERSION"\",\"stream\":[")){\r
+ NyLPC_OnErrorGoto(Error1);\r
+ }\r
+ }\r
+ //VMの実行\r
+ vmret=NyLPC_cMiMicVM_run(&(vm),i_rqh->content.mvm.vm_instruction.bc_buf,i_rqh->content.mvm.vm_instruction.txt_len);\r
+ //only GET method\r
+ if(he.is_send_body){\r
+ if(!NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"],\"result\":%u}",vmret)){\r
+ NyLPC_OnErrorGoto(Error1);\r
+ }\r
+ }\r
+ NyLPC_cMiMicVM_finalize(&vm);\r
+ return;\r
Error1:\r
- NyLPC_cMiMicVM_finalize(&vm);\r
- return;\r
+ NyLPC_cMiMicVM_finalize(&vm);\r
+ return;\r
}\r
\r