-template<class R, class ...Args>
-int rsm_client::call(unsigned int proc, R & r, const Args & ...a1) {
- return call_m(proc, r, marshall{a1...});
+template<class R>
+int rsm_client::call_m(unsigned int proc, R & r, const marshall & req) {
+ string rep;
+ int intret = invoke(proc, rep, req.content());
+ VERIFY( intret == rsm_client_protocol::OK );
+ unmarshall u(rep, false, intret);
+ if (intret < 0) return intret;
+ string res;
+ u >> res;
+ if (!u.okdone()) {
+ LOG << "failed to unmarshall the reply.";
+ LOG << "You probably forgot to set the reply string in "
+ << "rsm::client_invoke, or you may have called RPC "
+ << "0x" << std::hex << proc << " with the wrong return type";
+ LOG << "here's what I got: \"" << hexify(rep) << "\"";
+ VERIFY(0);
+ return rpc_protocol::unmarshall_reply_failure;
+ }
+ if(!unmarshall(res, false, r).okdone()) {
+ LOG << "failed to unmarshall the reply.";
+ LOG << "You are probably calling RPC 0x" << std::hex << proc
+ << " with the wrong return type.";
+ LOG << "here's what I got: \"" << hexify(res) << "\"";
+ VERIFY(0);
+ return rpc_protocol::unmarshall_reply_failure;
+ }
+ return intret;