You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by fa...@apache.org on 2014/03/14 12:20:49 UTC
svn commit: r1577483 [1/5] - in
/qpid/proton/branches/fadams-javascript-binding/proton-c: ./ bindings/
bindings/perl/ bindings/perl/lib/ bindings/perl/lib/qpid/proton/
bindings/php/ bindings/python/ bindings/ruby/ docs/api/ include/proton/
src/ src/cod...
Author: fadams
Date: Fri Mar 14 11:20:47 2014
New Revision: 1577483
URL: http://svn.apache.org/r1577483
Log:
updates from trunk
Added:
qpid/proton/branches/fadams-javascript-binding/proton-c/docs/api/index.md
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/condition.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/connection.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/container.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/delivery.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/disposition.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/event.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/io.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/link.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/selectable.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/selector.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/session.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/terminus.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/transport.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/src/engine/event.c (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/src/engine/event.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/src/posix/io.c (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/src/posix/selector.c (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/src/selectable.c (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/src/selectable.h (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/src/tests/engine.c (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/src/tests/parse-url.c (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/src/windows/io.c (with props)
qpid/proton/branches/fadams-javascript-binding/proton-c/src/windows/selector.c (with props)
Modified:
qpid/proton/branches/fadams-javascript-binding/proton-c/ (props changed)
qpid/proton/branches/fadams-javascript-binding/proton-c/CMakeLists.txt
qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/CMakeLists.txt
qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/CMakeLists.txt
qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid/proton/Constants.pm
qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid/proton/ExceptionHandling.pm
qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid_proton.pm
qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/php/CMakeLists.txt
qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/ (props changed)
qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/CMakeLists.txt
qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/proton.py
qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/python.i
qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/ruby/CMakeLists.txt
qpid/proton/branches/fadams-javascript-binding/proton-c/docs/api/user.doxygen.in
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/cproton.i
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/driver.h
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/driver_extras.h
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/engine.h
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/error.h
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/message.h
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/messenger.h
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/object.h
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/sasl.h
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/ssl.h
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/types.h
qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/util.h
qpid/proton/branches/fadams-javascript-binding/proton-c/src/codec/codec.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/dispatcher/dispatcher.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/engine/engine-internal.h
qpid/proton/branches/fadams-javascript-binding/proton-c/src/engine/engine.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/error.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/message/message.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/messenger/messenger.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/object/object.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/posix/driver.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/proton.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/ssl/openssl.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/ssl/ssl-internal.h
qpid/proton/branches/fadams-javascript-binding/proton-c/src/ssl/ssl_stub.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/tests/CMakeLists.txt
qpid/proton/branches/fadams-javascript-binding/proton-c/src/tests/message.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/tests/object.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/transport/transport.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/transport/transport.h
qpid/proton/branches/fadams-javascript-binding/proton-c/src/util.c
qpid/proton/branches/fadams-javascript-binding/proton-c/src/windows/driver.c
Propchange: qpid/proton/branches/fadams-javascript-binding/proton-c/
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Fri Mar 14 11:20:47 2014
@@ -0,0 +1,6 @@
+/qpid/proton/branches/jni-binding/proton-c:1421251-1441392
+/qpid/proton/branches/kgiusti-msvc2010/proton-c:1404579-1405897
+/qpid/proton/branches/kgiusti-proton-136/proton-c:1417075-1423611
+/qpid/proton/branches/kgiusti-proton-225/proton-c:1445892-1446694
+/qpid/proton/branches/openssl/proton-c:1387623-1387788
+/qpid/proton/trunk/proton-c:1544559-1577480
Modified: qpid/proton/branches/fadams-javascript-binding/proton-c/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/CMakeLists.txt?rev=1577483&r1=1577482&r2=1577483&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/CMakeLists.txt (original)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/CMakeLists.txt Fri Mar 14 11:20:47 2014
@@ -44,6 +44,8 @@ endif()
# Set the default SSL/TLS implementation
find_package(OpenSSL)
+find_package (PythonInterp REQUIRED)
+
set(ssl_impl, none)
if (OPENSSL_FOUND)
set(ssl_impl openssl)
@@ -62,20 +64,24 @@ include_directories ("${CMAKE_CURRENT_SO
add_custom_command (
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/encodings.h
- COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/env.py PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR} python ${CMAKE_CURRENT_SOURCE_DIR}/src/codec/encodings.h.py > ${CMAKE_CURRENT_BINARY_DIR}/encodings.h
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/env.py PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR} ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/src/codec/encodings.h.py > ${CMAKE_CURRENT_BINARY_DIR}/encodings.h
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/codec/encodings.h.py
)
add_custom_command (
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/protocol.h
- COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/env.py PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR} python ${CMAKE_CURRENT_SOURCE_DIR}/src/protocol.h.py > ${CMAKE_CURRENT_BINARY_DIR}/protocol.h
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/env.py PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR} ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/src/protocol.h.py > ${CMAKE_CURRENT_BINARY_DIR}/protocol.h
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/protocol.h.py
)
# Select driver
if(PN_WINAPI)
+ set (pn_io_impl src/windows/io.c)
+ set (pn_selector_impl src/windows/selector.c)
set (pn_driver_impl src/windows/driver.c)
else(PN_WINAPI)
+ set (pn_io_impl src/posix/io.c)
+ set (pn_selector_impl src/posix/selector.c)
set (pn_driver_impl src/posix/driver.c)
endif(PN_WINAPI)
@@ -187,8 +193,9 @@ if (CMAKE_COMPILER_IS_GNUCC)
if (ENABLE_WARNING_ERROR)
set (WERROR "-Werror")
endif (ENABLE_WARNING_ERROR)
- set (COMPILE_WARNING_FLAGS "${WERROR} -Wall -pedantic-errors -Wno-comment")
+ set (COMPILE_WARNING_FLAGS "${WERROR} -Wall -pedantic-errors")
if (NOT BUILD_WITH_CXX)
+ set (COMPILE_WARNING_FLAGS "${COMPILE_WARNING_FLAGS} -Wstrict-prototypes")
set (COMPILE_LANGUAGE_FLAGS "-std=c99")
set (COMPILE_PLATFORM_FLAGS "-std=gnu99")
@@ -220,25 +227,14 @@ if (SWIG_FOUND)
add_subdirectory(bindings)
endif (SWIG_FOUND)
-# Build the JavaScript language binding.
-# This is somewhat different to the other language bindings in that it does not use swig. It uses a C/C++ to
-# JavaScript cross-compiler called emscripten (https://github.com/kripken/emscripten). Emscripten takes C/C++
-# and compiles it into a highly optimisable subset of JavaScript called asm.js (http://asmjs.org/) that can be
-# aggressively optimised and run at near-native speed (usually between 1.5 to 10 times slower than native C/C++).
-option("BUILD_JAVASCRIPT" "Build JavaScript language binding" ON)
-if (BUILD_JAVASCRIPT)
- find_package(Emscripten)
- if (EMSCRIPTEN_FOUND)
- add_subdirectory(bindings/javascript)
- endif (EMSCRIPTEN_FOUND)
-endif (BUILD_JAVASCRIPT)
-
add_subdirectory(docs/api)
add_subdirectory(docs/man)
add_subdirectory(../examples/messenger/c examples/messenger/c)
add_subdirectory(../tests/tools/apps/c ../tests/tools/apps/c)
set (qpid-proton-platform
+ ${pn_io_impl}
+ ${pn_selector_impl}
${pn_driver_impl}
src/platform.c
${pn_driver_ssl_impl}
@@ -262,6 +258,7 @@ set (qpid-proton-core
src/dispatcher/dispatcher.c
src/engine/engine.c
+ src/engine/event.c
src/transport/transport.c
src/message/message.c
src/sasl/sasl.c
@@ -270,6 +267,7 @@ set (qpid-proton-core
src/messenger/subscription.c
src/messenger/store.c
src/messenger/transform.c
+ src/selectable.c
${CMAKE_CURRENT_BINARY_DIR}/encodings.h
${CMAKE_CURRENT_BINARY_DIR}/protocol.h
@@ -432,11 +430,13 @@ set (env_py "${CMAKE_CURRENT_SOURCE_DIR}
find_program(VALGRIND valgrind DOC "Location of the valgrind program")
option(ENABLE_VALGRIND "Use valgrind to detect run-time problems" ON)
-if (ENABLE_VALGRIND AND NOT VALGRIND)
- message(STATUS "Can't locate the valgrind command; no run-time error detection")
-else (ENABLE_VALGRIND AND NOT VALGRIND)
- set (VALGRIND_ENV "VALGRIND=1")
-endif (ENABLE_VALGRIND AND NOT VALGRIND)
+if (ENABLE_VALGRIND)
+ if (VALGRIND STREQUAL VALGRIND-NOTFOUND)
+ message(STATUS "Can't locate the valgrind command; no run-time error detection")
+ else (VALGRIND STREQUAL VALGRIND-NOTFOUND)
+ set (VALGRIND_ENV "VALGRIND=${VALGRIND}")
+ endif (VALGRIND STREQUAL VALGRIND-NOTFOUND)
+endif (ENABLE_VALGRIND)
# c tests:
@@ -454,7 +454,7 @@ set_path (py_pythonpath "$ENV{PYTHONPATH
if (CMAKE_SYSTEM_NAME STREQUAL Windows)
set_path (py_pythonpath "${py_pythonpath}:${py_bin}${bld_suffix}")
endif (CMAKE_SYSTEM_NAME STREQUAL Windows)
-add_test (python-test python ${env_py}
+add_test (python-test ${PYTHON_EXECUTABLE} ${env_py}
"PATH=${py_path}" "PYTHONPATH=${py_pythonpath}" ${VALGRIND_ENV}
${PYTHON_EXECUTABLE} "${py_root}/proton-test")
set_tests_properties(python-test PROPERTIES PASS_REGULAR_EXPRESSION "Totals: .* 0 failed")
@@ -470,7 +470,7 @@ if (ruby_exe)
set (rb_rubylib "${rb_root}:${rb_src}:${rb_bin}:${rb_bld}:${rb_lib}")
# ruby unit tests: tests/ruby/proton-test
- add_test (ruby-unit-test python ${env_py} "PATH=${rb_path}" "RUBYLIB=${rb_rubylib}"
+ add_test (ruby-unit-test ${PYTHON_EXECUTABLE} ${env_py} "PATH=${rb_path}" "RUBYLIB=${rb_rubylib}"
"${rb_root}/proton-test")
# ruby spec tests
@@ -478,7 +478,7 @@ if (ruby_exe)
if (rspec_exe)
add_test (NAME ruby-spec-test
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bindings/ruby
- COMMAND python ${env_py} "PATH=${rb_path}" "RUBYLIB=${rb_rubylib}"
+ COMMAND ${PYTHON_EXECUTABLE} ${env_py} "PATH=${rb_path}" "RUBYLIB=${rb_rubylib}"
${rspec_exe})
else(rspec_exe)
Modified: qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/CMakeLists.txt?rev=1577483&r1=1577482&r2=1577483&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/CMakeLists.txt (original)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/CMakeLists.txt Fri Mar 14 11:20:47 2014
@@ -20,7 +20,7 @@
include(UseSWIG)
# Add any new bindings here - the directory name must be the same as the binding name
-set (BINDINGS python ruby php perl java)
+set (BINDINGS python ruby php perl)
set (BINDING_DEPS qpid-proton)
@@ -59,13 +59,6 @@ if (PERLLIBS_FOUND)
set (DEFAULT_PERL ON)
endif (PERLLIBS_FOUND)
-if (JAVA_FOUND)
- find_package( JNI )
- if (JNI_FOUND OR JNI_LIBRARIES)
- set (DEFAULT_JAVA ON)
- endif ()
-endif ()
-
# Shouldn't need to modify below here when adding new language binding
foreach(BINDING ${BINDINGS})
string(TOUPPER ${BINDING} UBINDING)
Modified: qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/CMakeLists.txt?rev=1577483&r1=1577482&r2=1577483&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/CMakeLists.txt (original)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/CMakeLists.txt Fri Mar 14 11:20:47 2014
@@ -22,15 +22,29 @@ include_directories("${PERL_INCLUDE_PATH
# Need to pass in the same compiler flags used to build Perl itself
execute_process(COMMAND perl -MConfig -e "print \$Config{ccflags}"
OUTPUT_VARIABLE PERLCFLAGS)
-if (NOT PERL_VENDORLIB)
+
+if (ASK_PERL)
+
execute_process(COMMAND perl -V:installvendorlib
- OUTPUT_VARIABLE PERL_VENDORLIB_OUTPUT_VARIABLE
- RESULT_VARIABLE PERL_VENDORLIB_RESULT_VARIABLE)
- if (NOT PERL_VENDORLIB_RESULT_VARIABLE)
- string(REGEX REPLACE "install[a-z]+='([^']+)'.*" "\\1" PERL_VENDORLIB ${PERL_VENDORLIB_OUTPUT_VARIABLE})
- file(TO_CMAKE_PATH "${PERL_VENDORLIB}" PERL_VENDORLIB)
- endif (NOT PERL_VENDORLIB_RESULT_VARIABLE)
-endif (NOT PERL_VENDORLIB)
+ OUTPUT_VARIABLE PERL_ARCHLIB_OUTPUT_VARIABLE
+ RESULT_VARIABLE PERL_ARCHLIB_RESULT_VARIABLE)
+ if (NOT PERL_ARCHLIB_RESULT_VARIABLE)
+ string(REGEX REPLACE "install[a-z]+='([^']+)'.*" "\\1" PERL_ARCHLIB ${PERL_ARCHLIB_OUTPUT_VARIABLE})
+ file(TO_CMAKE_PATH "${PERL_ARCHLIB}" PERL_ARCHLIB_DIR)
+ endif (NOT PERL_ARCHLIB_RESULT_VARIABLE)
+
+ execute_process(COMMAND perl -V:installsitelib
+ OUTPUT_VARIABLE PERL_SITELIB_OUTPUT_VARIABLE
+ RESULT_VARIABLE PERL_SITELIB_RESULT_VARIABLE)
+ if (NOT PERL_SITELIB_RESULT_VARIABLE)
+ string(REGEX REPLACE "install[a-z]+='([^']+)'.*" "\\1" PERL_SITELIB ${PERL_SITELIB_OUTPUT_VARIABLE})
+ file(TO_CMAKE_PATH "${PERL_SITELIB}" PERL_SITELIB_DIR)
+ endif (NOT PERL_SITELIB_RESULT_VARIABLE)
+
+else (ASK_PERL)
+ set (PERL_ARCHLIB_DIR ${BINDINGS_DIR}/perl/lib${LIB_SUFFIX} CACHE PATH "Perl platform code")
+ set (PERL_SITELIB_DIR ${BINDINGS_DIR}/perl/ CACHE PATH "Perl code")
+endif (ASK_PERL)
set (CMAKE_C_FLAGS ${PERLCFLAGS})
@@ -39,45 +53,32 @@ swig_link_libraries(cproton_perl ${BINDI
if ((${CMAKE_MAJOR_VERSION} EQUAL 2) AND (${CMAKE_MINOR_VERSION} LESS 8))
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cproton_perl.so
- DESTINATION ${PERL_ARCHLIB}
+ DESTINATION ${PERL_ARCHLIB_DIR}
COMPONENT ${QPID_COMPONENT_CLIENT}
)
else()
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libcproton_perl.so
RENAME cproton_perl.so
- DESTINATION ${PERL_ARCHLIB}
+ DESTINATION ${PERL_ARCHLIB_DIR}
COMPONENT ${QPID_COMPONENT_CLIENT}
)
endif ((${CMAKE_MAJOR_VERSION} EQUAL 2) AND (${CMAKE_MINOR_VERSION} LESS 8))
-set(PERL_LIBRARIES
- lib/qpid/proton/array_helper.pm
- lib/qpid/proton/Constants.pm
- lib/qpid/proton/Data.pm
- lib/qpid/proton/Mapping.pm
- lib/qpid/proton/Message.pm
- lib/qpid/proton/Messenger.pm
-)
-
# get the perl vendor library if it's not already defined
-#if (NOT PERL_VENDORLIB)
+#if (NOT PERL_ARCHLIB)
# execute_process(COMMAND ${PERL_EXECUTABLE} "-V:installvendorlib"
-# OUTPUT_VARIABLE PERL_VENDORLIB_OUTPUT_VARIABLE
-# RESULT_VARIABLE PERL_VENDORLIB_RESULT_VARIABLE)
-#endif (!DEFINED PERL_VENDORLIB)
+# OUTPUT_VARIABLE PERL_ARCHLIB_OUTPUT_VARIABLE
+# RESULT_VARIABLE PERL_ARCHLIB_RESULT_VARIABLE)
+#endif (!DEFINED PERL_ARCHLIB)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cproton_perl.pm
- DESTINATION ${PERL_ARCHLIB}
+ DESTINATION ${PERL_ARCHLIB_DIR}
COMPONENT Perl)
install(FILES lib/qpid_proton.pm
- DESTINATION ${PERL_VENDORLIB}
- COMPONENT Perl)
-
-INSTALL(FILES lib/qpid/proton.pm
- DESTINATION ${PERL_VENDORLIB}/qpid
+ DESTINATION ${PERL_SITELIB_DIR}
COMPONENT Perl)
-INSTALL(FILES ${PERL_LIBRARIES}
- DESTINATION ${PERL_VENDORLIB}/qpid/proton
+INSTALL(DIRECTORY lib/qpid
+ DESTINATION ${PERL_SITELIB_DIR}
COMPONENT Perl)
Modified: qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid/proton/Constants.pm
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid/proton/Constants.pm?rev=1577483&r1=1577482&r2=1577483&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid/proton/Constants.pm (original)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid/proton/Constants.pm Fri Mar 14 11:20:47 2014
@@ -164,4 +164,6 @@ use constant {
UNKNOWN => undef,
};
+package qpid::proton::Constants;
+
1;
Modified: qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid/proton/ExceptionHandling.pm
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid/proton/ExceptionHandling.pm?rev=1577483&r1=1577482&r2=1577483&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid/proton/ExceptionHandling.pm (original)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid/proton/ExceptionHandling.pm Fri Mar 14 11:20:47 2014
@@ -33,4 +33,6 @@ sub check_for_error {
}
}
+package qpid::proton::ExceptionHandling;
+
1;
Modified: qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid_proton.pm
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid_proton.pm?rev=1577483&r1=1577482&r2=1577483&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid_proton.pm (original)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/perl/lib/qpid_proton.pm Fri Mar 14 11:20:47 2014
@@ -31,5 +31,7 @@ use qpid::proton::Message;
use qpid::proton;
+package qpid_proton;
+
1;
Modified: qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/php/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/php/CMakeLists.txt?rev=1577483&r1=1577482&r2=1577483&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/php/CMakeLists.txt (original)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/php/CMakeLists.txt Fri Mar 14 11:20:47 2014
@@ -39,35 +39,44 @@ set_target_properties(cproton
PREFIX ""
LINK_FLAGS "${ALLOW_UNDEFINED}")
-execute_process(COMMAND ${PHP_CONFIG_EXE} --extension-dir
- OUTPUT_VARIABLE PHP_EXT_DIR_DEFAULT
- OUTPUT_STRIP_TRAILING_WHITESPACE)
-execute_process(COMMAND ${PHP_CONFIG_EXE} --prefix
- OUTPUT_VARIABLE QPHP_PREFIX
- OUTPUT_STRIP_TRAILING_WHITESPACE)
-execute_process(COMMAND ${PHP_CONFIG_EXE} --config-options
- OUTPUT_VARIABLE PHP_OPTS
- OUTPUT_STRIP_TRAILING_WHITESPACE)
-
-set(GET_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/get_include_dir.php)
-execute_process(COMMAND ${PHP_EXE} -n ${GET_INCLUDE_DIR} ${QPHP_PREFIX}
- OUTPUT_VARIABLE PHP_INCLUDE_DIR_DEFAULT
- OUTPUT_STRIP_TRAILING_WHITESPACE)
-
-if ("${PHP_INCLUDE_DIR_DEFAULT}" STREQUAL "")
- set(PHP_INCLUDE_DIR_DEFAULT "/usr/share/php")
-endif()
-
-string(REGEX MATCH "--with-config-file-scan-dir=([^ ]*)" PHP_OPT_MATCH ${PHP_OPTS})
-set (PHP_INI_DIR_DEFAULT ${CMAKE_MATCH_1})
-
-if ("${PHP_INI_DIR_DEFAULT}" STREQUAL "")
- set(PHP_INI_DIR_DEFAULT "/etc/php.d")
-endif()
-
-set(PHP_EXT_DIR ${PHP_EXT_DIR_DEFAULT} CACHE PATH "PHP extensions directory.")
-set(PHP_INI_DIR ${PHP_INI_DIR_DEFAULT} CACHE PATH "Directory scanned for PHP ini files.")
-set(PHP_INCLUDE_DIR ${PHP_INCLUDE_DIR_DEFAULT} CACHE PATH "PHP include directory.")
+if (ASK_PHP)
+ execute_process(COMMAND ${PHP_CONFIG_EXE} --extension-dir
+ OUTPUT_VARIABLE PHP_EXT_DIR_DEFAULT
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ execute_process(COMMAND ${PHP_CONFIG_EXE} --prefix
+ OUTPUT_VARIABLE QPHP_PREFIX
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ execute_process(COMMAND ${PHP_CONFIG_EXE} --config-options
+ OUTPUT_VARIABLE PHP_OPTS
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ set(GET_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/get_include_dir.php)
+ execute_process(COMMAND ${PHP_EXE} -n ${GET_INCLUDE_DIR} ${QPHP_PREFIX}
+ OUTPUT_VARIABLE PHP_INCLUDE_DIR_DEFAULT
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ if ("${PHP_INCLUDE_DIR_DEFAULT}" STREQUAL "")
+ set(PHP_INCLUDE_DIR_DEFAULT "/usr/share/php")
+ endif()
+
+ string(REGEX MATCH "--with-config-file-scan-dir=([^ ]*)" PHP_OPT_MATCH ${PHP_OPTS})
+ set (PHP_INI_DIR_DEFAULT ${CMAKE_MATCH_1})
+
+ if ("${PHP_INI_DIR_DEFAULT}" STREQUAL "")
+ set(PHP_INI_DIR_DEFAULT "/etc/php.d")
+ endif()
+
+ set(PHP_EXT_DIR ${PHP_EXT_DIR_DEFAULT} CACHE PATH "PHP extensions directory.")
+ set(PHP_INI_DIR ${PHP_INI_DIR_DEFAULT} CACHE PATH "Directory scanned for PHP ini files.")
+ set(PHP_INCLUDE_DIR ${PHP_INCLUDE_DIR_DEFAULT} CACHE PATH "PHP include directory.")
+
+else (ASK_PHP)
+
+ set (PHP_EXT_DIR ${BINDINGS_DIR}/php CACHE PATH "PHP extensions directory")
+ set (PHP_INCLUDE_DIR ${BINDINGS_DIR}/php/include CACHE PATH "PHP include directory")
+ set (PHP_INI_DIR ${BINDINGS_DIR}/php/ini CACHE PATH "PHP ini directory")
+
+endif (ASK_PHP)
install(TARGETS cproton
DESTINATION ${PHP_EXT_DIR}
Propchange: qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Mar 14 11:20:47 2014
@@ -0,0 +1 @@
+*.class
Modified: qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/CMakeLists.txt?rev=1577483&r1=1577482&r2=1577483&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/CMakeLists.txt (original)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/CMakeLists.txt Fri Mar 14 11:20:47 2014
@@ -30,12 +30,19 @@ set_target_properties(_cproton
find_package(PythonInterp REQUIRED)
-if (NOT PYTHON_SITEARCH_PACKAGES)
- execute_process(COMMAND ${PYTHON_EXECUTABLE}
- -c "from distutils.sysconfig import get_python_lib; print get_python_lib(True)"
- OUTPUT_VARIABLE PYTHON_SITEARCH_PACKAGES
- OUTPUT_STRIP_TRAILING_WHITESPACE)
-endif ()
+if (ASK_PYTHON)
+
+ if (NOT PYTHON_SITEARCH_PACKAGES)
+ execute_process(COMMAND ${PYTHON_EXECUTABLE}
+ -c "from distutils.sysconfig import get_python_lib; print get_python_lib(True)"
+ OUTPUT_VARIABLE PYTHON_ARCHLIB_DIR
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ else (NOT PYTHON_SITEARCH_PACKAGES)
+ set (PYTHON_ARCHLIB_DIR "${PYTHON_SITEARCH_PACKAGES}")
+ endif ()
+else (ASK_PYTHON)
+ set (PYTHON_ARCHLIB_DIR ${BINDINGS_DIR}/python/lib${LIB_SUFFIX} CACHE PATH "Python platform code")
+endif (ASK_PYTHON)
install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} -m py_compile cproton.py
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})")
@@ -64,8 +71,8 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR
${CMAKE_CURRENT_SOURCE_DIR}/proton.py
${CMAKE_CURRENT_SOURCE_DIR}/proton.pyc
${CMAKE_CURRENT_SOURCE_DIR}/proton.pyo
- DESTINATION ${PYTHON_SITEARCH_PACKAGES}
+ DESTINATION ${PYTHON_ARCHLIB_DIR}
COMPONENT Python)
install(TARGETS _cproton
- DESTINATION ${PYTHON_SITEARCH_PACKAGES}
+ DESTINATION ${PYTHON_ARCHLIB_DIR}
COMPONENT Python)
Modified: qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/proton.py
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/proton.py?rev=1577483&r1=1577482&r2=1577483&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/proton.py (original)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/proton.py Fri Mar 14 11:20:47 2014
@@ -6,9 +6,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
@@ -31,6 +31,7 @@ The proton APIs consist of the following
"""
from cproton import *
+import weakref
try:
import uuid
except ImportError:
@@ -241,13 +242,15 @@ class Messenger(object):
def __init__(self, name=None):
"""
Construct a new L{Messenger} with the given name. The name has
- global scope. If a NULL name is supplied, a L{uuid.UUID} based
- name will be chosen.
+ global scope. If a NULL name is supplied, a UUID based name will
+ be chosen.
@type name: string
@param name: the name of the messenger or None
+
"""
self._mng = pn_messenger(name)
+ self._selectables = {}
def __del__(self):
"""
@@ -366,6 +369,20 @@ exception of L{work}. Currently, the af
L{send}, L{recv}, and L{stop}.
""")
+ def _is_passive(self):
+ return pn_messenger_is_passive(self._mng)
+
+ def _set_passive(self, b):
+ self._check(pn_messenger_set_passive(self._mng, b))
+
+ passive = property(_is_passive, _set_passive,
+ doc="""
+When passive is set to true, Messenger will not attempt to perform I/O
+internally. In this mode it is necessary to use the selectables API to
+drive any I/O needed to perform requested actions. In this mode
+Messenger will never block.
+""")
+
def _get_incoming_window(self):
return pn_messenger_get_incoming_window(self._mng)
@@ -446,7 +463,7 @@ first message.
"""
sub_impl = pn_messenger_subscribe(self._mng, source)
if not sub_impl:
- self._check(PN_ERR)
+ self._check(pn_error_code(pn_messenger_error(self._mng)))
return Subscription(sub_impl)
def put(self, message):
@@ -495,7 +512,7 @@ first message.
@type tracker: tracker
@param tracker: the tracker whose status is to be retrieved
- @return true if delivery is still buffered
+ @return: true if delivery is still buffered
"""
return pn_messenger_buffered(self._mng, tracker);
@@ -722,6 +739,26 @@ first message.
"""
self._check(pn_messenger_rewrite(self._mng, pattern, address))
+ def selectable(self):
+ impl = pn_messenger_selectable(self._mng)
+ if impl:
+ fd = pn_selectable_fd(impl)
+ sel = self._selectables.get(fd, None)
+ if sel is None:
+ sel = Selectable(self, impl)
+ self._selectables[fd] = sel
+ return sel
+ else:
+ return None
+
+ @property
+ def deadline(self):
+ tstamp = pn_messenger_deadline(self._mng)
+ if tstamp:
+ return float(tstamp)/1000
+ else:
+ return None
+
class Message(object):
"""
The L{Message} class is a mutable holder of message content.
@@ -1099,6 +1136,75 @@ class Subscription(object):
def address(self):
return pn_subscription_address(self._impl)
+class Selectable(object):
+
+ def __init__(self, messenger, impl):
+ self.messenger = messenger
+ self._impl = impl
+
+ def fileno(self):
+ if not self._impl: raise ValueError("selectable freed")
+ return pn_selectable_fd(self._impl)
+
+ @property
+ def capacity(self):
+ if not self._impl: raise ValueError("selectable freed")
+ return pn_selectable_capacity(self._impl)
+
+ @property
+ def pending(self):
+ if not self._impl: raise ValueError("selectable freed")
+ return pn_selectable_pending(self._impl)
+
+ @property
+ def deadline(self):
+ if not self._impl: raise ValueError("selectable freed")
+ tstamp = pn_selectable_deadline(self._impl)
+ if tstamp:
+ return float(tstamp)/1000
+ else:
+ return None
+
+ def readable(self):
+ if not self._impl: raise ValueError("selectable freed")
+ pn_selectable_readable(self._impl)
+
+ def writable(self):
+ if not self._impl: raise ValueError("selectable freed")
+ pn_selectable_writable(self._impl)
+
+ def expired(self):
+ if not self._impl: raise ValueError("selectable freed")
+ pn_selectable_expired(self._impl)
+
+ def _is_registered(self):
+ if not self._impl: raise ValueError("selectable freed")
+ return pn_selectable_is_registered(self._impl)
+
+ def _set_registered(self, registered):
+ if not self._impl: raise ValueError("selectable freed")
+ pn_selectable_set_registered(self._impl, registered)
+
+ registered = property(_is_registered, _set_registered,
+ doc="""
+The registered property may be get/set by an I/O polling system to
+indicate whether the fd has been registered or not.
+""")
+
+ @property
+ def is_terminal(self):
+ if not self._impl: return True
+ return pn_selectable_is_terminal(self._impl)
+
+ def free(self):
+ if self._impl:
+ del self.messenger._selectables[self.fileno()]
+ pn_selectable_free(self._impl)
+ self._impl = None
+
+ def __del__(self):
+ self.free()
+
class DataException(ProtonException):
"""
The DataException class is the root of the Data exception hierarchy.
@@ -2122,30 +2228,41 @@ def obj2dat(obj, dimpl):
d = Data(dimpl)
d.put_object(obj)
-def wrap_connection(conn):
- if not conn: return None
- ctx = pn_connection_get_context(conn)
- if ctx: return ctx
- wrapper = Connection(_conn=conn)
- return wrapper
-
class Connection(Endpoint):
+ @staticmethod
+ def _wrap_connection(c_conn):
+ """Maintain only a single instance of this class for each Connection
+ object that exists in the the C Engine. This is done by storing a (weak)
+ reference to the python instance in the context field of the C object.
+ """
+ if not c_conn: return None
+ py_conn = pn_connection_get_context(c_conn)
+ if py_conn: return py_conn
+ wrapper = Connection(_conn=c_conn)
+ return wrapper
+
def __init__(self, _conn=None):
Endpoint.__init__(self)
if _conn:
self._conn = _conn
else:
self._conn = pn_connection()
- pn_connection_set_context(self._conn, self)
+ pn_connection_set_context(self._conn, self)
self.offered_capabilities = None
self.desired_capabilities = None
self.properties = None
+ self._sessions = set()
def __del__(self):
- if hasattr(self, "_conn"):
+ if hasattr(self, "_conn") and self._conn:
+ # pn_connection_free will release all child sessions in the C Engine, so
+ # free all child python Sessions to avoid dangling references
+ if hasattr(self, "_sessions") and self._sessions:
+ for s in self._sessions:
+ s._release()
+ pn_connection_set_context(self._conn, None)
pn_connection_free(self._conn)
- del self._conn
def _check(self, err):
if err < 0:
@@ -2160,6 +2277,15 @@ class Connection(Endpoint):
def _get_remote_cond_impl(self):
return pn_connection_remote_condition(self._conn)
+ def collect(self, collector):
+ if collector is None:
+ pn_connection_collect(self._conn, None)
+ else:
+ pn_connection_collect(self._conn, collector._impl)
+ # XXX: we can't let coll go out of scope or the connection will be
+ # pointing to garbage
+ self._collector = collector
+
def _get_container(self):
return pn_connection_get_container(self._conn)
def _set_container(self, name):
@@ -2211,17 +2337,17 @@ class Connection(Endpoint):
return pn_connection_state(self._conn)
def session(self):
- return wrap_session(pn_session(self._conn))
+ return Session._wrap_session(pn_session(self._conn))
def session_head(self, mask):
- return wrap_session(pn_session_head(self._conn, mask))
+ return Session._wrap_session(pn_session_head(self._conn, mask))
def link_head(self, mask):
- return wrap_link(pn_link_head(self._conn, mask))
+ return Link._wrap_link(pn_link_head(self._conn, mask))
@property
def work_head(self):
- return wrap_delivery(pn_work_head(self._conn))
+ return Delivery._wrap_delivery(pn_work_head(self._conn))
@property
def error(self):
@@ -2230,26 +2356,47 @@ class Connection(Endpoint):
class SessionException(ProtonException):
pass
-def wrap_session(ssn):
- if ssn is None: return None
- ctx = pn_session_get_context(ssn)
- if ctx:
- return ctx
- else:
- wrapper = Session(ssn)
- pn_session_set_context(ssn, wrapper)
- return wrapper
-
class Session(Endpoint):
+ @staticmethod
+ def _wrap_session(c_ssn):
+ """Maintain only a single instance of this class for each Session object that
+ exists in the C Engine.
+ """
+ if c_ssn is None: return None
+ py_ssn = pn_session_get_context(c_ssn)
+ if py_ssn: return py_ssn
+ wrapper = Session(c_ssn)
+ return wrapper
+
def __init__(self, ssn):
Endpoint.__init__(self)
self._ssn = ssn
-
- def __del__(self):
- if hasattr(self, "_ssn"):
+ pn_session_set_context(self._ssn, self)
+ self._links = set()
+ self.connection._sessions.add(self)
+
+ def _release(self):
+ """Release the underlying C Engine resource."""
+ if self._ssn:
+ # pn_session_free will release all child links in the C Engine, so free
+ # all child python Links to avoid dangling references
+ for l in self._links:
+ l._release()
+ pn_session_set_context(self._ssn, None)
pn_session_free(self._ssn)
- del self._ssn
+ self._ssn = None
+
+ def free(self):
+ """Release the Session, freeing its resources.
+
+ Call this when you no longer need the session. This will allow the
+ session's resources to be reclaimed. Once called, you should no longer
+ reference the session.
+
+ """
+ self.connection._sessions.remove(self)
+ self._release()
def _get_cond_impl(self):
return pn_session_condition(self._ssn)
@@ -2281,7 +2428,7 @@ class Session(Endpoint):
pn_session_close(self._ssn)
def next(self, mask):
- return wrap_session(pn_session_next(self._ssn, mask))
+ return Session._wrap_session(pn_session_next(self._ssn, mask))
@property
def state(self):
@@ -2289,30 +2436,17 @@ class Session(Endpoint):
@property
def connection(self):
- return wrap_connection(pn_session_connection(self._ssn))
+ return Connection._wrap_connection(pn_session_connection(self._ssn))
def sender(self, name):
- return wrap_link(pn_sender(self._ssn, name))
+ return Link._wrap_link(pn_sender(self._ssn, name))
def receiver(self, name):
- return wrap_link(pn_receiver(self._ssn, name))
+ return Link._wrap_link(pn_receiver(self._ssn, name))
class LinkException(ProtonException):
pass
-def wrap_link(link):
- if link is None: return None
- ctx = pn_link_get_context(link)
- if ctx:
- return ctx
- else:
- if pn_link_is_sender(link):
- wrapper = Sender(link)
- else:
- wrapper = Receiver(link)
- pn_link_set_context(link, wrapper)
- return wrapper
-
class Link(Endpoint):
SND_UNSETTLED = PN_SND_UNSETTLED
@@ -2322,14 +2456,42 @@ class Link(Endpoint):
RCV_FIRST = PN_RCV_FIRST
RCV_SECOND = PN_RCV_SECOND
- def __init__(self, link):
- Endpoint.__init__(self)
- self._link = link
+ @staticmethod
+ def _wrap_link(c_link):
+ """Maintain only a single instance of this class for each Session object that
+ exists in the C Engine.
+ """
+ if c_link is None: return None
+ py_link = pn_link_get_context(c_link)
+ if py_link: return py_link
+ if pn_link_is_sender(c_link):
+ wrapper = Sender(c_link)
+ else:
+ wrapper = Receiver(c_link)
+ return wrapper
- def __del__(self):
- if hasattr(self, "_link"):
+ def __init__(self, c_link):
+ Endpoint.__init__(self)
+ self._link = c_link
+ pn_link_set_context(self._link, self)
+ self._deliveries = set()
+ self.session._links.add(self)
+
+ def _release(self):
+ """Release the underlying C Engine resource."""
+ if self._link:
+ # pn_link_free will settle all child deliveries in the C Engine, so free
+ # all child python deliveries to avoid dangling references
+ for d in self._deliveries:
+ d._release()
+ pn_link_set_context(self._link, None)
pn_link_free(self._link)
- del self._link
+ self._link = None
+
+ def free(self):
+ """Release the Link, freeing its resources"""
+ self.session._links.remove(self)
+ self._release()
def _check(self, err):
if err < 0:
@@ -2372,14 +2534,14 @@ class Link(Endpoint):
@property
def session(self):
- return wrap_session(pn_link_session(self._link))
+ return Session._wrap_session(pn_link_session(self._link))
def delivery(self, tag):
- return wrap_delivery(pn_delivery(self._link, tag))
+ return Delivery._wrap_delivery(pn_delivery(self._link, tag))
@property
def current(self):
- return wrap_delivery(pn_link_current(self._link))
+ return Delivery._wrap_delivery(pn_link_current(self._link))
def advance(self):
return pn_link_advance(self._link)
@@ -2401,7 +2563,7 @@ class Link(Endpoint):
return pn_link_queued(self._link)
def next(self, mask):
- return wrap_link(pn_link_next(self._link, mask))
+ return Link._wrap_link(pn_link_next(self._link, mask))
@property
def name(self):
@@ -2524,9 +2686,11 @@ class Terminus(object):
def copy(self, src):
self._check(pn_terminus_copy(self._impl, src._impl))
-
class Sender(Link):
+ def __init__(self, c_link):
+ super(Sender, self).__init__(c_link)
+
def offered(self, n):
pn_link_offered(self._link, n)
@@ -2535,6 +2699,9 @@ class Sender(Link):
class Receiver(Link):
+ def __init__(self, c_link):
+ super(Receiver, self).__init__(c_link)
+
def flow(self, n):
pn_link_flow(self._link, n)
@@ -2552,14 +2719,6 @@ class Receiver(Link):
def draining(self):
return pn_link_draining(self._link)
-def wrap_delivery(dlv):
- if not dlv: return None
- ctx = pn_delivery_get_context(dlv)
- if ctx: return ctx
- wrapper = Delivery(dlv)
- pn_delivery_set_context(dlv, wrapper)
- return wrapper
-
class Disposition(object):
RECEIVED = PN_RECEIVED
@@ -2647,10 +2806,30 @@ class Delivery(object):
RELEASED = Disposition.RELEASED
MODIFIED = Disposition.MODIFIED
+ @staticmethod
+ def _wrap_delivery(c_dlv):
+ """Maintain only a single instance of this class for each Delivery object that
+ exists in the C Engine.
+ """
+ if not c_dlv: return None
+ py_dlv = pn_delivery_get_context(c_dlv)
+ if py_dlv: return py_dlv
+ wrapper = Delivery(c_dlv)
+ return wrapper
+
def __init__(self, dlv):
self._dlv = dlv
+ pn_delivery_set_context(self._dlv, self)
self.local = Disposition(pn_delivery_local(self._dlv), True)
self.remote = Disposition(pn_delivery_remote(self._dlv), False)
+ self.link._deliveries.add(self)
+
+ def _release(self):
+ """Release the underlying C Engine resource."""
+ if self._dlv:
+ pn_delivery_set_context(self._dlv, None)
+ pn_delivery_settle(self._dlv)
+ self._dlv = None
@property
def tag(self):
@@ -2695,15 +2874,17 @@ class Delivery(object):
return pn_delivery_settled(self._dlv)
def settle(self):
- pn_delivery_settle(self._dlv)
+ """Release the delivery"""
+ self.link._deliveries.remove(self)
+ self._release()
@property
def work_next(self):
- return wrap_delivery(pn_work_next(self._dlv))
+ return Delivery._wrap_delivery(pn_work_next(self._dlv))
@property
def link(self):
- return wrap_link(pn_delivery_link(self._dlv))
+ return Link._wrap_link(pn_delivery_link(self._dlv))
class TransportException(ProtonException):
pass
@@ -2746,7 +2927,15 @@ class Transport(object):
return err
def bind(self, connection):
+ """Assign a connection to the transport"""
self._check(pn_transport_bind(self._trans, connection._conn))
+ # keep python connection from being garbage collected:
+ self._connection = connection
+
+ def unbind(self):
+ """Release the connection"""
+ self._check(pn_transport_unbind(self._trans))
+ self._connection = None
def trace(self, n):
pn_transport_trace(self._trans, n)
@@ -2829,6 +3018,21 @@ Sets the maximum size for received frame
def remote_max_frame_size(self):
return pn_transport_get_remote_max_frame(self._trans)
+ def _get_channel_max(self):
+ return pn_transport_get_channel_max(self._trans)
+
+ def _set_channel_max(self, value):
+ pn_transport_set_channel_max(self._trans, value)
+
+ channel_max = property(_get_channel_max, _set_channel_max,
+ doc="""
+Sets the maximum channel that may be used on the transport.
+""")
+
+ @property
+ def remote_channel_max(self):
+ return pn_transport_remote_channel_max(self._trans)
+
# AMQP 1.0 idle-time-out
def _get_idle_timeout(self):
msec = pn_transport_get_idle_timeout(self._trans)
@@ -2839,7 +3043,7 @@ Sets the maximum size for received frame
idle_timeout = property(_get_idle_timeout, _set_idle_timeout,
doc="""
-The idle timeout of the connection (in milliseconds).
+The idle timeout of the connection (float, in seconds).
""")
@property
@@ -3057,6 +3261,57 @@ class SSLSessionDetails(object):
return self._session_id
+class Collector:
+
+ def __init__(self):
+ self._impl = pn_collector()
+
+ def peek(self):
+ event = pn_collector_peek(self._impl)
+ if event is None:
+ return None
+
+ tpi = pn_event_transport(event)
+ if tpi:
+ tp = Transport(tpi)
+ else:
+ tp = None
+ return Event(type=pn_event_type(event),
+ connection=Connection._wrap_connection(pn_event_connection(event)),
+ session=Session._wrap_session(pn_event_session(event)),
+ link=Link._wrap_link(pn_event_link(event)),
+ delivery=Delivery._wrap_delivery(pn_event_delivery(event)),
+ transport=tp)
+
+ def pop(self):
+ pn_collector_pop(self._impl)
+
+ def __del__(self):
+ pn_collector_free(self._impl)
+
+class Event:
+
+ CONNECTION_STATE = PN_CONNECTION_STATE
+ SESSION_STATE = PN_SESSION_STATE
+ LINK_STATE = PN_LINK_STATE
+ LINK_FLOW = PN_LINK_FLOW
+ DELIVERY = PN_DELIVERY
+ TRANSPORT = PN_TRANSPORT
+
+ def __init__(self, type, connection, session, link, delivery, transport):
+ self.type = type
+ self.connection = connection
+ self.session = session
+ self.link = link
+ self.delivery = delivery
+ self.transport = transport
+
+ def __repr__(self):
+ objects = [self.connection, self.session, self.link, self.delivery,
+ self.transport]
+ return "%s(%s)" % (pn_event_type_name(self.type),
+ ", ".join([str(o) for o in objects if o is not None]))
+
###
# Driver
###
@@ -3067,27 +3322,55 @@ class DriverException(ProtonException):
"""
pass
+class Connector(object):
-def wrap_connector(cxtr):
- if not cxtr: return None
- ctx = pn_connector_context(cxtr)
- if ctx: return ctx
- wrapper = Connector(_cxtr=cxtr)
- pn_connector_set_context(cxtr, wrapper)
- return wrapper
+ @staticmethod
+ def _wrap_connector(c_cxtr, py_driver=None):
+ """Maintain only a single instance of this class for each Connector object that
+ exists in the C Driver.
+ """
+ if not c_cxtr: return None
+ py_cxtr = pn_connector_context(c_cxtr)
+ if py_cxtr: return py_cxtr
+ wrapper = Connector(_cxtr=c_cxtr, _py_driver=py_driver)
+ return wrapper
-class Connector(object):
- def __init__(self, _cxtr):
+ def __init__(self, _cxtr, _py_driver):
self._cxtr = _cxtr
+ assert(_py_driver)
+ self._driver = weakref.ref(_py_driver)
+ pn_connector_set_context(self._cxtr, self)
+ self._connection = None
+ self._driver()._connectors.add(self)
+
+ def _release(self):
+ """Release the underlying C Engine resource."""
+ if self._cxtr:
+ pn_connector_set_context(self._cxtr, None)
+ pn_connector_free(self._cxtr)
+ self._cxtr = None
+
+ def free(self):
+ """Release the Connector, freeing its resources.
+
+ Call this when you no longer need the Connector. This will allow the
+ connector's resources to be reclaimed. Once called, you should no longer
+ reference this connector.
+
+ """
+ self.connection = None
+ d = self._driver()
+ if d: d._connectors.remove(self)
+ self._release()
def next(self):
- return wrap_connector(pn_connector_next(self._cxtr))
+ return Connector._wrap_connector(pn_connector_next(self._cxtr))
def process(self):
pn_connector_process(self._cxtr)
def listener(self):
- return wrap_listener(pn_connector_listener(self._cxtr))
+ return Listener._wrap_listener(pn_connector_listener(self._cxtr))
def sasl(self):
## seems easier just to grab the SASL associated with the transport:
@@ -3111,34 +3394,64 @@ class Connector(object):
return pn_connector_closed(self._cxtr)
def _get_connection(self):
- return wrap_connection(pn_connector_connection(self._cxtr))
+ return self._connection
def _set_connection(self, conn):
- pn_connector_set_connection(self._cxtr, conn._conn)
+ if conn:
+ pn_connector_set_connection(self._cxtr, conn._conn)
+ else:
+ pn_connector_set_connection(self._cxtr, None)
+ self._connection = conn
+
connection = property(_get_connection, _set_connection,
doc="""
Associate a Connection with this Connector.
""")
-def wrap_listener(lsnr):
- if not lsnr: return None
- ctx = pn_listener_context(lsnr)
- if ctx: return ctx
- wrapper = Listener(_lsnr=lsnr)
- pn_listener_set_context(lsnr, wrapper)
- return wrapper
-
class Listener(object):
- def __init__(self, _lsnr=None):
+
+ @staticmethod
+ def _wrap_listener(c_lsnr, py_driver=None):
+ """Maintain only a single instance of this class for each Listener object that
+ exists in the C Driver.
+ """
+ if not c_lsnr: return None
+ py_lsnr = pn_listener_context(c_lsnr)
+ if py_lsnr: return py_lsnr
+ wrapper = Listener(_lsnr=c_lsnr, _py_driver=py_driver)
+ return wrapper
+
+ def __init__(self, _lsnr, _py_driver):
self._lsnr = _lsnr
+ assert(_py_driver)
+ self._driver = weakref.ref(_py_driver)
+ pn_listener_set_context(self._lsnr, self)
+ self._driver()._listeners.add(self)
+
+ def _release(self):
+ """Release the underlying C Engine resource."""
+ if self._lsnr:
+ pn_listener_set_context(self._lsnr, None);
+ pn_listener_free(self._lsnr)
+ self._lsnr = None
+
+ def free(self):
+ """Release the Listener, freeing its resources"""
+ d = self._driver()
+ if d: d._listeners.remove(self)
+ self._release()
def next(self):
- return wrap_listener(pn_listener_next(self._lsnr))
+ return Listener._wrap_listener(pn_listener_next(self._lsnr))
def accept(self):
- cxtr = pn_listener_accept(self._lsnr)
- return wrap_connector(cxtr)
+ d = self._driver()
+ if d:
+ cxtr = pn_listener_accept(self._lsnr)
+ c = Connector._wrap_connector(cxtr, d)
+ return c
+ return None
def close(self):
pn_listener_close(self._lsnr)
@@ -3146,9 +3459,17 @@ class Listener(object):
class Driver(object):
def __init__(self):
self._driver = pn_driver()
+ self._listeners = set()
+ self._connectors = set()
def __del__(self):
- if hasattr(self, "_driver"):
+ # freeing the driver will release all child objects in the C Engine, so
+ # clean up their references in the corresponding Python objects
+ for c in self._connectors:
+ c._release()
+ for l in self._listeners:
+ l._release()
+ if hasattr(self, "_driver") and self._driver:
pn_driver_free(self._driver)
del self._driver
@@ -3163,22 +3484,25 @@ class Driver(object):
return pn_driver_wakeup(self._driver)
def listener(self, host, port):
- return wrap_listener(pn_listener(self._driver, host, port, None))
+ """Construct a listener"""
+ return Listener._wrap_listener(pn_listener(self._driver, host, port, None),
+ self)
def pending_listener(self):
- return wrap_listener(pn_driver_listener(self._driver))
+ return Listener._wrap_listener(pn_driver_listener(self._driver))
def head_listener(self):
- return wrap_listener(pn_listener_head(self._driver))
+ return Listener._wrap_listener(pn_listener_head(self._driver))
def connector(self, host, port):
- return wrap_connector(pn_connector(self._driver, host, port, None))
+ return Connector._wrap_connector(pn_connector(self._driver, host, port, None),
+ self)
def head_connector(self):
- return wrap_connector(pn_connector_head(self._driver))
+ return Connector._wrap_connector(pn_connector_head(self._driver))
def pending_connector(self):
- return wrap_connector(pn_driver_connector(self._driver))
+ return Connector._wrap_connector(pn_driver_connector(self._driver))
__all__ = [
"API_LANGUAGE",
@@ -3193,6 +3517,7 @@ __all__ = [
"SETTLED",
"UNDESCRIBED",
"Array",
+ "Collector",
"Condition",
"Connection",
"Connector",
@@ -3203,6 +3528,7 @@ __all__ = [
"Driver",
"DriverException",
"Endpoint",
+ "Event",
"Link",
"Listener",
"Message",
Modified: qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/python.i
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/python.i?rev=1577483&r1=1577482&r2=1577483&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/python.i (original)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/python/python.i Fri Mar 14 11:20:47 2014
@@ -183,19 +183,22 @@ ssize_t pn_transport_input(pn_transport_
%}
%ignore pn_message_data;
-%rename(pn_listener) wrap_pn_listener;
+%rename(pn_listener_set_context) wrap_pn_listener_set_context;
%inline {
- pn_listener_t *wrap_pn_listener(pn_driver_t *driver, const char *host, const char *port, PyObject *context) {
- Py_XINCREF(context);
- return pn_listener(driver, host, port, context);
+ void wrap_pn_listener_set_context(pn_listener_t *l, PyObject *context) {
+ // don't incref context: we 'borrow' the reference - prevents
+ // reference loops. Should be safe as the Python object must
+ // outlive the C object.
+ pn_listener_set_context(l, context);
}
}
-%ignore pn_listener;
+%ignore pn_listener_set_context;
%rename(pn_listener_context) wrap_pn_listener_context;
%inline {
PyObject *wrap_pn_listener_context(pn_listener_t *l) {
PyObject *result = (PyObject *) pn_listener_context(l);
+ // incref the returned context, as the caller expects this
if (result) {
Py_INCREF(result);
return result;
@@ -206,39 +209,22 @@ ssize_t pn_transport_input(pn_transport_
}
%ignore pn_listener_context;
-%rename(pn_listener_set_context) wrap_pn_listener_set_context;
-%inline {
- void wrap_pn_listener_set_context(pn_listener_t *l, PyObject *context) {
- Py_XDECREF((PyObject *)pn_listener_context(l));
- Py_XINCREF(context);
- pn_listener_set_context(l, context);
- }
-}
-%ignore pn_listener_set_context;
-
-%rename(pn_listener_free) wrap_pn_listener_free;
-%inline %{
- void wrap_pn_listener_free(pn_listener_t *l) {
- PyObject *obj = (PyObject *) pn_listener_context(l);
- Py_XDECREF(obj);
- pn_listener_free(l);
- }
-%}
-%ignore pn_listener_free;
-
-%rename(pn_connector) wrap_pn_connector;
+%rename(pn_connector_set_context) wrap_pn_connector_set_context;
%inline {
- pn_connector_t *wrap_pn_connector(pn_driver_t *driver, const char *host, const char *port, PyObject *context) {
- Py_XINCREF(context);
- return pn_connector(driver, host, port, context);
+ void wrap_pn_connector_set_context(pn_connector_t *c, PyObject *context) {
+ // don't incref context: we 'borrow' the reference - prevents
+ // reference loops. Should be safe as the Python object must
+ // outlive the C object.
+ pn_connector_set_context(c, context);
}
}
-%ignore pn_connector;
+%ignore pn_connector_set_context;
%rename(pn_connector_context) wrap_pn_connector_context;
%inline {
PyObject *wrap_pn_connector_context(pn_connector_t *c) {
PyObject *result = (PyObject *) pn_connector_context(c);
+ // incref the returned context, as the caller expects this
if (result) {
Py_INCREF(result);
return result;
@@ -249,30 +235,11 @@ ssize_t pn_transport_input(pn_transport_
}
%ignore pn_connector_context;
-%rename(pn_connector_set_context) wrap_pn_connector_set_context;
-%inline {
- void wrap_pn_connector_set_context(pn_connector_t *ctor, PyObject *context) {
- Py_XDECREF((PyObject *)pn_connector_context(ctor));
- Py_XINCREF(context);
- pn_connector_set_context(ctor, context);
- }
-}
-%ignore pn_connector_set_context;
-
-%rename(pn_connector_free) wrap_pn_connector_free;
-%inline %{
- void wrap_pn_connector_free(pn_connector_t *c) {
- PyObject *obj = (PyObject *) pn_connector_context(c);
- Py_XDECREF(obj);
- pn_connector_free(c);
- }
-%}
-%ignore pn_connector_free;
-
%rename(pn_connection_get_context) wrap_pn_connection_get_context;
%inline {
PyObject *wrap_pn_connection_get_context(pn_connection_t *c) {
PyObject *result = (PyObject *) pn_connection_get_context(c);
+ // incref the returned context, as the caller expects this
if (result) {
Py_INCREF(result);
return result;
@@ -286,27 +253,17 @@ ssize_t pn_transport_input(pn_transport_
%rename(pn_connection_set_context) wrap_pn_connection_set_context;
%inline {
void wrap_pn_connection_set_context(pn_connection_t *c, PyObject *context) {
- Py_XDECREF((PyObject *)pn_connection_get_context(c));
- Py_XINCREF(context);
+ // don't incref context: we 'borrow' the reference
pn_connection_set_context(c, context);
}
}
%ignore pn_connection_set_context;
-%rename(pn_connection_free) wrap_pn_connection_free;
-%inline %{
- void wrap_pn_connection_free(pn_connection_t *c) {
- PyObject *obj = (PyObject *) pn_connection_get_context(c);
- Py_XDECREF(obj);
- pn_connection_free(c);
- }
-%}
-%ignore pn_connection_free;
-
%rename(pn_session_get_context) wrap_pn_session_get_context;
%inline {
PyObject *wrap_pn_session_get_context(pn_session_t *s) {
PyObject *result = (PyObject *) pn_session_get_context(s);
+ // incref the returned context, as the caller expects this
if (result) {
Py_INCREF(result);
return result;
@@ -320,27 +277,17 @@ ssize_t pn_transport_input(pn_transport_
%rename(pn_session_set_context) wrap_pn_session_set_context;
%inline {
void wrap_pn_session_set_context(pn_session_t *s, PyObject *context) {
- Py_XDECREF((PyObject *)pn_session_get_context(s));
- Py_XINCREF(context);
+ // don't incref context: we 'borrow' the reference
pn_session_set_context(s, context);
}
}
%ignore pn_session_set_context;
-%rename(pn_session_free) wrap_pn_session_free;
-%inline %{
- void wrap_pn_session_free(pn_session_t *s) {
- PyObject *obj = (PyObject *) pn_session_get_context(s);
- Py_XDECREF(obj);
- pn_session_free(s);
- }
-%}
-%ignore pn_session_free;
-
%rename(pn_link_get_context) wrap_pn_link_get_context;
%inline {
PyObject *wrap_pn_link_get_context(pn_link_t *l) {
PyObject *result = (PyObject *) pn_link_get_context(l);
+ // incref the returned context, as the caller expects this
if (result) {
Py_INCREF(result);
return result;
@@ -354,27 +301,17 @@ ssize_t pn_transport_input(pn_transport_
%rename(pn_link_set_context) wrap_pn_link_set_context;
%inline {
void wrap_pn_link_set_context(pn_link_t *l, PyObject *context) {
- Py_XDECREF((PyObject *)pn_link_get_context(l));
- Py_XINCREF(context);
+ // don't incref context: we 'borrow' the reference
pn_link_set_context(l, context);
}
}
%ignore pn_link_set_context;
-%rename(pn_link_free) wrap_pn_link_free;
-%inline %{
- void wrap_pn_link_free(pn_link_t *l) {
- PyObject *obj = (PyObject *) pn_link_get_context(l);
- Py_XDECREF(obj);
- pn_link_free(l);
- }
-%}
-%ignore pn_link_free;
-
%rename(pn_delivery_get_context) wrap_pn_delivery_get_context;
%inline {
PyObject *wrap_pn_delivery_get_context(pn_delivery_t *d) {
PyObject *result = (PyObject *) pn_delivery_get_context(d);
+ // incref the returned context, as the caller expects this
if (result) {
Py_INCREF(result);
return result;
@@ -388,23 +325,12 @@ ssize_t pn_transport_input(pn_transport_
%rename(pn_delivery_set_context) wrap_pn_delivery_set_context;
%inline {
void wrap_pn_delivery_set_context(pn_delivery_t *d, PyObject *context) {
- Py_XDECREF((PyObject *)pn_delivery_get_context(d));
- Py_XINCREF(context);
+ // don't incref context: we 'borrow' the reference
pn_delivery_set_context(d, context);
}
}
%ignore pn_delivery_set_context;
-%rename(pn_delivery_settle) wrap_pn_delivery_settle;
-%inline %{
- void wrap_pn_delivery_settle(pn_delivery_t *d) {
- PyObject *obj = (PyObject *) pn_delivery_get_context(d);
- Py_XDECREF(obj);
- pn_delivery_settle(d);
- }
-%}
-%ignore pn_delivery_settle;
-
ssize_t pn_data_decode(pn_data_t *data, char *STRING, size_t LENGTH);
%ignore pn_data_decode;
Modified: qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/ruby/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/ruby/CMakeLists.txt?rev=1577483&r1=1577482&r2=1577483&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/ruby/CMakeLists.txt (original)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/bindings/ruby/CMakeLists.txt Fri Mar 14 11:20:47 2014
@@ -26,38 +26,16 @@ set_target_properties(cproton-ruby
OUTPUT_NAME "cproton"
LINK_FLAGS "${CATCH_UNDEFINED}" )
-install(TARGETS cproton-ruby
- DESTINATION ${RUBY_ARCH_DIR}
- COMPONENT Ruby)
-
-# Install the Ruby libraries
-set(RUBY_LIBRARIES
- lib/qpid_proton/array.rb
- lib/qpid_proton/data.rb
- lib/qpid_proton/described.rb
- lib/qpid_proton/exception_handling.rb
- lib/qpid_proton/exceptions.rb
- lib/qpid_proton/hash.rb
- lib/qpid_proton/mapping.rb
- lib/qpid_proton/message_format.rb
- lib/qpid_proton/message.rb
- lib/qpid_proton/messenger.rb
- lib/qpid_proton/subscription.rb
- lib/qpid_proton/tracker.rb
- lib/qpid_proton/tracker_status.rb
-)
+if (ASK_RUBY)
-set(RUBY_ARCHLIB_DIR "${RUBY_VENDORLIB_DIR}")
-
-if (NOT RUBY_ARCHLIB_DIR)
execute_process(COMMAND ${RUBY_EXECUTABLE}
- -r rbconfig -e "print RbConfig::CONFIG['vendorarchdir'] || ''"
+ -r rbconfig -e "print RbConfig::CONFIG['vendorarchdir'] || ''"
RESULT_VARIABLE RESULT_RUBY_ARCHLIB_DIR
OUTPUT_VARIABLE OUTPUT_RUBY_ARCHLIB_DIR)
if(OUTPUT_RUBY_ARCHLIB_DIR STREQUAL "")
execute_process(COMMAND ${RUBY_EXECUTABLE}
- -r rbconfig -e "print RbConfig::CONFIG['sitearchdir'] || ''"
+ -r rbconfig -e "print RbConfig::CONFIG['archdir'] || ''"
RESULT_VARIABLE RESULT_RUBY_ARCHLIB_DIR
OUTPUT_VARIABLE OUTPUT_RUBY_ARCHLIB_DIR)
@@ -65,12 +43,20 @@ if (NOT RUBY_ARCHLIB_DIR)
set(RUBY_ARCHLIB_DIR "${OUTPUT_RUBY_ARCHLIB_DIR}")
-endif ()
+else (ASK_RUBY)
+
+ set (RUBY_SITELIB_DIR ${BINDINGS_DIR}/ruby CACHE PATH "Ruby portable code")
+ set (RUBY_ARCHLIB_DIR ${BINDINGS_DIR}/ruby/lib${LIB_SUFFIX} CACHE PATH "Ruby platform code")
+
+endif (ASK_RUBY)
+
+install(TARGETS cproton-ruby
+ DESTINATION ${RUBY_ARCHLIB_DIR}
+ COMPONENT Ruby)
install(FILES lib/qpid_proton.rb
DESTINATION ${RUBY_ARCHLIB_DIR}
COMPONENT Ruby)
-
-install(FILES ${RUBY_LIBRARIES}
- DESTINATION ${RUBY_ARCHLIB_DIR}/qpid_proton
+install(DIRECTORY lib/qpid_proton
+ DESTINATION ${RUBY_ARCHLIB_DIR}
COMPONENT Ruby)
Added: qpid/proton/branches/fadams-javascript-binding/proton-c/docs/api/index.md
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/docs/api/index.md?rev=1577483&view=auto
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/docs/api/index.md (added)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/docs/api/index.md Fri Mar 14 11:20:47 2014
@@ -0,0 +1,5 @@
+Proton Documentation {#index}
+====================
+
+The proton library contains two APIs: The [Engine API](@ref engine),
+and the [Messenger API](@ref messenger).
Modified: qpid/proton/branches/fadams-javascript-binding/proton-c/docs/api/user.doxygen.in
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/docs/api/user.doxygen.in?rev=1577483&r1=1577482&r2=1577483&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/docs/api/user.doxygen.in (original)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/docs/api/user.doxygen.in Fri Mar 14 11:20:47 2014
@@ -541,12 +541,6 @@ MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
-# If the sources in your project are distributed over multiple directories
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
-# in the documentation. The default is NO.
-
-SHOW_DIRECTORIES = NO
-
# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
# This will remove the Files entry from the Quick Index and from the
# Folder Tree View (if specified). The default is YES.
@@ -648,7 +642,7 @@ WARN_LOGFILE =
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
-INPUT = @CMAKE_SOURCE_DIR@/proton-c/include
+INPUT = @CMAKE_SOURCE_DIR@/proton-c/include @CMAKE_SOURCE_DIR@/proton-c/docs/api
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
@@ -666,7 +660,7 @@ INPUT_ENCODING = UTF-8
# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
# *.f90 *.f *.for *.vhd *.vhdl
-FILE_PATTERNS = *.h
+FILE_PATTERNS = *.h *.md
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
# should be searched for input files as well. Possible values are YES and NO.
@@ -937,12 +931,6 @@ HTML_COLORSTYLE_GAMMA = 80
HTML_TIMESTAMP = YES
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS = YES
-
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
# documentation will contain sections that can be hidden and shown after the
# page has loaded. For this to work a browser that supports
@@ -1125,11 +1113,6 @@ ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = NO
-# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
-# and Class Hierarchy pages using a tree view instead of an ordered list.
-
-USE_INLINE_TREES = NO
-
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
# used to set the initial width (in pixels) of the frame in which the tree
# is shown.
Added: qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/condition.h
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/condition.h?rev=1577483&view=auto
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/condition.h (added)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/condition.h Fri Mar 14 11:20:47 2014
@@ -0,0 +1,172 @@
+#ifndef PROTON_CONDITION_H
+#define PROTON_CONDITION_H 1
+
+/*
+ *
+ * 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/import_export.h>
+#include <proton/codec.h>
+#ifndef __cplusplus
+#include <stdbool.h>
+#endif
+#include <stddef.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @file
+ *
+ * The Condition API for the proton Engine.
+ *
+ * @defgroup condition Condition
+ * @ingroup connection
+ * @{
+ */
+
+/**
+ * An AMQP Condition object. Conditions hold exceptional information
+ * pertaining to the closing of an AMQP endpoint such as a Connection,
+ * Session, or Link. Conditions also hold similar information
+ * pertaining to deliveries that have reached terminal states.
+ * Connections, Sessions, Links, and Deliveries may all have local and
+ * remote conditions associated with them.
+ *
+ * The local condition may be modified by the local endpoint to signal
+ * a particular condition to the remote peer. The remote condition may
+ * be examined by the local endpoint to detect whatever condition the
+ * remote peer may be signaling. Although often conditions are used to
+ * indicate errors, not all conditions are errors per/se, e.g.
+ * conditions may be used to redirect a connection from one host to
+ * another.
+ *
+ * Every condition has a short symbolic name, a longer description,
+ * and an additional info map associated with it. The name identifies
+ * the formally defined condition, and the map contains additional
+ * information relevant to the identified condition.
+ */
+typedef struct pn_condition_t pn_condition_t;
+
+/**
+ * Returns true if the condition object is holding some information,
+ * i.e. if the name is set to some non NULL value. Returns false
+ * otherwise.
+ *
+ * @param[in] condition the condition object to test
+ * @return true iff some condition information is set
+ */
+PN_EXTERN bool pn_condition_is_set(pn_condition_t *condition);
+
+/**
+ * Clears the condition object of any exceptional information. After
+ * calling ::pn_condition_clear(), ::pn_condition_is_set() is
+ * guaranteed to return false and ::pn_condition_get_name() as well as
+ * ::pn_condition_get_description() will return NULL. The ::pn_data_t
+ * returned by ::pn_condition_info() will still be valid, but will
+ * have been cleared as well (See ::pn_data_clear()).
+ *
+ * @param[in] condition the condition object to clear
+ */
+PN_EXTERN void pn_condition_clear(pn_condition_t *condition);
+
+/**
+ * Returns the name associated with the exceptional condition, or NULL
+ * if there is no conditional information set.
+ *
+ * @param[in] condition the condition object
+ * @return a pointer to the name, or NULL
+ */
+PN_EXTERN const char *pn_condition_get_name(pn_condition_t *condition);
+
+/**
+ * Sets the name associated with the exceptional condition.
+ *
+ * @param[in] condition the condition object
+ * @param[in] name the desired name
+ * @return an error code or 0 on success
+ */
+PN_EXTERN int pn_condition_set_name(pn_condition_t *condition, const char *name);
+
+/**
+ * Gets the description associated with the exceptional condition.
+ *
+ * @param[in] condition the condition object
+ * @return a pointer to the description, or NULL
+ */
+PN_EXTERN const char *pn_condition_get_description(pn_condition_t *condition);
+
+/**
+ * Sets the description associated with the exceptional condition.
+ *
+ * @param[in] condition the condition object
+ * @param[in] description the desired description
+ * @return an error code or 0 on success
+ */
+PN_EXTERN int pn_condition_set_description(pn_condition_t *condition, const char *description);
+
+/**
+ * Returns a data object that holds the additional information
+ * associated with the condition. The data object may be used both to
+ * access and to modify the additional information associated with the
+ * condition.
+ *
+ * @param[in] condition the condition object
+ * @return a data object holding the additional information for the condition
+ */
+PN_EXTERN pn_data_t *pn_condition_info(pn_condition_t *condition);
+
+/**
+ * Returns true if the condition is a redirect.
+ *
+ * @param[in] condition the condition object
+ * @return true if the condition is a redirect, false otherwise
+ */
+PN_EXTERN bool pn_condition_is_redirect(pn_condition_t *condition);
+
+/**
+ * Retrieves the redirect host from the additional information
+ * associated with the condition. If the condition is not a redirect,
+ * this will return NULL.
+ *
+ * @param[in] condition the condition object
+ * @return the redirect host or NULL
+ */
+PN_EXTERN const char *pn_condition_redirect_host(pn_condition_t *condition);
+
+/**
+ * Retrieves the redirect port from the additional information
+ * associated with the condition. If the condition is not a redirect,
+ * this will return an error code.
+ *
+ * @param[in] condition the condition object
+ * @return the redirect port or an error code
+ */
+PN_EXTERN int pn_condition_redirect_port(pn_condition_t *condition);
+
+/** @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* condition.h */
Propchange: qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/condition.h
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/condition.h
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/connection.h
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/connection.h?rev=1577483&view=auto
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/connection.h (added)
+++ qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/connection.h Fri Mar 14 11:20:47 2014
@@ -0,0 +1,418 @@
+#ifndef PROTON_CONNECTION_H
+#define PROTON_CONNECTION_H 1
+
+/*
+ *
+ * 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/import_export.h>
+#ifndef __cplusplus
+#include <stdbool.h>
+#endif
+#include <stddef.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file
+ *
+ * Connection API for the proton Engine.
+ *
+ * @defgroup connection Connection
+ * @ingroup engine
+ * @{
+ */
+
+/**
+ * The local @link pn_state_t endpoint state @endlink is uninitialized.
+ */
+#define PN_LOCAL_UNINIT (1)
+/**
+ * The local @link pn_state_t endpoint state @endlink is active.
+ */
+#define PN_LOCAL_ACTIVE (2)
+/**
+ * The local @link pn_state_t endpoint state @endlink is closed.
+ */
+#define PN_LOCAL_CLOSED (4)
+/**
+ * The remote @link pn_state_t endpoint state @endlink is uninitialized.
+ */
+#define PN_REMOTE_UNINIT (8)
+/**
+ * The remote @link pn_state_t endpoint state @endlink is active.
+ */
+#define PN_REMOTE_ACTIVE (16)
+/**
+ * The remote @link pn_state_t endpoint state @endlink is closed.
+ */
+#define PN_REMOTE_CLOSED (32)
+
+/**
+ * A mask for values of ::pn_state_t that preserves only the local
+ * bits of an endpoint's state.
+ */
+#define PN_LOCAL_MASK (PN_LOCAL_UNINIT | PN_LOCAL_ACTIVE | PN_LOCAL_CLOSED)
+
+/**
+ * A mask for values of ::pn_state_t that preserves only the remote
+ * bits of an endpoint's state.
+ */
+#define PN_REMOTE_MASK (PN_REMOTE_UNINIT | PN_REMOTE_ACTIVE | PN_REMOTE_CLOSED)
+
+/**
+ * Factory to construct a new Connection.
+ *
+ * @return pointer to a new connection object.
+ */
+PN_EXTERN pn_connection_t *pn_connection(void);
+
+/**
+ * Free a connection object.
+ *
+ * When a connection object is freed, all ::pn_session_t, ::pn_link_t,
+ * and ::pn_delivery_t objects associated with the connection are also
+ * freed.
+ *
+ * @param[in] connection the connection object to free (or NULL)
+ */
+PN_EXTERN void pn_connection_free(pn_connection_t *connection);
+
+/**
+ * Get additional error information associated with the connection.
+ *
+ * Whenever a connection operation fails (i.e. returns an error code),
+ * additional error details can be obtained using this function. The
+ * error object that is returned may also be used to clear the error
+ * condition.
+ *
+ * The pointer returned by this operation is valid until the
+ * connection object is freed.
+ *
+ * @param[in] connection the connection object
+ * @return the connection's error object
+ */
+PN_EXTERN pn_error_t *pn_connection_error(pn_connection_t *connection);
+
+/**
+ * Associate a connection object with an event collector.
+ *
+ * By associating a connection object with an event collector, key
+ * changes in endpoint state are reported to the collector via
+ * ::pn_event_t objects that can be inspected and processed. See
+ * ::pn_event_t for more details on the kinds of events.
+ *
+ * Note that by registering a collector, the user is requesting that
+ * an indefinite number of events be queued up on his behalf. This
+ * means that unless the application eventually processes these
+ * events, the storage requirements for keeping them will grow without
+ * bound. In other words, don't register a collector with a connection
+ * if you never intend to process any of the events.
+ *
+ * @param[in] connection the connection object
+ * @param[in] collector the event collector
+ */
+PN_EXTERN void pn_connection_collect(pn_connection_t *connection, pn_collector_t *collector);
+
+/**
+ * Get the application context that is associated with a connection
+ * object.
+ *
+ * The application context for a connection may be set using
+ * ::pn_connection_set_context.
+ *
+ * @param[in] connection the connection whose context is to be returned.
+ * @return the application context for the connection object
+ */
+PN_EXTERN void *pn_connection_get_context(pn_connection_t *connection);
+
+/**
+ * Set a new application context for a connection object.
+ *
+ * The application context for a connection object may be retrieved
+ * using ::pn_connection_get_context.
+ *
+ * @param[in] connection the connection object
+ * @param[in] context the application context
+ */
+PN_EXTERN void pn_connection_set_context(pn_connection_t *connection, void *context);
+
+/**
+ * Get the endpoint state flags for a connection.
+ *
+ * @param[in] connection the connection
+ * @return the connection's state flags
+ */
+PN_EXTERN pn_state_t pn_connection_state(pn_connection_t *connection);
+
+/**
+ * Open a connection.
+ *
+ * Once this operation has completed, the PN_LOCAL_ACTIVE state flag
+ * will be set.
+ *
+ * @param[in] connection a connection object
+ */
+PN_EXTERN void pn_connection_open(pn_connection_t *connection);
+
+/**
+ * Close a connection.
+ *
+ * Once this operation has completed, the PN_LOCAL_CLOSED state flag
+ * will be set. This may be called without calling
+ * ::pn_connection_open, in this case it is equivalent to calling
+ * ::pn_connection_open followed by ::pn_connection_close.
+ *
+ * @param[in] connection a connection object
+ */
+PN_EXTERN void pn_connection_close(pn_connection_t *connection);
+
+/**
+ * Reset a connection object back to the uninitialized state.
+ *
+ * Note that this does *not* remove any contained ::pn_session_t,
+ * ::pn_link_t, and ::pn_delivery_t objects.
+ *
+ * @param[in] connection a connection object
+ */
+PN_EXTERN void pn_connection_reset(pn_connection_t *connection);
+
+/**
+ * Get the local condition associated with the connection endpoint.
+ *
+ * The ::pn_condition_t object retrieved may be modified prior to
+ * closing the connection in order to indicate a particular condition
+ * exists when the connection closes. This is normally used to
+ * communicate error conditions to the remote peer, however it may
+ * also be used in non error cases such as redirects. See
+ * ::pn_condition_t for more details.
+ *
+ * The pointer returned by this operation is valid until the
+ * connection object is freed.
+ *
+ * @param[in] connection the connection object
+ * @return the connection's local condition object
+ */
+PN_EXTERN pn_condition_t *pn_connection_condition(pn_connection_t *connection);
+
+/**
+ * Get the remote condition associated with the connection endpoint.
+ *
+ * The ::pn_condition_t object retrieved may be examined in order to
+ * determine whether the remote peer was indicating some sort of
+ * exceptional condition when the remote connection endpoint was
+ * closed. The ::pn_condition_t object returned may not be modified.
+ *
+ * The pointer returned by this operation is valid until the
+ * connection object is freed.
+ *
+ * @param[in] connection the connection object
+ * @return the connection's remote condition object
+ */
+PN_EXTERN pn_condition_t *pn_connection_remote_condition(pn_connection_t *connection);
+
+/**
+ * Get the AMQP Container name advertised by a connection object.
+ *
+ * The pointer returned by this operation is valid until
+ * ::pn_connection_set_container is called, or until the connection
+ * object is freed, whichever happens sooner.
+ *
+ * @param[in] connection the connection object
+ * @return a pointer to the container name
+ */
+PN_EXTERN const char *pn_connection_get_container(pn_connection_t *connection);
+
+/**
+ * Set the AMQP Container name advertised by a connection object.
+ *
+ * @param[in] connection the connection object
+ * @param[in] container the container name
+ */
+PN_EXTERN void pn_connection_set_container(pn_connection_t *connection, const char *container);
+
+/**
+ * Get the value of the AMQP Hostname used by a connection object.
+ *
+ * The pointer returned by this operation is valid until
+ * ::pn_connection_set_hostname is called, or until the connection
+ * object is freed, whichever happens sooner.
+ *
+ * @param[in] connection the connection object
+ * @return a pointer to the hostname
+ */
+PN_EXTERN const char *pn_connection_get_hostname(pn_connection_t *connection);
+
+/**
+ * Set the value of the AMQP Hostname used by a connection object.
+ *
+ * @param[in] connection the connection object
+ * @param[in] hostname the hostname
+ */
+PN_EXTERN void pn_connection_set_hostname(pn_connection_t *connection, const char *hostname);
+
+/**
+ * Get the AMQP Container name advertised by the remote connection
+ * endpoint.
+ *
+ * This will return NULL until the ::PN_REMOTE_ACTIVE state is
+ * reached. See ::pn_state_t for more details on endpoint state.
+ *
+ * Any non null pointer returned by this operation will be valid until
+ * the connection object is unbound from a transport or freed,
+ * whichever happens sooner.
+ *
+ * @param[in] connection the connection object
+ * @return a pointer to the remote container name
+ */
+PN_EXTERN const char *pn_connection_remote_container(pn_connection_t *connection);
+
+/**
+ * Get the AMQP Hostname set by the remote connection endpoint.
+ *
+ * This will return NULL until the ::PN_REMOTE_ACTIVE state is
+ * reached. See ::pn_state_t for more details on endpoint state.
+ *
+ * Any non null pointer returned by this operation will be valid until
+ * the connection object is unbound from a transport or freed,
+ * whichever happens sooner.
+ *
+ * @param[in] connection the connection object
+ * @return a pointer to the remote hostname
+ */
+PN_EXTERN const char *pn_connection_remote_hostname(pn_connection_t *connection);
+
+/**
+ * Access/modify the AMQP offered capabilities data for a connection
+ * object.
+ *
+ * This operation will return a pointer to a ::pn_data_t object that
+ * is valid until the connection object is freed. Any data contained
+ * by the ::pn_data_t object will be sent as the offered capabilites
+ * for the parent connection object. Note that this MUST take the form
+ * of an array of symbols to be valid.
+ *
+ * The ::pn_data_t pointer returned is valid until the connection
+ * object is freed.
+ *
+ * @param[in] connection the connection object
+ * @return a pointer to a pn_data_t representing the offered capabilities
+ */
+PN_EXTERN pn_data_t *pn_connection_offered_capabilities(pn_connection_t *connection);
+
+/**
+ * Access/modify the AMQP desired capabilities data for a connection
+ * object.
+ *
+ * This operation will return a pointer to a ::pn_data_t object that
+ * is valid until the connection object is freed. Any data contained
+ * by the ::pn_data_t object will be sent as the desired capabilites
+ * for the parent connection object. Note that this MUST take the form
+ * of an array of symbols to be valid.
+ *
+ * The ::pn_data_t pointer returned is valid until the connection
+ * object is freed.
+ *
+ * @param[in] connection the connection object
+ * @return a pointer to a pn_data_t representing the desired capabilities
+ */
+PN_EXTERN pn_data_t *pn_connection_desired_capabilities(pn_connection_t *connection);
+
+/**
+ * Access/modify the AMQP properties data for a connection object.
+ *
+ * This operation will return a pointer to a ::pn_data_t object that
+ * is valid until the connection object is freed. Any data contained
+ * by the ::pn_data_t object will be sent as the AMQP properties for
+ * the parent connection object. Note that this MUST take the form of
+ * a symbol keyed map to be valid.
+ *
+ * The ::pn_data_t pointer returned is valid until the connection
+ * object is freed.
+ *
+ * @param[in] connection the connection object
+ * @return a pointer to a pn_data_t representing the connection properties
+ */
+PN_EXTERN pn_data_t *pn_connection_properties(pn_connection_t *connection);
+
+/**
+ * Access the AMQP offered capabilites supplied by the remote
+ * connection endpoint.
+ *
+ * This operation will return a pointer to a ::pn_data_t object that
+ * is valid until the connection object is freed. This data object
+ * will be empty until the remote connection is opened as indicated by
+ * the ::PN_REMOTE_ACTIVE flag.
+ *
+ * @param[in] connection the connection object
+ * @return the remote offered capabilities
+ */
+PN_EXTERN pn_data_t *pn_connection_remote_offered_capabilities(pn_connection_t *connection);
+
+/**
+ * Access the AMQP desired capabilites supplied by the remote
+ * connection endpoint.
+ *
+ * This operation will return a pointer to a ::pn_data_t object that
+ * is valid until the connection object is freed. This data object
+ * will be empty until the remote connection is opened as indicated by
+ * the ::PN_REMOTE_ACTIVE flag.
+ *
+ * @param[in] connection the connection object
+ * @return the remote desired capabilities
+ */
+PN_EXTERN pn_data_t *pn_connection_remote_desired_capabilities(pn_connection_t *connection);
+
+/**
+ * Access the AMQP connection properties supplied by the remote
+ * connection endpoint.
+ *
+ * This operation will return a pointer to a ::pn_data_t object that
+ * is valid until the connection object is freed. This data object
+ * will be empty until the remote connection is opened as indicated by
+ * the ::PN_REMOTE_ACTIVE flag.
+ *
+ * @param[in] connection the connection object
+ * @return the remote connection properties
+ */
+PN_EXTERN pn_data_t *pn_connection_remote_properties(pn_connection_t *connection);
+
+/**
+ * Get the transport bound to a connection object.
+ *
+ * If the connection is unbound, then this operation will return NULL.
+ *
+ * @param[in] connection the connection object
+ * @return the transport bound to a connection, or NULL if the
+ * connection is unbound
+ */
+PN_EXTERN pn_transport_t *pn_connection_transport(pn_connection_t *connection);
+
+/** @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* connection.h */
Propchange: qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/connection.h
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: qpid/proton/branches/fadams-javascript-binding/proton-c/include/proton/connection.h
------------------------------------------------------------------------------
svn:keywords = Rev Date
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org