summaryrefslogtreecommitdiff
path: root/sal/test
diff options
context:
space:
mode:
Diffstat (limited to 'sal/test')
-rw-r--r--sal/test/bootstrap65
-rwxr-xr-xsal/test/bootstrap.bat62
-rwxr-xr-xsal/test/bootstrap.pl260
-rw-r--r--sal/test/bootstraptest.ini11
-rw-r--r--sal/test/makefile.mk152
-rw-r--r--sal/test/test_salmain.cxx42
-rw-r--r--sal/test/test_salmainwithargs.cxx42
-rw-r--r--sal/test/testbootstrap.cxx134
-rw-r--r--sal/test/testbootstrap.ini4
-rw-r--r--sal/test/unloading/exports.dxp4
-rw-r--r--sal/test/unloading/makefile.mk126
-rw-r--r--sal/test/unloading/readme.txt14
-rw-r--r--sal/test/unloading/samplelib1.cxx269
-rw-r--r--sal/test/unloading/samplelib1.xml41
-rw-r--r--sal/test/unloading/samplelib2.cxx236
-rw-r--r--sal/test/unloading/unloadTest.cxx656
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;
+}