From de6b60734e7046c4d4d60db8af0375f576ed67e1 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Wed, 22 Oct 2014 21:43:03 -0400 Subject: [PATCH] Decouple the json timeout from the actual error code. Fixes #50 --- server/jsonrpc/jsonhandler.cpp | 13 +++++++++---- server/jsonrpc/jsonhandler.h | 3 +++ server/jsonrpc/jsonrpcserver.cpp | 9 +++++++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/server/jsonrpc/jsonhandler.cpp b/server/jsonrpc/jsonhandler.cpp index 430684dd..ed64fbb4 100644 --- a/server/jsonrpc/jsonhandler.cpp +++ b/server/jsonrpc/jsonhandler.cpp @@ -137,7 +137,8 @@ JsonReply::JsonReply(Type type, JsonHandler *handler, const QString &method, con m_type(type), m_data(data), m_handler(handler), - m_method(method) + m_method(method), + m_timedOut(false) { connect(&m_timeout, &QTimer::timeout, this, &JsonReply::timeout); } @@ -204,7 +205,11 @@ void JsonReply::startWait() void JsonReply::timeout() { - m_data.insert("success", false); - m_data.insert("errorMessage", "Command timed out."); - finished(); + m_timedOut = true; + emit finished(); +} + +bool JsonReply::timedOut() const +{ + return m_timedOut; } diff --git a/server/jsonrpc/jsonhandler.h b/server/jsonrpc/jsonhandler.h index 90a32ba4..935f3fb0 100644 --- a/server/jsonrpc/jsonhandler.h +++ b/server/jsonrpc/jsonhandler.h @@ -53,6 +53,8 @@ public: int commandId() const; void setCommandId(int commandId); + bool timedOut() const; + public slots: void startWait(); @@ -71,6 +73,7 @@ private: QString m_method; QUuid m_clientId; int m_commandId; + bool m_timedOut; QTimer m_timeout; diff --git a/server/jsonrpc/jsonrpcserver.cpp b/server/jsonrpc/jsonrpcserver.cpp index 98f4a392..5d5467e7 100644 --- a/server/jsonrpc/jsonrpcserver.cpp +++ b/server/jsonrpc/jsonrpcserver.cpp @@ -235,8 +235,13 @@ void JsonRPCServer::sendNotification(const QVariantMap ¶ms) void JsonRPCServer::asyncReplyFinished() { JsonReply *reply = qobject_cast(sender()); - Q_ASSERT(reply->handler()->validateReturns(reply->method(), reply->data()).first); - sendResponse(reply->clientId(), reply->commandId(), reply->data()); + if (!reply->timedOut()) { + Q_ASSERT_X(reply->handler()->validateReturns(reply->method(), reply->data()).first + ,"validating return value", formatAssertion(reply->handler()->name(), reply->method(), reply->handler(), reply->data()).toLatin1().data()); + sendResponse(reply->clientId(), reply->commandId(), reply->data()); + } else { + sendErrorResponse(reply->clientId(), reply->commandId(), "Command timed out"); + } reply->deleteLater(); }