void CPPClientStubGenerator::generateMethod(Procedure &proc) { string procsignature = TEMPLATE_CPPCLIENT_SIGMETHOD; string returntype = CPPHelper::toCppType(proc.GetReturnType()); if (proc.GetProcedureType() == RPC_NOTIFICATION) returntype = "void"; replaceAll2(procsignature, "<returntype>", returntype); replaceAll2(procsignature, "<methodname>", CPPHelper::normalizeString(proc.GetProcedureName())); replaceAll2(procsignature, "<parameters>", CPPHelper::generateParameterDeclarationList(proc)); cg.writeLine(procsignature); cg.writeLine("{"); cg.increaseIndentation(); cg.writeLine("Json::Value p;"); generateAssignments(proc); generateProcCall(proc); cg.decreaseIndentation(); cg.writeLine("}"); }
void CPPClientStubGenerator::generateProcCall(Procedure &proc) { string call; if (proc.GetProcedureType() == RPC_METHOD) { call = TEMPLATE_METHODCALL; cg.writeLine(replaceAll(call, "<name>", proc.GetProcedureName())); call = TEMPLATE_RETURNCHECK; replaceAll2(call,"<cast>", CPPHelper::isCppConversion(proc.GetReturnType())); cg.writeLine(call); cg.increaseIndentation(); call = TEMPLATE_RETURN; replaceAll2(call,"<cast>", CPPHelper::toCppConversion(proc.GetReturnType())); cg.writeLine(call); cg.decreaseIndentation(); cg.writeLine("else"); cg.increaseIndentation(); cg.writeLine("throw jsonrpc::JsonRpcException(jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString());"); cg.decreaseIndentation(); } else { call = TEMPLATE_NOTIFICATIONCALL; replaceAll2(call, "<name>", proc.GetProcedureName()); cg.writeLine(call); } }
void RpcProtocolServer::ProcessRequest(const Json::Value& request, Json::Value& response) { Procedure* method = (*this->procedures)[request[KEY_REQUEST_METHODNAME].asString()]; Json::Value result; if (method->GetProcedureType() == RPC_METHOD) { server->handleMethodCall(method, request[KEY_REQUEST_PARAMETERS], result); response[KEY_REQUEST_VERSION] = JSON_RPC_VERSION; response[KEY_RESPONSE_RESULT] = result; response[KEY_REQUEST_ID] = request[KEY_REQUEST_ID]; if (this->authManager != NULL) { this->authManager->ProcessAuthentication( request[KEY_AUTHENTICATION], response[KEY_AUTHENTICATION]); } } else { server->handleNotificationCall(method, request[KEY_REQUEST_PARAMETERS]); response = Json::Value::null; } }
int RpcProtocolServer::ValidateRequest(const Json::Value& request) { int error = 0; Procedure* proc; if (!(request.isMember(KEY_REQUEST_METHODNAME) && request.isMember(KEY_REQUEST_VERSION) && request.isMember(KEY_REQUEST_PARAMETERS))) { error = Errors::ERROR_RPC_INVALID_REQUEST; } else { map<string, Procedure*>::iterator it = procedures->find(request[KEY_REQUEST_METHODNAME].asString()); if (it != this->procedures->end()) { proc = (*this->procedures)[request[KEY_REQUEST_METHODNAME].asString()]; if(request.isMember(KEY_REQUEST_ID) && proc->GetProcedureType() == RPC_NOTIFICATION) { error = Errors::ERROR_SERVER_PROCEDURE_IS_NOTIFICATION; } else if(!request.isMember(KEY_REQUEST_ID) && proc->GetProcedureType() == RPC_METHOD) { error = Errors::ERROR_SERVER_PROCEDURE_IS_METHOD; } else if (proc->ValdiateParameters(request[KEY_REQUEST_PARAMETERS])) { if (this->authManager != NULL) { error = this->authManager->CheckPermission( request[KEY_AUTHENTICATION], proc->GetProcedureName()); } } else { error = Errors::ERROR_RPC_INVALID_PARAMS; } } else { error = Errors::ERROR_RPC_METHOD_NOT_FOUND; } } return error; }
void SpecificationWriter::procedureToJsonValue (const Procedure &procedure, Json::Value &target) { target[KEY_SPEC_PROCEDURE_NAME] = procedure.GetProcedureName(); if(procedure.GetProcedureType() == RPC_METHOD) { target[KEY_SPEC_RETURN_TYPE] = toJsonLiteral(procedure.GetReturnType()); } for(parameterNameList_t::const_iterator it = procedure.GetParameters().begin(); it != procedure.GetParameters().end(); ++it) { if(procedure.GetParameterDeclarationType() == PARAMS_BY_NAME) { target[KEY_SPEC_PROCEDURE_PARAMETERS][it->first] = toJsonLiteral(it->second); } else { target[KEY_SPEC_PROCEDURE_PARAMETERS].append(toJsonLiteral(it->second)); } } }