xref: /AOO41X/main/comphelper/inc/comphelper/servicehelper.hxx (revision 9877b273795ec465a3ce9c15d738eb34c0455705)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _COMPHELPER_SERVICEHELPER_HXX_
25 #define _COMPHELPER_SERVICEHELPER_HXX_
26 
27 /** the UNO3_GETIMPLEMENTATION_* macros  implement a static helper function
28     that gives access to your implementation for a given interface reference,
29     if possible.
30 
31     Example:
32         MyClass* pClass = MyClass::getImplementation( xRef );
33 
34     Usage:
35         Put a UNO3_GETIMPLEMENTATION_DECL( classname ) inside your class
36         definitian and UNO3_GETIMPLEMENTATION_IMPL( classname ) inside
37         your cxx file. Your class must inherit ::com::sun::star::uno::XUnoTunnel
38         and export it with queryInterface. Implementation of XUnoTunnel is
39         done by this macro.
40 */
41 #define UNO3_GETIMPLEMENTATION_DECL( classname ) \
42     static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId() throw(); \
43     static classname* getImplementation( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xInt ); \
44     virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);
45 
46 #define UNO3_GETIMPLEMENTATION_BASE_IMPL( classname ) \
47 const ::com::sun::star::uno::Sequence< sal_Int8 > & classname::getUnoTunnelId() throw() \
48 { \
49     static ::com::sun::star::uno::Sequence< sal_Int8 > * pSeq = 0; \
50     if( !pSeq ) \
51     { \
52         ::osl::Guard< ::osl::Mutex > aGuard( ::osl::Mutex::getGlobalMutex() ); \
53         if( !pSeq ) \
54         { \
55             static ::com::sun::star::uno::Sequence< sal_Int8 > aSeq( 16 ); \
56             rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True ); \
57             pSeq = &aSeq; \
58         } \
59     } \
60     return *pSeq; \
61 } \
62 \
63 classname* classname::getImplementation( const uno::Reference< uno::XInterface >& xInt ) \
64 { \
65     ::com::sun::star::uno::Reference< ::com::sun::star::lang::XUnoTunnel > xUT( xInt, ::com::sun::star::uno::UNO_QUERY ); \
66     if( xUT.is() ) \
67         return reinterpret_cast<classname*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething( classname::getUnoTunnelId() ))); \
68     else \
69         return NULL; \
70 }
71 
72 #define UNO3_GETIMPLEMENTATION_IMPL( classname )\
73 UNO3_GETIMPLEMENTATION_BASE_IMPL(classname)\
74 sal_Int64 SAL_CALL classname::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw(::com::sun::star::uno::RuntimeException) \
75 { \
76     if( rId.getLength() == 16 && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), \
77                                                          rId.getConstArray(), 16 ) ) \
78     { \
79         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); \
80     } \
81     return 0; \
82 }
83 
84 #define UNO3_GETIMPLEMENTATION2_IMPL( classname, baseclass )\
85 UNO3_GETIMPLEMENTATION_BASE_IMPL(classname)\
86 sal_Int64 SAL_CALL classname::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw(::com::sun::star::uno::RuntimeException) \
87 { \
88     if( rId.getLength() == 16 && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), \
89                                                          rId.getConstArray(), 16 ) ) \
90     { \
91         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); \
92     } \
93     else \
94     { \
95         return baseclass::getSomething( rId ); \
96     } \
97 }
98 
99 
100 #endif // _COMPHELPER_SERVICEHELPER_HXX_
101 
102