PROTON-799: Added the pn_rbkey_t type to the Ruby APIs.

The pn_rbkey_t type provides a way, from Ruby, to attach pure Ruby
objects to Proton structs by means of an attachment.

The type holds a reference to an registry object, a method to invoke on
that object, and the value to pass to that method when invoked. This
method is then called when the rbkey is finalized, with the goal of
removing the referenced Ruby object so it can be safely garbage
collected.


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/8b97be9d
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/8b97be9d
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/8b97be9d

Branch: refs/heads/ruby-engine-apis
Commit: 8b97be9da47e4334c18616f5b0cc88629a10c2eb
Parents: 45e1efa
Author: Darryl L. Pierce <mcpie...@gmail.com>
Authored: Fri Mar 6 09:36:35 2015 -0500
Committer: Darryl L. Pierce <mcpie...@gmail.com>
Committed: Wed May 20 11:11:41 2015 -0400

----------------------------------------------------------------------
 proton-c/bindings/ruby/lib/qpid_proton.rb | 22 +++++++
 proton-c/bindings/ruby/ruby.i             | 85 ++++++++++++++++++++++++++
 2 files changed, 107 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8b97be9d/proton-c/bindings/ruby/lib/qpid_proton.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton.rb 
b/proton-c/bindings/ruby/lib/qpid_proton.rb
index da9983c..28a83aa 100644
--- a/proton-c/bindings/ruby/lib/qpid_proton.rb
+++ b/proton-c/bindings/ruby/lib/qpid_proton.rb
@@ -53,3 +53,25 @@ require "messenger/tracker_status"
 require "messenger/tracker"
 require "messenger/selectable"
 require "messenger/messenger"
+
+module Qpid::Proton
+  # @private
+  def self.registry
+    @registry ||= {}
+  end
+
+  # @private
+  def self.add_to_registry(key, value)
+    self.registry[key] = value
+  end
+
+  # @private
+  def self.get_from_registry(key)
+    self.registry[key]
+  end
+
+  # @private
+  def self.delete_from_registry(key)
+    self.registry.delete(key)
+  end
+end

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8b97be9d/proton-c/bindings/ruby/ruby.i
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/ruby.i b/proton-c/bindings/ruby/ruby.i
index 7380068..75de4f9 100644
--- a/proton-c/bindings/ruby/ruby.i
+++ b/proton-c/bindings/ruby/ruby.i
@@ -465,4 +465,89 @@ bool pn_ssl_get_protocol_name(pn_ssl_t *ssl, char *OUTPUT, 
size_t MAX_OUTPUT_SIZ
 %ignore pn_messenger_recv;
 %ignore pn_messenger_work;
 
+%inline %{
+
+#define CID_pn_rbkey CID_pn_void
+
+typedef struct {
+  void *registry;
+  char *method;
+  char *key_value;
+} pn_rbkey_t;
+
+void pn_rbkey_initialize(pn_rbkey_t *rbkey) {
+  assert(rbkey);
+  rbkey->registry = NULL;
+  rbkey->method = NULL;
+  rbkey->key_value = NULL;
+}
+
+void pn_rbkey_finalize(pn_rbkey_t *rbkey) {
+  if(rbkey && rbkey->registry && rbkey->method && rbkey->key_value) {
+    rb_funcall((VALUE )rbkey->registry, rb_intern(rbkey->method), 1, 
rb_str_new2(rbkey->key_value));
+  }
+  if(rbkey->key_value) {
+    free(rbkey->key_value);
+    rbkey->key_value = NULL;
+  }
+}
+
+#define pn_rbkey_inspect NULL
+#define pn_rbkey_compare NULL
+#define pn_rbkey_hashcode NULL
+
+PN_CLASSDEF(pn_rbkey)
+
+void pn_rbkey_set_registry(pn_rbkey_t *rbkey, void *registry) {
+  assert(rbkey);
+  rbkey->registry = registry;
+}
+
+void *pn_rbkey_get_registry(pn_rbkey_t *rbkey) {
+  assert(rbkey);
+  return rbkey->registry;
+}
+
+void pn_rbkey_set_method(pn_rbkey_t *rbkey, char *method) {
+  assert(rbkey);
+  rbkey->method = method;
+}
+
+char *pn_rbkey_get_method(pn_rbkey_t *rbkey) {
+  assert(rbkey);
+  return rbkey->method;
+}
+
+void pn_rbkey_set_key_value(pn_rbkey_t *rbkey, char *key_value) {
+  assert(rbkey);
+  rbkey->key_value = malloc(strlen(key_value) + 1);
+  strncpy(rbkey->key_value, key_value, strlen(key_value) + 1);
+  printf("-> Setting key value=%s\n", rbkey->key_value);
+  // rbkey->key_value = key_value;
+}
+
+char *pn_rbkey_get_key_value(pn_rbkey_t *rbkey) {
+  assert(rbkey);
+  printf("<- Returning key value=%s\n", rbkey->key_value == NULL ? "NULL" : 
rbkey->key_value);
+  return rbkey->key_value;
+}
+
+pn_rbkey_t *pni_void2rbkey(void *object) {
+  return (pn_rbkey_t *)object;
+}
+
+VALUE pn_void2rb(void *object) {
+  return (VALUE )object;
+}
+
+void *pn_rb2void(VALUE object) {
+  return (void *)object;
+}
+
+VALUE pni_address_of(void *object) {
+  return ULL2NUM((unsigned long )object);
+}
+
+%}
+
 %include "proton/cproton.i"


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org
For additional commands, e-mail: commits-h...@qpid.apache.org

Reply via email to