2 #include <Atlas/Objects/Operation.h>
6 using namespace Atlas::Objects::Operation;
11 std::string getErrorMessage(
const RootOperation & err)
14 const std::vector<Atlas::Objects::Root>& args = err->getArgs();
16 error() <<
"got Error error op from server without args";
17 msg =
"Unknown error.";
19 const Atlas::Objects::Root & arg = args.front();
20 Atlas::Message::Element message;
21 if (arg->copyAttr(
"message", message) != 0) {
22 error() <<
"got Error error op from server without message";
23 msg =
"Unknown error.";
25 if (!message.isString()) {
26 error() <<
"got Error error op from server with bad message";
27 msg =
"Unknown error.";
29 msg = message.String();
36 ResponseBase::~ResponseBase() =
default;
38 ResponseTracker::~ResponseTracker() =
default;
40 void ResponseTracker::await(std::int64_t serial, Callback callback)
42 m_pending.emplace(serial, std::move(callback));
46 void ResponseTracker::await(std::int64_t serialno, std::unique_ptr<ResponseBase> resp)
48 assert(m_pending.count(serialno) == 0);
49 std::shared_ptr<ResponseBase> holder = std::move(resp);
50 await(serialno, [holder](
const Atlas::Objects::Operation::RootOperation& op)->Router::RouterResult{
51 auto result = holder->responseReceived(op);
52 return result ? Router::HANDLED : Router::IGNORED;
56 Router::RouterResult ResponseTracker::handleOp(
const RootOperation& op)
58 if (op->isDefaultRefno())
return Router::IGNORED;
60 auto it = m_pending.find(op->getRefno());
61 if (it == m_pending.end()) {
62 warning() <<
"received op with valid refno (" << op->getRefno() <<
63 ") but no response is registered";
64 return Router::IGNORED;
68 auto resp = it->second;
71 auto result = resp(op);
76 Router::RouterResult NullResponse::responseReceived(
const Atlas::Objects::Operation::RootOperation&)
79 return Router::RouterResult::IGNORED;
82 void* clearMemberResponse(
void* d)
84 debug() <<
"clearing out member response object";
86 void** objectPointer = (
void**) d;
87 *objectPointer =
nullptr;