diff options
Diffstat (limited to 'odk/examples/DevelopersGuide/Components/CppComponent')
7 files changed, 807 insertions, 0 deletions
diff --git a/odk/examples/DevelopersGuide/Components/CppComponent/Makefile b/odk/examples/DevelopersGuide/Components/CppComponent/Makefile new file mode 100644 index 000000000..2a5b876a4 --- /dev/null +++ b/odk/examples/DevelopersGuide/Components/CppComponent/Makefile @@ -0,0 +1,228 @@ +#************************************************************************* +# +# 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 + +# 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_COMPONENTS = $(SAMPLE_GEN_OUT)/$(COMP_NAME).components +COMP_DESCRIPTION = $(SAMPLE_GEN_OUT)/description.xml + +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)) + +TYPESLIST=-Tmymodule.XSomething \ + -Tmymodule.MyService1 \ + -Tmymodule.MyService2 + +# Targets +.PHONY: ALL +ALL : \ + $(SAMPLE_NAME) + +include $(SETTINGS)/stdtarget.mk + +$(SAMPLE_GEN_OUT)/%.rdb : $(IDLFILES) + -$(DEL) $(subst \\,\,$(subst /,$(PS),$@)) + -$(MKDIR) $(subst /,$(PS),$(@D)) + $(UNOIDLWRITE) $(URE_TYPES) $(OFFICE_TYPES) $< $@ + +$(COMP_TYPEFLAG) : $(COMP_RDB) $(SDKTYPEFLAG) + -$(DEL) $(subst \\,\,$(subst /,$(PS),$@)) + -$(MKDIR) $(subst /,$(PS),$(@D)) + $(CPPUMAKER) -Gc -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),$@) $< + +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) msvcprt.lib $(LIBO_SDK_LDFLAGS_STDLIBS) + $(LINK_MANIFEST) +else +$(SHAREDLIB_OUT)/%.$(SHAREDLIB_EXT) : $(SLOFILES) + -$(MKDIR) $(subst /,$(PS),$(@D)) && $(DEL) $(subst \\,\,$(subst /,$(PS),$@)) + $(LINK) $(COMP_LINK_FLAGS) $(LINK_LIBS) -o $@ $(SLOFILES) \ + $(CPPUHELPERLIB) $(CPPULIB) $(SALLIB) $(STC++LIB) +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-components;platform=$(UNOPKG_PLATFORM)$(QM)">> $@ + @echo $(SQM) $(SQM)manifest:full-path="$(QM)$(COMP_NAME).components$(QM)"/$(CSEP)>> $@ + @echo $(OSEP)/manifest:manifest$(CSEP) >> $@ + +$(COMP_COMPONENTS) : + -$(MKDIR) $(subst /,$(PS),$(@D)) + @echo $(OSEP)?xml version="$(QM)1.0$(QM)" encoding="$(QM)UTF-8$(QM)"?$(CSEP) > $@ + @echo $(OSEP)components xmlns="$(QM)http://openoffice.org/2010/uno-components$(QM)"$(CSEP) >> $@ + @echo $(SQM) $(SQM)$(OSEP)component loader="$(QM)com.sun.star.loader.SharedLibrary$(QM)" uri="$(QM)$(UNOPKG_PLATFORM)/$(COMP_IMPL_NAME)$(QM)"$(CSEP) >> $@ + @echo $(SQM) $(SQM)$(OSEP)implementation name="$(QM)mymodule.my_sc_implementation.MyService1$(QM)"$(CSEP) >> $@ + @echo $(SQM) $(SQM)$(OSEP)service name="$(QM)mymodule.MyService1$(QM)"/$(CSEP) >> $@ + @echo $(SQM) $(SQM)$(OSEP)/implementation$(CSEP) >> $@ + @echo $(SQM) $(SQM)$(OSEP)implementation name="$(QM)mymodule.my_sc_implementation.MyService2$(QM)"$(CSEP) >> $@ + @echo $(SQM) $(SQM)$(OSEP)service name="$(QM)mymodule.MyService2$(QM)"/$(CSEP) >> $@ + @echo $(SQM) $(SQM)$(OSEP)/implementation$(CSEP) >> $@ + @echo $(SQM) $(SQM)$(OSEP)/component$(CSEP) >> $@ + @echo $(OSEP)/components$(CSEP) >> $@ + +$(COMP_DESCRIPTION) : description.xml + -$(MKDIR) $(subst /,$(PS),$(@D)) + cp $^ $@ + +$(COMP_PACKAGE) : $(SHAREDLIB_OUT)/$(COMP_IMPL_NAME) $(COMP_RDB) $(COMP_UNOPKG_MANIFEST) $(COMP_COMPONENTS) $(COMP_DESCRIPTION) + -$(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_NAME).components description.xml + cd $(subst /,$(PS),$(SAMPLE_GEN_OUT)) && $(SDK_ZIP) -u ../../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) +else + $(LINK) $(EXE_LINK_FLAGS) $(LINK_LIBS) -o $@ $< \ + $(CPPUHELPERLIB) $(CPPULIB) $(SALHELPERLIB) $(SALLIB) $(STDC++LIB) +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),$(COMP_COMPONENTS))) + -$(DEL) $(subst \\,\,$(subst /,$(PS),$(COMP_DESCRIPTION))) + -$(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 000000000..e8d7e9133 --- /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 000000000..95d46dd2b --- /dev/null +++ b/odk/examples/DevelopersGuide/Components/CppComponent/TestCppComponent.cxx @@ -0,0 +1,93 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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 <mymodule/MyService1.hpp> +#include <mymodule/MyService2.hpp> + +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::frame; + +using ::rtl::OUString; +using ::rtl::OUStringToOString; + +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<mymodule::XSomething> xSomething = + mymodule::MyService1::create(xContext); + + // call methodOne and print the return value on stdout + OUString s = xSomething->methodOne(OUString("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 = mymodule::MyService2::create(xContext, OUString("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; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/odk/examples/DevelopersGuide/Components/CppComponent/description.xml b/odk/examples/DevelopersGuide/Components/CppComponent/description.xml new file mode 100644 index 000000000..6c4e2396b --- /dev/null +++ b/odk/examples/DevelopersGuide/Components/CppComponent/description.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<d:description xmlns:d="http://openoffice.org/extensions/description/2006"> + <d:dependencies> + <l:LibreOffice-minimal-version value="4.1" d:name="LibreOffice 4.1" + xmlns:l="http://libreoffice.org/extensions/description/2011"/> + </d:dependencies> +</d:description> 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 000000000..11320c252 --- /dev/null +++ b/odk/examples/DevelopersGuide/Components/CppComponent/service1_impl.cxx @@ -0,0 +1,211 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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 <cppuhelper/factory.hxx> +#include <cppuhelper/supportsservice.hxx> + +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XTypeProvider.hpp> +#include <mymodule/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] = "mymodule.MyService1"; + return names; +} + +OUString SAL_CALL getImplementationName_MyService1Impl() +{ + return OUString("mymodule.my_sc_implementation.MyService1"); +} + + +class MyService1Impl + : public ::mymodule::XSomething + , public lang::XServiceInfo + , public lang::XTypeProvider +{ + oslInterlockedCount m_refcount; + OUString m_sData; + // it's good practice 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 ); + virtual void SAL_CALL acquire() + throw (); + virtual void SAL_CALL release() + throw (); + // XTypeProvider + virtual Sequence< Type > SAL_CALL getTypes(); + virtual Sequence< sal_Int8 > SAL_CALL getImplementationId(); + // XSomething + virtual OUString SAL_CALL methodOne( OUString const & str ); + virtual OUString SAL_CALL methodTwo( ); + // XServiceInfo + virtual OUString SAL_CALL getImplementationName(); + virtual sal_Bool SAL_CALL supportsService( OUString const & serviceName ); + virtual Sequence< OUString > SAL_CALL getSupportedServiceNames(); +}; + +// XInterface implementation +Any MyService1Impl::queryInterface( Type const & type ) +{ + if (type.equals(::cppu::UnoType<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<lang::XTypeProvider>::get())) + { + // return XInterface interface + Reference< XInterface > x( + static_cast< lang::XTypeProvider * >( this ) ); + return makeAny( x ); + } + if (type.equals(::cppu::UnoType<lang::XServiceInfo>::get())) + { + // return XServiceInfo interface + Reference< lang::XServiceInfo > x( + static_cast< lang::XServiceInfo * >( this ) ); + return makeAny( x ); + } + if (type.equals(::cppu::UnoType<mymodule::XSomething>::get())) + { + // return sample interface + Reference< ::mymodule::XSomething > x( + static_cast< ::mymodule::XSomething * >( this ) ); + return makeAny( x ); + } + // querying for unsupported type + return Any(); +} + +void MyService1Impl::acquire() + throw () +{ + // thread-safe incrementation of reference count + ::osl_atomic_increment( &m_refcount ); +} + +void MyService1Impl::release() + throw () +{ + // thread-safe decrementation of reference count + if (0 == ::osl_atomic_decrement( &m_refcount )) + { + delete this; // shutdown this object + } +} + +// XTypeProvider implementation +Sequence< Type > MyService1Impl::getTypes() +{ + Sequence< Type > seq( 3 ); + seq[ 0 ] = ::cppu::UnoType<lang::XTypeProvider>::get(); + seq[ 1 ] = ::cppu::UnoType<lang::XServiceInfo>::get(); + seq[ 2 ] = ::cppu::UnoType<mymodule::XSomething>::get(); + return seq; +} + +Sequence< sal_Int8 > MyService1Impl::getImplementationId() +{ + return css::uno::Sequence<sal_Int8>(); +} + +// XSomething implementation +OUString MyService1Impl::methodOne( OUString const & str ) +{ + m_sData = str; + return OUString( "called methodOne() of MyService1 implementation: " ) + m_sData; +} + +OUString MyService1Impl::methodTwo( ) +{ + return OUString( "called methodTwo() of MyService1 implementation: " ) + m_sData; +} + +// XServiceInfo implementation +OUString MyService1Impl::getImplementationName() +{ + // unique implementation name + return OUString("mymodule.my_sc_implementation.MyService1"); +} +sal_Bool MyService1Impl::supportsService( OUString const & serviceName ) +{ + return cppu::supportsService(this, serviceName); +} +Sequence< OUString > MyService1Impl::getSupportedServiceNames() +{ + // this object only supports one service + OUString serviceName("mymodule.MyService1"); + return Sequence< OUString >( &serviceName, 1 ); +} + +Reference< XInterface > SAL_CALL create_MyService1Impl( + Reference< XComponentContext > const & xContext ) +{ + return static_cast< lang::XTypeProvider * >( new MyService1Impl( xContext) ); +} + +// forward decl: implemented in service2_impl.cxx +Reference< XInterface > SAL_CALL create_MyService2Impl( + Reference< XComponentContext > const & ); + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 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 000000000..eecaec5a3 --- /dev/null +++ b/odk/examples/DevelopersGuide/Components/CppComponent/service2_impl.cxx @@ -0,0 +1,203 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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> +#include <cppuhelper/factory.hxx> +#include <cppuhelper/implementationentry.hxx> +#include <cppuhelper/supportsservice.hxx> +#include <uno/lbnames.h> + +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/lang/IllegalArgumentException.hpp> +#include <mymodule/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 ); + +static Sequence< OUString > getSupportedServiceNames_MyService2Impl() +{ + Sequence<OUString> names(1); + names[0] = "mymodule.MyService2"; + return names; +} + +static OUString getImplementationName_MyService2Impl() +{ + return OUString("mymodule.my_sc_implementation.MyService2"); +} + +class MyService2Impl : public ::cppu::WeakImplHelper3< + ::mymodule::XSomething, lang::XServiceInfo, lang::XInitialization > +{ + OUString m_sData; + // it's good practice 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 ); + // XSomething + virtual OUString SAL_CALL methodOne( OUString const & str ); + virtual OUString SAL_CALL methodTwo( ); + // XServiceInfo + virtual OUString SAL_CALL getImplementationName(); + virtual sal_Bool SAL_CALL supportsService( OUString const & serviceName ); + virtual Sequence< OUString > SAL_CALL getSupportedServiceNames(); +}; + +// XInitialization implementation +void MyService2Impl::initialize( Sequence< Any > const & args ) +{ + if (args.getLength() != 1) + { + throw lang::IllegalArgumentException( + OUString( + "give a string instantiating this component!"), + // resolve to XInterface reference: + static_cast< ::cppu::OWeakObject * >(this), + 0 ); // argument pos + } + if (! (args[ 0 ] >>= m_sData)) + { + throw lang::IllegalArgumentException( + OUString( + "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 ) +{ + m_sData = str; + return OUString( "called methodOne() of MyService2 implementation: " ) + m_sData; +} + +OUString MyService2Impl::methodTwo( ) +{ + return OUString( "called methodTwo() of MyService2 implementation: " ) + m_sData; +} + +// XServiceInfo implementation +OUString MyService2Impl::getImplementationName() +{ + // unique implementation name + return OUString("mymodule.my_sc_implementation.MyService2"); +} + +sal_Bool MyService2Impl::supportsService( OUString const & serviceName ) +{ + return cppu::supportsService(this, serviceName); +} + +Sequence< OUString > MyService2Impl::getSupportedServiceNames() +{ + return getSupportedServiceNames_MyService2Impl(); +} + +Reference< XInterface > SAL_CALL create_MyService2Impl( + Reference< XComponentContext > const & xContext ) +{ + return static_cast< ::cppu::OWeakObject * >( new MyService2Impl( xContext ) ); +} + +} + +/* shared lib exports implemented without helpers in service_impl1.cxx */ +namespace my_sc_impl +{ +static const 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" +{ + +SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory( + char const * implName, lang::XMultiServiceFactory * xMgr, + registry::XRegistryKey * xRegistry ) +{ + return ::cppu::component_getFactoryHelper( + implName, xMgr, xRegistry, ::my_sc_impl::s_component_entries ); +} + +SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment( + char const ** ppEnvTypeName, uno_Environment **) +{ + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; +} + +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/odk/examples/DevelopersGuide/Components/CppComponent/some.idl b/odk/examples/DevelopersGuide/Components/CppComponent/some.idl new file mode 100644 index 000000000..18e3395a1 --- /dev/null +++ b/odk/examples/DevelopersGuide/Components/CppComponent/some.idl @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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 mymodule +{ + + 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); + }; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |