Jun Furutani / libMiMic

Fork of libMiMic by Ryo Iizuka

Committer:
nyatla
Date:
Sat Jun 14 15:55:57 2014 +0000
Revision:
75:2a18df0ef111
Parent:
73:8c7dd6fd462e
Child:
76:b375b3d750d8
MiMicCore r360???; mbed???????

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 73:8c7dd6fd462e 7 #define NUM_OF_OBJECTS 3
nyatla 73:8c7dd6fd462e 8 void** newObjectArray()
nyatla 73:8c7dd6fd462e 9 {
nyatla 73:8c7dd6fd462e 10 void** r=new void*[NUM_OF_OBJECTS];
nyatla 73:8c7dd6fd462e 11 memset(r,sizeof(void*)*NUM_OF_OBJECTS,0);
nyatla 73:8c7dd6fd462e 12 return r;
nyatla 73:8c7dd6fd462e 13 }
nyatla 73:8c7dd6fd462e 14 void deleteObjectArray(void** 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 73:8c7dd6fd462e 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 72:c118a7aa37a3 122 int ModJsonRpc::addObject(void* 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 72:c118a7aa37a3 134 return this->_objects[i_oid];
nyatla 72:c118a7aa37a3 135 }
nyatla 72:c118a7aa37a3 136
nyatla 72:c118a7aa37a3 137 }