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