summaryrefslogtreecommitdiff
path: root/cpp/lib/client/ResponseHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/lib/client/ResponseHandler.cpp')
-rw-r--r--cpp/lib/client/ResponseHandler.cpp39
1 files changed, 29 insertions, 10 deletions
diff --git a/cpp/lib/client/ResponseHandler.cpp b/cpp/lib/client/ResponseHandler.cpp
index 68c7e52013..8950138f5e 100644
--- a/cpp/lib/client/ResponseHandler.cpp
+++ b/cpp/lib/client/ResponseHandler.cpp
@@ -18,27 +18,35 @@
* under the License.
*
*/
+#include <boost/format.hpp>
+
#include <ResponseHandler.h>
#include <sys/Monitor.h>
#include <QpidError.h>
+#include "amqp_types.h"
using namespace qpid::sys;
+using namespace qpid::framing;
+
+namespace qpid {
+namespace client {
-qpid::client::ResponseHandler::ResponseHandler() : waiting(false){}
+ResponseHandler::ResponseHandler() : waiting(false){}
-qpid::client::ResponseHandler::~ResponseHandler(){}
+ResponseHandler::~ResponseHandler(){}
-bool qpid::client::ResponseHandler::validate(const qpid::framing::AMQMethodBody& expected){
- return response != 0 && expected.match(response.get());
+bool ResponseHandler::validate(ClassId c, MethodId m) {
+ return response != 0 &&
+ response->amqpClassId() ==c && response->amqpMethodId() == m;
}
-void qpid::client::ResponseHandler::waitForResponse(){
+void ResponseHandler::waitForResponse(){
Monitor::ScopedLock l(monitor);
while (waiting)
monitor.wait();
}
-void qpid::client::ResponseHandler::signalResponse(
+void ResponseHandler::signalResponse(
qpid::framing::AMQMethodBody::shared_ptr _response)
{
Monitor::ScopedLock l(monitor);
@@ -47,15 +55,26 @@ void qpid::client::ResponseHandler::signalResponse(
monitor.notify();
}
-void qpid::client::ResponseHandler::receive(const qpid::framing::AMQMethodBody& expected){
+void ResponseHandler::receive(ClassId c, MethodId m) {
Monitor::ScopedLock l(monitor);
while (waiting)
monitor.wait();
- if(!validate(expected)){
- THROW_QPID_ERROR(PROTOCOL_ERROR, "Protocol Error");
+ if (!response) {
+ THROW_QPID_ERROR(
+ PROTOCOL_ERROR, "Channel closed unexpectedly.");
+ }
+ if(!validate(response->amqpClassId(), response->amqpMethodId())) {
+ THROW_QPID_ERROR(
+ PROTOCOL_ERROR,
+ (boost::format(
+ "Expected class:method %d:%d, got %d:%d")
+ % c % m % response->amqpClassId() % response->amqpMethodId()
+ ).str());
}
}
-void qpid::client::ResponseHandler::expect(){
+void ResponseHandler::expect(){
waiting = true;
}
+
+}} // namespace qpid::client