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