OSDN Git Service

JsonRPCの定数値、関数の整備
[mimic/MiMicSDK.git] / lib / src / net / httpd / mod / NyLPC_cModJsonRpc.c
index d85db89..d810ac1 100644 (file)
@@ -85,27 +85,71 @@ NyLPC_TBool NyLPC_cModJsonRpc_putRawMessage(NyLPC_TcModJsonRpc_t* i_inst,const N
  * ここで指定した書式文字列は、"そのまま"パラメータ部に表示されます。文字列を返す場合は、次のように\"でエスケープしてください。\r
  * '0,1,2,-1,\"result\",3'\r
  */\r
-NyLPC_TBool NyLPC_cModJsonRpc_putResult(NyLPC_TcModJsonRpc_t* i_inst,NyLPC_TUInt32 i_id,NyLPC_TInt32 i_result,const NyLPC_TChar* i_params_fmt,...)\r
+NyLPC_TBool NyLPC_cModJsonRpc_putResult(NyLPC_TcModJsonRpc_t* i_inst,NyLPC_TUInt32 i_id,const NyLPC_TChar* i_params_fmt,...)\r
+{\r
+       NyLPC_TBool r;\r
+       va_list a;\r
+       //書き込み文字数の事前計算\r
+       va_start(a,i_params_fmt);\r
+       r=NyLPC_cModJsonRpc_putResultV(i_inst,i_id,i_params_fmt,a);\r
+       va_end(a);\r
+       return r;\r
+}\r
+\r
+/**\r
+ * @param i_params_fmt\r
+ * パラメータ部のフォーマット文字列です。NyLPC_cFormatWriterと同等の構文を使用できます。\r
+ * ここで指定した書式文字列は、"そのまま"パラメータ部に表示されます。文字列を返す場合は、次のように\"でエスケープしてください。\r
+ * '0,1,2,-1,\"result\",3'\r
+ */\r
+NyLPC_TBool NyLPC_cModJsonRpc_putResultV(NyLPC_TcModJsonRpc_t* i_inst,NyLPC_TUInt32 i_id,const NyLPC_TChar* i_params_fmt,va_list i_a)\r
 {\r
        NyLPC_TBool r;\r
        va_list a;\r
        NyLPC_TInt16 l;\r
 \r
        //書き込み文字数の事前計算\r
-       va_start(a,i_params_fmt);\r
-       l=NyLPC_cModWebSocket_testFormat(&i_inst->super,"{\"result\":%d,\"params\":[",i_result);\r
+       NyLPC_va_copy(a,i_a);\r
+       l=NyLPC_cModWebSocket_testFormat(&i_inst->super,"{\"jsonrpc\":\"2.0\",\"result\":[");\r
        l+=NyLPC_cModWebSocket_testFormatV(&i_inst->super,i_params_fmt,a);\r
        l+=NyLPC_cModWebSocket_testFormat(&i_inst->super,"],\"id\":%d}",i_id);\r
        va_end(a);\r
 \r
        //バルク書き込み\r
-       va_start(a,i_params_fmt);\r
        NyLPC_cModWebSocket_startBulkWrite(&i_inst->super,l);\r
-       r=NyLPC_cModWebSocket_writeBulkFormat(&i_inst->super,"{\"result\":%d,\"params\":[",i_result);\r
-       r=r&&NyLPC_cModWebSocket_writeBulkFormatV(&i_inst->super,i_params_fmt,a);\r
+       r=NyLPC_cModWebSocket_writeBulkFormat(&i_inst->super,"{\"jsonrpc\":\"2.0\",\"result\":[");\r
+       r=r&&NyLPC_cModWebSocket_writeBulkFormatV(&i_inst->super,i_params_fmt,i_a);\r
        r=r&&NyLPC_cModWebSocket_writeBulkFormat(&i_inst->super,"],\"id\":%d}",i_id);\r
        r=r&&NyLPC_cModWebSocket_endBulkWrite(&i_inst->super);\r
-       va_end(a);\r
        return r;\r
 }\r
 \r
+struct CodeMsgTbl{\r
+       const char* n;\r
+       NyLPC_TInt32 id;\r
+};\r
+\r
+const static struct CodeMsgTbl _table[]=\r
+{\r
+       {"Parse error",NyLPC_TJsonRpcErrorCode_PARSE_ERROR},\r
+       {"Invalid Request",NyLPC_TJsonRpcErrorCode_INVALID_REQUEST},\r
+       {"Method not found",NyLPC_TJsonRpcErrorCode_METHOD_NOT_FOUND},\r
+       {"Invalid params",NyLPC_TJsonRpcErrorCode_INVALID_PARAMS},\r
+       {"Internal error",NyLPC_TJsonRpcErrorCode_INTERNAL_ERROR},\r
+       {"Server error",NyLPC_TJsonRpcErrorCode_SERVER_ERROR_BASE}\r
+};\r
+static const NyLPC_TChar* code2msg(NyLPC_TInt32 i_id)\r
+{\r
+       int i;\r
+       for(i=0;i<6;i++){\r
+               if(i_id==_table[i].id){\r
+                       return _table[i].n;\r
+               }\r
+       }\r
+       return _table[6].n;\r
+}\r
+\r
+NyLPC_TBool NyLPC_cModJsonRpc_putError(NyLPC_TcModJsonRpc_t* i_inst,NyLPC_TUInt32 i_id,NyLPC_TInt32 i_code)\r
+{\r
+       return NyLPC_cModWebSocket_writeFormat(&i_inst->super,"{\"jsonrpc\":\"2.0\",\"error\":{\"code\": %d, \"message\": \"%s\"},\"id\":%d}",i_code,code2msg(i_code),i_id);\r
+}\r