This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088

Fork of libMiMic by Ryo Iizuka

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?

UserRevisionLine numberNew 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 }