summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/client/IncomingMessage.cpp
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2007-08-02 18:09:48 +0000
committerGordon Sim <gsim@apache.org>2007-08-02 18:09:48 +0000
commit89aa36d093182e9e191c000504c174663932458f (patch)
tree06d7e9a3feb4abdaab74b79c94e4352dfa40adaa /cpp/src/qpid/client/IncomingMessage.cpp
parent2290d4ed915f1202bcd6cd50b1a85f27f3eb6cd2 (diff)
downloadqpid-python-89aa36d093182e9e191c000504c174663932458f.tar.gz
Some restructuring of the client code:
* Introduced three separate 'handlers' for the connection, channel and execution 'layers'. * Support for asynchronous retrieval of response or completion status. * Channel methods no longer included in execution layers command id count. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@562212 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/client/IncomingMessage.cpp')
-rw-r--r--cpp/src/qpid/client/IncomingMessage.cpp168
1 files changed, 0 insertions, 168 deletions
diff --git a/cpp/src/qpid/client/IncomingMessage.cpp b/cpp/src/qpid/client/IncomingMessage.cpp
deleted file mode 100644
index 059e644464..0000000000
--- a/cpp/src/qpid/client/IncomingMessage.cpp
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "IncomingMessage.h"
-#include "qpid/Exception.h"
-#include "ClientMessage.h"
-#include <boost/format.hpp>
-
-namespace qpid {
-namespace client {
-
-using boost::format;
-using sys::Mutex;
-
-IncomingMessage::Destination::~Destination() {}
-
-
-IncomingMessage::WaitableDestination::WaitableDestination()
- : shutdownFlag(false) {}
-
-void IncomingMessage::WaitableDestination::message(const Message& msg) {
- Mutex::ScopedLock l(monitor);
- queue.push(msg);
- monitor.notify();
-}
-
-void IncomingMessage::WaitableDestination::empty() {
- Mutex::ScopedLock l(monitor);
- queue.push(Empty());
- monitor.notify();
-}
-
-bool IncomingMessage::WaitableDestination::wait(Message& msgOut) {
- Mutex::ScopedLock l(monitor);
- while (queue.empty() && !shutdownFlag)
- monitor.wait();
- if (shutdownFlag)
- return false;
- Message* msg = boost::get<Message>(&queue.front());
- bool success = msg;
- if (success)
- msgOut=*msg;
- queue.pop();
- if (!queue.empty())
- monitor.notify(); // Wake another waiter.
- return success;
-}
-
-void IncomingMessage::WaitableDestination::shutdown() {
- Mutex::ScopedLock l(monitor);
- shutdownFlag = true;
- monitor.notifyAll();
-}
-
-void IncomingMessage::openReference(const std::string& name) {
- Mutex::ScopedLock l(lock);
- if (references.find(name) != references.end())
- throw ConnectionException(
- 503, format("Attempt to open existing reference %s.") % name);
- references[name];
- return;
-}
-
-void IncomingMessage::appendReference(
- const std::string& name, const std::string& data)
-{
- Mutex::ScopedLock l(lock);
- getRefUnlocked(name).data += data;
-}
-
-Message& IncomingMessage::createMessage(
- const std::string& destination, const std::string& reference)
-{
- Mutex::ScopedLock l(lock);
- getDestUnlocked(destination); // Verify destination.
- Reference& ref = getRefUnlocked(reference);
- ref.messages.resize(ref.messages.size() +1);
- ref.messages.back().setDestination(destination);
- return ref.messages.back();
-}
-
-void IncomingMessage::closeReference(const std::string& name) {
- Reference refCopy;
- {
- Mutex::ScopedLock l(lock);
- refCopy = getRefUnlocked(name);
- references.erase(name);
- }
- for (std::vector<Message>::iterator i = refCopy.messages.begin();
- i != refCopy.messages.end();
- ++i)
- {
- i->setData(refCopy.data);
- // TODO aconway 2007-03-23: Thread safety,
- // can a destination be removed while we're doing this?
- getDestination(i->getDestination()).message(*i);
- }
-}
-
-
-void IncomingMessage::addDestination(std::string name, Destination& dest) {
- Mutex::ScopedLock l(lock);
- DestinationMap::iterator i = destinations.find(name);
- if (i == destinations.end())
- destinations[name]=&dest;
- else if (i->second != &dest)
- throw ConnectionException(
- 503, format("Destination already exists: %s.") % name);
-}
-
-void IncomingMessage::removeDestination(std::string name) {
- Mutex::ScopedLock l(lock);
- DestinationMap::iterator i = destinations.find(name);
- if (i == destinations.end())
- throw ConnectionException(
- 503, format("No such destination: %s.") % name);
- destinations.erase(i);
-}
-
-IncomingMessage::Destination& IncomingMessage::getDestination(
- const std::string& name) {
- return getDestUnlocked(name);
-}
-
-IncomingMessage::Reference& IncomingMessage::getReference(
- const std::string& name) {
- return getRefUnlocked(name);
-}
-
-IncomingMessage::Reference& IncomingMessage::getRefUnlocked(
- const std::string& name) {
- Mutex::ScopedLock l(lock);
- ReferenceMap::iterator i = references.find(name);
- if (i == references.end())
- throw ConnectionException(
- 503, format("No such reference: %s.") % name);
- return i->second;
-}
-
-IncomingMessage::Destination& IncomingMessage::getDestUnlocked(
- const std::string& name) {
- Mutex::ScopedLock l(lock);
- DestinationMap::iterator i = destinations.find(name);
- if (i == destinations.end())
- throw ConnectionException(
- 503, format("No such destination: %s.") % name);
- return *i->second;
-}
-
-}} // namespace qpid::client