OSDN Git Service

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@202 47198e57-cb75-475f-84c4-a814cd...
authornyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Thu, 21 Mar 2013 05:58:03 +0000 (05:58 +0000)
committernyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Thu, 21 Mar 2013 05:58:03 +0000 (05:58 +0000)
lib/src/net/httpd/mod/NyLPC_cModMiMicSetting.c
lib/src/net/httpd/mod/NyLPC_cModRemoteMcu.c
lib/src/net/httpd/mod/NyLPC_cModRemoteMcu.h
projects/example/sample.romfsmod/src/sketch.c

index c770aea..e638983 100644 (file)
@@ -102,13 +102,13 @@ static NyLPC_TBool messageHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,const
 #define QVAL_C_UNKNOWN 0\r
 \r
 \r
-const struct NyLPC_TTextIdTbl url_tbl[]=\r
+static const struct NyLPC_TTextIdTbl url_tbl[]=\r
 {\r
        {"setup.api",CONTENT_ID_SETUP},\r
        {NULL,CONTENT_ID_UNKNOWN}\r
 };\r
 \r
-const struct NyLPC_TTextIdTbl qname_id_table[]=\r
+static const struct NyLPC_TTextIdTbl qname_id_table[]=\r
 {\r
        {"p",QNAME_ID_P},\r
        {"c",QNAME_ID_C},\r
index 1c5f5d8..dda29b2 100644 (file)
@@ -120,14 +120,14 @@ static NyLPC_TBool messageHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,const
 #define QVAL_V_1               1\r
 \r
 \r
-const struct NyLPC_TTextIdTbl url_tbl[]=\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
 };\r
 \r
-const struct NyLPC_TTextIdTbl qname_id_table[]=\r
+static const struct NyLPC_TTextIdTbl qname_id_table[]=\r
 {\r
        {"o",QNAME_ID_O},\r
        {"bc",QNAME_ID_BC},\r
@@ -147,9 +147,12 @@ static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TCha
                return NyLPC_TBool_TRUE;//読み飛ばし\r
        }\r
        if(out->_astate==ST_PARSE_PATH){\r
-               switch(i_c){\r
-               case '\0':\r
-               case '?':\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
@@ -164,12 +167,8 @@ static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TCha
                        default:\r
                                break;\r
                        }\r
-\r
                        NyLPC_cStr_clear(&(out->_tstr));\r
                        out->_astate=ST_PARSE_QUERY_NAME;//クエリ名解析へ\r
-                       return NyLPC_TBool_TRUE;\r
-               default:\r
-                       break;\r
                }\r
                return NyLPC_TBool_TRUE;\r
        }\r
@@ -182,63 +181,65 @@ static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TCha
                                if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
                                        NyLPC_OnErrorGoto(ERROR);\r
                                }\r
-                               return NyLPC_TBool_TRUE;\r
-                       }\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
+                       }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
-                               return NyLPC_TBool_TRUE;\r
+                       if(i_c!='\0' && i_c!='&'){\r
+                       }else{\r
+                               //クエリ値解析完了\r
+                               out->_astate=ST_PARSE_QUERY_NAME;\r
                        }\r
-                       //クエリ値解析完了\r
-                       out->_astate=ST_PARSE_QUERY_NAME;\r
                        return NyLPC_TBool_TRUE;\r
                case ST_PARSE_QUERY_VALUE_O:\r
-                       if(i_c!='\0' || i_c!='&'){\r
+                       if(i_c!='\0' && i_c!='&'){\r
                                if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
                                        NyLPC_OnErrorGoto(ERROR);\r
                                }\r
-                               return NyLPC_TBool_TRUE;\r
-                       }\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
+                       }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
-                       out->_astate=ST_PARSE_QUERY_NAME;\r
                        return NyLPC_TBool_TRUE;\r
                case ST_PARSE_QUERY_VALUE_V:\r
