summaryrefslogtreecommitdiff
path: root/testshl2
diff options
context:
space:
mode:
Diffstat (limited to 'testshl2')
-rw-r--r--testshl2/README8
-rw-r--r--testshl2/inc/makefile.mk51
-rw-r--r--testshl2/inc/pch/precompiled_testshl2.cxx32
-rw-r--r--testshl2/inc/pch/precompiled_testshl2.hxx35
-rw-r--r--testshl2/prj/build.lst6
-rw-r--r--testshl2/prj/d.lst23
-rw-r--r--testshl2/source/autoregisterhelper.cxx143
-rw-r--r--testshl2/source/codegen/codegen.pl601
-rw-r--r--testshl2/source/dynamicregister.cxx210
-rw-r--r--testshl2/source/file.cxx77
-rw-r--r--testshl2/source/filehelper.cxx231
-rw-r--r--testshl2/source/getopt.cxx922
-rw-r--r--testshl2/source/makefile.mk135
-rw-r--r--testshl2/source/terminate.cxx286
-rw-r--r--testshl2/source/testshl.cxx399
-rw-r--r--testshl2/source/testshlrunner/ProcessHandler.java358
-rw-r--r--testshl2/source/testshlrunner/TestShl2Runner.java940
-rw-r--r--testshl2/source/testshlrunner/makefile.mk48
-rw-r--r--testshl2/source/versioner.cxx120
-rw-r--r--testshl2/source/versionhelper.cxx127
-rw-r--r--testshl2/util/makefile.mk42
-rw-r--r--testshl2/workben/codegen/README9
-rw-r--r--testshl2/workben/codegen/checkfile7
-rw-r--r--testshl2/workben/codegen/cleanup10
-rw-r--r--testshl2/workben/codegen/makefile.mk49
-rw-r--r--testshl2/workben/codegen/selftest49
-rw-r--r--testshl2/workben/codegen/test.job17
-rw-r--r--testshl2/workben/codegen/w32/checkfile.btm7
-rw-r--r--testshl2/workben/codegen/w32/cleanup.btm9
-rw-r--r--testshl2/workben/codegen/w32/makefile.mk49
-rw-r--r--testshl2/workben/codegen/w32/selftest.btm47
-rw-r--r--testshl2/workben/codegen/w32/test.job17
-rw-r--r--testshl2/workben/dlltest/export.exp1
-rw-r--r--testshl2/workben/dlltest/makefile.mk130
-rw-r--r--testshl2/workben/dlltest/onefunc.cxx54
-rw-r--r--testshl2/workben/dlltest/onefuncstarter.cxx143
-rw-r--r--testshl2/workben/dlltest/registerfunc.h44
-rw-r--r--testshl2/workben/examples/makefile.mk68
-rw-r--r--testshl2/workben/examples/testshl_test.cxx289
-rw-r--r--testshl2/workben/garbage_dump/float.cxx140
-rw-r--r--testshl2/workben/garbage_dump/nippondir.cxx319
-rw-r--r--testshl2/workben/garbage_dump/some_tips.cxx129
-rw-r--r--testshl2/workben/getopt/makefile.mk64
-rw-r--r--testshl2/workben/getopt/test_getopt.cxx143
-rw-r--r--testshl2/workben/makefile.mk130
-rw-r--r--testshl2/workben/runner/unxlngi4.config.file34
-rw-r--r--testshl2/workben/runner/unxsols3.config.file34
-rw-r--r--testshl2/workben/runner/wntmsci9.config.file46
-rw-r--r--testshl2/workben/selftest/README.txt30
-rw-r--r--testshl2/workben/selftest/delivertest.cxx64
-rw-r--r--testshl2/workben/selftest/export.map8
-rw-r--r--testshl2/workben/selftest/makefile.mk91
-rw-r--r--testshl2/workben/selftest/notdeliveredtest.cxx64
-rw-r--r--testshl2/workben/singleton.cxx52
-rw-r--r--testshl2/workben/skeleton/export.map7
-rw-r--r--testshl2/workben/skeleton/makefile.mk55
-rw-r--r--testshl2/workben/skeleton/skeleton.cxx82
-rw-r--r--testshl2/workben/test_autoptr.cxx103
-rw-r--r--testshl2/workben/test_filter.cxx233
-rw-r--r--testshl2/workben/test_member.cxx100
-rw-r--r--testshl2/workben/test_ostringstream.cxx119
-rw-r--r--testshl2/workben/test_preproc.cxx58
-rw-r--r--testshl2/workben/test_printf.cxx63
-rw-r--r--testshl2/workben/test_string.cxx141
-rw-r--r--testshl2/workben/uno/export.exp1
-rwxr-xr-xtestshl2/workben/uno/export.map8
-rw-r--r--testshl2/workben/uno/makefile.mk83
-rw-r--r--testshl2/workben/uno/unotest.cxx117
68 files changed, 8311 insertions, 0 deletions
diff --git a/testshl2/README b/testshl2/README
new file mode 100644
index 000000000000..03e7475a1d6e
--- /dev/null
+++ b/testshl2/README
@@ -0,0 +1,8 @@
+This is the second version of the testshl.
+
+Upper-lower case filenames.
+- I prever lower case filenames. Due to the fact that the cppunit
+ code uses mixed upper and lower case I leave the original filenames
+ unchanged.
+
+
diff --git a/testshl2/inc/makefile.mk b/testshl2/inc/makefile.mk
new file mode 100644
index 000000000000..07de76aa0116
--- /dev/null
+++ b/testshl2/inc/makefile.mk
@@ -0,0 +1,51 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.3 $
+#
+# 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=testshl2
+TARGET=inc
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# --- Files --------------------------------------------------------
+# --- Targets -------------------------------------------------------
+
+.INCLUDE : target.mk
+
+.IF "$(ENABLE_PCH)"!=""
+ALLTAR : \
+ $(SLO)$/precompiled.pch \
+ $(SLO)$/precompiled_ex.pch
+
+.ENDIF # "$(ENABLE_PCH)"!=""
+
diff --git a/testshl2/inc/pch/precompiled_testshl2.cxx b/testshl2/inc/pch/precompiled_testshl2.cxx
new file mode 100644
index 000000000000..d72d1cf2ffff
--- /dev/null
+++ b/testshl2/inc/pch/precompiled_testshl2.cxx
@@ -0,0 +1,32 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: precompiled_testshl2.cxx,v $
+ * $Revision: 1.3 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+#include "precompiled_testshl2.hxx"
+
diff --git a/testshl2/inc/pch/precompiled_testshl2.hxx b/testshl2/inc/pch/precompiled_testshl2.hxx
new file mode 100644
index 000000000000..17bd162895b2
--- /dev/null
+++ b/testshl2/inc/pch/precompiled_testshl2.hxx
@@ -0,0 +1,35 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: precompiled_testshl2.hxx,v $
+ * $Revision: 1.3 $
+ *
+ * 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): Generated on 2006-09-01 17:50:13.576513
+
+#ifdef PRECOMPILED_HEADERS
+#endif
+
diff --git a/testshl2/prj/build.lst b/testshl2/prj/build.lst
new file mode 100644
index 000000000000..d7a5c76cc435
--- /dev/null
+++ b/testshl2/prj/build.lst
@@ -0,0 +1,6 @@
+t2 testshl2 : cppunit NULL
+t2 testshl2 usr1 - all t2_mkout NULL
+t2 testshl2\inc nmake - all t2_inc NULL
+t2 testshl2\source nmake - all t2_src t2_inc NULL
+t2 testshl2\util nmake - all t2_util t2_src NULL
+
diff --git a/testshl2/prj/d.lst b/testshl2/prj/d.lst
new file mode 100644
index 000000000000..f97cec8747d6
--- /dev/null
+++ b/testshl2/prj/d.lst
@@ -0,0 +1,23 @@
+..\%__SRC%\bin\testshl2.exe %_DEST%\bin%_EXT%\testshl2.exe
+..\%__SRC%\bin\testshl2_timeout.exe %_DEST%\bin%_EXT%\testshl2_timeout.exe
+..\%__SRC%\bin\testshl2 %_DEST%\bin%_EXT%\testshl2
+..\%__SRC%\bin\testshl2_timeout %_DEST%\bin%_EXT%\testshl2_timeout
+..\%__SRC%\bin\versioninfo.exe %_DEST%\bin%_EXT%\versioninfo.exe
+..\%__SRC%\bin\versioninfo %_DEST%\bin%_EXT%\versioninfo
+
+..\source\codegen\codegen.pl %_DEST%\bin%_EXT%\codegen_testshl2.pl
+
+mkdir: %_DEST%\inc%_EXT%\testshl
+..\inc\*.hxx %_DEST%\inc%_EXT%\testshl\*.hxx
+..\inc\*.h %_DEST%\inc%_EXT%\testshl\*.h
+
+..\%__SRC%\lib\cppunit.lib %_DEST%\lib%_EXT%\cppunit.lib
+..\%__SRC%\lib\*.a %_DEST%\lib%_EXT%\*.a
+
+# The follows is a testshl2 selftest library, which must be delivered for tests.
+# But per default this library doesn't exists.
+# For more information see workben/selftest
+..\%__SRC%\bin\delivertest.dll %_DEST%\bin%_EXT%\testshl2_deliver_test.dll
+..\%__SRC%\lib\libdelivertest.so %_DEST%\lib%_EXT%\libtestshl2_deliver_test.so
+..\%__SRC%\lib\libdelivertest.dylib %_DEST%\lib%_EXT%\libtestshl2_deliver_test.dylib
+
diff --git a/testshl2/source/autoregisterhelper.cxx b/testshl2/source/autoregisterhelper.cxx
new file mode 100644
index 000000000000..ff36ecac6db6
--- /dev/null
+++ b/testshl2/source/autoregisterhelper.cxx
@@ -0,0 +1,143 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: autoregisterhelper.cxx,v $
+ * $Revision: 1.12 $
+ *
+ * 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_testshl2.hxx"
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "testshl/autoregisterhelper.hxx"
+
+#include <rtl/ustring.hxx>
+
+#include <cppunit/autoregister/registerfunc.h>
+#include <cppunit/autoregister/callbackstructure.h>
+#include <cppunit/result/callbackfunc.h>
+#include <cppunit/autoregister/testfunc.h>
+#include "testshl/filehelper.hxx"
+
+FunctionList m_Functions;
+// osl::Mutex m_Mutex;
+
+extern "C" void SAL_CALL registerFunc(FktPtr _pFunc, const char*)
+{
+ m_Functions.push_back(_pFunc);
+}
+
+// -----------------------------------------------------------------------------
+AutomaticRegisterHelper::AutomaticRegisterHelper(rtl::OUString const& _sDLLName, GetOpt & _aOptions /*, JobList * _pJobList*/)
+ :DynamicLibraryHelper(_sDLLName, _aOptions),
+ m_bLoadLibraryOK(false)
+{
+ // try to get the entry pointer
+ FktRegAllPtr pFunc = (FktRegAllPtr) m_pModule->getFunctionSymbol(
+ rtl::OUString::createFromAscii( "registerAllTestFunction" ) );
+
+ if (pFunc)
+ {
+ m_bLoadLibraryOK = true;
+ // FktRegFuncPtr pRegisterFunc = &DynamicLibraryHelper::registerFunc;
+ // pFunc(pRegisterFunc);
+ // osl::Guard aGuard(m_Mutex);
+ FktRegFuncPtr pRegisterFunc = &registerFunc;
+
+ CallbackStructure aCallback;
+ aCallback.aRegisterFunction = pRegisterFunc;
+
+ aCallback.aCallbackDispatch = &CallbackDispatch;
+
+ // special parameter for API testing
+ if (_aOptions.hasOpt("-forward"))
+ {
+ aCallback.psForward = _aOptions.getOpt("-forward").getStr();
+ }
+
+ // aCallback.pJobList = _pJobList;
+
+ //# aCallback.aStartTest = &TestResult_startTest;
+ //# aCallback.aAddFailure = &TestResult_addFailure;
+ //# aCallback.aAddError = &TestResult_addError;
+ //# aCallback.aEndTest = &TestResult_endTest;
+ //# aCallback.aShouldStop = &TestResult_shouldStop;
+ //# aCallback.aAddInfo = &TestResult_addInfo;
+ //# aCallback.aEnterNode = &TestResult_enterNode;
+ //# aCallback.aLeaveNode = &TestResult_leaveNode;
+
+ aCallback.nBits = FileHelper::createFlags(_aOptions);
+
+ pFunc(&aCallback);
+
+ if (aCallback.nMagic == aCallback.nMagic2)
+ {
+ // ok internal simple test done.
+ m_aFunctionList = m_Functions;
+ }
+ else
+ {
+ // ERROR, the function seams not to be what we thing it's to be.
+ fprintf(stderr, "error: Internal check failed. Structure inconsistent, Value Magic2 != Magic.\nPlease recompile your test libraries.");
+ exit(-1);
+ }
+ }
+ else
+ {
+ fprintf(stderr, "warning: Function 'registerAllTestFunction' not found.\n");
+ fprintf(stderr, "If you think, you are right, build testshl2 completly new.\n");
+ }
+}
+
+void AutomaticRegisterHelper::CallAll(hTestResult _hResult) const
+{
+ // can't load the module, break the tests.
+ if (m_bLoadLibraryOK == false)
+ {
+ return;
+ }
+
+ for (FunctionList::const_iterator it = m_aFunctionList.begin();
+ it != m_aFunctionList.end();
+ ++it)
+ {
+ FktPtr pFunc = *it;
+ if (pFunc)
+ {
+ (pFunc)(_hResult);
+ }
+ }
+}
+
+AutomaticRegisterHelper::~AutomaticRegisterHelper()
+{
+ if (getOptions().hasOpt("-verbose"))
+ {
+ fprintf(stderr, "Dtor AutomaticRegisterHelper.\n");
+ }
+}
diff --git a/testshl2/source/codegen/codegen.pl b/testshl2/source/codegen/codegen.pl
new file mode 100644
index 000000000000..6e2120798fac
--- /dev/null
+++ b/testshl2/source/codegen/codegen.pl
@@ -0,0 +1,601 @@
+eval 'exec perl -wS $0 ${1+"$@"}'
+ if 0;
+
+use strict;
+use Cwd;
+
+# #/usr/bin/perl
+
+# @lines
+# push(@lines, $line) append
+# pop(@lines) remove last
+# shift(@lines) remove at first
+# unshift(@lines, $line) insert at first
+# $lines[-1] get last
+# foreach $line (@lines)
+
+# $a eq $b compares strings
+# $a == $b compares digits
+
+# split operator
+# ($vorname, $nachname, $email) = split (/\s+/, $person);
+
+my $sCurrentPackage = "";
+my $sCurrentClass = "";
+my @sMethodNames;
+my @sClassNameStack;
+my @sFilenameStack;
+my $sCurrentFilename;
+my $nNoAdditionalAnyMore = 0;
+my $bShowDemo = 1;
+my $sSrcExt = ".cxx";
+
+my $cwd = getcwd();
+
+sub generateMakefileEntry(*$$);
+
+# ------------------------------------------------------------------------------
+sub createFilename
+{
+ my $sPackageName = shift;
+ my $sFilenameCounter = "$sPackageName$sSrcExt";
+ my $sFilename = "$sPackageName";
+ my $nCount = 0;
+ while ( -e $sFilenameCounter)
+ {
+ $nCount ++;
+ $sFilename = "$sPackageName" . "_$nCount";
+ $sFilenameCounter = "$sFilename$sSrcExt";
+ }
+ push(@sFilenameStack, $sFilename);
+
+ $sCurrentFilename = $sFilenameCounter;
+ return $sFilenameCounter;
+}
+# ------------------------------------------------------------------------------
+
+sub generateNewPackage(*$)
+{
+ local *CPPFILE = shift;
+ my $sPackageName = shift;
+
+ my $sFilename = createFilename($sPackageName);
+ open(CPPFILE, ">$sFilename") || die "can't create source file";
+ print CPPFILE "// autogenerated file with codegen.pl\n";
+ print CPPFILE "\n";
+ print CPPFILE "#include <cppunit/simpleheader.hxx>\n";
+ print CPPFILE "\n";
+ print CPPFILE "namespace $sPackageName\n";
+ print CPPFILE "{\n";
+}
+
+# ------------------------------------------------------------------------------
+sub generateNewClass
+{
+ my $sClassName = shift;
+ print CPPFILE "\n";
+ print CPPFILE "class $sClassName : public CppUnit::TestFixture\n";
+ print CPPFILE "{\n";
+ print CPPFILE "public:\n";
+}
+# ------------------------------------------------------------------------------
+sub closeMethods
+{
+ # due to the fact, that this is a function based code, not object based
+ # we have to do some hacks, to prevent us from creating wrong code
+ if ($sCurrentClass =~ /^$/ || $sCurrentPackage =~ /^$/ )
+ {
+ return;
+ }
+
+ # here we create the methods
+ # first the setUp() and tearDown()
+ print CPPFILE " // initialise your test code values here.\n";
+ print CPPFILE " void setUp()\n";
+ print CPPFILE " {\n";
+ print CPPFILE " }\n";
+ print CPPFILE "\n";
+ print CPPFILE " void tearDown()\n";
+ print CPPFILE " {\n";
+ print CPPFILE " }\n";
+ print CPPFILE "\n";
+
+ print CPPFILE " // insert your test code here.\n";
+
+ my $sMethod;
+ if ($#sMethodNames >= 0)
+ {
+ # all found methods
+ foreach $sMethod (@sMethodNames)
+ {
+ print CPPFILE " void $sMethod()\n";
+ print CPPFILE " {\n";
+ if ($bShowDemo == 1)
+ {
+ print CPPFILE " // this is demonstration code\n";
+ print CPPFILE " // CPPUNIT_ASSERT_MESSAGE(\"a message\", 1 == 1);\n";
+ $bShowDemo = 0;
+ }
+ print CPPFILE " CPPUNIT_ASSERT_STUB();\n";
+ print CPPFILE " }\n";
+ print CPPFILE "\n";
+ }
+ }
+ else
+ {
+ # if no methods found, create at least one
+ print CPPFILE " // this is only demonstration code\n";
+ print CPPFILE " void EmptyMethod()\n";
+ print CPPFILE " {\n";
+ print CPPFILE " // CPPUNIT_ASSERT_MESSAGE(\"a message\", 1 == 1);\n";
+ print CPPFILE " CPPUNIT_ASSERT_STUB();\n";
+ print CPPFILE " }\n";
+ print CPPFILE "\n";
+ }
+
+ # create the autoregister code
+ print CPPFILE " // Change the following lines only, if you add, remove or rename \n";
+ print CPPFILE " // member functions of the current class, \n";
+ print CPPFILE " // because these macros are need by auto register mechanism.\n";
+ print CPPFILE "\n";
+
+ print CPPFILE " CPPUNIT_TEST_SUITE($sCurrentClass);\n";
+ push(@sClassNameStack, $sCurrentClass);
+
+ my $nCount = 0;
+ if ($#sMethodNames >= 0)
+ {
+ foreach $sMethod (@sMethodNames)
+ {
+ print CPPFILE " CPPUNIT_TEST($sMethod);\n";
+ $nCount ++;
+ }
+ # empty the method list
+ my $i;
+ for ($i = 0;$i < $nCount;$i++)
+ {
+ pop(@sMethodNames);
+ }
+ }
+ else
+ {
+ print CPPFILE " CPPUNIT_TEST(EmptyMethod);\n";
+ }
+ print CPPFILE " CPPUNIT_TEST_SUITE_END();\n";
+}
+
+# ------------------------------------------------------------------------------
+sub closeClass
+{
+ # my $sClassName = shift;
+ if ($sCurrentClass =~ /^$/)
+ {
+ return;
+ }
+ print CPPFILE "}; // class $sCurrentClass\n";
+ print CPPFILE "\n";
+ $sCurrentClass = "";
+}
+# ------------------------------------------------------------------------------
+
+sub closePackage
+{
+ # my $sPackageName = shift;
+ if ($sCurrentPackage =~ /^$/)
+ {
+ return;
+ }
+ # create the autoregister code
+ print CPPFILE "// -----------------------------------------------------------------------------\n";
+ my $nCount = 0;
+ my $sClassName;
+ foreach $sClassName (@sClassNameStack)
+ {
+ print CPPFILE "CPPUNIT_TEST_SUITE_NAMED_REGISTRATION($sCurrentPackage" . "::" . "$sClassName, \"$sCurrentPackage\");\n";
+ $nCount ++;
+ }
+ # empty the method list
+ my $i;
+ for ($i = 0;$i < $nCount;$i++)
+ {
+ pop(@sClassNameStack);
+ }
+
+ print CPPFILE "} // namespace $sCurrentPackage\n";
+ print CPPFILE "\n";
+
+ print CPPFILE "
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+";
+ # if the variable nNoAdditionalAnyMore is set to one, we insert a remark before
+ # the macro NOADDITIONAL; to prevent us from linker problems.
+ if ($nNoAdditionalAnyMore == 1)
+ {
+ print CPPFILE "// ";
+ }
+ print CPPFILE "NOADDITIONAL;\n";
+ print CPPFILE "\n";
+
+ close(CPPFILE);
+
+ $nNoAdditionalAnyMore = 1;
+
+ $sCurrentPackage = "";
+}
+
+# ------------------------------------------------------------------------------
+
+# sub generateCppSource
+# {
+# my $sPackageName = shift;
+# my $sClassName = shift;
+# my $sMethodName = shift;
+#
+#
+# open(CPPFILE, ">$sFilename") || die "can't create cxx source file";
+# print CPPFILE "// autogenerated file\n";
+# close(CPPFILE);
+# }
+# ------------------------------------------------------------------------------
+sub walkThroughJobFile
+{
+ my $filename = shift;
+
+ open(FILE, $filename) || die "can't open $filename\n";
+
+ print "start jobfile interpreter.\n";
+ my $line;
+ while($line = <FILE>)
+ {
+ chomp($line);
+ # DOS Hack grrrr...
+ while ($line =~ /
+$/)
+ {
+ $line = substr($line, 0, -1);
+ }
+
+ if ($line =~ /^\#/ || $line =~ /^$/)
+ {
+ # remark or empty line
+ }
+ else
+ {
+ if ($line =~ /^\w+/) # must start with a word character
+ {
+ # print "$line\n";
+ my $sPackageName = "";
+ my $sClassName = "";
+ my $sMethodName = "";
+ my @names;
+ @names = split(/\./, $line);
+ if (exists $names[0])
+ {
+ $sPackageName = $names[0];
+ }
+ if (exists $names[1])
+ {
+ $sClassName = $names[1];
+ }
+ if (exists $names[2])
+ {
+ $sMethodName = $names[2];
+ }
+
+ if ($sClassName =~ /^$/)
+ {
+ print "error: in $line, no class name exist. Build no code.\n";
+ }
+ # test if it also works without methods
+ # elsif ($sMethodName =~ /^$/)
+ # {
+ # print "error: in $line, no method name exist.\n";
+ # }
+ else
+ {
+ if ($sMethodName =~ /^$/)
+ {
+ print "warning: in $line, no method name exist, create only one member function.\n";
+ }
+
+ print "build code for: ${sPackageName}.${sClassName}.${sMethodName}\n";
+
+ if ($sCurrentPackage ne $sPackageName)
+ {
+ closeMethods();
+ closeClass();
+ closePackage();
+
+ $sCurrentPackage = $sPackageName;
+ generateNewPackage(CPPFILE, $sPackageName);
+ }
+ if ($sCurrentClass ne $sClassName)
+ {
+ closeMethods();
+ closeClass();
+ $sCurrentClass = $sClassName;
+ generateNewClass($sClassName);
+ }
+ if ($sMethodName)
+ {
+ push(@sMethodNames, $sMethodName);
+ }
+ }
+ }
+ }
+ }
+
+ closeMethods();
+ closeClass();
+ closePackage();
+ close(FILE);
+
+ print "done.\n\nThe following files have been created in the current directory:\n";
+
+ my $sFilename;
+ foreach $sFilename (@sFilenameStack)
+ {
+ print " ${sFilename}${sSrcExt}\n";
+ }
+ print "\n";
+}
+
+# ------------------------------------------------------------------------------
+sub checkMakefileNumber
+{
+ my $sTargetName = shift;
+
+ # This function gives back the lowest number for SHL\dTARGET
+ open(MAKEFILE, "makefile.mk") || return -1;
+
+ my $line;
+ my $nNumber;
+ my @aNumbers;
+ my $i;
+ for($i = 1;$i < 10;$i++)
+ {
+ $aNumbers[$i] = 0;
+ }
+
+ my $nReplacePos = -1;
+ while($line = <MAKEFILE>)
+ {
+ chomp($line);
+
+ if ($line =~ /^SHL(\d)TARGET/)
+ {
+ $aNumbers[$1] = 1;
+ $line =~ /^SHL(\d)TARGET=\s*(\S+)\s*/;
+
+ print "Target: $2\n";
+ if ($sTargetName eq $2)
+ {
+ print "info: Targetname already exist.\n";
+ $nReplacePos = $1;
+ }
+ }
+ }
+ close(MAKEFILE);
+
+ my $nFirstFree = 0;
+ for($i = 1;$i < 10;$i++)
+ {
+ if ($aNumbers[$i] == 0)
+ {
+ $nFirstFree = $i;
+ last;
+ }
+ }
+ return $nFirstFree, $nReplacePos;
+}
+# ------------------------------------------------------------------------------
+sub createNewMakefile($$$)
+{
+ my $sNewMakefileName = shift;
+ my $sTargetName = shift;
+ my $nNumber = shift;
+ local *MAKEFILE;
+
+ # this function split a makefile into two parts,
+ open(MAKEFILE, "makefile.mk") || return;
+ my @lines = <MAKEFILE>;
+ close(MAKEFILE);
+
+ # print "info: Makefile has $#lines lines.\n";
+
+ # search a point, where to insert the new makefile part.
+ my $nTargetMK = -1;
+ my $i;
+ for ($i = $#lines; $i > 0; $i--)
+ {
+ if ($lines[$i] =~ /\.INCLUDE.*target.mk\s$/)
+ {
+ $nTargetMK = $i;
+ last;
+ }
+ }
+ if ($nTargetMK > 0)
+ {
+ # print "info: target.mk found, is in line $nTargetMK\n";
+
+ # print "@lines[0]";
+ # print "@lines[1]";
+ # print "@lines[2]";
+ # print "@lines[$nTargetMK - 2]";
+ # print "@lines[$nTargetMK - 1]";
+ # print "@lines[$nTargetMK]";
+
+ local *OUT_MAKEFILE;
+ open(OUT_MAKEFILE, ">$sNewMakefileName") || return;
+ for ($i = 0;$i < ($nTargetMK - 2); $i++)
+ {
+ print OUT_MAKEFILE $lines[$i];
+ }
+
+ generateMakefileEntry(OUT_MAKEFILE, $sTargetName, $nNumber);
+
+ for ($i = ($nTargetMK - 2);$i <= $#lines; $i++)
+ {
+ print OUT_MAKEFILE $lines[$i];
+ }
+ close(OUT_MAKEFILE);
+ }
+}
+# ------------------------------------------------------------------------------
+
+sub generateMakefileEntry(*$$)
+{
+ # my MAKEFILE = shift;
+ local *_MAKEFILE = shift;
+ my $sTargetName = shift;
+ my $nNumber = shift;
+
+ # open(_MAKEFILE, ">makefile.add") || die "can't open makefile.add";
+
+ print _MAKEFILE "# BEGIN ----------------------------------------------------------------\n";
+ print _MAKEFILE "# auto generated Target:$sTargetName by codegen.pl \n";
+ print _MAKEFILE "SHL${nNumber}OBJS= ";
+ my $sFilename;
+ foreach $sFilename (@sFilenameStack)
+ {
+ print _MAKEFILE " \\\n";
+ print _MAKEFILE " \$(SLO)\$/$sFilename.obj";
+ }
+ print _MAKEFILE "\n\n";
+
+ # targetname
+ print _MAKEFILE "SHL${nNumber}TARGET= $sTargetName\n";
+ # additional libraries
+ print _MAKEFILE "SHL${nNumber}STDLIBS=\\\n";
+ print _MAKEFILE " \$(SALLIB) \\\n";
+ # LLA: added by sb 18th jun 2003 (announced)
+ print _MAKEFILE " \$(CPPUNITLIB) \n";
+ # link static cppunit library
+ # print _MAKEFILE ".IF \"\$(GUI)\" == \"WNT\"\n";
+ # print _MAKEFILE "SHL${nNumber}STDLIBS+= \$(SOLARLIBDIR)\$/cppunit.lib\n";
+ # print _MAKEFILE ".ENDIF\n";
+ # print _MAKEFILE ".IF \"\$(GUI)\" == \"UNX\"\n";
+ # print _MAKEFILE "SHL${nNumber}STDLIBS+=\$(SOLARLIBDIR)\$/libcppunit\$(DLLPOSTFIX).a\n";
+ # print _MAKEFILE ".ENDIF\n";
+ print _MAKEFILE "\n";
+ print _MAKEFILE "SHL${nNumber}IMPLIB= i\$(SHL${nNumber}TARGET)\n";
+ print _MAKEFILE "# SHL${nNumber}DEF= \$(MISC)\$/\$(SHL${nNumber}TARGET).def\n";
+ print _MAKEFILE "\n";
+ # DEF name
+ print _MAKEFILE "DEF${nNumber}NAME =\$(SHL${nNumber}TARGET)\n";
+ print _MAKEFILE "# DEF${nNumber}EXPORTFILE= export.exp\n";
+ print _MAKEFILE "SHL${nNumber}VERSIONMAP= export.map\n";
+ print _MAKEFILE "# auto generated Target:$sTargetName\n";
+ print _MAKEFILE "# END ------------------------------------------------------------------\n\n";
+
+ # close(_MAKEFILE);
+}
+
+# ------------------------------------------------------------------------------
+sub usage
+{
+ print "usage:\ncodegen.pl joblist [targetname]\n";
+ print "\n(c) Sun Microsystems Inc. 2003\n";
+ print "
+This is a testshl2 codegenerator which creates compilable C++ source files
+with stub functions for all given test routines from the jobfile.
+Also generate a makefile entry which is insert in the makefile.new
+if a makefile.mk already exist or this tool creates a makefile.add. Which
+has to add into a new makefile.mk by hand.
+Also generate a export.map file, if no one exist.
+";
+ exit(1);
+}
+# -------------------------------- main function --------------------------------
+
+sub main
+{
+ if ($#ARGV < 0)
+ {
+ usage();
+ }
+ my $jobfile = $ARGV[0];
+ my $sTargetName;
+ if ($#ARGV < 2)
+ {
+ # remove .sce
+ $sTargetName = $jobfile;
+ $sTargetName =~ s/\.\w*//;
+ }
+ else
+ {
+ $sTargetName = $ARGV[1];
+ }
+ print "Test code generator\n\n";
+
+ if (! -e $jobfile)
+ {
+ print "error: given jobfile '$jobfile' doesn't exist.\n";
+ exit(1);
+ }
+ walkThroughJobFile($jobfile);
+
+ # generate makefile
+
+ if (-e "makefile.mk")
+ {
+ my $n;
+ my $nReplacePos;
+ ($n, $nReplacePos) = checkMakefileNumber($sTargetName);
+ # $n == -1 no makefile
+ # $n == 0 no free number
+ # $n 1..9 ok.
+ if ($n > 0)
+ {
+ my $sNewMakefileName = "makefile.new";
+ print "Makefile: Add the 'SHL${n}TARGET' to the file '$sNewMakefileName'\n";
+ createNewMakefile($sNewMakefileName, $sTargetName, $n);
+ }
+ }
+ else
+ {
+ print "warning: No makefile.mk found, please add the content of makefile.add to a makefile.mk file\n";
+ local *MAKEFILE;
+ open(MAKEFILE, ">makefile.add");
+ generateMakefileEntry(MAKEFILE, $sTargetName, 1);
+ close(MAKEFILE);
+ }
+ print "\n";
+ # this is the old export.exp method
+ # if (! -e "export.exp")
+ # {
+ # print "info: create export.exp file\n";
+ # open(EXPORTEXP, ">export.exp") || die "can't create export.exp";
+ # print EXPORTEXP "registerAllTestFunction\n";
+ # close(EXPORTEXP);
+ # }
+ # else
+ # {
+ # print "The file 'export.exp' file already exist, please make sure that it contains the entry 'registerAllTestFunction'.\n";
+ # }
+ if (! -e "export.map")
+ {
+ local *EXPORTMAP;
+ print "info: create export.map file\n";
+ open(EXPORTMAP, ">export.map") || die "can't create export.map";
+ print EXPORTMAP "UDK_3.0 {\n";
+ print EXPORTMAP " global:\n";
+ print EXPORTMAP " registerAllTestFunction;\n";
+ print EXPORTMAP "\n";
+ print EXPORTMAP " local:\n";
+ print EXPORTMAP " *;\n";
+ print EXPORTMAP "};\n";
+ close(EXPORTMAP);
+ }
+ else
+ {
+ print "The file 'export.map' file already exist, please make sure that it contains the entry 'registerAllTestFunction'.\n";
+ }
+}
+
+# ------------------------------------------------------------------------------
+
+main();
diff --git a/testshl2/source/dynamicregister.cxx b/testshl2/source/dynamicregister.cxx
new file mode 100644
index 000000000000..02fb05871303
--- /dev/null
+++ b/testshl2/source/dynamicregister.cxx
@@ -0,0 +1,210 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: dynamicregister.cxx,v $
+ * $Revision: 1.11 $
+ *
+ * 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_testshl2.hxx"
+
+#include "testshl/dynamicregister.hxx"
+#include <osl/process.h>
+// #include <osl/mutex.hxx>
+#include <rtl/string.hxx>
+#include <rtl/ustring.hxx>
+#include "testshl/filehelper.hxx"
+
+#include <unistd.h>
+
+#if defined(WIN32)
+#include <direct.h> /* w.g. _chdir() */
+#endif
+
+namespace fixes
+{
+ void changedir(const char* _sPath)
+ {
+#if defined(WIN32)
+ // chdir(_sPath) is marked depricated since Visual C++ 2005
+ // use _chdir instead
+ ::_chdir(_sPath);
+#else
+ ::chdir(_sPath);
+#endif
+ }
+}
+
+// -----------------------------------------------------------------------------
+
+DynamicLibraryHelper::DynamicLibraryHelper(rtl::OUString const& _suDLLName, GetOpt & _aOptions)
+ :m_pModule(new ::osl::Module()),
+ m_suDLLName(_suDLLName),
+ m_aOptions(_aOptions)
+{
+ // create and load the module (shared library)
+ m_suAbsolutePathFile = FileHelper::convertPath( _suDLLName );
+
+ // due to some problems on mac OS
+ // we split the absolute pathname to path and filename
+ // change to the path and load the filename direct
+ // then change back to the old path.
+ rtl::OUString suPathSeparator = rtl::OUString( rtl::OUString::createFromAscii("/"));
+ sal_Int32 nPos = m_suAbsolutePathFile.lastIndexOf(suPathSeparator);
+ if (nPos != -1)
+ {
+ m_suAbsolutePath = m_suAbsolutePathFile.copy(0, nPos);
+ m_suFilename = m_suAbsolutePathFile.copy(nPos + 1);
+ }
+ else
+ {
+ // Should never happen.
+ rtl::OString sPath = rtl::OUStringToOString(m_suAbsolutePathFile, RTL_TEXTENCODING_ASCII_US);
+ fprintf(stderr, "There is a problem with path '%s'.\n", sPath.getStr());
+ exit(1);
+ }
+
+ if (getOptions().hasOpt("-absolutepath"))
+ {
+ fprintf(stderr, "Hint: Use absolute path to load test library.\n");
+ loadLibraryFromAbsolutePath();
+ }
+ else if (getOptions().hasOpt("-localpath"))
+ {
+ fprintf(stderr, "Hint: make a chdir() to the test library, then try to load the test library without given path.\n");
+ loadLibraryFromLocalPath();
+ }
+ else
+ {
+
+// PLEASE DON'T CHANGE THIS STUPID STRUCTURE, JUST ADD YOUR ENVIRONMENT
+#if defined(LINUX)
+ loadLibraryFromAbsolutePath();
+ // will fail if load local
+
+#elif defined(SOLARIS)
+ loadLibraryFromAbsolutePath();
+ // will also be right if load local
+
+#elif defined(WIN32)
+ loadLibraryFromAbsolutePath();
+ // will fail if load local
+
+#elif defined(MACOSX)
+ loadLibraryFromLocalPath();
+ // will fail if local absolute
+#else
+ // default is load absolute
+ loadLibraryFromAbsolutePath();
+#endif
+}
+}
+
+void DynamicLibraryHelper::showFilenameIfVerbose()
+{
+ if (getOptions().hasOpt("-verbose"))
+ {
+ rtl::OString sFilename = rtl::OUStringToOString(m_suFilename, RTL_TEXTENCODING_ASCII_US);
+ rtl::OString sPath = rtl::OUStringToOString(m_suAbsolutePath, RTL_TEXTENCODING_ASCII_US);
+ fprintf(stderr, "Try to load '%s' from '%s'.\n", sFilename.getStr(), sPath.getStr());
+
+ // check filename
+ }
+}
+
+void DynamicLibraryHelper::realLoadLibrary(rtl::OUString const& _suLibToLoad)
+{
+ if (! m_pModule->load(_suLibToLoad, SAL_LOADMODULE_LAZY | SAL_LOADMODULE_GLOBAL))
+ {
+ rtl::OString sDLLName = rtl::OUStringToOString(m_suDLLName, RTL_TEXTENCODING_ASCII_US);
+ fprintf(stderr, "warning: Can't load module '%s'.\n", sDLLName.getStr());
+ }
+}
+
+void DynamicLibraryHelper::loadLibraryFromAbsolutePath()
+{
+ showFilenameIfVerbose();
+ realLoadLibrary(m_suAbsolutePathFile);
+}
+
+void DynamicLibraryHelper::loadLibraryFromLocalPath()
+{
+ sal_Int32 nPos;
+ rtl::OUString suPathSeparator = rtl::OUString( rtl::OUString::createFromAscii("/"));
+#if defined(WIN32)
+ suPathSeparator = rtl::OUString( rtl::OUString::createFromAscii("\\"));
+#endif
+ rtl::OUString suSystemPathFile;
+ osl::FileBase::getSystemPathFromFileURL(m_suAbsolutePathFile, suSystemPathFile);
+
+ nPos = suSystemPathFile.lastIndexOf(suPathSeparator);
+ rtl::OUString suCurrentDirPath;
+ if (nPos != -1)
+ {
+ // the filename only, no '/' in the path
+ rtl::OUString suNewPath = suSystemPathFile.copy(0, nPos );
+ if (suNewPath.getLength() > 0)
+ {
+ rtl::OString sPath = rtl::OUStringToOString(suNewPath, RTL_TEXTENCODING_ASCII_US);
+ osl_getProcessWorkingDir( &suCurrentDirPath.pData );
+
+ fixes::changedir(sPath.getStr());
+
+ // curNewDirPath should be suPath, small self test
+ rtl::OUString curNewDirPath;
+ osl_getProcessWorkingDir( &curNewDirPath.pData );
+ if (! curNewDirPath.equals(m_suAbsolutePath))
+ {
+ fprintf(stderr, "There is a problem with path '%s'.\n", sPath.getStr());
+ }
+ }
+ }
+
+ showFilenameIfVerbose();
+ realLoadLibrary(m_suFilename);
+
+ // change back to old directory
+ if (suCurrentDirPath.getLength() > 0)
+ {
+ rtl::OString sCurrentDirPath = rtl::OUStringToOString(suCurrentDirPath, RTL_TEXTENCODING_ASCII_US);
+ fixes::changedir(sCurrentDirPath.getStr());
+ }
+}
+
+DynamicLibraryHelper::~DynamicLibraryHelper()
+{
+ if (getOptions().hasOpt("-verbose"))
+ {
+ fprintf(stderr, "Dtor DynamicLibraryHelper.\n");
+ fprintf(stderr, "Delete loaded module.");
+ }
+ delete m_pModule;
+ if (getOptions().hasOpt("-verbose"))
+ {
+ fprintf(stderr, " [done].\n");
+ }
+}
+
diff --git a/testshl2/source/file.cxx b/testshl2/source/file.cxx
new file mode 100644
index 000000000000..5a28cb70247a
--- /dev/null
+++ b/testshl2/source/file.cxx
@@ -0,0 +1,77 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: file.cxx,v $
+ * $Revision: 1.6 $
+ *
+ * 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_testshl2.hxx"
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string>
+
+// -----------------------------------------------------------------------------
+// taken from setup2
+std::string getTempPath()
+{
+ std::string sTempDir;
+
+ char* pTmp = getenv( "TEMP" );
+ if (pTmp == NULL) pTmp = getenv("temp");
+ if (pTmp == NULL) pTmp = getenv("TMP");
+ if (pTmp == NULL) pTmp = getenv("tmp");
+
+ if( pTmp && strlen(pTmp) >= 2 )
+ {
+ sTempDir = std::string( pTmp );
+ }
+ else
+ {
+#if (defined UNX) || (defined OS2)
+ int nLen;
+ pTmp = P_tmpdir;
+ nLen = strlen(pTmp);
+ if (pTmp[ nLen - 1] == '/')
+ {
+ char cBuf[256];
+ char* pBuf = cBuf;
+ strncpy( pBuf, pTmp, nLen - 1 );
+ pBuf[nLen - 1] = '\0';
+ sTempDir = std::string( pBuf );
+ }
+ else
+ {
+ sTempDir = std::string( pTmp );
+ }
+#else
+ fprintf(stderr, "error: No temp dir found.\n");
+#endif
+ }
+ return sTempDir;
+}
diff --git a/testshl2/source/filehelper.cxx b/testshl2/source/filehelper.cxx
new file mode 100644
index 000000000000..6b476a130626
--- /dev/null
+++ b/testshl2/source/filehelper.cxx
@@ -0,0 +1,231 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: filehelper.cxx,v $
+ * $Revision: 1.12 $
+ *
+ * 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_testshl2.hxx"
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string>
+
+#include "testshl/filehelper.hxx"
+#include "testshl/getopt.hxx"
+
+#include <osl/process.h>
+#include <osl/file.hxx>
+
+#ifndef _SAL_TRES_H_
+#include <rtl/tres.h>
+#endif
+
+namespace FileHelper
+{
+// -----------------------------------------------------------------------------
+// taken from setup2
+std::string getTempPath()
+{
+ std::string sTempDir;
+
+ char const * pTmp = getenv( "TEMP" );
+ if (pTmp == NULL) pTmp = getenv("temp");
+ if (pTmp == NULL) pTmp = getenv("TMP");
+ if (pTmp == NULL) pTmp = getenv("tmp");
+
+ if( pTmp && strlen(pTmp) >= 2 )
+ {
+ sTempDir = std::string( pTmp );
+ }
+ else
+ {
+#if (defined UNX) || (defined OS2)
+ int nLen;
+ pTmp = P_tmpdir;
+ nLen = strlen(pTmp);
+ if (pTmp[ nLen - 1] == '/')
+ {
+ char cBuf[256];
+ char* pBuf = cBuf;
+ strncpy( pBuf, pTmp, nLen - 1 );
+ pBuf[nLen - 1] = '\0';
+ sTempDir = std::string( pBuf );
+ }
+ else
+ {
+ sTempDir = std::string( pTmp );
+ }
+#else
+ fprintf(stderr, "error: No temp dir found.\n");
+#endif
+ }
+ return sTempDir;
+}
+
+// -----------------------------------------------------------------------------
+rtl::OUString convertPath( rtl::OUString const& _suSysPath )
+{
+ // PRE: String should contain a filename, relativ or absolut
+ rtl::OUString suURL;
+ bool bRelativ = false;
+#ifdef WNT
+ sal_Char cFileSep[] = "\\";
+#endif
+#if (defined UNX) || (defined OS2)
+ sal_Char cFileSep[] = "/";
+#endif
+
+ if ( _suSysPath.indexOf(rtl::OUString::createFromAscii("..")) == 0 )
+ {
+ bRelativ = true;
+ }
+ else if ( _suSysPath.indexOf(rtl::OUString::createFromAscii(cFileSep)) != 0 )
+ {
+ // no fileseparator found at first position found, must be relative
+ bRelativ = true;
+ }
+
+ if (bRelativ)
+ {
+ // filepath contains '..' so it's a relative path make it absolut.
+ rtl::OUString curDirPth;
+ osl_getProcessWorkingDir( &curDirPth.pData );
+
+ // rtl::OString sCurDirPath = rtl::OUStringToOString(curDirPth, RTL_TEXTENCODING_ASCII_US);
+ // fprintf(stderr, "Current Dir '%s'.\n", sCurDirPath.getStr());
+
+ osl::FileBase::getAbsoluteFileURL( curDirPth, _suSysPath, suURL );
+
+ // rtl::OString sURL = rtl::OUStringToOString(suURL, RTL_TEXTENCODING_ASCII_US);
+ // fprintf(stderr, " File URL: '%s'.\n", sURL.getStr());
+ }
+ else
+ {
+ osl::FileBase::getFileURLFromSystemPath( _suSysPath, suURL );
+ }
+ return suURL;
+}
+// -----------------------------------------------------------------------------
+rtl::OUString convertPath( rtl::OString const& sysPth )
+{
+ rtl::OUString sysPath( rtl::OUString::createFromAscii( sysPth.getStr() ) );
+ return convertPath(sysPath);
+}
+
+/**
+ * create bitmap of comandline parameters
+ */
+
+//# CmdLineBits createFlags( vector< sal_Char* > const& cmdln )
+//# {
+//# CmdLineBits retflags = rtl_tres_Flag_OK;
+//#
+//# vector< sal_Char* >::const_iterator iter = cmdln.begin();
+//# while( iter != cmdln.end() )
+//# {
+//# fprintf( stderr, "%s\n", *iter );
+//# if ( *iter[0] == '-' )
+//# {
+//# rtl::OString item( *iter );
+//# if ( item == "-boom" ) // stop near error position, exception only
+//# retflags |= rtl_tres_Flag_BOOM;
+//#
+//# if ( item == "-verbose" )
+//# retflags |= rtl_tres_Flag_VERBOSE;
+//#
+//# if ( item == "-skip" )
+//# retflags |= rtl_tres_Flag_SKIP;
+//#
+//# if ( item == "-log" )
+//# retflags |= rtl_tres_Flag_LOG;
+//#
+//# if ( item == "-his" )
+//# retflags |= rtl_tres_Flag_HIS;
+//#
+//# if ( item == "-time" )
+//# retflags |= rtl_tres_Flag_TIME;
+//#
+//# if ( item == "-msg" )
+//# retflags |= rtl_tres_Flag_MSG;
+//# }
+//# iter++;
+//# }
+//#
+//# return retflags;
+//# }
+//#
+//# CmdLineBits createFlags(int argc, char* argv[])
+//# {
+//# vector< sal_Char* > cmdln;
+//# sal_Int32 i;
+//#
+//# /* collect comandline */
+//# for ( i = 1; i < argc; i++ )
+//# cmdln.push_back( argv[i] );
+//#
+//# return createFlags(cmdln);
+//# }
+
+CmdLineBits createFlags( GetOpt & _aOptions )
+{
+ CmdLineBits retflags = rtl_tres_Flag_OK;
+
+ if (_aOptions.hasOpt("-boom")) // stop near error position, exception only
+ {
+ retflags |= rtl_tres_Flag_BOOM;
+ }
+
+ if (_aOptions.hasOpt("-verbose"))
+ {
+ retflags |= rtl_tres_Flag_VERBOSE;
+ }
+
+ if (_aOptions.hasOpt("-quiet"))
+ {
+ retflags |= rtl_tres_Flag_QUIET;
+ }
+ return retflags;
+}
+// -----------------------------------------------------------------------------
+
+/**
+ * display usage screen
+ */
+
+//# void usage()
+//# {
+//# fprintf( stdout,
+//# "USAGE: testshl shlname [-boom][-verbose][-log][-his][-msg]\n" );
+//# exit(0);
+//# }
+
+
+} // namespace FileHelper
+
+
diff --git a/testshl2/source/getopt.cxx b/testshl2/source/getopt.cxx
new file mode 100644
index 000000000000..fdd4cb212deb
--- /dev/null
+++ b/testshl2/source/getopt.cxx
@@ -0,0 +1,922 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: getopt.cxx,v $
+ * $Revision: 1.10 $
+ *
+ * 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_testshl2.hxx"
+#include "testshl/getopt.hxx"
+
+#include "testshl/filehelper.hxx"
+
+using namespace std;
+//----------------------------------------------------------------------------
+// OptDsc
+//----------------------------------------------------------------------------
+//> createOptDsc
+void OptDsc::createOptDsc( const rtl::OString& opt ) {
+
+ // analyze type of option
+ // in case of flag indicate and set name and hint
+ if ( ( opt.indexOf("=") == -1 ) && ( opt.indexOf(":") == -1 ) ) {
+ m_type = OT_BOOL;
+
+ // extract options dokumentation if any
+ sal_Int32 index = opt.indexOf(",");
+ if ( index == -1 ) {
+ m_name = opt;
+ }
+ else {
+ m_name = opt.copy( 0, index );
+ m_hint = ( opt.copy( index + 1 ) ).trim();
+ }
+ return;
+ }
+
+ vector < rtl::OString > optLine;
+
+ // ':' indicates that option has optional parameter(s)
+ if ( opt.indexOf(":") != -1 ) {
+ m_type |= OT_OPTIONAL;
+ // create optionline tokenvector
+ split( opt, ":,", optLine );
+ }
+ else {
+ // create optionline tokenvector
+ split( opt, "=,", optLine );
+ }
+
+ // extract name of option
+ m_name = optLine[0];
+
+ // parameter(s) of string type
+ if ( optLine[1].indexOf("s") != -1 ) {
+ m_type |= OT_STRING;
+ m_legend += "arg";
+ }
+ // parameter(s) of numeric type
+ if ( optLine[1].indexOf("n") != -1 ) {
+ m_type |= OT_NUMBER;
+ m_legend += "arg";
+ }
+ // multiple parameters allowed
+ if ( optLine[1].indexOf("@") != -1 ) {
+ m_type |= OT_MULTI;
+ m_legend += "#1,[arg#n]";
+ }
+ else {
+ m_type |= OT_SINGLE;
+ }
+
+ // extract options dokumentation if any
+ m_hint = optLine[optLine.size()-1].trim();
+
+} ///< createOptDsc
+
+//> split
+void OptDsc::split( const rtl::OString& opt, const rtl::OString& cSet,
+ vector< rtl::OString >& optLine ) {
+
+ const sal_Int32 cSetLen = cSet.getLength();
+ const sal_Char* pcSet = cSet.getStr();
+ sal_Int32 index = 0;
+ sal_Int32 oldIndex = 0;
+
+ sal_Int32 i;
+ for ( i = 0; i < cSetLen; i++ ) {
+ index = opt.indexOf( pcSet[i] );
+ if( index != -1 ) {
+ optLine.push_back( opt.copy( oldIndex, index - oldIndex ) );
+ oldIndex = index + 1;
+ }
+ }
+ optLine.push_back( opt.copy( oldIndex ) );
+} ///< split
+
+//----------------------------------------------------------------------------
+// GetOpt
+//----------------------------------------------------------------------------
+//> ~GetOpt
+GetOpt::~GetOpt() {
+ vector< OptDsc* >::iterator iter = m_optionset.begin();
+ while ( iter != m_optionset.end() ) {
+ delete (*iter);
+ (*iter) = 0;
+ iter++;
+ }
+ m_optionset.clear();
+} ///< ~GetOpt
+
+/**
+ * private
+ * initialization of GetOpt class means to fill the vector members
+ * representing the commandline and optionset
+ * @param char* cmdLine[] = comandline
+ * @param char* optSet[] = optionset
+ *
+ * @return void
+ */
+//> initialize
+void GetOpt::initialize( char* cmdLine[], char const * optSet[] ) {
+
+ while ( *cmdLine ) {
+ m_cmdline.push_back( rtl::OString( *cmdLine ) );
+ *cmdLine++;
+ }
+ // insert an empty OString, to mark the end.
+ m_cmdline.push_back(rtl::OString());
+
+ while ( *optSet && ( rtl::OString( optSet[0] ).indexOf("-") == 0 ) ) {
+ m_optionset.push_back( new OptDsc( *optSet ) );
+ *optSet++;
+ }
+
+} ///< initialize
+
+/**
+ * public
+ * returns a pointer to an object of type optiondescription (OptDsc)
+ *
+ * @param rtl::OString& opt = name of option
+ *
+ * @return OptDsc* = pointer to requested optiondescription
+ * or NULL if not found
+ */
+//> getOptDsc
+OptDsc* GetOpt::getOptDsc( rtl::OString& opt ) {
+
+ vector< OptDsc* >::iterator iter = m_optionset.begin();
+ while ( iter != m_optionset.end() ) {
+ if ( (*iter)->getName() == opt ) {
+ return (*iter);
+ }
+ iter++;
+ }
+ return NULL;
+
+} ///< getOptDsc
+
+/**
+ * public
+ * check if option is already present in optionhash
+ * @param const rtl::OString& opt = name of option
+ * @return sal_Bool
+ */
+//> hasOpt
+sal_Bool GetOpt::hasOpt( const rtl::OString& opt ) const {
+
+ if ( m_opthash.find( opt ) != m_opthash.end() ) {
+ return sal_True ;
+ }
+ return sal_False ;
+
+} ///< hasOpt
+
+/**
+ * private
+ * handles the initialized comandline vector
+ * and fill the optionhash with evaluated options
+ * @param none
+ * @return void
+ */
+//> createCmdLineOptions
+void GetOpt::createCmdLineOptions() {
+
+ // get iterator of comandline vector
+ vector< rtl::OString >::iterator iter = m_cmdline.begin();
+
+ // extract first comandlineparameter as program name
+ m_prgname = (*iter);
+ iter++;
+
+ // process the whole vector
+ while ( iter != m_cmdline.end() ) {
+ // extract following comandline parameter(s) as program parameter(s)
+ // int nIdxOfMinus = (*iter).indexOf("-");
+ if ( (*iter).indexOf("-") != 0 ) /* start without '-' */
+ {
+ if ((*iter).getLength() > 0 ) /* is not empty */
+ {
+ m_param.push_back(*iter);
+ }
+ iter++;
+ continue;
+ }
+ // option occured
+ if ( (*iter).indexOf("-") == 0 )
+ {
+ // ignore invalid options
+ if ( ! evaluateOpt( iter ) )
+ {
+ iter++;
+ // check if wrong option has got a parameter
+ // and skip that, too
+ if( (iter + 1) != m_cmdline.end() )
+ {
+ if ( (*(iter + 1)).indexOf("-") != 0 )
+ {
+ iter++;
+ }
+ }
+ continue;
+ }
+ rtl::OString opt( (*iter) );
+ vector< rtl::OString > optValues;
+
+ // option is no flag
+ if ( ! getOptDsc( opt )->isFlag() ) {
+ // but has optional parameters
+ if ( getOptDsc( opt )->isOptional() ) {
+ // no parameters present
+ if ( ! hasParam( iter ) ) {
+ m_opthash[ opt ] = optValues;
+ optValues.clear();
+ iter++;
+ continue;
+ }
+ }
+ iter++;
+ // more than one option parameters occured
+ if ( (*iter).indexOf( "," ) != -1 ) {
+ tokenize( (*iter), "," , optValues );
+ }
+ else {
+ optValues.push_back( (*iter) );
+ }
+ }
+ // create key/value pair in optionhash and clear value vector
+ m_opthash[ opt ] = optValues;
+ optValues.clear();
+ }
+ iter++;
+ }
+} ///< createCmdLineOptions
+
+/**
+ * public
+ * check if option has parameter(s)
+ * @param vector< rtl::OString >::iterator iter = iterator of
+ * comandline vector
+ *
+ * @return sal_Bool
+ */
+//> hasParam
+sal_Bool GetOpt::hasParam( vector< rtl::OString >::iterator iter ) {
+ if ( iter+1 == m_cmdline.end() ) {
+ return sal_False;
+ }
+ if ( (*(iter+1)).indexOf("-") == 0 ) {
+ return sal_False;
+ }
+ if ( (*(iter+1)) == "" ) {
+ return sal_False;
+ }
+
+ return sal_True;
+} ///< hasParam
+
+/**
+ * public
+ * option evaluation in general means to verify if the option occur is
+ * a member of optionset say an admitted option, if so does it appear with
+ * the right or tolerable usage
+ *
+ * @param vector< rtl::OString >::iterator iter = iterator of
+ * comandline vector
+ *
+ * @return sal_Bool
+ */
+//> evaluateOpt
+sal_Bool GetOpt::evaluateOpt( vector< rtl::OString >::iterator iter ) {
+
+ // option is no member of optionset
+ if ( ! exist( (*iter) ) ) {
+ cout << "Unknown option " << (*iter).getStr()
+ << " occurred !" << endl;
+ return sal_False;
+ }
+
+ // option is a flag
+ if ( getOptDsc( (*iter) )->isFlag() ) {
+ return sal_True;
+ }
+
+ // parameter not optional
+ if ( ! getOptDsc( (*iter) )->isOptional() ) {
+
+ // verify that next vectoritem is present and no option
+ if ( ( *( iter + 1 ) ).getLength() &&
+ ( ( *( iter + 1 ) ).indexOf( "-" ) != 0 ) ) {
+
+ // if we are waiting for one single parameter
+ if ( getOptDsc( *iter )->isSingle() ) {
+ // but find multiple parameters
+ if( ( *( iter + 1 ) ).indexOf(",") != -1 ) {
+ cout << "Wrong use of option " << (*iter).getStr()
+ << " too many parameters !" << endl;
+ return sal_False;
+ }
+ return sal_True;
+ }
+ return sal_True;
+ }
+
+ cout << "Wrong use of option " << (*iter).getStr()
+ << " parameter missing !" << endl;
+ return sal_False;
+ }
+ // parameter optional
+ if ( getOptDsc( *iter )->isSingle() ) {
+
+ if ( hasParam( iter ) ) {
+ if( ( *( iter + 1 ) ).indexOf(",") != -1 ) {
+ cout << "Wrong use of option " << (*iter).getStr()
+ << " too many parameters !" << endl;
+ return sal_False;
+ }
+ }
+ }
+ return sal_True;
+
+} ///< evaluateOpt
+
+
+//> createOpt
+void GetOpt::createOpt( rtl::OString& optDscStr ) {
+ m_optionset.push_back( new OptDsc( optDscStr ) );
+} ///< createOpt
+
+/**
+ * public
+ * conditional addition of an option to optionhash
+ * overriding options, already present in optionhash, is not permitted
+ *
+ * @param rtl::OString& optStr = optionstring which is to break in a
+ * key/value pair and to add to optionhash
+ *
+ * @return void
+ */
+//> addOpt
+void GetOpt::addOpt( rtl::OString& optStr, sal_Bool eval ) {
+
+ vector< rtl::OString > optTok;
+ tokenize( optStr, "=", optTok );
+
+ // prevent override of commandline options
+ // by options from ini file
+ if( hasOpt( optTok[0] ) ) {
+ return;
+ }
+
+ // evaluate rigth usage of option
+ if( eval ) {
+ if ( ! evaluateOpt( optTok.begin() ) ) {
+ return;
+ }
+ }
+ vector< rtl::OString > optValues;
+
+ if ( optTok.size() > 1 ) {
+ rtl::OString oValStr( optTok[1] );
+ // found a variable
+ if ( oValStr.indexOf(",") == -1 ) {
+ optValues.push_back( oValStr );
+ }
+ else {
+ tokenize( oValStr, ",", optValues );
+ }
+ }
+ m_opthash[ optTok[0] ] = optValues;
+ optValues.clear();
+ return;
+} ///< addOpt
+
+/**
+ * public
+ * verify the existance of an option in optionset
+ * @param rtl::OString& opt = option name
+ * @return sal_Bool
+ */
+//> exist
+sal_Bool GetOpt::exist( rtl::OString& opt ) {
+ if ( getOptDsc( opt ) ) {
+ return sal_True;
+ }
+ return sal_False;
+} ///< exist
+
+/**
+ * public
+ * verify the existance of variables inside options
+ * @param none
+ * @return sal_Bool
+ */
+//> hasVars
+sal_Bool GetOpt::hasVars() {
+ if ( m_varvec.size() ) {
+ return sal_True;
+ }
+ return sal_False;
+} ///< hasVars
+
+
+/**
+ * public
+ * proceeds a buffer representing the content of an ini file and adds the
+ * options to optionhash. The optionstrings in the file are allowed to contain
+ * variables indicated by delimiters described with varDelim
+ *
+ * @param rtl::OString iOpts = raw filecontent
+ * @param const rtl::OString& varDelim = delimiter indicating a variable
+ *
+ * @return void
+ */
+//> str2Opt
+void GetOpt::str2Opt( rtl::OString iOpts ) {
+
+ // tokenize filecontent by '\n' to create a vector of lines
+ vector< rtl::OString > iniLines;
+ tokenize( iOpts, "\n", iniLines );
+
+ sal_uInt32 tCnt = iniLines.size();
+
+ // process all lines
+ sal_uInt32 i;
+ for ( i = 1; i < tCnt; i++ ) {
+ rtl::OString optLine( iniLines[i] );
+ // ignore comments
+ if ( ! ( optLine.indexOf("#") == 0 ) ) {
+ // filter valid options after trim
+ if ( ( optLine.indexOf("-") == 0 ) ) {
+ // line contains a variable
+ if ( ( optLine.indexOf( m_vardelim ) != -1 ) ) {
+ // push to var vector for later process
+ m_varvec.push_back( optLine );
+ continue;
+ }
+ addOpt( optLine );
+ }
+ }
+ }
+} ///< str2opt
+
+void GetOpt::replVars() {
+
+ // process vector of lines containing variables
+ vector< rtl::OString >::iterator iter = m_varvec.begin();
+ while ( iter != m_varvec.end() ) {
+ sal_Int32 index = 0;
+ while ( ( index = (*iter).indexOf( m_vardelim ) ) != -1 ) {
+ vector< rtl::OString > varLineTok;
+ rtl::OString varKey( "-" );
+ tokenize( *iter, m_vardelim, varLineTok );
+ varKey += varLineTok[1];
+ vector< rtl::OString > keyValues = getOptVec( varKey );
+
+ if ( keyValues.size() > 1 ) {
+ rtl::OString rplStr;
+
+ vector< rtl::OString >::iterator kvi = keyValues.begin();
+ while ( kvi != keyValues.end() ) {
+ rplStr += (*kvi);
+ kvi++;
+ if ( kvi != keyValues.end() ) {
+ rplStr += ",";
+ }
+ }
+ (*iter ) = (*iter).replaceAt(
+ index, varKey.getLength()+1, rplStr );
+ }
+ else {
+ if( *(keyValues[0])) {
+ (*iter) = (*iter).replaceAt(
+ index, varKey.getLength()+1, keyValues[0] );
+ }
+ }
+ }
+ addOpt( (*iter) );
+ iter++;
+ }
+
+}
+
+/**
+ * public
+ * displays a formatted usagescreen
+ * @param none
+ * @return void
+ */
+//> showUsage
+void GetOpt::showUsage() {
+
+ sFormat frm;
+ frm.fCol = getMaxNameLength() + 2;
+ frm.sCol = frm.fCol + getMaxLegendLength() + 2 ;
+ frm.len = 79;
+
+ vector< rtl::OString > nameVec;
+ vector< rtl::OString > paramVec;
+
+ tokenize( getName(), "/\\", nameVec );
+ if ( m_param.empty() ) {
+ if ( hasOpt( "-db" ) ) {
+ tokenize( getOpt( "-db" ), "/\\", paramVec );
+ }
+ else {
+ paramVec.push_back( rtl::OString( "not available" ) );
+ }
+ }
+ else {
+ tokenize( getFirstParam(), "/\\", paramVec );
+ }
+
+ cout << "\n\n\n\n\nUsage: prgname param [options]\n\nPRGNAME = [path]";
+
+ if ( !nameVec.empty() ) {
+ cout << (*(nameVec.end()-1)).getStr();
+ }
+ cout << "\nPARAM = [path]";
+ if ( !paramVec.empty() ) {
+ cout << (*(paramVec.end()-1)).getStr() << endl;
+ }
+
+ cout << "\nOPTIONS = [" << flush;
+
+ vector< OptDsc* >::iterator iter = m_optionset.begin();
+
+ while ( iter != m_optionset.end() ) {
+ cout << (*iter)->getName().getStr() << "," << flush;
+ iter++;
+ }
+ cout << "]\n\nOPTIONS:\n" << flush;
+
+ iter = m_optionset.begin();
+
+ while ( iter != m_optionset.end() ) {
+ cout << optDsc2Str( *iter, frm ).getStr() << endl << flush;
+
+ iter++;
+ }
+
+} ///< showUsage
+
+/**
+ * public
+ * displays the actual option/parameter status
+ * @param none
+ * @return void
+ */
+//> printStatus
+void GetOpt::printStatus( void ) {
+
+ sal_uInt32 maxlen = getMaxNameLength();
+ optHashMap::iterator iter = m_opthash.begin();
+ cout << endl;
+
+ while ( iter != m_opthash.end() ) {
+ rtl::OString option( (*iter).first );
+
+ cout.setf(ios::left);
+ cout.width( maxlen+1 );
+ cout << option.getStr() << "= ";
+
+ if ( ! getOptDsc( option )->isFlag() ) {
+ if ( ! getOptVec( option ).empty() ) {
+ sal_uInt32 j;
+ for ( j = 0; j < (*iter).second.size(); j++ ) {
+ cout << (( (*iter).second )[j]).getStr() << " ";
+ }
+ cout << endl;
+ }
+ else {
+ cout << "FALSE\n";
+ }
+ }
+ else {
+ cout << "TRUE\n";
+ }
+ iter++;
+ }
+}
+
+/**
+ * private
+ * converts an object of type optiondescription (OptDsc) to a formatted
+ * displayable string for usagescreen needs
+ * @param OptDsc* optDsc = pointer to option description
+ * @param sFormat frm = format structur
+ *
+ * @return const rtl::OString = formatted string for display purposes
+ */
+//> optDsc2Str >>> to be replaced by intelliget algorythm <<<
+const rtl::OString GetOpt::optDsc2Str( OptDsc* optDsc , sFormat frm ) {
+
+ sal_Char* buf = new sal_Char[ frm.len + 1 ];
+ sal_Char* pBuf = buf;
+
+ sal_uInt32 i;
+ for ( i = 0; i < frm.len; i++ ) {
+ *pBuf++ = ' ';
+ }
+ *pBuf = '\0';
+
+ rtl::OStringBuffer strBuf( buf );
+ rtl::OString oStr = strBuf.makeStringAndClear();
+
+ oStr = oStr.replaceAt( 0, optDsc->getName().getLength(),
+ optDsc->getName() );
+ if ( optDsc->isOptional() ) {
+ oStr = oStr.replaceAt( frm.fCol-1, 1, "[" );
+ }
+ oStr = oStr.replaceAt( frm.fCol, optDsc->getLegend().getLength(),
+ optDsc->getLegend() );
+ if ( optDsc->isOptional() ) {
+ oStr = oStr.replaceAt( frm.fCol + optDsc->getLegend().getLength() ,
+ 1, "]" );
+ }
+ if ( ( frm.sCol + optDsc->getHint().getLength() ) >= frm.len ) {
+
+ oStr = oStr.replaceAt( frm.sCol, frm.len - frm.sCol,
+ optDsc->getHint() );
+ }
+ else {
+ oStr = oStr.replaceAt( frm.sCol,
+ optDsc->getHint().getLength(), optDsc->getHint() );
+ }
+
+ delete [] buf;
+
+ return oStr;
+
+} ///< optDsc2Str
+
+/**
+ * private
+ * returns the maximum length of all optionnames for format purposes
+ * @param none
+ * @return sal_uInt32 length of longest optionname
+ */
+//> getMaxNameLength
+sal_uInt32 GetOpt::getMaxNameLength() {
+
+ sal_Int32 len = 0;
+ vector< OptDsc* >::iterator iter = m_optionset.begin();
+
+ while ( iter != m_optionset.end() ) {
+ if( len < (*iter)->getName().getLength() ){
+ len = (*iter)->getName().getLength();
+ }
+ iter++;
+ }
+ return len;
+} ///< getMaxNameLength
+
+/**
+ * private
+ * returns the maximum length of all option legends for format purposes
+ * @param none
+ * @return sal_uInt32 length of longest optionlegend
+ */
+//> getMaxLegendLength
+sal_uInt32 GetOpt::getMaxLegendLength() {
+
+ sal_Int32 len = 0;
+ vector< OptDsc* >::iterator iter = m_optionset.begin();
+
+ while ( iter != m_optionset.end() ) {
+ if( len < (*iter)->getLegend().getLength() ){
+ len = (*iter)->getLegend().getLength();
+ }
+ iter++;
+ }
+ return len;
+
+} ///< getMaxLegendLength
+
+/**
+ * public
+ * reads the filecontent and pass it to str2opt to add valid options
+ * to optionhash
+ * @param rtl::OString iniPth = full qualified filename
+ * @return ::osl::FileBase::RC = to indicate errors
+ */
+//> getIniOptions
+::osl::FileBase::RC GetOpt::getIniOptions( rtl::OString iniPth ) {
+
+ ::osl::FileStatus fState( FileStatusMask_All );
+ ::osl::DirectoryItem dItem;
+ rtl::OUString nrmPath( FileHelper::convertPath( iniPth ) );
+
+ ::osl::DirectoryItem::get( nrmPath, dItem );
+ dItem.getFileStatus( fState );
+ rtl::OUString fName( fState.getFileURL() );
+ ::osl::File iniFile( fName );
+
+ const sal_uInt32 filesize = (sal_uInt32)fState.getFileSize();
+
+ ::osl::FileBase::RC ret;
+ sal_uInt64 bytesread;
+
+ if ( ( ret = iniFile.open( OpenFlag_Read ) ) != ::osl::FileBase::E_None ) {
+ return ret;
+ }
+ char* buf = new char[ filesize + 1 ];
+ ret = iniFile.read( buf, filesize, bytesread );
+ buf[ filesize ] = '\0';
+
+ str2Opt( buf );
+ delete [] buf;
+ return ret;
+
+} ///< getIniOptions
+
+/**
+ * private
+ * tokenize a string in dependance of a character set and stores the tokens
+ * to a token vector
+ * @param const rtl::OString& opt = optionstring to tokenize
+ * @param const rtl::OString& cSet = characterset of delimiters
+ * @param vector< rtl::OString >& optLine = vector of tokens
+ * @param sal_Bool strip = indicates if CR,LF and TAB should be stripped off
+ * the token
+ * @return void
+ */
+//> tokenize
+void GetOpt::tokenize( const rtl::OString& opt, const rtl::OString& cSet,
+ vector< rtl::OString >& optLine, sal_Bool strip ) {
+
+ const sal_Char* pText; // pointer f. text,
+ const sal_Char* pcSet; // charset and
+ vector< const sal_Char* > delimVec; // vector of delimiters
+
+ // parametercheck for opt ...
+ if( ! opt.getLength() ) {
+ return;
+ }
+ // ... and charSet
+ if( ! cSet.getLength() ) {
+ return;
+ }
+ // pointer to begin of textinstance
+ pText = opt.getStr();
+
+ // text
+ while( *pText ) {
+ // charset-pointer to begin of charset
+ pcSet = cSet.getStr();
+ // charset
+ while( *pcSet ) {
+ // delimiter found
+ if( ( ( *pText == *pcSet ) ) && ( pText != opt ) ) {
+ delimVec.push_back( pText );
+ // increment counter
+ }
+ pcSet++;
+ }
+ // increment pointer
+ pText++;
+ }
+
+ // save endpointer
+ delimVec.push_back( opt + opt.getLength() );
+
+ sal_Char* pToken; // ptr to token chars
+ const sal_Char* pBegin; // ptr to begin of current,
+ const sal_Char* pEnd=opt; // and begin of prev. token
+ sal_uInt32 i=0;
+
+ while ( pEnd < delimVec[delimVec.size()-1] ) {
+
+ pBegin = pEnd;
+ if( pBegin > opt.getStr() ) {
+ pBegin += 1;
+ }
+ pEnd = delimVec[i];
+ // initialize size
+ sal_uInt32 nSize = pEnd - pBegin;
+ // allocate memory
+
+ // allocate memory for token
+ sal_Char* cToken = new sal_Char[ nSize + 1 ];
+
+ // get address of allocated memory
+ pToken = cToken;
+
+ // copy token from text
+ sal_uInt32 j;
+ for ( j = 0; j < nSize ; ++j ) {
+ *pToken++ = *pBegin++;
+ }
+ // append string end
+ *pToken = '\0';
+
+ rtl::OString oTok(cToken);
+
+ if( strip ) {
+ // strip off CR,LF and TAB
+ oTok = oTok.replace( 0x0a, 0x20 );
+ oTok = oTok.replace( 0x0d, 0x20 );
+ oTok = oTok.replace( 0x09, 0x20 );
+ oTok = oTok.trim();
+ }
+ if( oTok != "" ) {
+ // push to vector
+ optLine.push_back( oTok );
+ }
+
+ // free memory where cToken points to
+ delete [] cToken;
+ i++;
+ }
+ return ;
+} ///< tokenize
+
+// -----------------------------------------------------------------------------
+rtl::OString& GetOpt::getOpt( const rtl::OString& opt )
+{
+ if (m_opthash.find( opt ) != m_opthash.end())
+ {
+ if (!m_opthash[opt].empty())
+ {
+ return *( m_opthash[opt].begin() );
+ }
+ rtl::OString aStr;
+ aStr = "GetOpt( ";
+ aStr += opt;
+ aStr += " ): Value not found.";
+ throw ValueNotFoundException(aStr.getStr());
+ }
+ else
+ throw ValueNotFoundException(opt);
+}
+
+
+// -----------------------------------------------------------------------------
+
+Exception::Exception()
+ : m_sAsciiMessage()
+{
+}
+//---------------------------------------------------------------------
+Exception::Exception(char const* sAsciiMessage)
+ : m_sAsciiMessage(sAsciiMessage)
+{
+}
+//---------------------------------------------------------------------
+Exception::Exception(rtl::OString const& sAsciiMessage)
+ : m_sAsciiMessage(sAsciiMessage)
+{
+}
+//---------------------------------------------------------------------
+
+rtl::OUString Exception::message() const
+{
+ return rtl::OStringToOUString( m_sAsciiMessage, RTL_TEXTENCODING_ASCII_US );
+}
+//---------------------------------------------------------------------
+char const* Exception::what() const
+{
+ return m_sAsciiMessage.getLength() ? m_sAsciiMessage.getStr() : "FAILURE in REGSCAN: No description available";
+}
+
+// -----------------------------------------------------------------------------
+static const char c_sValueNotFoundException[] = "GetOpt: Value not Found Exception: ";
+//---------------------------------------------------------------------
+ValueNotFoundException::ValueNotFoundException()
+ : Exception( rtl::OString(RTL_CONSTASCII_STRINGPARAM(c_sValueNotFoundException)) )
+{
+}
+//---------------------------------------------------------------------
+
+ValueNotFoundException::ValueNotFoundException(char const* sException)
+ : Exception( rtl::OString(RTL_CONSTASCII_STRINGPARAM(c_sValueNotFoundException)) + sException)
+{
+}
+
+
+
diff --git a/testshl2/source/makefile.mk b/testshl2/source/makefile.mk
new file mode 100644
index 000000000000..f411f7d7948f
--- /dev/null
+++ b/testshl2/source/makefile.mk
@@ -0,0 +1,135 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.9.2.1 $
+#
+# 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=testshl2
+TARGET=testshl2
+TARGETTYPE=CUI
+PRJINC=.
+
+ENABLE_EXCEPTIONS=TRUE
+#USE_LDUMP2=TRUE
+#LDUMP2=LDUMP3
+
+# --- Settings -----------------------------------------------------
+.INCLUDE : settings.mk
+
+# ------------------------------------------------------------------
+
+COMMON_OBJFILES=\
+ $(OBJ)$/getopt.obj \
+ $(OBJ)$/filehelper.obj \
+ $(OBJ)$/dynamicregister.obj
+
+TESTSHL_OBJFILES=\
+ $(OBJ)$/autoregisterhelper.obj \
+ $(OBJ)$/testshl.obj
+
+VERSIONINFO_OBJFILES=\
+ $(OBJ)$/versionhelper.obj \
+ $(OBJ)$/versioner.obj
+
+BMSMA_OBJFILES=\
+ $(OBJ)$/bmsma.obj
+
+# for right dependencies
+# OBJFILES= $(COMMON_OBJFILES) $(TESTSHL_OBJFILES) $(VERSIONINFO_OBJFILES)
+
+# ------------------------------------------------------------------
+APP1TARGET= $(TARGET)
+APP1OBJS= $(COMMON_OBJFILES) $(TESTSHL_OBJFILES)
+APP1RPATH=NONE
+
+APP1STDLIBS=$(SALLIB)
+
+# the c5t*.lib files are out of the cppunit module
+# APP1DEPN= \
+# $(SOLARLIBDIR)$/c5t_no_regallfkt.lib \
+# $(SOLARLIBDIR)$/c5t_testresult.lib
+
+.IF "$(GUI)" == "WNT"
+.IF "$(COM)" == "GCC"
+APP1STDLIBS+= \
+ $(SOLARLIBDIR)$/libc5t_testresult$(DLLPOSTFIX).a \
+ $(SOLARLIBDIR)$/libc5t_no_regallfkt$(DLLPOSTFIX).a \
+ $(SOLARLIBDIR)$/libc5t_winstuff$(DLLPOSTFIX).a
+.ELSE
+APP1LIBS= \
+ $(SOLARLIBDIR)$/c5t_no_regallfkt.lib \
+ $(SOLARLIBDIR)$/c5t_testresult.lib
+APP1LIBS += $(SOLARLIBDIR)$/c5t_winstuff.lib
+.ENDIF
+.ENDIF
+
+.IF "$(GUI)" == "OS2"
+APP1LIBS= \
+ $(SOLARLIBDIR)$/c5t_no_regallfkt.lib \
+ $(SOLARLIBDIR)$/c5t_testresult.lib
+.ENDIF
+
+.IF "$(GUI)" == "UNX"
+APP1STDLIBS+= \
+ $(SOLARLIBDIR)$/libc5t_testresult$(DLLPOSTFIX).a \
+ $(SOLARLIBDIR)$/libc5t_no_regallfkt$(DLLPOSTFIX).a
+.ENDIF
+
+#
+# ------------------------------------------------------------------
+APP2TARGET= versioninfo
+APP2OBJS= $(COMMON_OBJFILES) $(VERSIONINFO_OBJFILES)
+
+APP2STDLIBS=$(SALLIB)
+
+APP2DEPN=
+APP2LIBS=
+
+# ------------------------------------------------------------------
+APP3TARGET= $(TARGET)_timeout
+APP3OBJS= $(OBJ)$/getopt.obj $(OBJ)$/filehelper.obj $(OBJ)$/terminate.obj
+
+APP3STDLIBS=$(SALLIB)
+
+APP3DEPN=
+APP3LIBS=
+
+.IF "$(GUI)" == "WNT"
+.IF "$(COM)" == "GCC"
+APP3STDLIBS+= \
+ $(SOLARLIBDIR)$/libc5t_winstuff$(DLLPOSTFIX).a
+.ELSE
+APP3LIBS += $(SOLARLIBDIR)$/c5t_winstuff.lib
+.ENDIF
+.ENDIF
+
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/testshl2/source/terminate.cxx b/testshl2/source/terminate.cxx
new file mode 100644
index 000000000000..3db99d55d43a
--- /dev/null
+++ b/testshl2/source/terminate.cxx
@@ -0,0 +1,286 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: terminate.cxx,v $
+ * $Revision: 1.9 $
+ *
+ * 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_testshl2.hxx"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#ifdef SOLARIS
+#include <sys/time.h>
+#include <sys/types.h>
+#endif
+
+#include <signal.h>
+
+#include <iostream>
+#include <string>
+
+#include "testshl/getopt.hxx"
+
+#if (defined UNX) || (defined OS2)
+#include <unistd.h> /* usleep */
+#include <sys/types.h>
+#include <signal.h>
+#endif
+
+#ifdef WNT
+# include "testshl/winstuff.hxx"
+#endif
+
+using namespace std;
+
+// -----------------------------------------------------------------------------
+class ProcessHandler
+{
+ std::string m_sProcessIDFilename;
+ int m_nPID;
+
+ int getPID();
+ int readPIDFromFile();
+ void sendSignal(int _nPID);
+ void write(int);
+public:
+ ProcessHandler();
+ void setName(std::string const& _sFilename);
+
+ ~ProcessHandler();
+
+ void waitForPIDFile(int);
+ void waitForTimeout(int);
+};
+
+void my_sleep(int sec)
+{
+#ifdef WNT
+ WinSleep(sec * 1000);
+#else
+ usleep(sec * 1000000); // 10 ms
+#endif
+}
+
+// ------------------------------- ProcessHelper -------------------------------
+ProcessHandler::ProcessHandler():m_nPID(0) {}
+
+void ProcessHandler::setName(std::string const& _sPIDFilename)
+{
+ m_sProcessIDFilename = _sPIDFilename;
+}
+
+int ProcessHandler::getPID()
+{
+ return m_nPID;
+}
+
+int ProcessHandler::readPIDFromFile()
+{
+ // get own PID
+ int nPID = 0;
+ if (m_sProcessIDFilename.size() > 0)
+ {
+ FILE* in;
+ in = fopen(m_sProcessIDFilename.c_str(), "r");
+ if (!in)
+ {
+ // fprintf(stderr, "warning: (testshl.cxx) can't read own pid.\n");
+ return 0;
+ // exit(0);
+ }
+ // if file exist, wait short, maybe the other tool writes it down.
+ fscanf(in, "%d", &nPID);
+ fclose(in);
+ }
+ else
+ {
+ fprintf(stderr, "error: (terminate.cxx) PID Filename empty, must set.\n");
+ exit(0);
+ }
+ return nPID;
+}
+
+ProcessHandler::~ProcessHandler()
+{
+}
+
+void ProcessHandler::sendSignal(int _nPID)
+{
+ if (_nPID != 0)
+ {
+#ifdef WNT
+ WinTerminateApp(_nPID, 100);
+#else
+ kill(_nPID, SIGKILL);
+#endif
+ }
+}
+
+// -----------------------------------------------------------------------------
+void ProcessHandler::waitForPIDFile(int _nTimeout)
+{
+ int nWaitforTimeout = _nTimeout;
+ while (getPID() == 0 && nWaitforTimeout > 0)
+ {
+ int nPID = readPIDFromFile();
+ if (nPID != 0)
+ {
+ m_nPID = nPID;
+ break;
+ }
+
+ my_sleep(1);
+ fprintf(stderr, "wait for pid file\n");
+ nWaitforTimeout--;
+ }
+
+ if (nWaitforTimeout <= 0)
+ {
+ fprintf(stderr, "No PID found, time runs out\n");
+ exit(1);
+ }
+}
+// -----------------------------------------------------------------------------
+void ProcessHandler::waitForTimeout(int _nTimeout)
+{
+ int nTimeout = _nTimeout;
+ while (nTimeout > 0)
+ {
+ my_sleep(1);
+ fprintf(stderr, "%d \r", nTimeout);
+
+ int nNewPID = readPIDFromFile();
+ if ( nNewPID != getPID() )
+ {
+ fprintf(stderr, "PID has changed.\n");
+ if ( nNewPID != 0)
+ {
+ fprintf(stderr, "new PID is not 0, maybe forgotten to delete old PID file, restart timeout.\n");
+ m_nPID = nNewPID;
+ nTimeout = _nTimeout;
+ }
+ else
+ {
+ break;
+ }
+ }
+ nTimeout --;
+ }
+ if (nTimeout <= 0)
+ {
+ fprintf(stderr, "PID: %d\n", getPID());
+ sendSignal(getPID());
+ write(0);
+ }
+}
+
+void ProcessHandler::write(int _nPID)
+{
+ // get own PID
+
+ if (m_sProcessIDFilename.size() > 0)
+ {
+ FILE* out;
+ out = fopen(m_sProcessIDFilename.c_str(), "w");
+ if (!out)
+ {
+ fprintf(stderr, "warning: (testshl.cxx) can't write own pid.\n");
+ return;
+ // exit(0);
+ }
+ fprintf(out, "%d", _nPID);
+ fclose(out);
+ }
+ else
+ {
+ fprintf(stderr, "warning: (testshl.cxx) PID Filename empty, must set.\n");
+ }
+}
+
+// ----------------------------------- Main -----------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int, char* argv[] )
+#else
+int _cdecl main( int, char* argv[] )
+#endif
+{
+ static char const * optionSet[] = {
+ "-version, shows current program version and exit.",
+ "-pid=s, write current process id to file",
+ "-time=s, timeout [default is 10 sec]",
+ "-h:s, display help or help on option",
+ "-help:s, see -h",
+ NULL
+ };
+
+ ProcessHandler aCurrentProcess;
+
+ GetOpt opt( argv, optionSet );
+ if ( opt.hasOpt("-pid") )
+ {
+ aCurrentProcess.setName(opt.getOpt("-pid").getStr());
+ }
+
+ int nTimeout = 10;
+ if ( opt.hasOpt("-time"))
+ {
+ //
+ nTimeout = opt.getOpt("-time").toInt32();
+ if (nTimeout == 0)
+ {
+ nTimeout = 10;
+ }
+ }
+
+ if ( opt.hasOpt("-version") )
+ {
+ fprintf(stderr, "testshl2_timeout $Revision: 1.9 $\n");
+ exit(0);
+ }
+
+ // someone indicates that he needs help
+ if ( opt.hasOpt( "-h" ) || opt.hasOpt( "-help" ) )
+ {
+ opt.showUsage();
+ exit(0);
+ }
+
+ // wait until pid file exist ==============================
+
+ aCurrentProcess.waitForPIDFile(10);
+
+ printf("Found PID file, wait for timeout %d sec.\n", nTimeout);
+
+ // timeout ==================================================
+ aCurrentProcess.waitForTimeout(nTimeout);
+
+ return 0;
+}
+
diff --git a/testshl2/source/testshl.cxx b/testshl2/source/testshl.cxx
new file mode 100644
index 000000000000..bf44b3c4572f
--- /dev/null
+++ b/testshl2/source/testshl.cxx
@@ -0,0 +1,399 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: testshl.cxx,v $
+ * $Revision: 1.25 $
+ *
+ * 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_testshl2.hxx"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#ifdef SOLARIS
+#include <sys/time.h>
+#endif
+
+#ifdef WNT
+# include "testshl/winstuff.hxx"
+#endif
+
+#include <iostream>
+#include <vector>
+#include <memory> /* auto_ptr */
+#include "sal/main.h"
+#include <rtl/string.hxx>
+
+// #include <rtl/tres.h>
+#include "testshl/autoregisterhelper.hxx"
+// #include "cmdlinebits.hxx"
+#include "testshl/log.hxx"
+#include "testshl/filehelper.hxx"
+#include "testshl/getopt.hxx"
+#include "cppunit/result/outputter.hxx"
+#include "cppunit/joblist.hxx"
+
+// #include <osl/time.h>
+
+using namespace std;
+
+#include "cppunit/result/testshlTestResult.h"
+#include "cppunit/result/emacsTestResult.hxx"
+
+// Prototype for signal handling
+void setSignalFilename(GetOpt & opt);
+void removeSignalFile(GetOpt & opt);
+CmdLineBits st_nBits;
+
+void initTPrint(GetOpt & _aOptions)
+{
+ st_nBits = FileHelper::createFlags(_aOptions);
+}
+
+void my_sleep(int nCount)
+{
+#ifdef WNT
+ WinSleep(nCount * 2);
+#else
+ usleep(nCount * 2000);
+#endif
+}
+
+// -----------------------------------------------------------------------------
+class ProcessHandler
+{
+ std::string m_sProcessIDFilename;
+ void write(int);
+ int getPID();
+public:
+ ProcessHandler();
+ void setName(std::string const& _sFilename);
+ ~ProcessHandler();
+};
+
+// ------------------------------- ProcessHelper -------------------------------
+ProcessHandler::ProcessHandler() {}
+
+void ProcessHandler::setName(std::string const& _sPIDFilename)
+{
+ m_sProcessIDFilename = _sPIDFilename;
+ write(getPID());
+}
+
+int ProcessHandler::getPID()
+{
+ int nPID = 0;
+#ifdef WNT
+ nPID = WinGetCurrentProcessId();
+#else
+ nPID = getpid();
+#endif
+
+ return nPID;
+}
+
+void ProcessHandler::write(int _nPID)
+{
+ // get own PID
+
+ if (m_sProcessIDFilename.size() > 0)
+ {
+ FILE* out;
+ out = fopen(m_sProcessIDFilename.c_str(), "w");
+ if (!out)
+ {
+ fprintf(stderr, "warning: (testshl.cxx) can't write own pid.\n");
+ return;
+ // exit(0);
+ }
+ fprintf(out, "%d", _nPID);
+ fclose(out);
+ my_sleep(2); // short wait, so testshl2_timeout can find this pid.
+ }
+ else
+ {
+ fprintf(stderr, "warning: (testshl.cxx) PID Filename empty, must set.\n");
+ }
+}
+
+ProcessHandler::~ProcessHandler()
+{
+ if (m_sProcessIDFilename.size() > 0)
+ {
+ write(0);
+ my_sleep(2);
+ fprintf(stderr, "hint: it is save to remove PID file.\n");
+ }
+}
+
+// -----------------------------------------------------------------------------
+std::auto_ptr<CppUnit::TestResult> initResult(GetOpt & _aOptions)
+{
+ std::auto_ptr<CppUnit::TestResult> pResult;
+ if (_aOptions.hasOpt("-mode"))
+ {
+ if (_aOptions.getOpt("-mode").equals("emacs") == sal_True)
+ {
+ pResult.reset(new CppUnit::emacsTestResult(_aOptions));
+ }
+ }
+ else
+ {
+ pResult.reset(new CppUnit::testshlTestResult(_aOptions));
+ }
+ return pResult;
+}
+
+// -----------------------------------------------------------------------------
+
+std::auto_ptr<Outputter> initOutputter(GetOpt & _aOptions)
+{
+ std::auto_ptr<Outputter> pOutputter;
+
+ if (_aOptions.hasOpt("-log"))
+ {
+ rtl::OString sLogFile = _aOptions.getOpt("-log");
+
+ Log* pLog = new Log( FileHelper::convertPath( sLogFile ) );
+ if ( pLog->open() != osl::FileBase::E_None )
+ {
+ // cerr << "could not open LogFile: " << pLog->getName().getStr() << endl;
+ fprintf(stderr, "could not open LogFile: %s\n", pLog->getName().getStr());
+ exit(1);
+ }
+ pOutputter.reset(new Outputter(pLog));
+ }
+ else
+ {
+ pOutputter.reset(new Outputter(std::cout));
+ }
+
+ return pOutputter;
+}
+
+int starttest(GetOpt & opt, AutomaticRegisterHelper const& aHelper);
+
+void makeslow()
+{
+ sal_Int32 n = 0;
+ for (sal_Int32 i=0;i<1024 * 1024;i++)
+ {
+ ++n;
+ }
+}
+// void endless()
+// {
+// sal_Int64 n = 0;
+// while(1)
+// {
+// n++;
+// makeslow();
+// my_sleep(1);
+// }
+// }
+
+// ----------------------------------- Main -----------------------------------
+
+SAL_IMPLEMENT_MAIN_WITH_ARGS(, argv)
+{
+ static char const * optionSet[] = {
+ "-boom, stop near error position, exception only",
+ "-mode=s, the output mode, emacs, xml, old. Default is -mode old",
+ "-log=s, destination file for logging",
+ "-noerrors, shows all tests, but not it's errors.",
+ "-onlyerrors, shows only the failed test functions",
+/* "-tc=s@, name(s) of testcase(s) to generate", */
+ "-sf=s, absolute path and name to the signal file.",
+//! new (helpful if at debug time)
+ "-dntsf, if given, do not touch signal file, also if one exist.",
+ "-dnrmsf, do not remove signalfile. ",
+ "-jobonly=s, job control file, these jobs should only executed.",
+ "-jobexclude=s, job control file, but contains only job, they not execute.",
+ "-jobfilter=s, use a filter for just some tests.",
+ "-onlyshowjobs, show only all jobs, do no tests.",
+ "-forward=s, this string will forwarded to the test libraries.",
+ "-projectid=s, this text is added to the date output line.",
+ "-buildid=s, this text is added to the date output line.",
+ "-waitforkey, wait until key pressed.",
+ "-verbose, be verbose.",
+ "-quiet, be quiet. No t_print(...) will create output.",
+ "-pid=s, write current process id to file",
+ "-endless, testshl runs endless, for test only!!!",
+ "-whereami, shows at runtime, which function is tested next.",
+ "-noerroronexit, if this is given the program exits with return code 0 even if runtime errors occurs.",
+ "-hardexit, Exit the tests without call any dtor.",
+ "-absolutepath, Use the given absolute path to local the test library.",
+ "-localpath, Make a chdir() to the test library path, then try to load the library without given path.",
+ "-h:s, display help or help on option",
+ "-help:s, see -h",
+ NULL
+ };
+
+ ProcessHandler aCurrentProcess;
+
+ GetOpt opt( argv, optionSet );
+ initTPrint(opt);
+
+ if ( opt.hasOpt("-pid") )
+ {
+ aCurrentProcess.setName(opt.getOpt("-pid").getStr());
+ }
+
+ if ( opt.hasOpt("-verbose") )
+ {
+ fprintf(stderr, "testshl2 $Revision: 1.25 $\n");
+ }
+
+ if ( opt.hasOpt("-endless")) // this exists only for self test issues
+ {
+// endless();
+
+// With parameter -endless a test is attachable by debuggers
+// Attach to testshl2.exe set a breakpoint in this while (1) loop
+
+// Then you have to set the process pointer (Set next Statement) to
+// the next line outside the while loop.
+// Now it is possible to debug the whole code.
+// Never source this code to a function, because you will
+// lost the variables like opt.
+
+ sal_Int64 n = 0;
+ while(1)
+ {
+ n++;
+ makeslow();
+ my_sleep(1);
+ }
+ }
+
+ int nExitCode = 0;
+ bool bLibrary = true;
+
+ // someone indicates that he needs help
+ if ( opt.hasOpt( "-h" ) || opt.hasOpt( "-help" ) )
+ {
+ opt.showUsage();
+ nExitCode = 0;
+ }
+ else
+ {
+ if (opt.getParams().empty())
+ {
+ // no library is given, but if a jobonly list is given, we should generate UNKNOWN errors.
+ if (! opt.hasOpt("-jobonly"))
+ {
+ // std::cerr << "error: At least a library or a job file should given." << std::endl;
+ fprintf(stderr, "error: At least a library or a job file should given.\n");
+ opt.showUsage();
+ nExitCode = 2;
+ }
+ else
+ {
+ bLibrary = false;
+ }
+ }
+ else
+ {
+ setSignalFilename(opt);
+
+ rtl::OUString suLibraryName;
+ if (bLibrary)
+ {
+ suLibraryName = rtl::OStringToOUString(opt.getFirstParam(), osl_getThreadTextEncoding() /* RTL_TEXTENCODING_ASCII_US */ );
+ }
+
+ AutomaticRegisterHelper aHelper(suLibraryName, opt /*, &aJobs*/);
+
+ if (aHelper.isOkToStartTests())
+ {
+ // start the tests
+ nExitCode = starttest(opt, aHelper);
+ }
+ else
+ {
+
+ fprintf(stderr, "error: The library '%s' can't initialised, must quit.\n", opt.getFirstParam().getStr());
+ nExitCode = 1;
+ }
+ }
+ }
+
+ if (opt.hasOpt("-noerroronexit"))
+ {
+ nExitCode = 0;
+ }
+ return nExitCode;
+}
+
+// -----------------------------------------------------------------------------
+// this function is only inserted to give a better startpoint for breakpoints
+
+int starttest(GetOpt & _opt, AutomaticRegisterHelper const& aHelper)
+{
+ // create a TestResult
+ std::auto_ptr<CppUnit::TestResult> pResult = initResult(_opt);
+
+ // call all test functions
+ aHelper.CallAll(pResult.get());
+
+ // create and open log
+ std::auto_ptr<Outputter> pOutput = initOutputter(_opt);
+
+ // give the output
+ pResult->print(*pOutput.get());
+
+ // this is a debug extension, so you can read the output and after a key is pressed the program will end.
+ if (_opt.hasOpt("-waitforkey"))
+ {
+ fprintf(stderr, "Press return key.");
+ fflush(stderr);
+ getchar();
+ }
+
+ if (_opt.hasOpt("-verbose"))
+ {
+ fprintf(stderr, "Remove signal handlers");
+ }
+
+ removeSignalFile(_opt);
+
+ if (_opt.hasOpt("-verbose"))
+ {
+ fprintf(stderr, " [done]\n");
+ }
+
+ if (_opt.hasOpt("-hardexit"))
+ {
+ fprintf(stderr, "Hardexit forced.\n");
+ abort();
+ }
+
+ int nExit = pResult->getExitValue();
+ return nExit;
+}
+
diff --git a/testshl2/source/testshlrunner/ProcessHandler.java b/testshl2/source/testshlrunner/ProcessHandler.java
new file mode 100644
index 000000000000..7ffaac66c77d
--- /dev/null
+++ b/testshl2/source/testshlrunner/ProcessHandler.java
@@ -0,0 +1,358 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: ProcessHandler.java,v $
+ * $Revision: 1.3 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+import java.io.InputStream;
+import java.io.File;
+import java.io.FileFilter;
+import java.util.ArrayList;
+import java.io.PrintWriter;
+import java.io.PrintStream;
+import java.io.LineNumberReader;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+
+/**
+ * Class collect information from input stream in
+ * background (sparate thread) and outputs it to
+ * some log stream. I helps to avoid buffer overflow
+ * when output stream has small buffer size (e.g.
+ * in case when handling stdout from external
+ * <code>Process</code>)
+ *
+ * This class is currently used by ProcesHandler
+ * internally only.
+ */
+class Pump extends Thread {
+ private LineNumberReader reader;
+ private String pref ;
+ private Pump thread ;
+ private StringBuffer buf = new StringBuffer(256);
+ private PrintWriter log ;
+
+ /**
+ * Creates Pump for specified <code>InputStream</code>.
+ * This Pump also synchronously output text read to
+ * log by prefixed lines. Constructor immediately
+ * starts reading in a separate thread.
+ *
+ * @param is Stream which requires permanent reading.
+ * @param log Writer where prefixed text lines to be output
+ * @param outPrefix A prefix which is printed at the
+ * beginning of each output line.
+ */
+ public Pump(InputStream is, PrintWriter log, String outPrefix) {
+ this.pref = outPrefix == null ? "" : outPrefix ;
+ reader = new LineNumberReader(new InputStreamReader(is));
+ this.log = log ;
+ start() ;
+ }
+
+ public void run() {
+ try {
+ String line = reader.readLine() ;
+ while (line != null) {
+ log.println(pref + line);
+ log.flush();
+ buf.append(line).append('\n');
+ line = reader.readLine() ;
+ }
+ } catch (java.io.IOException e) {
+ log.println(pref + "Exception occured: " + e) ;
+ }
+ }
+
+ /**
+ * Returns the text collected from input stream.
+ */
+ public String getStringBuffer() {
+ return buf.toString();
+ }
+}
+
+/**
+ * Class provides convenient way for running external program
+ * handle its standard streams, control execution and check results.
+ * Instance of this class must be created only for a single
+ * execution. If you need to execute the same command again you
+ * should create a new instance for this.
+ */
+public class ProcessHandler {
+ private String cmdLine;
+ private String[] envVars = null;
+ private File workDir = null;
+ private PrintWriter log;
+
+ private int exitValue = -1;
+ private boolean isFinished = false;
+ private boolean isStarted = false;
+
+ private String stdInBuff = "";
+ private Pump stdout = null ;
+ private Pump stderr = null ;
+ private PrintStream stdIn = null ;
+
+ private Process proc = null ;
+
+ /**
+ * Creates instance with specified external command and
+ * log stream where debug info is printed and output
+ * of external command.
+ */
+ public ProcessHandler(String cmdLine, PrintWriter log) {
+ this(cmdLine, log, null, null);
+ }
+ /**
+ * Creates instance with specified external command.
+ * Debug info and output
+ * of external commandis printed to stdout.
+ */
+ public ProcessHandler(String cmdLine) {
+ this(cmdLine, null, null, null);
+ }
+ /**
+ * Creates instance with specified external command which
+ * will be executed in the some work directory and
+ * log stream where debug info and output
+ * of external command is printed .
+ * The specified environment variables are set for the new process.
+ * If log stream is null, logging is printed to stdout.
+ */
+ public ProcessHandler(String cmdLine, PrintWriter log,
+ File workDir, String[] envVars) {
+ this.cmdLine = cmdLine ;
+ this.workDir = workDir;
+ this.log = log;
+ this.cmdLine = cmdLine ;
+ this.envVars = envVars;
+ if (log == null)
+ this.log = new PrintWriter(new OutputStreamWriter(System.out));
+ else
+ this.log = log;
+ }
+ /**
+ * Creates instance with specified external command which
+ * will be executed in the some work directory.
+ * Debug info and output
+ * of external commandis printed to stdout.
+ */
+ public ProcessHandler(String cmdLine, File workDir) {
+ this(cmdLine, null, workDir, null);
+ }
+
+ /**
+ * Executes the command and returns only when the process
+ * exits.
+ *
+ * @return <code>true</code> if process was successfully
+ * started and correcly exits (exit code doesn't affect
+ * to this result).
+ */
+ public boolean executeSynchronously() {
+ execute() ;
+ return waitFor() ;
+ }
+
+ /**
+ * Executes the command immediately returns. The process
+ * remains in running state. Control of its state should
+ * be made by <code>waitFor</code> methods.
+ *
+ * @return <code>true</code> if process was successfully
+ * started.
+ */
+ public boolean executeAsynchronously() {
+ execute() ;
+ return isStarted() ;
+ }
+
+ public void kill() {
+ if (!isStarted()) return;
+ proc.destroy();
+ isStarted = false;
+ }
+
+ protected void execute() {
+ if (isStarted()) {
+ throw new RuntimeException(
+ "The process handler has already been executed.") ;
+ }
+ Runtime runtime = Runtime.getRuntime() ;
+ try {
+ log.println("Starting command: " + cmdLine) ;
+ if (workDir != null) {
+ proc = runtime.exec(cmdLine, envVars, workDir) ;
+ } else {
+ proc = runtime.exec(cmdLine, envVars) ;
+ }
+
+ isStarted = true ;
+ } catch (java.io.IOException e) {
+ log.println("The command "+cmdLine+" can't be started: " + e);
+ return;
+ }
+ stdout = new Pump(proc.getInputStream(), log, "out > ");
+ stderr = new Pump(proc.getErrorStream(), log, "err > ");
+ stdIn = new PrintStream(proc.getOutputStream()) ;
+
+ flushInput() ;
+ }
+
+ /**
+ * This method is useful when the process was executed
+ * asynchronously. Waits for process to exit and return
+ * its result.
+ *
+ * @return <code>true</code> if process correctly exited
+ * (exit code doesn't affect to this result).
+ */
+ public boolean waitFor() {
+ return waitFor(0) ;
+ }
+
+ /**
+ * This method is useful when the process was executed
+ * asynchronously. Waits during specified time for process
+ * to exit and return its status.
+ *
+ * @return <code>true</code> if process correctly exited
+ * (exit code doesn't affect to this result).
+ */
+ public boolean waitFor(long timeout) {
+ if (isFinished()) return true ;
+ if (!isStarted()) return false ;
+
+ if (timeout == 0) {
+ try {
+ proc.waitFor() ;
+ } catch (InterruptedException e) {
+ log.println("The process was interrupted: " + e);
+ }
+ isFinished = true ;
+ try {
+ exitValue = proc.exitValue() ;
+ } catch (IllegalThreadStateException e) {}
+ } else {
+ try {
+ while (!isFinished && timeout > 0) {
+ isFinished = true ;
+ Thread.sleep(1000);
+ timeout -= 1000 ;
+ try {
+ exitValue = proc.exitValue() ;
+ } catch (IllegalThreadStateException e) {
+ isFinished = false ;
+ }
+ }
+ } catch (InterruptedException ex) {
+ log.println("The process was interrupted: " + ex);
+ }
+ }
+
+ if (!isFinished) {
+ proc.destroy();
+ }
+
+ try {
+ stdout.join();
+ stderr.join();
+ } catch (InterruptedException e) {}
+
+ return isFinished() ;
+ }
+
+ protected void flushInput() {
+ if (stdIn == null) return ;
+
+ synchronized(stdInBuff) {
+ stdIn.print(stdInBuff);
+ stdIn.flush();
+ stdInBuff = "" ;
+ }
+ }
+
+ /**
+ * Returns the text output by external command to stdout.
+ */
+ public String getOutputText() {
+ return stdout.getStringBuffer();
+ }
+ /**
+ * Returns the text output by external command to stderr.
+ */
+ public String getErrorText() {
+ return stderr.getStringBuffer();
+ }
+
+ /**
+ * Prints the string specified to sdtin of external
+ * command. '\n' is not added so if you need you
+ * should terminate the string with '\n'. <p>
+ *
+ * The method can also be called before the command
+ * starts its execution. Then the text is buffered
+ * and transfered to command when it will be started.
+ */
+ public void printInputText(String str) {
+ stdInBuff += str ;
+ flushInput();
+ }
+
+ /**
+ * Returns information about was the command started or
+ * not.
+ *
+ * @return <code>true</code> if the external command was
+ * found and successfully started.
+ */
+ public boolean isStarted() {
+ return isStarted ;
+ }
+
+ /**
+ * Returns the information about the final state of command
+ * execution.
+ *
+ * @return <code>true</code> if the command correctly starts,
+ * exits and was not interrupted due to timeout.
+ */
+ public boolean isFinished() {
+ return isFinished ;
+ }
+
+ /**
+ * Returns exit code of the external command.
+ *
+ * @return exit code of command if it was finished,
+ * -1 if not.
+ */
+ public int getExitCode() {
+ return exitValue ;
+ }
+}
diff --git a/testshl2/source/testshlrunner/TestShl2Runner.java b/testshl2/source/testshlrunner/TestShl2Runner.java
new file mode 100644
index 000000000000..96b6644def7c
--- /dev/null
+++ b/testshl2/source/testshlrunner/TestShl2Runner.java
@@ -0,0 +1,940 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: TestShl2Runner.java,v $
+ * $Revision: 1.7 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+
+// package main;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.RandomAccessFile;
+import java.io.PrintWriter;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.Statement;
+import java.sql.ResultSet;
+
+import java.util.HashMap;
+import java.util.Set;
+import java.util.Iterator;
+import java.util.Properties;
+
+import java.io.FileInputStream;
+
+// -----------------------------------------------------------------------------
+/**
+ * This class offers helper function, to easily connect to a database
+ * delete values and insert values.
+ */
+
+class PropertyHelper
+{
+ public static Properties getProperties(String name)
+ {
+ Properties prop = new Properties();
+ FileInputStream propFile = null;
+ try {
+ propFile = new FileInputStream(name);
+ prop.load(propFile);
+ propFile.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return prop;
+ }
+
+ public static void setProperties(Properties prop, String name) {
+ FileOutputStream propFile = null;
+ try {
+ propFile = new FileOutputStream(name);
+ prop.store(propFile,"");
+ propFile.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
+
+class DBHelper
+{
+ /**
+ * This method inserts given values into<br>
+ * the table 'states'
+ * @param values a set of comma separated values to be inserted
+ */
+
+ public static void SQLinsertValues(String values)
+ {
+ Statement oStmt = null;
+ Connection oCon = null;
+ try
+ {
+ oCon = getMySQLConnection();
+ oStmt = oCon.createStatement();
+ ResultSet oResult = oStmt.executeQuery("insert into states values ("
+ + values + ")");
+ }
+ catch(Exception e)
+ {
+ System.out.println("Couldn't insert values to db");
+ e.printStackTrace();
+ } finally
+ {
+ try
+ {
+ oCon.close();
+ oCon = null;
+ }
+ catch (Exception e) {}
+ }
+ }
+ /**
+ * This method establishes a Connection<br>
+ * with the database 'module_unit' on jakobus
+ */
+
+ public static Connection getMySQLConnection() throws Exception
+ {
+ Class.forName("org.gjt.mm.mysql.Driver");
+ Connection mysql = DriverManager.getConnection(
+ "jdbc:mysql://jakobus:3306/module_unit","admin","admin");
+ return mysql;
+ }
+ /**
+ * This method removes all entries of the given<br>
+ * module/platform combination
+ * @param mdl the name of the module, e.g. sal
+ * @param os the name of the platform, e.g. unxsols
+ */
+
+ public static void SQLdeleteValues(String _sModulName, String _sEnvironment)
+ {
+ Statement oStmt = null;
+ Connection oCon = null;
+ try
+ {
+ oCon = getMySQLConnection();
+ oStmt = oCon.createStatement();
+ ResultSet oResult = oStmt.executeQuery("delete from states where mdl='"
+ + _sModulName + "' AND pf='" + _sEnvironment + "'");
+ }
+ catch(Exception e)
+ {
+ System.out.println("Couldn't delete values from db");
+ }
+ finally
+ {
+ try
+ {
+ oCon.close();
+ oCon = null;
+ }
+ catch (Exception e) {}
+ }
+ }
+}
+
+// -----------------------------------------------------------------------------
+
+/**
+ * This class helps to build only one output line if the classname and the methodname are the same.
+ */
+
+class CurrentEntry
+{
+ public String m_sDate;
+ public String m_sClassName;
+ public String m_sMethodName;
+
+ ArrayList m_sMethodTestNames = new ArrayList();
+ ArrayList m_sComments = new ArrayList();
+ ArrayList m_sStates = new ArrayList();
+
+ public String m_sCommentContainer = "";
+
+ CurrentEntry()
+ {}
+
+ public String getState()
+ {
+ // build the right State
+ String sAllIsRight = "PASSED#OK#";
+ ArrayList sFailedStates = new ArrayList();
+ boolean bFailed = false;
+ for (int i=0; i<m_sStates.size();i++)
+ {
+ String sStatus = (String) m_sStates.get(i);
+ if (!sStatus.equals(sAllIsRight))
+ {
+ bFailed = true;
+ sFailedStates.add(sStatus);
+ }
+ }
+ if (bFailed == false)
+ {
+ return "PASSED#OK#";
+ }
+
+ // interpret the failures
+ return "PASSED#FAILED#";
+ }
+
+ public void add(String _sDate, String _sClassName, String _sMethodName, String _sMethodTestName, String _sState, String _sComment)
+ {
+ m_sDate = _sDate;
+ m_sClassName = _sClassName;
+ m_sMethodName = _sMethodName;
+ m_sMethodTestNames.add(_sMethodTestName);
+ m_sStates.add(_sState);
+
+ if (_sComment.length() > 0)
+ {
+ String sComment = _sComment.replace('\'',' ');
+
+ m_sComments.add(sComment);
+
+ if (m_sCommentContainer.length() > 0)
+ {
+ m_sCommentContainer += ";<BR>";
+ }
+ m_sCommentContainer += _sMethodTestName + "(): " + _sComment;
+ }
+ }
+
+}
+// -----------------------------------------------------------------------------
+
+/**
+ * HashMap Helper. At the moment classname and Methodname build a key value
+ * if they already exist, we store additional information into the already existing value
+ * if not, build an new entry.
+ */
+
+class DatabaseEntry
+{
+ HashMap aMap = new HashMap();
+
+ public DatabaseEntry()
+ {
+ }
+
+ public String Quote(String _sToQuote)
+ {
+ String ts = "'";
+ return ts + _sToQuote + ts;
+ }
+
+ /**
+ * Write down all collected lines into the database.
+ */
+ public void writeDown(String _sProjectName, String _sEnvironment)
+ {
+ System.out.println(" ");
+ Set aSet = (Set)aMap.keySet();
+ Iterator aIter = aSet.iterator();
+ String sComma = ",";
+
+ while (aIter.hasNext())
+ {
+ String sKey = (String)aIter.next();
+ CurrentEntry aEntry = (CurrentEntry)aMap.get(sKey);
+
+ String db_line= Quote(_sProjectName) + sComma +
+ Quote( aEntry.m_sClassName) + sComma +
+ Quote( aEntry.m_sMethodName) + sComma +
+ Quote( aEntry.getState()) + sComma +
+ Quote( _sEnvironment) + sComma +
+ Quote( aEntry.m_sDate) + sComma +
+ Quote( aEntry.m_sCommentContainer);
+ System.out.println(db_line);
+ DBHelper.SQLinsertValues(db_line);
+ }
+ }
+
+
+ public void add(String _sDate, String _sClassName,
+ String _sMethodName, String _sMethodTestName,
+ String _sState, String _sComment)
+ {
+ String sKey = _sClassName + "." + _sMethodName;
+ if (aMap.containsKey(sKey))
+ {
+ CurrentEntry aEntry = (CurrentEntry)aMap.get(sKey);
+ aEntry.add(_sDate, _sClassName, _sMethodName, _sMethodTestName, _sState, _sComment);
+ }
+ else
+ {
+ CurrentEntry aEntry = new CurrentEntry();
+ aEntry.add(_sDate, _sClassName, _sMethodName, _sMethodTestName, _sState, _sComment);
+ aMap.put(sKey, aEntry);
+ }
+ }
+}
+
+/**
+ *
+ * This class will run the testshl2 script
+ *
+ * According to a given baseDir it'll first
+ * get all scenario files, clean them up<br>
+ * Then all sources will be compiled and
+ * the scenarios started.<br>
+ * After the a scenarios are finished the result
+ * will be stored in the database.
+ * @version 0.1
+ */
+public class TestShl2Runner
+{
+
+ Properties m_aProps;
+
+ String m_sVersion = "udk399";
+ String m_sExtension = "";
+ String m_sProjectDir = "";
+ String m_sEnvironment = "";
+ String m_sProjectName = "";
+ String m_sShellExecutable="";
+ String m_sLocalEnv="";
+
+ /**
+ * The constructor to use this class from any other java-class
+ * @param bdir the base directory where the qa-subfolder can be found
+ * @param pf the platform e.g. unxsols
+ * @param mod the module e.g. sal
+ * @param ver the version e.g. udk304
+ * @param pre the path to the shell, may be "", but is needed on Windows<br>
+ * Systems to ensure that the created scripts run in an 4NT-shell
+ */
+
+// public TestShl2Runner(String bdir, String pf, String project, String ver, String pre, String localenv)
+ public TestShl2Runner(String filename)
+ {
+ String fs = System.getProperty("file.separator");
+
+ m_aProps = PropertyHelper.getProperties(filename);
+
+ m_sEnvironment = m_aProps.getProperty("ENV"); // unxsols3.pro
+ m_sProjectName = m_aProps.getProperty("PROJECTNAME"); // sal
+ m_sProjectDir = m_aProps.getProperty("BASEDIR") + fs + m_sProjectName; // /usr/qaapi/projects/udk/sal
+ m_sVersion = m_aProps.getProperty("BUILD"); // udk305
+ m_sShellExecutable = m_aProps.getProperty("SHELL"); // /bin/tcsh
+ m_sLocalEnv = m_aProps.getProperty("LOCALENV"); // /usr/qaapi/projects/solartmp
+
+ // if (m_sVersion.indexOf("-pro") > 1) m_sExtension=".pro";
+
+ startAll();
+ }
+
+ /**
+ * The main Method makes it possible to run this class standalone
+ * @param args the command line arguments
+ */
+ public static void main(String args[])
+ {
+ if (args.length != 1)
+ {
+ System.out.println("Usage: TestShl2Runner <config.file>");
+ System.out.println("Example: TestShl2Runner /usr/qaapi/projects/udk/sal/qa/configfile");
+ System.exit(1);
+ }
+
+ TestShl2Runner aRunner = new TestShl2Runner(args[0]);
+ }
+
+ // -----------------------------------------------------------------------------
+
+ ArrayList getJobs()
+ {
+ String fs = System.getProperty("file.separator");
+ String sJobFile = m_sProjectDir + fs + m_aProps.getProperty("INPUT") + fs + m_aProps.getProperty("JOBFILE");
+ ArrayList aLines = getLines(sJobFile);
+ return aLines;
+ }
+
+ // -----------------------------------------------------------------------------
+
+ public void startAll()
+ {
+ String fs = System.getProperty("file.separator");
+
+ //get all scenario-files
+ System.out.println("Getting jobs");
+ ArrayList aJobList = getJobs();
+
+ //cleanup scenorio-files and return a working array
+ // Object[] the_array = cleanup(m_sProjectDir + fs + "qa" + fs + "sce" + fs,scene_files);
+ // System.out.println("...done");
+
+ //create a script to build the sources and run the tests
+ System.out.println("creating start script for testprocess");
+ String scriptName = createScript(aJobList);
+ System.out.println("...done");
+
+ //start the script
+ System.out.println("starting script for testprocess");
+ String sScript = m_sShellExecutable + " " + getOutputDir() + fs + scriptName;
+ executeScript(sScript);
+ System.out.println("...done");
+
+ //remove old values from db-table
+ DBHelper.SQLdeleteValues(m_sProjectName,m_sEnvironment);
+ DBHelper.SQLdeleteValues(m_sProjectName,m_sEnvironment);
+
+ //parse the output and store it
+ parseOut (aJobList, m_sProjectName, m_sEnvironment, m_sProjectDir);
+ }
+
+ /**
+ * This method reads the lines of a file and puts<br>
+ * them into an ArrayList
+ * @param filename the name of the file to be read
+ */
+
+ public ArrayList getLines(String filename)
+ {
+ File the_file = new File(filename);
+ ArrayList the_lines = new ArrayList();
+ if (! the_file.exists())
+ {
+ System.out.println("couldn't find file " + filename);
+ return the_lines;
+ }
+ RandomAccessFile the_reader = null;
+ try
+ {
+ the_reader = new RandomAccessFile(the_file,"r");
+ String aLine = "";
+ while (aLine != null)
+ {
+ aLine = the_reader.readLine();
+ if ( (aLine != null) &&
+ (! (aLine.length() < 2) ) &&
+ (! aLine.startsWith("#")))
+ {
+ the_lines.add(aLine);
+ }
+ }
+ }
+ catch (java.io.FileNotFoundException fne)
+ {
+ System.out.println("couldn't open file " + filename);
+ System.out.println("Message: " + fne.getMessage());
+ }
+ catch (java.io.IOException ie)
+ {
+ System.out.println("Exception while reading file " + filename);
+ System.out.println("Message: " + ie.getMessage());
+ }
+ try
+ {
+ the_reader.close();
+ }
+ catch (java.io.IOException ie)
+ {
+ System.out.println("Couldn't close file " + filename);
+ System.out.println("Message: " + ie.getMessage());
+ }
+ return the_lines;
+ }
+
+
+
+ /**
+ * This method calls the createScript-methods<br>
+ * for the given platform
+ * @param basedir the name of the base-directory, e.g. /usr/qaapi/projects/udk/sal
+ * @param qajobs jobs to be done
+ */
+
+ public String createScript(ArrayList _aJobList)
+ {
+ String res = "";
+ if (m_sEnvironment.startsWith("wnt"))
+ {
+ try
+ {
+ res = createwntmsci(_aJobList);
+ }
+ catch (IOException ioe)
+ {
+ System.out.println("Couldn't create Script");
+ }
+ }
+ else if (m_sEnvironment.startsWith("unx"))
+ {
+ try
+ {
+ res = createunx(_aJobList);
+ }
+ catch (IOException ioe)
+ {
+ System.out.println("Couldn't create Script");
+ }
+ }
+ else
+ {
+ // can't handle unknown environment
+ }
+ return res;
+ }
+
+ public String getSignalFileParameter()
+ {
+ String sParameter;
+ sParameter = " -sf /var/tmp/signalfile_" + m_sProjectName + "_" + m_sEnvironment + ".txt ";
+ return sParameter;
+ }
+
+ public String getLogParameter(String job)
+ {
+ String sParameter = " -log " + getLogName(job) + " ";
+ return sParameter;
+ }
+
+ public String getLogName(String job)
+ {
+ // create the ' -log file '
+ String fs = System.getProperty("file.separator");
+ String sLogName = getOutputDir() + fs + job + ".log";
+ return sLogName;
+ }
+
+ public String getInputDir()
+ {
+ String fs = System.getProperty("file.separator");
+ String sInputDir = m_sProjectDir + fs + m_aProps.getProperty("INPUT");
+ return sInputDir;
+ }
+
+
+ public String getOutputDir()
+ {
+ String fs = System.getProperty("file.separator");
+ String sOutputDir = m_sProjectDir + fs + m_sEnvironment + fs + m_aProps.getProperty("OUTPUT");
+
+ File aFile = new File(sOutputDir);
+ aFile.mkdirs();
+ return sOutputDir;
+ }
+
+ public String getCAXParameter()
+ {
+ String sCAX = " ";
+ // Due to the fu....g java that we havn't access to our well formed ;-)
+ // environment variables the simple switch -cax do not longer work :-(
+
+ // String sSolTmp = System.getenv("SOL_TMP");
+ if (m_sLocalEnv.length() > 0)
+ {
+ sCAX = " -cax -tmp " + m_sLocalEnv;
+ }
+ // else
+ // {
+ // due to the fact that we don't want to get hole lokal env if no one exist, do nothing here.
+ // }
+ return sCAX;
+ }
+
+ public String getProParameter()
+ {
+ String sPro = " ";
+ if (m_sEnvironment.endsWith(".pro"))
+ {
+ sPro = " -pro ";
+ }
+ return sPro;
+ }
+
+ public String getCompEnvName()
+ {
+ String sCompEnv;
+ if (m_sEnvironment.endsWith(".pro"))
+ {
+ sCompEnv = String.copyValueOf(m_sEnvironment.toCharArray(), 0, 8);
+ }
+ else
+ {
+ sCompEnv = m_sEnvironment;
+ }
+ return " " + sCompEnv;
+ }
+
+ /**
+ * This method create the script needed to compile and run the<br>
+ * the tests on the Windows platform
+ * @param basedir the name of the base-directory, e.g. /usr/qaapi/projects/udk/sal
+ * @param qajobs jobs to be done
+ */
+
+ public void PreNPost(FileWriter out, String _sWhat) throws IOException
+ {
+ String ls = System.getProperty("line.separator");
+
+ out.write(getRemark() + " do " + _sWhat + ls);
+ for (int i = 1;i<9;i++)
+ {
+ String sWhat = m_aProps.getProperty(_sWhat + i);
+ if (sWhat != null)
+ {
+ out.write(sWhat + ls);
+ }
+ }
+ out.write(ls);
+ }
+
+ public String getChangeDirFkt()
+ {
+ if (m_sEnvironment.startsWith("wnt"))
+ {
+ return "cdd";
+ }
+ return "cd";
+ }
+ public String getRemark()
+ {
+ if (m_sEnvironment.startsWith("wnt"))
+ {
+ return "rem ";
+ }
+ return "# ";
+ }
+
+ public void do_setsolar(FileWriter out, String _sPreExec) throws IOException
+ {
+ String ls = System.getProperty("line.separator");
+
+ out.write(getRemark() + " do a setsolar" + ls);
+ out.write(_sPreExec + " setsolar -" + m_sVersion + getCAXParameter() + getProParameter() + getCompEnvName() + ls);
+ out.write(ls);
+ }
+
+ public void do_cvs(FileWriter out, String _sPreExec, ArrayList _aJobList) throws IOException
+ {
+ String fs = System.getProperty("file.separator");
+ String ls = System.getProperty("line.separator");
+ out.write(getChangeDirFkt() + " " + getInputDir() + ls);
+ out.write(getRemark() + " do a cvs and a dmake" + ls);
+
+ out.write(_sPreExec + " " + "cvs -d" + m_aProps.getProperty("CVSROOT") + " update -d" + ls);
+
+ for (int i=0; i<_aJobList.size();i++)
+ {
+ String sJob = (String) _aJobList.get(i);
+
+ out.write(getChangeDirFkt() + " " + getInputDir() + fs + sJob + ls);
+ // setenv VCSID lla
+ // set VCSID=lla
+ out.write(_sPreExec + " " + "dmake -u" + ls);
+ }
+ out.write(ls);
+ }
+
+ public void do_testtool(FileWriter out, String _sPreExec, ArrayList _aJobList) throws IOException
+ {
+ String ls = System.getProperty("line.separator");
+ out.write(getRemark() + " call the test tool" + ls);
+ out.write(getChangeDirFkt() + " " + getOutputDir() + ls);
+ if (m_sEnvironment.startsWith("wnt"))
+ {
+ out.write("set DISABLE_SAL_DBGBOX=t" + ls);
+ }
+
+ for (int i=0; i<_aJobList.size();i++)
+ {
+ String sLine = (String) _aJobList.get(i);
+ // String sJob = getJob(sLine);
+ out.write(_sPreExec + " " + m_aProps.getProperty("TESTTOOL") + " " + getLibName(sLine, m_sEnvironment) + getLogParameter(sLine) + getSignalFileParameter() + ls);
+ }
+ out.write(ls);
+ }
+
+ public String createwntmsci(ArrayList _aJobList) throws IOException
+ {
+ String fs = System.getProperty("file.separator");
+ String ls = System.getProperty("line.separator");
+
+ String sBatchFile = m_aProps.getProperty("BATCHFILE");
+ File outputFile = new File(getOutputDir(), sBatchFile);
+ FileWriter out = new FileWriter(outputFile.toString());
+
+ out.write("rem do not edit, will be created automatically by TestShl2Runner.java" + ls);
+
+ // String sBuildEnvironment = "wntmsci9";
+ PreNPost(out, "PRE");
+
+ String sBatchPreExec = "call";
+ do_setsolar(out, sBatchPreExec);
+ do_cvs(out, sBatchPreExec, _aJobList);
+ do_testtool(out, sBatchPreExec, _aJobList);
+
+ PreNPost(out, "POST");
+
+ // the exit is alsolute need here, because we do not get back, until
+ // shell is stopped with exit.
+ out.write("exit" + ls);
+ out.close();
+ return sBatchFile;
+ }
+
+ /**
+ * This method create the script needed to compile and run the<br>
+ * the tests on the Unix platform
+ * @param basedir the name of the base-directory, e.g. /usr/qaapi/projects/udk/sal
+ * @param qajobs jobs to be done
+ */
+
+ public String createunx(ArrayList _aJobList) throws IOException
+ {
+ String fs = System.getProperty("file.separator");
+ String ls = System.getProperty("line.separator");
+
+ String sBatchFile = m_aProps.getProperty("BATCHFILE");
+ File outputFile = new File(getOutputDir(), sBatchFile);
+ FileWriter out = new FileWriter(outputFile.toString());
+
+ out.write("#!/bin/tcsh" + ls); // shebang
+ out.write("# do not edit, will be created automatically by TestShl2Runner.java" + ls);
+
+ PreNPost(out, "PRE");
+
+ String sBatchPreExec = "";
+ do_setsolar(out, sBatchPreExec);
+ do_cvs(out, sBatchPreExec, _aJobList);
+ do_testtool(out, sBatchPreExec, _aJobList);
+
+ PreNPost(out, "POST");
+
+ out.write("exit" + ls);
+ out.close();
+
+ // set excution bits
+ String sExec = "chmod u+x " + getOutputDir() + fs + sBatchFile;
+ Runtime.getRuntime().exec(sExec);
+ return sBatchFile;
+ }
+
+ // -----------------------------------------------------------------------------
+
+ /**
+ * This method extracts the libname from a given<br>
+ * job and adds a relative path based on the platform
+ * @param job the job to be done
+ * @param os the platform
+ */
+
+ public String getLibName(String job, String _sEnvironment)
+ {
+ String fs = System.getProperty("file.separator");
+ // BACK: String like "../wntmsci9.pro/bin/rtl_OString.dll"
+
+ String res = "";
+ int nIndex = job.indexOf(".");
+ // if (nIndex > 0)
+ // {
+ // }
+ String sPureFilename = job;
+ String purelibname = "";
+ if (_sEnvironment.startsWith("wnt"))
+ {
+ purelibname = "bin" + fs + sPureFilename + ".dll";
+ }
+ else if (_sEnvironment.startsWith("unx"))
+ {
+ purelibname = "lib" + fs + "lib" + sPureFilename + ".so";
+ }
+ else
+ {
+ // _sEnvironment unknown
+ // throw ...
+ }
+
+ // we are in the wntmsci9[.pro]/qa directory
+ // to go to the bin directory we have to go to
+ // ../bin or ../lib
+ res = m_sProjectDir + fs + m_sEnvironment + fs + purelibname;
+ return res;
+ }
+
+ // -----------------------------------------------------------------------------
+
+/*
+ public Object[] cleanup(String sceneDir, String[] scene_files)
+ {
+ ArrayList res = new ArrayList();
+ for (int j=0;j<scene_files.length;j++)
+ {
+ if (scene_files[j].endsWith(".sce"))
+ {
+ try
+ {
+ removeRemark(sceneDir,scene_files[j]);
+ }
+ catch (IOException ioe)
+ {
+ System.out.println("Couldn't cleanup Scene-File " + scene_files[j]);
+ }
+ String pure = scene_files[j].substring(0,
+ scene_files[j].indexOf("."));
+ res.add(pure + ".qadev");
+ }
+ }
+ return res.toArray();
+ }
+
+
+ public void removeRemark(String sceneDir,String scene_file)
+ throws IOException
+ {
+ ArrayList org = getLines(sceneDir + scene_file);
+ String pure = scene_file.substring(0,scene_file.indexOf("."));
+ String ls = System.getProperty("line.separator");
+ File outputFile = new File(sceneDir,pure + ".qadev");
+ FileWriter out = new FileWriter(outputFile.toString());
+ for (int k=0;k<org.size();k++)
+ {
+ String toWrite = (String)org.get(k);
+ if (toWrite.startsWith("#"))
+ {
+ toWrite=toWrite.substring(1);
+ }
+ out.write(toWrite + ls);
+ }
+ out.close();
+ }
+*/
+
+ public void parseOut (ArrayList sJobList, String _sProjectName, String _sEnvironment, String basedir)
+ {
+ //parse the out-files and store the data
+ String fs = System.getProperty("file.separator");
+ for (int i=0; i<sJobList.size();i++)
+ {
+ String sJob = (String) sJobList.get(i);
+ String outFile = getLogName(sJob);
+ ArrayList out_lines = getLines(outFile);
+ String date="";
+
+ DatabaseEntry aEntry = new DatabaseEntry();
+
+ for (int j=0;j<out_lines.size();j++)
+ {
+ String sLine = (String)out_lines.get(j);
+ if (sLine.startsWith("["))
+ {
+ date = sLine.substring(1, 11);
+ date = date.replace('.','-');
+ }
+ else
+ {
+ if (sLine.startsWith("Test #PASSED#")) break;
+ // if (out_lines.get(j).equals(
+ // " ---------- ")) break;
+
+ try
+ {
+ String sName = sLine.substring(0, sLine.indexOf(';'));
+
+ // count dot's
+ int nFirstDot = sName.indexOf('.');
+ int nSecondDot = sName.indexOf('.', nFirstDot + 1);
+ String sClassName = "";
+ String sMethodName = "";
+ String sMethodTestName = "";
+
+ if (nFirstDot > 0)
+ {
+ sClassName = sName.substring(0, nFirstDot);
+ if (nSecondDot > 0)
+ {
+ sMethodName = sName.substring(nFirstDot + 1, nSecondDot);
+ sMethodTestName = sName.substring(nSecondDot + 1);
+ }
+ else
+ {
+ sMethodName = sName.substring(nFirstDot);
+ }
+ }
+ else
+ {
+ // no FirstDot, also no secondDot!
+ sClassName = sName;
+ }
+
+ String sComment = sLine.substring(sLine.lastIndexOf('#') + 1);
+
+ // get state
+ int nSecondNo = sLine.indexOf('#');
+ nSecondNo = sLine.indexOf('#', nSecondNo + 1);
+ String sState = sLine.substring(sLine.indexOf(";") + 1, nSecondNo + 1);
+
+ aEntry.add(date, sClassName, sMethodName, sMethodTestName, sState, sComment);
+ }
+ catch(IndexOutOfBoundsException e)
+ {
+ System.out.println("IndexOutOfBoundException: caught in parseOut()");
+ }
+ }
+ }
+ aEntry.writeDown(_sProjectName, _sEnvironment);
+ }
+ }
+
+ // -----------------------------------------------------------------------------
+
+ private void shortWait(int nMilliSec)
+ {
+ try
+ {
+ Thread.sleep(nMilliSec);
+ }
+ catch (InterruptedException ex)
+ {
+ }
+
+ }
+
+ // -----------------------------------------------------------------------------
+
+ public boolean executeScript(String scriptFile)
+ {
+ System.out.println("Running " + scriptFile);
+
+ // Process testshl = Runtime.getRuntime().exec(scriptFile);
+ ProcessHandler aHandler = new ProcessHandler(scriptFile);
+ boolean bBackValue = aHandler.executeSynchronously();
+ return bBackValue;
+ // return false;
+ }
+}
+
diff --git a/testshl2/source/testshlrunner/makefile.mk b/testshl2/source/testshlrunner/makefile.mk
new file mode 100644
index 000000000000..1e7235a922d2
--- /dev/null
+++ b/testshl2/source/testshlrunner/makefile.mk
@@ -0,0 +1,48 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.5 $
+#
+# 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 = TestShl2Runner
+TARGET = TestShl2Runner
+
+# --- Settings -----------------------------------------------------
+.INCLUDE: settings.mk
+
+# JARFILES = ridl.jar unoil.jar jurt.jar juh.jar
+# Tip:
+# why 'grep java$$' the $$ is for a real $ and this is for regexp and stays for line end,
+# so we prevent us for compiling *.java~
+JAVAFILES = $(foreach,j,$(shell @ls | grep java$$) $j)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/testshl2/source/versioner.cxx b/testshl2/source/versioner.cxx
new file mode 100644
index 000000000000..65611fb68bfc
--- /dev/null
+++ b/testshl2/source/versioner.cxx
@@ -0,0 +1,120 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: versioner.cxx,v $
+ * $Revision: 1.10 $
+ *
+ * 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_testshl2.hxx"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string>
+
+#include "testshl/versionhelper.hxx"
+
+#include <rtl/ustring.hxx>
+#include <iostream>
+
+// ----------------------------------- Main -----------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int, char* argv[] )
+#else
+int _cdecl main( int, char* argv[] )
+#endif
+{
+ static char const * optionSet[] = {
+ "-time, display time only",
+ "-date, display date only",
+ "-upd, display UPD only",
+ "-minor, display minor only",
+ "-build, display build only",
+ "-inpath, display inpath only",
+ "-verbose, be verbose",
+ "-h:s, display help or help on option",
+ "-help:s, see -h",
+ NULL
+ };
+
+ GetOpt opt( argv, optionSet );
+
+ // someone indicates that he needs help
+ if ( opt.hasOpt( "-h" ) || opt.hasOpt( "-help" ) )
+ {
+ opt.showUsage();
+ exit(0);
+ }
+
+ if (opt.getParams().empty())
+ {
+ // std::cerr << "error: At least a library should given." << std::endl;
+ fprintf(stderr, "error: At least a library should given.\n");
+ opt.showUsage();
+ exit(0);
+ }
+
+ rtl::OUString suLibraryName = rtl::OStringToOUString(opt.getFirstParam(), RTL_TEXTENCODING_ASCII_US );
+ VersionHelper aHelper(suLibraryName, opt);
+
+ if (! aHelper.isOk() )
+ {
+ fprintf(stderr, "error: No version info found.\n");
+ exit(1);
+ }
+
+ if (opt.hasOpt("-time"))
+ {
+ fprintf(stdout, "%s\n", aHelper.getTime().getStr());
+ }
+ else if (opt.hasOpt("-date"))
+ {
+ fprintf(stdout, "%s\n", aHelper.getDate().getStr());
+ }
+ else if (opt.hasOpt("-upd"))
+ {
+ fprintf(stdout, "%s\n", aHelper.getUpd().getStr());
+ }
+ else if (opt.hasOpt("-minor"))
+ {
+ fprintf(stdout, "%s\n", aHelper.getMinor().getStr());
+ }
+ else if (opt.hasOpt("-build"))
+ {
+ fprintf(stdout, "%s\n", aHelper.getBuild().getStr());
+ }
+ else if (opt.hasOpt("-inpath"))
+ {
+ fprintf(stdout, "%s\n", aHelper.getInpath().getStr());
+ }
+ else
+ {
+ // std::cout << aHelper << std::endl;
+ aHelper.printall(stdout);
+ }
+
+ return 0;
+}
diff --git a/testshl2/source/versionhelper.cxx b/testshl2/source/versionhelper.cxx
new file mode 100644
index 000000000000..fdedf3465ec8
--- /dev/null
+++ b/testshl2/source/versionhelper.cxx
@@ -0,0 +1,127 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: versionhelper.cxx,v $
+ * $Revision: 1.11 $
+ *
+ * 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_testshl2.hxx"
+
+#include <stdlib.h>
+#include "testshl/versionhelper.hxx"
+
+#include <rtl/ustring.hxx>
+#include <rtl/string.hxx>
+
+// -----------------------------------------------------------------------------
+VersionHelper::VersionHelper(rtl::OUString const& _sDLLName, GetOpt & _aOptions)
+ :DynamicLibraryHelper(_sDLLName, _aOptions),
+ m_pInfo(NULL)
+{
+ // try to get the entry pointer
+ FktGetVersionInfoPtr pFunc = (FktGetVersionInfoPtr)
+ m_pModule->getFunctionSymbol(
+ rtl::OUString::createFromAscii( "GetVersionInfo" ) );
+
+ if (pFunc)
+ {
+ const VersionInfo *pVersion = (pFunc)();
+ m_pInfo = pVersion;
+ }
+}
+
+//# void VersionHelper::print(std::ostream &stream)
+//# {
+//# stream << " Time:" << getTime() << std::endl;
+//# stream << " Date:" << getDate() << std::endl;
+//# stream << " Upd:" << getUpd() << std::endl;
+//# stream << " Minor:" << getMinor() << std::endl;
+//# stream << " Build:" << getBuild() << std::endl;
+//# stream << "Inpath:" << getInpath() << std::endl;
+//# }
+//#
+//# std::ostream & operator <<( std::ostream &stream, VersionHelper &_aVersion )
+//# {
+//# _aVersion.print (stream);
+//# return stream;
+//# }
+//#
+// -----------------------------------------------------------------------------
+
+bool VersionHelper::isOk() const
+{
+ if (m_pInfo != NULL) return true;
+ return false;
+}
+
+rtl::OString VersionHelper::getTime() const
+{
+ return m_pInfo->pTime;
+}
+rtl::OString VersionHelper::getDate() const
+{
+ return m_pInfo->pDate;
+}
+rtl::OString VersionHelper::getUpd() const
+{
+ return m_pInfo->pUpd;
+}
+rtl::OString VersionHelper::getMinor() const
+{
+ return m_pInfo->pMinor;
+}
+rtl::OString VersionHelper::getBuild() const
+{
+ return m_pInfo->pBuild;
+}
+rtl::OString VersionHelper::getInpath() const
+{
+ return m_pInfo->pInpath;
+}
+
+
+
+void VersionHelper::printall(FILE * out)
+{
+ if (isOk())
+ {
+ rtl::OString aStr = getTime();
+ fprintf(out, " Time:%s\n", aStr.getStr() );
+ fprintf(out, " Date:%s\n", getDate().getStr() );
+ fprintf(out, " Upd:%s\n", getUpd().getStr() );
+ fprintf(out, " Minor:%s\n", getMinor().getStr() );
+ fprintf(out, " Build:%s\n", getBuild().getStr() );
+ fprintf(out, "Inpath:%s\n", getInpath().getStr());
+
+ fflush(out);
+ }
+ else
+ {
+ fprintf(stderr, "error: No version info found.\n");
+ }
+}
+
diff --git a/testshl2/util/makefile.mk b/testshl2/util/makefile.mk
new file mode 100644
index 000000000000..d3b0afa33c46
--- /dev/null
+++ b/testshl2/util/makefile.mk
@@ -0,0 +1,42 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.4 $
+#
+# 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=testshl2
+TARGET=testshl2
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/testshl2/workben/codegen/README b/testshl2/workben/codegen/README
new file mode 100644
index 000000000000..0c24b4a05856
--- /dev/null
+++ b/testshl2/workben/codegen/README
@@ -0,0 +1,9 @@
+This directory contains a simple code generator self test.
+Within UNIX simply start ./selftest
+
+You will get lot of output.
+The code generator creates some files,
+dmake compiles the generated code,
+testshl2 checks the code.
+
+If something goes wrong, you will hopefully get an informal error message.
diff --git a/testshl2/workben/codegen/checkfile b/testshl2/workben/codegen/checkfile
new file mode 100644
index 000000000000..228642da52af
--- /dev/null
+++ b/testshl2/workben/codegen/checkfile
@@ -0,0 +1,7 @@
+#!/bin/csh
+
+if ( -e $1 ) then
+ echo "$1 exist."
+else
+ echo "$1 doesn't exist."
+endif
diff --git a/testshl2/workben/codegen/cleanup b/testshl2/workben/codegen/cleanup
new file mode 100644
index 000000000000..a3fb82312cdf
--- /dev/null
+++ b/testshl2/workben/codegen/cleanup
@@ -0,0 +1,10 @@
+#!/bin/csh
+
+# cleanup
+rm -f *.cxx *.new *.exp
+
+if ( -e makefile.mk_orig ) then
+ rm -f makefile.mk
+ # rename original makefile back
+ mv makefile.mk_orig makefile.mk
+endif
diff --git a/testshl2/workben/codegen/makefile.mk b/testshl2/workben/codegen/makefile.mk
new file mode 100644
index 000000000000..0fdba2d00c13
--- /dev/null
+++ b/testshl2/workben/codegen/makefile.mk
@@ -0,0 +1,49 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.4 $
+#
+# 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=testshl2
+TARGET=codegen
+# this is removed at the moment because we need some enhancements
+# TESTDIR=TRUE
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+#------------------------------- All object files -------------------------------
+
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/testshl2/workben/codegen/selftest b/testshl2/workben/codegen/selftest
new file mode 100644
index 000000000000..cf5e80e513ce
--- /dev/null
+++ b/testshl2/workben/codegen/selftest
@@ -0,0 +1,49 @@
+#!/bin/csh
+
+echo "========== Generate code =========="
+echo
+
+perl ../../source/codegen/codegen.pl test.job
+
+echo
+echo "========== check files =========="
+echo
+
+./checkfile makefile.new
+./checkfile export.exp
+./checkfile skeleton.cxx
+./checkfile nomethod.cxx
+
+echo
+echo "========== backup makefile =========="
+echo
+
+# backup original makefile
+mv makefile.mk makefile.mk_orig
+mv makefile.new makefile.mk
+
+echo
+echo "========== build new sources =========="
+echo
+
+dmake debug=t
+
+echo
+echo "========== call testshl2 =========="
+echo
+
+
+if ( -e ../../${INPATH}/bin/testshl2 ) then
+ ../../${INPATH}/bin/testshl2 -jobonly test.job
+
+ echo
+ ../../${INPATH}/bin/testshl2 ../../${INPATH}/lib/libtest.so
+else
+ echo "testshl2 doesn't exist, test canceled."
+endif
+
+echo
+echo "========== cleanup =========="
+echo
+
+./cleanup
diff --git a/testshl2/workben/codegen/test.job b/testshl2/workben/codegen/test.job
new file mode 100644
index 000000000000..07c47329705b
--- /dev/null
+++ b/testshl2/workben/codegen/test.job
@@ -0,0 +1,17 @@
+# Jobfile
+# this is a job file which contain functions, which should exist
+
+skeleton.bones.bone_001
+skeleton.bones.bone_002
+
+skeleton.bones2.bone_001
+skeleton.bones2.bone_002
+
+nomethod.blah
+illegal
+
+# blah.fasel.suelz
+
+
+# rtl_OUStringBuffer.*
+
diff --git a/testshl2/workben/codegen/w32/checkfile.btm b/testshl2/workben/codegen/w32/checkfile.btm
new file mode 100644
index 000000000000..091ecfbf9faf
--- /dev/null
+++ b/testshl2/workben/codegen/w32/checkfile.btm
@@ -0,0 +1,7 @@
+rem %1 is the filename
+
+iff exist %1 then
+echo Ok: %1 exist.
+else
+echo ERROR: %1 does not exist.
+endiff
diff --git a/testshl2/workben/codegen/w32/cleanup.btm b/testshl2/workben/codegen/w32/cleanup.btm
new file mode 100644
index 000000000000..5073ef887bac
--- /dev/null
+++ b/testshl2/workben/codegen/w32/cleanup.btm
@@ -0,0 +1,9 @@
+rem cleanup
+del *.cxx *.new *.exp
+
+iff exist makefile.mk_orig then
+ del makefile.mk
+ rem rename original makefile back
+ ren makefile.mk_orig makefile.mk
+endiff
+
diff --git a/testshl2/workben/codegen/w32/makefile.mk b/testshl2/workben/codegen/w32/makefile.mk
new file mode 100644
index 000000000000..13f91a3a4bbc
--- /dev/null
+++ b/testshl2/workben/codegen/w32/makefile.mk
@@ -0,0 +1,49 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.3 $
+#
+# 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=testshl2
+TARGET=codegen
+# this is removed at the moment because we need some enhancements
+# TESTDIR=TRUE
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+#------------------------------- All object files -------------------------------
+
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/testshl2/workben/codegen/w32/selftest.btm b/testshl2/workben/codegen/w32/selftest.btm
new file mode 100644
index 000000000000..e181ecc3158b
--- /dev/null
+++ b/testshl2/workben/codegen/w32/selftest.btm
@@ -0,0 +1,47 @@
+
+rem demo
+
+echo "========== Generate code =========="
+echo
+
+perl ..\..\..\source\codegen\codegen.pl test.job
+
+echo
+echo "========== check files =========="
+echo
+
+call checkfile makefile.new
+call checkfile export.exp
+call checkfile skeleton.cxx
+call checkfile nomethod.cxx
+
+echo
+echo "========== backup makefile =========="
+echo
+
+ren makefile.mk makefile.mk_orig
+ren makefile.new makefile.mk
+
+echo
+echo "========== build new sources =========="
+echo
+
+call dmake debug=t
+
+echo
+echo "========== call testshl2 =========="
+echo
+
+iff exist ..\..\..\%INPATH%\bin\testshl2.exe then
+call ..\..\..\%INPATH%\bin\testshl2 -jobonly test.job
+call ..\..\..\%INPATH%\bin\testshl2 ..\..\..\%INPATH%\bin\test.dll
+else
+ echo "testshl2 doesn't exist, test canceled."
+endiff
+
+echo
+echo "========== cleanup =========="
+echo
+
+call cleanup.btm
+
diff --git a/testshl2/workben/codegen/w32/test.job b/testshl2/workben/codegen/w32/test.job
new file mode 100644
index 000000000000..07c47329705b
--- /dev/null
+++ b/testshl2/workben/codegen/w32/test.job
@@ -0,0 +1,17 @@
+# Jobfile
+# this is a job file which contain functions, which should exist
+
+skeleton.bones.bone_001
+skeleton.bones.bone_002
+
+skeleton.bones2.bone_001
+skeleton.bones2.bone_002
+
+nomethod.blah
+illegal
+
+# blah.fasel.suelz
+
+
+# rtl_OUStringBuffer.*
+
diff --git a/testshl2/workben/dlltest/export.exp b/testshl2/workben/dlltest/export.exp
new file mode 100644
index 000000000000..a13529da5876
--- /dev/null
+++ b/testshl2/workben/dlltest/export.exp
@@ -0,0 +1 @@
+registerAllTestFunction
diff --git a/testshl2/workben/dlltest/makefile.mk b/testshl2/workben/dlltest/makefile.mk
new file mode 100644
index 000000000000..88ccfac54b5f
--- /dev/null
+++ b/testshl2/workben/dlltest/makefile.mk
@@ -0,0 +1,130 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.5 $
+#
+# 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=..$/..
+PRJINC=
+
+PRJNAME=testshl2
+TARGET=onefunc
+TARGETTYPE=CUI
+
+ENABLE_EXCEPTIONS=TRUE
+#USE_LDUMP2=TRUE
+#LDUMP2=LDUMP3
+
+# --- Settings -----------------------------------------------------
+.INCLUDE : settings.mk
+
+# ------------------------------------------------------------------
+#--------------------------------- Objectfiles ---------------------------------
+OBJFILES=$(OBJ)$/onefuncstarter.obj
+SLOFILES=$(SLO)$/onefunc.obj
+
+# -------------------------------------------------------------------------------
+
+LIB1TARGET= $(LB)$/$(TARGET)_libfile.lib
+LIB1OBJFILES= $(SLOFILES)
+
+.IF "$(GUI)" == "UNX"
+LIB1ARCHIV=$(LB)$/lib$(TARGET)$(DLLPOSTFIX).a
+.ENDIF
+
+# ------------------------------------------------------------------
+SHL2OBJS = $(SLOFILES)
+
+SHL2TARGET= $(TARGET)_DLL
+SHL2STDLIBS+=\
+ $(SALLIB)
+
+SHL2DEPN=
+SHL2IMPLIB= i$(SHL2TARGET)
+SHL2DEF= $(MISC)$/$(SHL2TARGET).def
+
+DEF2NAME =$(SHL2TARGET)
+DEF2EXPORTFILE= export.exp
+
+#----------------------------- prog with *.lib file -----------------------------
+
+APP1TARGET= $(TARGET)starter
+APP1OBJS=$(OBJFILES)
+
+APP1STDLIBS=$(SALLIB)
+
+APP1DEPN= $(APP1OBJS) $(LIB1TARGET)
+APP1LIBS= $(LIB1TARGET)
+
+#-------------------------- executable with LIBARCHIV --------------------------
+
+APP2TARGET= $(TARGET)starter2
+APP2OBJS= $(OBJFILES)
+
+APP2STDLIBS=$(SALLIB)
+.IF "$(GUI)" == "UNX"
+APP2STDLIBS+=$(LB)$/lib$(TARGET)$(DLLPOSTFIX).a
+.ENDIF
+.IF "$(GUI)" == "WNT"
+APP2STDLIBS+=$(LIB1TARGET)
+.ENDIF
+
+APP2DEPN= $(APP1OBJS) $(LIB1TARGET)
+APP2LIBS=
+
+#----------------------- executable with dynamic library -----------------------
+
+APP3TARGET= $(TARGET)starter3
+APP3OBJS= $(OBJFILES)
+
+APP3STDLIBS=$(SALLIB)
+
+.IF "$(GUI)" == "WNT"
+APP3STDLIBS+=i$(SHL2TARGET).lib
+.ENDIF
+.IF "$(GUI)" == "UNX"
+APP3STDLIBS+=-l$(SHL2TARGET)
+.ENDIF
+
+APP3DEPN= $(APP1OBJS) $(LIB1TARGET)
+APP3LIBS=
+# APP3DEF=
+
+#----------------------- executable without any other files -----------------------
+
+APP4TARGET= $(TARGET)starter4
+APP4OBJS= $(OBJFILES)
+
+APP4STDLIBS=$(SALLIB)
+
+APP4DEPN= $(APP1OBJS)
+APP4LIBS=
+# APP3DEF=
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
diff --git a/testshl2/workben/dlltest/onefunc.cxx b/testshl2/workben/dlltest/onefunc.cxx
new file mode 100644
index 000000000000..c09963827007
--- /dev/null
+++ b/testshl2/workben/dlltest/onefunc.cxx
@@ -0,0 +1,54 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: onefunc.cxx,v $
+ * $Revision: 1.5 $
+ *
+ * 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_testshl2.hxx"
+
+#include <stdio.h>
+#include <sal/types.h>
+#include "registerfunc.h"
+
+extern "C" void SAL_CALL firstfunc()
+{
+ printf("first func called.\n");
+}
+extern "C" void SAL_CALL secondfunc()
+{
+ printf("second func called.\n");
+}
+
+extern "C" void SAL_CALL registerAllTestFunction(FktRegFuncPtr _pFunc)
+{
+ if (_pFunc)
+ {
+ (_pFunc)(&firstfunc, "firstfunc");
+ (_pFunc)(&secondfunc, "secondfunc");
+ }
+}
diff --git a/testshl2/workben/dlltest/onefuncstarter.cxx b/testshl2/workben/dlltest/onefuncstarter.cxx
new file mode 100644
index 000000000000..2331473577d3
--- /dev/null
+++ b/testshl2/workben/dlltest/onefuncstarter.cxx
@@ -0,0 +1,143 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: onefuncstarter.cxx,v $
+ * $Revision: 1.8 $
+ *
+ * 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_testshl2.hxx"
+
+#include <vector>
+#include <stdio.h>
+#include "registerfunc.h"
+#include <osl/module.hxx>
+#include <osl/process.h>
+#include <osl/file.hxx>
+
+#include <rtl/string.hxx>
+#include <rtl/ustring.hxx>
+
+typedef std::vector<FktPtr> FunctionList;
+FunctionList m_Functions;
+
+extern "C" bool SAL_CALL registerFunc(FktPtr _pFunc, const char* _sFuncName)
+{
+ printf("Function register call for func(%s) successful.\n", _sFuncName);
+ m_Functions.push_back(_pFunc);
+ // FktPtr pFunc = _pFunc;
+ // if (_pFunc)
+ // {
+ // (_pFunc)();
+ // }
+
+ return true;
+}
+
+void callAll()
+{
+ for(FunctionList::const_iterator it = m_Functions.begin();
+ it != m_Functions.end();
+ ++it)
+ {
+ FktPtr pFunc = *it;
+ if (pFunc)
+ {
+ (pFunc)();
+ }
+ }
+}
+
+// void test_link_at_compiletime()
+// {
+// FktRegFuncPtr pRegisterFunc = &registerFunc;
+// registerAll(pRegisterFunc);
+// callAll();
+// }
+
+
+// -----------------------------------------------------------------------------
+rtl::OUString convertPath( rtl::OString const& sysPth )
+{
+ // PRE: String should contain a filename, relativ or absolut
+ rtl::OUString sysPath( rtl::OUString::createFromAscii( sysPth.getStr() ) );
+ rtl::OUString fURL;
+ if ( sysPth.indexOf("..") == 0 )
+ {
+ // filepath contains '..' so it's a relative path make it absolut.
+ rtl::OUString curDirPth;
+ osl_getProcessWorkingDir( &curDirPth.pData );
+ osl::FileBase::getAbsoluteFileURL( curDirPth, sysPath, fURL );
+ }
+ else
+ {
+ osl::FileBase::getFileURLFromSystemPath( sysPath, fURL );
+ }
+ return fURL;
+}
+// -----------------------------------------------------------------------------
+
+void test_link_at_runtime()
+{
+ ::osl::Module* pModule;
+ pModule = new ::osl::Module();
+ // create and load the module (shared library)
+ // pModule = new ::osl::Module();
+#if (defined WNT) || (defined OS2)
+ pModule->load( convertPath( rtl::OString( "onefunc_DLL.dll" ) ) );
+#endif
+#ifdef UNX
+ pModule->load( convertPath( rtl::OString( "libonefunc_DLL.so" ) ) );
+#endif
+
+ // get entry pointer
+ FktRegAllPtr pFunc = (FktRegAllPtr) pModule->getSymbol( rtl::OUString::createFromAscii( "registerAllTestFunction" ) );
+
+ if (pFunc)
+ {
+ FktRegFuncPtr pRegisterFunc = &registerFunc;
+ pFunc(pRegisterFunc);
+ callAll();
+ }
+
+ delete pModule;
+}
+
+
+
+// ----------------------------------- Main -----------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int argc, char* argv[] )
+#else
+int _cdecl main( int argc, char* argv[] )
+#endif
+{
+ (void) argc;
+ (void) argv;
+// test_link_at_compiletime();
+ test_link_at_runtime();
+ return 0;
+}
diff --git a/testshl2/workben/dlltest/registerfunc.h b/testshl2/workben/dlltest/registerfunc.h
new file mode 100644
index 000000000000..19a3cd99e4ba
--- /dev/null
+++ b/testshl2/workben/dlltest/registerfunc.h
@@ -0,0 +1,44 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: registerfunc.h,v $
+ * $Revision: 1.4 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+#ifndef _register_h
+#define _register_h
+
+#include <sal/types.h>
+
+typedef void (* FktPtr)(void);
+// register the given void* as a function pointer, true, if successful
+extern "C" bool SAL_CALL registerFunc(FktPtr aFunc, const char* aFuncName);
+
+typedef bool (* FktRegFuncPtr)(FktPtr aFunc, const char* aFuncName);
+extern "C" void SAL_CALL registerAllTestFunction(FktRegFuncPtr aFunc);
+
+typedef void (* FktRegAllPtr)(FktRegFuncPtr aFunc);
+#endif
diff --git a/testshl2/workben/examples/makefile.mk b/testshl2/workben/examples/makefile.mk
new file mode 100644
index 000000000000..8ae856d463c2
--- /dev/null
+++ b/testshl2/workben/examples/makefile.mk
@@ -0,0 +1,68 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.4 $
+#
+# 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=..$/..
+PRJINC=
+
+PRJNAME=testshl2
+TARGET=demotest
+TARGETTYPE=CUI
+
+ENABLE_EXCEPTIONS=TRUE
+#USE_LDUMP2=TRUE
+#LDUMP2=LDUMP3
+
+# --- Settings -----------------------------------------------------
+.INCLUDE : settings.mk
+
+# ------------------------------------------------------------------
+
+#--------------------------------- Objectfiles ---------------------------------
+SLOFILES=$(SLO)$/testshl_test.obj
+
+# ------------------------------------------------------------------
+SHL2OBJS = $(SLOFILES)
+
+SHL2TARGET= $(TARGET)
+SHL2STDLIBS=\
+ $(SALLIB) \
+ $(SOLARLIBDIR)$/cppunit.lib
+
+SHL2DEPN=
+SHL2IMPLIB= i$(SHL2TARGET)
+SHL2DEF= $(MISC)$/$(SHL2TARGET).def
+
+DEF2NAME =$(SHL2TARGET)
+DEF2EXPORTFILE= export.exp
+
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/testshl2/workben/examples/testshl_test.cxx b/testshl2/workben/examples/testshl_test.cxx
new file mode 100644
index 000000000000..c667c655958d
--- /dev/null
+++ b/testshl2/workben/examples/testshl_test.cxx
@@ -0,0 +1,289 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: testshl_test.cxx,v $
+ * $Revision: 1.5 $
+ *
+ * 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_testshl2.hxx"
+
+#include <stdio.h>
+
+#ifdef WNT
+// #define UNDER_WINDOWS_DEBUGGING
+// Nice feature, to debug under windows, install msdev locally and use DebugBreak() to stop a new process at a point you want.
+#ifdef UNDER_WINDOWS_DEBUGGING
+#include <tools/presys.h>
+#include <windows.h>
+#include <tools/postsys.h>
+
+#define VCL_NEED_BASETSD
+
+#endif /* UNDER_WINDOWS_DEBUGGING */
+#endif /* WNT */
+
+
+#include <vector>
+
+
+#ifndef _SAL_TRES_H_
+#include <rtl/tres.h>
+#endif
+
+#ifndef _TESTSHL_TSTMGR_H_
+#include "tstmgr.h"
+#endif
+
+#ifndef _RTL_STRING_HXX_
+ #include <rtl/string.hxx>
+#endif
+
+#include <osl/time.h>
+
+using namespace std;
+
+
+/**
+ * create bitmap of comandline parameters
+ */
+sal_uInt32 createFlags( vector< sal_Char* > const& cmdln )
+{
+ sal_uInt32 retflags = rtl_tres_Flag_OK;
+
+ vector< sal_Char* >::const_iterator iter = cmdln.begin();
+ while( iter != cmdln.end() )
+ {
+ fprintf( stderr, "%s\n", *iter );
+ if ( *iter[0] == '-' )
+ {
+ rtl::OString item( *iter );
+ if ( item == "-boom" )
+ retflags |= rtl_tres_Flag_BOOM;
+
+ if ( item == "-verbose" )
+ retflags |= rtl_tres_Flag_VERBOSE;
+
+ if ( item == "-skip" )
+ retflags |= rtl_tres_Flag_SKIP;
+
+ if ( item == "-log" )
+ retflags |= rtl_tres_Flag_LOG;
+
+ if ( item == "-his" )
+ retflags |= rtl_tres_Flag_HIS;
+
+ if ( item == "-time" )
+ retflags |= rtl_tres_Flag_TIME;
+
+ if ( item == "-msg" )
+ retflags |= rtl_tres_Flag_MSG;
+
+ if ( item == "-quiet" )
+ retflags |= rtl_tres_Flag_QUIET;
+ }
+ iter++;
+ }
+
+ return retflags;
+}
+
+sal_uInt32 createFlags(int argc, char* argv[])
+{
+ vector< sal_Char* > cmdln;
+ sal_Int32 i;
+
+ /* collect comandline */
+ for ( i = 1; i < argc; i++ )
+ cmdln.push_back( argv[i] );
+
+ return createFlags(cmdln);
+}
+
+// -----------------------------------------------------------------------------
+
+/**
+ * display usage screen
+ */
+
+void usage()
+{
+ fprintf( stdout,
+ "USAGE: testshl shlname scename [-boom][-verbose][-log][-his][-msg]\n" );
+ exit(0);
+}
+
+
+#include <fstream>
+#include <cppunit/TestFixture.h>
+#include <cppunit/TestCaller.h>
+#include <cppunit/TestSuite.h>
+#include <cppunit/TestResult.h>
+#include <cppunit/TestResultCollector.h>
+#include <cppunit/TestAssert.h>
+#include <cppunit/TextTestResult.h>
+
+namespace CppunitTest
+{
+ class AStringTest : public CppUnit::TestCase
+ {
+ rtl::OString *m_pStr;
+ public:
+ AStringTest()
+ :m_pStr(NULL) {}
+
+ void setUp()
+ {
+ m_pStr = new rtl::OString("test1");
+ // throw std::exception("initialization failed.");
+ }
+
+ void tearDown()
+ {
+ delete m_pStr;
+ }
+
+ void testEquality()
+ {
+ CPPUNIT_ASSERT( *m_pStr == "test1" );
+ CPPUNIT_ASSERT( (*m_pStr).equalsIgnoreAsciiCase("Test1") );
+ CPPUNIT_ASSERT( (*m_pStr).equalsIgnoreAsciiCase("Test2") );
+ CPPUNIT_ASSERT( *m_pStr == "test1" );
+ CPPUNIT_ASSERT( *m_pStr == "must also fail" );
+ }
+ void testEquality2()
+ {
+ rtl::OString aStr("test2");
+ CPPUNIT_ASSERT( aStr == "test2" );
+ CPPUNIT_ASSERT_MESSAGE("ein vergleichstest", aStr == "test2");
+ CPPUNIT_ASSERT( aStr == "must also fail" );
+ }
+ void testThrow()
+ {
+ throw std::exception("an own exception!");
+ CPPUNIT_ASSERT( *m_pStr == "test2" );
+ }
+ };
+
+ CppUnit::TestSuite *suite1()
+ {
+ CppUnit::TestSuite *suite = new CppUnit::TestSuite( "AStringTest" );
+
+ // CppUnit::TestSuite suite;
+ // CppUnit::TextTestResult result;
+
+ suite->addTest( new CppUnit::TestCaller<AStringTest>( "throw test", &AStringTest::testThrow ));
+// suite->addTest( new CppUnit::TestCaller<AStringTest>( "test op eq", &AStringTest::testEquality ));
+// suite->addTest( new CppUnit::TestCaller<AStringTest>( "test op eq", &AStringTest::testEquality2 ));
+
+ return suite;
+ }
+
+ // -----------------------------------------------------------------------------
+
+ class ASimpleTest : public CppUnit::TestCase
+ {
+ public:
+ void testEqual()
+ {
+ CPPUNIT_ASSERT( 1 == 1 );
+ }
+ };
+
+ CppUnit::TestSuite *suite2()
+ {
+ CppUnit::TestSuite *suite = new CppUnit::TestSuite( "A simple test" );
+
+ // CppUnit::TestSuite suite;
+ // CppUnit::TextTestResult result;
+
+ suite->addTest( new CppUnit::TestCaller<ASimpleTest>( "1 == 1", &ASimpleTest::testEqual ));
+
+ return suite;
+ }
+
+ // -----------------------------------------------------------------------------
+
+ CppUnit::TestSuite *suite()
+ {
+ CppUnit::TestSuite *suite = new CppUnit::TestSuite( "A simple test" );
+
+ // CppUnit::TestSuite suite;
+ // CppUnit::TextTestResult result;
+
+ suite->addTest( suite1() );
+// suite->addTest( suite2() );
+
+ return suite;
+ }
+}
+
+void cppunitbased_test()
+{
+ {
+ // ofstream out("c:\\temp\\output.txt", ios::out);
+ CppUnit::TextTestResult aResult;
+
+ CppUnit::TestSuite* pSuite = CppunitTest::suite();
+
+ int nTests = pSuite->countTestCases();
+ pSuite->run(&aResult);
+
+ // aResult.print(out);
+ cout << aResult;
+
+ delete pSuite;
+ }
+
+ exit(1);
+}
+
+// ----------------------------------- Main -----------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int argc, char* argv[] )
+#else
+int _cdecl main( int argc, char* argv[] )
+#endif
+{
+ cppunitbased_test();
+
+ tslTestManager hMgr = 0;
+
+ /* show usage screen if too less parameters */
+ if ( argc < 3 )
+ usage();
+
+#ifdef UNDER_WINDOWS_DEBUGGING
+ DebugBreak();
+#endif
+
+ sal_uInt32 nCmdlinebitflags = createFlags( argc, argv );
+
+ hMgr = tsl_TestManager_create( argv, argc, nCmdlinebitflags );
+ tsl_TestManager_run( hMgr );
+ tsl_TestManager_destroy( hMgr );
+ return 0;
+}
diff --git a/testshl2/workben/garbage_dump/float.cxx b/testshl2/workben/garbage_dump/float.cxx
new file mode 100644
index 000000000000..08a36e0cdcd0
--- /dev/null
+++ b/testshl2/workben/garbage_dump/float.cxx
@@ -0,0 +1,140 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: float.cxx,v $
+ * $Revision: 1.4 $
+ *
+ * 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_testshl2.hxx"
+#include <stdio.h>
+#include <double>
+#include <math.h> // fabs()
+// #include <sal/types.h>
+
+#define sal_Int16 short
+#define SAL_CALL
+
+// LLA: from kernel.h
+/*
+ * min()/max() macros that also do
+ * strict type-checking.. See the
+ * "unnecessary" pointer comparison.
+ */
+#define MIN(x,y) ({ \
+ const typeof(x) _x = (x); \
+ const typeof(y) _y = (y); \
+ (void) (&_x == &_y); \
+ _x < _y ? _x : _y; })
+
+#define MAX(x,y) ({ \
+ const typeof(x) _x = (x); \
+ const typeof(y) _y = (y); \
+ (void) (&_x == &_y); \
+ _x > _y ? _x : _y; })
+
+//------------------------------------------------------------------------
+// testing the method toDouble()
+//------------------------------------------------------------------------
+template<class T>
+sal_Int16 SAL_CALL test_rtl_OString_checkPrecisionSize()
+{
+ sal_Int16 nSize = sizeof(T);
+ T nCalcValue = 1.0;
+
+ // (i + 1) is the current precision
+ sal_Int16 i = 0;
+ for (i=0;i<50;i++)
+ {
+ nCalcValue *= 10;
+ T nValue = nCalcValue + 0.1;
+ T dSub = nValue - nCalcValue;
+ // ----- 0.11 ---- 0.1 ---- 0.09 -----
+ if (0.11 > dSub && dSub < 0.09)
+ {
+ // due to the fact, that the value is break down we sub 1 from the precision value
+ // but to suppress this, we start at zero, precision is i+1 till here --i;
+ break;
+ }
+ }
+
+ sal_Int16 j= 0;
+ nCalcValue = 1.0;
+ for (j=0;j<50;j++)
+ {
+ nCalcValue /= 10;
+ T nValue = nCalcValue + 1.0;
+ T dSub = nValue - 1.0;
+ // ---- 0.02 ----- 0.01 ---- 0 --- -0.99 ---- -0.98 ----
+ T dSubAbsolut = fabs(dSub);
+ // ---- 0.02 ----- 0.01 ---- 0 (cut)
+ if ( dSub == 0)
+ break;
+ }
+ if (i != j)
+ {
+ // hmmm....
+ // imho i +- 1 == j is a good value
+ int n = i - j;
+ if (n < 0) n = -n;
+ if (n <= 1)
+ {
+ return MIN(i,j);
+ }
+ else
+ {
+ printf("warning: presision differs more than 1");
+ }
+ }
+
+ return i;
+}
+
+void SAL_CALL test_precision( )
+{
+ sal_Int16 nPrecision;
+ nPrecision = test_rtl_OString_checkPrecisionSize<float>();
+ nPrecision = test_rtl_OString_checkPrecisionSize<double>();
+ nPrecision = test_rtl_OString_checkPrecisionSize<long double>();
+ nPrecision = test_rtl_OString_checkPrecisionSize<Double>();
+}
+
+// ----------------------------------- Main -----------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int argc, char* argv[] )
+#else
+int main( int argc, char* argv[] )
+#endif
+{
+ test_precision();
+ return 0;
+}
+
+// The following sets variables for GNU EMACS
+// Local Variables:
+// tab-width:4
+// End:
diff --git a/testshl2/workben/garbage_dump/nippondir.cxx b/testshl2/workben/garbage_dump/nippondir.cxx
new file mode 100644
index 000000000000..24146eec4a45
--- /dev/null
+++ b/testshl2/workben/garbage_dump/nippondir.cxx
@@ -0,0 +1,319 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: nippondir.cxx,v $
+ * $Revision: 1.5 $
+ *
+ * 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_testshl2.hxx"
+
+#include <iostream>
+#include<osl/file.hxx>
+
+#include<osl/thread.hxx>
+#include <tools/string.hxx>
+
+// -----------------------------------------------------------------------------
+// ---------------------------------- defines ----------------------------------
+// -----------------------------------------------------------------------------
+#ifndef ASCII
+#define ASCII(x) OUString::createFromAscii(x)
+#endif
+
+using namespace osl;
+using namespace rtl;
+using namespace std;
+
+
+ostream& operator << (ostream& out, rtl::OUString const& aStr)
+{
+ sal_Unicode const* const pStr = aStr.getStr();
+ sal_Unicode const* const pEnd = pStr + aStr.getLength();
+ for (sal_Unicode const* p = pStr; p < pEnd; ++p)
+ if (0 < *p && *p < 127) // ASCII
+ out << char(*p);
+ else
+ out << "[\\u" << hex << *p << "]";
+ return out;
+}
+
+
+inline void operator <<= (::rtl::OUString& _rUnicodeString, const sal_Char* _pAsciiString)
+{
+ _rUnicodeString = ::rtl::OUString::createFromAscii(_pAsciiString);
+}
+
+inline void operator <<= (::rtl::OUString& _rUnicodeString, const ::rtl::OString& _rAsciiString)
+{
+ _rUnicodeString <<= _rAsciiString.getStr();
+}
+
+/*
+inline void operator <<= (Any& _rUnoValue, const sal_Char* _pAsciiString)
+{
+ _rUnoValue <<= ::rtl::OUString::createFromAscii(_pAsciiString);
+}
+
+inline void operator <<= (Any& _rUnoValue, const ::rtl::OString& _rAsciiString)
+{
+ _rUnoValue <<= _rAsciiString.getStr();
+}
+*/
+
+inline void operator <<= (::rtl::OString& _rAsciiString, ::rtl::OUString const& _rUnicodeString )
+{
+ _rAsciiString = rtl::OUStringToOString(_rUnicodeString, RTL_TEXTENCODING_ASCII_US).getStr();
+}
+// -----------------------------------------------------------------------------
+
+namespace FileHelper
+{
+ rtl::OUString createOSLErrorString(FileBase::RC eError)
+ {
+ rtl::OUString aRet;
+ switch(eError)
+ {
+ case osl_File_E_None:
+ break;
+
+ case osl_File_E_PERM:
+ aRet = ASCII("Operation not permitted");
+ break;
+
+ case osl_File_E_NOENT:
+ aRet = ASCII("No such file or directory");
+ break;
+
+ case osl_File_E_SRCH:
+ aRet = ASCII("unknown error: osl_File_E_SRCH");
+ break;
+
+ case osl_File_E_INTR:
+ aRet = ASCII("function call was interrupted");
+ break;
+
+ case osl_File_E_IO:
+ aRet = ASCII("I/O error");
+ break;
+
+ case osl_File_E_NXIO:
+ aRet = ASCII("No such device or address");
+ break;
+
+ case osl_File_E_2BIG:
+ aRet = ASCII("unknown error: osl_File_E_2BIG");
+ break;
+
+ case osl_File_E_NOEXEC:
+ aRet = ASCII("unknown error: osl_File_E_NOEXEC");
+ break;
+
+ case osl_File_E_BADF:
+ aRet = ASCII("Bad file");
+ break;
+
+ case osl_File_E_CHILD:
+ aRet = ASCII("unknown error: osl_File_E_CHILD");
+ break;
+
+ case osl_File_E_AGAIN:
+ aRet = ASCII("Operation would block");
+ break;
+
+ case osl_File_E_NOMEM:
+ aRet = ASCII("not enough memory for allocating structures");
+ break;
+
+ case osl_File_E_ACCES:
+ aRet = ASCII("Permission denied");
+ break;
+
+ case osl_File_E_FAULT:
+ aRet = ASCII("Bad address");
+ break;
+
+ case osl_File_E_BUSY:
+ aRet = ASCII("Text file busy");
+ break;
+
+ case osl_File_E_EXIST:
+ aRet = ASCII("File exists");
+ break;
+
+ case osl_File_E_XDEV:
+ aRet = ASCII("unknown error: osl_File_E_XDEV");
+ break;
+
+ case osl_File_E_NODEV:
+ aRet = ASCII("No such device");
+ break;
+
+ case osl_File_E_NOTDIR:
+ aRet = ASCII("Not a directory");
+ break;
+
+ case osl_File_E_ISDIR:
+ aRet = ASCII("Is a director");
+ break;
+
+ case osl_File_E_INVAL:
+ aRet = ASCII("the format of the parameters was not valid");
+ break;
+
+ case osl_File_E_NFILE:
+ aRet = ASCII("too many open files in the system");
+ break;
+
+ case osl_File_E_MFILE:
+ aRet = ASCII("too many open files used by the process");
+ break;
+
+ case osl_File_E_NOTTY:
+ aRet = ASCII("unknown error: osl_File_E_NOTTY");
+ break;
+
+ case osl_File_E_FBIG:
+ aRet = ASCII("File too large");
+ break;
+
+ case osl_File_E_NOSPC:
+ aRet = ASCII("No space left on device");
+ break;
+
+ case osl_File_E_SPIPE:
+ aRet = ASCII("unknown error: osl_File_E_SPIPE");
+ break;
+
+ case osl_File_E_ROFS:
+ aRet = ASCII("Read-only file system");
+ break;
+
+ case osl_File_E_MLINK:
+ aRet = ASCII("Too many links");
+ break;
+
+ case osl_File_E_PIPE:
+ aRet = ASCII("unknown error: osl_File_E_PIPE");
+ break;
+
+ case osl_File_E_DOM:
+ aRet = ASCII("unknown error: osl_File_E_DOM");
+ break;
+
+ case osl_File_E_RANGE:
+ aRet = ASCII("unknown error: osl_File_E_RANGE");
+ break;
+
+ case osl_File_E_DEADLK:
+ aRet = ASCII("unknown error: osl_File_E_DEADLK");
+ break;
+
+ case osl_File_E_NAMETOOLONG:
+ aRet = ASCII("File name too long");
+ break;
+
+ case osl_File_E_NOLCK:
+ aRet = ASCII("No record locks available");
+ break;
+
+ case osl_File_E_NOSYS:
+ aRet = ASCII("Function not implemente");
+ break;
+
+ case osl_File_E_NOTEMPTY:
+ aRet = ASCII("Directory not empt");
+ break;
+
+ case osl_File_E_LOOP:
+ aRet = ASCII("Too many symbolic links encountered");
+ break;
+
+ case osl_File_E_ILSEQ:
+ aRet = ASCII("unknown error: osl_File_E_ILSEQ");
+ break;
+
+ case osl_File_E_NOLINK:
+ aRet = ASCII("Link has been severed");
+ break;
+
+ case osl_File_E_MULTIHOP:
+ aRet = ASCII("Multihop attempted");
+ break;
+
+ case osl_File_E_USERS:
+ aRet = ASCII("unknown error: osl_File_E_USERS");
+ break;
+
+ case osl_File_E_OVERFLOW:
+ aRet = ASCII("Value too large for defined data type");
+ break;
+
+ /* unmapped error: always last entry in enum! */
+ case osl_File_E_invalidError:
+ aRet = ASCII("unmapped Error");
+ break;
+ }
+ return aRet;
+ }
+} // namespace FileHelper
+
+
+#if (defined UNX) || (defined OS2)
+void main( int argc, char * argv[] )
+#else
+void _cdecl main( int argc, char * argv[] )
+#endif
+{
+
+ OUString aDirectory(OUString::createFromAscii("file:///C:/%E6%96%B0%E3%81%97%E3%81%84%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80"));
+// OUString aDirex(OUString::createFromAscii("file:///C:/%C2%90V%E2%80%9A%C2%B5%E2%80%9A%C2%A2%C6%92t%C6%92H%C6%92%E2%80%B9%C6%92_"));
+
+ osl::FileBase::RC eError = osl::Directory::create(aDirectory);
+ if (eError != osl::FileBase::E_None)
+ {
+ OUString aUStr = FileHelper::createOSLErrorString(eError);
+ OString aStr;
+ aStr <<= aUStr;
+ OSL_ENSURE(false, aStr.getStr());
+ }
+
+// OUString suSystemPath, aTmp;
+// FileBase::RC aRC = FileBase::getSystemPathFromFileURL( aDirectory, suSystemPath );
+//
+// String suSystemPathAsString(suSystemPath);
+// ByteString sSystemPath(suSystemPathAsString, osl_getThreadTextEncoding());
+//
+//
+// ByteString sSystemPathNew = sSystemPath;
+// UniString suSystemPathNew(sSystemPathNew, osl_getThreadTextEncoding());
+// FileBase::RC aRC2 = FileBase::getFileURLFromSystemPath( suSystemPathNew, aTmp );
+
+//
+// aRC = FileBase::getSystemPathFromFileURL( aDirex, aTmp );
+// aRC2 = FileBase::getFileURLFromSystemPath( aTmp, aTmp2 );
+}
+
diff --git a/testshl2/workben/garbage_dump/some_tips.cxx b/testshl2/workben/garbage_dump/some_tips.cxx
new file mode 100644
index 000000000000..b68b83235ebf
--- /dev/null
+++ b/testshl2/workben/garbage_dump/some_tips.cxx
@@ -0,0 +1,129 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: some_tips.cxx,v $
+ * $Revision: 1.4 $
+ *
+ * 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_testshl2.hxx"
+#include <cppunit/simpleheader.hxx>
+
+namespace rtl_ByteSequence
+{
+// -----------------------------------------------------------------------
+// call this before any other classes
+// -----------------------------------------------------------------------
+class OSingleton
+{
+public:
+ static OSingleton * GetSingleton();
+ virtual ~OSingleton() {}
+protected :
+ OSingleton()
+ {
+ printf("Do something before.\n");
+ }
+
+ static OSingleton * m_pSingleton;
+};
+
+OSingleton * OSingleton::m_pSingleton = NULL;
+OSingleton * OSingleton::GetSingleton()
+{
+ if(m_pSingleton == NULL )
+ {
+ m_pSingleton = new OSingleton;
+ }
+ return m_pSingleton;
+}
+
+// -----------------------------------------------------------------------------
+
+class before : public CppUnit::TestFixture
+{
+protected:
+ before()
+ {
+ OSingleton::GetSingleton();
+ }
+};
+
+// -----------------------------------------------------------------------------
+
+class GlobalObject
+{
+public:
+ GlobalObject()
+ {
+ // do nothing here
+ }
+ ~GlobalObject()
+ {
+ printf("shutdown");
+ }
+};
+
+GlobalObject theGlobalObject;
+
+// -----------------------------------------------------------------------------
+class assign : public before
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void assign_001()
+ {
+ }
+
+ CPPUNIT_TEST_SUITE(assign);
+ CPPUNIT_TEST(assign_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class operator=
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ByteSequence::assign, "rtl_ByteSequence");
+} // namespace ByteSequence
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+void RegisterAdditionalFunctions(FktRegFuncPtr _pFunc)
+{
+ printf("init your work here\n");
+}
+// NOADDITIONAL;
diff --git a/testshl2/workben/getopt/makefile.mk b/testshl2/workben/getopt/makefile.mk
new file mode 100644
index 000000000000..756bc3bc7a94
--- /dev/null
+++ b/testshl2/workben/getopt/makefile.mk
@@ -0,0 +1,64 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.4 $
+#
+# 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=..$/..
+PRJINC=
+
+PRJNAME=testshl2
+TARGET=test_getopt
+TARGETTYPE=CUI
+
+ENABLE_EXCEPTIONS=TRUE
+#USE_LDUMP2=TRUE
+#LDUMP2=LDUMP3
+
+# --- Settings -----------------------------------------------------
+.INCLUDE : settings.mk
+
+# ------------------------------------------------------------------
+#--------------------------------- Objectfiles ---------------------------------
+OBJFILES=\
+ $(OBJ)$/getopt.obj \
+ $(OBJ)$/filehelper.obj \
+ $(OBJ)$/test_getopt.obj
+
+#----------------------------- prog with *.lib file -----------------------------
+
+APP1TARGET= $(TARGET)
+APP1OBJS=$(OBJFILES)
+
+APP1STDLIBS=$(SALLIB)
+
+APP1DEPN= $(APP1OBJS)
+APP1LIBS=
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/testshl2/workben/getopt/test_getopt.cxx b/testshl2/workben/getopt/test_getopt.cxx
new file mode 100644
index 000000000000..381afc240e3e
--- /dev/null
+++ b/testshl2/workben/getopt/test_getopt.cxx
@@ -0,0 +1,143 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: test_getopt.cxx,v $
+ * $Revision: 1.5 $
+ *
+ * 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_testshl2.hxx"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef SOLARIS
+#include <sys/time.h>
+#endif
+
+#ifdef WNT
+// #define UNDER_WINDOWS_DEBUGGING
+// Nice feature, to debug under windows, install msdev locally and use DebugBreak() to stop a new process at a point you want.
+#ifdef UNDER_WINDOWS_DEBUGGING
+#include <tools/presys.h>
+#include <windows.h>
+#include <tools/postsys.h>
+
+#define VCL_NEED_BASETSD
+
+#endif /* UNDER_WINDOWS_DEBUGGING */
+#endif /* WNT */
+
+#include <iostream>
+#include <vector>
+#include <rtl/string.hxx>
+
+#include "filehelper.hxx"
+#include "getopt.hxx"
+
+// #include <osl/time.h>
+
+using namespace std;
+
+// -----------------------------------------------------------------------------
+
+/**
+ * display usage screen
+ */
+
+void usage()
+{
+ fprintf( stdout,
+ "USAGE: testshl shlname [-boom][-verbose][-log][-his][-msg]\n" );
+ exit(0);
+}
+
+// ----------------------------------- Main -----------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int argc, char* argv[] )
+#else
+int _cdecl main( int argc, char* argv[] )
+#endif
+{
+ (void) argc;
+ static char const* optionSet[] = {
+ "-boom, stop near error position, exception only",
+ "-mode=s, the output mode, emacs, xml, old. Default is -mode old",
+ "-logPath=s, destination path for logging",
+ "-tc=s@, name(s) of testcase(s) to generate",
+ "-h:s, display help or help on option",
+ "-help:s, see -h",
+ NULL
+ };
+
+ GetOpt opt( argv, optionSet );
+
+ // someone indicates that he needs help
+ if ( opt.hasOpt( "-h" ) || opt.hasOpt( "-help" ) )
+ {
+ opt.showUsage();
+ // exit(0);
+ }
+
+ // get path for logging stuff..
+ rtl::OString logPth;
+ // ...if available
+ if ( opt.hasOpt( "-logPth" ))
+ {
+ logPth = opt.getOpt( "-logPth" );
+ }
+
+ rtl::OString param;
+ if ( ! opt.getParams().empty() ) {
+ param = opt.getFirstParam();
+
+ std::cout << "all non '-' Parameter values" << std::endl;
+
+ vector<rtl::OString>& aVec = opt.getParams();
+ for(vector<rtl::OString>::const_iterator it = aVec.begin();
+ it != aVec.end();
+ ++it)
+ {
+ std::cout << (*it).getStr() << std::endl;
+ }
+ }
+
+ if ( opt.hasOpt("-tc"))
+ {
+ std::cout << "Parameter -tc" << std::endl;
+ vector<rtl::OString>& aVec = opt.getOptVec( "-tc" );
+
+ for(vector<rtl::OString>::const_iterator it = aVec.begin();
+ it != aVec.end();
+ ++it)
+ {
+ std::cout << (*it).getStr() << std::endl;
+ }
+ }
+
+ return 0;
+}
+
diff --git a/testshl2/workben/makefile.mk b/testshl2/workben/makefile.mk
new file mode 100644
index 000000000000..c7bffc83b982
--- /dev/null
+++ b/testshl2/workben/makefile.mk
@@ -0,0 +1,130 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.8 $
+#
+# 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=..
+PRJINC=
+
+PRJNAME=testshl2
+TARGET=test_autoptr
+TARGETTYPE=CUI
+
+ENABLE_EXCEPTIONS=TRUE
+#USE_LDUMP2=TRUE
+#LDUMP2=LDUMP3
+
+# --- Settings -----------------------------------------------------
+.INCLUDE : settings.mk
+
+# ------------------------------------------------------------------
+#--------------------------------- Objectfiles ---------------------------------
+OBJFILES=\
+ $(OBJ)$/test_autoptr.obj \
+ $(OBJ)$/test_ostringstream.obj
+
+#----------------------------- prog with *.lib file -----------------------------
+
+APP1TARGET= $(TARGET)
+APP1OBJS=$(OBJ)$/test_autoptr.obj
+
+APP1STDLIBS=$(SALLIB)
+
+APP1DEPN= $(APP1OBJS)
+APP1LIBS=
+
+#-------------------------------------------------------------------------------
+
+APP2TARGET= test_ostringstream
+APP2OBJS=$(OBJ)$/test_ostringstream.obj
+
+APP2STDLIBS=$(SALLIB)
+
+APP2DEPN= $(APP1OBJS)
+APP2LIBS=
+#-------------------------------------------------------------------------------
+
+APP3TARGET= test_filter
+APP3OBJS=$(OBJ)$/test_filter.obj
+
+APP3STDLIBS=$(SALLIB)
+
+APP3DEPN= $(APP1OBJS)
+APP3LIBS=
+#-------------------------------------------------------------------------------
+
+# APP4TARGET= test_member
+# APP4OBJS=$(OBJ)$/test_member.obj
+#
+# APP4STDLIBS=$(SALLIB)
+#
+# APP4DEPN=
+ # APP4LIBS=
+
+
+#-------------------------------------------------------------------------------
+
+# APP5TARGET= test_very_long_names
+# APP5OBJS=$(OBJ)$/test_very_long_names.obj
+#
+# APP5STDLIBS=$(SALLIB)
+#
+# APP5DEPN=
+# APP5LIBS=
+
+
+#-------------------------------------------------------------------------------
+
+APP6TARGET= test_string
+APP6OBJS=$(OBJ)$/test_string.obj
+
+APP6STDLIBS=$(SALLIB)
+
+APP6DEPN=
+APP6LIBS=
+#-------------------------------------------------------------------------------
+
+APP7TARGET= test_printf
+APP7OBJS=$(OBJ)$/test_printf.obj
+
+APP7STDLIBS=$(SALLIB)
+
+APP7DEPN=
+APP7LIBS=
+#-------------------------------------------------------------------------------
+
+APP8TARGET= test_preproc
+APP8OBJS=$(OBJ)$/test_preproc.obj
+
+APP8STDLIBS=$(SALLIB)
+
+APP8DEPN=
+APP8LIBS=
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/testshl2/workben/runner/unxlngi4.config.file b/testshl2/workben/runner/unxlngi4.config.file
new file mode 100644
index 000000000000..783b56950e20
--- /dev/null
+++ b/testshl2/workben/runner/unxlngi4.config.file
@@ -0,0 +1,34 @@
+# Testshl2Runner
+
+# what is need to start?
+
+PRE1 = setenv SHELL /bin/tcsh
+PRE2 = source ~/staroffice.cshrc
+
+SHELL = /bin/tcsh
+BUILD = udk305
+ENV = unxlngi4
+LOCALENV = /usr/qaapi/projects/solartmp
+BASEDIR = /usr/qaapi/projects
+PROJECTNAME= sal
+INPUT = qa
+OUTPUT = qa
+
+# JOBFILE = $(PROJECTDIR)/$(PROJECTNAME)/$(INPUT)/jobs.txt
+JOBFILE = jobs.txt
+
+TESTTOOL = testshl2
+BATCHFILE = runTestshl.sh
+
+# Hardcoded
+# if ENV == "wnt..."
+# bin
+# if ENV == "unx..."
+# lib
+# PRJLIB = bin
+
+# nothing to do for post
+# POST1 =
+
+
+
diff --git a/testshl2/workben/runner/unxsols3.config.file b/testshl2/workben/runner/unxsols3.config.file
new file mode 100644
index 000000000000..5af1aa49f0c1
--- /dev/null
+++ b/testshl2/workben/runner/unxsols3.config.file
@@ -0,0 +1,34 @@
+# Testshl2Runner
+
+# what is need to start?
+
+PRE1 = setenv SHELL /bin/tcsh
+PRE2 =
+
+SHELL = /bin/tcsh
+BUILD = udk305
+ENV = unxsols3
+LOCALENV = /usr/qaapi/projects/solartemp
+BASEDIR = /usr/qaapi/projects/udk
+PROJECTNAME= sal
+INPUT = qa
+OUTPUT = qa
+
+# JOBFILE = $(PROJECTDIR)/$(PROJECTNAME)/$(INPUT)/jobs.txt
+JOBFILE = jobs.txt
+
+TESTTOOL = testshl2
+BATCHFILE = runTestshl.sh
+
+# Hardcoded
+# if ENV == "wnt..."
+# bin
+# if ENV == "unx..."
+# lib
+# PRJLIB = bin
+
+# nothing to do for post
+# POST1 =
+
+
+
diff --git a/testshl2/workben/runner/wntmsci9.config.file b/testshl2/workben/runner/wntmsci9.config.file
new file mode 100644
index 000000000000..12aefabcd29c
--- /dev/null
+++ b/testshl2/workben/runner/wntmsci9.config.file
@@ -0,0 +1,46 @@
+# Testshl2Runner
+
+# what is need to start?
+
+# path to find setsolar
+PRE1 = set path=r:\\etw;%PATH%
+
+SHELL = c:\\programme\\4nt\\4nt.exe
+BUILD = udk305
+ENV = wntmsci9
+
+# where to find the output directory
+LOCALENV = d:\\local\\305
+
+# the basedirectory to the sources, before a project
+BASEDIR = d:\\local\\305\\UDK305
+
+# name of the project
+PROJECTNAME= sal
+
+# PROJECTDIR is build within the following: $(BASEDIR)/$(PROJECTNAME)
+
+# INPUT is found in $(PROJECTDIR)
+INPUT = qa_work
+
+# OUTPUT is found in $(PROJECTDIR)/$(ENV)
+OUTPUT = qa_work
+
+# JOBFILE is found in $(PROJECTDIR)/$(INPUT)
+JOBFILE = jobs.txt
+
+TESTTOOL = testshl2
+BATCHFILE = runTestshl.btm
+
+# Hardcoded
+# if ENV == "wnt..."
+# bin
+# if ENV == "unx..."
+# lib
+# PRJLIB = bin
+
+# nothing to do for post
+# POST1 =
+
+
+
diff --git a/testshl2/workben/selftest/README.txt b/testshl2/workben/selftest/README.txt
new file mode 100644
index 000000000000..dbf9cce433d7
--- /dev/null
+++ b/testshl2/workben/selftest/README.txt
@@ -0,0 +1,30 @@
+There seems to be some problems with load test libraries from the right path,
+if the libraries are stored also in the solver directory.
+
+To test this:
+Call dmake to build the libraries in this selftest directory.
+Call deliver to copy one test library into the solver tree.
+Call dmake test to simply test the behaviour.
+
+Some more words:
+
+Per default the test libraries should not deliver but if:
+
+- Linux and Windows will use an absolute path to load the test libraries
+ by dlopen().
+- MacOSX will use local path per default to load the test libraries by
+ dlopen();
+
+If there are problems, there exists 2 new parameters like
+-absolutepath
+-localpath
+
+Just call
+'dmake test TESTOPTADD="-absolutepath"' or
+'dmake test TESTOPTADD="-localpath"' from this directory and see which
+behaviour is the right for your environment.
+
+There exist some environment variables to manipulate the default behaviour
+of load libraries. These are
+LD_LIBRARY_PATH
+DYLD_LIBRARY_PATH (Mac OS X)
diff --git a/testshl2/workben/selftest/delivertest.cxx b/testshl2/workben/selftest/delivertest.cxx
new file mode 100644
index 000000000000..1b59c28206e9
--- /dev/null
+++ b/testshl2/workben/selftest/delivertest.cxx
@@ -0,0 +1,64 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: delivertest.cxx,v $
+ * $Revision: 1.2 $
+ *
+ * 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_testshl2.hxx"
+#include <cppunit/simpleheader.hxx>
+
+namespace delivertest
+{
+//------------------------------------------------------------------------
+// testing constructors
+//------------------------------------------------------------------------
+
+ class ctor : public CppUnit::TestFixture
+ {
+ public:
+ void ctor_001()
+ {
+ CPPUNIT_ASSERT_MESSAGE("Simple testshl2 self test, You have loaded the delivered library, PER DEFAULT THIS IS ABSOLUTLY WRONG. If you have start this test by 'dmake test' please change the behaviour in 'source/dynamicregister.cxx' in the DynamicLibraryHelper::CTor.", sal_False);
+ }
+
+ CPPUNIT_TEST_SUITE(ctor);
+ CPPUNIT_TEST(ctor_001);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+ // -----------------------------------------------------------------------------
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(delivertest::ctor, "delivertest");
+} // delivertest
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+
+NOADDITIONAL;
diff --git a/testshl2/workben/selftest/export.map b/testshl2/workben/selftest/export.map
new file mode 100644
index 000000000000..2718fd9a5cc4
--- /dev/null
+++ b/testshl2/workben/selftest/export.map
@@ -0,0 +1,8 @@
+UDK_3.0 {
+ global:
+ registerAllTestFunction;
+
+ local:
+ *;
+};
+
diff --git a/testshl2/workben/selftest/makefile.mk b/testshl2/workben/selftest/makefile.mk
new file mode 100644
index 000000000000..418a070a3a5d
--- /dev/null
+++ b/testshl2/workben/selftest/makefile.mk
@@ -0,0 +1,91 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.2 $
+#
+# 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=selftest_testshl2
+# this is removed at the moment because we need some enhancements
+# TESTDIR=TRUE
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES= \
+# $(SLO)$/unotest.obj
+
+#----------------------------------- deliver test -----------------------------------
+
+SHL1OBJS= \
+ $(SLO)$/notdeliveredtest.obj
+
+SHL1TARGET= testshl2_deliver_test
+SHL1STDLIBS=\
+ $(SALLIB) \
+ $(CPPUHELPERLIB) \
+ $(COMPHELPERLIB) \
+ $(CPPULIB) \
+ $(CPPUNITLIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP = export.map
+
+#----------------------------------- deliver test -----------------------------------
+
+SHL2OBJS= \
+ $(SLO)$/delivertest.obj
+
+SHL2TARGET= delivertest
+SHL2STDLIBS=\
+ $(SALLIB) \
+ $(CPPUHELPERLIB) \
+ $(COMPHELPERLIB) \
+ $(CPPULIB) \
+ $(CPPUNITLIB)
+
+SHL2IMPLIB= i$(SHL2TARGET)
+
+DEF2NAME =$(SHL2TARGET)
+SHL2VERSIONMAP = export.map
+
+
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/testshl2/workben/selftest/notdeliveredtest.cxx b/testshl2/workben/selftest/notdeliveredtest.cxx
new file mode 100644
index 000000000000..ec5b06d797b6
--- /dev/null
+++ b/testshl2/workben/selftest/notdeliveredtest.cxx
@@ -0,0 +1,64 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: notdeliveredtest.cxx,v $
+ * $Revision: 1.2 $
+ *
+ * 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_testshl2.hxx"
+#include <cppunit/simpleheader.hxx>
+
+namespace delivertest
+{
+//------------------------------------------------------------------------
+// testing constructors
+//------------------------------------------------------------------------
+
+ class ctor : public CppUnit::TestFixture
+ {
+ public:
+ void ctor_001()
+ {
+ CPPUNIT_ASSERT_MESSAGE("Simple testshl2 self test, if you see this error message, the load library test is ok.", sal_False);
+ }
+
+ CPPUNIT_TEST_SUITE(ctor);
+ CPPUNIT_TEST(ctor_001);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+ // -----------------------------------------------------------------------------
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(delivertest::ctor, "delivertest");
+} // delivertest
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+
+NOADDITIONAL;
diff --git a/testshl2/workben/singleton.cxx b/testshl2/workben/singleton.cxx
new file mode 100644
index 000000000000..e561da7257a4
--- /dev/null
+++ b/testshl2/workben/singleton.cxx
@@ -0,0 +1,52 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: singleton.cxx,v $
+ * $Revision: 1.3 $
+ *
+ * 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_testshl2.hxx"
+class OSingleton
+{
+public:
+ static OSingleton * GetSingleton();
+ virtual ~OSingleton(){}
+protected :
+ OSingleton(){}
+ static OSingleton * m_pSingleton;
+};
+
+OSingleton * OSingleton::m_pSingleton = NULL;
+OSingleton * OSingleton::GetSingleton()
+{
+ if(m_pSingleton == NULL )
+ {
+ m_pSingleton = new OSingleton;
+ }
+ return m_pSingleton;
+}
diff --git a/testshl2/workben/skeleton/export.map b/testshl2/workben/skeleton/export.map
new file mode 100644
index 000000000000..4ca70fa85463
--- /dev/null
+++ b/testshl2/workben/skeleton/export.map
@@ -0,0 +1,7 @@
+UDK_3.0 {
+ global:
+ registerAllTestFunction;
+
+ local:
+ *;
+};
diff --git a/testshl2/workben/skeleton/makefile.mk b/testshl2/workben/skeleton/makefile.mk
new file mode 100644
index 000000000000..6821310ccf29
--- /dev/null
+++ b/testshl2/workben/skeleton/makefile.mk
@@ -0,0 +1,55 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.4 $
+#
+# 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 := testshl2
+
+TARGET := testshl2_workben_skeleton
+
+ENABLE_EXCEPTIONS := TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE: settings.mk
+
+SHL1TARGET := $(TARGET)
+SHL1OBJS := \
+ $(SLO)$/skeleton.obj
+
+SHL1IMPLIB := i$(SHL1TARGET)
+SHL1STDLIBS := $(CPPUNITLIB) $(SALLIB)
+SHL1VERSIONMAP := export.map
+DEF1NAME := $(SHL1TARGET)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE: target.mk
+.INCLUDE : _cppunit.mk
diff --git a/testshl2/workben/skeleton/skeleton.cxx b/testshl2/workben/skeleton/skeleton.cxx
new file mode 100644
index 000000000000..98e633cc86be
--- /dev/null
+++ b/testshl2/workben/skeleton/skeleton.cxx
@@ -0,0 +1,82 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: skeleton.cxx,v $
+ * $Revision: 1.4 $
+ *
+ * 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_testshl2.hxx"
+/*
+ * LLA: 20040527
+ */
+#include <cppunit/simpleheader.hxx>
+
+namespace skeleton
+{
+//------------------------------------------------------------------------
+// testing constructors
+//------------------------------------------------------------------------
+
+ class ctor : public CppUnit::TestFixture
+ {
+ public:
+ ctor()
+ {
+ printf("ctor: called\n");
+ }
+
+ void ctor_test()
+ {
+ printf("ctor test: called\n");
+ }
+ void ctor_test2()
+ {
+ printf("ctor test2: called\n");
+ }
+ void ctor_test3()
+ {
+ printf("ctor test3: called\n");
+ }
+
+ CPPUNIT_TEST_SUITE(ctor);
+ CPPUNIT_TEST(ctor_test);
+ CPPUNIT_TEST(ctor_test2);
+ CPPUNIT_TEST(ctor_test3);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+ // -----------------------------------------------------------------------------
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(skeleton::ctor, "skeleton");
+} // unotest
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+
+NOADDITIONAL;
diff --git a/testshl2/workben/test_autoptr.cxx b/testshl2/workben/test_autoptr.cxx
new file mode 100644
index 000000000000..1471c6340714
--- /dev/null
+++ b/testshl2/workben/test_autoptr.cxx
@@ -0,0 +1,103 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: test_autoptr.cxx,v $
+ * $Revision: 1.6 $
+ *
+ * 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_testshl2.hxx"
+
+#include <stdlib.h>
+#include <memory>
+#include <iostream>
+
+#include <stdio.h>
+
+#include <rtl/string.hxx>
+#include <rtl/ustring.hxx>
+
+class AutoPtrTest
+{
+ int m_nValue;
+
+ // NOCOPY
+ AutoPtrTest(AutoPtrTest const& );
+ AutoPtrTest& operator =(AutoPtrTest const& );
+
+public:
+ AutoPtrTest(int _nValue = 1)
+ :m_nValue(_nValue)
+ {
+ std::cout << "build Value" << std::endl;
+ }
+ ~AutoPtrTest()
+ {
+ std::cout << "release Value" << std::endl;
+ m_nValue = 0;
+ }
+// int operator int() const {return m_nValue;}
+ int getValue() const {return m_nValue;}
+};
+
+std::auto_ptr<AutoPtrTest> getPtr()
+{
+ return std::auto_ptr<AutoPtrTest>(new AutoPtrTest(2));
+}
+
+// auto_ptr get() gibt den Pointer ohne das ownership
+// auto_ptr release()gibt den Pointer und (!) das ownership
+
+void test_autoptr()
+{
+ AutoPtrTest *pValuePtr;
+ std::cout << "start test" << std::endl;
+ {
+ std::auto_ptr<AutoPtrTest> pValue = getPtr();
+ std::cout << "Value with getValue() " << pValue->getValue() << std::endl;
+ // std::cout << "Value operator int() " << *pValue << std::endl;
+ // ownership weiterreichen
+ pValuePtr = pValue.release();
+ }
+ std::cout << "ValuePtr with getValue() " << pValuePtr->getValue() << std::endl;
+
+ // ownership an neuen Pointer uebergeben
+ std::auto_ptr<AutoPtrTest> pValue2(pValuePtr);
+
+ // AutoPtrTest *pStr = getPtr();
+ std::cout << "end test" << std::endl;
+}
+
+// ----------------------------------- Main -----------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int /* argc */ , char* /* argv */ [] )
+#else
+ int _cdecl main( int /* argc*/ , char* /*argv*/ [] )
+#endif
+{
+ test_autoptr();
+ return 0;
+}
diff --git a/testshl2/workben/test_filter.cxx b/testshl2/workben/test_filter.cxx
new file mode 100644
index 000000000000..da8cceb748fe
--- /dev/null
+++ b/testshl2/workben/test_filter.cxx
@@ -0,0 +1,233 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: test_filter.cxx,v $
+ * $Revision: 1.6 $
+ *
+ * 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_testshl2.hxx"
+
+#include <vector>
+#include <string>
+#include <iostream>
+#include <rtl/string.hxx>
+
+typedef std::vector<std::string> StringList;
+typedef std::vector<rtl::OString> OStringList;
+
+void split( const rtl::OString& opt,
+ const rtl::OString& _sSeparator,
+ OStringList& optLine )
+{
+ optLine.clear();
+ // const sal_Int32 cSetLen = cSet.getLength();
+ sal_Int32 index = 0;
+ sal_Int32 oldIndex = 0;
+
+ // sal_Int32 i;
+ // sal_Int32 j = 0;
+ while ( opt.getLength() > 0)
+ {
+ // for ( i = 0; i < cSetLen; i++ )
+ // {
+ index = opt.indexOf( _sSeparator, oldIndex);
+ if( index != -1 )
+ {
+ optLine.push_back( opt.copy( oldIndex, index - oldIndex ) );
+ oldIndex = index + _sSeparator.getLength();
+ }
+ // }
+ else // if (index == -1)
+ {
+ optLine.push_back( opt.copy( oldIndex ) );
+ break;
+ }
+ }
+} ///< split
+
+// -----------------------------------------------------------------------------
+
+StringList splitNameAtDot(rtl::OString const& _sName)
+{
+ StringList aList;
+ int nIndex = 0;
+ // int nLastIndex = 0;
+ while ((nIndex = _sName.indexOf(".")) != -1)
+ {
+ rtl::OString nValue;
+ }
+
+ return aList;
+}
+
+// -----------------------------------------------------------------------------
+/*
+bool checkFilter(JobList m_aJobFilter, std::string const& _sNodeName, std::string const& _sName)
+{
+ std::string sFilter = m_aJobFilter.m_aJobList.begin();
+
+ StringList aFilter;
+ aFilter.push_back("rtl_OUString");
+ aFilter.push_back("ctors");
+ aFilter.push_back("*");
+
+ StringList aMyName;
+ aMyName.push_back("rtl_OUString");
+ aMyName.push_back("ctors");
+ aMyName.push_back("ctor_001");
+
+}
+*/
+
+void showList(OStringList const& _sList)
+{
+ for(OStringList::const_iterator it = _sList.begin();
+ it != _sList.end();
+ ++it)
+ {
+ rtl::OString aStr = *it;
+ std::cout << aStr.getStr() << std::endl;
+ }
+}
+
+bool match(OStringList const& _aFilter, OStringList const& _aName)
+{
+ OStringList::const_iterator aFilterIter = _aFilter.begin();
+ OStringList::const_iterator aValueIter = _aName.begin();
+
+ bool bMatch = false;
+
+ while (aFilterIter != _aFilter.end() && aValueIter != _aName.end())
+ {
+ rtl::OString sFilter = *aFilterIter;
+ rtl::OString sName = *aValueIter;
+
+ if (sFilter == sName)
+ {
+ bMatch = true;
+ ++aFilterIter;
+ ++aValueIter;
+ }
+ else if (sFilter == "*")
+ {
+ bMatch = true;
+ break;
+ }
+ else
+ {
+ // Filter does not match
+ bMatch = false;
+ break;
+ }
+ }
+ return bMatch;
+}
+
+// -----------------------------------------------------------------------------
+void test_normal_filter()
+{
+ OStringList aFilter;
+ split("rtl_OUString.ctors.*", ".", aFilter);
+ showList(aFilter);
+
+ OStringList aName;
+ split("rtl_OUString.ctors.ctor_001", ".", aName);
+ showList(aName);
+
+ if (match(aFilter, aName))
+ {
+ std::cout << "Name matches filter." << std::endl;
+ }
+}
+
+void test_normal_filter_other_sep()
+{
+ OStringList aFilter;
+ split("rtl_OUString::ctors::*", "::", aFilter);
+ showList(aFilter);
+
+ OStringList aName;
+ split("rtl_OUString::ctors::ctor_001", "::", aName);
+ showList(aName);
+
+ if (match(aFilter, aName))
+ {
+ std::cout << "Name matches filter." << std::endl;
+ }
+}
+
+void test_no_name()
+{
+ OStringList aFilter;
+ split("rtl_OUString.*", ".", aFilter);
+ showList(aFilter);
+
+ OStringList aName;
+ split("", ".", aName);
+ showList(aName);
+
+ if (match(aFilter, aName))
+ {
+ std::cout << "Name matches filter." << std::endl;
+ }
+}
+
+void test_name_longer_filter()
+{
+ OStringList aFilter;
+ split("rtl_OUString.*", ".", aFilter);
+ showList(aFilter);
+
+ OStringList aName;
+ split("rtl_OUString.ctor.ctor_001", ".", aName);
+ showList(aName);
+
+ if (match(aFilter, aName))
+ {
+ std::cout << "Name matches filter." << std::endl;
+ }
+}
+
+// ----------------------------------- Main -----------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int /* argc */ , char* /* argv */ [] )
+#else
+ int _cdecl main( int /* argc */, char* /* argv */ [] )
+#endif
+{
+ test_normal_filter();
+ test_normal_filter_other_sep();
+ test_no_name();
+ test_name_longer_filter();
+
+ // split("rtl_OUString.*", ".", aFilter);
+ // showList(aFilter);
+
+
+ // test_autoptr();
+ return 0;
+}
diff --git a/testshl2/workben/test_member.cxx b/testshl2/workben/test_member.cxx
new file mode 100644
index 000000000000..6ae812f2862d
--- /dev/null
+++ b/testshl2/workben/test_member.cxx
@@ -0,0 +1,100 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: test_member.cxx,v $
+ * $Revision: 1.4 $
+ *
+ * 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_testshl2.hxx"
+#include <iostream>
+#include <string>
+
+using namespace std;
+
+class Aint
+{
+ int n;
+
+public:
+
+ Aint():n(0)
+ {
+ cout << "ctor Aint()" << endl;
+ }
+ Aint(int _n):n(_n)
+ {
+ cout << "ctor Aint(int(" << _n << "))" << endl;
+ }
+ int getA() {return n;}
+ ~Aint()
+ {
+ cout << "dtor Aint()" << endl;
+ }
+
+};
+
+// -----------------------------------------------------------------------------
+
+class B
+{
+ Aint a;
+ Aint b;
+ std::string aStr;
+
+public:
+
+ B()
+ :a(2)
+ {
+ cout << "ctor B()" << endl;
+ }
+ B(int _a)
+ :a(_a)
+ {
+ cout << "ctor B(int)" << endl;
+ }
+
+ void foo()
+ {
+ cout << "a.getA() := " << a.getA() << endl;
+ cout << "b.getA() := " << b.getA() << endl;
+ }
+
+};
+
+
+// ----------------------------------- Main -----------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int argc, char* argv[] )
+#else
+int _cdecl main( int argc, char* argv[] )
+#endif
+{
+ B b(4);
+ b.foo();
+}
diff --git a/testshl2/workben/test_ostringstream.cxx b/testshl2/workben/test_ostringstream.cxx
new file mode 100644
index 000000000000..c8177781bf36
--- /dev/null
+++ b/testshl2/workben/test_ostringstream.cxx
@@ -0,0 +1,119 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: test_ostringstream.cxx,v $
+ * $Revision: 1.6 $
+ *
+ * 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_testshl2.hxx"
+
+#include <stdlib.h>
+#include <memory>
+#include <sstream>
+#include <iostream>
+#include <bitset>
+
+#include <sal/types.h>
+
+
+class TestFactoryRegistry
+{
+public:
+ void checkFunc(char* foo);
+ void checkFunc2(char* foo);
+ void checkFunc3(char* foo);
+};
+
+
+void TestFactoryRegistry::checkFunc(char* /* foo */ )
+{
+ static int serialNumber = 1;
+
+ std::ostringstream ost;
+//! could this be the problem?
+ ost << "@Dummy@" << serialNumber++;
+ std::cout << ost.str() << std::endl;
+}
+
+void TestFactoryRegistry::checkFunc2(char* /* foo */)
+{
+ static int serialNumber = 1;
+
+ std::ostringstream ost;
+//! could this be the problem?
+ ost << "@Dummy@" << serialNumber;
+ serialNumber++;
+ std::cout << ost.str() << std::endl;
+}
+
+void TestFactoryRegistry::checkFunc3(char* /* foo */)
+{
+ static int serialNumber = 1;
+
+ int nValue = serialNumber;
+ std::ostringstream ost;
+//! could this be the problem?
+ ost << "@Dummy@" << nValue;
+ serialNumber++;
+ std::cout << ost.str() << std::endl;
+}
+
+static TestFactoryRegistry a;
+static TestFactoryRegistry b;
+static TestFactoryRegistry c;
+
+// ----------------------------------- Main -----------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int /* argc */ , char* /* argv */ [] )
+#else
+ int _cdecl main( int /* argc */, char* /* argv */ [] )
+#endif
+{
+ std::ostringstream ost;
+ // sal_Int32 nValue = 1;
+
+ // ost << "@Dummy@" << nValue;
+ // ost << "dec: " << 15 << std::hex << " hex: " << 15 << std::endl;
+
+ // std::cout << ost.str() << std::endl;
+
+ char* cFoo = NULL;
+
+ a.checkFunc(cFoo);
+ a.checkFunc2(cFoo);
+ a.checkFunc3(cFoo);
+
+ b.checkFunc(cFoo);
+ b.checkFunc2(cFoo);
+ b.checkFunc3(cFoo);
+
+ c.checkFunc(cFoo);
+ c.checkFunc2(cFoo);
+ c.checkFunc3(cFoo);
+
+ return 0;
+}
diff --git a/testshl2/workben/test_preproc.cxx b/testshl2/workben/test_preproc.cxx
new file mode 100644
index 000000000000..e7b993570298
--- /dev/null
+++ b/testshl2/workben/test_preproc.cxx
@@ -0,0 +1,58 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: test_preproc.cxx,v $
+ * $Revision: 1.6 $
+ *
+ * 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_testshl2.hxx"
+#include <iostream>
+#include <string>
+#include <rtl/string.hxx>
+
+using namespace std;
+
+#define atest(name) \
+ { \
+ /*if (strlen(#name))*/ { \
+ cout << "String len: " << strlen(#name) << " string: " << #name << endl; \
+ }}
+
+
+// ----------------------------------- Main -----------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int /* argc */, char* /* argv */ [] )
+#else
+ int _cdecl main( int /* argc */, char* /* argv */ [] )
+#endif
+{
+ cout << "test preprocessor: " << endl;
+ atest(fuck);
+ // atest(); compiler error, use "" instead
+ atest("");
+}
diff --git a/testshl2/workben/test_printf.cxx b/testshl2/workben/test_printf.cxx
new file mode 100644
index 000000000000..1b1873e6bfda
--- /dev/null
+++ b/testshl2/workben/test_printf.cxx
@@ -0,0 +1,63 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: test_printf.cxx,v $
+ * $Revision: 1.6 $
+ *
+ * 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_testshl2.hxx"
+
+#include <string>
+#include <stdarg.h>
+#include <stdio.h>
+
+void t_print(const char* _pFormatStr, va_list &args)
+{
+ vprintf(_pFormatStr, args);
+}
+
+void t_print(const char* _pFormatStr, ...)
+{
+ va_list args;
+ va_start( args, _pFormatStr );
+ t_print(_pFormatStr, args);
+ va_end( args );
+}
+
+
+// ----------------------------------- Main -----------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int /* argc */ , char* /* argv */ [] )
+#else
+ int _cdecl main( int /* argc */ , char* /* argv */ [] )
+#endif
+{
+ std::string sStr("TestString.");
+ printf("Test %s\n", sStr.c_str() );
+ t_print("Test %s\n", sStr.c_str() );
+ return 0;
+}
diff --git a/testshl2/workben/test_string.cxx b/testshl2/workben/test_string.cxx
new file mode 100644
index 000000000000..e90501372bd7
--- /dev/null
+++ b/testshl2/workben/test_string.cxx
@@ -0,0 +1,141 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: test_string.cxx,v $
+ * $Revision: 1.5 $
+ *
+ * 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_testshl2.hxx"
+#include <iostream>
+#include <string>
+#include <rtl/string.hxx>
+
+using namespace std;
+
+const char* g_cSeparatorList = " \t,;:#";
+
+std::string trim(std::string const& _sStringToTrim)
+{
+ rtl::OString sStr(_sStringToTrim.c_str());
+ sStr = sStr.trim();
+ return std::string(sStr.getStr());
+}
+
+bool isInCurrentEnvironment(std::string const& _sString)
+{
+ int nSpace = 0;
+ std::string sSearchString = _sString;
+ bool bEnd = false;
+ // run through the hole given string,
+ std::string sEnv;
+
+ do {
+ nSpace = sSearchString.find_first_of(g_cSeparatorList);
+ if (nSpace < 0)
+ {
+ sEnv = sSearchString;
+ bEnd = true;
+ }
+ else
+ {
+ sEnv = sSearchString.substr(0, nSpace);
+ sSearchString = sSearchString.substr(nSpace + 1);
+ }
+ if (sEnv.length() > 0)
+ {
+ cout << sEnv << endl;
+#ifdef LINUX
+ int nLinux = sEnv.find("unxlng");
+ if (nLinux >= 0)
+ {
+ // found unxlng
+ return true;
+ }
+#endif
+#ifdef SOLARIS
+ int nSolaris = sEnv.find("unxsol");
+ if (nSolaris >= 0)
+ {
+ // found unxsol
+ return true;
+ }
+#endif
+#ifdef WNT
+ int nWindows = sEnv.find("wnt");
+ if (nWindows >= 0)
+ {
+ // found wnt
+ return true;
+ }
+#endif
+ }
+ } while ( !bEnd );
+ return false;
+}
+
+// ----------------------------------- Main -----------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int /* argc */, char* /* argv */ [] )
+#else
+ int _cdecl main( int /* argc */ , char* /* argv */ [] )
+#endif
+{
+ string sLine1 = "osl_Socket.ctor.ctors_001";
+ string sLine = "osl_Socket.ctor.ctors_001 unxlngi5.pro unxsols4.pro wntmsci ";
+
+ int nSpace = sLine.find_first_of(g_cSeparatorList);
+ cout << "Space: " << nSpace << endl;
+ std::string sTest;
+
+ if (nSpace > 0)
+ {
+ sLine = trim(sLine);
+ // check environment
+ sTest = sLine.substr(0, nSpace);
+ std::string sRest = sLine.substr(nSpace + 1);
+ if (isInCurrentEnvironment(sRest))
+ {
+ cout << "new string: " << sTest << endl;
+ }
+ }
+ else
+ {
+ // every environment
+ cout << "new string: " << sLine << endl;
+ }
+
+ // cout << "rest string: " << sRest << endl;
+
+ int nCount = 10;
+ do {
+ cout << nCount << endl;
+ nCount --;
+ }
+ while (nCount >= 0);
+ cout << nCount << endl;
+}
diff --git a/testshl2/workben/uno/export.exp b/testshl2/workben/uno/export.exp
new file mode 100644
index 000000000000..a13529da5876
--- /dev/null
+++ b/testshl2/workben/uno/export.exp
@@ -0,0 +1 @@
+registerAllTestFunction
diff --git a/testshl2/workben/uno/export.map b/testshl2/workben/uno/export.map
new file mode 100755
index 000000000000..2718fd9a5cc4
--- /dev/null
+++ b/testshl2/workben/uno/export.map
@@ -0,0 +1,8 @@
+UDK_3.0 {
+ global:
+ registerAllTestFunction;
+
+ local:
+ *;
+};
+
diff --git a/testshl2/workben/uno/makefile.mk b/testshl2/workben/uno/makefile.mk
new file mode 100644
index 000000000000..7c02beba21bd
--- /dev/null
+++ b/testshl2/workben/uno/makefile.mk
@@ -0,0 +1,83 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.5 $
+#
+# 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=qa_uno
+# this is removed at the moment because we need some enhancements
+# TESTDIR=TRUE
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES= \
+# $(SLO)$/unotest.obj
+
+#----------------------------------- ByteSequence -----------------------------------
+
+SHL1OBJS= \
+ $(SLO)$/unotest.obj
+
+SHL1TARGET= unotest
+SHL1STDLIBS=\
+ $(SALLIB) \
+ $(CPPUHELPERLIB) \
+ $(COMPHELPERLIB) \
+ $(CPPULIB) \
+ $(CPPUNITLIB)
+
+# link $(CPPUNIT) to SHL1STDLIBS instead
+# .IF "$(GUI)" == "WNT"
+# SHL1STDLIBS+= $(SOLARLIBDIR)$/cppunit.lib
+# .ENDIF
+# .IF "$(GUI)" == "UNX"
+# SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a
+# .ENDIF
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP = export.map
+
+
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/testshl2/workben/uno/unotest.cxx b/testshl2/workben/uno/unotest.cxx
new file mode 100644
index 000000000000..96f9e7127e60
--- /dev/null
+++ b/testshl2/workben/uno/unotest.cxx
@@ -0,0 +1,117 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: unotest.cxx,v $
+ * $Revision: 1.6 $
+ *
+ * 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_testshl2.hxx"
+#include "rtl/bootstrap.hxx"
+#include <comphelper/processfactory.hxx>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <cppunit/simpleheader.hxx>
+#include <cppuhelper/bootstrap.hxx>
+#include <com/sun/star/xml/sax/XParser.hpp>
+
+namespace css = com::sun::star;
+namespace lang = css::lang;
+namespace uno = css::uno;
+namespace sax = css::xml::sax;
+
+
+// StringHelper
+inline void operator <<= (rtl::OString& _rAsciiString, const rtl::OUString& _rUnicodeString)
+{
+ _rAsciiString = rtl::OUStringToOString(_rUnicodeString,RTL_TEXTENCODING_ASCII_US);
+}
+
+
+namespace unotest
+{
+//------------------------------------------------------------------------
+// testing constructors
+//------------------------------------------------------------------------
+
+ class ctor : public CppUnit::TestFixture
+ {
+ public:
+ void ctor_001()
+ {
+ uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
+ if (xFactory.is())
+ {
+ // sample, get a xParser instance
+ uno::Reference< sax::XParser > xParser;
+ xParser = uno::Reference< sax::XParser > (
+ xFactory->createInstance(
+ ::rtl::OUString::createFromAscii("com.sun.star.xml.sax.Parser")), uno::UNO_QUERY);
+
+ CPPUNIT_ASSERT_MESSAGE("can't get sax::Parser", xParser.is());
+ }
+ }
+ void ctor_002()
+ {
+ CPPUNIT_ASSERT_MESSAGE("Simple testshl2 test, MUST fail.", sal_False);
+ }
+
+ CPPUNIT_TEST_SUITE(ctor);
+ CPPUNIT_TEST(ctor_001);
+ CPPUNIT_TEST(ctor_002);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+ // -----------------------------------------------------------------------------
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(unotest::ctor, "unotest");
+} // unotest
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+
+
+void RegisterAdditionalFunctions(FktRegFuncPtr _pFunc)
+{
+ (void) _pFunc;
+ uno::Reference<lang::XMultiServiceFactory> xMS;
+
+ try
+ {
+ uno::Reference< uno::XComponentContext > xComponentContext = cppu::defaultBootstrap_InitialComponentContext();
+ xMS.set(xComponentContext->getServiceManager(), uno::UNO_QUERY);
+ comphelper::setProcessServiceFactory(xMS);
+ }
+ catch (::com::sun::star::uno::Exception e )
+ {
+ rtl::OString aError;
+ aError <<= e.Message;
+ printf("Error: %s\n", aError.getStr());
+ }
+}
+// NOADDITIONAL;