Author: gsim
Date: Sat Mar 23 17:59:50 2013
New Revision: 1460198

URL: http://svn.apache.org/r1460198
Log:
QPID-4586: fixes for dynamic sources/targets and on demand creation of nodes

Added:
    qpid/trunk/qpid/cpp/src/qpid/messaging/AddressImpl.h
      - copied, changed from r1460013, 
qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h
Modified:
    qpid/trunk/qpid/cpp/examples/messaging/client.cpp
    qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h
    qpid/trunk/qpid/cpp/include/qpid/messaging/Receiver.h
    qpid/trunk/qpid/cpp/include/qpid/messaging/Sender.h
    qpid/trunk/qpid/cpp/src/CMakeLists.txt
    qpid/trunk/qpid/cpp/src/Makefile.am
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Connection.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Connection.h
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ProtocolPlugin.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Sasl.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Sasl.h
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Session.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Session.h
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.cpp
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.h
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h
    qpid/trunk/qpid/cpp/src/qpid/messaging/Address.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/AddressParser.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/Receiver.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/ReceiverImpl.h
    qpid/trunk/qpid/cpp/src/qpid/messaging/Sender.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.h
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.h
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverHandle.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverHandle.h
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderHandle.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderHandle.h

Modified: qpid/trunk/qpid/cpp/examples/messaging/client.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/client.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/client.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/client.cpp Sat Mar 23 17:59:50 2013
@@ -48,8 +48,8 @@ int main(int argc, char** argv) {
         Sender sender = session.createSender("service_queue");
 
         //create temp queue & receiver...
-        Address responseQueue("#response-queue; {create:always, 
delete:always}");
-        Receiver receiver = session.createReceiver(responseQueue);
+        Receiver receiver = session.createReceiver("#");
+        Address responseQueue = receiver.getAddress();
 
        // Now send some messages ...
        string s[] = {

Modified: qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h Sat Mar 23 17:59:50 
2013
@@ -153,6 +153,7 @@ class QPID_MESSAGING_CLASS_EXTERN Addres
     QPID_MESSAGING_EXTERN bool operator !() const;
   private:
     AddressImpl* impl;
+    friend class AddressImpl;
 };
 
 #ifndef SWIG

Modified: qpid/trunk/qpid/cpp/include/qpid/messaging/Receiver.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/messaging/Receiver.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/messaging/Receiver.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/messaging/Receiver.h Sat Mar 23 17:59:50 
2013
@@ -34,6 +34,7 @@ namespace messaging {
 template <class> class PrivateImplRef;
 #endif
 
+class Address;
 class Message;
 class ReceiverImpl;
 class Session;
@@ -134,6 +135,11 @@ class QPID_MESSAGING_CLASS_EXTERN Receiv
      */
     QPID_MESSAGING_EXTERN Session getSession() const;
 
+    /**
+     * Returns an address for this receiver.
+     */
+    QPID_MESSAGING_EXTERN Address getAddress() const;
+
 #ifndef SWIG
   private:
   friend class qpid::messaging::PrivateImplRef<Receiver>;

Modified: qpid/trunk/qpid/cpp/include/qpid/messaging/Sender.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/messaging/Sender.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/messaging/Sender.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/messaging/Sender.h Sat Mar 23 17:59:50 2013
@@ -34,6 +34,7 @@ namespace messaging {
 #ifndef SWIG
 template <class> class PrivateImplRef;
 #endif
+class Address;
 class Message;
 class SenderImpl;
 class Session;
@@ -89,6 +90,11 @@ class QPID_MESSAGING_CLASS_EXTERN Sender
      * Returns a handle to the session associated with this sender.
      */
     QPID_MESSAGING_EXTERN Session getSession() const;
+
+    /**
+     * Returns an address for this sender.
+     */
+    QPID_MESSAGING_EXTERN Address getAddress() const;
 #ifndef SWIG
   private:
   friend class qpid::messaging::PrivateImplRef<Sender>;

Modified: qpid/trunk/qpid/cpp/src/CMakeLists.txt
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/CMakeLists.txt?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/CMakeLists.txt (original)
+++ qpid/trunk/qpid/cpp/src/CMakeLists.txt Sat Mar 23 17:59:50 2013
@@ -1063,6 +1063,7 @@ install_pdb (qpidclient ${QPID_COMPONENT
 
 set (qpidmessaging_SOURCES_hidden
      qpid/messaging/AddressParser.h
+     qpid/messaging/AddressImpl.h
      qpid/messaging/ConnectionImpl.h
      qpid/messaging/ReceiverImpl.h
      qpid/messaging/SessionImpl.h

Modified: qpid/trunk/qpid/cpp/src/Makefile.am
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/Makefile.am?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/Makefile.am (original)
+++ qpid/trunk/qpid/cpp/src/Makefile.am Sat Mar 23 17:59:50 2013
@@ -935,6 +935,7 @@ libqpidtypes_la_LDFLAGS = -version-info 
 libqpidmessaging_la_LIBADD = libqpidclient.la libqpidtypes.la
 libqpidmessaging_la_SOURCES =                  \
   qpid/messaging/Address.cpp                   \
+  qpid/messaging/AddressImpl.h                 \
   qpid/messaging/AddressParser.h               \
   qpid/messaging/AddressParser.cpp             \
   qpid/messaging/Connection.cpp                        \

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Connection.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Connection.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Connection.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Connection.cpp Sat Mar 23 17:59:50 
2013
@@ -37,11 +37,11 @@ namespace qpid {
 namespace broker {
 namespace amqp {
 
-Connection::Connection(qpid::sys::OutputControl& o, const std::string& i, 
qpid::broker::Broker& b, Interconnects& interconnects_, bool saslInUse)
+Connection::Connection(qpid::sys::OutputControl& o, const std::string& i, 
qpid::broker::Broker& b, Interconnects& interconnects_, bool saslInUse, const 
std::string& d)
     : ManagedConnection(b, i),
       connection(pn_connection()),
       transport(pn_transport()),
-      out(o), id(i), broker(b), haveOutput(true), interconnects(interconnects_)
+      out(o), id(i), broker(b), haveOutput(true), 
interconnects(interconnects_), domain(d)
 {
     if (pn_transport_bind(transport, connection)) {
         //error
@@ -265,4 +265,8 @@ std::string Connection::getError()
     return text.str();
 }
 
+std::string Connection::getDomain() const
+{
+    return domain;
+}
 }}} // namespace qpid::broker::amqp

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Connection.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Connection.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Connection.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Connection.h Sat Mar 23 17:59:50 
2013
@@ -45,7 +45,7 @@ class Session;
 class Connection : public sys::ConnectionCodec, public ManagedConnection
 {
   public:
-    Connection(qpid::sys::OutputControl& out, const std::string& id, 
qpid::broker::Broker& broker, Interconnects&, bool saslInUse);
+    Connection(qpid::sys::OutputControl& out, const std::string& id, 
qpid::broker::Broker& broker, Interconnects&, bool saslInUse, const 
std::string& domain);
     virtual ~Connection();
     size_t decode(const char* buffer, size_t size);
     virtual size_t encode(char* buffer, size_t size);
@@ -57,6 +57,7 @@ class Connection : public sys::Connectio
     framing::ProtocolVersion getVersion() const;
     pn_transport_t* getTransport();
     Interconnects& getInterconnects();
+    std::string getDomain() const;
   protected:
     typedef std::map<pn_session_t*, boost::shared_ptr<Session> > Sessions;
     pn_connection_t* connection;
@@ -67,6 +68,7 @@ class Connection : public sys::Connectio
     bool haveOutput;
     Sessions sessions;
     Interconnects& interconnects;
+    std::string domain;
 
     virtual void process();
     std::string getError();

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp Sat Mar 23 
17:59:50 2013
@@ -41,7 +41,7 @@ namespace amqp {
 
 Interconnect::Interconnect(qpid::sys::OutputControl& out, const std::string& 
id, qpid::broker::Broker& broker, bool saslInUse,
                            bool i, const std::string& n, const std::string& s, 
const std::string& t, Domain& d, Interconnects& r)
-    : Connection(out, id, broker, r, saslInUse), incoming(i), name(n), 
source(s), target(t), domain(d), registry(r), headerDiscarded(false),
+    : Connection(out, id, broker, r, saslInUse, std::string()), incoming(i), 
name(n), source(s), target(t), domain(d), registry(r), headerDiscarded(false),
       closeRequested(false), isTransportDeleted(false)
 {}
 

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ProtocolPlugin.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ProtocolPlugin.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ProtocolPlugin.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ProtocolPlugin.cpp Sat Mar 23 
17:59:50 2013
@@ -41,10 +41,19 @@ namespace qpid {
 namespace broker {
 namespace amqp {
 
+struct Options : public qpid::Options {
+    std::string domain;
+
+    Options() : qpid::Options("AMQP 1.0 Options") {
+        addOptions()
+            ("domain", optValue(domain, "DOMAIN"), "Domain of this broker");
+    }
+};
+
 class ProtocolImpl : public Protocol
 {
   public:
-    ProtocolImpl(Interconnects* i, Broker& b) : interconnects(i), broker(b)
+    ProtocolImpl(Interconnects* i, Broker& b, const std::string& d) : 
interconnects(i), broker(b), domain(d)
     {
         broker.getObjectFactoryRegistry().add(interconnects);//registry 
deletes on shutdown
     }
@@ -54,16 +63,20 @@ class ProtocolImpl : public Protocol
   private:
     Interconnects* interconnects;
     Broker& broker;
+    std::string domain;
 };
 
 struct ProtocolPlugin : public Plugin
 {
+    Options options;
+    Options* getOptions() { return &options; }
+
     void earlyInitialize(Plugin::Target& target)
     {
         //need to register protocol before recovery from store
         broker::Broker* broker = dynamic_cast<qpid::broker::Broker*>(&target);
         if (broker) {
-            ProtocolImpl* impl = new ProtocolImpl(new Interconnects(), 
*broker);
+            ProtocolImpl* impl = new ProtocolImpl(new Interconnects(), 
*broker, options.domain);
             broker->getProtocolRegistry().add("AMQP 1.0", impl);//registry 
deletes on shutdown
         }
     }
@@ -79,18 +92,20 @@ qpid::sys::ConnectionCodec* ProtocolImpl
         if (v.getProtocol() == qpid::framing::ProtocolVersion::SASL) {
             if (broker.getOptions().auth) {
                 QPID_LOG(info, "Using AMQP 1.0 (with SASL layer)");
-                return new qpid::broker::amqp::Sasl(out, id, broker, 
*interconnects, 
qpid::SaslFactory::getInstance().createServer(broker.getOptions().realm, 
broker.getOptions().requireEncrypted, external));
+                return new qpid::broker::amqp::Sasl(out, id, broker, 
*interconnects,
+                                                    
qpid::SaslFactory::getInstance().createServer(broker.getOptions().realm,broker.getOptions().requireEncrypted,
 external),
+                                                    domain);
             } else {
                 std::auto_ptr<SaslServer> authenticator(new 
qpid::NullSaslServer(broker.getOptions().realm));
                 QPID_LOG(info, "Using AMQP 1.0 (with dummy SASL layer)");
-                return new qpid::broker::amqp::Sasl(out, id, broker, 
*interconnects, authenticator);
+                return new qpid::broker::amqp::Sasl(out, id, broker, 
*interconnects, authenticator, domain);
             }
         } else {
             if (broker.getOptions().auth) {
                 throw qpid::Exception("SASL layer required!");
             } else {
                 QPID_LOG(info, "Using AMQP 1.0 (no SASL layer)");
-                return new qpid::broker::amqp::Connection(out, id, broker, 
*interconnects, false);
+                return new qpid::broker::amqp::Connection(out, id, broker, 
*interconnects, false, domain);
             }
         }
     }

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Sasl.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Sasl.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Sasl.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Sasl.cpp Sat Mar 23 17:59:50 2013
@@ -31,8 +31,8 @@ namespace qpid {
 namespace broker {
 namespace amqp {
 
-Sasl::Sasl(qpid::sys::OutputControl& o, const std::string& id, 
qpid::broker::Broker& broker, Interconnects& i, std::auto_ptr<qpid::SaslServer> 
auth)
-    : qpid::amqp::SaslServer(id), out(o), connection(out, id, broker, i, true),
+Sasl::Sasl(qpid::sys::OutputControl& o, const std::string& id, 
qpid::broker::Broker& broker, Interconnects& i, std::auto_ptr<qpid::SaslServer> 
auth, const std::string& domain)
+    : qpid::amqp::SaslServer(id), out(o), connection(out, id, broker, i, true, 
domain),
       authenticator(auth),
       state(INCOMPLETE), writeHeader(true), haveOutput(true)
 {

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Sasl.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Sasl.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Sasl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Sasl.h Sat Mar 23 17:59:50 2013
@@ -39,7 +39,7 @@ namespace amqp {
 class Sasl : public sys::ConnectionCodec, qpid::amqp::SaslServer
 {
   public:
-    Sasl(qpid::sys::OutputControl& out, const std::string& id, 
qpid::broker::Broker& broker, Interconnects&, std::auto_ptr<qpid::SaslServer> 
authenticator);
+    Sasl(qpid::sys::OutputControl& out, const std::string& id, 
qpid::broker::Broker& broker, Interconnects&, std::auto_ptr<qpid::SaslServer> 
authenticator, const std::string& domain);
     ~Sasl();
 
     size_t decode(const char* buffer, size_t size);

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Session.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Session.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Session.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Session.cpp Sat Mar 23 17:59:50 
2013
@@ -53,6 +53,20 @@ namespace qpid {
 namespace broker {
 namespace amqp {
 
+namespace {
+bool is_capability_requested(const std::string& name, pn_data_t* capabilities)
+{
+    while (pn_data_next(capabilities)) {
+        pn_bytes_t c = pn_data_get_symbol(capabilities);
+        std::string s(c.start, c.size);
+        if (s == name) return true;
+    }
+    return false;
+}
+
+const std::string CREATE_ON_DEMAND("create-on-demand");
+}
+
 class IncomingToQueue : public DecodingIncoming
 {
   public:
@@ -81,7 +95,7 @@ Session::ResolvedNode Session::resolve(c
     node.exchange = broker.getExchanges().find(name);
     node.queue = broker.getQueues().find(name);
     if (!node.queue && !node.exchange) {
-        if (pn_terminus_is_dynamic(terminus)) {
+        if (pn_terminus_is_dynamic(terminus)  || 
is_capability_requested(CREATE_ON_DEMAND, pn_terminus_capabilities(terminus))) {
             //is it a queue or an exchange?
             NodeProperties properties;
             properties.read(pn_terminus_properties(terminus));
@@ -117,25 +131,43 @@ Session::ResolvedNode Session::resolve(c
     return node;
 }
 
+std::string Session::generateName(pn_link_t* link)
+{
+    std::stringstream s;
+    s << qpid::types::Uuid(true) << "::" << pn_link_name(link);
+    if (!connection.getDomain().empty()) {
+        s << "@" << connection.getDomain();
+    }
+    return s.str();
+}
+
 void Session::attach(pn_link_t* link)
 {
     if (pn_link_is_sender(link)) {
         pn_terminus_t* source = pn_link_remote_source(link);
         //i.e a subscription
+        std::string name;
         if (pn_terminus_get_type(source) == PN_UNSPECIFIED) {
             throw qpid::Exception("No source specified!");/*invalid-field?*/
+        } else if (pn_terminus_is_dynamic(source)) {
+            name = generateName(link);
+        } else {
+            name = pn_terminus_get_address(source);
         }
-        std::string name = pn_terminus_get_address(source);
         QPID_LOG(debug, "Received attach request for outgoing link from " << 
name);
         pn_terminus_set_address(pn_link_source(link), name.c_str());
 
         setupOutgoing(link, source, name);
     } else {
         pn_terminus_t* target = pn_link_remote_target(link);
+        std::string name;
         if (pn_terminus_get_type(target) == PN_UNSPECIFIED) {
             throw qpid::Exception("No target specified!");/*invalid field?*/
+        } else if (pn_terminus_is_dynamic(target)) {
+            name = generateName(link);
+        } else {
+            name  = pn_terminus_get_address(target);
         }
-        std::string name = pn_terminus_get_address(target);
         QPID_LOG(debug, "Received attach request for incoming link to " << 
name);
         pn_terminus_set_address(pn_link_target(link), name.c_str());
 

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Session.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Session.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Session.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Session.h Sat Mar 23 17:59:50 2013
@@ -95,6 +95,7 @@ class Session : public ManagedSession, p
     ResolvedNode resolve(const std::string name, pn_terminus_t* terminus, bool 
incoming);
     void setupOutgoing(pn_link_t* link, pn_terminus_t* source, const 
std::string& name);
     void setupIncoming(pn_link_t* link, pn_terminus_t* target, const 
std::string& name);
+    std::string generateName(pn_link_t*);
 };
 }}} // namespace qpid::broker::amqp
 

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.cpp Sat Mar 23 
17:59:50 2013
@@ -143,6 +143,11 @@ uint32_t ReceiverImpl::getUnsettled()
     return parent->getUnsettledAcks(destination);
 }
 
+qpid::messaging::Address ReceiverImpl::getAddress() const
+{
+    return address;
+}
+
 ReceiverImpl::ReceiverImpl(SessionImpl& p, const std::string& name,
                            const qpid::messaging::Address& a) :
 

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.h Sat Mar 23 
17:59:50 2013
@@ -66,6 +66,7 @@ class ReceiverImpl : public qpid::messag
     void received(qpid::messaging::Message& message);
     qpid::messaging::Session getSession() const;
     bool isClosed() const;
+    qpid::messaging::Address getAddress() const;
 
   private:
     mutable sys::Mutex lock;

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp Sat Mar 23 
17:59:50 2013
@@ -34,6 +34,11 @@ SenderImpl::SenderImpl(SessionImpl& _par
     parent(&_parent), name(_name), address(_address), state(UNRESOLVED),
     capacity(50), window(0), flushed(false), 
unreliable(AddressResolution::is_unreliable(address)) {}
 
+qpid::messaging::Address SenderImpl::getAddress() const
+{
+    return address;
+}
+
 void SenderImpl::send(const qpid::messaging::Message& message, bool sync) 
 {
     if (unreliable) {           // immutable, don't need lock

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h Sat Mar 23 
17:59:50 2013
@@ -56,6 +56,7 @@ class SenderImpl : public qpid::messagin
     void init(qpid::client::AsyncSession, AddressResolution&);
     const std::string& getName() const;
     qpid::messaging::Session getSession() const;
+    qpid::messaging::Address getAddress() const;
 
   private:
     mutable sys::Mutex lock;

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/Address.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/Address.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/Address.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/Address.cpp Sat Mar 23 17:59:50 2013
@@ -19,6 +19,8 @@
  *
  */
 #include "qpid/messaging/Address.h"
+#include "qpid/messaging/AddressImpl.h"
+#include "qpid/messaging/AddressParser.h"
 #include "qpid/framing/Uuid.h"
 #include <sstream>
 #include <boost/format.hpp>
@@ -34,51 +36,9 @@ const std::string OPTIONS_DIVIDER = ";";
 const std::string SPACE = " ";
 const std::string TYPE = "type";
 }
-class AddressImpl
-{
-  public:
-    std::string name;
-    std::string subject;
-    Variant::Map options;
- 
-    AddressImpl() {}
-    AddressImpl(const std::string& n, const std::string& s, const 
Variant::Map& o) :
-        name(n), subject(s), options(o) {}
-};
-
-class AddressParser
-{
-  public:
-    AddressParser(const std::string&);
-    bool parse(Address& address);
-  private:
-    const std::string& input;
-    std::string::size_type current;
-    static const std::string RESERVED;
-
-    bool readChar(char c);
-    bool readQuotedString(std::string& s);
-    bool readQuotedValue(Variant& value);
-    bool readString(std::string& value, char delimiter);
-    bool readWord(std::string& word, const std::string& delims = RESERVED);
-    bool readSimpleValue(Variant& word);
-    bool readKey(std::string& key);
-    bool readValue(Variant& value);
-    bool readKeyValuePair(Variant::Map& map);
-    bool readMap(Variant& value);
-    bool readList(Variant& value);
-    bool readName(std::string& name);
-    bool readSubject(std::string& subject);
-    bool error(const std::string& message);
-    bool eos();
-    bool iswhitespace();
-    bool in(const std::string& delims);
-    bool isreserved();
-};
-
 Address::Address() : impl(new AddressImpl()) {}
 Address::Address(const std::string& address) : impl(new AddressImpl())
-{ 
+{
     AddressParser parser(address);
     parser.parse(*this);
 }
@@ -86,7 +46,7 @@ Address::Address(const std::string& name
                  const std::string& type)
     : impl(new AddressImpl(name, subject, options)) { setType(type); }
 Address::Address(const Address& a) :
-    impl(new AddressImpl(a.impl->name, a.impl->subject, a.impl->options)) {}
+    impl(new AddressImpl(a.impl->name, a.impl->subject, a.impl->options)) { 
impl->temporary = a.impl->temporary; }
 Address::~Address() { delete impl; }
 
 Address& Address::operator=(const Address& a) { *impl = *a.impl; return *this; 
}

Copied: qpid/trunk/qpid/cpp/src/qpid/messaging/AddressImpl.h (from r1460013, 
qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h)
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/AddressImpl.h?p2=qpid/trunk/qpid/cpp/src/qpid/messaging/AddressImpl.h&p1=qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h&r1=1460013&r2=1460198&rev=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/AddressImpl.h Sat Mar 23 17:59:50 
2013
@@ -1,5 +1,5 @@
-#ifndef QPID_MESSAGING_SENDERIMPL_H
-#define QPID_MESSAGING_SENDERIMPL_H
+#ifndef QPID_MESSAGING_ADDRESSIMPL_H
+#define QPID_MESSAGING_ADDRESSIMPL_H
 
 /*
  *
@@ -10,9 +10,9 @@
  * 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
@@ -21,28 +21,24 @@
  * under the License.
  *
  */
-#include "qpid/RefCounted.h"
-#include "qpid/sys/IntegerTypes.h"
-
+#include "qpid/types/Variant.h"
 namespace qpid {
 namespace messaging {
 
-class Message;
-class Session;
-
-class SenderImpl : public virtual qpid::RefCounted
+class AddressImpl
 {
   public:
-    virtual ~SenderImpl() {}
-    virtual void send(const Message& message, bool sync) = 0;
-    virtual void close() = 0;
-    virtual void setCapacity(uint32_t) = 0;
-    virtual uint32_t getCapacity() = 0;
-    virtual uint32_t getUnsettled() = 0;
-    virtual const std::string& getName() const = 0;
-    virtual Session getSession() const = 0;
-  private:
+    std::string name;
+    std::string subject;
+    qpid::types::Variant::Map options;
+    bool temporary;
+
+    AddressImpl() : temporary(false) {}
+    AddressImpl(const std::string& n, const std::string& s, const 
qpid::types::Variant::Map& o) :
+        name(n), subject(s), options(o), temporary(false) {}
+    static void setTemporary(Address& a, bool value) { a.impl->temporary = 
value; }
+    static bool isTemporary(const Address& a) { return a.impl->temporary; }
 };
 }} // namespace qpid::messaging
 
-#endif  /*!QPID_MESSAGING_SENDERIMPL_H*/
+#endif  /*!QPID_MESSAGING_ADDRESSIMPL_H*/

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/AddressParser.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/AddressParser.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/AddressParser.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/AddressParser.cpp Sat Mar 23 
17:59:50 2013
@@ -19,6 +19,7 @@
  *
  */
 #include "AddressParser.h"
+#include "AddressImpl.h"
 #include "qpid/framing/Uuid.h"
 #include <boost/format.hpp>
 
@@ -38,7 +39,10 @@ bool AddressParser::parse(Address& addre
 {
     std::string name;
     if (readName(name)) {
-        if (name.find('#') == 0) name = qpid::framing::Uuid(true).str() + name;
+        if (name.find('#') == 0) {
+            name = qpid::framing::Uuid(true).str() + name;
+            AddressImpl::setTemporary(address, true);
+        }
         address.setName(name);
         if (readChar('/')) {
             std::string subject;

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/Receiver.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/Receiver.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/Receiver.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/Receiver.cpp Sat Mar 23 17:59:50 2013
@@ -19,6 +19,7 @@
  *
  */
 #include "qpid/messaging/Receiver.h"
+#include "qpid/messaging/Address.h"
 #include "qpid/messaging/Message.h"
 #include "qpid/messaging/ReceiverImpl.h"
 #include "qpid/messaging/Session.h"
@@ -45,4 +46,5 @@ void Receiver::close() { impl->close(); 
 const std::string& Receiver::getName() const { return impl->getName(); }
 Session Receiver::getSession() const { return impl->getSession(); }
 bool Receiver::isClosed() const { return impl->isClosed(); }
+Address Receiver::getAddress() const { return impl->getAddress(); }
 }} // namespace qpid::messaging

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/ReceiverImpl.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/ReceiverImpl.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/ReceiverImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/ReceiverImpl.h Sat Mar 23 17:59:50 
2013
@@ -27,6 +27,7 @@
 namespace qpid {
 namespace messaging {
 
+class Address;
 class Duration;
 class Message;
 class MessageListener;
@@ -48,6 +49,7 @@ class ReceiverImpl : public virtual qpid
     virtual const std::string& getName() const = 0;
     virtual Session getSession() const = 0;
     virtual bool isClosed() const = 0;
+    virtual Address getAddress() const = 0;
 };
 }} // namespace qpid::messaging
 

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/Sender.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/Sender.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/Sender.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/Sender.cpp Sat Mar 23 17:59:50 2013
@@ -19,6 +19,7 @@
  *
  */
 #include "qpid/messaging/Sender.h"
+#include "qpid/messaging/Address.h"
 #include "qpid/messaging/Message.h"
 #include "qpid/messaging/SenderImpl.h"
 #include "qpid/messaging/Session.h"
@@ -40,5 +41,5 @@ uint32_t Sender::getUnsettled() { return
 uint32_t Sender::getAvailable() { return getCapacity() - getUnsettled(); }
 const std::string& Sender::getName() const { return impl->getName(); }
 Session Sender::getSession() const { return impl->getSession(); }
-
+Address Sender::getAddress() const { return impl->getAddress(); }
 }} // namespace qpid::messaging

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h Sat Mar 23 17:59:50 2013
@@ -27,6 +27,7 @@
 namespace qpid {
 namespace messaging {
 
+class Address;
 class Message;
 class Session;
 
@@ -41,6 +42,7 @@ class SenderImpl : public virtual qpid::
     virtual uint32_t getUnsettled() = 0;
     virtual const std::string& getName() const = 0;
     virtual Session getSession() const = 0;
+    virtual Address getAddress() const = 0;
   private:
 };
 }} // namespace qpid::messaging

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp Sat Mar 23 
17:59:50 2013
@@ -20,6 +20,7 @@
  */
 #include "qpid/messaging/amqp/AddressHelper.h"
 #include "qpid/messaging/Address.h"
+#include "qpid/log/Statement.h"
 #include <vector>
 #include <boost/assign.hpp>
 extern "C" {
@@ -56,7 +57,9 @@ const std::string MOVE("move");
 const std::string COPY("copy");
 
 const std::string SUPPORTED_DIST_MODES("supported-dist-modes");
+const std::string CREATE_ON_DEMAND("create-on-demand");
 
+const std::string DUMMY(".");
 
 const std::vector<std::string> RECEIVER_MODES = 
boost::assign::list_of<std::string>(ALWAYS) (RECEIVER);
 const std::vector<std::string> SENDER_MODES = 
boost::assign::list_of<std::string>(ALWAYS) (SENDER);
@@ -155,26 +158,33 @@ const qpid::types::Variant::Map& Address
     return link;
 }
 
-void AddressHelper::setNodeProperties(pn_terminus_t* terminus)
+void AddressHelper::setNodeProperties(pn_terminus_t* terminus, bool dynamic)
 {
-    pn_terminus_set_dynamic(terminus, true);
+    if (dynamic) {
+        pn_terminus_set_address(terminus, DUMMY.c_str());//Workaround for 
proton bug
+        pn_terminus_set_dynamic(terminus, true);
+    } else {
+        pn_data_t* capabilities = pn_terminus_capabilities(terminus);
+        if (!capabilities) {
+            QPID_LOG(error, "!!!No capabilities!!!");
+        }
+        pn_data_put_symbol(capabilities, convert(CREATE_ON_DEMAND));
+    }
 
     //properties for dynamically created node:
-    pn_data_t* data = pn_terminus_properties(terminus);
     if (node.size()) {
+        pn_data_t* data = pn_terminus_properties(terminus);
         pn_data_put_map(data);
         pn_data_enter(data);
-    }
-    for (qpid::types::Variant::Map::const_iterator i = node.begin(); i != 
node.end(); ++i) {
-        if (i->first == TYPE) {
-            pn_data_put_symbol(data, convert(SUPPORTED_DIST_MODES));
-            pn_data_put_string(data, convert(i->second == TOPIC ? COPY : 
MOVE));
-        } else {
-            pn_data_put_symbol(data, convert(i->first));
-            pn_data_put_string(data, convert(i->second.asString()));
+        for (qpid::types::Variant::Map::const_iterator i = node.begin(); i != 
node.end(); ++i) {
+            if (i->first == TYPE) {
+                pn_data_put_symbol(data, convert(SUPPORTED_DIST_MODES));
+                pn_data_put_string(data, convert(i->second == TOPIC ? COPY : 
MOVE));
+            } else {
+                pn_data_put_symbol(data, convert(i->first));
+                pn_data_put_string(data, convert(i->second.asString()));
+            }
         }
-    }
-    if (node.size()) {
         pn_data_exit(data);
     }
 }

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.h Sat Mar 23 
17:59:50 2013
@@ -40,7 +40,7 @@ class AddressHelper
     bool deleteEnabled(CheckMode mode) const;
     bool assertEnabled(CheckMode mode) const;
 
-    void setNodeProperties(pn_terminus_t*);
+    void setNodeProperties(pn_terminus_t*, bool dynamic);
     const qpid::types::Variant::Map& getNodeProperties() const;
     const qpid::types::Variant::Map& getLinkProperties() const;
   private:
@@ -49,6 +49,7 @@ class AddressHelper
     std::string deletePolicy;
     qpid::types::Variant::Map node;
     qpid::types::Variant::Map link;
+    std::string name;
 
     bool enabled(const std::string& policy, CheckMode mode) const;
 };

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp Sat Mar 
23 17:59:50 2013
@@ -26,6 +26,7 @@
 #include "SessionContext.h"
 #include "Transport.h"
 #include "qpid/messaging/exceptions.h"
+#include "qpid/messaging/AddressImpl.h"
 #include "qpid/messaging/Duration.h"
 #include "qpid/messaging/Message.h"
 #include "qpid/messaging/MessageImpl.h"
@@ -285,34 +286,45 @@ void ConnectionContext::attach(boost::sh
 {
     lnk->configure();
     attach(ssn->session, (pn_link_t*) lnk->sender);
-    if (!pn_link_remote_target((pn_link_t*) lnk->sender)) {
+    pn_terminus_t* t = pn_link_remote_target(lnk->sender);
+    if (!pn_terminus_get_address(t)) {
         std::string msg("No such target : ");
         msg += lnk->getTarget();
+        QPID_LOG(debug, msg);
         throw qpid::messaging::NotFound(msg);
+    } else if (AddressImpl::isTemporary(lnk->address)) {
+        lnk->address.setName(pn_terminus_get_address(t));
+        QPID_LOG(debug, "Dynamic target name set to " << 
lnk->address.getName());
     }
+    QPID_LOG(debug, "Attach succeeded to " << lnk->getTarget());
 }
 
 void ConnectionContext::attach(boost::shared_ptr<SessionContext> ssn, 
boost::shared_ptr<ReceiverContext> lnk)
 {
     lnk->configure();
     attach(ssn->session, lnk->receiver, lnk->capacity);
-    if (!pn_link_remote_source(lnk->receiver)) {
+    pn_terminus_t* s = pn_link_remote_source(lnk->receiver);
+    if (!pn_terminus_get_address(s)) {
         std::string msg("No such source : ");
         msg += lnk->getSource();
+        QPID_LOG(debug, msg);
         throw qpid::messaging::NotFound(msg);
+    } else if (AddressImpl::isTemporary(lnk->address)) {
+        lnk->address.setName(pn_terminus_get_address(s));
+        QPID_LOG(debug, "Dynamic source name set to " << 
lnk->address.getName());
     }
+    QPID_LOG(debug, "Attach succeeded from " << lnk->getSource());
 }
 
 void ConnectionContext::attach(pn_session_t* /*session*/, pn_link_t* link, int 
credit)
 {
     qpid::sys::ScopedLock<qpid::sys::Monitor> l(lock);
-    QPID_LOG(debug, "Attaching link " << link << ", state=" << 
pn_link_state(link));
     pn_link_open(link);
-    QPID_LOG(debug, "Link attached " << link << ", state=" << 
pn_link_state(link));
+    QPID_LOG(debug, "Link attach sent for " << link << ", state=" << 
pn_link_state(link));
     if (credit) pn_link_flow(link, credit);
     wakeupDriver();
     while (pn_link_state(link) & PN_REMOTE_UNINIT) {
-        QPID_LOG(debug, "waiting for confirmation of link attach for " << link 
<< ", state=" << pn_link_state(link));
+        QPID_LOG(debug, "Waiting for confirmation of link attach for " << link 
<< ", state=" << pn_link_state(link) << "...");
         wait();
     }
 }

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp Sat Mar 23 
17:59:50 2013
@@ -20,9 +20,11 @@
  */
 #include "qpid/messaging/amqp/ReceiverContext.h"
 #include "qpid/messaging/amqp/AddressHelper.h"
+#include "qpid/messaging/AddressImpl.h"
 #include "qpid/messaging/Duration.h"
 #include "qpid/messaging/Message.h"
 #include "qpid/amqp/descriptors.h"
+#include "qpid/log/Statement.h"
 extern "C" {
 #include <proton/engine.h>
 }
@@ -38,7 +40,7 @@ ReceiverContext::ReceiverContext(pn_sess
     capacity(0) {}
 ReceiverContext::~ReceiverContext()
 {
-    pn_link_free(receiver);
+    //pn_link_free(receiver);
 }
 
 void ReceiverContext::setCapacity(uint32_t c)
@@ -76,7 +78,7 @@ uint32_t ReceiverContext::getUnsettled()
 
 void ReceiverContext::close()
 {
-
+    pn_link_close(receiver);
 }
 
 const std::string& ReceiverContext::getName() const
@@ -113,11 +115,18 @@ void ReceiverContext::configure() const
 }
 void ReceiverContext::configure(pn_terminus_t* source) const
 {
-    pn_terminus_set_address(source, address.getName().c_str());
     //dynamic create:
     AddressHelper helper(address);
-    if (helper.createEnabled(AddressHelper::FOR_RECEIVER)) {
-        helper.setNodeProperties(source);
+    if (AddressImpl::isTemporary(address)) {
+        //application expects a name to be generated
+        QPID_LOG(debug, "source is dynamic");
+        helper.setNodeProperties(source, true);
+    } else {
+        pn_terminus_set_address(source, address.getName().c_str());
+        if (helper.createEnabled(AddressHelper::FOR_RECEIVER)) {
+            //application expects name of node to be as specified
+            helper.setNodeProperties(source, false);
+        }
     }
 
     // Look specifically for qpid.selector link property and add a filter for 
it
@@ -149,6 +158,11 @@ void ReceiverContext::configure(pn_termi
     }
 }
 
+Address ReceiverContext::getAddress() const
+{
+    return address;
+}
+
 bool ReceiverContext::isClosed() const
 {
     return false;//TODO

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.h Sat Mar 23 
17:59:50 2013
@@ -55,10 +55,11 @@ class ReceiverContext
     const std::string& getSource() const;
     bool isClosed() const;
     void configure() const;
+    Address getAddress() const;
   private:
     friend class ConnectionContext;
     const std::string name;
-    const Address address;
+    Address address;
     pn_link_t* receiver;
     uint32_t capacity;
     void configure(pn_terminus_t*) const;

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverHandle.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverHandle.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverHandle.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverHandle.cpp Sat Mar 23 
17:59:50 2013
@@ -103,4 +103,9 @@ bool ReceiverHandle::isClosed() const
     return receiver->isClosed();
 }
 
+Address ReceiverHandle::getAddress() const
+{
+    return receiver->getAddress();
+}
+
 }}} // namespace qpid::messaging::amqp

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverHandle.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverHandle.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverHandle.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ReceiverHandle.h Sat Mar 23 
17:59:50 2013
@@ -53,6 +53,7 @@ class ReceiverHandle : public qpid::mess
     const std::string& getName() const;
     qpid::messaging::Session getSession() const;
     bool isClosed() const;
+    Address getAddress() const;
   private:
     boost::shared_ptr<ConnectionContext> connection;
     boost::shared_ptr<SessionContext> session;

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp Sat Mar 23 
17:59:50 2013
@@ -21,6 +21,7 @@
 #include "qpid/messaging/amqp/SenderContext.h"
 #include "qpid/messaging/amqp/EncodedMessage.h"
 #include "qpid/messaging/amqp/AddressHelper.h"
+#include "qpid/messaging/AddressImpl.h"
 #include "qpid/amqp/descriptors.h"
 #include "qpid/amqp/MessageEncoder.h"
 #include "qpid/messaging/exceptions.h"
@@ -44,12 +45,12 @@ SenderContext::SenderContext(pn_session_
 
 SenderContext::~SenderContext()
 {
-    pn_link_free(sender);
+    //pn_link_free(sender);
 }
 
 void SenderContext::close()
 {
-
+    pn_link_close(sender);
 }
 
 void SenderContext::setCapacity(uint32_t c)
@@ -347,11 +348,16 @@ void SenderContext::configure() const
 }
 void SenderContext::configure(pn_terminus_t* target) const
 {
-    pn_terminus_set_address(target, address.getName().c_str());
-    //dynamic create:
     AddressHelper helper(address);
-    if (helper.createEnabled(AddressHelper::FOR_SENDER)) {
-        helper.setNodeProperties(target);
+    if (AddressImpl::isTemporary(address)) {
+        //application expects a name to be generated
+        helper.setNodeProperties(target, true);
+    } else {
+        pn_terminus_set_address(target, address.getName().c_str());
+        if (helper.createEnabled(AddressHelper::FOR_SENDER)) {
+            //application expects name of node to be as specified
+            helper.setNodeProperties(target, false);
+        }
     }
 }
 
@@ -360,4 +366,9 @@ bool SenderContext::settled()
     return processUnsettled() == 0;
 }
 
+Address SenderContext::getAddress() const
+{
+    return address;
+}
+
 }}} // namespace qpid::messaging::amqp

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h Sat Mar 23 
17:59:50 2013
@@ -71,12 +71,13 @@ class SenderContext
     Delivery* send(const qpid::messaging::Message& message);
     void configure() const;
     bool settled();
+    Address getAddress() const;
   private:
     friend class ConnectionContext;
     typedef std::deque<Delivery> Deliveries;
 
     const std::string name;
-    const qpid::messaging::Address address;
+    qpid::messaging::Address address;
     pn_link_t* sender;
     int32_t nextId;
     Deliveries deliveries;

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderHandle.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderHandle.cpp?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderHandle.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderHandle.cpp Sat Mar 23 
17:59:50 2013
@@ -72,4 +72,9 @@ qpid::messaging::Session SenderHandle::g
     return qpid::messaging::Session(new SessionHandle(connection, session));
 }
 
+Address SenderHandle::getAddress() const
+{
+    return sender->getAddress();
+}
+
 }}} // namespace qpid::messaging::amqp

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderHandle.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderHandle.h?rev=1460198&r1=1460197&r2=1460198&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderHandle.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderHandle.h Sat Mar 23 
17:59:50 2013
@@ -48,6 +48,7 @@ class SenderHandle : public qpid::messag
     uint32_t getUnsettled();
     const std::string& getName() const;
     Session getSession() const;
+    Address getAddress() const;
   private:
     boost::shared_ptr<ConnectionContext> connection;
     boost::shared_ptr<SessionContext> session;



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to