-                       if(i_c!='\0' || i_c!='&'){\r
+                       if(i_c!='\0' && i_c!='&'){\r
                                if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
                                        NyLPC_OnErrorGoto(ERROR);\r
                                }\r
-                               return NyLPC_TBool_TRUE;\r
-                       }\r
-                       if(NyLPC_cStr_isEqual(&(out->_tstr),"1")){\r
-                               out->content.mvm.v=QVAL_V_1;\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
-                       out->_astate=ST_PARSE_QUERY_NAME;\r
                        return NyLPC_TBool_TRUE;\r
                case ST_PARSE_QUERY_VALUE_BC:\r
-                       if(i_c!='\0' || i_c!='&'){\r
+                       if(i_c!='\0' && i_c!='&'){\r
                                //コンパイル\r
                                switch(NyLPC_cMiMicTxtCompiler_compileFragment2(&(out->_txtcmp),i_c,&(out->_binarray),&ol))\r
                                {\r
@@ -259,12 +260,12 @@ static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TCha
                                        //ERROR\r
                                        NyLPC_OnErrorGoto(ERROR);\r
                                }\r
-                               return NyLPC_TBool_TRUE;\r
                        }\r
-                       //フラグメント終端が検出できない終了はエラー\r
-                       NyLPC_OnErrorGoto(ERROR);\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
+                       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
@@ -281,15 +282,15 @@ static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TCha
                                        //ERROR\r
                                        NyLPC_OnErrorGoto(ERROR);\r
                                }\r
-                               return NyLPC_TBool_TRUE;\r
-                       }\r
-                       //区切りのいいところで終わってる?\r
-                       if(NyLPC_cMiMicDbCompiler_hasFragment(&(out->_binparser))){\r
-                               //ERROR\r
-                               NyLPC_OnErrorGoto(ERROR);\r
+                       }else{\r
+                               //区切りのいいところで終わってる?\r
+                               if(NyLPC_cMiMicDbCompiler_hasFragment(&(out->_binparser))){\r
+                                       //ERROR\r
+                                       NyLPC_OnErrorGoto(ERROR);\r
+                               }\r
+                               //終端しているなら、次のクエリへ\r
+                               out->_astate=ST_PARSE_QUERY_NAME;\r
                        }\r
-                       //終端しているなら、次のクエリへ\r
-                       out->_astate=ST_PARSE_QUERY_NAME;\r
                        return NyLPC_TBool_TRUE;\r
                default:\r
                        break;\r
@@ -315,28 +316,29 @@ static const struct NyLPC_TcHttpBasicHeaderParser_Handler handler=
 /**\r
  * コンストラクタ。\r
  */\r
-void NyLPC_cModMiMicSetting_initialize(NyLPC_TcModRemoteMcu_t* i_inst,const NyLPC_TChar* i_ref_root_path)\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
 }\r
-void NyLPC_cModMiMicSetting_finalize(NyLPC_TcModRemoteMcu_t* i_inst)\r
+void NyLPC_cModRemoteMcu_finalize(NyLPC_TcModRemoteMcu_t* i_inst)\r
 {\r
        NyLPC_cModRomFiles_finalize(&i_inst->super);\r
 }\r
 /**\r
  * モジュールがコネクションをハンドリングできるかを返します。\r
  */\r
-NyLPC_TBool NyLPC_cModMiMicSetting_canHandle(NyLPC_TcModRemoteMcu_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection)\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
 }\r
 \r
+static struct TModMiMicRemoteMcuHeader single_header;\r
+\r
 /**\r
  * モジュールを実行します。\r
  */\r
-NyLPC_TBool NyLPC_cModMiMicSetting_execute(NyLPC_TcModRemoteMcu_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection,const NyLPC_TChar* i_root_path)\r
+NyLPC_TBool NyLPC_cModRemoteMcu_execute(NyLPC_TcModRemoteMcu_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection)\r
 {\r
-       struct TModMiMicRemoteMcuHeader header;\r
        NyLPC_TcHttpBasicHeaderParser_t parser;\r
        //connectonの状態を確認\r
        if(!NyLPC_cHttpdConnection_getReqStatus(i_connection)==NyLPC_cHttpdConnection_ReqStatus_REQPARSE)\r
@@ -352,50 +354,50 @@ NyLPC_TBool NyLPC_cModMiMicSetting_execute(NyLPC_TcModRemoteMcu_t* i_inst,NyLPC_
 \r
 \r
        //URL解析の準備\r
-       header._prefix_len=-(NyLPC_TInt16)strlen(i_inst->super._ref_root_path);\r
-       header._astate=ST_PARSE_PATH;\r
-       NyLPC_cStr_initialize(&header._tstr,header._tstr_buf,16);\r
-       NyLPC_cMiMicDbCompiler_initialize(&header._binparser);\r
-       NyLPC_cMiMicTxtCompiler_initialize(&header._txtcmp);\r
+       single_header._prefix_len=-(NyLPC_TInt16)strlen(i_inst->super._ref_root_path);\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
-       NyLPC_cHttpBasicHeaderParser_parseInit(&parser,&(header.super));\r
-       NyLPC_cHttpdConnection_pushPrefetchInfo(i_connection,&parser,&header.super);\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),&(header.super))){\r
+       if(!NyLPC_cHttpBasicHeaderParser_parseStream(&parser,NyLPC_cHttpdConnection_refStream(i_connection),&(single_header.super))){\r
                NyLPC_OnErrorGoto(Error2);\r
        }\r
-       if(!NyLPC_cHttpBasicHeaderParser_parseFinish(&parser,&(header.super))){\r
+       if(!NyLPC_cHttpBasicHeaderParser_parseFinish(&parser,&(single_header.super))){\r
                NyLPC_OnErrorGoto(Error2);\r
        }\r
        //Connection Modeの設定 1.1 && !closeの場合はCONTINUE\r
-       if(header.super.connection!=NyLPC_THttpMessgeHeader_Connection_CLOSE && header.super.startline.req.version==NyLPC_THttpVersion_11)\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_CONTINUE);\r
        }\r
        //CGIの実行\r
