You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2015/06/03 19:26:13 UTC
[50/50] [abbrv] qpid-proton git commit: PROTON-865: Example and cmake
cleanup, minor code cleanup.
PROTON-865: Example and cmake cleanup, minor code cleanup.
- Optionally enable C++ in top level cmake for examplesb. Still works without a C++ compiler.
- Move cpp examples to the /examples dir, renamed for consistent exe naming conventions.
- Integrate example build & auto-test with cmake
- Improved exception handling
- Simplified exception handling.
- Removed nascent logging code, logging should be handled centrally in C library.
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/8074793b
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/8074793b
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/8074793b
Branch: refs/heads/cjansen-cpp-client
Commit: 8074793b84a6402b01f3639e8cf8fed6b5ba54cc
Parents: d56c5d7
Author: Alan Conway <ac...@redhat.com>
Authored: Mon Jun 1 18:03:36 2015 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Wed Jun 3 11:43:31 2015 -0400
----------------------------------------------------------------------
CMakeLists.txt | 8 +-
examples/CMakeLists.txt | 3 +
examples/cpp/CMakeLists.txt | 32 +++
examples/cpp/README.md | 43 +++
examples/cpp/broker.cpp | 201 +++++++++++++
examples/cpp/example_test.py | 105 +++++++
examples/cpp/helloworld.cpp | 69 +++++
examples/cpp/helloworld_blocking.cpp | 70 +++++
examples/cpp/helloworld_direct.cpp | 76 +++++
examples/cpp/simple_recv.cpp | 115 ++++++++
examples/cpp/simple_send.cpp | 122 ++++++++
examples/go/CMakeLists.txt | 29 ++
examples/go/example_test.go | 284 +++++++++++++++++++
proton-c/CMakeLists.txt | 3 -
proton-c/bindings/CMakeLists.txt | 8 +-
proton-c/bindings/cpp/CMakeLists.txt | 26 --
proton-c/bindings/cpp/README.md | 24 ++
proton-c/bindings/cpp/examples/Broker.cpp | 193 -------------
proton-c/bindings/cpp/examples/HelloWorld.cpp | 62 ----
.../cpp/examples/HelloWorldBlocking.cpp | 65 -----
.../bindings/cpp/examples/HelloWorldDirect.cpp | 70 -----
proton-c/bindings/cpp/examples/SimpleRecv.cpp | 109 -------
proton-c/bindings/cpp/examples/SimpleSend.cpp | 117 --------
.../bindings/cpp/include/proton/cpp/Delivery.h | 2 -
.../bindings/cpp/include/proton/cpp/Handle.h | 1 +
.../cpp/include/proton/cpp/exceptions.h | 17 +-
proton-c/bindings/cpp/src/Connector.cpp | 7 +-
proton-c/bindings/cpp/src/Container.cpp | 1 -
proton-c/bindings/cpp/src/ContainerImpl.cpp | 2 +-
proton-c/bindings/cpp/src/Delivery.cpp | 1 +
proton-c/bindings/cpp/src/LogInternal.h | 51 ----
proton-c/bindings/cpp/src/Logger.cpp | 56 ----
proton-c/bindings/cpp/src/exceptions.cpp | 33 ---
33 files changed, 1190 insertions(+), 815 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2df2dfb..261fdc0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -20,16 +20,15 @@ cmake_minimum_required (VERSION 2.6)
project (Proton C)
+# Enable C++ now for examples and bindings subdirectories, but make it optional.
+enable_language(CXX OPTIONAL)
+
if (MSVC)
# No C99 capability, use C++
set(DEFAULT_BUILD_WITH_CXX ON)
endif (MSVC)
option(BUILD_WITH_CXX "Compile Proton using C++" ${DEFAULT_BUILD_WITH_CXX})
-if (BUILD_WITH_CXX)
- project (Proton C CXX)
-endif (BUILD_WITH_CXX)
-
if (CMAKE_CONFIGURATION_TYPES)
# There is no single "build type"...
message(STATUS "Build types are ${CMAKE_CONFIGURATION_TYPES}")
@@ -141,6 +140,7 @@ if (BUILD_JAVA)
endif()
add_subdirectory(proton-c)
+add_subdirectory(examples)
install (FILES LICENSE README.md TODO
DESTINATION ${PROTON_SHARE})
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/examples/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index feac758..5724e59 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -21,3 +21,6 @@ set (Proton_DIR ${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
add_subdirectory(c/messenger)
+if (BUILD_CPP)
+ add_subdirectory(cpp)
+endif()
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/examples/cpp/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/examples/cpp/CMakeLists.txt b/examples/cpp/CMakeLists.txt
new file mode 100644
index 0000000..2ce548b
--- /dev/null
+++ b/examples/cpp/CMakeLists.txt
@@ -0,0 +1,32 @@
+#
+# 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_directories ("${CMAKE_SOURCE_DIR}/proton-c/bindings/cpp/include")
+
+foreach(example broker helloworld helloworld_blocking helloworld_direct simple_recv simple_send)
+ add_executable(${example} ${example}.cpp)
+ target_link_libraries(${example} qpid-proton-cpp)
+endforeach()
+
+add_test(
+ NAME cpp_example_test
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/example_test.py -v
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+
+
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/examples/cpp/README.md
----------------------------------------------------------------------
diff --git a/examples/cpp/README.md b/examples/cpp/README.md
new file mode 100644
index 0000000..2aaf2ef
--- /dev/null
+++ b/examples/cpp/README.md
@@ -0,0 +1,43 @@
+# C++ examples
+
+## broker.cpp
+
+A very simple "mini broker". You can use this to run other examples that reqiure
+an intermediary, or you can use a real AMQP 1.0 broker. It creates queues
+automatically when a client tries to send to or subscribe from a node.
+
+## helloworld.cpp
+
+Basic example that connects to an intermediary on localhost:5672,
+establishes a subscription from the 'examples' node on that
+intermediary, then creates a sending link to the same node and sends
+one message. On receving the message back via the subcription, the
+connection is closed.
+
+## helloworld_blocking.cpp
+
+The same as the basic helloworld.cpp, but using a
+synchronous/sequential style wrapper on top of the
+asynchronous/reactive API. The purpose of this example is just to show
+how different functionality can be easily layered should it be
+desired.
+
+## helloworld_direct.cpp
+
+A variant of the basic helloworld example, that does not use an
+intermediary, but listens for incoming connections itself. It
+establishes a connection to itself with a link over which a single
+message is sent. This demonstrates the ease with which a simple daemon
+can be built using the API.
+
+## simple_send.cpp
+
+An example of sending a fixed number of messages and tracking their
+(asynchronous) acknowledgement. Messages are sent through the 'examples' node on
+an intermediary accessible on port 5672 on localhost.
+
+# simple_recv.cpp
+
+Subscribes to the 'examples' node on an intermediary accessible on port 5672 on
+localhost. Simply prints out the body of received messages.
+
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/examples/cpp/broker.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/broker.cpp b/examples/cpp/broker.cpp
new file mode 100644
index 0000000..01160a7
--- /dev/null
+++ b/examples/cpp/broker.cpp
@@ -0,0 +1,201 @@
+/*
+ *
+ * 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 "proton/cpp/Container.h"
+#include "proton/cpp/MessagingHandler.h"
+
+#include <iostream>
+#include <deque>
+#include <map>
+#include <list>
+#include <stdlib.h>
+#include <string.h>
+
+using namespace proton::reactor;
+
+std::string generateUuid(){
+ throw "TODO: platform neutral uuid";
+}
+
+class Queue {
+ public:
+ bool dynamic;
+ typedef std::deque<Message> MsgQ;
+ typedef std::list<Sender> List;
+ MsgQ queue;
+ List consumers;
+
+ Queue(bool dyn = false) : dynamic(dyn), queue(MsgQ()), consumers(List()) {}
+
+ void subscribe(Sender &c) {
+ consumers.push_back(c);
+ }
+
+ bool unsubscribe(Sender &c) {
+ consumers.remove(c);
+ return (consumers.size() == 0 && (dynamic || queue.size() == 0));
+ }
+
+ void publish(Message &m) {
+ queue.push_back(m);
+ dispatch(0);
+ }
+
+ void dispatch(Sender *s) {
+ while (deliverTo(s)) {
+ }
+ }
+
+ bool deliverTo(Sender *consumer) {
+ // deliver to single consumer if supplied, else all consumers
+ int count = consumer ? 1 : consumers.size();
+ if (!count) return false;
+ bool result = false;
+ List::iterator it = consumers.begin();
+ if (!consumer && count) consumer = &*it;
+
+ while (queue.size()) {
+ if (consumer->getCredit()) {
+ consumer->send(queue.front());
+ queue.pop_front();
+ result = true;
+ }
+ if (--count)
+ it++;
+ else
+ return result;
+ }
+ return false;
+ }
+};
+
+class Broker : public MessagingHandler {
+ private:
+ std::string url;
+ typedef std::map<std::string, Queue *> QMap;
+ QMap queues;
+ public:
+
+ Broker(const std::string &s) : url(s), queues(QMap()) {}
+
+ void onStart(Event &e) {
+ e.getContainer().listen(url);
+ std::cout << "broker listening on " << url << std::endl;
+ }
+
+ Queue &queue(std::string &address) {
+ QMap::iterator it = queues.find(address);
+ if (it == queues.end()) {
+ queues[address] = new Queue();
+ return *queues[address];
+ }
+ else {
+ return *it->second;
+ }
+ }
+
+ void onLinkOpening(Event &e) {
+ Link lnk = e.getLink();
+ if (lnk.isSender()) {
+ Sender sender(lnk);
+ Terminus remoteSource(lnk.getRemoteSource());
+ if (remoteSource.isDynamic()) {
+ std::string address = generateUuid();
+ lnk.getSource().setAddress(address);
+ Queue *q = new Queue(true);
+ queues[address] = q;
+ q->subscribe(sender);
+ }
+ else {
+ std::string address = remoteSource.getAddress();
+ if (!address.empty()) {
+ lnk.getSource().setAddress(address);
+ queue(address).subscribe(sender);
+ }
+ }
+ }
+ else {
+ std::string address = lnk.getRemoteTarget().getAddress();
+ if (!address.empty())
+ lnk.getTarget().setAddress(address);
+ }
+ }
+
+ void unsubscribe (Sender &lnk) {
+ std::string address = lnk.getSource().getAddress();
+ QMap::iterator it = queues.find(address);
+ if (it != queues.end() && it->second->unsubscribe(lnk)) {
+ delete it->second;
+ queues.erase(it);
+ }
+ }
+
+ void onLinkClosing(Event &e) {
+ Link lnk = e.getLink();
+ if (lnk.isSender()) {
+ Sender s(lnk);
+ unsubscribe(s);
+ }
+ }
+
+ void onConnectionClosing(Event &e) {
+ removeStaleConsumers(e.getConnection());
+ }
+
+ void onDisconnected(Event &e) {
+ removeStaleConsumers(e.getConnection());
+ }
+
+ void removeStaleConsumers(Connection &connection) {
+ Link l = connection.getLinkHead(Endpoint::REMOTE_ACTIVE);
+ while (l) {
+ if (l.isSender()) {
+ Sender s(l);
+ unsubscribe(s);
+ }
+ l = l.getNext(Endpoint::REMOTE_ACTIVE);
+ }
+ }
+
+ void onSendable(Event &e) {
+ Link lnk = e.getLink();
+ Sender sender(lnk);
+ std::string addr = lnk.getSource().getAddress();
+ queue(addr).dispatch(&sender);
+ }
+
+ void onMessage(Event &e) {
+ std::string addr = e.getLink().getTarget().getAddress();
+ Message msg = e.getMessage();
+ queue(addr).publish(msg);
+ }
+};
+
+int main(int argc, char **argv) {
+ std::string url = argc > 1 ? argv[1] : ":5672";
+ Broker broker(url);
+ try {
+ Container(broker).run();
+ } catch (const std::exception& e) {
+ std::cerr << e.what() << std::endl;
+ return 1;
+ }
+}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/examples/cpp/example_test.py
----------------------------------------------------------------------
diff --git a/examples/cpp/example_test.py b/examples/cpp/example_test.py
new file mode 100644
index 0000000..9a8ac67
--- /dev/null
+++ b/examples/cpp/example_test.py
@@ -0,0 +1,105 @@
+#
+# 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
+#
+
+import unittest
+import os, sys, socket, time
+from random import randrange
+from subprocess import Popen, check_output, PIPE
+
+NULL = open(os.devnull, 'w')
+
+class Broker(object):
+ """Run the test broker"""
+
+ @classmethod
+ def get(cls):
+ if not hasattr(cls, "_broker"):
+ cls._broker = Broker()
+ return cls._broker
+
+ @classmethod
+ def stop(cls):
+ if cls._broker and cls._broker.process:
+ cls._broker.process.kill()
+ cls._broker = None
+
+ def __init__(self):
+ self.port = randrange(10000, 20000)
+ self.addr = ":%s" % self.port
+ self.process = Popen(["./broker", self.addr], stdout=NULL, stderr=NULL)
+ # Wait 10 secs for broker to listen
+ deadline = time.time() + 10
+ c = None
+ while time.time() < deadline:
+ try:
+ c = socket.create_connection(("127.0.0.1", self.port), deadline - time.time())
+ break
+ except socket.error as e:
+ time.sleep(0.01)
+ if c is None:
+ raise Exception("Timed out waiting for broker")
+ c.close()
+
+
+class ExampleTest(unittest.TestCase):
+ """Test examples"""
+
+ @classmethod
+ def tearDownClass(self):
+ Broker.stop()
+
+ def test_helloworld(self):
+ b = Broker.get()
+ hw = check_output(["./helloworld", b.addr])
+ self.assertEqual("Hello World!\n", hw)
+
+ def test_helloworld_blocking(self):
+ b = Broker.get()
+ hw = check_output(["./helloworld_blocking", b.addr])
+ self.assertEqual("Hello World!\n", hw)
+
+ def test_helloworld_direct(self):
+ url = ":%s/examples" % randrange(10000, 20000)
+ hw = check_output(["./helloworld_direct", url])
+ self.assertEqual("Hello World!\n", hw)
+
+ def test_simple_send_recv(self):
+ b = Broker.get()
+ n = 5
+ send = check_output(["./simple_send", "-a", b.addr, "-m", str(n)])
+ self.assertEqual("all messages confirmed\n", send)
+ recv = check_output(["./simple_recv", "-a", b.addr, "-m", str(n)])
+ recv_expect = "simple_recv listening on %s\n" % (b.addr)
+ recv_expect += "".join(['[%d]: b"some arbitrary binary data"\n' % (i+1) for i in range(n)])
+ self.assertEqual(recv_expect, recv)
+
+ def FIXME_test_simple_recv_send(self):
+ """Start receiver first, then run sender"""
+ b = Broker.get()
+ n = 5
+ recv = Popen(["./simple_recv", "-a", b.addr, "-m", str(n)], stdout=PIPE)
+ self.assertEqual("simple_recv listening on %s\n" % (b.addr), recv.stdout.readline())
+ send = check_output(["./simple_send", "-a", b.addr, "-m", str(n)])
+ self.assertEqual("all messages confirmed\n", send)
+ recv_expect = "".join(['[%d]: b"some arbitrary binary data"\n' % (i+1) for i in range(n)])
+ out, err = recv.communicate()
+ self.assertEqual(recv_expect, out)
+
+if __name__ == "__main__":
+ unittest.main()
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/examples/cpp/helloworld.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/helloworld.cpp b/examples/cpp/helloworld.cpp
new file mode 100644
index 0000000..6b58eb7
--- /dev/null
+++ b/examples/cpp/helloworld.cpp
@@ -0,0 +1,69 @@
+/*
+ *
+ * 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 "proton/cpp/Container.h"
+#include "proton/cpp/MessagingHandler.h"
+
+#include <iostream>
+
+
+using namespace proton::reactor;
+
+class HelloWorld : public MessagingHandler {
+ private:
+ std::string server;
+ std::string address;
+ public:
+
+ HelloWorld(const std::string &s, const std::string &addr) : server(s), address(addr) {}
+
+ void onStart(Event &e) {
+ Connection conn = e.getContainer().connect(server);
+ e.getContainer().createReceiver(conn, address);
+ e.getContainer().createSender(conn, address);
+ }
+
+ void onSendable(Event &e) {
+ Message m;
+ m.setBody("Hello World!");
+ e.getSender().send(m);
+ e.getSender().close();
+ }
+
+ void onMessage(Event &e) {
+ std::string body = e.getMessage().getBody();
+ std::cout << body << std::endl;
+ e.getConnection().close();
+ }
+
+};
+
+int main(int argc, char **argv) {
+ try {
+ std::string server = argc > 1 ? argv[1] : ":5672";
+ std::string addr = argc > 2 ? argv[2] : "examples";
+ HelloWorld hw(server, addr);
+ Container(hw).run();
+ } catch (const std::exception& e) {
+ std::cerr << e.what() << std::endl;
+ return 1;
+ }
+}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/examples/cpp/helloworld_blocking.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/helloworld_blocking.cpp b/examples/cpp/helloworld_blocking.cpp
new file mode 100644
index 0000000..5f443b6
--- /dev/null
+++ b/examples/cpp/helloworld_blocking.cpp
@@ -0,0 +1,70 @@
+/*
+ *
+ * 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 "proton/cpp/Container.h"
+#include "proton/cpp/MessagingHandler.h"
+#include "proton/cpp/BlockingSender.h"
+
+#include <iostream>
+
+
+using namespace proton::reactor;
+
+class HelloWorldBlocking : public MessagingHandler {
+ private:
+ std::string server;
+ std::string address;
+ public:
+
+ HelloWorldBlocking(const std::string &s, const std::string &addr) : server(s), address(addr) {}
+
+ void onStart(Event &e) {
+ Connection conn = e.getContainer().connect(server);
+ e.getContainer().createReceiver(conn, address);
+ }
+
+ void onMessage(Event &e) {
+ std::string body = e.getMessage().getBody();
+ std::cout << body << std::endl;
+ e.getConnection().close();
+ }
+
+};
+
+int main(int argc, char **argv) {
+ try {
+ std::string server = argc > 1 ? argv[1] : ":5672";
+ std::string addr = argc > 2 ? argv[2] : "examples";
+ BlockingConnection conn = BlockingConnection(server);
+ BlockingSender sender = conn.createSender(addr);
+ Message m;
+ m.setBody("Hello World!");
+ sender.send(m);
+ conn.close();
+
+ // TODO Temporary hack until blocking receiver available
+ HelloWorldBlocking hw(server, addr);
+ Container(hw).run();
+ } catch (const std::exception& e) {
+ std::cerr << e.what() << std::endl;
+ return 1;
+ }
+}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/examples/cpp/helloworld_direct.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/helloworld_direct.cpp b/examples/cpp/helloworld_direct.cpp
new file mode 100644
index 0000000..12617cd
--- /dev/null
+++ b/examples/cpp/helloworld_direct.cpp
@@ -0,0 +1,76 @@
+/*
+ *
+ * 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 "proton/cpp/MessagingHandler.h"
+#include "proton/cpp/Container.h"
+
+//#include "proton/cpp/Acceptor.h"
+#include <iostream>
+
+
+using namespace proton::reactor;
+
+
+class HelloWorldDirect : public MessagingHandler {
+ private:
+ std::string url;
+ Acceptor acceptor;
+ public:
+
+ HelloWorldDirect(const std::string &u) : url(u) {}
+
+ void onStart(Event &e) {
+ acceptor = e.getContainer().listen(url);
+ e.getContainer().createSender(url);
+ }
+
+ void onSendable(Event &e) {
+ Message m;
+ m.setBody("Hello World!");
+ e.getSender().send(m);
+ e.getSender().close();
+ }
+
+ void onMessage(Event &e) {
+ std::string body = e.getMessage().getBody();
+ std::cout << body << std::endl;
+ }
+
+ void onAccepted(Event &e) {
+ e.getConnection().close();
+ }
+
+ void onConnectionClosed(Event &e) {
+ acceptor.close();
+ }
+
+};
+
+int main(int argc, char **argv) {
+ try {
+ std::string url = argc > 1 ? argv[1] : ":8888/examples";
+ HelloWorldDirect hwd(url);
+ Container(hwd).run();
+ } catch (const std::exception& e) {
+ std::cerr << e.what() << std::endl;
+ return 1;
+ }
+}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/examples/cpp/simple_recv.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/simple_recv.cpp b/examples/cpp/simple_recv.cpp
new file mode 100644
index 0000000..42c561b
--- /dev/null
+++ b/examples/cpp/simple_recv.cpp
@@ -0,0 +1,115 @@
+/*
+ *
+ * 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 "proton/cpp/Container.h"
+#include "proton/cpp/MessagingHandler.h"
+#include "proton/cpp/Link.h"
+
+#include <iostream>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+
+using namespace proton::reactor;
+
+class Recv : public MessagingHandler {
+ private:
+ std::string url;
+ int expected;
+ int received;
+ public:
+
+ Recv(const std::string &s, int c) : url(s), expected(c), received(0) {}
+
+ void onStart(Event &e) {
+ e.getContainer().createReceiver(url);
+ std::cout << "simple_recv listening on " << url << std::endl;
+ }
+
+ void onMessage(Event &e) {
+ uint64_t id = 0;
+ Message msg = e.getMessage();
+ if (msg.getIdType() == PN_ULONG) {
+ id = msg.getId();
+ if (id < received)
+ return; // ignore duplicate
+ }
+ if (expected == 0 || received < expected) {
+ std::cout << '[' << id << "]: " << msg.getBody() << std::endl;
+ received++;
+ if (received == expected) {
+ e.getReceiver().close();
+ e.getConnection().close();
+ }
+ }
+ }
+};
+
+static void parse_options(int argc, char **argv, int &count, std::string &addr);
+
+int main(int argc, char **argv) {
+ try {
+ int messageCount = 100;
+ std::string address("localhost:5672/examples");
+ parse_options(argc, argv, messageCount, address);
+ Recv recv(address, messageCount);
+ Container(recv).run();
+ } catch (const std::exception& e) {
+ std::cerr << e.what() << std::endl;
+ return 1;
+ }
+}
+
+
+static void usage() {
+ std::cout << "Usage: simple_recv -m message_count -a address:" << std::endl;
+ exit (1);
+}
+
+
+static void parse_options(int argc, char **argv, int &count, std::string &addr) {
+ int c, i;
+ for (i = 1; i < argc; i++) {
+ if (strlen(argv[i]) == 2 && argv[i][0] == '-') {
+ c = argv[i][1];
+ const char *nextarg = i < argc ? argv[i+1] : NULL;
+
+ switch (c) {
+ case 'a':
+ if (!nextarg) usage();
+ addr = nextarg;
+ i++;
+ break;
+ case 'm':
+ if (!nextarg) usage();
+ unsigned newc;
+ if (sscanf( nextarg, "%d", &newc) != 1) usage();
+ count = newc;
+ i++;
+ break;
+ default:
+ usage();
+ }
+ }
+ else usage();
+ }
+}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/examples/cpp/simple_send.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/simple_send.cpp b/examples/cpp/simple_send.cpp
new file mode 100644
index 0000000..eb87c8a
--- /dev/null
+++ b/examples/cpp/simple_send.cpp
@@ -0,0 +1,122 @@
+/*
+ *
+ * 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 "proton/cpp/Container.h"
+#include "proton/cpp/MessagingHandler.h"
+#include "proton/cpp/Connection.h"
+
+#include <iostream>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+
+using namespace proton::reactor;
+
+class Send : public MessagingHandler {
+ private:
+ std::string url;
+ int sent;
+ int confirmed;
+ int total;
+ public:
+
+ Send(const std::string &s, int c) : url(s), sent(0), confirmed(0), total(c) {}
+
+ void onStart(Event &e) {
+ e.getContainer().createSender(url);
+ }
+
+ void onSendable(Event &e) {
+ Sender sender = e.getSender();
+ while (sender.getCredit() && sent < total) {
+ Message msg;
+ msg.setId(sent + 1);
+ // TODO: fancy map body content as in Python example. Simple binary for now.
+ const char *bin = "some arbitrary binary data";
+ msg.setBody(bin, strlen(bin));
+ sender.send(msg);
+ sent++;
+ }
+ }
+
+ void onAccepted(Event &e) {
+ confirmed++;
+ if (confirmed == total) {
+ std::cout << "all messages confirmed" << std::endl;
+ e.getConnection().close();
+ }
+ }
+
+ void onDisconnected(Event &e) {
+ sent = confirmed;
+ }
+};
+
+static void parse_options(int argc, char **argv, int &count, std::string &addr);
+
+int main(int argc, char **argv) {
+ try {
+ int messageCount = 100;
+ std::string address("localhost:5672/examples");
+ parse_options(argc, argv, messageCount, address);
+ Send send(address, messageCount);
+ Container(send).run();
+ } catch (const std::exception& e) {
+ std::cerr << e.what() << std::endl;
+ return 1;
+ }
+}
+
+
+static void usage() {
+ std::cout << "Usage: simple_send -m message_count -a address:" << std::endl;
+ exit (1);
+}
+
+
+static void parse_options(int argc, char **argv, int &count, std::string &addr) {
+ int c, i;
+ for (i = 1; i < argc; i++) {
+ if (strlen(argv[i]) == 2 && argv[i][0] == '-') {
+ c = argv[i][1];
+ const char *nextarg = i < argc ? argv[i+1] : NULL;
+
+ switch (c) {
+ case 'a':
+ if (!nextarg) usage();
+ addr = nextarg;
+ i++;
+ break;
+ case 'm':
+ if (!nextarg) usage();
+ unsigned newc;
+ if (sscanf( nextarg, "%d", &newc) != 1) usage();
+ count = newc;
+ i++;
+ break;
+ default:
+ usage();
+ }
+ }
+ else usage();
+ }
+}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/examples/go/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/examples/go/CMakeLists.txt b/examples/go/CMakeLists.txt
new file mode 100644
index 0000000..464ed7c
--- /dev/null
+++ b/examples/go/CMakeLists.txt
@@ -0,0 +1,29 @@
+#
+# 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.
+#
+
+# FIXME aconway 2015-05-20:
+# - use proton build for Go includes & libs.
+# - pre-build go libraries? Respect user GOPATH?
+
+if(BUILD_GO)
+ add_test(
+ NAME go_example_test
+ COMMAND ${GO_TEST} example_test.go -rpath ${CMAKE_BINARY_DIR}/proton-c
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+endif()
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/examples/go/example_test.go
----------------------------------------------------------------------
diff --git a/examples/go/example_test.go b/examples/go/example_test.go
new file mode 100644
index 0000000..8879c38
--- /dev/null
+++ b/examples/go/example_test.go
@@ -0,0 +1,284 @@
+/*
+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.
+*/
+
+// Tests to verify that example code behaves as expected.
+// Run in this directory with `go test example_test.go`
+//
+package main
+
+import (
+ "bufio"
+ "bytes"
+ "flag"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "math/rand"
+ "net"
+ "os"
+ "os/exec"
+ "path"
+ "path/filepath"
+ "reflect"
+ "testing"
+ "time"
+)
+
+func panicIf(err error) {
+ if err != nil {
+ panic(err)
+ }
+}
+
+// A demo broker process
+type broker struct {
+ cmd *exec.Cmd
+ addr string
+ runerr chan error
+ err error
+}
+
+// Try to connect to the broker to verify it is ready, give up after a timeout
+func (b *broker) check() error {
+ dialer := net.Dialer{Deadline: time.Now().Add(time.Second * 10)}
+ for {
+ c, err := dialer.Dial("tcp", b.addr)
+ if err == nil { // Success
+ c.Close()
+ return nil
+ }
+ select {
+ case runerr := <-b.runerr: // Broker exited.
+ return runerr
+ default:
+ }
+ if neterr, ok := err.(net.Error); ok && neterr.Timeout() { // Running but timed out
+ b.stop()
+ return fmt.Errorf("timed out waiting for broker")
+ }
+ time.Sleep(time.Second / 10)
+ }
+}
+
+// Start the demo broker, wait till it is listening on *addr. No-op if already started.
+func (b *broker) start() error {
+ if b.cmd == nil { // Not already started
+ // FIXME aconway 2015-04-30: better way to pick/configure a broker port.
+ b.addr = fmt.Sprintf("127.0.0.1:%d", rand.Intn(10000)+10000)
+ b.cmd = exampleCommand("event_broker", "-addr", b.addr)
+ b.runerr = make(chan error)
+ b.cmd.Stderr, b.cmd.Stdout = os.Stderr, os.Stdout
+ go func() {
+ b.runerr <- b.cmd.Run()
+ }()
+ b.err = b.check()
+ }
+ return b.err
+}
+
+func (b *broker) stop() {
+ if b != nil && b.cmd != nil {
+ b.cmd.Process.Kill()
+ b.cmd.Wait()
+ }
+}
+
+func checkEqual(want interface{}, got interface{}) error {
+ if reflect.DeepEqual(want, got) {
+ return nil
+ }
+ return fmt.Errorf("%#v != %#v", want, got)
+}
+
+// runCommand returns an exec.Cmd to run an example.
+func exampleCommand(prog string, arg ...string) *exec.Cmd {
+ build(prog + ".go")
+ args := []string{}
+ if *debug {
+ args = append(args, "-debug=true")
+ }
+ args = append(args, arg...)
+ cmd := exec.Command(exepath(prog), args...)
+ cmd.Stderr = os.Stderr
+ return cmd
+}
+
+// Run an example Go program, return the combined output as a string.
+func runExample(prog string, arg ...string) (string, error) {
+ cmd := exampleCommand(prog, arg...)
+ out, err := cmd.Output()
+ return string(out), err
+}
+
+func prefix(prefix string, err error) error {
+ if err != nil {
+ return fmt.Errorf("%s: %s", prefix, err)
+ }
+ return nil
+}
+
+func runExampleWant(want string, prog string, args ...string) error {
+ out, err := runExample(prog, args...)
+ if err != nil {
+ return fmt.Errorf("%s failed: %s: %s", prog, err, out)
+ }
+ return prefix(prog, checkEqual(want, out))
+}
+
+func exampleArgs(args ...string) []string {
+ return append(args, testBroker.addr+"/foo", testBroker.addr+"/bar", testBroker.addr+"/baz")
+}
+
+// Send then receive
+func TestExampleSendReceive(t *testing.T) {
+ if testing.Short() {
+ t.Skip("Skip demo tests in short mode")
+ }
+ testBroker.start()
+ err := runExampleWant(
+ "Received all 15 acknowledgements\n",
+ "send",
+ exampleArgs("-count", "5")...)
+ if err != nil {
+ t.Fatal(err)
+ }
+ err = runExampleWant(
+ "Listening on 3 connections\nReceived 15 messages\n",
+ "receive",
+ exampleArgs("-count", "15")...)
+ if err != nil {
+ t.Fatal(err)
+ }
+}
+
+var ready error
+
+func init() { ready = fmt.Errorf("Ready") }
+
+// Run receive in a goroutine.
+// Send ready on errchan when it is listening.
+// Send final error when it is done.
+// Returns the Cmd, caller must Wait()
+func goReceiveWant(errchan chan<- error, want string, arg ...string) *exec.Cmd {
+ cmd := exampleCommand("receive", arg...)
+ go func() {
+ pipe, err := cmd.StdoutPipe()
+ if err != nil {
+ errchan <- err
+ return
+ }
+ out := bufio.NewReader(pipe)
+ cmd.Start()
+ line, err := out.ReadString('\n')
+ if err != nil && err != io.EOF {
+ errchan <- err
+ return
+ }
+ listening := "Listening on 3 connections\n"
+ if line != listening {
+ errchan <- checkEqual(listening, line)
+ return
+ }
+ errchan <- ready
+ buf := bytes.Buffer{}
+ io.Copy(&buf, out) // Collect the rest of the output
+ errchan <- checkEqual(want, buf.String())
+ close(errchan)
+ }()
+ return cmd
+}
+
+// Start receiver first, wait till it is running, then send.
+func TestExampleReceiveSend(t *testing.T) {
+ if testing.Short() {
+ t.Skip("Skip demo tests in short mode")
+ }
+ testBroker.start()
+ recvErr := make(chan error)
+ recvCmd := goReceiveWant(recvErr,
+ "Received 15 messages\n",
+ exampleArgs("-count", "15")...)
+ defer func() {
+ recvCmd.Process.Kill()
+ recvCmd.Wait()
+ }()
+ if err := <-recvErr; err != ready { // Wait for receiver ready
+ t.Fatal(err)
+ }
+ err := runExampleWant(
+ "Received all 15 acknowledgements\n",
+ "send",
+ exampleArgs("-count", "5")...)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if err := <-recvErr; err != nil {
+ t.Fatal(err)
+ }
+}
+
+func exepath(relative string) string {
+ if binDir == "" {
+ panic("bindir not set, cannot run example binaries")
+ }
+ return path.Join(binDir, relative)
+}
+
+var testBroker *broker
+var binDir, exampleDir string
+var built map[string]bool
+
+func init() {
+ built = make(map[string]bool)
+}
+
+func build(prog string) {
+ if !built[prog] {
+ args := []string{"build"}
+ if *rpath != "" {
+ args = append(args, "-ldflags", "-r "+*rpath)
+ }
+ args = append(args, path.Join(exampleDir, prog))
+ build := exec.Command("go", args...)
+ build.Dir = binDir
+ out, err := build.CombinedOutput()
+ if err != nil {
+ panic(fmt.Errorf("%v: %s", err, out))
+ }
+ built[prog] = true
+ }
+}
+
+var rpath = flag.String("rpath", "", "Runtime path for test executables")
+var debug = flag.Bool("debug", false, "Debugging output from examples")
+
+func TestMain(m *testing.M) {
+ rand.Seed(time.Now().UTC().UnixNano())
+ var err error
+ exampleDir, err = filepath.Abs(".")
+ panicIf(err)
+ binDir, err = ioutil.TempDir("", "example_test.go")
+ panicIf(err)
+ defer os.Remove(binDir) // Clean up binaries
+ testBroker = &broker{} // Broker is started on-demand by tests.
+ testBroker.stop()
+ status := m.Run()
+ testBroker.stop()
+ os.Exit(status)
+}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/CMakeLists.txt b/proton-c/CMakeLists.txt
index 1347f16..aaf9a82 100644
--- a/proton-c/CMakeLists.txt
+++ b/proton-c/CMakeLists.txt
@@ -574,6 +574,3 @@ if (BUILD_JAVASCRIPT)
add_test (javascript-codec ${env_py} node ${pn_test_root}/javascript/codec.js)
add_test (javascript-message ${env_py} node ${pn_test_root}/javascript/message.js)
endif (BUILD_JAVASCRIPT)
-
-# build examples to make sure they still work
-add_subdirectory(../examples ../examples)
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/bindings/CMakeLists.txt b/proton-c/bindings/CMakeLists.txt
index f426ef3..e976bc7 100644
--- a/proton-c/bindings/CMakeLists.txt
+++ b/proton-c/bindings/CMakeLists.txt
@@ -109,10 +109,10 @@ if (EMSCRIPTEN_FOUND)
set (DEFAULT_JAVASCRIPT ON)
endif (EMSCRIPTEN_FOUND)
-# C++ client: very experimental. To try, change this to "ON"
-# or provide -DBUILD_CPP=ON to CMake
-set (DEFAULT_CPP OFF)
-
+# Prerequisites for C++
+if (CMAKE_CXX_COMPILER)
+ set (DEFAULT_CPP ON)
+endif (CMAKE_CXX_COMPILER)
# Shouldn't need to modify below here when adding new language binding
foreach(BINDING ${BINDINGS})
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/CMakeLists.txt b/proton-c/bindings/cpp/CMakeLists.txt
index 34123ed..f9e747c 100644
--- a/proton-c/bindings/cpp/CMakeLists.txt
+++ b/proton-c/bindings/cpp/CMakeLists.txt
@@ -17,8 +17,6 @@
# under the License.
#
-project (Proton C CXX)
-
include_directories ("${CMAKE_CURRENT_SOURCE_DIR}/src")
include_directories ("${CMAKE_CURRENT_SOURCE_DIR}/include")
@@ -53,21 +51,13 @@ set (qpid-proton-cpp-core
src/Delivery.cpp
src/Acking.cpp
src/Transport.cpp
- src/Logger.cpp
src/contexts.cpp
- src/exceptions.cpp
src/blocking/BlockingConnection.cpp
src/blocking/BlockingConnectionImpl.cpp
src/blocking/BlockingLink.cpp
src/blocking/BlockingSender.cpp
)
-#set_source_files_properties (
-# ${qpid-proton-cpp-core}
-# PROPERTIES
-# COMPILE_FLAGS "${COMPILE_WARNING_FLAGS} ${COMPILE_LANGUAGE_FLAGS}"
-# )
-
set_source_files_properties (${qpid-proton-cpp-platform} PROPERTIES LANGUAGE CXX)
set_source_files_properties (
${qpid-proton-cpp-platform}
@@ -76,8 +66,6 @@ set_source_files_properties (
COMPILE_DEFINITIONS "${PLATFORM_DEFINITIONS}"
)
-
-
add_library (
qpid-proton-cpp SHARED
@@ -97,20 +85,6 @@ set_target_properties (
LINK_FLAGS "${CATCH_UNDEFINED}"
)
-add_executable (HelloWorld examples/HelloWorld.cpp)
-target_link_libraries (HelloWorld qpid-proton-cpp)
-add_executable (HelloWorldDirect examples/HelloWorldDirect.cpp)
-target_link_libraries (HelloWorldDirect qpid-proton-cpp)
-add_executable (SimpleRecv examples/SimpleRecv.cpp)
-target_link_libraries (SimpleRecv qpid-proton-cpp)
-add_executable (SimpleSend examples/SimpleSend.cpp)
-target_link_libraries (SimpleSend qpid-proton-cpp)
-add_executable (Broker examples/Broker.cpp)
-target_link_libraries (Broker qpid-proton-cpp)
-add_executable (HelloWorldBlocking examples/HelloWorldBlocking.cpp)
-target_link_libraries (HelloWorldBlocking qpid-proton-cpp)
-
-
install (TARGETS qpid-proton-cpp
EXPORT proton
ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/README.md
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/README.md b/proton-c/bindings/cpp/README.md
new file mode 100644
index 0000000..cf16577
--- /dev/null
+++ b/proton-c/bindings/cpp/README.md
@@ -0,0 +1,24 @@
+# C++ binding for proton.
+
+This is a C++ wrapper for the proton reactor API.
+It is very similar to the python wrapper for the same API.
+
+There are [examples](../../../examples/cpp/README.md) and the header files have
+API documentation in doxygen format.
+
+# TO DO
+
+There are a number of things that remain to be done.
+
+- Type mapping between AMQP and C++ types, e.g. encoding std::map as map message.
+
+- Finish blocking API & demos.
+- API documentation, HTML docs on website.
+- FIXME and TODO notes in code, esp. error handling, missing sender/receiver/connection methods.
+
+- Valgrind for automated tests and demos.
+- More automated tests and examples.
+
+- Security: SASL/SSL support.
+- Reconnection
+
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/examples/Broker.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/examples/Broker.cpp b/proton-c/bindings/cpp/examples/Broker.cpp
deleted file mode 100644
index 7d5214d..0000000
--- a/proton-c/bindings/cpp/examples/Broker.cpp
+++ /dev/null
@@ -1,193 +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 "proton/cpp/Container.h"
-#include "proton/cpp/MessagingHandler.h"
-
-#include <iostream>
-#include <deque>
-#include <map>
-#include <list>
-
-
-using namespace proton::reactor;
-
-std::string generateUuid(){
- throw "TODO: platform neutral uuid";
-}
-
-class Queue {
- public:
- bool dynamic;
- typedef std::deque<Message> MsgQ;
- typedef std::list<Sender> List;
- MsgQ queue;
- List consumers;
-
- Queue(bool dyn = false) : dynamic(dyn), queue(MsgQ()), consumers(List()) {}
-
- void subscribe(Sender &c) {
- consumers.push_back(c);
- }
-
- bool unsubscribe(Sender &c) {
- consumers.remove(c);
- return (consumers.size() == 0 && (dynamic || queue.size() == 0));
- }
-
- void publish(Message &m) {
- queue.push_back(m);
- dispatch(0);
- }
-
- void dispatch(Sender *s) {
- while (deliverTo(s)) {
- }
- }
-
- bool deliverTo(Sender *consumer) {
- // deliver to single consumer if supplied, else all consumers
- int count = consumer ? 1 : consumers.size();
- if (!count) return false;
- bool result = false;
- List::iterator it = consumers.begin();
- if (!consumer && count) consumer = &*it;
-
- while (queue.size()) {
- if (consumer->getCredit()) {
- consumer->send(queue.front());
- queue.pop_front();
- result = true;
- }
- if (--count)
- it++;
- else
- return result;
- }
- return false;
- }
-};
-
-class Broker : public MessagingHandler {
- private:
- std::string url;
- typedef std::map<std::string, Queue *> QMap;
- QMap queues;
- public:
-
- Broker(const std::string &s) : url(s), queues(QMap()) {}
-
- void onStart(Event &e) {
- e.getContainer().listen(url);
- }
-
- Queue &queue(std::string &address) {
- QMap::iterator it = queues.find(address);
- if (it == queues.end()) {
- queues[address] = new Queue();
- return *queues[address];
- }
- else {
- return *it->second;
- }
- }
-
- void onLinkOpening(Event &e) {
- Link lnk = e.getLink();
- if (lnk.isSender()) {
- Sender sender(lnk);
- Terminus remoteSource(lnk.getRemoteSource());
- if (remoteSource.isDynamic()) {
- std::string address = generateUuid();
- lnk.getSource().setAddress(address);
- Queue *q = new Queue(true);
- queues[address] = q;
- q->subscribe(sender);
- }
- else {
- std::string address = remoteSource.getAddress();
- if (!address.empty()) {
- lnk.getSource().setAddress(address);
- queue(address).subscribe(sender);
- }
- }
- }
- else {
- std::string address = lnk.getRemoteTarget().getAddress();
- if (!address.empty())
- lnk.getTarget().setAddress(address);
- }
- }
-
- void unsubscribe (Sender &lnk) {
- std::string address = lnk.getSource().getAddress();
- QMap::iterator it = queues.find(address);
- if (it != queues.end() && it->second->unsubscribe(lnk)) {
- delete it->second;
- queues.erase(it);
- }
- }
-
- void onLinkClosing(Event &e) {
- Link lnk = e.getLink();
- if (lnk.isSender()) {
- Sender s(lnk);
- unsubscribe(s);
- }
- }
-
- void onConnectionClosing(Event &e) {
- removeStaleConsumers(e.getConnection());
- }
-
- void onDisconnected(Event &e) {
- removeStaleConsumers(e.getConnection());
- }
-
- void removeStaleConsumers(Connection &connection) {
- Link l = connection.getLinkHead(Endpoint::REMOTE_ACTIVE);
- while (l) {
- if (l.isSender()) {
- Sender s(l);
- unsubscribe(s);
- }
- l = l.getNext(Endpoint::REMOTE_ACTIVE);
- }
- }
-
- void onSendable(Event &e) {
- Link lnk = e.getLink();
- Sender sender(lnk);
- std::string addr = lnk.getSource().getAddress();
- queue(addr).dispatch(&sender);
- }
-
- void onMessage(Event &e) {
- std::string addr = e.getLink().getTarget().getAddress();
- Message msg = e.getMessage();
- queue(addr).publish(msg);
- }
-};
-
-int main(int argc, char **argv) {
- Broker hw("localhost:5672");
- Container(hw).run();
-}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/examples/HelloWorld.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/examples/HelloWorld.cpp b/proton-c/bindings/cpp/examples/HelloWorld.cpp
deleted file mode 100644
index 1fc124b..0000000
--- a/proton-c/bindings/cpp/examples/HelloWorld.cpp
+++ /dev/null
@@ -1,62 +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 "proton/cpp/Container.h"
-#include "proton/cpp/MessagingHandler.h"
-
-#include <iostream>
-
-
-using namespace proton::reactor;
-
-class HelloWorld : public MessagingHandler {
- private:
- std::string server;
- std::string address;
- public:
-
- HelloWorld(const std::string &s, const std::string &addr) : server(s), address(addr) {}
-
- void onStart(Event &e) {
- Connection conn = e.getContainer().connect(server);
- e.getContainer().createReceiver(conn, address);
- e.getContainer().createSender(conn, address);
- }
-
- void onSendable(Event &e) {
- Message m;
- m.setBody("Hello World!");
- e.getSender().send(m);
- e.getSender().close();
- }
-
- void onMessage(Event &e) {
- std::string body = e.getMessage().getBody();
- std::cout << body << std::endl;
- e.getConnection().close();
- }
-
-};
-
-int main(int argc, char **argv) {
- HelloWorld hw("localhost:5672", "examples");
- Container(hw).run();
-}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/examples/HelloWorldBlocking.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/examples/HelloWorldBlocking.cpp b/proton-c/bindings/cpp/examples/HelloWorldBlocking.cpp
deleted file mode 100644
index a3f729c..0000000
--- a/proton-c/bindings/cpp/examples/HelloWorldBlocking.cpp
+++ /dev/null
@@ -1,65 +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 "proton/cpp/Container.h"
-#include "proton/cpp/MessagingHandler.h"
-#include "proton/cpp/BlockingSender.h"
-
-#include <iostream>
-
-
-using namespace proton::reactor;
-
-class HelloWorldBlocking : public MessagingHandler {
- private:
- std::string server;
- std::string address;
- public:
-
- HelloWorldBlocking(const std::string &s, const std::string &addr) : server(s), address(addr) {}
-
- void onStart(Event &e) {
- Connection conn = e.getContainer().connect(server);
- e.getContainer().createReceiver(conn, address);
- }
-
- void onMessage(Event &e) {
- std::string body = e.getMessage().getBody();
- std::cout << body << std::endl;
- e.getConnection().close();
- }
-
-};
-
-int main(int argc, char **argv) {
- std::string url("localhost:5672");
- std::string addr("examples");
- BlockingConnection conn = BlockingConnection(url);
- BlockingSender sender = conn.createSender(addr);
- Message m;
- m.setBody("Hello World!");
- sender.send(m);
- conn.close();
-
- // Temporary hack until blocking receiver available
- HelloWorldBlocking hw("localhost:5672", "examples");
- Container(hw).run();
-}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/examples/HelloWorldDirect.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/examples/HelloWorldDirect.cpp b/proton-c/bindings/cpp/examples/HelloWorldDirect.cpp
deleted file mode 100644
index a695dd0..0000000
--- a/proton-c/bindings/cpp/examples/HelloWorldDirect.cpp
+++ /dev/null
@@ -1,70 +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 "proton/cpp/MessagingHandler.h"
-#include "proton/cpp/Container.h"
-
-//#include "proton/cpp/Acceptor.h"
-#include <iostream>
-
-
-using namespace proton::reactor;
-
-
-class HelloWorldDirect : public MessagingHandler {
- private:
- std::string url;
- Acceptor acceptor;
- public:
-
- HelloWorldDirect(const std::string &u) : url(u) {}
-
- void onStart(Event &e) {
- acceptor = e.getContainer().listen(url);
- e.getContainer().createSender(url);
- }
-
- void onSendable(Event &e) {
- Message m;
- m.setBody("Hello World!");
- e.getSender().send(m);
- e.getSender().close();
- }
-
- void onMessage(Event &e) {
- std::string body = e.getMessage().getBody();
- std::cout << body << std::endl;
- }
-
- void onAccepted(Event &e) {
- e.getConnection().close();
- }
-
- void onConnectionClosed(Event &e) {
- acceptor.close();
- }
-
-};
-
-int main(int argc, char **argv) {
- HelloWorldDirect hwd("localhost:8888/examples");
- Container(hwd).run();
-}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/examples/SimpleRecv.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/examples/SimpleRecv.cpp b/proton-c/bindings/cpp/examples/SimpleRecv.cpp
deleted file mode 100644
index 22778f0..0000000
--- a/proton-c/bindings/cpp/examples/SimpleRecv.cpp
+++ /dev/null
@@ -1,109 +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 "proton/cpp/Container.h"
-#include "proton/cpp/MessagingHandler.h"
-#include "proton/cpp/Link.h"
-
-#include <iostream>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-
-using namespace proton::reactor;
-
-class Recv : public MessagingHandler {
- private:
- std::string url;
- int expected;
- int received;
- public:
-
- Recv(const std::string &s, int c) : url(s), expected(c), received(0) {}
-
- void onStart(Event &e) {
- e.getContainer().createReceiver(url);
- }
-
- void onMessage(Event &e) {
- uint64_t id = 0;
- Message msg = e.getMessage();
- if (msg.getIdType() == PN_ULONG) {
- id = msg.getId();
- if (id < received)
- return; // ignore duplicate
- }
- if (expected == 0 || received < expected) {
- std::cout << '[' << id << "]: " << msg.getBody() << std::endl;
- received++;
- if (received == expected) {
- e.getReceiver().close();
- e.getConnection().close();
- }
- }
- }
-};
-
-static void parse_options(int argc, char **argv, int &count, std::string &addr);
-
-int main(int argc, char **argv) {
- int messageCount = 100;
- std::string address("localhost:5672/examples");
- parse_options(argc, argv, messageCount, address);
- Recv recv(address, messageCount);
- Container(recv).run();
-}
-
-
-static void usage() {
- std::cout << "Usage: SimpleRecv -m message_count -a address:" << std::endl;
- exit (1);
-}
-
-
-static void parse_options(int argc, char **argv, int &count, std::string &addr) {
- int c, i;
- for (i = 1; i < argc; i++) {
- if (strlen(argv[i]) == 2 && argv[i][0] == '-') {
- c = argv[i][1];
- const char *nextarg = i < argc ? argv[i+1] : NULL;
-
- switch (c) {
- case 'a':
- if (!nextarg) usage();
- addr = nextarg;
- i++;
- break;
- case 'm':
- if (!nextarg) usage();
- unsigned newc;
- if (sscanf( nextarg, "%d", &newc) != 1) usage();
- count = newc;
- i++;
- break;
- default:
- usage();
- }
- }
- else usage();
- }
-}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/examples/SimpleSend.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/examples/SimpleSend.cpp b/proton-c/bindings/cpp/examples/SimpleSend.cpp
deleted file mode 100644
index 89ca39d..0000000
--- a/proton-c/bindings/cpp/examples/SimpleSend.cpp
+++ /dev/null
@@ -1,117 +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 "proton/cpp/Container.h"
-#include "proton/cpp/MessagingHandler.h"
-#include "proton/cpp/Connection.h"
-
-#include <iostream>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-
-using namespace proton::reactor;
-
-class Send : public MessagingHandler {
- private:
- std::string url;
- int sent;
- int confirmed;
- int total;
- public:
-
- Send(const std::string &s, int c) : url(s), sent(0), confirmed(0), total(c) {}
-
- void onStart(Event &e) {
- e.getContainer().createSender(url);
- }
-
- void onSendable(Event &e) {
- Sender sender = e.getSender();
- while (sender.getCredit() && sent < total) {
- Message msg;
- msg.setId(sent + 1);
- // TODO: fancy map body content as in Python example. Simple binary for now.
- const char *bin = "some arbitrary binary data";
- msg.setBody(bin, strlen(bin));
- sender.send(msg);
- sent++;
- }
- }
-
- void onAccepted(Event &e) {
- confirmed++;
- if (confirmed == total) {
- std::cout << "all messages confirmed" << std::endl;
- e.getConnection().close();
- }
- }
-
- void onDisconnected(Event &e) {
- sent = confirmed;
- }
-};
-
-static void parse_options(int argc, char **argv, int &count, std::string &addr);
-
-int main(int argc, char **argv) {
- int messageCount = 100;
- std::string address("localhost:5672/examples");
- parse_options(argc, argv, messageCount, address);
- Send send(address, messageCount);
- Container(send).run();
-}
-
-
-static void usage() {
- std::cout << "Usage: SimpleSend -m message_count -a address:" << std::endl;
- exit (1);
-}
-
-
-static void parse_options(int argc, char **argv, int &count, std::string &addr) {
- int c, i;
- for (i = 1; i < argc; i++) {
- if (strlen(argv[i]) == 2 && argv[i][0] == '-') {
- c = argv[i][1];
- const char *nextarg = i < argc ? argv[i+1] : NULL;
-
- switch (c) {
- case 'a':
- if (!nextarg) usage();
- addr = nextarg;
- i++;
- break;
- case 'm':
- if (!nextarg) usage();
- unsigned newc;
- if (sscanf( nextarg, "%d", &newc) != 1) usage();
- count = newc;
- i++;
- break;
- default:
- usage();
- }
- }
- else usage();
- }
-}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/include/proton/cpp/Delivery.h
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/cpp/Delivery.h b/proton-c/bindings/cpp/include/proton/cpp/Delivery.h
index 8171dd5..089ae1b 100644
--- a/proton-c/bindings/cpp/include/proton/cpp/Delivery.h
+++ b/proton-c/bindings/cpp/include/proton/cpp/Delivery.h
@@ -24,8 +24,6 @@
#include "proton/cpp/ImportExport.h"
#include "proton/cpp/ProtonHandle.h"
-#include "ProtonImplRef.h"
-
#include "proton/delivery.h"
#include "proton/disposition.h"
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/include/proton/cpp/Handle.h
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/cpp/Handle.h b/proton-c/bindings/cpp/include/proton/cpp/Handle.h
index 77b7814..2cf3f99 100644
--- a/proton-c/bindings/cpp/include/proton/cpp/Handle.h
+++ b/proton-c/bindings/cpp/include/proton/cpp/Handle.h
@@ -28,6 +28,7 @@ namespace proton {
namespace reactor {
template <class> class PrivateImplRef;
+template <class> class ProtonImplRef;
/**
* A handle is like a pointer: refers to an underlying implementation object.
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/include/proton/cpp/exceptions.h
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/cpp/exceptions.h b/proton-c/bindings/cpp/include/proton/cpp/exceptions.h
index 713c5c5..9fdef94 100644
--- a/proton-c/bindings/cpp/include/proton/cpp/exceptions.h
+++ b/proton-c/bindings/cpp/include/proton/cpp/exceptions.h
@@ -21,34 +21,27 @@
* under the License.
*
*/
-#include "proton/cpp/ImportExport.h"
-#include <string>
-#include <exception>
+#include <stdexcept>
namespace proton {
namespace reactor {
-class ProtonException : public std::exception
+class ProtonException : public std::runtime_error
{
public:
- PROTON_CPP_EXTERN explicit ProtonException(const std::string& message=std::string()) throw();
- PROTON_CPP_EXTERN virtual ~ProtonException() throw();
- PROTON_CPP_EXTERN virtual const char* what() const throw();
-
- private:
- const std::string message;
+ explicit ProtonException(const std::string& msg) throw() : std::runtime_error(msg) {}
};
class MessageReject : public ProtonException
{
public:
- PROTON_CPP_EXTERN explicit MessageReject(const std::string& message=std::string()) throw();
+ explicit MessageReject(const std::string& msg) throw() : ProtonException(msg) {}
};
class MessageRelease : public ProtonException
{
public:
- PROTON_CPP_EXTERN explicit MessageRelease(const std::string& message=std::string()) throw();
+ explicit MessageRelease(const std::string& msg) throw() : ProtonException(msg) {}
};
}} // namespace proton::reactor
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/src/Connector.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Connector.cpp b/proton-c/bindings/cpp/src/Connector.cpp
index 8ebdfb6..fc6eed3 100644
--- a/proton-c/bindings/cpp/src/Connector.cpp
+++ b/proton-c/bindings/cpp/src/Connector.cpp
@@ -27,7 +27,6 @@
#include "Connector.h"
#include "ConnectionImpl.h"
#include "Url.h"
-#include "LogInternal.h"
namespace proton {
namespace reactor {
@@ -46,7 +45,6 @@ void Connector::connect() {
Url url(address);
std::string hostname = url.getHost() + ":" + url.getPort();
pn_connection_set_hostname(conn, hostname.c_str());
- PN_CPP_LOG(info, "connecting to " << hostname << "...");
transport = new Transport();
transport->bind(connection);
connection.impl->transport = transport;
@@ -57,16 +55,13 @@ void Connector::onConnectionLocalOpen(Event &e) {
connect();
}
-void Connector::onConnectionRemoteOpen(Event &e) {
- PN_CPP_LOG(info, "connected to " << e.getConnection().getHostname());
-}
+void Connector::onConnectionRemoteOpen(Event &e) {}
void Connector::onConnectionInit(Event &e) {
}
void Connector::onTransportClosed(Event &e) {
// TODO: prepend with reconnect logic
- PN_CPP_LOG(info, "Disconnected");
pn_connection_release(connection.impl->pnConnection);
// No more interaction, so drop our counted reference.
connection = Connection();
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/src/Container.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Container.cpp b/proton-c/bindings/cpp/src/Container.cpp
index e72f484..5a551a1 100644
--- a/proton-c/bindings/cpp/src/Container.cpp
+++ b/proton-c/bindings/cpp/src/Container.cpp
@@ -27,7 +27,6 @@
#include "proton/cpp/exceptions.h"
#include "ContainerImpl.h"
#include "PrivateImplRef.h"
-#include "LogInternal.h"
#include "Connector.h"
#include "contexts.h"
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/src/ContainerImpl.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/ContainerImpl.cpp b/proton-c/bindings/cpp/src/ContainerImpl.cpp
index 1424dbb..ce69928 100644
--- a/proton-c/bindings/cpp/src/ContainerImpl.cpp
+++ b/proton-c/bindings/cpp/src/ContainerImpl.cpp
@@ -25,8 +25,8 @@
#include "proton/cpp/MessagingAdapter.h"
#include "proton/cpp/Acceptor.h"
#include "proton/cpp/exceptions.h"
-#include "LogInternal.h"
+#include "Msg.h"
#include "ContainerImpl.h"
#include "ConnectionImpl.h"
#include "Connector.h"
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/src/Delivery.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Delivery.cpp b/proton-c/bindings/cpp/src/Delivery.cpp
index 990e394..d0b2f3c 100644
--- a/proton-c/bindings/cpp/src/Delivery.cpp
+++ b/proton-c/bindings/cpp/src/Delivery.cpp
@@ -21,6 +21,7 @@
#include "proton/cpp/Delivery.h"
#include "proton/delivery.h"
+#include "ProtonImplRef.h"
namespace proton {
namespace reactor {
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/src/LogInternal.h
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/LogInternal.h b/proton-c/bindings/cpp/src/LogInternal.h
deleted file mode 100644
index 427f90b..0000000
--- a/proton-c/bindings/cpp/src/LogInternal.h
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef PROTON_CPP_LOG_INTERNAL_H
-#define PROTON_CPP_LOG_INTERNAL_H
-
-/*
- *
- * 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 "Msg.h"
-
-namespace proton {
-namespace reactor {
-
-enum Level { trace, debug, info, notice, warning, error, critical };
-
-class Logger
-{
-public:
- // TODO: build out to be ultra configurable as for corresponding QPID class + Statement
- static void log(Level level, const char* file, int line, const char* function, const std::string& message);
-private:
- //This class has only one instance so no need to copy
- Logger();
- ~Logger();
-
- Logger(const Logger&);
- Logger operator=(const Logger&);
-};
-
-// Just do simple logging for now
-#define PN_CPP_LOG(LEVEL, MESSAGE) Logger::log(LEVEL, 0, 0, 0, ::proton::reactor::Msg() << MESSAGE)
-
-}} // namespace proton::reactor
-
-#endif /*!PROTON_CPP_LOG_INTERNAL_H*/
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/src/Logger.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Logger.cpp b/proton-c/bindings/cpp/src/Logger.cpp
deleted file mode 100644
index 2671b2e..0000000
--- a/proton-c/bindings/cpp/src/Logger.cpp
+++ /dev/null
@@ -1,56 +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 "LogInternal.h"
-#include <cstdlib>
-
-namespace proton {
-namespace reactor {
-
-namespace {
-bool levelSet = false;
-Level logLevel = error;
-Level getLogLevel() {
- if (!levelSet) {
- levelSet = true;
- const char *l = getenv("PROTON_CPP_LOG_LEVEL");
- if (l && l[0] != 0 && l[1] == 0) {
- char low = '0' + trace;
- char high = '0' + critical;
- if (*l >= low && *l <= high)
- logLevel = (Level) (*l - '0');
- }
- }
- return logLevel;
-}
-
-} // namespace
-
-
-void Logger::log(Level level, const char* file, int line, const char* function, const std::string& message)
-{
- if (level >= getLogLevel()) {
- std::cout << message << std::endl;
- std::cout.flush();
- }
-}
-
-}} // namespace proton::reactor
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8074793b/proton-c/bindings/cpp/src/exceptions.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/exceptions.cpp b/proton-c/bindings/cpp/src/exceptions.cpp
deleted file mode 100644
index c19e61d..0000000
--- a/proton-c/bindings/cpp/src/exceptions.cpp
+++ /dev/null
@@ -1,33 +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 "proton/cpp/exceptions.h"
-
-namespace proton {
-namespace reactor {
-
-ProtonException::ProtonException(const std::string& msg) throw() : message(msg) {}
-ProtonException::~ProtonException() throw() {}
-const char* ProtonException::what() const throw() { return message.c_str(); }
-
-MessageReject::MessageReject(const std::string& msg) throw() : ProtonException(msg) {}
-MessageRelease::MessageRelease(const std::string& msg) throw() : ProtonException(msg) {}
-
-}} // namespace proton::reactor
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org