module Qpid::Proton::Util::Wrapper::ClassMethods

Adds methods to the target class for storing and retrieving pure Ruby wrappers to underlying Proton structures.

Such wrappers are stored in a registry using a key. The key is then attached to the Proton structure as a record. That record lives for as long as the Proton structure lives, and when the structure is released the record acts as hook to also delete the Ruby wrapper object from the registry.

@private

Public Instance Methods

fetch_instance(impl, attachment_method = nil) click to toggle source

Retrieves the wrapper object with the supplied Proton struct.

@param impl [Object] The wrapper for the Proton struct. @param attachment_method [Symbol] The Proton attachment method.

@return [Object] The Ruby wrapper object.

# File lib/util/wrapper.rb, line 89
def fetch_instance(impl, attachment_method = nil)
  # if the impl has a wrapper already attached, then return it
  if impl.instance_variable_defined?(:@proton_wrapper)
    return impl.instance_variable_get(:@proton_wrapper)
  end
  unless attachment_method.nil?
    record = Cproton.__send__(attachment_method, impl)
    rbkey = Cproton.pni_void2rbkey(Cproton.pn_record_get(record, RBCTX))
    # if we don't have a key, then we don't have an object
    return nil if rbkey.nil?
    registry_key = Cproton.Pn_rbkey_get_key_value(rbkey)
  else
    registry_key = get_key(impl)
  end
  # if the object's not in the registry then return
  return nil unless Qpid::Proton::Util::Wrapper.registry.has_key?(registry_key)

  result = Qpid::Proton::Util::Wrapper.registry[registry_key]
  # result = nil unless result.weakref_alive?
  if result.nil?
    raise Qpid::Proton::ProtonError.new("missing object for key=#{registry_key}")
  else
    # update the impl since the Swig wrapper for it may have changed
    result.impl = impl
  end
  return result
end
get_key(impl) click to toggle source

@private

# File lib/util/wrapper.rb, line 57
def get_key(impl)
  ("%032x" % Cproton.pni_address_of(impl))
end
store_instance(object, attachment_method = nil) click to toggle source

Stores the given object for later retrieval.

@param object [Object] The object. @param attachment_method [Symbol] The Proton attachment method.

# File lib/util/wrapper.rb, line 66
def store_instance(object, attachment_method = nil)
  # ensure the impl has a reference to the wrapper object
  object.impl.instance_eval { @proton_wrapper = object }
  registry_key = get_key(object.impl)
  unless attachment_method.nil?
    record = Cproton.__send__(attachment_method, object.impl)
    rbkey = Cproton.Pn_rbkey_new
    Cproton.Pn_rbkey_set_registry(rbkey, Cproton.pn_rb2void(Qpid::Proton::Util::Wrapper.registry))
    Cproton.Pn_rbkey_set_method(rbkey, "delete")
    Cproton.Pn_rbkey_set_key_value(rbkey, registry_key)
    Cproton.pn_record_def(record, RBCTX, Cproton.Pn_rbkey__class());
    Cproton.pn_record_set(record, RBCTX, rbkey)
  end
  Qpid::Proton::Util::Wrapper.registry[registry_key] = object
end