diff options
Diffstat (limited to 'sal/test')
-rw-r--r-- | sal/test/bootstrap | 65 | ||||
-rwxr-xr-x | sal/test/bootstrap.bat | 62 | ||||
-rwxr-xr-x | sal/test/bootstrap.pl | 260 | ||||
-rw-r--r-- | sal/test/bootstraptest.ini | 11 | ||||
-rw-r--r-- | sal/test/makefile.mk | 152 | ||||
-rw-r--r-- | sal/test/test_salmain.cxx | 42 | ||||
-rw-r--r-- | sal/test/test_salmainwithargs.cxx | 42 | ||||
-rw-r--r-- | sal/test/testbootstrap.cxx | 134 | ||||
-rw-r--r-- | sal/test/testbootstrap.ini | 4 | ||||
-rw-r--r-- | sal/test/unloading/exports.dxp | 4 | ||||
-rw-r--r-- | sal/test/unloading/makefile.mk | 126 | ||||
-rw-r--r-- | sal/test/unloading/readme.txt | 14 | ||||
-rw-r--r-- | sal/test/unloading/samplelib1.cxx | 269 | ||||
-rw-r--r-- | sal/test/unloading/samplelib1.xml | 41 | ||||
-rw-r--r-- | sal/test/unloading/samplelib2.cxx | 236 | ||||
-rw-r--r-- | sal/test/unloading/unloadTest.cxx | 656 |
16 files changed, 2118 insertions, 0 deletions
diff --git a/sal/test/bootstrap b/sal/test/bootstrap new file mode 100644 index 000000000000..6e307417e230 --- /dev/null +++ b/sal/test/bootstrap @@ -0,0 +1,65 @@ +#/bin/tcsh + +setenv MYBOOTSTRAPTESTVALUE 0 +echo 1 +./testbootstrap 1 -env:MYBOOTSTRAPTESTVALUE=1 + +echo 2 +./testbootstrap.bin file + +echo 3 +./testbootstrap.Bin file + +echo 4 +./testbootstrap.exe file + +echo 5 +./testbootstrap.Exe file + +echo 6 +./testbootstrap 0 -env:INIFILENAME= + +unsetenv MYBOOTSTRAPTESTVALUE +echo 7 +./testbootstrap default -env:INIFILENAME= + +echo 8 +./testbootstrap default -env:MYBOOTSTRAPTESTVALUE2=1 -env:INIFILENAME= + +echo +echo "macro tests" +echo + +# simple macro expansion +echo 9 +./testbootstrap _first_second_third_ -env:FIRST=first -env:SECOND=second -env:THIRD=third -env:MYBOOTSTRAPTESTVALUE='_${FIRST}_${SECOND}_${THIRD}_' + +# simple quoting +echo 10 +./testbootstrap '_${FIRST}_${SECOND}_${THIRD}_' -env:FIRST=first -env:SECOND=second -env:THIRD=third -env:MYBOOTSTRAPTESTVALUE='_\$\{FIRST\}_\$\{SECOND\}_\$\{THIRD\}_' + +# simple ini access +echo 11 +./testbootstrap TheKeysValue -env:'MYBOOTSTRAPTESTVALUE=${./bootstraptest.ini:TheSection:TheKey}' + +# ini access with simple macro expansion +echo 12 +./testbootstrap TheKeysValue -env:ININAME=./bootstraptest.ini -env:SECTIONNAME=TheSection -env:KEYNAME=TheKey \ + -env:'MYBOOTSTRAPTESTVALUE=${$ININAME:$SECTIONNAME:$KEYNAME}' + +# ini access with complex macro expansion +echo 13 +./testbootstrap TheKeysValue -env:ININAME=./bootstraptest.ini \ + -env:'MYBOOTSTRAPTESTVALUE=${$ININAME:${$ININAME:SecondSection:IndirectSection}:${$ININAME:SecondSection:IndirectKey}}' + +# test no infinit recursion +echo 14 +./testbootstrap "***RECURSION DETECTED***" -env:'MYBOOTSTRAPTESTVALUE=$MYBOOTSTRAPTESTVALUE' + +# test unicode +echo 15 +./testbootstrap AAABBBCCC000 -env:'MYBOOTSTRAPTESTVALUE=\u0041\u0041\u0041\u0042\u0042\u0042\u0043\u0043\u0043\u0030\u0030\u0030' + +echo +echo "bootstrap test finished" +echo diff --git a/sal/test/bootstrap.bat b/sal/test/bootstrap.bat new file mode 100755 index 000000000000..2d3e9df3ccdf --- /dev/null +++ b/sal/test/bootstrap.bat @@ -0,0 +1,62 @@ +@echo off +set MYBOOTSTRAPTESTVALUE=0 +echo 1 +.\testbootstrap 1 -env:MYBOOTSTRAPTESTVALUE=1 + +echo 2 +.\testbootstrap.exe file + +echo 3 +.\testbootstrap.Exe file + +echo 4 +.\testbootstrap.bin file + +echo 5 +.\testbootstrap.Bin file + +echo 6 +.\testbootstrap 0 -env:INIFILENAME= + +echo 7 +set MYBOOTSTRAPTESTVALUE= +rem simply ignore the file .... +.\testbootstrap default -env:INIFILENAME= + +echo 8 +.\testbootstrap default -env:MYBOOTSTRAPTESTVALUE2=1 -env:INIFILENAME= + +echo +echo "macro tests" +echo + +rem simple macro expansion +echo 9 +.\testbootstrap _first_second_third_ -env:FIRST=first -env:SECOND=second -env:THIRD=third -env:MYBOOTSTRAPTESTVALUE=_${FIRST}_${SECOND}_${THIRD}_ + +rem simple quoting +echo 10 +.\testbootstrap _${FIRST}_${SECOND}_${THIRD}_ -env:FIRST=first -env:SECOND=second -env:THIRD=third -env:MYBOOTSTRAPTESTVALUE=_\$\{FIRST\}_\$\{SECOND\}_\$\{THIRD\}_ + +rem simple ini access +echo 11 +.\testbootstrap TheKeysValue -env:MYBOOTSTRAPTESTVALUE=${./bootstraptest.ini:TheSection:TheKey} + +rem ini access with simple macro expansion +echo 12 +.\testbootstrap TheKeysValue -env:ININAME=./bootstraptest.ini -env:SECTIONNAME=TheSection -env:KEYNAME=TheKey -env:MYBOOTSTRAPTESTVALUE=${$ININAME:$SECTIONNAME:$KEYNAME} + +rem ini access with complex macro expansion +echo 13 +.\testbootstrap TheKeysValue -env:ININAME=./bootstraptest.ini -env:MYBOOTSTRAPTESTVALUE=${$ININAME:${$ININAME:SecondSection:IndirectSection}:${$ININAME:SecondSection:IndirectKey}} + +rem test no infinit recursion +echo 14 +.\testbootstrap "***RECURSION DETECTED***" -env:MYBOOTSTRAPTESTVALUE=$MYBOOTSTRAPTESTVALUE + +rem test unicode +echo 15 +.\testbootstrap AAABBBCCC000 -env:MYBOOTSTRAPTESTVALUE=\u0041\u0041\u0041\u0042\u0042\u0042\u0043\u0043\u0043\u0030\u0030\u0030 + + +@echo bootstrap test finished
\ No newline at end of file diff --git a/sal/test/bootstrap.pl b/sal/test/bootstrap.pl new file mode 100755 index 000000000000..5f697e8b02cf --- /dev/null +++ b/sal/test/bootstrap.pl @@ -0,0 +1,260 @@ +: +eval 'exec perl -wS $0 ${1+"$@"}' + if 0; +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + + +my $rc; +my $state = 1; +my $comment = ""; + +$ENV{MYBOOTSTRAPTESTVALUE}=0; + +$rc = system "./testbootstrap", 1, "-env:MYBOOTSTRAPTESTVALUE=1"; +if (!$rc) { + $comment = $comment . "commandline over environment test not passed\n"; + $state = 0; +} + +$rc = system "./testbootstrap", "0", "-env:INIFILENAME="; +if (!$rc) { + $comment = $comment . "exe custom ini test not passed\n"; + $state = 0; +} + +delete $ENV{MYBOOTSTRAPTESTVALUE}; + +$rc = system "./testbootstrap.bin", "file"; +if (!$rc) { + $comment = $comment . "extensions cut test not passed with .bin\n"; + $state = 0; +} + +$rc = system "./testbootstrap.Bin", "file"; +if (!$rc) { + $comment = $comment . "extensions cut test not passed with .Bin\n"; + $state = 0; +} + +$rc = system "./testbootstrap.exe", "file"; +if (!$rc) { + $comment = $comment . "extensions cut test not passed with .exe\n"; + $state = 0; +} + +$rc = system "./testbootstrap.Exe", "file"; +if (!$rc) { + $comment = $comment . "extensions cut test not passed with .Exe\n"; + $state = 0; +} + +if ($ENV{GUI} eq "WNT") { + $rc = system "./testbootstrap", "auxaux", "-env:iniName=ini.ini", '-env:MYBOOTSTRAPTESTVALUE=$CUSTOMINIVALUE'; +} +else { + $rc = system "./testbootstrap", "auxaux", "-env:iniName=inirc", '-env:MYBOOTSTRAPTESTVALUE=$CUSTOMINIVALUE'; +} +if (!$rc) { + $comment = $comment . "custom ini test not passed\n"; + $state = 0; +} + +if ($ENV{GUI} eq "WNT") { + $comment = $comment . '$SYSUSERHOME not testable under windows' . "\n"; +} +else { + $rc = system "./testbootstrap", "file://$ENV{HOME}", '-env:MYBOOTSTRAPTESTVALUE=$SYSUSERHOME'; + if (!$rc) { + $comment = $comment . '$SYSUSERHOME test not passed' . "\n"; + $state = 0; + } +} + +if ($ENV{GUI} eq "WNT") { + $comment = $comment . '$SYSUSERCONFIG' . " not testable under windows\n"; +} +else { + $rc = system "./testbootstrap", "file://$ENV{HOME}", '-env:MYBOOTSTRAPTESTVALUE=$SYSUSERCONFIG'; + if (!$rc) { + $comment = $comment . '$SYSUSERCONFIG test not passed' . "\n"; + $state = 0; + } +} + +if ($ENV{GUI} eq "WNT") { + $comment = $comment . '$SYSBINDIR' . " not testable under windows\n"; +} +else { + $rc = system "./testbootstrap", "file://$ENV{PWD}", '-env:MYBOOTSTRAPTESTVALUE=$SYSBINDIR'; + if (!$rc) { + $comment = $comment . '$SYSBINDIR test not passed' . "\n"; + $state = 0; + } +} + +if ($ENV{GUI} eq "WNT") { + $rc = system "./testbootstrap", "inherited_value", '-env:MYBOOTSTRAPTESTVALUE=$INHERITED_VALUE', "-env:iniName=ini.ini"; +} +else { + $rc = system "./testbootstrap", "inherited_value", '-env:MYBOOTSTRAPTESTVALUE=$INHERITED_VALUE', "-env:iniName=inirc"; +} +if (!$rc) { + $comment = $comment . "inherited value not passed\n"; + $state = 0; +} + +if ($ENV{GUI} eq "WNT") { + $rc = system "./testbootstrap", "not_overwritten", '-env:MYBOOTSTRAPTESTVALUE=$INHERITED_OVERWRITTEN_VALUE', "-env:iniName=ini.ini"; +} +else { + $rc = system "./testbootstrap", "not_overwritten", '-env:MYBOOTSTRAPTESTVALUE=$INHERITED_OVERWRITTEN_VALUE', "-env:iniName=inirc"; +} +if (!$rc) { + $comment = $comment . "inherited overwritten value not passed\n"; + $state = 0; +} + + +$rc = system "./testbootstrap", "defaultvalue", "-env:INIFILENAME=", "-env:Default=defaultvalue", "-env:USEDEFAULT=1"; +if (!$rc) { + $comment = $comment . "default test from parameter not passed\n"; + $state = 0; +} + +if ($ENV{GUI} eq "WNT") { + $rc = system "./testbootstrap", "defaultValue", "-env:iniName=default.ini", "-env:INIFILENAME=", "-env:USEDEFAULT=1"; +} +else { + $rc = system "./testbootstrap", "defaultValue", "-env:iniName=defaultrc", "-env:INIFILENAME=", "-env:USEDEFAULT=1"; +} +if (!$rc) { + $comment = $comment . "default test from custom ini not passed\n"; + $state = 0; +} + +# simple macro expansion +$rc = system "./testbootstrap", + "_first_second_third_", + "-env:FIRST=first", + "-env:SECOND=second", + "-env:THIRD=third", + '-env:MYBOOTSTRAPTESTVALUE=_${FIRST}_${SECOND}_${THIRD}_'; +if (!$rc) { + $comment = $comment . "simple macro expansion test not passed\n"; + $state = 0; +} + +# simple quoting +$rc = system "./testbootstrap", + '_${FIRST}_${SECOND}_${THIRD}_', + "-env:FIRST=first", + "-env:SECOND=second", + "-env:THIRD=third", + '-env:MYBOOTSTRAPTESTVALUE=_\$\{FIRST\}_\$\{SECOND\}_\$\{THIRD\}_'; +if (!$rc) { + $comment = $comment . "simple macro quoting test not passed\n"; + $state = 0; +} + +# simple ini access +$rc = system "./testbootstrap", + "TheIniKeysValue", + '-env:MYBOOTSTRAPTESTVALUE=${./bootstraptest.ini:TheIniKey}'; +if (!$rc) { + $comment = $comment . "simple macro ini access test not passed\n"; + $state = 0; +} + +# simple profile access +$rc = system "./testbootstrap", + "TheKeysValue", + '-env:MYBOOTSTRAPTESTVALUE=${./bootstraptest.ini:TheSection:TheKey}'; +if (!$rc) { + $comment = $comment . "simple macro profile access test not passed\n"; + $state = 0; +} + +# profile access with simple macro expansion +$rc = system "./testbootstrap", + "TheKeysValue", + "-env:ININAME=./bootstraptest.ini", + "-env:SECTIONNAME=TheSection", + "-env:KEYNAME=TheKey", + '-env:MYBOOTSTRAPTESTVALUE=${$ININAME:$SECTIONNAME:$KEYNAME}'; +if (!$rc) { + $comment = $comment . "profile access with simple macro expansion test not passed\n"; + $state = 0; +} + +# profile access with complex macro expansion +$rc = system "./testbootstrap", + "TheKeysValue", + "-env:ININAME=./bootstraptest.ini", + '-env:MYBOOTSTRAPTESTVALUE=${$ININAME:${$ININAME:SecondSection:IndirectSection}:${$ININAME:SecondSection:IndirectKey}}'; +if (!$rc) { + $comment = $comment . "profile access with complex macro expansion test not passed\n"; + $state = 0; +} + +# test no infinit recursion +if ($ENV{GUI} eq "WNT") { + $rc = system "./testbootstrap", + '"***RECURSION DETECTED***"', + '-env:MYBOOTSTRAPTESTVALUE=$MYBOOTSTRAPTESTVALUE'; +} +else { + $rc = system "./testbootstrap", + '***RECURSION DETECTED***', + '-env:MYBOOTSTRAPTESTVALUE=$MYBOOTSTRAPTESTVALUE'; +} +if (!$rc) { + $comment = $comment . "no infinit recursion test not passed\n"; + $state = 0; +} + +# test unicode +$rc = system "./testbootstrap", + "AAABBBCCC000", + '-env:MYBOOTSTRAPTESTVALUE=\u0041\u0041\u0041\u0042\u0042\u0042\u0043\u0043\u0043\u0030\u0030\u0030'; +if (!$rc) { + $comment = $comment . "uncode not passed\n"; + $state = 0; +} + +print "**************************\n"; +if($state) { + print "****** tests passed ******\n"; +} +else { + print "**** tests NOT passed ****\n"; + print "Commnent:\n", $comment, "\n"; +} +print "**************************\n"; + + + diff --git a/sal/test/bootstraptest.ini b/sal/test/bootstraptest.ini new file mode 100644 index 000000000000..c6569f367fe9 --- /dev/null +++ b/sal/test/bootstraptest.ini @@ -0,0 +1,11 @@ +TheIniKey=TheIniKeysValue + + +[TheSection] +TheKey=TheKeysValue + +[SecondSection] +IndirectSection=TheSection +IndirectKey=TheKey + + diff --git a/sal/test/makefile.mk b/sal/test/makefile.mk new file mode 100644 index 000000000000..6edba90ce6b9 --- /dev/null +++ b/sal/test/makefile.mk @@ -0,0 +1,152 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=.. + +PRJNAME=sal +TARGET=saltest +TARGETTYPE=CUI +LIBTARGET=NO +USE_LDUMP2=TRUE +ENABLE_EXCEPTIONS=TRUE +#LDUMP2=LDUMP3 + + +# --- Settings ----------------------------------------------------- +.INCLUDE : settings.mk +CFLAGS+= $(LFS_CFLAGS) +CXXFLAGS+= $(LFS_CFLAGS) +# ------------------------------------------------------------------ + +.IF "$(GUI)"=="WNT" +BOOTSTRAPSCRIPT=bootstrap.bat +BOOTSTRAPINI=testbootstrap.ini +MY_SCRIPTCAT=cat +.ELSE +BOOTSTRAPSCRIPT=bootstrap +BOOTSTRAPINI=testbootstraprc +MY_SCRIPTCAT=tr -d "\015" < +.ENDIF + +APP2OBJS = $(OBJ)$/testbootstrap.obj + +OBJFILES= \ + $(APP2OBJS) + +APP2TARGET = testbootstrap +APP2STDLIBS = $(SALLIB) + +APP3OBJS = $(OBJ)$/test_salmain.obj +APP3TARGET = test_salmain +APP3STDLIBS = $(SALLIB) + +APP4OBJS = $(OBJ)$/test_salmainwithargs.obj +APP4TARGET = test_salmainwithargs +APP4STDLIBS = $(SALLIB) + + +# --- Targets ------------------------------------------------------ +.IF "$(depend)" == "" +ALL : ALLTAR \ + $(BIN)$/$(BOOTSTRAPSCRIPT) \ + $(BIN)$/$(BOOTSTRAPINI) \ + $(BIN)$/bootstraptest.ini \ + $(BIN)$/$(APP2TARGET).bin \ + $(BIN)$/$(APP2TARGET).Bin \ + $(BIN)$/$(APP2TARGET).Exe \ + $(BIN)$/bootstrap.pl + + +.IF "$(GUI)"=="UNX" +ALL: $(BIN)$/$(APP2TARGET).exe \ + $(BIN)$/inirc \ + $(BIN)$/defaultrc + +$(BIN)$/$(APP2TARGET).exe : $(APP2TARGETN) + cp $(APP2TARGETN) $@ + +$(BIN)$/inirc: + echo "CUSTOMINIVALUE=auxaux" > $@ + echo "INHERITED_OVERWRITTEN_VALUE=inherited_overwritten_value" >> $@ + +$(BIN)$/defaultrc: + echo "Default=defaultValue" > $@ + +.ELSE + +ALL: $(BIN)$/ini.ini \ + $(BIN)$/default.ini + +$(BIN)$/ini.ini: + echo CUSTOMINIVALUE=auxaux > $@ + echo INHERITED_OVERWRITTEN_VALUE=inherited_overwritten_value >> $@ + + +$(BIN)$/default.ini: + echo Default=defaultValue > $@ + +.ENDIF + +$(BIN)$/bootstrap.pl: + cp bootstrap.pl $@ + +$(BIN)$/$(APP2TARGET).bin : $(APP2TARGETN) + cp $(APP2TARGETN) $@ + +$(BIN)$/$(APP2TARGET).Bin : $(APP2TARGETN) + cp $(APP2TARGETN) $@ + +$(BIN)$/$(APP2TARGET).Exe : $(APP2TARGETN) + cp $(APP2TARGETN) $@ + +.ELSE +ALL: ALLDEP +.ENDIF + +.INCLUDE : target.mk + + +$(BIN)$/$(BOOTSTRAPSCRIPT) : $(BOOTSTRAPSCRIPT) + $(MY_SCRIPTCAT) $(BOOTSTRAPSCRIPT) > $@ +.IF "$(GUI)"!="WNT" + chmod ug+x $@ +.ENDIF + +$(BIN)$/$(BOOTSTRAPINI) : $(APP2TARGET).ini + $(MY_SCRIPTCAT) $(APP2TARGET).ini > $@ + +$(BIN)$/bootstraptest.ini : bootstraptest.ini + $(MY_SCRIPTCAT) bootstraptest.ini > $@ + + +# --- SO2-Filter-Datei --- +$(MISC)$/tsl$(DLLPOSTFIX).flt: + @echo ------------------------------ + @echo Making: $@ + @echo WEP>$@ + @echo LIBMAIN>>$@ + @echo LibMain>>$@ diff --git a/sal/test/test_salmain.cxx b/sal/test/test_salmain.cxx new file mode 100644 index 000000000000..24cfb1cf56b9 --- /dev/null +++ b/sal/test/test_salmain.cxx @@ -0,0 +1,42 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sal.hxx" + +#include "sal/main.h" + +#include <stdio.h> + + +SAL_IMPLEMENT_MAIN() +{ + fprintf(stderr, "success!\n"); + + return 0; +} diff --git a/sal/test/test_salmainwithargs.cxx b/sal/test/test_salmainwithargs.cxx new file mode 100644 index 000000000000..420a235313e8 --- /dev/null +++ b/sal/test/test_salmainwithargs.cxx @@ -0,0 +1,42 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sal.hxx" + +#include "sal/main.h" + +#include <stdio.h> + + +SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) +{ + fprintf(stderr, "argc: %i argv: %p - success!\n", argc, argv); + + return 0; +} diff --git a/sal/test/testbootstrap.cxx b/sal/test/testbootstrap.cxx new file mode 100644 index 000000000000..757b877d4db5 --- /dev/null +++ b/sal/test/testbootstrap.cxx @@ -0,0 +1,134 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sal.hxx" +#include <stdio.h> + +#include <rtl/process.h> +#include <rtl/bootstrap.hxx> +#include <rtl/string.hxx> +#include <rtl/byteseq.hxx> + +#include <osl/process.h> + +using namespace ::rtl; + + +int main( int argc, char *argv[] ) +{ + osl_setCommandArgs (argc, argv); + + sal_Int32 nCount = rtl_getAppCommandArgCount(); + +#if OSL_DEBUG_LEVEL > 1 + fprintf( stdout, "rtl-commandargs (%d) real args:%i ", nCount, argc); + for( sal_Int32 i = 0 ; i < nCount ; i ++ ) + { + OUString data; + rtl_getAppCommandArg( i , &(data.pData) ); + OString o = OUStringToOString( data, RTL_TEXTENCODING_ASCII_US ); + fprintf( stdout, " %s", o.getStr() ); + } + fprintf( stdout, "\n" ); +#endif + + if( nCount == 0 ) + { + printf( "usage : testbootstrap <checkedValueOfMyBootstrapValue>\n" ); + exit( 1 ); + } + + + OUString iniName; + Bootstrap::get(OUString(RTL_CONSTASCII_USTRINGPARAM("iniName")), iniName, OUString()); + +#if OSL_DEBUG_LEVEL > 1 + if(iniName.getLength()) + { + OString tmp_iniName = OUStringToOString(iniName, RTL_TEXTENCODING_ASCII_US); + fprintf(stderr, "using ini: %s\n", tmp_iniName.getStr()); + } +#endif + + Bootstrap bootstrap(iniName); + + + OUString name( RTL_CONSTASCII_USTRINGPARAM( "MYBOOTSTRAPTESTVALUE" )); + OUString myDefault( RTL_CONSTASCII_USTRINGPARAM("$Default")); + + OUString value; + sal_Bool useDefault; + + OUString aDummy; + useDefault = bootstrap.getFrom(OUString(RTL_CONSTASCII_USTRINGPARAM("USEDEFAULT")), aDummy); + + sal_Bool result = sal_False; + sal_Bool found = sal_True; + + if(useDefault) + bootstrap.getFrom(name, value, myDefault); + + else + found = bootstrap.getFrom(name, value); + + if(found) + { + OUString para(OUString::createFromAscii( argv[1] )); + + result = para == value; + + if(!result) + { + OString para_tmp = OUStringToOString(para, RTL_TEXTENCODING_ASCII_US); + OString value_tmp = OUStringToOString(value, RTL_TEXTENCODING_ASCII_US); + + fprintf(stderr, "para(%s) != value(%s)\n", para_tmp.getStr(), value_tmp.getStr()); + } + } + else + fprintf(stderr, "bootstrap parameter couldn't be found\n"); + + // test the default case + name = OUString( RTL_CONSTASCII_USTRINGPARAM( "no_one_has_set_this_name" ) ); + OSL_ASSERT( ! bootstrap.getFrom( name, value ) ); + result = result && !bootstrap.getFrom( name, value ); + + myDefault = OUString( RTL_CONSTASCII_USTRINGPARAM( "1" ) ); + OUString myDefault2 = OUString( RTL_CONSTASCII_USTRINGPARAM( "2" ) ); + + bootstrap.getFrom( name, value, myDefault ); + OSL_ASSERT( value == myDefault ); + result = result && (value == myDefault); + + bootstrap.getFrom( name, value, myDefault2 ); + OSL_ASSERT( value == myDefault2 ); + result = result && (value == myDefault2); + + return result; +} diff --git a/sal/test/testbootstrap.ini b/sal/test/testbootstrap.ini new file mode 100644 index 000000000000..2cf7b667cd91 --- /dev/null +++ b/sal/test/testbootstrap.ini @@ -0,0 +1,4 @@ +MYBOOTSTRAPTESTVALUE=file +INHERITED_VALUE=inherited_value +INHERITED_OVERWRITTEN_VALUE=not_overwritten + diff --git a/sal/test/unloading/exports.dxp b/sal/test/unloading/exports.dxp new file mode 100644 index 000000000000..82adf8e8be12 --- /dev/null +++ b/sal/test/unloading/exports.dxp @@ -0,0 +1,4 @@ +component_getImplementationEnvironment +component_writeInfo +component_getFactory +component_canUnload diff --git a/sal/test/unloading/makefile.mk b/sal/test/unloading/makefile.mk new file mode 100644 index 000000000000..6c6f6f74f058 --- /dev/null +++ b/sal/test/unloading/makefile.mk @@ -0,0 +1,126 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* +PRJ=..$/.. + +PRJNAME= sal +TARGET= unloading +TARGET1=samplelib1 +TARGET2=samplelib2 +#LIBTARGET=NO +TARGETTYPE=CUI +COMP1TYPELIST=$(TARGET1) + +NO_BSYMBOLIC= TRUE +ENABLE_EXCEPTIONS=TRUE + +USE_DEFFILE= TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk + +CFLAGS+= $(LFS_CFLAGS) +CXXFLAGS+= $(LFS_CFLAGS) + +# --- Files -------------------------------------------------------- + +UNOUCRDEP=$(SOLARBINDIR)$/udkapi.rdb +UNOUCRRDB=$(SOLARBINDIR)$/udkapi.rdb + +CPPUMAKERFLAGS = + +.IF "$(BOOTSTRAP_SERVICE)" == "TRUE" +UNOUCROUT= $(OUT)$/inc$/bootstrap +INCPRE+= $(OUT)$/inc$/bootstrap +.ELSE +.IF "$(COM)" == "MSC" +CPPUMAKERFLAGS = -L +.ENDIF +UNOUCROUT= $(OUT)$/inc$/light +INCPRE+= $(OUT)$/inc$/light +.ENDIF + + +#SLOFILES= \ +# $(SLO)$/samplelib1.obj \ +# $(SLO)$/samplelib2.obj + +LIB1TARGET=$(SLB)$/$(TARGET1).lib +LIB1OBJFILES= \ + $(SLO)$/samplelib1.obj + +SHL1TARGET= $(TARGET1) + +SHL1STDLIBS= \ + $(CPPULIB) \ + $(CPPUHELPERLIB) \ + $(SALLIB) + + + +SHL1DEPN= +#SHL1IMPLIB= i$(TARGET1) +SHL1LIBS= $(SLB)$/$(TARGET1).lib +SHL1DEF= $(MISC)$/$(SHL1TARGET).def +DEF1EXPORTFILE= exports.dxp +DEF1NAME= $(SHL1TARGET) +#------------------------------------------------------- + +LIB2TARGET=$(SLB)$/$(TARGET2).lib +LIB2OBJFILES= \ + $(SLO)$/samplelib2.obj + +SHL2TARGET= $(TARGET2) + +SHL2STDLIBS= \ + $(CPPULIB) \ + $(CPPUHELPERLIB) \ + $(SALLIB) + +SHL2DEPN= +SHL2LIBS= $(SLB)$/$(TARGET2).lib +SHL2DEF= $(MISC)$/$(SHL2TARGET).def +DEF2EXPORTFILE= exports.dxp +DEF2NAME= $(SHL2TARGET) + +# ------------------------------------------------------------------ + +APP1NOSAL=TRUE + +APP1TARGET= $(TARGET) + +APP1OBJS= $(OBJ)$/unloadTest.obj + +APP1STDLIBS= \ + $(SALLIB) \ + $(CPPUHELPERLIB) \ + $(CPPULIB) + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + diff --git a/sal/test/unloading/readme.txt b/sal/test/unloading/readme.txt new file mode 100644 index 000000000000..7fae8850c1be --- /dev/null +++ b/sal/test/unloading/readme.txt @@ -0,0 +1,14 @@ +The test program test the unloading API, and the default factories from cppuhelper +for their new XUnloadingPreference interface. + +The makefile produces the executable unloading.exe as wells as two +libraries, samplelib1 and samplelib2, which contain services. + + +Usage: + Copy unloading, samplelib1, samplelib2 into the program directory +of an office. + +Register samplelib1 and samplelib2 with regcomp + +Run unloading.
\ No newline at end of file diff --git a/sal/test/unloading/samplelib1.cxx b/sal/test/unloading/samplelib1.cxx new file mode 100644 index 000000000000..d4632f3beb80 --- /dev/null +++ b/sal/test/unloading/samplelib1.cxx @@ -0,0 +1,269 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sal.hxx" + +#include <sal/types.h> +#include <osl/time.h> +#include <rtl/ustring.hxx> +#include <uno/environment.h> +#include <cppu/macros.hxx> +#include <cppuhelper/factory.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/uno/Sequence.hxx> +#include <cppuhelper/implbase1.hxx> +#include <rtl/unload.h> +#include <rtl/string.hxx> +#include <rtl/ustrbuf.hxx> +#include <com/sun/star/lang/XSingleServiceFactory.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/registry/XRegistryKey.hpp> + +using namespace ::com::sun::star::registry; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::rtl; +using namespace ::cppu; + +#define IMPLNAME1 "com.sun.star.comp.sal.UnloadingTest1" +#define SERVICENAME1 "com.sun.star.UnloadingTest1" +#define IMPLNAME2 "com.sun.star.comp.sal.UnloadingTest2" +#define SERVICENAME2 "com.sun.star.UnloadingTest2" +#define IMPLNAME3 "com.sun.star.comp.sal.UnloadingTest3" +#define SERVICENAME3 "com.sun.star.UnloadingTest3" +#define IMPLNAME4 "com.sun.star.comp.sal.OneInstanceTest" +#define SERVICENAME4 "com.sun.star.OneInstanceTest" + + +// Unloading Support ---------------------------------------------- +rtl_StandardModuleCount globalModuleCount= MODULE_COUNT_INIT; +//rtl_StandardModuleCount globalModuleCount= { {rtl_moduleCount_acquire,rtl_moduleCount_release}, rtl_moduleCount_canUnload,0,{0,0}}; //, 0, {0, 0}}; +// Services ------------------------------------------------------- +class TestService: public WeakImplHelper1<XServiceInfo> +{ +OUString m_implName; +OUString m_serviceName; +public: + TestService( OUString implName, OUString serviceName); + ~TestService(); + virtual OUString SAL_CALL getImplementationName( ) throw (RuntimeException); + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw (RuntimeException); + virtual Sequence<OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException); +}; + +TestService::TestService( OUString implName, OUString serviceName): + m_implName(implName),m_serviceName(serviceName) +{ // Library unloading support + globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt); +} + +TestService::~TestService() +{ // Library unloading support + globalModuleCount.modCnt.release( &globalModuleCount.modCnt); +} + +OUString SAL_CALL TestService::getImplementationName( ) throw (RuntimeException) +{ + return m_implName; +} +sal_Bool SAL_CALL TestService::supportsService( const OUString& ServiceName ) throw (RuntimeException) +{ + return ServiceName.equals( m_serviceName); +} +Sequence<OUString > SAL_CALL TestService::getSupportedServiceNames( ) throw (RuntimeException) +{ + return Sequence<OUString>( &m_serviceName, 1); +} + + +// Creator functions for Services ------------------------------------------------- +static Reference<XInterface> SAL_CALL test1_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME1)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1)) )), UNO_QUERY); +} +static Reference<XInterface> SAL_CALL test2_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME2)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2)) )), UNO_QUERY); +} +static Reference<XInterface> SAL_CALL test3_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME3)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3)) )), UNO_QUERY); +} +static Reference<XInterface> SAL_CALL test4_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME4)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4)) )), UNO_QUERY); +} + + +// Standard UNO library interface ------------------------------------------------- +extern "C" { + void SAL_CALL component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv){ + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; + } + + sal_Bool SAL_CALL component_writeInfo(void * pServiceManager, void * pRegistryKey) throw() + { + if (pRegistryKey) + { + try + { + Reference< XRegistryKey > xNewKey( + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME1 "/UNO/SERVICES" ) ) ); + + xNewKey->createKey( OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1))); + + xNewKey= + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME2 "/UNO/SERVICES" ) ); + + xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2))); + xNewKey= + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME3 "/UNO/SERVICES" ) ); + + xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3))); + + xNewKey= + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME4 "/UNO/SERVICES" ) ); + + xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4))); + return sal_True; + } + catch (InvalidRegistryException &) + { + OSL_ENSURE( sal_False, "### InvalidRegistryException!" ); + } + } + return sal_False; + } + + void * SAL_CALL component_getFactory(const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey) throw() + { + void * pRet = 0; + + + OUString implname1( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME1) ); + OUString serviceName1( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1) ); + OUString implname2( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME2) ); + OUString serviceName2( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2) ); + OUString implname3( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME3) ); + OUString serviceName3( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3) ); + OUString implname4( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME4) ); + OUString serviceName4( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4) ); + + if (implname1.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createSingleFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname1, + test1_createInstance, + Sequence<OUString>( &serviceName1, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + else if( implname2.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createSingleFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname2, + test2_createInstance, + Sequence<OUString>( &serviceName2, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + else if( implname3.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createSingleFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname3, + test3_createInstance, + Sequence<OUString>( &serviceName3, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + else if( implname4.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createOneInstanceFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname3, + test4_createInstance, + Sequence<OUString>( &serviceName3, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + return pRet; + } + + sal_Bool component_canUnload( TimeValue* libUnused) + { + return globalModuleCount.canUnload( &globalModuleCount, libUnused); + } +} diff --git a/sal/test/unloading/samplelib1.xml b/sal/test/unloading/samplelib1.xml new file mode 100644 index 000000000000..da1d0640a4bb --- /dev/null +++ b/sal/test/unloading/samplelib1.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE module-description PUBLIC "-//StarOffice//DTD ComponentDescription 1.0//EN" "module-description.dtd"> +<module-description xmlns:xlink="http://www.w3.org/1999/xlink"> + <module-name> samplelib1 </module-name> + <component-description> + <author> Joachim Lingner </author> + <name> com.sun.star.comp.stoc.JavaVirtualMachine </name> + <description> + </description> + <loader-name> com.sun.star.loader.SharedLibrary </loader-name> + <language> c++ </language> + <status value="final"/> + <supported-service> com.sun.star.Unloading1 </supported-service> + <service-dependency> ... </service-dependency> + <type> com.sun.star.lang.XSingleComponentFactory </type> + <type> com.sun.star.lang.XComponent </type> + <type> com.sun.star.container.XNameAccess </type> + <type> com.sun.star.container.XContentEnumerationAccess </type> + <type> com.sun.star.container.XEnumeration </type> + <type> com.sun.star.lang.XTypeProvider </type> + <type> com.sun.star.lang.XServiceInfo </type> + <type> com.sun.star.lang.XSingleServiceFactory </type> + <type> com.sun.star.lang.XMultiServiceFactory </type> + <type> com.sun.star.registry.XSimpleRegistry </type> + <type> com.sun.star.lang.XSingleComponentFactory </type> + <type> com.sun.star.uno.XComponentContext </type> + <type> com.sun.star.uno.XUnloadingPreference </type> + <type> com.sun.star.uno.XAggregation </type> + <type> com.sun.star.uno.XWeak </type> + <type> com.sun.star.uno.TypeClass </type> + <type> com.sun.star.beans.XPropertySet </type> + </component-description> + <project-build-dependency> cppuhelper </project-build-dependency> + <project-build-dependency> cppu </project-build-dependency> + <project-build-dependency> tools </project-build-dependency> + <project-build-dependency> sal </project-build-dependency> + <runtime-module-dependency> cppuhelper3$(COM) </runtime-module-dependency> + <runtime-module-dependency> cppu3 </runtime-module-dependency> + <runtime-module-dependency> tl(COM) </runtime-module-dependency> + <runtime-module-dependency> sal3 </runtime-module-dependency> +</module-description> diff --git a/sal/test/unloading/samplelib2.cxx b/sal/test/unloading/samplelib2.cxx new file mode 100644 index 000000000000..0ac6e0b5209a --- /dev/null +++ b/sal/test/unloading/samplelib2.cxx @@ -0,0 +1,236 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sal.hxx" + +#include <sal/types.h> +#include <osl/time.h> +#include <rtl/ustring.hxx> +#include <uno/environment.h> +#include <cppu/macros.hxx> +#include <cppuhelper/factory.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/uno/Sequence.hxx> +#include <cppuhelper/implbase1.hxx> +#include <rtl/unload.h> +#include <rtl/string.hxx> +#include <rtl/ustrbuf.hxx> +#include <com/sun/star/lang/XSingleServiceFactory.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/registry/XRegistryKey.hpp> + +using namespace ::com::sun::star::registry; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::rtl; +using namespace ::cppu; + +#define IMPLNAME1 "com.sun.star.comp.sal.UnloadingTest21" +#define SERVICENAME1 "com.sun.star.UnloadingTest21" +#define IMPLNAME2 "com.sun.star.comp.sal.UnloadingTest22" +#define SERVICENAME2 "com.sun.star.UnloadingTest22" +#define IMPLNAME3 "com.sun.star.comp.sal.UnloadingTest23" +#define SERVICENAME3 "com.sun.star.UnloadingTest23" + +// Unloading Support ---------------------------------------------- +rtl_StandardModuleCount globalModuleCount= MODULE_COUNT_INIT; +//rtl_StandardModuleCount globalModuleCount= { {rtl_moduleCount_acquire,rtl_moduleCount_release}, rtl_moduleCount_canUnload,0,{0,0}}; //, 0, {0, 0}}; +// Services ------------------------------------------------------- +class TestService: public WeakImplHelper1<XServiceInfo> +{ +OUString m_implName; +OUString m_serviceName; +public: + TestService( OUString implName, OUString serviceName); + ~TestService(); + virtual OUString SAL_CALL getImplementationName( ) throw (RuntimeException); + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw (RuntimeException); + virtual Sequence<OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException); +}; + +TestService::TestService( OUString implName, OUString serviceName): + m_implName(implName),m_serviceName(serviceName) +{ // Library unloading support + globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt); +} + +TestService::~TestService() +{ // Library unloading support + globalModuleCount.modCnt.release( &globalModuleCount.modCnt); +} + +OUString SAL_CALL TestService::getImplementationName( ) throw (RuntimeException) +{ + return m_implName; +} +sal_Bool SAL_CALL TestService::supportsService( const OUString& ServiceName ) throw (RuntimeException) +{ + return ServiceName.equals( m_serviceName); +} +Sequence<OUString > SAL_CALL TestService::getSupportedServiceNames( ) throw (RuntimeException) +{ + return Sequence<OUString>( &m_serviceName, 1); +} + + +// Creator functions for Services ------------------------------------------------- +static Reference<XInterface> SAL_CALL test21_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME1)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1)) )), UNO_QUERY); +} +static Reference<XInterface> SAL_CALL test22_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME2)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2)) )), UNO_QUERY); +} +static Reference<XInterface> SAL_CALL test23_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME3)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3)) )), UNO_QUERY); +} + + +// Standard UNO library interface ------------------------------------------------- +extern "C" { + void SAL_CALL component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv){ + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; + } + + sal_Bool SAL_CALL component_writeInfo(void * pServiceManager, void * pRegistryKey) throw() + { + if (pRegistryKey) + { + try + { + Reference< XRegistryKey > xNewKey( + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME1 "/UNO/SERVICES" ) ) ); + + xNewKey->createKey( OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1))); + + xNewKey= + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME2 "/UNO/SERVICES" ) ); + + xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2))); + xNewKey= + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME3 "/UNO/SERVICES" ) ); + + xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3))); + + return sal_True; + } + catch (InvalidRegistryException &) + { + OSL_ENSURE( sal_False, "### InvalidRegistryException!" ); + } + } + return sal_False; + } + + void * SAL_CALL component_getFactory(const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey) throw() + { + void * pRet = 0; + + + OUString implname1( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME1) ); + OUString serviceName1( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1) ); + OUString implname2( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME2) ); + OUString serviceName2( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2) ); + OUString implname3( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME3) ); + OUString serviceName3( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3) ); + + if (implname1.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createSingleFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname1, + test21_createInstance, + Sequence<OUString>( &serviceName1, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + else if( implname2.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createSingleFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname2, + test22_createInstance, + Sequence<OUString>( &serviceName2, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + else if( implname3.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createSingleFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname3, + test23_createInstance, + Sequence<OUString>( &serviceName3, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + + return pRet; + } + + sal_Bool component_canUnload( TimeValue* libUnused) + { + return globalModuleCount.canUnload( &globalModuleCount, libUnused); + } +} diff --git a/sal/test/unloading/unloadTest.cxx b/sal/test/unloading/unloadTest.cxx new file mode 100644 index 000000000000..d8589ab76717 --- /dev/null +++ b/sal/test/unloading/unloadTest.cxx @@ -0,0 +1,656 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sal.hxx" + +#include<osl/module.hxx> +#include <osl/time.h> +#include <rtl/ustring.hxx> +#include <stdio.h> +#include <cppuhelper/factory.hxx> +#include <cppuhelper/servicefactory.hxx> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/lang/XSingleServiceFactory.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/uno/XUnloadingPreference.hpp> +#include <com/sun/star/lang/XTypeProvider.hpp> +#include <com/sun/star/container/XContentEnumerationAccess.hpp> + +#include <stdio.h> +using namespace ::rtl; +using namespace ::osl; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::cppu; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; + +#define IMPLNAME1 "com.sun.star.comp.sal.UnloadingTest1" +#define SERVICENAME1 "com.sun.star.UnloadingTest1" +#define IMPLNAME2 "com.sun.star.comp.sal.UnloadingTest2" +#define SERVICENAME2 "com.sun.star.UnloadingTest2" +#define IMPLNAME3 "com.sun.star.comp.sal.UnloadingTest3" +#define SERVICENAME3 "com.sun.star.UnloadingTest3" +#define IMPLNAME4 "com.sun.star.comp.sal.OneInstanceTest" +#define SERVICENAME4 "com.sun.star.OneInstanceTest" + +#define IMPLNAME21 "com.sun.star.comp.sal.UnloadingTest21" +#define SERVICENAME21 "com.sun.star.UnloadingTest21" +#define IMPLNAME22 "com.sun.star.comp.sal.UnloadingTest22" +#define SERVICENAME22 "com.sun.star.UnloadingTest22" +#define IMPLNAME23 "com.sun.star.comp.sal.UnloadingTest23" +#define SERVICENAME23 "com.sun.star.UnloadingTest23" + +#ifdef UNX +#define LIBRARY1 "libsamplelib1.so" +#define LIBRARY2 "libsamplelib2.so" +#elif defined WNT +#define LIBRARY1 "samplelib1" +#define LIBRARY2 "samplelib2" +#endif +/* +Tested: rtl_registerModuleForUnloading, rtl_unregisterModuleForUnloading, rtl_unloadUnusedLibraries + 1 component. + +next: Test with multiple components + Listener mechanism. +*/ + +sal_Bool test1(); +sal_Bool test2(); +sal_Bool test3(); +sal_Bool test4(); +sal_Bool test5(); +sal_Bool test6(); +sal_Bool test7(); +sal_Bool test8(); +sal_Bool test9(); +void SAL_CALL listenerCallback( void* id); + +int main(int argc, char* argv[]) +{ + // Test if the servicemanager can be created and if the sample libs + // can be loaded +// Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( +// OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); +// if( !serviceManager.is()) +// { +// printf("\n ####################################################\n" +// "Error: could not create service manager. \n" +// "Is the executable in the office program directory?\n"); +// return -1; +// } + +// Reference<XInterface> xint1= serviceManager->createInstance( OUString( +// RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + +// if( !xint1.is()) +// { +// printf("\n ###################################################\n" +// "Error: could not create service from samplelib1\n" +// "Is samplelib1 in the office program directory and is it " +// "registered?\n"); +// return -1; +// } +// Reference<XInterface> xint2= serviceManager->createInstance( OUString( +// RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21))); +// if( !xint2.is()) +// { +// printf("\n ###################################################" +// "Error: could not create service from samplelib2\n" +// "Is samplelib2 in the office program directory and is it " +// "registered?\n"); +// return -1; +// } +// //destroy servicemanager +// Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); +// Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); +// Reference<XComponentContext> xContext; +// any_prop >>= xContext; +// Reference<XComponent> xComponent( xContext, UNO_QUERY); +// xComponent->dispose(); + +// //unload samplelib1 and samplelib2. We need the handles, therefore load +// // the libs +// OUString libname1( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); +// OUString libname2( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2)); +// oslModule m1= osl_loadModule(libname1.pData, 0); +// oslModule m2= osl_loadModule(libname2.pData, 0); +// osl_unloadModule( m1); +// osl_unloadModule( m1); +// osl_unloadModule( m2); +// osl_unloadModule( m2); + + + sal_Bool ret1= test1(); + if( ret1) printf( "\n Test 1 successful \n"); + else printf("\n !!!!!! Test 1 failed\n"); + sal_Bool ret2= test2(); + if( ret2) printf( "\n Test 2 successful \n"); + else printf("\n !!!!!! Test 2 failed\n"); + sal_Bool ret3= test3(); + if( ret3) printf( "\n Test 3 successful \n"); + else printf("\n !!!!!! Test 3 failed\n"); + sal_Bool ret4= test4(); + if( ret4) printf( "\n Test 4 successful \n"); + else printf("\n !!!!!! Test 4 failed\n"); + sal_Bool ret5= test5(); + if( ret5) printf( "\n Test 5 successful \n"); + else printf("\n !!!!!! Test 5 failed\n"); + // takes some time (10s) + sal_Bool ret6= test6(); + sal_Bool ret7= test7(); // prints message itself + sal_Bool ret8= test8(); + if( ret8) printf( "\n Test 8 successful \n"); + else printf("\n !!!!!! Test 8 failed\n"); + sal_Bool ret9= test9(); + if( ret9) printf( "\n Test 9 successful: service manager is unloading listener\n"); + else printf("\n !!!!! Test 9 failed\n"); + + return 0; +} + +/* Create an instance of SERVICENAME1, call a function and unload module. + This tests the loader and basic functionality. + The library will be loaded once manually and the handle will be stored. + Then the library will be unloaded. After rtl_unloadUnusedLibraries we try to + get a symbol of the unloaded lib. If this fails then the test is successful. +*/ +sal_Bool test1() +{ + printf("Test 1 ####################################################\n"); + oslModule handleMod=0; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + + // get the handle + handleMod= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod); + xint=0; + + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + } + rtl_unloadUnusedModules( NULL); + + // Try to get a symbol, must fail + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData); + + if( !pSymbol) + return sal_True; + return sal_False; +} + +/* Multipe loadModule + rtl_registerModuleForUnloading. +The module will be registered as often as it has been loaded. +*/ +sal_Bool test2() +{ + printf("Test 2 ####################################################\n"); + oslModule handleMod=0; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + + handleMod= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod); + //----------------------------------------------------------- + oslModule mod1= osl_loadModule( lib1Name.pData, 0); + oslModule mod2= osl_loadModule( lib1Name.pData, 0); + oslModule mod3= osl_loadModule( lib1Name.pData, 0); + + rtl_registerModuleForUnloading(mod1); + rtl_registerModuleForUnloading(mod2); + rtl_registerModuleForUnloading(mod3); + // ---------------------------------------------------------- + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + } + rtl_unloadUnusedModules( NULL); + + // Try to get a symbol, must fail + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData); + + if( !pSymbol) + return sal_True; + return sal_False; +} + +/* Multipe loadModule + rtl_registerModuleForUnloading. +The module will be registered one time less as it has been loaded. +*/ +sal_Bool test3() +{ + printf("Test 3 ####################################################\n"); + oslModule handleMod=0; + sal_Bool retval=sal_False; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + + handleMod= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod); + //----------------------------------------------------------- + oslModule mod1= osl_loadModule( lib1Name.pData, 0); + oslModule mod2= osl_loadModule( lib1Name.pData, 0); + oslModule mod3= osl_loadModule( lib1Name.pData, 0); + + rtl_registerModuleForUnloading(mod1); + rtl_registerModuleForUnloading(mod2); + // ---------------------------------------------------------- + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + } + rtl_unloadUnusedModules( NULL); + + // Try to get a symbol, must succeed + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData); + + if( pSymbol) + { + retval= sal_True; + osl_unloadModule( handleMod); + pSymbol= osl_getSymbol( handleMod, sSymbol.pData); + } + return retval; +} +/* 2 Modules + +*/ +sal_Bool test4() +{ + printf("Test 4 ####################################################\n"); + oslModule handleMod1=0; + oslModule handleMod2=0; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2)); + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + + handleMod1= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod1); + Reference<XInterface> xint2= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21))); + + handleMod2= osl_loadModule( lib2Name.pData, 0); + osl_unloadModule( handleMod2); + + //----------------------------------------------------------- + // ---------------------------------------------------------- + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + } + rtl_unloadUnusedModules( NULL); + + // Try to get a symbol, must fail + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData); + + void* pSymbol2= osl_getSymbol( handleMod2, sSymbol.pData); + if( ! pSymbol && !pSymbol2) + return sal_True; + return sal_False; +} + +/* 2 Modules and 6 services + +*/ +sal_Bool test5() +{ + printf("test5 ####################################################\n"); + oslModule handleMod1=0; + oslModule handleMod2=0; + sal_Bool btest1= sal_False; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2)); + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + + //----------------------------------------------------------- + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + Reference<XInterface> xint2= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME2))); + Reference<XInterface> xint3= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME3))); + Reference<XInterface> xint4= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21))); + Reference<XInterface> xint5= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME22))); + Reference<XInterface> xint6= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME23))); + + // ---------------------------------------------------------- + handleMod1= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod1); + handleMod2= osl_loadModule( lib2Name.pData, 0); + osl_unloadModule( handleMod2); + + // get rid of the service manager + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + + // try unloading, must fail + rtl_unloadUnusedModules( NULL); + void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData); + + void* pSymbol2= osl_getSymbol( handleMod2, sSymbol.pData); + if( pSymbol && pSymbol2) + btest1= sal_True; + + } + + // Try to get a symbol, must succeed + rtl_unloadUnusedModules( NULL); + + void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData); + void* pSymbol2= osl_getSymbol( handleMod2, sSymbol.pData); + if( ! pSymbol && !pSymbol2 && btest1) + return sal_True; + return sal_False; +} + +/* +TimeValue Test +rtl_unloadUnusedModules takes a TimeValue which determines a timespan +a module must have been constantly unused in order to be unloaded. +This is only a rough test. To make accurate tests, one should directly +write code in the unload.cxx file. +The function will not return (loop) when the test fails or the result value +is far off the 10 seconds value. +*/ +sal_Bool test6() +{ + printf("test6 ####################################################\n"); + oslModule handleMod1=0; + oslModule handleMod2=0; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2)); + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + + // ---------------------------------------------------------- + handleMod1= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod1); + + // get rid of the service manager + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + } + + // Enter a loop and try unloading. At least after 10 seconds + // this should be successful. + TimeValue time={10,0}; + + TimeValue beforeTime={0,0}; + printf("\n unloading should take about 10 seconds\n"); + osl_getSystemTime( &beforeTime); + for(;;) + { + + rtl_unloadUnusedModules( &time); + void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData); + if( ! pSymbol) + break; + } + TimeValue afterTime={0,0}; + osl_getSystemTime( &afterTime); + + printf("\n it took about %i seconds \n Check the value!!!", afterTime.Seconds - beforeTime.Seconds); + printf(" hit return to continue\n"); + getchar(); + + return sal_True; +} + +/* +*/ +sal_Bool test7() +{ + printf("Test 7 ####################################################" + "\nThe callback function should be called 3 times\n"); + sal_Int32 id1=1; + sal_Int32 id2=2; + sal_Int32 id3=3; + sal_Int32 cookie1= rtl_addUnloadingListener( listenerCallback, &id1); + sal_Int32 cookie2= rtl_addUnloadingListener( listenerCallback, &id2); + sal_Int32 cookie3= rtl_addUnloadingListener( listenerCallback, &id3); + + printf("\nTest 7 \nThe listener should be called 3 times\n"); + rtl_unloadUnusedModules( NULL); + + rtl_removeUnloadingListener( cookie1); + rtl_removeUnloadingListener( cookie2); + rtl_removeUnloadingListener( cookie3); + + sal_Int32 cookie4= rtl_addUnloadingListener( listenerCallback, &id1); + sal_Int32 cookie5= rtl_addUnloadingListener( listenerCallback, &id2); + sal_Int32 cookie6= rtl_addUnloadingListener( listenerCallback, &id3); + + if( cookie1 == cookie4 && + cookie2 == cookie5 ) + { + printf("\n###cookie recycling works\n"); + printf("hit return to continue\n"); + getchar(); + } + else + { + printf("\n###cookie recycling failed!!!\n"); + printf("hit return to continue\n"); + getchar(); + } + + rtl_removeUnloadingListener( cookie1); + rtl_removeUnloadingListener( cookie2); + rtl_removeUnloadingListener( cookie3); + return sal_True; +} + +/* Test one-instance-service default factory (XUnloadingPreference) + cppuhelper/source/factory.cxx +*/ +sal_Bool test8() +{ + printf("Test 8 ####################################################\n"); + oslModule handleMod1=0; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + + sal_Bool b_ifaceSupported=sal_False; + sal_Bool b_instances_identical= sal_False; + sal_Bool b_releaseBeforeLoading= sal_False; + sal_Bool b_releaseAfterLoading= sal_False; + sal_Bool b_unloaded= sal_False; + + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + Reference<XContentEnumerationAccess> xContent( serviceManager, UNO_QUERY); + Reference<XEnumeration> xenum= xContent->createContentEnumeration( + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4))); + + Any any_elem; + if( xenum->hasMoreElements()) + any_elem= xenum->nextElement(); + Reference<XInterface> xinterfaceFact; + any_elem>>=xinterfaceFact; + Reference<XTypeProvider> xprov( xinterfaceFact, UNO_QUERY); + + Sequence<Type> seqTypes= xprov->getTypes(); + + // XTypeProvider test + for( sal_Int32 i=0; i<seqTypes.getLength(); i++) + { + OUString name= seqTypes[i].getTypeName(); + if( name == OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.uno.XUnloadingPreference"))) + b_ifaceSupported= sal_True; + } + + // XUnloadingPreference::releaseOnNotification should return true now because we haven't + // created an instance yet + Reference<XUnloadingPreference> xreject( xinterfaceFact, UNO_QUERY); + b_releaseBeforeLoading= xreject->releaseOnNotification(); + + // Create instance. Afterwards releaseOnNotification should return false. + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME4))); + b_releaseAfterLoading= xreject->releaseOnNotification(); + b_releaseAfterLoading= b_releaseAfterLoading? sal_False : sal_True; + + // safe the handle of the module + handleMod1= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod1); + + // ---------------------------------------------------------- + // for debugging + Reference<XServiceInfo> info( xint, UNO_QUERY); + OUString s= info->getImplementationName(); + + // get another instance which must be the same + Reference<XInterface> xint2= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME4))); + + b_instances_identical= xint == xint2; + + // get rid of the service manager + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + } + + rtl_unloadUnusedModules( NULL); + + // The library must be unloaded now + void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData); + if( ! pSymbol ) + b_unloaded= sal_True; + + if( b_ifaceSupported && b_instances_identical && b_releaseBeforeLoading && + b_releaseAfterLoading && b_unloaded) + return sal_True; + return sal_False; +} + +void SAL_CALL listenerCallback( void* id) +{ + printf(" listener called with id= %i\n", *(sal_Int32*)id); +} + +/* + + */ +sal_Bool test9() +{ + printf("Test 9 ####################################################\n"); + oslModule handleMod=0; + sal_Bool retval=sal_False; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + // Release the service. The library refcount should be 1 + xint=0; + + handleMod= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod); + //----------------------------------------------------------- + + // the service manager is still alive + rtl_unloadUnusedModules( NULL); + // Try to get a symbol, must fail + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData); + + if( pSymbol) + { + retval= sal_False; + } + else + retval= sal_True; + return retval; +} |