Post by Duncan GrisbyYou can register your own factories for proxy objects to do what you
want. I'm afraid it's not documented, however, so you'll have to read
the stub code to see how proxies are registered. You'll probably want to
use the -Wbvirtual_objref flag to omniidl's C++ backend so you can
override the object references' methods.
Cheers,
Duncan.
Many thanks to Duncan, I finally got the client proxies working.
To help the next person with the same question as mine, I thought I'd
write this up as a list of instructions you need to follow to create
your client proxies. Let's say you want to create proxies for Echo
interface, here are the steps you should follow,
1. Derive from the default proxy class, _objref_Echo. The tricky part
here is the constructor. You can't just assume the constructor of the
super class will do the right things for you by invoking it. You have
to copy the stub code, or your proxy class will not work and you will
get a nil pointer back at run time. So here's what the code should look
like,
class ProxyEcho : public virtual _objref_Echo {
public:
ProxyEcho(omniIOR* ior, omniIdentity* ident) :
omniObjRef(::Echo::_PD_repoId, ior, ident, 1),
_objref_Echo(ior, ident) {
_PR_setobj(this);
}
2. Derive from the default proxy object factory class, _pof_Echo and
override the newObjRef() function to instantiate your proxy class,
instead of the default proxy class. Here's what the code should look like,
class EchoProxyFactoryClass : public virtual _pof_Echo {
public:
virtual omniObjRef* newObjRef(omniIOR* ior, omniIdentity* ident) {
return new ProxyEcho(ior, ident, -1);
}
};
3. Create a new proxy object factory instance. The trick here is you
have to create it after the default one in the stub code gets created.
With Orbix, you can just create it by defining a global instance. With
omniORB, there's still a chance your global object gets instantiated
before the default one in the stubs, so you should create yours with the
"new" operator somewhere in your initialization, ie.
EchoProxyFactoryClass *myEchoProxyFactory = new EchoProxyFactoryClass();
4. Compile the IDL with -Wbvirtual_objref. This option declares all
object reference functions as virtual so your proxy class can override them.
5. If you compile your client code on Windows like I do, use -GR option
to the compiler to enable RTTI. This will allow you to use dynamic_cast
operator to convert a pointer to the default proxy class to a pointer to
your proxy class.
That's it. Enjoy your proxies!