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

Fork of libMiMic by Ryo Iizuka

Committer:
nyatla
Date:
Fri Jun 13 11:06:33 2014 +0000
Revision:
72:c118a7aa37a3
Child:
73:8c7dd6fd462e
mbedAPI???????

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 72:c118a7aa37a3 7 #define NUM_OF_OBJECTS 32
nyatla 72:c118a7aa37a3 8
nyatla 72:c118a7aa37a3 9 ModJsonRpc::ModJsonRpc(const char* i_path,const struct NyLPC_TJsonRpcClassDef** i_rpc_table):ModBaseClass(i_path)
nyatla 72:c118a7aa37a3 10 {
nyatla 72:c118a7aa37a3 11 this->_mod=NULL;
nyatla 72:c118a7aa37a3 12 this->_rpc_table=i_rpc_table;
nyatla 72:c118a7aa37a3 13 }
nyatla 72:c118a7aa37a3 14 ModJsonRpc::ModJsonRpc()
nyatla 72:c118a7aa37a3 15 {
nyatla 72:c118a7aa37a3 16 this->_mod=NULL;
nyatla 72:c118a7aa37a3 17 }
nyatla 72:c118a7aa37a3 18 ModJsonRpc::~ModJsonRpc()
nyatla 72:c118a7aa37a3 19 {
nyatla 72:c118a7aa37a3 20 if(this->_mod!=NULL){
nyatla 72:c118a7aa37a3 21 NyLPC_cModJsonRpc_finalize(this->_mod);
nyatla 72:c118a7aa37a3 22 this->_mod=NULL;
nyatla 72:c118a7aa37a3 23 }
nyatla 72:c118a7aa37a3 24 }
nyatla 72:c118a7aa37a3 25 void ModJsonRpc::setParam(const char* i_path,const struct NyLPC_TJsonRpcClassDef** i_rpc_table)
nyatla 72:c118a7aa37a3 26 {
nyatla 72:c118a7aa37a3 27 ModBaseClass::setParam(i_path);
nyatla 72:c118a7aa37a3 28 this->_rpc_table=i_rpc_table;
nyatla 72:c118a7aa37a3 29 }
nyatla 72:c118a7aa37a3 30 bool ModJsonRpc::execute(HttpdConnection& i_connection)
nyatla 72:c118a7aa37a3 31 {
nyatla 72:c118a7aa37a3 32 if(this->_mod!=NULL){
nyatla 72:c118a7aa37a3 33 return false;
nyatla 72:c118a7aa37a3 34 }
nyatla 72:c118a7aa37a3 35 this->_mod=(NyLPC_TcModJsonRpc_t*)malloc(sizeof(NyLPC_TcModJsonRpc_t));
nyatla 72:c118a7aa37a3 36 if(this->_mod==NULL){
nyatla 72:c118a7aa37a3 37 return false;
nyatla 72:c118a7aa37a3 38 }
nyatla 72:c118a7aa37a3 39 bool ret=false;
nyatla 72:c118a7aa37a3 40 //initialize table
nyatla 72:c118a7aa37a3 41 this->_objects=new void*[NUM_OF_OBJECTS];
nyatla 72:c118a7aa37a3 42 memset(this->_objects,sizeof(void*)*NUM_OF_OBJECTS,0);
nyatla 72:c118a7aa37a3 43
nyatla 72:c118a7aa37a3 44 //initialize websocket
nyatla 72:c118a7aa37a3 45 NyLPC_cModJsonRpc_initialize(this->_mod,this->_path,this->_rpc_table);
nyatla 72:c118a7aa37a3 46 if(NyLPC_cModJsonRpc_canHandle(this->_mod,i_connection._ref_inst)){
nyatla 72:c118a7aa37a3 47 ret=NyLPC_cModJsonRpc_execute(this->_mod,i_connection._ref_inst)?true:false;
nyatla 72:c118a7aa37a3 48 }
nyatla 72:c118a7aa37a3 49 NyLPC_cModJsonRpc_finalize(this->_mod);
nyatla 72:c118a7aa37a3 50 free(this->_mod);
nyatla 72:c118a7aa37a3 51 this->_mod=NULL;
nyatla 72:c118a7aa37a3 52
nyatla 72:c118a7aa37a3 53 for(int i=0;i<NUM_OF_OBJECTS;i++){
nyatla 72:c118a7aa37a3 54 if(this->_objects[i]!=NULL){
nyatla 72:c118a7aa37a3 55 delete this->_objects[i];
nyatla 72:c118a7aa37a3 56 }
nyatla 72:c118a7aa37a3 57 }
nyatla 72:c118a7aa37a3 58 return ret;
nyatla 72:c118a7aa37a3 59 }
nyatla 72:c118a7aa37a3 60
nyatla 72:c118a7aa37a3 61 void ModJsonRpc::dispatchRpcCall()
nyatla 72:c118a7aa37a3 62 {
nyatla 72:c118a7aa37a3 63 const union NyLPC_TJsonRpcParserResult* rpc_result;
nyatla 72:c118a7aa37a3 64 for(;;){
nyatla 72:c118a7aa37a3 65 if(!NyLPC_cModJsonRpc_processRpcMessage(this->_mod)){
nyatla 72:c118a7aa37a3 66 break;
nyatla 72:c118a7aa37a3 67 }
nyatla 72:c118a7aa37a3 68 //メッセージ取得を試行
nyatla 72:c118a7aa37a3 69 rpc_result=NyLPC_cModJsonRpc_getMessage(this->_mod);
nyatla 72:c118a7aa37a3 70 if(rpc_result==NULL){
nyatla 72:c118a7aa37a3 71 //nothing
nyatla 72:c118a7aa37a3 72 continue;
nyatla 72:c118a7aa37a3 73 }
nyatla 72:c118a7aa37a3 74 if(NyLPC_TJsonRpcParserResult_hasMethodHandler(rpc_result)){
nyatla 72:c118a7aa37a3 75 if(NyLPC_TJsonRpcParserResult_callMethodHandler(rpc_result,this)){
nyatla 72:c118a7aa37a3 76 continue;
nyatla 72:c118a7aa37a3 77 }else{
nyatla 72:c118a7aa37a3 78 //function failed.
nyatla 72:c118a7aa37a3 79 break;
nyatla 72:c118a7aa37a3 80 }
nyatla 72:c118a7aa37a3 81 }else{
nyatla 72:c118a7aa37a3 82 //no handler
nyatla 72:c118a7aa37a3 83 break;
nyatla 72:c118a7aa37a3 84 }
nyatla 72:c118a7aa37a3 85 }
nyatla 72:c118a7aa37a3 86 NyLPC_cModJsonRpc_close(this->_mod,1000);
nyatla 72:c118a7aa37a3 87 return;
nyatla 72:c118a7aa37a3 88 }
nyatla 72:c118a7aa37a3 89 bool ModJsonRpc::putResult(unsigned int i_id,const char* i_params_fmt,...)
nyatla 72:c118a7aa37a3 90 {
nyatla 72:c118a7aa37a3 91 bool ret;
nyatla 72:c118a7aa37a3 92 va_list a;
nyatla 72:c118a7aa37a3 93 va_start(a,i_params_fmt);
nyatla 72:c118a7aa37a3 94 ret=NyLPC_cModJsonRpc_putResultV(this->_mod,i_id,i_params_fmt,a)?true:false;
nyatla 72:c118a7aa37a3 95 va_end(a);
nyatla 72:c118a7aa37a3 96 return ret;
nyatla 72:c118a7aa37a3 97 }
nyatla 72:c118a7aa37a3 98 bool ModJsonRpc::putError(unsigned int i_id,int i_code)
nyatla 72:c118a7aa37a3 99 {
nyatla 72:c118a7aa37a3 100 return NyLPC_cModJsonRpc_putError(this->_mod,i_id,i_code)?true:false;
nyatla 72:c118a7aa37a3 101 }
nyatla 72:c118a7aa37a3 102
nyatla 72:c118a7aa37a3 103 int ModJsonRpc::addObject(void* i_object)
nyatla 72:c118a7aa37a3 104 {
nyatla 72:c118a7aa37a3 105 for(int i=0;i<NUM_OF_OBJECTS;i++){
nyatla 72:c118a7aa37a3 106 if(this->_objects[i]==NULL){
nyatla 72:c118a7aa37a3 107 this->_objects[i]=i_object;
nyatla 72:c118a7aa37a3 108 return i;
nyatla 72:c118a7aa37a3 109 }
nyatla 72:c118a7aa37a3 110 }
nyatla 72:c118a7aa37a3 111 return -1;
nyatla 72:c118a7aa37a3 112 }
nyatla 72:c118a7aa37a3 113 void* ModJsonRpc::getObject(int i_oid)
nyatla 72:c118a7aa37a3 114 {
nyatla 72:c118a7aa37a3 115 return this->_objects[i_oid];
nyatla 72:c118a7aa37a3 116 }
nyatla 72:c118a7aa37a3 117
nyatla 72:c118a7aa37a3 118 }