diff options
Diffstat (limited to 'odk/examples/DevelopersGuide/Components/CppComponent')
6 files changed, 897 insertions, 0 deletions
diff --git a/odk/examples/DevelopersGuide/Components/CppComponent/Makefile b/odk/examples/DevelopersGuide/Components/CppComponent/Makefile new file mode 100644 index 000000000000..0a4e7eee4cae --- /dev/null +++ b/odk/examples/DevelopersGuide/Components/CppComponent/Makefile @@ -0,0 +1,220 @@ +#************************************************************************* +# +# The Contents of this file are made available subject to the terms of +# the BSD license. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the name of Sun Microsystems, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +#************************************************************************** + +# Builds the C++ component example of the Developers Guide. + +PRJ=../../../.. +SETTINGS=$(PRJ)/settings + +include $(SETTINGS)/settings.mk +include $(SETTINGS)/std.mk +include $(SETTINGS)/dk.mk + +# Define non-platform/compiler specific settings +SAMPLE_NAME=CppComponentSample +SAMPLE_INC_OUT=$(OUT_INC)/$(SAMPLE_NAME) +SAMPLE_GEN_OUT=$(OUT_MISC)/$(SAMPLE_NAME) +SAMPLE_SLO_OUT=$(OUT_SLO)/$(SAMPLE_NAME) +SAMPLE_OBJ_OUT=$(OUT_OBJ)/$(SAMPLE_NAME) + +COMP_NAME=CppComponent +COMP_IMPL_NAME=$(COMP_NAME).uno.$(SHAREDLIB_EXT) + +APP1_NAME= TestCppComponent +APP1_BINARY= $(OUT_BIN)/$(APP1_NAME)$(EXE_EXT) + +COMP_RDB_NAME = $(COMP_NAME).uno.rdb +COMP_RDB = $(SAMPLE_GEN_OUT)/$(COMP_RDB_NAME) +COMP_PACKAGE = $(OUT_BIN)/$(COMP_NAME).$(UNOOXT_EXT) +COMP_PACKAGE_URL = $(subst \\,\,"$(COMP_PACKAGE_DIR)$(PS)$(COMP_NAME).$(UNOOXT_EXT)") +COMP_UNOPKG_MANIFEST = $(SAMPLE_GEN_OUT)/$(COMP_NAME)/META-INF/manifest.xml +COMP_MAPFILE = $(SAMPLE_GEN_OUT)/$(COMP_NAME).uno.map + +COMP_REGISTERFLAG = $(SAMPLE_GEN_OUT)/devguide_$(COMP_NAME)_register_component.flag +COMP_TYPEFLAG = $(SAMPLE_GEN_OUT)/devguide_$(COMP_NAME)_types.flag + +IDLFILES = some.idl + +CXXFILES = service1_impl.cxx \ + service2_impl.cxx + +SLOFILES = $(patsubst %.cxx,$(SAMPLE_SLO_OUT)/%.$(OBJ_EXT),$(CXXFILES)) + +GENURDFILES = $(patsubst %.idl,$(SAMPLE_GEN_OUT)/%.urd,$(IDLFILES)) + +TYPELIST=-Tmy_module.XSomething \ + -Tmy_modules.MyService1 \ + -Tmy_module.MyService2 + +# Targets +.PHONY: ALL +ALL : \ + $(SAMPLE_NAME) + +include $(SETTINGS)/stdtarget.mk + +$(SAMPLE_GEN_OUT)/%.urd : %.idl + -$(MKDIR) $(subst /,$(PS),$(@D)) + $(IDLC) -I. -I$(IDL_DIR) -O$(SAMPLE_GEN_OUT) $< + +$(SAMPLE_GEN_OUT)/%.rdb : $(GENURDFILES) + -$(DEL) $(subst \\,\,$(subst /,$(PS),$@)) + -$(MKDIR) $(subst /,$(PS),$(@D)) + $(REGMERGE) $@ /UCR $(GENURDFILES) + +$(COMP_TYPEFLAG) : $(COMP_RDB) $(SDKTYPEFLAG) + -$(DEL) $(subst \\,\,$(subst /,$(PS),$@)) + -$(MKDIR) $(subst /,$(PS),$(@D)) + $(CPPUMAKER) -Gc -BUCR -O$(SAMPLE_INC_OUT) $(TYPESLIST) $(COMP_RDB) -X$(URE_TYPES) -X$(OFFICE_TYPES) + echo flagged > $@ + +$(SAMPLE_SLO_OUT)/%.$(OBJ_EXT) : %.cxx $(COMP_TYPEFLAG) + -$(MKDIR) $(subst /,$(PS),$(@D)) + $(CC) $(CC_FLAGS) $(CC_INCLUDES) -I$(SAMPLE_INC_OUT) $(CC_DEFINES) $(CC_OUTPUT_SWITCH)$(subst /,$(PS),$@) $< + +$(COMP_MAPFILE) : $(SLOFILES) + -$(MKDIR) $(subst /,$(PS),$(@D)) + cat $(PRJ)/settings/component.uno.map > $(COMP_MAPFILE) +ifeq "$(OS)" "MACOSX" + nm -gx $(SLOFILES) | $(ADDSYMBOLS) >> $(COMP_MAPFILE) +endif + +ifeq "$(OS)" "WIN" +$(SHAREDLIB_OUT)/%.$(SHAREDLIB_EXT) : $(SLOFILES) + -$(MKDIR) $(subst /,$(PS),$(@D)) + -$(MKDIR) $(subst /,$(PS),$(SAMPLE_GEN_OUT)) + $(LINK) $(COMP_LINK_FLAGS) /OUT:$@ \ + /MAP:$(SAMPLE_GEN_OUT)/$(subst $(SHAREDLIB_EXT),map,$(@F)) $(SLOFILES) \ + $(CPPUHELPERLIB) $(CPPULIB) $(SALLIB) $(STLPORTLIB) msvcrt.lib kernel32.lib + $(LINK_MANIFEST) +else +$(SHAREDLIB_OUT)/%.$(SHAREDLIB_EXT) : $(SLOFILES) $(COMP_MAPFILE) + -$(MKDIR) $(subst /,$(PS),$(@D)) && $(DEL) $(subst \\,\,$(subst /,$(PS),$@)) + $(LINK) $(COMP_LINK_FLAGS) $(LINK_LIBS) -o $@ $(SLOFILES) \ + $(CPPUHELPERLIB) $(CPPULIB) $(SALLIB) $(STLPORTLIB) $(STC++LIB) $(CPPUHELPERDYLIB) $(CPPUDYLIB) $(SALDYLIB) +ifeq "$(OS)" "MACOSX" + $(INSTALL_NAME_URELIBS) $@ +endif +endif + +# rule for component package manifest +$(SAMPLE_GEN_OUT)/%/manifest.xml : + -$(MKDIR) $(subst /,$(PS),$(@D)) + @echo $(OSEP)?xml version="$(QM)1.0$(QM)" encoding="$(QM)UTF-8$(QM)"?$(CSEP) > $@ + @echo $(OSEP)!DOCTYPE manifest:manifest PUBLIC "$(QM)-//OpenOffice.org//DTD Manifest 1.0//EN$(QM)" "$(QM)Manifest.dtd$(QM)"$(CSEP) >> $@ + @echo $(OSEP)manifest:manifest xmlns:manifest="$(QM)http://openoffice.org/2001/manifest$(QM)"$(CSEP) >> $@ + @echo $(SQM) $(SQM)$(OSEP)manifest:file-entry manifest:media-type="$(QM)application/vnd.sun.star.uno-typelibrary;type=RDB$(QM)" >> $@ + @echo $(SQM) $(SQM)manifest:full-path="$(QM)$(subst /META-INF,,$(subst $(SAMPLE_GEN_OUT)/,,$(@D))).uno.rdb$(QM)"/$(CSEP) >> $@ + @echo $(SQM) $(SQM)$(OSEP)manifest:file-entry manifest:media-type="$(QM)application/vnd.sun.star.uno-component;type=native;platform=$(UNOPKG_PLATFORM)$(QM)" >> $@ + @echo $(SQM) $(SQM)manifest:full-path="$(QM)$(subst /META-INF,,$(subst $(SAMPLE_GEN_OUT)/,,$(UNOPKG_PLATFORM)/$(@D))).uno.$(SHAREDLIB_EXT)$(QM)"/$(CSEP) >> $@ + @echo $(OSEP)/manifest:manifest$(CSEP) >> $@ + +$(COMP_PACKAGE) : $(SHAREDLIB_OUT)/$(COMP_IMPL_NAME) $(COMP_RDB) $(COMP_UNOPKG_MANIFEST) + -$(DEL) $(subst \\,\,$(subst /,$(PS),$@)) + -$(MKDIR) $(subst /,$(PS),$(@D)) + -$(MKDIR) $(subst /,$(PS),$(SAMPLE_GEN_OUT)/$(UNOPKG_PLATFORM)) + $(COPY) $(subst /,$(PS),$<) $(subst /,$(PS),$(SAMPLE_GEN_OUT)/$(UNOPKG_PLATFORM)) + cd $(subst /,$(PS),$(SAMPLE_GEN_OUT)) && $(SDK_ZIP) ../../bin/$(@F) $(COMP_RDB_NAME) $(UNOPKG_PLATFORM)/$(<F) + cd $(subst /,$(PS),$(SAMPLE_GEN_OUT)/$(subst .$(UNOOXT_EXT),,$(@F))) && $(SDK_ZIP) -u ../../../bin/$(@F) META-INF/manifest.xml + + +$(COMP_REGISTERFLAG) : $(COMP_PACKAGE) +ifeq "$(SDK_AUTO_DEPLOYMENT)" "YES" + -$(DEL) $(subst \\,\,$(subst /,$(PS),$@)) + -$(MKDIR) $(subst /,$(PS),$(@D)) + $(DEPLOYTOOL) $(COMP_PACKAGE_URL) + @echo flagged > $(subst /,$(PS),$@) +else + @echo -------------------------------------------------------------------------------- + @echo If you want to install your component automatically, please set the environment + @echo variable SDK_AUTO_DEPLOYMENT = YES. But note that auto deployment is only + @echo possible if no office instance is running. + @echo -------------------------------------------------------------------------------- +endif + +$(SAMPLE_OBJ_OUT)/$(APP1_NAME).$(OBJ_EXT) : $(APP1_NAME).cxx $(COMP_TYPEFLAG) + -$(MKDIR) $(subst /,$(PS),$(@D)) + $(CC) $(CC_FLAGS) $(CC_INCLUDES) -I$(SAMPLE_INC_OUT) $(CC_DEFINES) $(CC_OUTPUT_SWITCH)$(subst /,$(PS),$@) $< + +$(OUT_BIN)/_$(APP1_NAME)$(EXE_EXT) : $(SAMPLE_OBJ_OUT)/$(APP1_NAME).$(OBJ_EXT) + -$(MKDIR) $(subst /,$(PS),$(@D)) + -$(MKDIR) $(subst /,$(PS),$(SAMPLE_GEN_OUT)) +ifeq "$(OS)" "WIN" + $(LINK) $(EXE_LINK_FLAGS) /OUT:$@ /MAP:$(SAMPLE_GEN_OUT)/$(basename $(@F)).map \ + $< $(CPPUHELPERLIB) $(CPPULIB) $(SALHELPERLIB) $(SALLIB) $(STLPORTLIB) +else + $(LINK) $(EXE_LINK_FLAGS) $(LINK_LIBS) -o $@ $< \ + $(CPPUHELPERLIB) $(CPPULIB) $(SALHELPERLIB) $(SALLIB) $(STLPORTLIB) $(STDC++LIB) $(CPPUHELPERDYLIB) $(CPPUDYLIB) $(SALHELPERDYLIB) $(SALDYLIB) +ifeq "$(OS)" "MACOSX" + $(INSTALL_NAME_URELIBS_BIN) $@ +endif +endif + +$(OUT_BIN)/$(APP1_NAME)$(EXE_EXT) : $(OUT_BIN)/_$(APP1_NAME)$(EXE_EXT) + $(COPY) $(subst /,$(PS),$(BIN_DIR)/unoapploader$(EXE_EXT)) $(subst /,$(PS),$@) +# touch the target to renew the date for correct dependencies. +# Note: no touch under windows! The unoapploader.exe is copied always. +ifneq "$(OS)" "WIN" + touch $@ +endif + +$(SAMPLE_NAME) : $(COMP_REGISTERFLAG) $(APP1_BINARY) + @echo -------------------------------------------------------------------------------- + @echo Please use the following command to execute the example! + @echo - + @echo $(MAKE) $(APP1_NAME).run + @echo -------- + @echo The simple C++ component was installed if SDK_AUTO_DEPLOYMENT = YES. + @echo You can use this component inside your office installation, see the example + @echo description. You can also load the "$(QM)SimpleComponent.odt$(QM)" document containing + @echo a StarBasic macro which uses this component. + @echo - + @echo $(MAKE) SimpleComponent.odt.load + @echo -------------------------------------------------------------------------------- + +%.run: $(OUT_BIN)/%$(EXE_EXT) + $(subst /,$(PS),$(OUT_BIN))$(PS)$(basename $@) +# cd $(subst /,$(PS),$(OUT_BIN)) && $(basename $@) + +SimpleComponent.odt.load : $(COMP_REGISTERFLAG) + "$(OFFICE_PROGRAM_PATH)$(PS)soffice" $(basename $@) + +.PHONY: clean +clean : + -$(DELRECURSIVE) $(subst /,$(PS),$(SAMPLE_INC_OUT)) + -$(DELRECURSIVE) $(subst /,$(PS),$(SAMPLE_GEN_OUT)) + -$(DELRECURSIVE) $(subst /,$(PS),$(SAMPLE_SLO_OUT)) + -$(DELRECURSIVE) $(subst /,$(PS),$(SAMPLE_OBJ_OUT)) + -$(DEL) $(subst \\,\,$(subst /,$(PS),$(OUT_BIN)/$(COMP_NAME)*)) + -$(DEL) $(subst \\,\,$(subst /,$(PS),$(OUT_BIN)/*$(APP1_NAME)*)) diff --git a/odk/examples/DevelopersGuide/Components/CppComponent/SimpleComponent.odt b/odk/examples/DevelopersGuide/Components/CppComponent/SimpleComponent.odt Binary files differnew file mode 100644 index 000000000000..e8d7e9133284 --- /dev/null +++ b/odk/examples/DevelopersGuide/Components/CppComponent/SimpleComponent.odt diff --git a/odk/examples/DevelopersGuide/Components/CppComponent/TestCppComponent.cxx b/odk/examples/DevelopersGuide/Components/CppComponent/TestCppComponent.cxx new file mode 100644 index 000000000000..93416f65c3e9 --- /dev/null +++ b/odk/examples/DevelopersGuide/Components/CppComponent/TestCppComponent.cxx @@ -0,0 +1,89 @@ +/************************************************************************* + * + * The Contents of this file are made available subject to the terms of + * the BSD license. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *************************************************************************/ + +#include <stdio.h> +#include <sal/main.h> +#include <cppuhelper/bootstrap.hxx> +#include <com/sun/star/bridge/XUnoUrlResolver.hpp> +#include <com/sun/star/frame/XComponentLoader.hpp> +#include <my_module/MyService1.hpp> +#include <my_module/MyService2.hpp> + +using namespace rtl; +using namespace com::sun::star::uno; +//namespace cssuno = ::com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::frame; + +SAL_IMPLEMENT_MAIN() +{ + try + { + // get the remote office component context + Reference< XComponentContext > xContext( ::cppu::bootstrap() ); + fprintf(stdout, "\nconnected to a running office...\n"); + + // create a new instance of MyService1 + Reference<my_module::XSomething> xSomething = + my_module::MyService1::create(xContext); + + // call methodOne and print the return value on stdout + OUString s = xSomething->methodOne(OUString(RTL_CONSTASCII_USTRINGPARAM("Hello World!"))); + fprintf(stdout,"\nCreate new instance of MyService1\nCall of XSomething.methOne at MyService1 = %s", OUStringToOString( s, RTL_TEXTENCODING_ASCII_US ).getStr()); + + // create a new instance of MyService2 with the specified string argument + xSomething = my_module::MyService2::create(xContext, OUString(RTL_CONSTASCII_USTRINGPARAM("Hello My World!"))); + + // call methodTwo and print the return value of methodTwo + s = xSomething->methodTwo(); + fprintf(stdout, "\n\nCreate new instance of MyService2 with argument\nCall of XSomething.methTwo at MyService2 = %s", OUStringToOString( s, RTL_TEXTENCODING_ASCII_US ).getStr()); + + fprintf(stdout, "\n\nPlease press 'return' to finish the example!\n"); + getchar(); + } + catch ( ::cppu::BootstrapException & e ) + { + fprintf(stderr, "\ncaught BootstrapException: %s\n", + OUStringToOString( e.getMessage(), RTL_TEXTENCODING_ASCII_US ).getStr()); + return 1; + } + catch ( Exception & e ) + { + fprintf(stderr, "\ncaught UNO exception: %s\n", + OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr()); + return 1; + } + + return 0; +} diff --git a/odk/examples/DevelopersGuide/Components/CppComponent/service1_impl.cxx b/odk/examples/DevelopersGuide/Components/CppComponent/service1_impl.cxx new file mode 100644 index 000000000000..a3c13216066d --- /dev/null +++ b/odk/examples/DevelopersGuide/Components/CppComponent/service1_impl.cxx @@ -0,0 +1,309 @@ +/************************************************************************* + * + * The Contents of this file are made available subject to the terms of + * the BSD license. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *************************************************************************/ + +#include <osl/interlck.h> +#include <osl/mutex.hxx> +#include <rtl/uuid.h> +#include <cppuhelper/factory.hxx> + +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XTypeProvider.hpp> +#include <my_module/XSomething.hpp> + + +using namespace ::rtl; // for OUString +using namespace ::com::sun::star; // for odk interfaces +using namespace ::com::sun::star::uno; // for basic types + +namespace my_sc_impl +{ + +Sequence< OUString > SAL_CALL getSupportedServiceNames_MyService1Impl() +{ + Sequence< OUString > names(1); + names[0] = OUString(RTL_CONSTASCII_USTRINGPARAM("my_module.MyService1")); + return names; +} + +OUString SAL_CALL getImplementationName_MyService1Impl() +{ + return OUString( RTL_CONSTASCII_USTRINGPARAM( + "my_module.my_sc_implementation.MyService1") ); +} + + +class MyService1Impl + : public ::my_module::XSomething + , public lang::XServiceInfo + , public lang::XTypeProvider +{ + oslInterlockedCount m_refcount; + OUString m_sData; + // it's good practise to store the context for further use when you use + // other UNO API's in your implementation + Reference< XComponentContext > m_xContext; +public: + inline MyService1Impl(Reference< XComponentContext > const & xContext) throw () + : m_refcount( 0 ), + m_xContext(xContext) + {} + + virtual ~MyService1Impl() {} + + // XInterface + virtual Any SAL_CALL queryInterface( Type const & type ) + throw (RuntimeException); + virtual void SAL_CALL acquire() + throw (); + virtual void SAL_CALL release() + throw (); + // XTypeProvider + virtual Sequence< Type > SAL_CALL getTypes() + throw (RuntimeException); + virtual Sequence< sal_Int8 > SAL_CALL getImplementationId() + throw (RuntimeException); + // XSomething + virtual OUString SAL_CALL methodOne( OUString const & str ) + throw (RuntimeException); + virtual OUString SAL_CALL methodTwo( ) + throw (RuntimeException); + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() + throw (RuntimeException); + virtual sal_Bool SAL_CALL supportsService( OUString const & serviceName ) + throw (RuntimeException); + virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() + throw (RuntimeException); +}; + +// XInterface implementation +Any MyService1Impl::queryInterface( Type const & type ) + throw (RuntimeException) +{ + if (type.equals(::cppu::UnoType< Reference< XInterface > >::get())) + { + // return XInterface interface + // (resolve ambiguity by casting to lang::XTypeProvider) + Reference< XInterface > x( + static_cast< lang::XTypeProvider * >( this ) ); + return makeAny( x ); + } + if (type.equals(::cppu::UnoType< Reference< lang::XTypeProvider > >::get())) + { + // return XInterface interface + Reference< XInterface > x( + static_cast< lang::XTypeProvider * >( this ) ); + return makeAny( x ); + } + if (type.equals(::cppu::UnoType< Reference< lang::XServiceInfo > >::get())) + { + // return XServiceInfo interface + Reference< lang::XServiceInfo > x( + static_cast< lang::XServiceInfo * >( this ) ); + return makeAny( x ); + } + if (type.equals(::cppu::UnoType< Reference< ::my_module::XSomething > >::get())) + { + // return sample interface + Reference< ::my_module::XSomething > x( + static_cast< ::my_module::XSomething * >( this ) ); + return makeAny( x ); + } + // querying for unsupported type + return Any(); +} + +void MyService1Impl::acquire() + throw () +{ + // thread-safe incrementation of reference count + ::osl_incrementInterlockedCount( &m_refcount ); +} + +void MyService1Impl::release() + throw () +{ + // thread-safe decrementation of reference count + if (0 == ::osl_decrementInterlockedCount( &m_refcount )) + { + delete this; // shutdown this object + } +} + +// XTypeProvider implementation +Sequence< Type > MyService1Impl::getTypes() + throw (RuntimeException) +{ + Sequence< Type > seq( 3 ); + seq[ 0 ] = ::cppu::UnoType< Reference< lang::XTypeProvider > >::get(); + seq[ 1 ] = ::cppu::UnoType< Reference< lang::XServiceInfo > >::get(); + seq[ 2 ] = ::cppu::UnoType< Reference< ::my_module::XSomething > >::get(); + return seq; +} +Sequence< sal_Int8 > MyService1Impl::getImplementationId() + throw (RuntimeException) +{ + static Sequence< sal_Int8 > * s_pId = 0; + if (! s_pId) + { + // create unique id + Sequence< sal_Int8 > id( 16 ); + ::rtl_createUuid( (sal_uInt8 *)id.getArray(), 0, sal_True ); + // guard initialization with some mutex + ::osl::MutexGuard guard( ::osl::Mutex::getGlobalMutex() ); + if (! s_pId) + { + static Sequence< sal_Int8 > s_id( id ); + s_pId = &s_id; + } + } + return *s_pId; +} + +// XSomething implementation +OUString MyService1Impl::methodOne( OUString const & str ) + throw (RuntimeException) +{ + m_sData = str; + return OUString( RTL_CONSTASCII_USTRINGPARAM( + "called methodOne() of MyService1 implementation: ") ) + m_sData; +} + +OUString MyService1Impl::methodTwo( ) + throw (RuntimeException) +{ + return OUString( RTL_CONSTASCII_USTRINGPARAM( + "called methodTwo() of MyService1 implementation: ") ) + m_sData; +} + +// XServiceInfo implementation +OUString MyService1Impl::getImplementationName() + throw (RuntimeException) +{ + // unique implementation name + return OUString( RTL_CONSTASCII_USTRINGPARAM( + "my_module.my_sc_implementation.MyService1") ); +} +sal_Bool MyService1Impl::supportsService( OUString const & serviceName ) + throw (RuntimeException) +{ + // this object only supports one service, so the test is simple + return serviceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( + "my_module.MyService1") ); +} +Sequence< OUString > MyService1Impl::getSupportedServiceNames() + throw (RuntimeException) +{ + // this object only supports one service + OUString serviceName( RTL_CONSTASCII_USTRINGPARAM("my_module.MyService1") ); + return Sequence< OUString >( &serviceName, 1 ); +} + +Reference< XInterface > SAL_CALL create_MyService1Impl( + Reference< XComponentContext > const & xContext ) + SAL_THROW( () ) +{ + return static_cast< lang::XTypeProvider * >( new MyService1Impl( xContext) ); +} + +// forward decl: implemented in service2_impl.cxx +Reference< XInterface > SAL_CALL create_MyService2Impl( + Reference< XComponentContext > const & ) SAL_THROW( () ); + +} + +/* +extern "C" void SAL_CALL component_getImplementationEnvironment( + sal_Char const ** ppEnvTypeName, uno_Environment ** ) +{ + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; +} + +extern "C" sal_Bool SAL_CALL component_writeInfo( + lang::XMultiServiceFactory * xMgr, registry::XRegistryKey * xRegistry ) +{ + if (xRegistry) + { + try + { + // implementation of MyService1A + Reference< registry::XRegistryKey > xKey( + xRegistry->createKey( OUString( RTL_CONSTASCII_USTRINGPARAM( + "my_module.my_sc_implementation.MyService1/UNO/SERVICES") ) ) ); + // subkeys denote implemented services of implementation + xKey->createKey( OUString( RTL_CONSTASCII_USTRINGPARAM( + "my_module.MyService1") ) ); + // implementation of MyService1B + xKey = xRegistry->createKey( OUString( RTL_CONSTASCII_USTRINGPARAM( + "my_module.my_sc_implementation.MyService2/UNO/SERVICES") ) ); + // subkeys denote implemented services of implementation + xKey->createKey( OUString( RTL_CONSTASCII_USTRINGPARAM( + "my_module.MyService2") ) ); + return sal_True; // success + } + catch (registry::InvalidRegistryException &) + { + // function fails if exception caught + } + } + return sal_False; +} +extern "C" void * SAL_CALL component_getFactory( + sal_Char const * implName, lang::XMultiServiceFactory * xMgr, void * ) +{ + Reference< lang::XSingleComponentFactory > xFactory; + if (0 == ::rtl_str_compare( implName, "my_module.my_sc_implementation.MyService1" )) + { + // create component factory for MyService1 implementation + OUString serviceName( RTL_CONSTASCII_USTRINGPARAM("my_module.MyService1") ); + xFactory = ::cppu::createSingleComponentFactory( + ::my_sc_impl::create_MyService1Impl, + OUString( RTL_CONSTASCII_USTRINGPARAM("my_module.my_sc_implementation.MyService1") ), + Sequence< OUString >( &serviceName, 1 ) ); + } + else if (0 == ::rtl_str_compare( implName, "my_module.my_sc_implementation.MyService2" )) + { + // create component factory for MyService12 implementation + OUString serviceName( RTL_CONSTASCII_USTRINGPARAM("my_module.MyService2") ); + xFactory = ::cppu::createSingleComponentFactory( + ::my_sc_impl::create_MyService2Impl, + OUString( RTL_CONSTASCII_USTRINGPARAM("my_module.my_sc_implementation.MyService2") ), + Sequence< OUString >( &serviceName, 1 ) ); + } + if (xFactory.is()) + xFactory->acquire(); + return xFactory.get(); // return acquired interface pointer or null +} +*/ + diff --git a/odk/examples/DevelopersGuide/Components/CppComponent/service2_impl.cxx b/odk/examples/DevelopersGuide/Components/CppComponent/service2_impl.cxx new file mode 100644 index 000000000000..8589f8e88ab7 --- /dev/null +++ b/odk/examples/DevelopersGuide/Components/CppComponent/service2_impl.cxx @@ -0,0 +1,225 @@ +/************************************************************************* + * + * The Contents of this file are made available subject to the terms of + * the BSD license. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *************************************************************************/ + +#include <cppuhelper/implbase3.hxx> // "3" implementing three interfaces +#include <cppuhelper/factory.hxx> +#include <cppuhelper/implementationentry.hxx> + +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/lang/IllegalArgumentException.hpp> +#include <my_module/XSomething.hpp> + + +using namespace ::rtl; // for OUString +using namespace ::com::sun::star; // for odk interfaces +using namespace ::com::sun::star::uno; // for basic types + + +namespace my_sc_impl +{ + +extern Sequence< OUString > SAL_CALL getSupportedServiceNames_MyService1Impl(); +extern OUString SAL_CALL getImplementationName_MyService1Impl(); +extern Reference< XInterface > SAL_CALL create_MyService1Impl( + Reference< XComponentContext > const & xContext ) + SAL_THROW( () ); + +static Sequence< OUString > getSupportedServiceNames_MyService2Impl() +{ + Sequence<OUString> names(1); + names[0] = OUString(RTL_CONSTASCII_USTRINGPARAM("my_module.MyService2")); + return names; +} + +static OUString getImplementationName_MyService2Impl() +{ + return OUString( RTL_CONSTASCII_USTRINGPARAM( + "my_module.my_sc_implementation.MyService2") ); +} + +class MyService2Impl : public ::cppu::WeakImplHelper3< + ::my_module::XSomething, lang::XServiceInfo, lang::XInitialization > +{ + OUString m_sData; + // it's good practise to store the context for further use when you use + // other UNO API's in your implementation + Reference< XComponentContext > m_xContext; +public: + inline MyService2Impl(Reference< XComponentContext > const & xContext) throw () + : m_xContext(xContext) + {} + + virtual ~MyService2Impl() {} + + // focus on three given interfaces, + // no need to implement XInterface, XTypeProvider, XWeak + + // XInitialization will be called upon + // createInstanceWithArguments[AndContext]() + virtual void SAL_CALL initialize( Sequence< Any > const & args ) + throw (Exception); + // XSomething + virtual OUString SAL_CALL methodOne( OUString const & str ) + throw (RuntimeException); + virtual OUString SAL_CALL methodTwo( ) + throw (RuntimeException); + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() + throw (RuntimeException); + virtual sal_Bool SAL_CALL supportsService( OUString const & serviceName ) + throw (RuntimeException); + virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() + throw (RuntimeException); +}; + +// XInitialization implemention +void MyService2Impl::initialize( Sequence< Any > const & args ) + throw (Exception) +{ + if (args.getLength() != 1) + { + throw lang::IllegalArgumentException( + OUString( RTL_CONSTASCII_USTRINGPARAM( + "give a string instanciating this component!") ), + // resolve to XInterface reference: + static_cast< ::cppu::OWeakObject * >(this), + 0 ); // argument pos + } + if (! (args[ 0 ] >>= m_sData)) + { + throw lang::IllegalArgumentException( + OUString( RTL_CONSTASCII_USTRINGPARAM( + "no string given as argument!") ), + // resolve to XInterface reference: + static_cast< ::cppu::OWeakObject * >(this), + 0 ); // argument pos + } +} + +// XSomething implementation +OUString MyService2Impl::methodOne( OUString const & str ) + throw (RuntimeException) +{ + m_sData = str; + return OUString( RTL_CONSTASCII_USTRINGPARAM( + "called methodOne() of MyService2 implementation: ") ) + m_sData; +} + +OUString MyService2Impl::methodTwo( ) + throw (RuntimeException) +{ + return OUString( RTL_CONSTASCII_USTRINGPARAM( + "called methodTwo() of MyService2 implementation: ") ) + m_sData; +} + +// XServiceInfo implementation +OUString MyService2Impl::getImplementationName() + throw (RuntimeException) +{ + // unique implementation name + return OUString( RTL_CONSTASCII_USTRINGPARAM( + "my_module.my_sc_implementation.MyService2") ); +} + +sal_Bool MyService2Impl::supportsService( OUString const & serviceName ) + throw (RuntimeException) +{ + // this object only supports one service, so the test is simple + return serviceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( + "my_module.MyService2") ); +} + +Sequence< OUString > MyService2Impl::getSupportedServiceNames() + throw (RuntimeException) +{ + return getSupportedServiceNames_MyService2Impl(); +} + +Reference< XInterface > SAL_CALL create_MyService2Impl( + Reference< XComponentContext > const & xContext ) + SAL_THROW( () ) +{ + return static_cast< ::cppu::OWeakObject * >( new MyService2Impl( xContext ) ); +} + +} + +/* shared lib exports implemented without helpers in service_impl1.cxx */ +namespace my_sc_impl +{ +static struct ::cppu::ImplementationEntry s_component_entries [] = +{ + { + create_MyService1Impl, getImplementationName_MyService1Impl, + getSupportedServiceNames_MyService1Impl, + ::cppu::createSingleComponentFactory, + 0, 0 + }, + { + create_MyService2Impl, getImplementationName_MyService2Impl, + getSupportedServiceNames_MyService2Impl, + ::cppu::createSingleComponentFactory, + 0, 0 + }, + { 0, 0, 0, 0, 0, 0 } +}; +} + +extern "C" +{ +void SAL_CALL component_getImplementationEnvironment( + sal_Char const ** ppEnvTypeName, uno_Environment ** ) +{ + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; +} + +sal_Bool SAL_CALL component_writeInfo( + lang::XMultiServiceFactory * xMgr, registry::XRegistryKey * xRegistry ) +{ + return ::cppu::component_writeInfoHelper( + xMgr, xRegistry, ::my_sc_impl::s_component_entries ); +} + +void * SAL_CALL component_getFactory( + sal_Char const * implName, lang::XMultiServiceFactory * xMgr, + registry::XRegistryKey * xRegistry ) +{ + return ::cppu::component_getFactoryHelper( + implName, xMgr, xRegistry, ::my_sc_impl::s_component_entries ); +} + +} + + diff --git a/odk/examples/DevelopersGuide/Components/CppComponent/some.idl b/odk/examples/DevelopersGuide/Components/CppComponent/some.idl new file mode 100644 index 000000000000..342f03560a93 --- /dev/null +++ b/odk/examples/DevelopersGuide/Components/CppComponent/some.idl @@ -0,0 +1,54 @@ +/************************************************************************* + * + * The Contents of this file are made available subject to the terms of + * the BSD license. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *************************************************************************/ + +#include <com/sun/star/uno/XInterface.idl> +#include <com/sun/star/lang/IllegalArgumentException.idl> + +module my_module +{ + + interface XSomething + { + string methodOne( [in] string val ); + string methodTwo(); + }; + + service MyService1 : XSomething; + + service MyService2 : XSomething + { + create([in]string sArgument) + raises (::com::sun::star::lang::IllegalArgumentException); + }; +}; |