00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
#ifndef ___OPTIMIZER_NHOPT_RPC_QOSOPTIMIZER_H
00015
#define ___OPTIMIZER_NHOPT_RPC_QOSOPTIMIZER_H
00016
00017
#include <NMSTL/rpc>
00018
#include "Stats.h"
00019
00020
namespace Borealis {
class QOSOptimizer; };
00021
00022
00023 NMSTL_NAMESPACE_BEGIN;
00024
00025
#ifdef DOXYGEN_SKIP
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
template<
typename T>
class Remote;
00037 class Remote<Borealis::
QOSOptimizer> {
00038
public:
00041
void do_something(
const Callback<
void, RPC< void > >& completion,
00042
double life,
double tp);
00043
00045 RPC< void >
do_something(
double life,
double tp);
00046
00049
void call_me(
const Callback<
void, RPC< int > >& completion);
00050
00052 RPC< int >
call_me();
00053
00056
void get_stat(
const Callback<
void, RPC< vector<Stats> > >& completion);
00057
00059 RPC< vector<Stats> >
get_stat();
00060
00061 };
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
#else // !defined(DOXYGEN_SKIP)
00075
00076
namespace __nmstl_tmp_rpc_defs {
00077
template<
typename X>
struct RPCDefs;
00078
template<
typename X>
struct Remote;
00079
using namespace Borealis;
00080
template<>
00081
struct RPCDefs<Borealis::
QOSOptimizer> {
00082
static const int do_something_METHOD_ID = 20000;
00083
struct do_something_IN :
public rpc_request_1< void > {
00084
double life;
double tp;
00085 do_something_IN() {}
00086 do_something_IN(
double life,
double tp) : life(life), tp(tp) {}
00087 rpc_message *clone()
const {
return new do_something_IN(*
this); }
00088 string as_string()
const {
00089 string out;
00090 out <<
"do_something_IN{" <<
"life=" << life <<
", tp=" << tp <<
"}";
00091
return out;
00092 }
00093 NMSTL_SIMPLY_SERIALIZABLE(do_something_IN, << Serial::tag(
"param") << life << tp );
00094 NMSTL_SERIAL_TAG(do_something_IN,
"params");
00095 };
00096
class do_something_OUT {
00097 RPCStatus m_stat;
00098
public:
00099 operator const void * ()
const {
return m_stat; }
00100
const RPCStatus& stat()
const {
return m_stat; }
00101
bool get()
const {
return true; }
00102 };
00103
static const int call_me_METHOD_ID = 20001;
00104
struct call_me_IN :
public rpc_request_1< int > {
00105
00106 call_me_IN() {}
00107 rpc_message *clone()
const {
return new call_me_IN(*
this); }
00108 string as_string()
const {
00109 string out;
00110 out <<
"call_me_IN{" <<
"}";
00111
return out;
00112 }
00113 NMSTL_SIMPLY_SERIALIZABLE(call_me_IN, << Serial::tag(
"param") );
00114 NMSTL_SERIAL_TAG(call_me_IN,
"params");
00115 };
00116
class call_me_OUT {
00117 RPCStatus m_stat;
00118
int m_val;
00119
public:
00120 operator const void * ()
const {
return m_stat; }
00121
const RPCStatus& stat()
const {
return m_stat; }
00122
int get()
const {
return m_val; }
00123 };
00124
static const int get_stat_METHOD_ID = 20002;
00125
struct get_stat_IN :
public rpc_request_1< vector<Stats> > {
00126
00127 get_stat_IN() {}
00128 rpc_message *clone()
const {
return new get_stat_IN(*
this); }
00129 string as_string()
const {
00130 string out;
00131 out <<
"get_stat_IN{" <<
"}";
00132
return out;
00133 }
00134 NMSTL_SIMPLY_SERIALIZABLE(get_stat_IN, << Serial::tag(
"param") );
00135 NMSTL_SERIAL_TAG(get_stat_IN,
"params");
00136 };
00137
class get_stat_OUT {
00138 RPCStatus m_stat;
00139 vector<Stats> m_val;
00140
public:
00141 operator const void * ()
const {
return m_stat; }
00142
const RPCStatus& stat()
const {
return m_stat; }
00143 vector<Stats> get()
const {
return m_val; }
00144 };
00145
static const vector<pair<string, int> >& method_list() {
00146
static const pair<string, int> methods[] = {
00147 pair<string, int>(
"do_something", 20000),
00148 pair<string, int>(
"call_me", 20001),
00149 pair<string, int>(
"get_stat", 20002)
00150 };
00151
static const vector<pair<string, int> > ret(methods, methods +
sizeof methods /
sizeof methods[0]);
00152
return ret;
00153 };
00154
static const map<string, int>& method_id_by_name() {
00155
static const map<string, int> ret(method_list().begin(), method_list().end());
00156
return ret;
00157 }
00158
static const map<int, string>& method_name_by_id() {
00159
static const map<int, string> ret = RPCObject::reverse_map(method_id_by_name());
00160
return ret;
00161 }
00162 };
00163
template<>
00164
class Remote<Borealis::
QOSOptimizer> :
public RemoteObject {
00165
friend class RPCClient;
00166
protected:
00167 Remote<Borealis::QOSOptimizer>(RPCClient& cli, rpc_object_id object_id) :
00168 RemoteObject(cli, object_id) {}
00169
00170
public:
00171 Remote<Borealis::QOSOptimizer>() {}
00172
void do_something(
const Callback<
void, RPC< void > >& completion,
double life,
double tp)
const {
00173 RPCDefs<Borealis::QOSOptimizer>::do_something_IN *req =
00174
new RPCDefs<Borealis::QOSOptimizer>::do_something_IN(life, tp);
00175 req->object_id = object_id();
00176 req->method_id = RPCDefs<Borealis::QOSOptimizer>::do_something_METHOD_ID;
00177 req->method_name =
"do_something";
00178 req->cb = completion;
00179 client().send_request(ptr<rpc_request>(req));
00180 }
00181 RPC< void > do_something(
double life,
double tp)
const {
00182 RPCDefs<Borealis::QOSOptimizer>::do_something_IN *req =
00183
new RPCDefs<Borealis::QOSOptimizer>::do_something_IN(life, tp);
00184 ptr<rpc_request> preq(req);
00185 req->object_id = object_id();
00186 req->method_id = RPCDefs<Borealis::QOSOptimizer>::do_something_METHOD_ID;
00187 req->method_name =
"do_something";
00188
bool done =
false; RPC< void > ret;
00189 req->cb = wrap(&rpc_sync_completion< void >, &done, &ret);
00190 client().send_request(preq);
00191
while (!done && client().block()) ;
00192 req->cb = Callback<void, RPC< void > >();
00193
return ret;
00194 }
00195
typedef const RPCDefs<Borealis::QOSOptimizer>::do_something_OUT &do_something_result;
00196
void call_me(
const Callback<
void, RPC< int > >& completion)
const {
00197 RPCDefs<Borealis::QOSOptimizer>::call_me_IN *req =
00198
new RPCDefs<Borealis::QOSOptimizer>::call_me_IN();
00199 req->object_id = object_id();
00200 req->method_id = RPCDefs<Borealis::QOSOptimizer>::call_me_METHOD_ID;
00201 req->method_name =
"call_me";
00202 req->cb = completion;
00203 client().send_request(ptr<rpc_request>(req));
00204 }
00205 RPC< int > call_me()
const {
00206 RPCDefs<Borealis::QOSOptimizer>::call_me_IN *req =
00207
new RPCDefs<Borealis::QOSOptimizer>::call_me_IN();
00208 ptr<rpc_request> preq(req);
00209 req->object_id = object_id();
00210 req->method_id = RPCDefs<Borealis::QOSOptimizer>::call_me_METHOD_ID;
00211 req->method_name =
"call_me";
00212
bool done =
false; RPC< int > ret;
00213 req->cb = wrap(&rpc_sync_completion< int >, &done, &ret);
00214 client().send_request(preq);
00215
while (!done && client().block()) ;
00216 req->cb = Callback<void, RPC< int > >();
00217
return ret;
00218 }
00219
typedef const RPCDefs<Borealis::QOSOptimizer>::call_me_OUT &call_me_result;
00220
void get_stat(
const Callback<
void, RPC< vector<Stats> > >& completion)
const {
00221 RPCDefs<Borealis::QOSOptimizer>::get_stat_IN *req =
00222
new RPCDefs<Borealis::QOSOptimizer>::get_stat_IN();
00223 req->object_id = object_id();
00224 req->method_id = RPCDefs<Borealis::QOSOptimizer>::get_stat_METHOD_ID;
00225 req->method_name =
"get_stat";
00226 req->cb = completion;
00227 client().send_request(ptr<rpc_request>(req));
00228 }
00229 RPC< vector<Stats> > get_stat()
const {
00230 RPCDefs<Borealis::QOSOptimizer>::get_stat_IN *req =
00231
new RPCDefs<Borealis::QOSOptimizer>::get_stat_IN();
00232 ptr<rpc_request> preq(req);
00233 req->object_id = object_id();
00234 req->method_id = RPCDefs<Borealis::QOSOptimizer>::get_stat_METHOD_ID;
00235 req->method_name =
"get_stat";
00236
bool done =
false; RPC< vector<Stats> > ret;
00237 req->cb = wrap(&rpc_sync_completion< vector<Stats> >, &done, &ret);
00238 client().send_request(preq);
00239
while (!done && client().block()) ;
00240 req->cb = Callback<void, RPC< vector<Stats> > >();
00241
return ret;
00242 }
00243
typedef const RPCDefs<Borealis::QOSOptimizer>::get_stat_OUT &get_stat_result;
00244 };
00245 };
00246
template<>
struct RPCDefs<Borealis::
QOSOptimizer> : __nmstl_tmp_rpc_defs::RPCDefs<Borealis::QOSOptimizer> {};
00247
template<>
struct Remote<Borealis::
QOSOptimizer> : __nmstl_tmp_rpc_defs::Remote<Borealis::QOSOptimizer> {
00248 Remote<Borealis::QOSOptimizer>() {}
00249 Remote<Borealis::QOSOptimizer>(RPCClient& cli, rpc_object_id object_id) :
00250 __nmstl_tmp_rpc_defs::Remote<Borealis::QOSOptimizer>(cli, object_id) {}
00251
00252 Remote<Borealis::QOSOptimizer>(
const __nmstl_tmp_rpc_defs::Remote<Borealis::QOSOptimizer>& x) :
00253 __nmstl_tmp_rpc_defs::Remote<Borealis::QOSOptimizer>(x) {}
00254 };
00255
00256
00257
#endif // !defined(DOXYGEN_SKIP)
00258
00259 NMSTL_NAMESPACE_END;
00260
00261
#endif // !defined(___OPTIMIZER_NHOPT_RPC_QOSOPTIMIZER_H)
00262
00263
00264
00265
00266
00267
#ifdef NMSTL_RPC_DEFINE
00268
00269
#include <string>
00270
#include <map>
00271
#include <NMSTL/rpc>
00272
00273
void Borealis::QOSOptimizer::handle_request(
const NMSTL::RPCObject::response_cb& cb,
const NMSTL::ptr<NMSTL::rpc_request>& req) {
00274
switch(req->method_id) {
00275
case NMSTL::RPCDefs<Borealis::QOSOptimizer>::do_something_METHOD_ID:
00276 {
00277
const NMSTL::RPCDefs<Borealis::QOSOptimizer>::do_something_IN* inp =
00278 dynamic_cast<const NMSTL::RPCDefs<Borealis::QOSOptimizer>::do_something_IN*>(req.get());
00279
00280
if (!inp) {
00281 string err = string(
"Invalid RPC request type ") +
typeid(*(req.get())) +
00282
" to Borealis::QOSOptimizer::do_something; expected " +
00283
typeid(NMSTL::RPCDefs<Borealis::QOSOptimizer>::do_something_IN);
00284 WARN << err;
00285 cb(err, 0,
true);
00286
return;
00287 }
00288
00289
const NMSTL::RPCDefs<Borealis::QOSOptimizer>::do_something_IN& in = *inp;
00290 RPC< void > result = do_something(in.life, in.tp);
00291
if (result.valid()) {
00292 NMSTL::rpc_message_1< void > ret;
00293 cb(
true, &ret,
true);
00294 }
else {
00295 cb(result.stat(), 0,
true);
00296 }
00297
break;
00298 }
00299
case NMSTL::RPCDefs<Borealis::QOSOptimizer>::call_me_METHOD_ID:
00300 {
00301
const NMSTL::RPCDefs<Borealis::QOSOptimizer>::call_me_IN* inp =
00302 dynamic_cast<const NMSTL::RPCDefs<Borealis::QOSOptimizer>::call_me_IN*>(req.get());
00303
00304
if (!inp) {
00305 string err = string(
"Invalid RPC request type ") +
typeid(*(req.get())) +
00306
" to Borealis::QOSOptimizer::call_me; expected " +
00307
typeid(NMSTL::RPCDefs<Borealis::QOSOptimizer>::call_me_IN);
00308 WARN << err;
00309 cb(err, 0,
true);
00310
return;
00311 }
00312
00313 RPC< int > result = call_me();
00314
if (result.valid()) {
00315 NMSTL::rpc_message_1< int > ret(*result);
00316 cb(
true, &ret,
true);
00317 }
else {
00318 cb(result.stat(), 0,
true);
00319 }
00320
break;
00321 }
00322
case NMSTL::RPCDefs<Borealis::QOSOptimizer>::get_stat_METHOD_ID:
00323 {
00324
const NMSTL::RPCDefs<Borealis::QOSOptimizer>::get_stat_IN* inp =
00325 dynamic_cast<const NMSTL::RPCDefs<Borealis::QOSOptimizer>::get_stat_IN*>(req.get());
00326
00327
if (!inp) {
00328 string err = string(
"Invalid RPC request type ") +
typeid(*(req.get())) +
00329
" to Borealis::QOSOptimizer::get_stat; expected " +
00330
typeid(NMSTL::RPCDefs<Borealis::QOSOptimizer>::get_stat_IN);
00331 WARN << err;
00332 cb(err, 0,
true);
00333
return;
00334 }
00335
00336 RPC< vector<Stats> > result = get_stat();
00337
if (result.valid()) {
00338 NMSTL::rpc_message_1< vector<Stats> > ret(*result);
00339 cb(
true, &ret,
true);
00340 }
else {
00341 cb(result.stat(), 0,
true);
00342 }
00343
break;
00344 }
00345
default:
00346 string err = string(
"Unknown method_id ") + req->method_id +
" in Borealis::QOSOptimizer::handle_request";
00347 WARN << err;
00348 cb(err, 0,
true);
00349 }
00350 }
00351
void Borealis::QOSOptimizer::handle_request(
const response_cb& cb, rpc_id method_id, ISerial& is) {
00352
switch(method_id) {
00353
case RPCDefs<Borealis::QOSOptimizer>::do_something_METHOD_ID:
00354 {
00355 RPCDefs<Borealis::QOSOptimizer>::do_something_IN in;
00356 is >> in;
00357
if (!is) {
00358 WARN <<
"Invalid RPC request to Borealis::QOSOptimizer::do_something: " << is.stat();
00359 cb(is.stat(), 0,
true);
00360
return;
00361 }
00362 DEBUG <<
"Handling do_something";
00363 RPC< void > result = do_something(in.life, in.tp);
00364
if (result.valid()) {
00365 NMSTL::rpc_message_1< void > ret;
00366 cb(
true, &ret,
true);
00367 }
else {
00368 cb(result.stat(), 0,
true);
00369 }
00370
break;
00371 }
00372
case RPCDefs<Borealis::QOSOptimizer>::call_me_METHOD_ID:
00373 {
00374 RPCDefs<Borealis::QOSOptimizer>::call_me_IN in;
00375 is >> in;
00376
if (!is) {
00377 WARN <<
"Invalid RPC request to Borealis::QOSOptimizer::call_me: " << is.stat();
00378 cb(is.stat(), 0,
true);
00379
return;
00380 }
00381 DEBUG <<
"Handling call_me";
00382 RPC< int > result = call_me();
00383
if (result.valid()) {
00384 NMSTL::rpc_message_1< int > ret(*result);
00385 cb(
true, &ret,
true);
00386 }
else {
00387 cb(result.stat(), 0,
true);
00388 }
00389
break;
00390 }
00391
case RPCDefs<Borealis::QOSOptimizer>::get_stat_METHOD_ID:
00392 {
00393 RPCDefs<Borealis::QOSOptimizer>::get_stat_IN in;
00394 is >> in;
00395
if (!is) {
00396 WARN <<
"Invalid RPC request to Borealis::QOSOptimizer::get_stat: " << is.stat();
00397 cb(is.stat(), 0,
true);
00398
return;
00399 }
00400 DEBUG <<
"Handling get_stat";
00401 RPC< vector<Stats> > result = get_stat();
00402
if (result.valid()) {
00403 NMSTL::rpc_message_1< vector<Stats> > ret(*result);
00404 cb(
true, &ret,
true);
00405 }
else {
00406 cb(result.stat(), 0,
true);
00407 }
00408
break;
00409 }
00410
default:
00411 string err = string(
"Unknown method_id ") + method_id +
" in Borealis::QOSOptimizer::handle_request";
00412 WARN << err;
00413 cb(err, 0,
true);
00414 }
00415 }
00416 NMSTL::rpc_id Borealis::QOSOptimizer::method_id_for_name(string method_name) {
00417 map<string, int>::const_iterator i = RPCDefs<Borealis::QOSOptimizer>::method_id_by_name().find(method_name);
00418
return (i == RPCDefs<Borealis::QOSOptimizer>::method_id_by_name().end()) ? rpc_id() : i->second;
00419 }
00420 string Borealis::QOSOptimizer::method_name_for_id(NMSTL::rpc_id method_id) {
00421 map<int, string>::const_iterator i = RPCDefs<Borealis::QOSOptimizer>::method_name_by_id().find(method_id);
00422
return (i == RPCDefs<Borealis::QOSOptimizer>::method_name_by_id().end()) ? string() : i->second;
00423 }
00424 NMSTL::ptr<NMSTL::rpc_request> Borealis::QOSOptimizer::make_request(NMSTL::rpc_id method_id, NMSTL::ISerial& is) {
00425
switch(method_id) {
00426
case NMSTL::RPCDefs<Borealis::QOSOptimizer>::do_something_METHOD_ID:
00427 {
00428 NMSTL::RPCDefs<Borealis::QOSOptimizer>::do_something_IN *in =
new NMSTL::RPCDefs<Borealis::QOSOptimizer>::do_something_IN;
00429 NMSTL::ptr<NMSTL::rpc_request> req(in);
00430
if (is >> *in)
return req;
00431 }
00432
case NMSTL::RPCDefs<Borealis::QOSOptimizer>::call_me_METHOD_ID:
00433 {
00434 NMSTL::RPCDefs<Borealis::QOSOptimizer>::call_me_IN *in =
new NMSTL::RPCDefs<Borealis::QOSOptimizer>::call_me_IN;
00435 NMSTL::ptr<NMSTL::rpc_request> req(in);
00436
if (is >> *in)
return req;
00437 }
00438
case NMSTL::RPCDefs<Borealis::QOSOptimizer>::get_stat_METHOD_ID:
00439 {
00440 NMSTL::RPCDefs<Borealis::QOSOptimizer>::get_stat_IN *in =
new NMSTL::RPCDefs<Borealis::QOSOptimizer>::get_stat_IN;
00441 NMSTL::ptr<NMSTL::rpc_request> req(in);
00442
if (is >> *in)
return req;
00443 }
00444 }
00445
return NMSTL::ptr<NMSTL::rpc_request>();
00446 }
00447
00448
00449
#endif
00450