-       switch(header._content_id)\r
+       switch(single_header._content_id)\r
        {\r
        case CONTENT_ID_MVM:\r
-               mvm(i_connection,&header);\r
+               mvm(i_connection,&single_header);\r
                break;\r
        default:\r
                NyLPC_OnErrorGoto(Error2);\r
        }\r
-       NyLPC_cStr_finalize(&header._tstr);\r
-       NyLPC_cMiMicDbCompiler_finalize(&header._binparser);\r
-       NyLPC_cMiMicTxtCompiler_finalize(&header._txtcmp);\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
 Error2:\r
        NyLPC_cHttpdConnection_sendResponseHeader2(i_connection,500,"text/html",0,NULL);\r
-       NyLPC_cStr_finalize(&header._tstr);\r
-       NyLPC_cMiMicDbCompiler_finalize(&header._binparser);\r
-       NyLPC_cMiMicTxtCompiler_finalize(&header._txtcmp);\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
index 6bd82ad..d7240d4 100644 (file)
@@ -40,7 +40,7 @@ NyLPC_TBool NyLPC_cModRemoteMcu_canHandle(NyLPC_TcModRemoteMcu_t* i_inst,NyLPC_T
 /**\r
  * モジュールを実行します。\r
  */\r
-NyLPC_TBool NyLPC_cModRemoteMcu_execute(NyLPC_TcModRemoteMcu_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection,const NyLPC_TChar* i_root_path);\r
+NyLPC_TBool NyLPC_cModRemoteMcu_execute(NyLPC_TcModRemoteMcu_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection);\r
 \r
 #ifdef __cplusplus\r
 }\r
index 7d1903d..809a350 100644 (file)
@@ -25,12 +25,14 @@ extern struct NyLPC_TRomFileData fsdata[];
 \r
 static const char* ROM_PATH="/rom/";\r
 static const char* SETUP_PATH="/setup/";\r
+static const char* MVM_PATH="/mvm/";\r
 void handler(NyLPC_TcHttpdConnection_t* i_connection)\r
 {\r
        union{\r
                NyLPC_TcModShortUrl_t surl;\r
                NyLPC_TcModRomFiles_t rom;\r
                NyLPC_TcModMiMicSetting_t setting;\r
+               NyLPC_TcModRemoteMcu_t mvm;\r
        }mod;\r
 \r
        NyLPC_THttpMethodType m;\r
@@ -44,6 +46,14 @@ void handler(NyLPC_TcHttpdConnection_t* i_connection)
        }\r
        NyLPC_cModMiMicSetting_finalize(&mod.setting);\r
 \r
+       //MIMICBC\r
+       NyLPC_cModRemoteMcu_initialize(&mod.mvm,MVM_PATH);\r
+       if(NyLPC_cModRemoteMcu_canHandle(&mod.mvm,i_connection)){\r
+               NyLPC_cModRemoteMcu_execute(&mod.mvm,i_connection);\r
+               NyLPC_cModRemoteMcu_finalize(&mod.mvm);\r
+               return;\r
+       }\r
+       NyLPC_cModRemoteMcu_finalize(&mod.mvm);\r
 \r
        //ROM\r
        NyLPC_cModRomFiles_initialize(&mod.rom,ROM_PATH,fsdata,NUM_OF_FSDATA);\r