Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of libMiMic by
mbed/mod/ModJsonRpc.cpp@76:b375b3d750d8, 2014-06-14 (annotated)
- Committer:
- nyatla
- Date:
- Sat Jun 14 17:42:11 2014 +0000
- Revision:
- 76:b375b3d750d8
- Parent:
- 75:2a18df0ef111
- Child:
- 81:e5e4f2264d24
MiMic core r361???; JsonRPC????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nyatla | 72:c118a7aa37a3 | 1 | #include "ModJsonRpc.h" |
nyatla | 72:c118a7aa37a3 | 2 | #include "../net/httpd/mod/NyLPC_cModWebSocket_protected.h" |
nyatla | 72:c118a7aa37a3 | 3 | #include "HttpdConnection.h" |
nyatla | 72:c118a7aa37a3 | 4 | |
nyatla | 72:c118a7aa37a3 | 5 | namespace MiMic |
nyatla | 72:c118a7aa37a3 | 6 | { |
nyatla | 76:b375b3d750d8 | 7 | #define NUM_OF_OBJECTS 32 |
nyatla | 76:b375b3d750d8 | 8 | ModJsonRpc::BasicRpcObject** newObjectArray() |
nyatla | 73:8c7dd6fd462e | 9 | { |
nyatla | 76:b375b3d750d8 | 10 | ModJsonRpc::BasicRpcObject** r=new ModJsonRpc::BasicRpcObject*[NUM_OF_OBJECTS]; |
nyatla | 76:b375b3d750d8 | 11 | memset(r,0,sizeof(ModJsonRpc::BasicRpcObject*)*NUM_OF_OBJECTS); |
nyatla | 73:8c7dd6fd462e | 12 | return r; |
nyatla | 73:8c7dd6fd462e | 13 | } |
nyatla | 76:b375b3d750d8 | 14 | void deleteObjectArray(ModJsonRpc::BasicRpcObject** v) |
nyatla | 73:8c7dd6fd462e | 15 | { |
nyatla | 73:8c7dd6fd462e | 16 | for(int i=0;i<NUM_OF_OBJECTS;i++){ |
nyatla | 73:8c7dd6fd462e | 17 | if(v[i]!=NULL){ |
nyatla | 73:8c7dd6fd462e | 18 | delete v[i]; |
nyatla | 73:8c7dd6fd462e | 19 | } |
nyatla | 73:8c7dd6fd462e | 20 | } |
nyatla | 76:b375b3d750d8 | 21 | delete[] v; |
nyatla | 73:8c7dd6fd462e | 22 | } |
nyatla | 72:c118a7aa37a3 | 23 | |
nyatla | 72:c118a7aa37a3 | 24 | ModJsonRpc::ModJsonRpc(const char* i_path,const struct NyLPC_TJsonRpcClassDef** i_rpc_table):ModBaseClass(i_path) |
nyatla | 72:c118a7aa37a3 | 25 | { |
nyatla | 72:c118a7aa37a3 | 26 | this->_mod=NULL; |
nyatla | 72:c118a7aa37a3 | 27 | this->_rpc_table=i_rpc_table; |
nyatla | 72:c118a7aa37a3 | 28 | } |
nyatla | 72:c118a7aa37a3 | 29 | ModJsonRpc::ModJsonRpc() |
nyatla | 72:c118a7aa37a3 | 30 | { |
nyatla | 72:c118a7aa37a3 | 31 | this->_mod=NULL; |
nyatla | 72:c118a7aa37a3 | 32 | } |
nyatla | 72:c118a7aa37a3 | 33 | ModJsonRpc::~ModJsonRpc() |
nyatla | 72:c118a7aa37a3 | 34 | { |
nyatla | 72:c118a7aa37a3 | 35 | if(this->_mod!=NULL){ |
nyatla | 72:c118a7aa37a3 | 36 | NyLPC_cModJsonRpc_finalize(this->_mod); |
nyatla | 73:8c7dd6fd462e | 37 | free(this->_mod); |
nyatla | 73:8c7dd6fd462e | 38 | deleteObjectArray(this->_objects); |
nyatla | 72:c118a7aa37a3 | 39 | this->_mod=NULL; |
nyatla | 72:c118a7aa37a3 | 40 | } |
nyatla | 72:c118a7aa37a3 | 41 | } |
nyatla | 72:c118a7aa37a3 | 42 | void ModJsonRpc::setParam(const char* i_path,const struct NyLPC_TJsonRpcClassDef** i_rpc_table) |
nyatla | 72:c118a7aa37a3 | 43 | { |
nyatla | 72:c118a7aa37a3 | 44 | ModBaseClass::setParam(i_path); |
nyatla | 72:c118a7aa37a3 | 45 | this->_rpc_table=i_rpc_table; |
nyatla | 72:c118a7aa37a3 | 46 | } |
nyatla | 73:8c7dd6fd462e | 47 | |
nyatla | 72:c118a7aa37a3 | 48 | bool ModJsonRpc::execute(HttpdConnection& i_connection) |
nyatla | 72:c118a7aa37a3 | 49 | { |
nyatla | 72:c118a7aa37a3 | 50 | if(this->_mod!=NULL){ |
nyatla | 72:c118a7aa37a3 | 51 | return false; |
nyatla | 72:c118a7aa37a3 | 52 | } |
nyatla | 72:c118a7aa37a3 | 53 | this->_mod=(NyLPC_TcModJsonRpc_t*)malloc(sizeof(NyLPC_TcModJsonRpc_t)); |
nyatla | 72:c118a7aa37a3 | 54 | if(this->_mod==NULL){ |
nyatla | 72:c118a7aa37a3 | 55 | return false; |
nyatla | 72:c118a7aa37a3 | 56 | } |
nyatla | 72:c118a7aa37a3 | 57 | |
nyatla | 72:c118a7aa37a3 | 58 | //initialize websocket |
nyatla | 72:c118a7aa37a3 | 59 | NyLPC_cModJsonRpc_initialize(this->_mod,this->_path,this->_rpc_table); |
nyatla | 72:c118a7aa37a3 | 60 | if(NyLPC_cModJsonRpc_canHandle(this->_mod,i_connection._ref_inst)){ |
nyatla | 73:8c7dd6fd462e | 61 | if(NyLPC_cModJsonRpc_execute(this->_mod,i_connection._ref_inst)){ |
nyatla | 73:8c7dd6fd462e | 62 | //initialize object array |
nyatla | 73:8c7dd6fd462e | 63 | this->_objects=newObjectArray(); |
nyatla | 73:8c7dd6fd462e | 64 | return true; |
nyatla | 73:8c7dd6fd462e | 65 | } |
nyatla | 72:c118a7aa37a3 | 66 | } |
nyatla | 72:c118a7aa37a3 | 67 | NyLPC_cModJsonRpc_finalize(this->_mod); |
nyatla | 72:c118a7aa37a3 | 68 | free(this->_mod); |
nyatla | 72:c118a7aa37a3 | 69 | this->_mod=NULL; |
nyatla | 73:8c7dd6fd462e | 70 | return false; |
nyatla | 72:c118a7aa37a3 | 71 | } |
nyatla | 72:c118a7aa37a3 | 72 | |
nyatla | 75:2a18df0ef111 | 73 | void ModJsonRpc::dispatchRpc() |
nyatla | 72:c118a7aa37a3 | 74 | { |
nyatla | 72:c118a7aa37a3 | 75 | const union NyLPC_TJsonRpcParserResult* rpc_result; |
nyatla | 73:8c7dd6fd462e | 76 | if(this->_mod==NULL){ |
nyatla | 73:8c7dd6fd462e | 77 | return; |
nyatla | 73:8c7dd6fd462e | 78 | } |
nyatla | 72:c118a7aa37a3 | 79 | for(;;){ |
nyatla | 72:c118a7aa37a3 | 80 | if(!NyLPC_cModJsonRpc_processRpcMessage(this->_mod)){ |
nyatla | 72:c118a7aa37a3 | 81 | break; |
nyatla | 72:c118a7aa37a3 | 82 | } |
nyatla | 72:c118a7aa37a3 | 83 | //メッセージ取得を試行 |
nyatla | 72:c118a7aa37a3 | 84 | rpc_result=NyLPC_cModJsonRpc_getMessage(this->_mod); |
nyatla | 72:c118a7aa37a3 | 85 | if(rpc_result==NULL){ |
nyatla | 72:c118a7aa37a3 | 86 | //nothing |
nyatla | 72:c118a7aa37a3 | 87 | continue; |
nyatla | 72:c118a7aa37a3 | 88 | } |
nyatla | 72:c118a7aa37a3 | 89 | if(NyLPC_TJsonRpcParserResult_hasMethodHandler(rpc_result)){ |
nyatla | 72:c118a7aa37a3 | 90 | if(NyLPC_TJsonRpcParserResult_callMethodHandler(rpc_result,this)){ |
nyatla | 72:c118a7aa37a3 | 91 | continue; |
nyatla | 72:c118a7aa37a3 | 92 | }else{ |
nyatla | 72:c118a7aa37a3 | 93 | //function failed. |
nyatla | 72:c118a7aa37a3 | 94 | break; |
nyatla | 72:c118a7aa37a3 | 95 | } |
nyatla | 72:c118a7aa37a3 | 96 | }else{ |
nyatla | 72:c118a7aa37a3 | 97 | //no handler |
nyatla | 72:c118a7aa37a3 | 98 | break; |
nyatla | 72:c118a7aa37a3 | 99 | } |
nyatla | 72:c118a7aa37a3 | 100 | } |
nyatla | 72:c118a7aa37a3 | 101 | NyLPC_cModJsonRpc_close(this->_mod,1000); |
nyatla | 73:8c7dd6fd462e | 102 | NyLPC_cModJsonRpc_finalize(this->_mod); |
nyatla | 73:8c7dd6fd462e | 103 | deleteObjectArray(this->_objects); |
nyatla | 73:8c7dd6fd462e | 104 | free(this->_mod); |
nyatla | 73:8c7dd6fd462e | 105 | this->_mod=NULL; |
nyatla | 72:c118a7aa37a3 | 106 | return; |
nyatla | 72:c118a7aa37a3 | 107 | } |
nyatla | 72:c118a7aa37a3 | 108 | bool ModJsonRpc::putResult(unsigned int i_id,const char* i_params_fmt,...) |
nyatla | 72:c118a7aa37a3 | 109 | { |
nyatla | 72:c118a7aa37a3 | 110 | bool ret; |
nyatla | 72:c118a7aa37a3 | 111 | va_list a; |
nyatla | 72:c118a7aa37a3 | 112 | va_start(a,i_params_fmt); |
nyatla | 72:c118a7aa37a3 | 113 | ret=NyLPC_cModJsonRpc_putResultV(this->_mod,i_id,i_params_fmt,a)?true:false; |
nyatla | 72:c118a7aa37a3 | 114 | va_end(a); |
nyatla | 72:c118a7aa37a3 | 115 | return ret; |
nyatla | 72:c118a7aa37a3 | 116 | } |
nyatla | 72:c118a7aa37a3 | 117 | bool ModJsonRpc::putError(unsigned int i_id,int i_code) |
nyatla | 72:c118a7aa37a3 | 118 | { |
nyatla | 72:c118a7aa37a3 | 119 | return NyLPC_cModJsonRpc_putError(this->_mod,i_id,i_code)?true:false; |
nyatla | 72:c118a7aa37a3 | 120 | } |
nyatla | 72:c118a7aa37a3 | 121 | |
nyatla | 76:b375b3d750d8 | 122 | int ModJsonRpc::addObject(BasicRpcObject* i_object) |
nyatla | 72:c118a7aa37a3 | 123 | { |
nyatla | 72:c118a7aa37a3 | 124 | for(int i=0;i<NUM_OF_OBJECTS;i++){ |
nyatla | 72:c118a7aa37a3 | 125 | if(this->_objects[i]==NULL){ |
nyatla | 72:c118a7aa37a3 | 126 | this->_objects[i]=i_object; |
nyatla | 72:c118a7aa37a3 | 127 | return i; |
nyatla | 72:c118a7aa37a3 | 128 | } |
nyatla | 72:c118a7aa37a3 | 129 | } |
nyatla | 72:c118a7aa37a3 | 130 | return -1; |
nyatla | 72:c118a7aa37a3 | 131 | } |
nyatla | 72:c118a7aa37a3 | 132 | void* ModJsonRpc::getObject(int i_oid) |
nyatla | 72:c118a7aa37a3 | 133 | { |
nyatla | 76:b375b3d750d8 | 134 | return this->_objects[i_oid]->obj; |
nyatla | 76:b375b3d750d8 | 135 | } |
nyatla | 72:c118a7aa37a3 | 136 | |
nyatla | 76:b375b3d750d8 | 137 | } |