XInterface
All service implementations must implement com.sun.star.uno.XInterface. If a Java component is derived from a Java helper class that comes with the SDK, it supports XInterface
automatically. Otherwise, it is sufficient to add XInterface
or any other UNO interface to the implements list. The Java UNO runtime takes care of XInterface
. In C++, there are helper classes to inherit that already implement XInterface
. However, if XInterface
is to be implemented manually, consider the code below.
The IDL specification for com.sun.star.uno.XInterface looks like this:
// module com::sun::star::uno interface XInterface { any queryInterface( [in] type aType ); [oneway] void acquire(); [oneway] void release(); };
Requirements for queryInterface()
When queryInterface()
is called, the caller asks the implementation if it supports the interface specified by the type argument. The UNOIDL base type stores the name of a type and its com.sun.star.uno.TypeClass. The call must return an interface reference of the requested type if it is available or a void any if it is not. There are certain conditions a queryInterface()
implementation must meet:
Constant Behaviour
- If
queryInterface()
on a specific object has once returned a valid interface reference for a given type, it must always return a valid reference for any subsequentqueryInterface()
call for the same type on this object. A query forXInterface
must always return the same reference.
- If
queryInterface()
on a specific object has once returned a void any for a given type, it must always return a voidany
for the same type.
Symmetry
- If
queryInterface()
for XBar on a reference xFoo returns a reference xBar, thenqueryInterface()
on reference xBar for type XFoo must return xFoo or calls made on the returned reference must be equivalent to calls to xFoo.
Object Identity
- In C++, two objects are the same if their
XInterface
are the same. ThequeryInterface()
forXInterface
will have to be called on both. In Java, check for the identity by calling the runtime functioncom.sun.star.uni.UnoRuntime.areSame()
.
The reason for this specifications is that a UNO runtime environment may choose to cache queryInterface()
calls. The rules are identical to the rules of the function QueryInterface()
in MS COM.
If you want to implement queryInterface() in Java, for example, you want to export less interfaces than you implement, your class must implement the Java interface com.sun.star.uno.IQueryInterface. |
Reference Counting
The methods acquire()
and release()
handle the lifetime of the UNO object. This is discussed in detail in chapter Lifetime of UNO objects. Acquire and release must be implemented in a thread-safe fashion. This is demonstrated in C++ in the section about C++ components below.
Content on this page is licensed under the Public Documentation License (PDL). |