This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088
Fork of libMiMic by
mbed/mod/ModJsonRpc.cpp@81:e5e4f2264d24, 2014-06-24 (annotated)
- Committer:
- nyatla
- Date:
- Tue Jun 24 14:34:39 2014 +0000
- Revision:
- 81:e5e4f2264d24
- Parent:
- 76:b375b3d750d8
- Child:
- 85:416f8bbbdf54
???????????????JsonRPC??????????; LPC4088/LPC1768??????????;
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 | 81:e5e4f2264d24 | 47 | bool ModJsonRpc::isStarted(){ |
nyatla | 81:e5e4f2264d24 | 48 | return this->_mod!=NULL; |
nyatla | 81:e5e4f2264d24 | 49 | } |
nyatla | 72:c118a7aa37a3 | 50 | bool ModJsonRpc::execute(HttpdConnection& i_connection) |
nyatla | 72:c118a7aa37a3 | 51 | { |
nyatla | 81:e5e4f2264d24 | 52 | i_connection.lockHttpd(); |
nyatla | 72:c118a7aa37a3 | 53 | if(this->_mod!=NULL){ |
nyatla | 81:e5e4f2264d24 | 54 | i_connection.unlockHttpd(); |
nyatla | 72:c118a7aa37a3 | 55 | return false; |
nyatla | 72:c118a7aa37a3 | 56 | } |
nyatla | 72:c118a7aa37a3 | 57 | this->_mod=(NyLPC_TcModJsonRpc_t*)malloc(sizeof(NyLPC_TcModJsonRpc_t)); |
nyatla | 81:e5e4f2264d24 | 58 | i_connection.unlockHttpd(); |
nyatla | 81:e5e4f2264d24 | 59 | |
nyatla | 72:c118a7aa37a3 | 60 | if(this->_mod==NULL){ |
nyatla | 72:c118a7aa37a3 | 61 | return false; |
nyatla | 72:c118a7aa37a3 | 62 | } |
nyatla | 81:e5e4f2264d24 | 63 | |
nyatla | 72:c118a7aa37a3 | 64 | //initialize websocket |
nyatla | 72:c118a7aa37a3 | 65 | NyLPC_cModJsonRpc_initialize(this->_mod,this->_path,this->_rpc_table); |
nyatla | 72:c118a7aa37a3 | 66 | if(NyLPC_cModJsonRpc_canHandle(this->_mod,i_connection._ref_inst)){ |
nyatla | 73:8c7dd6fd462e | 67 | if(NyLPC_cModJsonRpc_execute(this->_mod,i_connection._ref_inst)){ |
nyatla | 73:8c7dd6fd462e | 68 | //initialize object array |
nyatla | 73:8c7dd6fd462e | 69 | this->_objects=newObjectArray(); |
nyatla | 73:8c7dd6fd462e | 70 | return true; |
nyatla | 73:8c7dd6fd462e | 71 | } |
nyatla | 72:c118a7aa37a3 | 72 | } |
nyatla | 72:c118a7aa37a3 | 73 | NyLPC_cModJsonRpc_finalize(this->_mod); |
nyatla | 72:c118a7aa37a3 | 74 | free(this->_mod); |
nyatla | 81:e5e4f2264d24 | 75 | i_connection.lockHttpd(); |
nyatla | 72:c118a7aa37a3 | 76 | this->_mod=NULL; |
nyatla | 81:e5e4f2264d24 | 77 | i_connection.unlockHttpd(); |
nyatla | 73:8c7dd6fd462e | 78 | return false; |
nyatla | 72:c118a7aa37a3 | 79 | } |
nyatla | 72:c118a7aa37a3 | 80 | |
nyatla | 75:2a18df0ef111 | 81 | void ModJsonRpc::dispatchRpc() |
nyatla | 72:c118a7aa37a3 | 82 | { |
nyatla | 72:c118a7aa37a3 | 83 | const union NyLPC_TJsonRpcParserResult* rpc_result; |
nyatla | 73:8c7dd6fd462e | 84 | if(this->_mod==NULL){ |
nyatla | 73:8c7dd6fd462e | 85 | return; |
nyatla | 73:8c7dd6fd462e | 86 | } |
nyatla | 72:c118a7aa37a3 | 87 | for(;;){ |
nyatla | 72:c118a7aa37a3 | 88 | if(!NyLPC_cModJsonRpc_processRpcMessage(this->_mod)){ |
nyatla | 72:c118a7aa37a3 | 89 | break; |
nyatla | 72:c118a7aa37a3 | 90 | } |
nyatla | 72:c118a7aa37a3 | 91 | //メッセージ取得を試行 |
nyatla | 72:c118a7aa37a3 | 92 | rpc_result=NyLPC_cModJsonRpc_getMessage(this->_mod); |
nyatla | 72:c118a7aa37a3 | 93 | if(rpc_result==NULL){ |
nyatla | 72:c118a7aa37a3 | 94 | //nothing |
nyatla | 72:c118a7aa37a3 | 95 | continue; |
nyatla | 72:c118a7aa37a3 | 96 | } |
nyatla | 72:c118a7aa37a3 | 97 | if(NyLPC_TJsonRpcParserResult_hasMethodHandler(rpc_result)){ |
nyatla | 72:c118a7aa37a3 | 98 | if(NyLPC_TJsonRpcParserResult_callMethodHandler(rpc_result,this)){ |
nyatla | 72:c118a7aa37a3 | 99 | continue; |
nyatla | 72:c118a7aa37a3 | 100 | }else{ |
nyatla | 72:c118a7aa37a3 | 101 | //function failed. |
nyatla | 72:c118a7aa37a3 | 102 | break; |
nyatla | 72:c118a7aa37a3 | 103 | } |
nyatla | 72:c118a7aa37a3 | 104 | }else{ |
nyatla | 72:c118a7aa37a3 | 105 | //no handler |
nyatla | 72:c118a7aa37a3 | 106 | break; |
nyatla | 72:c118a7aa37a3 | 107 | } |
nyatla | 72:c118a7aa37a3 | 108 | } |
nyatla | 72:c118a7aa37a3 | 109 | NyLPC_cModJsonRpc_close(this->_mod,1000); |
nyatla | 73:8c7dd6fd462e | 110 | NyLPC_cModJsonRpc_finalize(this->_mod); |
nyatla | 73:8c7dd6fd462e | 111 | deleteObjectArray(this->_objects); |
nyatla | 73:8c7dd6fd462e | 112 | free(this->_mod); |
nyatla | 73:8c7dd6fd462e | 113 | this->_mod=NULL; |
nyatla | 72:c118a7aa37a3 | 114 | return; |
nyatla | 72:c118a7aa37a3 | 115 | } |
nyatla | 72:c118a7aa37a3 | 116 | bool ModJsonRpc::putResult(unsigned int i_id,const char* i_params_fmt,...) |
nyatla | 72:c118a7aa37a3 | 117 | { |
nyatla | 72:c118a7aa37a3 | 118 | bool ret; |
nyatla | 72:c118a7aa37a3 | 119 | va_list a; |
nyatla | 72:c118a7aa37a3 | 120 | va_start(a,i_params_fmt); |
nyatla | 72:c118a7aa37a3 | 121 | ret=NyLPC_cModJsonRpc_putResultV(this->_mod,i_id,i_params_fmt,a)?true:false; |
nyatla | 72:c118a7aa37a3 | 122 | va_end(a); |
nyatla | 72:c118a7aa37a3 | 123 | return ret; |
nyatla | 72:c118a7aa37a3 | 124 | } |
nyatla | 72:c118a7aa37a3 | 125 | bool ModJsonRpc::putError(unsigned int i_id,int i_code) |
nyatla | 72:c118a7aa37a3 | 126 | { |
nyatla | 72:c118a7aa37a3 | 127 | return NyLPC_cModJsonRpc_putError(this->_mod,i_id,i_code)?true:false; |
nyatla | 72:c118a7aa37a3 | 128 | } |
nyatla | 72:c118a7aa37a3 | 129 | |
nyatla | 76:b375b3d750d8 | 130 | int ModJsonRpc::addObject(BasicRpcObject* i_object) |
nyatla | 72:c118a7aa37a3 | 131 | { |
nyatla | 72:c118a7aa37a3 | 132 | for(int i=0;i<NUM_OF_OBJECTS;i++){ |
nyatla | 72:c118a7aa37a3 | 133 | if(this->_objects[i]==NULL){ |
nyatla | 72:c118a7aa37a3 | 134 | this->_objects[i]=i_object; |
nyatla | 72:c118a7aa37a3 | 135 | return i; |
nyatla | 72:c118a7aa37a3 | 136 | } |
nyatla | 72:c118a7aa37a3 | 137 | } |
nyatla | 72:c118a7aa37a3 | 138 | return -1; |
nyatla | 72:c118a7aa37a3 | 139 | } |
nyatla | 72:c118a7aa37a3 | 140 | void* ModJsonRpc::getObject(int i_oid) |
nyatla | 72:c118a7aa37a3 | 141 | { |
nyatla | 76:b375b3d750d8 | 142 | return this->_objects[i_oid]->obj; |
nyatla | 76:b375b3d750d8 | 143 | } |
nyatla | 72:c118a7aa37a3 | 144 | |
nyatla | 76:b375b3d750d8 | 145 | } |