1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase3.hxx> // "3" implementing three interfaces
25*b1cdbd2cSJim Jagielski #include <cppuhelper/factory.hxx>
26*b1cdbd2cSJim Jagielski #include <cppuhelper/implementationentry.hxx>
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XInitialization.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/IllegalArgumentException.hpp>
31*b1cdbd2cSJim Jagielski #include <my_module/XSomething.hpp>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski using namespace ::rtl; // for OUString
35*b1cdbd2cSJim Jagielski using namespace ::com::sun::star; // for odk interfaces
36*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno; // for basic types
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski namespace my_sc_impl
40*b1cdbd2cSJim Jagielski {
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski extern Sequence< OUString > SAL_CALL  getSupportedServiceNames_MyService1Impl();
43*b1cdbd2cSJim Jagielski extern OUString SAL_CALL getImplementationName_MyService1Impl();
44*b1cdbd2cSJim Jagielski extern Reference< XInterface > SAL_CALL create_MyService1Impl(
45*b1cdbd2cSJim Jagielski     Reference< XComponentContext > const & xContext )
46*b1cdbd2cSJim Jagielski     SAL_THROW( () );
47*b1cdbd2cSJim Jagielski 
getSupportedServiceNames_MyService2Impl()48*b1cdbd2cSJim Jagielski static Sequence< OUString > getSupportedServiceNames_MyService2Impl()
49*b1cdbd2cSJim Jagielski {
50*b1cdbd2cSJim Jagielski     Sequence<OUString> names(1);
51*b1cdbd2cSJim Jagielski     names[0] = OUString(RTL_CONSTASCII_USTRINGPARAM("my_module.MyService2"));
52*b1cdbd2cSJim Jagielski     return names;
53*b1cdbd2cSJim Jagielski }
54*b1cdbd2cSJim Jagielski 
getImplementationName_MyService2Impl()55*b1cdbd2cSJim Jagielski static OUString getImplementationName_MyService2Impl()
56*b1cdbd2cSJim Jagielski {
57*b1cdbd2cSJim Jagielski     return OUString( RTL_CONSTASCII_USTRINGPARAM(
58*b1cdbd2cSJim Jagielski                          "my_module.my_sc_implementation.MyService2") );
59*b1cdbd2cSJim Jagielski }
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski class MyService2Impl : public ::cppu::WeakImplHelper3<
62*b1cdbd2cSJim Jagielski       ::my_module::XSomething, lang::XServiceInfo, lang::XInitialization >
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski     OUString m_sData;
65*b1cdbd2cSJim Jagielski     // it's good practise to store the context for further use when you use
66*b1cdbd2cSJim Jagielski     // other UNO API's in your implementation
67*b1cdbd2cSJim Jagielski     Reference< XComponentContext > m_xContext;
68*b1cdbd2cSJim Jagielski public:
MyService2Impl(Reference<XComponentContext> const & xContext)69*b1cdbd2cSJim Jagielski     inline MyService2Impl(Reference< XComponentContext > const & xContext) throw ()
70*b1cdbd2cSJim Jagielski         : m_xContext(xContext)
71*b1cdbd2cSJim Jagielski         {}
72*b1cdbd2cSJim Jagielski 
~MyService2Impl()73*b1cdbd2cSJim Jagielski     virtual ~MyService2Impl() {}
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski     // focus on three given interfaces,
76*b1cdbd2cSJim Jagielski     // no need to implement XInterface, XTypeProvider, XWeak
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski     // XInitialization will be called upon
79*b1cdbd2cSJim Jagielski     // createInstanceWithArguments[AndContext]()
80*b1cdbd2cSJim Jagielski     virtual void SAL_CALL initialize( Sequence< Any > const & args )
81*b1cdbd2cSJim Jagielski         throw (Exception);
82*b1cdbd2cSJim Jagielski     // XSomething
83*b1cdbd2cSJim Jagielski     virtual OUString SAL_CALL methodOne( OUString const & str )
84*b1cdbd2cSJim Jagielski         throw (RuntimeException);
85*b1cdbd2cSJim Jagielski     virtual OUString SAL_CALL methodTwo( )
86*b1cdbd2cSJim Jagielski         throw (RuntimeException);
87*b1cdbd2cSJim Jagielski     // XServiceInfo
88*b1cdbd2cSJim Jagielski     virtual OUString SAL_CALL getImplementationName()
89*b1cdbd2cSJim Jagielski         throw (RuntimeException);
90*b1cdbd2cSJim Jagielski     virtual sal_Bool SAL_CALL supportsService( OUString const & serviceName )
91*b1cdbd2cSJim Jagielski         throw (RuntimeException);
92*b1cdbd2cSJim Jagielski     virtual Sequence< OUString > SAL_CALL getSupportedServiceNames()
93*b1cdbd2cSJim Jagielski         throw (RuntimeException);
94*b1cdbd2cSJim Jagielski };
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski // XInitialization implemention
initialize(Sequence<Any> const & args)97*b1cdbd2cSJim Jagielski void MyService2Impl::initialize( Sequence< Any > const & args )
98*b1cdbd2cSJim Jagielski     throw (Exception)
99*b1cdbd2cSJim Jagielski {
100*b1cdbd2cSJim Jagielski     if (args.getLength() != 1)
101*b1cdbd2cSJim Jagielski     {
102*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
103*b1cdbd2cSJim Jagielski             OUString( RTL_CONSTASCII_USTRINGPARAM(
104*b1cdbd2cSJim Jagielski                           "give a string instanciating this component!") ),
105*b1cdbd2cSJim Jagielski             // resolve to XInterface reference:
106*b1cdbd2cSJim Jagielski             static_cast< ::cppu::OWeakObject * >(this),
107*b1cdbd2cSJim Jagielski             0 ); // argument pos
108*b1cdbd2cSJim Jagielski     }
109*b1cdbd2cSJim Jagielski     if (! (args[ 0 ] >>= m_sData))
110*b1cdbd2cSJim Jagielski     {
111*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
112*b1cdbd2cSJim Jagielski             OUString( RTL_CONSTASCII_USTRINGPARAM(
113*b1cdbd2cSJim Jagielski                           "no string given as argument!") ),
114*b1cdbd2cSJim Jagielski             // resolve to XInterface reference:
115*b1cdbd2cSJim Jagielski             static_cast< ::cppu::OWeakObject * >(this),
116*b1cdbd2cSJim Jagielski             0 ); // argument pos
117*b1cdbd2cSJim Jagielski     }
118*b1cdbd2cSJim Jagielski }
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski // XSomething implementation
methodOne(OUString const & str)121*b1cdbd2cSJim Jagielski OUString MyService2Impl::methodOne( OUString const & str )
122*b1cdbd2cSJim Jagielski     throw (RuntimeException)
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski     m_sData = str;
125*b1cdbd2cSJim Jagielski     return OUString( RTL_CONSTASCII_USTRINGPARAM(
126*b1cdbd2cSJim Jagielski         "called methodOne() of MyService2 implementation: ") ) + m_sData;
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski 
methodTwo()129*b1cdbd2cSJim Jagielski OUString MyService2Impl::methodTwo( )
130*b1cdbd2cSJim Jagielski     throw (RuntimeException)
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski     return OUString( RTL_CONSTASCII_USTRINGPARAM(
133*b1cdbd2cSJim Jagielski         "called methodTwo() of MyService2 implementation: ") ) + m_sData;
134*b1cdbd2cSJim Jagielski }
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski // XServiceInfo implementation
getImplementationName()137*b1cdbd2cSJim Jagielski OUString MyService2Impl::getImplementationName()
138*b1cdbd2cSJim Jagielski     throw (RuntimeException)
139*b1cdbd2cSJim Jagielski {
140*b1cdbd2cSJim Jagielski     // unique implementation name
141*b1cdbd2cSJim Jagielski     return OUString( RTL_CONSTASCII_USTRINGPARAM(
142*b1cdbd2cSJim Jagielski                          "my_module.my_sc_implementation.MyService2") );
143*b1cdbd2cSJim Jagielski }
144*b1cdbd2cSJim Jagielski 
supportsService(OUString const & serviceName)145*b1cdbd2cSJim Jagielski sal_Bool MyService2Impl::supportsService( OUString const & serviceName )
146*b1cdbd2cSJim Jagielski     throw (RuntimeException)
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski     // this object only supports one service, so the test is simple
149*b1cdbd2cSJim Jagielski     return serviceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(
150*b1cdbd2cSJim Jagielski                                          "my_module.MyService2") );
151*b1cdbd2cSJim Jagielski }
152*b1cdbd2cSJim Jagielski 
getSupportedServiceNames()153*b1cdbd2cSJim Jagielski Sequence< OUString > MyService2Impl::getSupportedServiceNames()
154*b1cdbd2cSJim Jagielski     throw (RuntimeException)
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski     return getSupportedServiceNames_MyService2Impl();
157*b1cdbd2cSJim Jagielski }
158*b1cdbd2cSJim Jagielski 
create_MyService2Impl(Reference<XComponentContext> const & xContext)159*b1cdbd2cSJim Jagielski Reference< XInterface > SAL_CALL create_MyService2Impl(
160*b1cdbd2cSJim Jagielski     Reference< XComponentContext > const & xContext )
161*b1cdbd2cSJim Jagielski     SAL_THROW( () )
162*b1cdbd2cSJim Jagielski {
163*b1cdbd2cSJim Jagielski     return static_cast< ::cppu::OWeakObject * >( new MyService2Impl( xContext ) );
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski }
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski /* shared lib exports implemented without helpers in service_impl1.cxx */
169*b1cdbd2cSJim Jagielski namespace my_sc_impl
170*b1cdbd2cSJim Jagielski {
171*b1cdbd2cSJim Jagielski static struct ::cppu::ImplementationEntry s_component_entries [] =
172*b1cdbd2cSJim Jagielski {
173*b1cdbd2cSJim Jagielski     {
174*b1cdbd2cSJim Jagielski         create_MyService1Impl, getImplementationName_MyService1Impl,
175*b1cdbd2cSJim Jagielski         getSupportedServiceNames_MyService1Impl,
176*b1cdbd2cSJim Jagielski         ::cppu::createSingleComponentFactory,
177*b1cdbd2cSJim Jagielski         0, 0
178*b1cdbd2cSJim Jagielski     },
179*b1cdbd2cSJim Jagielski     {
180*b1cdbd2cSJim Jagielski         create_MyService2Impl, getImplementationName_MyService2Impl,
181*b1cdbd2cSJim Jagielski         getSupportedServiceNames_MyService2Impl,
182*b1cdbd2cSJim Jagielski         ::cppu::createSingleComponentFactory,
183*b1cdbd2cSJim Jagielski         0, 0
184*b1cdbd2cSJim Jagielski     },
185*b1cdbd2cSJim Jagielski     { 0, 0, 0, 0, 0, 0 }
186*b1cdbd2cSJim Jagielski };
187*b1cdbd2cSJim Jagielski }
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski extern "C"
190*b1cdbd2cSJim Jagielski {
component_getImplementationEnvironment(sal_Char const ** ppEnvTypeName,uno_Environment **)191*b1cdbd2cSJim Jagielski SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment(
192*b1cdbd2cSJim Jagielski     sal_Char const ** ppEnvTypeName, uno_Environment ** )
193*b1cdbd2cSJim Jagielski {
194*b1cdbd2cSJim Jagielski     *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski // This method not longer necessary since OOo 3.4 where the component registration was
198*b1cdbd2cSJim Jagielski // was changed to passive component registration. For more details see
199*b1cdbd2cSJim Jagielski // http://wiki.services.openoffice.org/wiki/Passive_Component_Registration
200*b1cdbd2cSJim Jagielski //
201*b1cdbd2cSJim Jagielski // sal_Bool SAL_CALL component_writeInfo(
202*b1cdbd2cSJim Jagielski //     lang::XMultiServiceFactory * xMgr, registry::XRegistryKey * xRegistry )
203*b1cdbd2cSJim Jagielski // {
204*b1cdbd2cSJim Jagielski //     return ::cppu::component_writeInfoHelper(
205*b1cdbd2cSJim Jagielski //         xMgr, xRegistry, ::my_sc_impl::s_component_entries );
206*b1cdbd2cSJim Jagielski // }
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski 
component_getFactory(sal_Char const * implName,lang::XMultiServiceFactory * xMgr,registry::XRegistryKey * xRegistry)209*b1cdbd2cSJim Jagielski SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory(
210*b1cdbd2cSJim Jagielski     sal_Char const * implName, lang::XMultiServiceFactory * xMgr,
211*b1cdbd2cSJim Jagielski     registry::XRegistryKey * xRegistry )
212*b1cdbd2cSJim Jagielski {
213*b1cdbd2cSJim Jagielski     return ::cppu::component_getFactoryHelper(
214*b1cdbd2cSJim Jagielski         implName, xMgr, xRegistry, ::my_sc_impl::s_component_entries );
215*b1cdbd2cSJim Jagielski }
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski }
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski 
220