Web lists-archives.com

Gobject decorator -> How to deal with properties


I'm writting a decorator pattern for a protocol in Thrift that's based on c_glib. One of the cases I found is that you can have this:

// From Thrift code:

 * Thrift Protocol Decorator instance.
struct _ThriftProtocolDecorator
  ThriftProtocol parent;

  ThriftProtocol *concrete_protocol;

typedef struct _ThriftProtocolDecoratorClass ThriftProtocolDecoratorClass;

That's a class that implements an interface but when a method is called, it really calls the concrete_protocol method. That's nice. It works but when dealing with properties that's a new history.

For example you can decorate a concrete_protocol that has a property called "transport" but when the code does something like:

g_object_get(decorated_protocol, "transport", &transportvar, NULL);

glib will search over the decorator class installed properties that's not what I want. I resolved hacking a known property install and trying to find its values on

Something like this:

In the init class

  // TODO Ugly hack, in theory we must override all properties from underlaying
  // protocol
  thrift_stored_message_protocol_obj_properties[PROP_THRIFT_STORED_MESSAGE_PROTOCOL_TRANSPORT] =
      g_param_spec_pointer ("transport",
            "Transport on the underlaying implementation",
            "Transport of decorated protocol",

In the getter function

      // FIXME Since we don't override properties in the decorator as it should
      // we just override the properties that we know are used
      g_object_get(decorator->concrete_protocol,pspec->name, &transport, NULL);
      g_value_set_pointer (value, transport);

But it will fail if it asks for other property of the concrete_protocol instance. So the question is:

Is there any way to install all properties installed on the concrete_protocol? So I can override the "Getter" and "Setter" and fordward the request to the decorated instance?

Best regards,

gtk-list mailing list