Response MarketSession::executeProtobuf(Request request) { QByteArray requestBytes(request.SerializeAsString().c_str(),request.ByteSize()); QByteArray responseBytes; if(!context.issecure()) responseBytes = executeRawHttpQuery(requestBytes); else responseBytes = executeRawHttpsQuery(requestBytes); Response r; r.ParseFromArray(responseBytes.constData(),responseBytes.size()); return r; }
inline void cpp_handler_wrapper<Response>::operator()( const rpc_error* error, const void* data, size_t size) { if (cpp_handler_.empty()) return; // ignore error and message Response resp; if (error) { cpp_handler_(error, resp); return; } BOOST_ASSERT(data); if (resp.ParseFromArray(data, size)) { cpp_handler_(NULL, resp); return; } // invalid message rpc_error e(error_code::INVALID_MESSAGE, ""); cpp_handler_(&e, resp); } // operator()()
int f(ptime time, int dt) { NF *f = new NF; f->set_dt(dt); f->set_allocated_current_time(ptime_to_DataTime(time)); assert(f->IsInitialized()); Call c; c.set_type(Call::N_F); c.set_allocated_n_f(f); assert(c.IsInitialized()); std::string buf = c.SerializeAsString(); zmq::message_t req((void*) buf.data(), buf.length(), 0); socket.send(req); zmq::message_t resp; socket.recv(&resp); Response r; r.ParseFromArray(resp.data(), resp.size()); assert(r.type() == Call::N_F); return r.n_f(); }
bool PbSession::parse(Response& response) const { error_.clear(); PbHeader hdr; if( !parse(hdr) ) return false; if( !response.ParseFromArray(cache_->data()+sizeof(hdr), hdr.bufsize) ) { error_ = "Protobuf parsing error (analysis under debug only)."; qDebug() << "Protobuf parsing error: " << response.DebugString().c_str(); return false; } qint32 error_code = response.has_error_code() ? response.error_code() : 0; if( error_code >= 300 ) { error_ = "Error in protobuf response: "; if( error_code ) error_ += QString(" code=%1 ").arg(error_code); for(int c=0; c<response.error_message_size(); ++c) error_ += QString(" error%1=").arg(c) + QString::fromStdString(response.error_message(c)) + " "; error_ = error_.trimmed(); return false; } if( !response.has_message_type() ) { error_ = QString("Error in protobuf response: 'message_type' is absent."); return false; } else if( response.message_type() != RPC_WORKGROUPS_LIST && response.message_type() != RPC_UNKNOWN ) { error_ = QString("Error in protobuf response: 'message_type=%1'.").arg( response.message_type() ); return false; } return validate( response.workgroups_list() ); }
double get_parameter(const std::string &name) const { std::string *allocated_name = new std::string(name); NGetParameter *gp = new NGetParameter; gp->set_allocated_name(allocated_name); assert(gp->IsInitialized()); Call c; c.set_type(Call::N_GET_PARAMETER); c.set_allocated_n_get_parameter(gp); assert(c.IsInitialized()); std::string buf = c.SerializeAsString(); zmq::message_t req((void*) buf.data(), buf.length(), 0); socket.send(req); zmq::message_t resp; socket.recv(&resp); Response r; bool parsed = r.ParseFromArray(resp.data(), resp.size()); assert(parsed); return r.n_get_parameter().value().double_(); }