summaryrefslogtreecommitdiff
path: root/configmgr/workben
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/workben')
-rw-r--r--configmgr/workben/apitest/cfgadduser.cxx358
-rw-r--r--configmgr/workben/apitest/cfgadmin.cxx520
-rw-r--r--configmgr/workben/apitest/cfgapi.cxx868
-rw-r--r--configmgr/workben/apitest/cfgapi_timetest.cxx960
-rw-r--r--configmgr/workben/apitest/cfgregistry.cxx172
-rw-r--r--configmgr/workben/apitest/cfgupdate.cxx435
-rw-r--r--configmgr/workben/apitest/makefile.mk128
-rw-r--r--configmgr/workben/apitest/sregistry8
-rw-r--r--configmgr/workben/local_io/cfgfile.cxx97
-rw-r--r--configmgr/workben/local_io/cfglocal.cxx623
-rw-r--r--configmgr/workben/local_io/com.sun.star.office.Setup.xml29
-rw-r--r--configmgr/workben/local_io/filetest.cxx93
-rw-r--r--configmgr/workben/local_io/makefile.mk114
-rw-r--r--configmgr/workben/local_io/org.openoffice.test.xml70
-rw-r--r--configmgr/workben/local_io/simpletest.cxx761
-rw-r--r--configmgr/workben/local_io/xmlexport.cxx239
-rw-r--r--configmgr/workben/local_io/xmlimport.cxx472
-rw-r--r--configmgr/workben/logger/exports.dxp3
-rw-r--r--configmgr/workben/logger/loggerdfn.cxx154
-rw-r--r--configmgr/workben/logger/makefile.mk73
-rw-r--r--configmgr/workben/logger/simplelogger.cxx177
-rw-r--r--configmgr/workben/logger/simplelogger.hxx86
-rw-r--r--configmgr/workben/memory/logmechanism.hxx105
-rw-r--r--configmgr/workben/memory/main.cxx80
-rw-r--r--configmgr/workben/memory/makefile.mk259
-rw-r--r--configmgr/workben/memory/memorymeasure.hxx228
-rw-r--r--configmgr/workben/memory/memorytests.cxx1244
-rw-r--r--configmgr/workben/memory/testmodules.cxx87
-rw-r--r--configmgr/workben/memory/testmodules.hxx41
-rw-r--r--configmgr/workben/memory/treeload.cxx84
-rw-r--r--configmgr/workben/memory/treeload.hxx41
31 files changed, 8609 insertions, 0 deletions
diff --git a/configmgr/workben/apitest/cfgadduser.cxx b/configmgr/workben/apitest/cfgadduser.cxx
new file mode 100644
index 000000000000..f0b6e2fcddd1
--- /dev/null
+++ b/configmgr/workben/apitest/cfgadduser.cxx
@@ -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: cfgadduser.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_configmgr.hxx"
+
+#include <stdio.h>
+#include <string.h>
+#include <comphelper/stl_types.hxx>
+#include <cppuhelper/extract.hxx>
+#include <com/sun/star/uno/Type.hxx>
+#include <com/sun/star/uno/TypeClass.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <cppuhelper/servicefactory.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::container;
+
+#define ASCII_STRING(rtlOUString) ::rtl::OString((rtlOUString).getStr(), (rtlOUString).getLength(), RTL_TEXTENCODING_ASCII_US).getStr()
+
+//=============================================================================
+void explain(sal_Bool _bVerbose)
+{
+ cout << "cfgadduser - adding users to a registry server\n";
+ cout << "\nusage :\n";
+ cout << "cfgadduser [-s <server> -p <port>] [-portal] [-r <registry>] [-a <sysaccount>]";
+ cout << " [-h <homedirbase>] [-pwd] <user> [<user>]*\n";
+ cout << "\nparameters\n";
+ cout << " <server> - machine where the registry server is running\n";
+ cout << " <port> - port the registry server is listening at\n";
+ cout << " <registry> - registry file to use to instantiate services. Defaulted to\n";
+ cout << " applicat.rdb\n";
+ cout << " <sysaccount> - system account to use for the newly created user(s)\n";
+ cout << " <homedirbase> - home directory base. The concret home dir of a user will\n";
+ cout << " be built by appending the the user name to the base dir.\n";
+ cout << " <user> - user name to add\n";
+ cout << " -portal - specify that the program should connect to a running portal,\n";
+ cout << " not directly to the registry server (you need a ";
+#ifdef WIN32
+ cout << "portal.dll\n";
+#else
+ cout << "libportal.so\n";
+#endif
+ cout << " for this)\n";
+ cout << " In this case, <server> and <port> specify the location where\n";
+ cout << " StarPortal is running\n";
+ cout << "\n";
+ cout << "If no server is specified, the configuration proxy will try to bootstrap from\n";
+ cout << "the initialization file (";
+#ifdef WIN32
+ cout << "sregistry.ini";
+#else
+ cout << "sregistryrc";
+#endif
+ cout << ")\n\n";
+ cout.flush();
+}
+
+//=============================================================================
+#if (defined UNX) || (defined OS2)
+int main( int argc, char * argv[] )
+#else
+int _cdecl main( int argc, char * argv[] )
+#endif
+{
+ sal_Char* pPort = NULL;
+ sal_Char* pServer = NULL;
+ sal_Char* pRegistry = NULL;
+ sal_Char* pSysAccount = NULL;
+ sal_Char* pHomeDirBase = NULL;
+ sal_Bool bPortal = sal_False;
+
+ ::std::vector< sal_Char* > aUsers;
+
+ // collect some parameters
+ sal_Char** pArgs = argv + 1;
+ for (sal_Int32 i=1; i<argc; ++i, ++pArgs)
+ {
+ sal_Char* pCurArg = *pArgs;
+ sal_Int32 nLen = strlen(pCurArg);
+ sal_Bool bInvalidArg = sal_True;
+ if (nLen && ('-' == *pCurArg))
+ { // it's a switch
+ sal_Char* pSwitch = pCurArg + 1;
+ switch (nLen)
+ {
+ case 2:
+ switch (*pSwitch)
+ {
+ case '?':
+ explain(sal_True);
+ return 1;
+ case 'h':
+ pHomeDirBase = *++pArgs;
+ ++i;
+ bInvalidArg = sal_False;
+ break;
+ case 'a':
+ pSysAccount = *++pArgs;
+ ++i;
+ bInvalidArg = sal_False;
+ break;
+ case 'p':
+ pPort = *++pArgs;
+ ++i;
+ bInvalidArg = sal_False;
+ break;
+ case 's':
+ pServer = *++pArgs;
+ ++i;
+ bInvalidArg = sal_False;
+ break;
+ case 'r':
+ pRegistry = *++pArgs;
+ ++i;
+ bInvalidArg = sal_False;
+ break;
+ }
+ break;
+ case 7:
+ if (0 == strncmp(pSwitch, "portal", 6))
+ {
+ bInvalidArg = sal_False;
+ bPortal = sal_True;
+ }
+ break;
+ }
+ }
+ else
+ {
+ if ((1 == nLen) && ('?' == *pCurArg))
+ {
+ explain(sal_True);
+ return 1;
+ }
+ else
+ {
+ bInvalidArg = sal_False;
+ aUsers.push_back(pCurArg);
+ }
+ }
+ if (bInvalidArg)
+ {
+ explain(sal_False);
+ return 1;
+ }
+ }
+
+ if ((!pServer && pPort) || (!pPort && pServer))
+ {
+ explain(sal_False);
+ return 1;
+ }
+
+ if (0 == aUsers.size())
+ {
+ explain(sal_False);
+ return 1;
+ }
+
+ // refine some params
+ ::rtl::OUString sHomeDirBase, sSystemAccountName;
+ if (pHomeDirBase)
+ {
+ sHomeDirBase = ::rtl::OUString::createFromAscii(pHomeDirBase);
+ if (!sHomeDirBase.getLength() || ('/' != sHomeDirBase.getStr()[sHomeDirBase.getLength() - 1]))
+ sHomeDirBase += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/"));
+ }
+ if (pSysAccount)
+ sSystemAccountName = ::rtl::OUString::createFromAscii(pSysAccount);
+
+ try
+ {
+ ::rtl::OUString const sServiceRegistry = ::rtl::OUString::createFromAscii( pRegistry ? pRegistry : "applicat.rdb" );
+ Reference< XMultiServiceFactory > xORB = ::cppu::createRegistryServiceFactory(
+ sServiceRegistry,
+ ::rtl::OUString()
+ );
+ if (!xORB.is())
+ {
+ cerr << "Could not create the service factory !\n\n";
+ return 1;
+ }
+
+ // collect the params for the config provider
+ Sequence< Any > aProviderArgs(3 + (pServer ? 2 : 0));
+ aProviderArgs[0] = makeAny(PropertyValue(
+ ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("servertype")),
+ 0,
+ makeAny(::rtl::OUString::createFromAscii(bPortal ? "portal" : "remote")),
+ PropertyState_DIRECT_VALUE
+ ));
+ aProviderArgs[1] = makeAny(PropertyValue(
+ ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("user")),
+ 0,
+ makeAny(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Administrator"))),
+ PropertyState_DIRECT_VALUE
+ ));
+ aProviderArgs[2] = makeAny(PropertyValue(
+ ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("password")),
+ 0,
+ makeAny(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("unused"))),
+ PropertyState_DIRECT_VALUE
+ ));
+ if (pServer)
+ {
+ aProviderArgs[3] = makeAny(PropertyValue(
+ ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("server")),
+ 0,
+ makeAny(::rtl::OUString::createFromAscii(pServer)),
+ PropertyState_DIRECT_VALUE
+ ));
+
+ sal_Int32 nPort = ::rtl::OUString::createFromAscii(pPort).toInt32();
+ aProviderArgs[4] = makeAny(PropertyValue(
+ ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("port")),
+ 0,
+ makeAny(nPort),
+ PropertyState_DIRECT_VALUE
+ ));
+ }
+
+ Reference< XMultiServiceFactory > xCfgProvider(
+ xORB->createInstanceWithArguments(::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider"),
+ aProviderArgs),
+ UNO_QUERY);
+ if (!xCfgProvider.is())
+ {
+ cerr << "Could not create the configuration provider !\n\n";
+ return 3;
+ }
+
+ Reference< XInterface > xIFace = xCfgProvider->createInstance(
+ ::rtl::OUString::createFromAscii("com.sun.star.configuration.UserAdministration"));
+ if (!xIFace.is())
+ {
+ cerr << "Could not create the configuration provider !\n\n";
+ return 4;
+ }
+
+ Reference< XChangesBatch > xUserChanges(xIFace, UNO_QUERY);
+ Reference< XNameContainer > xUserContainer(xIFace, UNO_QUERY);
+ Reference< XSingleServiceFactory> xUserFactory(xIFace, UNO_QUERY);
+ if (!xUserChanges.is() || !xUserContainer.is() || !xUserFactory.is())
+ {
+ cerr << "the user admin access does not provide the necessary interfaces !\n\n";
+ return 5;
+ }
+
+ cout << "going to add the users ..." << endl << endl;
+ for ( ::std::vector< sal_Char* >::const_iterator aUserLoop = aUsers.begin();
+ aUserLoop != aUsers.end();
+ ++aUserLoop
+ )
+ {
+ cout << *aUserLoop << " ... ";
+ sal_Bool bHadLinebreak = sal_False;
+ try
+ {
+ Reference< XInterface > xNewUser = xUserFactory->createInstance();
+
+ // the user name as unicode string use more than once)
+ ::rtl::OUString sUserName = ::rtl::OUString::createFromAscii(*aUserLoop);
+
+ // the XNameContainer access to the Security node in the user profile data
+ Reference< XNameReplace > xSecurityDataAccess;
+ Reference< XNameAccess > xUserDataAccess(xNewUser, UNO_QUERY);
+ if (xUserDataAccess.is())
+ {
+ Any aSecurity = xUserDataAccess->getByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Security")));
+ ::cppu::extractInterface(xSecurityDataAccess, aSecurity);
+ }
+
+ if (!xSecurityDataAccess.is())
+ throw Exception(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("The user administration service did not provide a valid user template.")), NULL);
+
+ // set the home directory
+ if (sHomeDirBase.getLength())
+ {
+ ::rtl::OUString sHomeDir(sHomeDirBase);
+ sHomeDir += sUserName;
+ xSecurityDataAccess->replaceByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HomeDirectory")), makeAny(sHomeDir));
+ cout << "\n\thome dir : " << ASCII_STRING(sHomeDir) << " ... ";
+ cout.flush();
+ bHadLinebreak = sal_True;
+ }
+
+ if (sSystemAccountName.getLength())
+ {
+ xSecurityDataAccess->replaceByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SystemAccount")), makeAny(sSystemAccountName));
+ cout << "\n\tsystem account: " << ASCII_STRING(sSystemAccountName) << " ... ";
+ cout.flush();
+ bHadLinebreak = sal_True;
+ }
+
+ xUserContainer->insertByName(sUserName, makeAny(xNewUser));
+ xUserChanges->commitChanges();
+ if (bHadLinebreak)
+ cout << "\n";
+ cout << "done.\n";
+ cout.flush();
+ }
+ catch(Exception& e)
+ {
+ cout << "\n";
+ if (!bHadLinebreak)
+ cout << "\t";
+ cerr << "unable to add the user named " << *aUserLoop << endl;
+ if (!bHadLinebreak)
+ cout << "\t";
+ cerr << "(exception message: " << ::rtl::OString(e.Message.getStr(), e.Message.getLength(), RTL_TEXTENCODING_ASCII_US).getStr() << ")" << endl;
+ }
+ cout << "\n";
+ }
+ }
+ catch(Exception& e)
+ {
+ cerr << "Caught exception: " << ASCII_STRING(e.Message) << endl;
+ return 2;
+ }
+
+ return 0;
+}
diff --git a/configmgr/workben/apitest/cfgadmin.cxx b/configmgr/workben/apitest/cfgadmin.cxx
new file mode 100644
index 000000000000..791686378c9a
--- /dev/null
+++ b/configmgr/workben/apitest/cfgadmin.cxx
@@ -0,0 +1,520 @@
+/*************************************************************************
+ *
+ * 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: cfgadmin.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_configmgr.hxx"
+#define _PRIVATE_TEST_
+
+#include <iostream>
+using namespace std;
+
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/uno/Type.hxx>
+#include <com/sun/star/uno/TypeClass.hpp>
+#include <com/sun/star/beans/XHierarchicalPropertySet.hpp>
+
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/container/XHierarchicalName.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/container/XNameReplace.hpp>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/beans/XExactName.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+
+
+#include <rtl/ustring.hxx>
+#include <rtl/string.hxx>
+#include <cppuhelper/servicefactory.hxx>
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/uno/Any.h>
+
+#include "createpropertyvalue.hxx"
+
+#include "typeconverter.hxx"
+#include <osl/time.h>
+
+// #include <com/sun/star/configuration/XConfigurationSync.hpp>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::beans;
+//using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::util;
+
+using ::rtl::OUString;
+using ::rtl::OString;
+//using namespace ::configmgr;
+
+using namespace ::cppu;
+
+#define ASCII(x) ::rtl::OUString::createFromAscii(x)
+
+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;
+}
+
+void showSequence(const Sequence<OUString> &aSeq)
+{
+ OUString aArray;
+ const OUString *pStr = aSeq.getConstArray();
+ for (int i=0;i<aSeq.getLength();i++)
+ {
+ OUString aStr = pStr[i];
+ // aArray += aStr + ASCII(", ");
+ cout << aStr << endl;
+ }
+ volatile int dummy = 0;
+}
+
+//=============================================================================
+//=============================================================================
+void test_read_access(Reference< XInterface >& xIface, Reference< XMultiServiceFactory > &xMSF);
+//=============================================================================
+struct prompt_and_wait
+{
+ char const* myText;
+ prompt_and_wait(char const* text = "") : myText(text) {}
+ ~prompt_and_wait()
+ {
+ cout << myText << ">" << endl;
+ int const mx = int( (+0u - +1u) >> 1);
+
+ char c=0;
+ if (cin.get(c) && c != '\n')
+ cin.ignore(mx,'\n');
+ }
+};
+static prompt_and_wait exit_prompt("Quitting\nQ");
+
+
+// -----------------------------------------------------------------------------
+Sequence<Any> createSequence(const OUString &sUser, const OUString &sPasswd)
+{
+ Sequence< Any > aCPArgs;
+
+ if (sUser.getLength() > 0)
+ {
+ aCPArgs.realloc(1);
+ aCPArgs[0] <<= configmgr::createPropertyValue(ASCII("user"), sUser);
+ }
+ if (sPasswd.getLength() > 0)
+ {
+ aCPArgs.realloc(2);
+ aCPArgs[1] <<= configmgr::createPropertyValue(ASCII("password"), sPasswd);
+ }
+ return aCPArgs;
+}
+
+//=============================================================================
+#include <string.h>
+#if (defined UNX) || (defined OS2)
+#else
+#include <conio.h>
+#endif
+
+OString input(const char* pDefaultText, char cEcho)
+{
+ // PRE: a Default Text would be shown, cEcho is a Value which will show if a key is pressed.
+ const int MAX_INPUT_LEN = 500;
+ char aBuffer[MAX_INPUT_LEN];
+
+ strcpy(aBuffer, pDefaultText);
+ int nLen = strlen(aBuffer);
+
+#ifdef WNT
+ char ch = '\0';
+
+ cout << aBuffer;
+ cout.flush();
+
+ while(ch != 13)
+ {
+ ch = getch();
+ if (ch == 8)
+ {
+ if (nLen > 0)
+ {
+ cout << "\b \b";
+ cout.flush();
+ --nLen;
+ aBuffer[nLen] = '\0';
+ }
+ else
+ {
+ cout << "\a";
+ cout.flush();
+ }
+ }
+ else if (ch != 13)
+ {
+ if (nLen < MAX_INPUT_LEN)
+ {
+ if (cEcho == 0)
+ {
+ cout << ch;
+ }
+ else
+ {
+ cout << cEcho;
+ }
+ cout.flush();
+ aBuffer[nLen++] = ch;
+ aBuffer[nLen] = '\0';
+ }
+ else
+ {
+ cout << "\a";
+ cout.flush();
+ }
+ }
+ }
+#else
+ if (!cin.getline(aBuffer,sizeof aBuffer))
+ return OString();
+#endif
+ return OString(aBuffer);
+}
+
+// -----------------------------------------------------------------------------
+rtl::OUString enterValue(const char* _aStr, const char* _aDefault, bool _bIsAPassword)
+{
+ cout << _aStr;
+ cout.flush();
+ OString aTxt = input(_aDefault, _bIsAPassword ? '*' : 0);
+
+ OUString sValue = OUString::createFromAscii(aTxt);
+ return sValue;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+void write(Reference<XNameAccess >& xAccess)
+{
+ if (xAccess.is())
+ {
+ Sequence<OUString> aNames( xAccess->getElementNames() );
+
+ cout << "Element Names: (" << aNames.getLength() << ")";
+ for (int i = 0; i < aNames.getLength(); ++i)
+ cout << "\n[" << i << "] -\t" << aNames[i];
+ cout << endl;
+ }
+ else
+ cout << "BUG: XNameAccess not available";
+ cout << endl;
+}
+// -----------------------------------------------------------------------------
+void write(Reference< XChild >& xChild)
+{
+ if (xChild.is())
+ cout << "\n[ P ] -\tParent";
+ else
+ cout << "BUG: Parent not available (no XChild)";
+ cout << endl;
+}
+
+// -----------------------------------------------------------------------------
+void displayTree(Reference< XNameAccess > xIFace){
+
+ write(Reference< XNameAccess >(xIFace));
+}
+
+
+// -----------------------------------------------------------------------------
+void displayGroups(Reference< XNameAccess > xGroupAccess)
+{
+
+ cout << "Currently available groups !\n---------------------------------------------------------------" << endl;
+ write(xGroupAccess);
+}
+
+// -----------------------------------------------------------------------------
+OUString insertGroup(Reference< XNameAccess > xGroupAccess)
+{
+ OUString sGroup = enterValue(" Enter a new group to create: ", "", true);
+
+ Reference< XSingleServiceFactory > xFactory(xGroupAccess, UNO_QUERY);
+ Reference< XNameAccess > xNewGroup(xFactory->createInstance(), UNO_QUERY);
+
+ cout << "Group data: !\n---------------------------------------------------------------" << endl;
+ write(xNewGroup);
+ Any aGroup;
+ aGroup <<= xNewGroup;
+ Reference< XNameContainer >(xGroupAccess, UNO_QUERY)->insertByName(sGroup, aGroup);
+ return sGroup;
+}
+
+// -----------------------------------------------------------------------------
+void deleteGroup(Reference< XNameAccess > xGroupAccess, OUString sGroup)
+{
+ if (!sGroup.getLength())
+ sGroup = enterValue(" Enter a group to delete: ", "", true);
+ cout << "deleting group !\n---------------------------------------------------------------" << endl;
+ Reference< XNameContainer >(xGroupAccess, UNO_QUERY)->removeByName(sGroup);
+}
+
+// -----------------------------------------------------------------------------
+void displayUsers(Reference< XNameAccess > xUserAccess)
+{
+ cout << "Currently available users !\n---------------------------------------------------------------" << endl;
+ write(xUserAccess);
+}
+
+// -----------------------------------------------------------------------------
+OUString insertUser(Reference< XNameAccess > xUserAccess, OUString aGroup)
+{
+ OUString sUser = enterValue(" Enter a new User to create: ", "", true);
+ Reference< XSingleServiceFactory > xFactory(xUserAccess, UNO_QUERY);
+
+ Sequence< Any > aArgs(1);
+ aArgs[0] <<= configmgr::createPropertyValue(ASCII("group"), aGroup);
+ Reference< XNameAccess > xNewUser(xFactory->createInstanceWithArguments(aArgs), UNO_QUERY);
+
+ cout << "User data: !\n---------------------------------------------------------------" << endl;
+ write(xNewUser);
+
+ Any aValue;
+ aValue <<= ASCII("MyCompany");
+
+ // now do some updates for the user
+ Reference< XHierarchicalPropertySet > xUpdate(xNewUser, UNO_QUERY);
+ xUpdate->setHierarchicalPropertyValue(ASCII("Data/Company"),aValue);
+
+ Any aUser;
+ aUser <<= xNewUser;
+ Reference< XNameContainer >(xUserAccess, UNO_QUERY)->insertByName(sUser, aUser);
+
+ return sUser;
+}
+
+// -----------------------------------------------------------------------------
+void deleteUser(Reference< XNameAccess > xUserAccess, OUString sUser)
+{
+ if (!sUser.getLength())
+ sUser = enterValue(" Enter a User to delete: ", "", true);
+ cout << "deleting User !\n---------------------------------------------------------------" << endl;
+ Reference< XNameContainer >(xUserAccess, UNO_QUERY)->removeByName(sUser);
+}
+
+// -----------------------------------------------------------------------------
+Reference< XNameAccess > beginChanges(Reference< XMultiServiceFactory > xFactory, OUString sPath, OUString& sUser)
+{
+ if (!sUser.getLength())
+ sUser = enterValue(" Enter a User: ", "", true);
+
+ Sequence< Any > aArgs(2);
+ aArgs[0] <<= configmgr::createPropertyValue(ASCII("user"), sUser);
+ aArgs[1] <<= configmgr::createPropertyValue(ASCII("nodepath"),sPath);
+
+ cout << "starting update for node:" << sPath << endl;
+
+ Reference< XNameAccess > xTree(xFactory->createInstanceWithArguments(OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"),
+ aArgs), UNO_QUERY);
+
+ return xTree;
+}
+
+template <class Type>
+// -----------------------------------------------------------------------------
+void update(Reference< XInterface > xIFace, OUString sRelPath, Type sValue)
+{
+ Reference< XHierarchicalPropertySet > xTree(xIFace, UNO_QUERY);
+ Any aValue;
+ aValue <<= sValue;
+
+ cout << "updating node:" << sRelPath << endl;
+ xTree->setHierarchicalPropertyValue(sRelPath, aValue);
+}
+
+// -----------------------------------------------------------------------------
+Reference< XHierarchicalPropertySet > insertTree(Reference< XInterface > xIFace, OUString aName)
+{
+ if (!aName.getLength())
+ aName = enterValue("/nEnter a Tree to insert: ", "", false);
+
+ Reference< XSingleServiceFactory > xFactory(xIFace, UNO_QUERY);
+ Reference< XHierarchicalPropertySet > xNewElement(xFactory->createInstance(), UNO_QUERY);
+
+ cout << "inserting new tree element:" << aName << endl;
+
+ Any aTree;
+ aTree <<= xNewElement;
+ Reference< XNameContainer >(xFactory, UNO_QUERY)->insertByName(aName, aTree);
+
+ return xNewElement;
+}
+
+// -----------------------------------------------------------------------------
+void removeTree(Reference< XInterface > xIFace, OUString aName)
+{
+ if (!aName.getLength())
+ aName = enterValue("/nEnter a Tree to remove: ", "", false);
+
+ cout << "removing new tree element:" << aName << endl;
+
+ Reference< XNameContainer >(xIFace, UNO_QUERY)->removeByName(aName);
+}
+
+// -----------------------------------------------------------------------------
+void commitChanges(Reference< XInterface > xIFace)
+{
+ cout << "committing changes:" << endl;
+
+ Reference< XChangesBatch > xChangesBatch(xIFace, UNO_QUERY);
+ xChangesBatch->commitChanges();
+}
+
+// -----------------------------------------------------------------------------
+// ---------------------------------- M A I N ----------------------------------
+// -----------------------------------------------------------------------------
+
+#if (defined UNX) || (defined OS2)
+int main( int argc, char * argv[] )
+#else
+int _cdecl main( int argc, char * argv[] )
+#endif
+{
+ TimeValue aTimeout;
+ aTimeout.Seconds = 5;
+ aTimeout.Nanosec = 0;
+
+ // cout << " Please insert Text: ";
+ // cout.flush();
+ // OString aTxt = input("Der Text", 0);
+ // cout << endl << "You inserted: " << aTxt.getStr() << endl;
+ //
+ // cout << "Please insert Password: ";
+ // cout.flush();
+ // OString aPasswd = input("", '*');
+ // cout << endl << "You inserted: " << aPasswd.getStr() << endl;
+
+ try
+ {
+ OUString const sServiceRegistry = OUString::createFromAscii( argc > 1 ? argv[1] : "applicat.rdb" );
+ Reference< XMultiServiceFactory > xORB = createRegistryServiceFactory(
+ sServiceRegistry,
+ ::rtl::OUString()
+ );
+ if (!xORB.is())
+ {
+ ::flush(cout);
+ cerr << "Could not create the service factory !\n\n";
+ return 1;
+ }
+ cout << "Service factory created !\n---------------------------------------------------------------" << endl;
+
+ Sequence< Any > aCPArgs = createSequence(OUString::createFromAscii("Administrator"), OUString());
+
+ Reference< XMultiServiceFactory > xCfgProvider(
+ xORB->createInstanceWithArguments(
+ ::rtl::OUString::createFromAscii("com.sun.star.configuration.AdministrationProvider"),
+ aCPArgs),
+ UNO_QUERY);
+
+ if (!xCfgProvider.is())
+ {
+ ::flush(cout);
+ cerr << "Could not create the configuration provider !\n\n";
+ return 3;
+ }
+
+ cout << "Configuration Provider created !\n---------------------------------------------------------------" << endl;
+
+ Reference< XNameAccess > xUpdateAccess;
+ Reference< XNameAccess > xGroupAccess(xCfgProvider->createInstance(OUString::createFromAscii("com.sun.star.configuration.GroupAccess")),UNO_QUERY);
+ Reference< XNameAccess > xUserAccess(xCfgProvider->createInstance(OUString::createFromAscii("com.sun.star.configuration.UserAccess")),UNO_QUERY);
+
+ displayGroups(xGroupAccess);
+ displayUsers(xUserAccess);
+
+// create a group
+ OUString sGroupName = insertGroup(xGroupAccess);
+// create a user
+ OUString sUserName;
+ sUserName = insertUser(xUserAccess, sGroupName);
+
+// now do updates for the user
+ xUpdateAccess = beginChanges(xCfgProvider, OUString::createFromAscii("org.openoffice.Inet"), sUserName);
+
+ update(xUpdateAccess, OUString::createFromAscii("Proxy/FTP/Port"), sal_Int32(12));
+ update(xUpdateAccess, OUString::createFromAscii("Proxy/FTP/Name"), OUString::createFromAscii("demo"));
+ update(xUpdateAccess, OUString::createFromAscii("DNS/IP_Address"), OUString::createFromAscii("demo1"));
+
+ xUpdateAccess = beginChanges(xCfgProvider, OUString::createFromAscii("org.openoffice.Office.Common"), sUserName);
+ update(xUpdateAccess, OUString::createFromAscii("_3D_Engine/Dithering"), sal_Bool(sal_False));
+ commitChanges(xUpdateAccess);
+
+// now do updates with inserting and removing of nodes
+
+ xUpdateAccess = beginChanges(xCfgProvider, OUString::createFromAscii("org.openoffice.Security/MountPoints"), sUserName);
+ displayTree(xUpdateAccess);
+
+ Reference< XHierarchicalPropertySet > xTree = insertTree(xUpdateAccess, OUString());
+ update(xUpdateAccess, OUString::createFromAscii("InstallationDirectory/Directory"), OUString::createFromAscii("Test1"));
+ removeTree(xUpdateAccess, OUString());
+ commitChanges(xUpdateAccess);
+
+
+/* deleteUser(xUserAccess, sUserName);
+ deleteGroup(xGroupAccess, sGroupName); */
+
+ displayGroups(xGroupAccess);
+ displayUsers(xUserAccess);
+ }
+ catch (Exception& e)
+ {
+ ::flush(cout);
+ cerr << "Caught exception: " << e.Message << endl;
+ return 1;
+ }
+/*
+ catch (...)
+ {
+ flush(cout);
+ cerr << "BUG: Caught UNKNOWN exception (?) " << endl;
+ }
+*/
+ return 0;
+}
+
+
+
+
diff --git a/configmgr/workben/apitest/cfgapi.cxx b/configmgr/workben/apitest/cfgapi.cxx
new file mode 100644
index 000000000000..968aca927e43
--- /dev/null
+++ b/configmgr/workben/apitest/cfgapi.cxx
@@ -0,0 +1,868 @@
+/*************************************************************************
+ *
+ * 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: cfgapi.cxx,v $
+ * $Revision: 1.24 $
+ *
+ * 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_configmgr.hxx"
+#define _PRIVATE_TEST_
+
+#include <iostream>
+using namespace std;
+
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/uno/Type.hxx>
+#include <com/sun/star/uno/TypeClass.hpp>
+
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XHierarchicalName.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/container/XNameReplace.hpp>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/beans/XExactName.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+
+
+#include <rtl/ustring.hxx>
+#include <rtl/string.hxx>
+#include <cppuhelper/servicefactory.hxx>
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/uno/Any.h>
+#include <osl/profile.hxx>
+#include <osl/process.h>
+#include <osl/file.h>
+
+#include "createpropertyvalue.hxx"
+
+#include "typeconverter.hxx"
+
+// #include <com/sun/star/configuration/XConfigurationSync.hpp>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::beans;
+//using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::util;
+
+using ::rtl::OUString;
+using ::rtl::OString;
+//using namespace ::configmgr;
+
+using namespace ::cppu;
+
+#define ASCII(x) ::rtl::OUString::createFromAscii(x)
+
+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;
+}
+
+void showSequence(const Sequence<OUString> &aSeq)
+{
+ OUString aArray;
+ const OUString *pStr = aSeq.getConstArray();
+ for (int i=0;i<aSeq.getLength();i++)
+ {
+ OUString aStr = pStr[i];
+ // aArray += aStr + ASCII(", ");
+ cout << aStr << endl;
+ }
+ volatile int dummy = 0;
+}
+
+//=============================================================================
+
+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();
+}
+
+//=============================================================================
+void test_read_access(Reference< XInterface >& xIface, Reference< XMultiServiceFactory > &xMSF);
+//=============================================================================
+struct prompt_and_wait
+{
+ char const* myText;
+ prompt_and_wait(char const* text = "") : myText(text) {}
+ ~prompt_and_wait()
+ {
+ cout << myText << ">" << endl;
+ int const mx = int( (+0u - +1u) >> 1);
+
+ char c=0;
+ if (cin.get(c) && c != '\n')
+ cin.ignore(mx,'\n');
+ }
+};
+static prompt_and_wait exit_prompt("Quitting\nQ");
+
+
+Reference< XChangesBatch > xChangesBatch = NULL;
+void commit()
+{
+ if (xChangesBatch.is())
+ {
+ xChangesBatch->commitChanges();
+ }
+}
+
+// -----------------------------------------------------------------------------
+static sal_Bool s_bInitialized = sal_False;
+#ifdef LLA_PRIVAT_DEBUG
+static const sal_Char* s_pSourcePath = "l:/src625/configmgr/workben/local_io/share";
+static const sal_Char* s_pUpdatePath = "l:/src625/configmgr/workben/local_io/user";
+static const sal_Char* s_pRootNode = "org.openoffice.ucb.Hierarchy"; // "org.openoffice.test";
+static const sal_Char* s_pServerType = "local";
+static const sal_Char* s_pLocale = "de-DE";
+static const sal_Char* s_pServer = "";
+static const sal_Char* s_pUser = "";
+static const sal_Char* s_pPassword = "";
+#else
+static const sal_Char* s_pSourcePath = "g:/src/configmgr/workben/local_io/share";
+static const sal_Char* s_pUpdatePath = "g:/src/configmgr/workben/local_io/user";
+static const sal_Char* s_pRootNode = "org.openoffice.Office.TypeDetection";
+static const sal_Char* s_pServerType = "setup";
+static const sal_Char* s_pLocale = "de-DE";
+static const sal_Char* s_pServer = "lautrec-3108:19205";
+static const sal_Char* s_pUser = "lars";
+static const sal_Char* s_pPassword = "";
+#endif
+
+
+// -----------------------------------------------------------------------------
+static void loadDefaults()
+{
+ if (s_bInitialized)
+ return;
+
+ s_bInitialized = sal_True;
+
+ try
+ {
+ // the executable file name
+ ::rtl::OUString sExecutable;
+ osl_getExecutableFile(&sExecutable.pData);
+ // cut the name, add a cfgapi.ini to the path
+ sal_Int32 nLastSep = sExecutable.lastIndexOf('/');
+ if (-1 != nLastSep)
+ sExecutable = sExecutable.copy(0, nLastSep + 1);
+#ifdef UNX
+ sExecutable += ::rtl::OUString::createFromAscii("cfgapirc");
+#else
+ sExecutable += ::rtl::OUString::createFromAscii("cfgapi.ini");
+#endif
+ ::rtl::OUString sNormalized;
+ sNormalized = sExecutable;
+ if (1)
+ {
+ ::osl::Profile aProfile(sNormalized);
+
+ static ::rtl::OString sSection("defaults");
+ static ::rtl::OString sSourcePath("sourcepath");
+ static ::rtl::OString sUpdatePath("updatepath");
+ static ::rtl::OString sRootNode("rootnode");
+ static ::rtl::OString sServerType("servertype");
+ static ::rtl::OString sLocale("Locale");
+ static ::rtl::OString sServer("Server");
+ static ::rtl::OString sUser("User");
+ static ::rtl::OString sPassword("Password");
+
+ // read some strings.
+ // Do this static because we want to redirect the global static character pointers to the buffers.
+ static ::rtl::OString s_sSourcePath = aProfile.readString(sSection, sSourcePath, s_pSourcePath);
+ static ::rtl::OString s_sUpdatePath = aProfile.readString(sSection, sUpdatePath, s_pUpdatePath);
+ static ::rtl::OString s_sRootNode = aProfile.readString(sSection, sRootNode, s_pRootNode);
+ static ::rtl::OString s_sServerType = aProfile.readString(sSection, sServerType, s_pServerType);
+ static ::rtl::OString s_sLocale = aProfile.readString(sSection, sLocale, s_pLocale);
+ static ::rtl::OString s_sServer = aProfile.readString(sSection, sServer, s_pServer);
+ static ::rtl::OString s_sUser = aProfile.readString(sSection, sUser, s_pUser);
+ static ::rtl::OString s_sPassword = aProfile.readString(sSection, sPassword, s_pPassword);
+
+ // do this redirection
+ s_pSourcePath = s_sSourcePath.getStr();
+ s_pUpdatePath = s_sUpdatePath.getStr();
+ s_pRootNode = s_sRootNode.getStr();
+ s_pServerType = s_sServerType.getStr();
+ s_pLocale = s_sLocale.getStr();
+ s_pServer = s_sServer.getStr();
+ s_pUser = s_sUser.getStr();
+ s_pPassword = s_sPassword.getStr();
+ }
+ }
+ catch(std::exception& e)
+ {
+ e.what(); // silence warnings
+ }
+}
+
+// -----------------------------------------------------------------------------
+Sequence<Any> createSequence(const OUString &sUser, const OUString &sPasswd)
+{
+ Sequence< Any > aCPArgs;
+
+ if (sUser.getLength() > 0)
+ {
+ aCPArgs.realloc(1);
+ aCPArgs[0] <<= configmgr::createPropertyValue(ASCII("user"), sUser);
+ }
+ if (sPasswd.getLength() > 0)
+ {
+ aCPArgs.realloc(2);
+ aCPArgs[1] <<= configmgr::createPropertyValue(ASCII("password"), sPasswd);
+ }
+ return aCPArgs;
+}
+
+//=============================================================================
+#include <string.h>
+#if (defined UNX) || (defined OS2)
+#else
+#include <conio.h>
+#endif
+
+OString input(const char* pDefaultText, char cEcho)
+{
+ // PRE: a Default Text would be shown, cEcho is a Value which will show if a key is pressed.
+ const int MAX_INPUT_LEN = 500;
+ char aBuffer[MAX_INPUT_LEN];
+
+ strcpy(aBuffer, pDefaultText);
+ int nLen = strlen(aBuffer);
+
+#ifdef WNT
+ char ch = '\0';
+
+ cout << aBuffer;
+ cout.flush();
+
+ while(ch != 13)
+ {
+ ch = getch();
+ if (ch == 8)
+ {
+ if (nLen > 0)
+ {
+ cout << "\b \b";
+ cout.flush();
+ --nLen;
+ aBuffer[nLen] = '\0';
+ }
+ else
+ {
+ cout << "\a";
+ cout.flush();
+ }
+ }
+ else if (ch != 13)
+ {
+ if (nLen < MAX_INPUT_LEN)
+ {
+ if (cEcho == 0)
+ {
+ cout << ch;
+ }
+ else
+ {
+ cout << cEcho;
+ }
+ cout.flush();
+ aBuffer[nLen++] = ch;
+ aBuffer[nLen] = '\0';
+ }
+ else
+ {
+ cout << "\a";
+ cout.flush();
+ }
+ }
+ }
+#else
+ if (!cin.getline(aBuffer,sizeof aBuffer))
+ return OString();
+#endif
+ return OString(aBuffer);
+}
+
+// -----------------------------------------------------------------------------
+rtl::OUString enterValue(const char* _aStr, const char* _aDefault, bool _bIsAPassword)
+{
+ cout << _aStr;
+ cout.flush();
+
+ OUString sValue;
+ sValue <<= input(_aDefault, _bIsAPassword ? '*' : 0);
+ return sValue;
+}
+
+
+
+// -----------------------------------------------------------------------------
+// ---------------------------------- M A I N ----------------------------------
+// -----------------------------------------------------------------------------
+
+#if (defined UNX) || (defined OS2)
+int main( int argc, char * argv[] )
+#else
+int _cdecl main( int argc, char * argv[] )
+#endif
+{
+ TimeValue aTimeout;
+ aTimeout.Seconds = 5;
+ aTimeout.Nanosec = 0;
+
+ // cout << " Please insert Text: ";
+ // cout.flush();
+ // OString aTxt = input("Der Text", 0);
+ // cout << endl << "You inserted: " << aTxt.getStr() << endl;
+ //
+ // cout << "Please insert Password: ";
+ // cout.flush();
+ // OString aPasswd = input("", '*');
+ // cout << endl << "You inserted: " << aPasswd.getStr() << endl;
+
+ loadDefaults();
+
+ try
+ {
+ OUString const sServiceRegistry = OUString::createFromAscii( argc > 1 ? argv[1] : "applicat.rdb" );
+ Reference< XMultiServiceFactory > xORB = createRegistryServiceFactory(
+ sServiceRegistry,
+ ::rtl::OUString()
+ );
+ if (!xORB.is())
+ {
+ ::flush(cout);
+ cerr << "Could not create the service factory !\n\n";
+ return 1;
+ }
+ cout << "Service factory created !\n---------------------------------------------------------------" << endl;
+
+ Sequence< Any > aCPArgs;
+
+ OUString sServerType = enterValue("servertype: ", s_pServerType, false);
+ cout << endl;
+
+
+ rtl::OUString sUser;
+
+ bool bLocal = sServerType.equalsIgnoreAsciiCase(ASCII("local")) || sServerType.equalsIgnoreAsciiCase(ASCII("setup"));
+ if (!bLocal)
+ {
+ rtl::OUString sServer;
+ sServer = enterValue("server : ", s_pServer,false);
+ cout << endl;
+
+ sUser = enterValue("user : ", s_pUser, false);
+ cout << endl;
+
+ OUString sPasswd = enterValue("password: ", s_pPassword, true);
+ cout << endl;
+
+ aCPArgs = createSequence(sUser, sPasswd);
+
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ aCPArgs[aCPArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("server"), sServer);
+
+ OUString sTimeout = ASCII("10000");
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ aCPArgs[aCPArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("timeout"), sTimeout);
+
+ }
+ else
+ {
+ rtl::OUString sSharePath, sUserPath;
+ sSharePath = enterValue("share path: ", s_pSourcePath, false);
+ cout << endl;
+ sUserPath = enterValue("user path : ", s_pUpdatePath, false);
+ cout << endl;
+
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ sal_Int32 nCount = aCPArgs.getLength() - 1;
+ Any *pAny = &aCPArgs[nCount];
+ *pAny <<= configmgr::createPropertyValue(ASCII("sourcepath"), sSharePath);
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ aCPArgs[aCPArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("updatepath"), sUserPath);
+ }
+
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ aCPArgs[aCPArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("servertype"), sServerType);
+
+ Reference< XMultiServiceFactory > xCfgProvider(
+ xORB->createInstanceWithArguments(
+ ::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider"),
+ aCPArgs),
+ UNO_QUERY);
+ if (!xCfgProvider.is())
+ {
+ ::flush(cout);
+ cerr << "Could not create the configuration provider !\n\n";
+ return 3;
+ }
+
+
+
+
+ char aPath[300] = "/";
+ int nStart = sizeof( "/" ) - 1;
+
+ cout << "---------------------------------------------------------------\n Configuration Provider created !\n---------------------------------------------------------------" << endl;
+
+ Sequence< Any > aArgs;
+ aArgs = createSequence(sUser, ASCII(""));
+
+ OUString sPath = enterValue("nodepath: ", s_pRootNode, false);
+ cout << endl;
+
+ aArgs.realloc(aArgs.getLength() + 1);
+ aArgs[aArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("nodepath"), sPath);
+
+ if (!bLocal)
+ {
+ OUString sLocale = enterValue("locale : ", s_pLocale, false);
+ cout << endl;
+ aArgs.realloc(aArgs.getLength() + 1);
+ aArgs[aArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("locale"), sLocale);
+ }
+/*
+#else
+ OUString aStr = ASCII("String");
+ sal_Int32 nDepth = 10;
+ Sequence< Any > aArgs(2);
+
+ aArgs[0] <<= aStr;
+ aArgs[1] <<= nDepth;
+#endif
+*/
+ Reference< XInterface > xIFace = xCfgProvider->createInstanceWithArguments(
+ OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"),
+ aArgs);
+ cout << "---------------------------------------------------------------\n Configuration Read/Write Access created !\n---------------------------------------------------------------" << endl;
+
+ xChangesBatch = Reference< XChangesBatch >(xIFace, UNO_QUERY);
+
+ Sequence<OUString> aSeq = xCfgProvider->getAvailableServiceNames();
+ showSequence(aSeq);
+
+ test_read_access(xIFace, xCfgProvider);
+ }
+ catch (Exception& e)
+ {
+ ::flush(cout);
+ cerr << "Caught exception: " << e.Message << endl;
+ }
+/*
+ catch (...)
+ {
+ flush(cout);
+ cerr << "BUG: Caught UNKNOWN exception (?) " << endl;
+ }
+*/
+ return 0;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+void test(Reference< XHierarchicalName >& xAccessName)
+{
+ if (xAccessName.is())
+ cout << "Accessing Node: " << xAccessName->getHierarchicalName();
+ else
+ cout << "BUG: XHierarchicalName not available";
+ cout << endl;
+}
+void test(Reference< XNamed >& xAccess)
+{
+ if (xAccess.is())
+ cout << "Node is named: " << xAccess->getName();
+ else
+ cout << "BUG: XNamed not available";
+ cout << endl;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+void write(Reference<XNameAccess >& xAccess)
+{
+ if (xAccess.is())
+ {
+ Sequence<OUString> aNames( xAccess->getElementNames() );
+
+ cout << "Element Names: (" << aNames.getLength() << ")";
+ for (int i = 0; i < aNames.getLength(); ++i)
+ cout << "\n[" << i << "] -\t" << aNames[i];
+ cout << endl;
+ }
+ else
+ cout << "BUG: XNameAccess not available";
+ cout << endl;
+}
+void write(Reference< XChild >& xChild)
+{
+ if (xChild.is())
+ cout << "\n[ P ] -\tParent";
+ else
+ cout << "BUG: Parent not available (no XChild)";
+ cout << endl;
+}
+///////////////////////////////////////////////////////////////////////////////////////////
+
+bool ask(Reference< XInterface >& xIface, Reference<XMultiServiceFactory> &);
+
+void test_read_access(Reference< XInterface >& xIface, Reference< XMultiServiceFactory > &xMSF)
+{
+ using com::sun::star::uno::UNO_QUERY;
+ do
+ {
+ cout << "\n\n---------------------------------------------------------------" << endl;
+ Reference< XNameAccess > xAccess(xIface, UNO_QUERY);
+ Reference< XChild > xChild(xIface, UNO_QUERY);
+ Reference< XHierarchicalName > xAccessPath(xIface,UNO_QUERY);
+ Reference< XNamed > xAccessName(xIface,UNO_QUERY);
+// Reference< XHierarchicalNameAccess >& xAccess(xIface, UNO_QUERY);
+
+ test(xAccessPath);
+ test(xAccessName);
+ write(xAccess);
+ write(xChild);
+ }
+ while (ask(xIface, xMSF));
+}
+
+bool ask(Reference< XInterface >& xIface, Reference< XMultiServiceFactory > &xMSF)
+{
+ cout << "\n[ Q ] -> <Quit>";
+ cout << "\n[ S ] -> <SetValue> ";
+ cout << endl;
+
+ cout << "\n:> " << flush;
+ char buf[200] = {0};
+ try
+ {
+ bool bHandled = false;
+ bool bInserted = false;
+
+ if (cin.getline(buf,sizeof buf))
+ {
+ Reference< XInterface > xNext;
+ if ((buf[0] == 'q' || buf[0] == 'Q') && (0 == buf[1]))
+ {
+ return false;
+ }
+ else if (buf[0] == 0)
+ {
+ return true;
+ }
+ else if((buf[0] == 0 || buf[0] == 'o' || buf[0] == 'O') && (0 == buf[1]))
+ {
+/*
+ cout << "work Offline" << endl;
+ Reference<com::sun::star::configuration::XConfigurationSync> xSync(xMSF, UNO_QUERY);
+
+ Sequence< Any > aArgs2(5);
+ sal_Int32 n=0;
+ aArgs2[n++] <<= configmgr::createPropertyValue(ASCII("path"), ASCII("org.openoffice.Setup"));
+ // aArgs2[n++] <<= configmgr::createPropertyValue(ASCII("path"), ASCII("org.openoffice.Office.Common"));
+ // aArgs2[n++] <<= configmgr::createPropertyValue(ASCII("path"), ASCII("org.openoffice.Office.Java"));
+ // aArgs2[n++] <<= configmgr::createPropertyValue(ASCII("path"), ASCII("org.openoffice.Office.Writer"));
+ // aArgs2[n++] <<= configmgr::createPropertyValue(ASCII("path"), ASCII("org.openoffice.Office.ucb.Hierarchy"));
+ xSync->offline(aArgs2);
+ bHandled = true;
+*/
+ }
+ else if((buf[0] == 0 || buf[0] == 's' || buf[0] == 'S') && (0 == buf[1]))
+ {
+ // Replace a Value
+ Reference< XNameAccess > xAccess(xIface, UNO_QUERY);
+
+ cout << "SetMode, insert a Number" << endl;
+ cin.getline(buf,sizeof buf);
+ bInserted = true;
+ }
+
+ else if ((buf[0] == 'p' || buf[0] == 'P') && (0 == buf[1]))
+ {
+ Reference< XChild > xChild(xIface, UNO_QUERY);
+ if (xChild.is())
+ xNext = xChild->getParent();
+ bHandled = true;
+ }
+
+ if (bHandled == false)
+ {
+ Reference< XNameAccess > xAccess(xIface, UNO_QUERY);
+ Reference< XHierarchicalNameAccess > xDeepAccess(xIface, UNO_QUERY);
+ Reference< XExactName > xExactName(xIface, UNO_QUERY);
+
+ if (xAccess.is() || xDeepAccess.is())
+ {
+ OUString aName;
+ OUString aInput = OUString::createFromAscii(buf);
+
+ if (xExactName.is())
+ {
+ ::rtl::OUString sTemp = xExactName->getExactName(aInput);
+ if (sTemp.getLength())
+ aInput = sTemp;
+ }
+
+ if (xAccess.is() && xAccess->hasByName(aInput))
+ {
+ aName = aInput;
+ }
+ else if (xDeepAccess.is() && xDeepAccess->hasByHierarchicalName(aInput))
+ {
+ aName = aInput;
+ }
+ else if ('0' <= buf[0] && buf[0] <= '9' && xAccess.is())
+ {
+ unsigned int n = unsigned(atoi(buf));
+ Sequence<OUString> aNames = xAccess->getElementNames();
+ if (n < aNames.getLength())
+ aName = aNames[n];
+ }
+
+ if (aName.getLength())
+ {
+ bool bNest = aInput.indexOf(sal_Unicode('/')) >= 0;
+
+ Any aElement = bNest ? ( xDeepAccess.is() ? xDeepAccess->getByHierarchicalName(aName) : Any())
+ : ( xAccess. is() ? xAccess-> getByName(aName) : Any() );
+
+ while (aElement.getValueTypeClass() == TypeClass_ANY)
+ {
+ Any aWrap(aElement);
+ aWrap >>= aElement;
+ }
+ sal_Bool bValue = true;
+ sal_Bool bValueOk = false;
+
+ switch (aElement.getValueTypeClass() )
+ {
+ case TypeClass_INTERFACE: bValue = false; break;
+ case TypeClass_BOOLEAN:
+ {
+ sal_Bool* pVal = (sal_Bool*)aElement.getValue();
+ bValueOk = (pVal != 0);
+
+ cout << "VALUE '" << aName << "' is a BOOLEAN = ";
+ if (!bValueOk)
+ cout << "NULL (error!!)";
+ else if (*pVal)
+ cout << "'TRUE'";
+ else
+ cout << "'FALSE'";
+
+ cout << endl;
+ }
+ break;
+ case TypeClass_SHORT:
+ {
+ sal_Int16 aValue;
+ cout << "VALUE '" << aName << "' is a SHORT (16 bit) = ";
+ if (bValueOk = (aElement >>= aValue))
+ cout << aValue;
+ else
+ cout << "ERROR RETRIEVING VALUE";
+ cout << endl;
+ }
+ break;
+ case TypeClass_LONG:
+ {
+
+ sal_Int32 aValue;
+ cout << "VALUE '" << aName << "' is a INT (32 bit) = ";
+ if (bValueOk = (aElement >>= aValue))
+ cout << aValue;
+ else
+ cout << "ERROR RETRIEVING VALUE";
+ cout << endl;
+ }
+ break;
+ case TypeClass_HYPER:
+ {
+ sal_Int64 aValue;
+ cout << "VALUE '" << aName << "' is a LONG (64 bit) = ";
+ if (bValueOk = (aElement >>= aValue))
+ cout << double(aValue);
+ else
+ cout << "ERROR RETRIEVING VALUE";
+ cout << endl;
+ }
+ break;
+ case TypeClass_DOUBLE:
+ {
+ double aValue;
+ cout << "VALUE '" << aName << "' is a DOUBLE = ";
+ if (bValueOk = (aElement >>= aValue))
+ cout << aValue;
+ else
+ cout << "ERROR RETRIEVING VALUE";
+ cout << endl;
+ }
+ break;
+ case TypeClass_STRING:
+ {
+ OUString aValue;
+ cout << "VALUE '" << aName << "' is a STRING = ";
+ if (bValueOk = (aElement >>= aValue))
+ cout << "\"" << aValue << "\"";
+ else
+ cout << "ERROR RETRIEVING VALUE";
+ cout << endl;
+ }
+ break;
+ case TypeClass_SEQUENCE:
+ {
+ cout << "VALUE '" << aName << "' is a SEQUENCE or BINARY" << endl;
+
+ Type aTypeS = configmgr::getSequenceElementType(aElement.getValueType());
+ OUString sType = configmgr::toTypeName(aTypeS.getTypeClass());
+ cout << "Real type is Sequence<" << sType << ">" << endl;
+ bValueOk = true;
+ }
+ break;
+ case TypeClass_VOID:
+ cout << "ELEMENT '" << aName << "' is NULL and VOID " << endl;
+ bValueOk = true;
+ break;
+ default:
+ cout << "Error: ELEMENT '" << aName << "' is of unknown or unrecognized type" << endl;
+ break;
+ }
+ if (bValue)
+ {
+ if (bInserted)
+ {
+ if (aElement.getValueTypeClass() == TypeClass_BOOLEAN ||
+ aElement.getValueTypeClass() == TypeClass_VOID)
+ {
+ cout << "Set Value (Type=BOOL) to :";
+ cout.flush();
+ cin.getline(buf,sizeof buf);
+ OUString aInput = OUString::createFromAscii(buf);
+ sal_Bool bValue = false;
+ if (aInput.equalsIgnoreAsciiCase(ASCII("true")))
+ bValue = true;
+
+ OUString aStr = ASCII("false");
+ Any aValueAny;
+ aValueAny <<= bValue;
+
+ Reference< XNameReplace > xNameReplace(xAccess, UNO_QUERY);
+ if (xNameReplace.is())
+ {
+ xNameReplace->replaceByName(aName, aValueAny);
+ commit();
+ }
+ bInserted = false;
+ }
+ else if (aElement.getValueTypeClass() == TypeClass_STRING)
+ {
+ cout << "set value (type = string) to : ";
+ cout.flush();
+ cin.getline(buf,sizeof buf);
+ Any aValue;
+ aValue <<= buf;
+
+ Reference< XNameReplace > xNameReplace(xAccess, UNO_QUERY);
+ if (xNameReplace.is())
+ {
+ xNameReplace->replaceByName(aName, aValue);
+ commit();
+ }
+ bInserted = false;
+ }
+ else
+ {
+ cout << "Sorry, only BOOLEAN Values can changed today." << endl;
+ }
+ }
+ prompt_and_wait();
+ return bValueOk ? true : false;
+ }
+
+ if (aElement >>= xNext)
+ cout << "Got an Interface for '" << aName << "'" << endl;
+ else
+ cout << "Error: Cannot get an Interface for '" << aName << "'" << endl;
+ }
+ else
+ {
+ cout << "Error: No element \"" << aInput << "\" found." <<endl;
+ }
+ }
+
+ }
+ if (xNext.is())
+ {
+ xIface = xNext;
+ return true;
+ }
+ cout << "Error: could not obtain the requested Object " << endl;
+ }
+ else
+ {
+ cout << "Input Error " << endl;
+ return true;
+ }
+ }
+ catch (Exception& e)
+ {
+ cout << "An Exception occurred: " << e.Message << endl;
+
+ }
+ catch (...)
+ {
+ cout << "An UNKNOWN Exception occurred !" << endl;
+ }
+
+ prompt_and_wait();
+ return true;
+}
diff --git a/configmgr/workben/apitest/cfgapi_timetest.cxx b/configmgr/workben/apitest/cfgapi_timetest.cxx
new file mode 100644
index 000000000000..cd39ce0372d6
--- /dev/null
+++ b/configmgr/workben/apitest/cfgapi_timetest.cxx
@@ -0,0 +1,960 @@
+/*************************************************************************
+ *
+ * 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: cfgapi_timetest.cxx,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.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_configmgr.hxx"
+#define _PRIVATE_TEST_
+
+#include <iostream>
+using namespace std;
+
+#include <vector>
+
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/uno/Type.hxx>
+#include <com/sun/star/uno/TypeClass.hpp>
+
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XHierarchicalName.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/container/XNameReplace.hpp>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/beans/XExactName.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+
+
+#include <rtl/ustring.hxx>
+#include <rtl/string.hxx>
+#include <cppuhelper/servicefactory.hxx>
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/uno/Any.h>
+#include <osl/profile.hxx>
+#include <osl/process.h>
+#include <osl/file.h>
+
+#include "createpropertyvalue.hxx"
+
+#include "typeconverter.hxx"
+
+// #include <com/sun/star/configuration/XConfigurationSync.hpp>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::beans;
+//using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::util;
+
+using ::rtl::OUString;
+using ::rtl::OString;
+//using namespace ::configmgr;
+
+using namespace ::cppu;
+
+#define ASCII(x) ::rtl::OUString::createFromAscii(x)
+
+bool m_bInteractive = false;
+
+#define COUT if(m_bInteractive) cout
+
+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;
+}
+
+void showSequence(const Sequence<OUString> &aSeq)
+{
+ OUString aArray;
+ const OUString *pStr = aSeq.getConstArray();
+ for (int i=0;i<aSeq.getLength();i++)
+ {
+ OUString aStr = pStr[i];
+ // aArray += aStr + ASCII(", ");
+ COUT << aStr << endl;
+ }
+ volatile int dummy = 0;
+}
+
+//=============================================================================
+
+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();
+}
+
+//=============================================================================
+void test_read_access(Reference< XInterface >& xIface, const Reference< XMultiServiceFactory > &xMSF);
+//=============================================================================
+
+// -----------------------------------------------------------------------------
+struct prompt_and_wait
+{
+ char const* myText;
+ prompt_and_wait(char const* text = "") : myText(text) {}
+ ~prompt_and_wait()
+ {
+ if (m_bInteractive)
+ {
+ COUT << myText << ">" << endl;
+ int const mx = int( (+0u - +1u) >> 1);
+
+ char c=0;
+ if (cin.get(c) && c != '\n')
+ cin.ignore(mx,'\n');
+ }
+ }
+};
+static prompt_and_wait exit_prompt("Quitting\nQ");
+
+
+Reference< XChangesBatch > xChangesBatch = NULL;
+void commit()
+{
+ if (xChangesBatch.is())
+ {
+ xChangesBatch->commitChanges();
+ }
+}
+
+// -----------------------------------------------------------------------------
+static sal_Bool s_bInitialized = sal_False;
+static const sal_Char* s_pSourcePath = "f:/office60_623/share/config/registry";
+static const sal_Char* s_pUpdatePath = "f:/office60_623/user/config/registry";
+static const sal_Char* s_pRootNode = "org.openoffice.Office.Common";
+static const sal_Char* s_pServerType = "local";
+static const sal_Char* s_pLocale = "de-DE";
+static const sal_Char* s_pServer = "lautrec-3108:19205";
+static const sal_Char* s_pUser = "lars";
+static const sal_Char* s_pPassword = "";
+
+std::vector<rtl::OString> m_sNodes;
+
+// -----------------------------------------------------------------------------
+static void loadDefaults()
+{
+ if (s_bInitialized)
+ return;
+
+ s_bInitialized = sal_True;
+
+ try
+ {
+ // the executable file name
+ ::rtl::OUString sExecutable;
+ osl_getExecutableFile(&sExecutable.pData);
+ // cut the name, add a cfgapi.ini to the path
+ sal_Int32 nLastSep = sExecutable.lastIndexOf('/');
+ if (-1 != nLastSep)
+ sExecutable = sExecutable.copy(0, nLastSep + 1);
+#ifdef UNX
+ sExecutable += ::rtl::OUString::createFromAscii("cfgapirc");
+#else
+ sExecutable += ::rtl::OUString::createFromAscii("cfgapi.ini");
+#endif
+ ::rtl::OUString sSystem;
+ if (osl_File_E_None == osl_getSystemPathFromFileURL(sExecutable.pData, &sSystem.pData))
+ {
+ ::osl::Profile aProfile(sExecutable);
+
+ static ::rtl::OString sSection("defaults");
+ static ::rtl::OString sSourcePath("sourcepath");
+ static ::rtl::OString sUpdatePath("updatepath");
+ static ::rtl::OString sRootNode("rootnode");
+ static ::rtl::OString sServerType("servertype");
+ static ::rtl::OString sLocale("Locale");
+ static ::rtl::OString sServer("Server");
+ static ::rtl::OString sUser("User");
+ static ::rtl::OString sPassword("Password");
+
+ // read some strings.
+ // Do this static because we want to redirect the global static character pointers to the buffers.
+ static ::rtl::OString s_sSourcePath = aProfile.readString(sSection, sSourcePath, s_pSourcePath);
+ static ::rtl::OString s_sUpdatePath = aProfile.readString(sSection, sUpdatePath, s_pUpdatePath);
+ static ::rtl::OString s_sRootNode = aProfile.readString(sSection, sRootNode, s_pRootNode);
+ static ::rtl::OString s_sServerType = aProfile.readString(sSection, sServerType, s_pServerType);
+ static ::rtl::OString s_sLocale = aProfile.readString(sSection, sLocale, s_pLocale);
+ static ::rtl::OString s_sServer = aProfile.readString(sSection, sServer, s_pServer);
+ static ::rtl::OString s_sUser = aProfile.readString(sSection, sUser, s_pUser);
+ static ::rtl::OString s_sPassword = aProfile.readString(sSection, sPassword, s_pPassword);
+
+ // do this redirection
+ s_pSourcePath = s_sSourcePath.getStr();
+ s_pUpdatePath = s_sUpdatePath.getStr();
+ s_pRootNode = s_sRootNode.getStr();
+ s_pServerType = s_sServerType.getStr();
+ s_pLocale = s_sLocale.getStr();
+ s_pServer = s_sServer.getStr();
+ s_pUser = s_sUser.getStr();
+ s_pPassword = s_sPassword.getStr();
+
+ static ::rtl::OString sNodeSection("nodes");
+ static ::rtl::OString sCount("count");
+ rtl::OUString sCountValue;
+ sCountValue <<= aProfile.readString(sNodeSection, sCount, "0");
+ sal_Int32 nCount = sCountValue.toInt32();
+ for (sal_Int32 i=0;i<nCount;i++)
+ {
+ ::rtl::OString sNodeName("node");
+ sNodeName += OString::valueOf(i);
+ ::rtl::OString sNode = aProfile.readString(sNodeSection, sNodeName, "");
+ m_sNodes.push_back(sNode);
+ }
+ }
+ }
+ catch(std::exception& e)
+ {
+ e.what(); // silence warnings
+ }
+}
+
+// -----------------------------------------------------------------------------
+Sequence<Any> createSequence(const OUString &sUser, const OUString &sPasswd)
+{
+ Sequence< Any > aCPArgs;
+
+ if (sUser.getLength() > 0)
+ {
+ aCPArgs.realloc(1);
+ aCPArgs[0] <<= configmgr::createPropertyValue(ASCII("user"), sUser);
+ }
+ if (sPasswd.getLength() > 0)
+ {
+ aCPArgs.realloc(2);
+ aCPArgs[1] <<= configmgr::createPropertyValue(ASCII("password"), sPasswd);
+ }
+ return aCPArgs;
+}
+
+//=============================================================================
+#include <string.h>
+#if (defined UNX) || (defined OS2)
+#else
+#include <conio.h>
+#endif
+
+OString input(const char* pDefaultText, char cEcho)
+{
+ // PRE: a Default Text would be shown, cEcho is a Value which will show if a key is pressed.
+ const int MAX_INPUT_LEN = 500;
+ char aBuffer[MAX_INPUT_LEN];
+
+ strcpy(aBuffer, pDefaultText);
+ int nLen = strlen(aBuffer);
+
+#ifdef WNT
+ char ch = '\0';
+
+ COUT << aBuffer;
+ cout.flush();
+
+ while(ch != 13)
+ {
+ ch = getch();
+ if (ch == 8)
+ {
+ if (nLen > 0)
+ {
+ COUT << "\b \b";
+ cout.flush();
+ --nLen;
+ aBuffer[nLen] = '\0';
+ }
+ else
+ {
+ COUT << "\a";
+ cout.flush();
+ }
+ }
+ else if (ch != 13)
+ {
+ if (nLen < MAX_INPUT_LEN)
+ {
+ if (cEcho == 0)
+ {
+ COUT << ch;
+ }
+ else
+ {
+ COUT << cEcho;
+ }
+ cout.flush();
+ aBuffer[nLen++] = ch;
+ aBuffer[nLen] = '\0';
+ }
+ else
+ {
+ COUT << "\a";
+ cout.flush();
+ }
+ }
+ }
+#else
+ if (!cin.getline(aBuffer,sizeof aBuffer))
+ return OString();
+#endif
+ return OString(aBuffer);
+}
+
+
+// -----------------------------------------------------------------------------
+rtl::OUString enterValue(const char* _aStr, const char* _aDefault, bool _bIsAPassword)
+{
+ COUT << _aStr;
+ cout.flush();
+
+ OUString sValue;
+ if (m_bInteractive)
+ {
+ sValue <<= input(_aDefault, _bIsAPassword ? '*' : 0);
+ }
+ else
+ {
+ sValue <<= _aDefault;
+ }
+ return sValue;
+}
+
+
+
+void ask_for_a_node_and_test_it(const Reference< XMultiServiceFactory > &xCfgProvider,
+ const OUString& sUser, const OUString &sPasswd,
+ const OUString& sPath, bool bLocal, const OUString &sLocale);
+
+// -----------------------------------------------------------------------------
+// ---------------------------------- M A I N ----------------------------------
+// -----------------------------------------------------------------------------
+
+#if (defined UNX) || (defined OS2)
+int main( int argc, char * argv[] )
+#else
+int _cdecl main( int argc, char * argv[] )
+#endif
+{
+ TimeValue aTimeout;
+ aTimeout.Seconds = 5;
+ aTimeout.Nanosec = 0;
+
+ // COUT << " Please insert Text: ";
+ // cout.flush();
+ // OString aTxt = input("Der Text", 0);
+ // COUT << endl << "You inserted: " << aTxt.getStr() << endl;
+ //
+ // COUT << "Please insert Password: ";
+ // cout.flush();
+ // OString aPasswd = input("", '*');
+ // COUT << endl << "You inserted: " << aPasswd.getStr() << endl;
+
+ loadDefaults();
+
+ m_bInteractive = false;
+ //if (argc > 1)
+ //{
+ // OString aParam(argv[1]);
+ // if (aParam.equals("ask"))
+ // {
+ // m_bInteractive = true;
+ // }
+ //}
+
+ try
+ {
+ OUString const sServiceRegistry = OUString::createFromAscii( argc > 1 ? argv[1] : "applicat.rdb" );
+ Reference< XMultiServiceFactory > xORB = createRegistryServiceFactory(
+ sServiceRegistry,
+ ::rtl::OUString()
+ );
+ if (!xORB.is())
+ {
+ ::flush(cout);
+ cerr << "Could not create the service factory !\n\n";
+ return 1;
+ }
+ COUT << "Service factory created !\n---------------------------------------------------------------" << endl;
+
+ Sequence< Any > aCPArgs;
+
+ OUString sServerType = enterValue("servertype: ", s_pServerType, false);
+ COUT << endl;
+
+
+ rtl::OUString sUser, sPasswd;
+
+ bool bLocal = sServerType.equalsIgnoreAsciiCase(ASCII("local")) || sServerType.equalsIgnoreAsciiCase(ASCII("setup"));
+ if (!bLocal)
+ {
+ rtl::OUString sServer;
+ sServer = enterValue("server : ", s_pServer,false);
+ COUT << endl;
+
+ sUser = enterValue("user : ", s_pUser, false);
+ COUT << endl;
+
+ sPasswd = enterValue("password: ", s_pPassword, true);
+ COUT << endl;
+
+ aCPArgs = createSequence(sUser, sPasswd);
+
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ aCPArgs[aCPArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("server"), sServer);
+
+ long nTimeout = 10000;
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ aCPArgs[aCPArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("timeout"), nTimeout);
+
+ long nPort = 9205;
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ aCPArgs[aCPArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("port"), nPort);
+ }
+ else
+ {
+ rtl::OUString sSharePath, sUserPath;
+ sSharePath = enterValue("share path: ", s_pSourcePath, false);
+ COUT << endl;
+ sUserPath = enterValue("user path : ", s_pUpdatePath, false);
+ COUT << endl;
+
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ Any* pAny;
+ pAny = &aCPArgs[aCPArgs.getLength() - 1];
+ *pAny <<= configmgr::createPropertyValue(ASCII("sourcepath"), sSharePath);
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ aCPArgs[aCPArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("updatepath"), sUserPath);
+ }
+
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ aCPArgs[aCPArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("servertype"), sServerType);
+
+ Reference< XMultiServiceFactory > xCfgProvider(
+ xORB->createInstanceWithArguments(
+ ::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider"),
+ aCPArgs),
+ UNO_QUERY);
+ if (!xCfgProvider.is())
+ {
+ ::flush(cout);
+ cerr << "Could not create the configuration provider !\n\n";
+ return 3;
+ }
+
+ cout << "---------------------------------------------------------------\n Configuration Provider created !\n---------------------------------------------------------------" << endl;
+
+ OUString sPath;
+ sPath <<= s_pRootNode;
+ OUString sLocale;
+ sLocale <<= s_pLocale;
+
+ if (m_bInteractive)
+ {
+ sPath = enterValue("nodepath: ", s_pRootNode, false);
+ COUT << endl;
+ if (bLocal)
+ {
+ sLocale = enterValue("locale : ", s_pLocale, false);
+ COUT << endl;
+ }
+ ask_for_a_node_and_test_it(xCfgProvider, sUser, sPasswd, sPath, bLocal, sLocale);
+ }
+ else
+ {
+ sUser <<= "";
+ for(std::vector<OString>::const_iterator it = m_sNodes.begin();
+ it != m_sNodes.end();
+ ++it)
+ {
+ OUString sPath;
+ sPath <<= *it;
+ if (sPath.getLength() > 0)
+ ask_for_a_node_and_test_it(xCfgProvider, sUser, sPasswd, sPath, bLocal, sLocale);
+ }
+ }
+ }
+ catch (Exception& e)
+ {
+ ::flush(cout);
+ cerr << "Caught exception: " << e.Message << endl;
+ return 1;
+ }
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+void ask_for_a_node_and_test_it(const Reference< XMultiServiceFactory > &xCfgProvider,
+ const OUString& sUser, const OUString &sPasswd,
+ const OUString& sPath, bool bLocal, const OUString &sLocale)
+{
+ try
+ {
+ Sequence< Any > aArgs;
+ aArgs = createSequence(sUser, sPasswd);
+
+ aArgs.realloc(aArgs.getLength() + 1);
+ aArgs[aArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("nodepath"), sPath);
+
+ if (!bLocal)
+ {
+ aArgs.realloc(aArgs.getLength() + 1);
+ aArgs[aArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("locale"), sLocale);
+ }
+
+ Reference< XInterface > xIFace = xCfgProvider->createInstanceWithArguments(
+ OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"),
+ aArgs);
+ cout << "Configuration Read/Write Access created for :" << sPath << endl;
+
+ xChangesBatch = Reference< XChangesBatch >(xIFace, UNO_QUERY);
+
+ Sequence<OUString> aSeq = xCfgProvider->getAvailableServiceNames();
+ showSequence(aSeq);
+
+ test_read_access(xIFace, xCfgProvider);
+ }
+ catch (Exception& e)
+ {
+ ::flush(cout);
+ cerr << "Caught exception: " << e.Message << endl;
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+void test(Reference< XHierarchicalName >& xAccessName)
+{
+ if (xAccessName.is())
+ {
+ COUT << "Accessing Node: " << xAccessName->getHierarchicalName() << endl;
+ }
+ else
+ {
+ cerr << "BUG: XHierarchicalName not available" << endl;
+ }
+}
+// -----------------------------------------------------------------------------
+void test(Reference< XNamed >& xAccess)
+{
+ if (xAccess.is())
+ {
+ COUT << "Node is named: " << xAccess->getName() << endl;
+ }
+ else
+ cerr << "BUG: XNamed not available" << endl;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+void write(Reference<XNameAccess >& xAccess)
+{
+ if (xAccess.is())
+ {
+ Sequence<OUString> aNames( xAccess->getElementNames() );
+
+ COUT << "Element Names: (" << aNames.getLength() << ")";
+ for (int i = 0; i < aNames.getLength(); ++i)
+ {
+ COUT << "\n[" << i << "] -\t" << aNames[i];
+ }
+ COUT << endl;
+ }
+ else
+ cerr << "BUG: XNameAccess not available" << endl;
+}
+// -----------------------------------------------------------------------------
+void write(Reference< XChild >& xChild)
+{
+ if (xChild.is())
+ {
+ COUT << "\n[ P ] -\tParent" << endl;
+ }
+ else
+ cerr << "BUG: Parent not available (no XChild)" << endl;
+}
+///////////////////////////////////////////////////////////////////////////////////////////
+
+bool ask(Reference< XInterface >& xIface, const Reference<XMultiServiceFactory> &);
+
+void test_read_access(Reference< XInterface >& xIface, const Reference< XMultiServiceFactory > &xMSF)
+{
+ using com::sun::star::uno::UNO_QUERY;
+ do
+ {
+ COUT << "\n\n---------------------------------------------------------------" << endl;
+ Reference< XNameAccess > xAccess(xIface, UNO_QUERY);
+ Reference< XChild > xChild(xIface, UNO_QUERY);
+ Reference< XHierarchicalName > xAccessPath(xIface,UNO_QUERY);
+ Reference< XNamed > xAccessName(xIface,UNO_QUERY);
+// Reference< XHierarchicalNameAccess >& xAccess(xIface, UNO_QUERY);
+
+ test(xAccessPath);
+ test(xAccessName);
+ write(xAccess);
+ write(xChild);
+
+ if (!m_bInteractive) break;
+ }
+ while (ask(xIface, xMSF));
+}
+
+bool ask(Reference< XInterface >& xIface, const Reference< XMultiServiceFactory > &xMSF)
+{
+ COUT << "\n[ Q ] -> <Quit>";
+ COUT << "\n[ S ] -> <SetValue> ";
+ COUT << endl;
+
+ COUT << "\n:> " << flush;
+ char buf[200] = {0};
+ try
+ {
+ bool bHandled = false;
+ bool bInserted = false;
+
+ if (cin.getline(buf,sizeof buf))
+ {
+ Reference< XInterface > xNext;
+ if ((buf[0] == 'q' || buf[0] == 'Q') && (0 == buf[1]))
+ {
+ return false;
+ }
+ else if (buf[0] == 0)
+ {
+ return true;
+ }
+ else if((buf[0] == 0 || buf[0] == 'o' || buf[0] == 'O') && (0 == buf[1]))
+ {
+/*
+ COUT << "work Offline" << endl;
+ Reference<com::sun::star::configuration::XConfigurationSync> xSync(xMSF, UNO_QUERY);
+
+ Sequence< Any > aArgs2(5);
+ sal_Int32 n=0;
+ aArgs2[n++] <<= configmgr::createPropertyValue(ASCII("path"), ASCII("org.openoffice.Setup"));
+ // aArgs2[n++] <<= configmgr::createPropertyValue(ASCII("path"), ASCII("org.openoffice.Office.Common"));
+ // aArgs2[n++] <<= configmgr::createPropertyValue(ASCII("path"), ASCII("org.openoffice.Office.Java"));
+ // aArgs2[n++] <<= configmgr::createPropertyValue(ASCII("path"), ASCII("org.openoffice.Office.Writer"));
+ // aArgs2[n++] <<= configmgr::createPropertyValue(ASCII("path"), ASCII("org.openoffice.Office.ucb.Hierarchy"));
+ xSync->offline(aArgs2);
+ bHandled = true;
+*/
+ }
+ else if((buf[0] == 0 || buf[0] == 's' || buf[0] == 'S') && (0 == buf[1]))
+ {
+ // Replace a Value
+ Reference< XNameAccess > xAccess(xIface, UNO_QUERY);
+
+ COUT << "SetMode, insert a Number" << endl;
+ cin.getline(buf,sizeof buf);
+ bInserted = true;
+ }
+
+ else if ((buf[0] == 'p' || buf[0] == 'P') && (0 == buf[1]))
+ {
+ Reference< XChild > xChild(xIface, UNO_QUERY);
+ if (xChild.is())
+ xNext = xChild->getParent();
+ bHandled = true;
+ }
+
+ if (bHandled == false)
+ {
+ Reference< XNameAccess > xAccess(xIface, UNO_QUERY);
+ Reference< XHierarchicalNameAccess > xDeepAccess(xIface, UNO_QUERY);
+ Reference< XExactName > xExactName(xIface, UNO_QUERY);
+
+ if (xAccess.is() || xDeepAccess.is())
+ {
+ OUString aName;
+ OUString aInput = OUString::createFromAscii(buf);
+
+ if (xExactName.is())
+ {
+ ::rtl::OUString sTemp = xExactName->getExactName(aInput);
+ if (sTemp.getLength())
+ aInput = sTemp;
+ }
+
+ if (xAccess.is() && xAccess->hasByName(aInput))
+ {
+ aName = aInput;
+ }
+ else if (xDeepAccess.is() && xDeepAccess->hasByHierarchicalName(aInput))
+ {
+ aName = aInput;
+ }
+ else if ('0' <= buf[0] && buf[0] <= '9' && xAccess.is())
+ {
+ unsigned int n = unsigned(atoi(buf));
+ Sequence<OUString> aNames = xAccess->getElementNames();
+ if (n < aNames.getLength())
+ aName = aNames[n];
+ }
+
+ if (aName.getLength())
+ {
+ bool bNest = aInput.indexOf(sal_Unicode('/')) >= 0;
+
+ Any aElement = bNest ? ( xDeepAccess.is() ? xDeepAccess->getByHierarchicalName(aName) : Any())
+ : ( xAccess. is() ? xAccess-> getByName(aName) : Any() );
+
+ while (aElement.getValueTypeClass() == TypeClass_ANY)
+ {
+ Any aWrap(aElement);
+ aWrap >>= aElement;
+ }
+ sal_Bool bValue = true;
+ sal_Bool bValueOk = false;
+
+ switch (aElement.getValueTypeClass() )
+ {
+ case TypeClass_INTERFACE: bValue = false; break;
+ case TypeClass_BOOLEAN:
+ {
+ sal_Bool* pVal = (sal_Bool*)aElement.getValue();
+ bValueOk = (pVal != 0);
+
+ COUT << "VALUE '" << aName << "' is a BOOLEAN = ";
+ if (!bValueOk)
+ {
+ COUT << "NULL (error!!)";
+ }
+ else if (*pVal)
+ {
+ COUT << "'TRUE'";
+ }
+ else
+ {
+ COUT << "'FALSE'";
+ }
+ COUT << endl;
+ }
+ break;
+ case TypeClass_SHORT:
+ {
+ sal_Int16 aValue;
+ COUT << "VALUE '" << aName << "' is a SHORT (16 bit) = ";
+ if (bValueOk = (aElement >>= aValue))
+ {
+ COUT << aValue;
+ }
+ else
+ cerr << "ERROR RETRIEVING VALUE";
+ COUT << endl;
+ }
+ break;
+ case TypeClass_LONG:
+ {
+
+ sal_Int32 aValue;
+ COUT << "VALUE '" << aName << "' is a INT (32 bit) = ";
+ if (bValueOk = (aElement >>= aValue))
+ {
+ COUT << aValue;
+ }
+ else
+ cerr << "ERROR RETRIEVING VALUE";
+ COUT << endl;
+ }
+ break;
+ case TypeClass_HYPER:
+ {
+ sal_Int64 aValue;
+ COUT << "VALUE '" << aName << "' is a LONG (64 bit) = ";
+ if (bValueOk = (aElement >>= aValue))
+ {
+ COUT << double(aValue);
+ }
+ else
+ cerr << "ERROR RETRIEVING VALUE";
+ COUT << endl;
+ }
+ break;
+ case TypeClass_DOUBLE:
+ {
+ double aValue;
+ COUT << "VALUE '" << aName << "' is a DOUBLE = ";
+ if (bValueOk = (aElement >>= aValue))
+ {
+ COUT << aValue;
+ }
+ else
+ cerr << "ERROR RETRIEVING VALUE";
+ COUT << endl;
+ }
+ break;
+ case TypeClass_STRING:
+ {
+ OUString aValue;
+ COUT << "VALUE '" << aName << "' is a STRING = ";
+ if (bValueOk = (aElement >>= aValue))
+ {
+ COUT << "\"" << aValue << "\"";
+ }
+ else
+ cerr << "ERROR RETRIEVING VALUE";
+ COUT << endl;
+ }
+ break;
+ case TypeClass_SEQUENCE:
+ {
+ COUT << "VALUE '" << aName << "' is a SEQUENCE or BINARY" << endl;
+
+ Type aTypeS = configmgr::getSequenceElementType(aElement.getValueType());
+ OUString sType = configmgr::toTypeName(aTypeS.getTypeClass());
+ COUT << "Real type is Sequence<" << sType << ">" << endl;
+ bValueOk = true;
+ }
+ break;
+ case TypeClass_VOID:
+ COUT << "ELEMENT '" << aName << "' is NULL and VOID " << endl;
+ bValueOk = true;
+ break;
+ default:
+ cerr << "Error: ELEMENT '" << aName << "' is of unknown or unrecognized type" << endl;
+ break;
+ }
+ if (bValue)
+ {
+ if (bInserted)
+ {
+ if (aElement.getValueTypeClass() == TypeClass_BOOLEAN ||
+ aElement.getValueTypeClass() == TypeClass_VOID)
+ {
+ COUT << "Set Value (Type=BOOL) to :";
+ cout.flush();
+ cin.getline(buf,sizeof buf);
+ OUString aInput = OUString::createFromAscii(buf);
+ sal_Bool bValue = false;
+
+ Any aValueAny;
+ if (aInput.equalsIgnoreAsciiCase(ASCII("true")))
+ {
+ bValue = true;
+ aValueAny <<= bValue;
+ }
+ else if (aInput.equalsIgnoreAsciiCase(ASCII("false")))
+ {
+ bValue = false;
+ aValueAny <<= bValue;
+ }
+ else if (aInput.equalsIgnoreAsciiCase(ASCII("null")))
+ {
+ }
+
+ Reference< XNameReplace > xNameReplace(xAccess, UNO_QUERY);
+ if (xNameReplace.is())
+ {
+ xNameReplace->replaceByName(aName, aValueAny);
+ commit();
+ }
+ bInserted = false;
+ }
+ else if (aElement.getValueTypeClass() == TypeClass_STRING)
+ {
+ COUT << "set value (type = string) to : ";
+ cout.flush();
+ cin.getline(buf,sizeof buf);
+ Any aValue;
+ aValue <<= buf;
+
+ Reference< XNameReplace > xNameReplace(xAccess, UNO_QUERY);
+ if (xNameReplace.is())
+ {
+ xNameReplace->replaceByName(aName, aValue);
+ commit();
+ }
+ bInserted = false;
+ }
+ else
+ {
+ cerr << "Sorry, only BOOLEAN Values can changed today." << endl;
+ }
+ }
+ prompt_and_wait();
+ return bValueOk ? true : false;
+ }
+
+ if (aElement >>= xNext)
+ {
+ COUT << "Got an Interface for '" << aName << "'" << endl;
+ }
+ else
+ cerr << "Error: Cannot get an Interface for '" << aName << "'" << endl;
+ }
+ else
+ {
+ cerr << "Error: No element \"" << aInput << "\" found." <<endl;
+ }
+ }
+
+ }
+ if (xNext.is())
+ {
+ xIface = xNext;
+ return true;
+ }
+ cerr << "Error: could not obtain the requested Object " << endl;
+ }
+ else
+ {
+ COUT << "Input Error " << endl;
+ return true;
+ }
+ }
+ catch (Exception& e)
+ {
+ cerr << "An Exception occurred: " << e.Message << endl;
+
+ }
+ catch (...)
+ {
+ cerr << "An UNKNOWN Exception occurred !" << endl;
+ }
+
+ prompt_and_wait();
+ return true;
+}
diff --git a/configmgr/workben/apitest/cfgregistry.cxx b/configmgr/workben/apitest/cfgregistry.cxx
new file mode 100644
index 000000000000..5666f62be52d
--- /dev/null
+++ b/configmgr/workben/apitest/cfgregistry.cxx
@@ -0,0 +1,172 @@
+/*************************************************************************
+ *
+ * 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: cfgregistry.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_configmgr.hxx"
+#include <memory.h>
+#include <stdio.h>
+#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
+#include <com/sun/star/container/XNameReplace.hpp>
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/registry/XSimpleRegistry.hpp>
+#include <com/sun/star/util/XFlushable.hpp>
+#include <cppuhelper/servicefactory.hxx>
+#include <cppuhelper/implbase1.hxx>
+#ifndef _CPPUHELPER_EXTRACT_HXX_
+#include <cppuhelper/extract.hxx>
+#endif
+#include <vos/conditn.hxx>
+#include <osl/diagnose.h>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::xml;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::registry;
+using namespace ::vos;
+using namespace ::cppu;
+//using namespace ::configmgr;
+
+//=============================================================================
+//= a dirty littly class for printing ascii characters
+//=============================================================================
+class OAsciiOutput
+{
+protected:
+ sal_Char* m_pCharacters;
+
+public:
+ OAsciiOutput(const ::rtl::OUString& _rUnicodeChars);
+ ~OAsciiOutput() { delete m_pCharacters; }
+
+ const sal_Char* getCharacters() const { return m_pCharacters; }
+};
+
+//-----------------------------------------------------------------------------
+OAsciiOutput::OAsciiOutput(const ::rtl::OUString& _rUnicodeChars)
+{
+ sal_Int32 nLen = _rUnicodeChars.getLength();
+ m_pCharacters = new sal_Char[nLen + 1];
+ sal_Char* pFillPtr = m_pCharacters;
+ const sal_Unicode* pSourcePtr = _rUnicodeChars.getStr();
+#if OSL_DEBUG_LEVEL > 1
+ sal_Bool bAsserted = sal_False;
+#endif
+ for (sal_Int32 i=0; i<nLen; ++i, ++pFillPtr, ++pSourcePtr)
+ {
+ OSL_ENSURE(bAsserted || !(bAsserted = (*pSourcePtr >= 0x80)),
+ "OAsciiOutput::OAsciiOutput : non-ascii character found !");
+ *pFillPtr = *reinterpret_cast<const sal_Char*>(pSourcePtr);
+ }
+ *pFillPtr = 0;
+}
+
+#define ASCII_STRING(rtlOUString) OAsciiOutput(rtlOUString).getCharacters()
+#define UNI_STRING(asciiString) ::rtl::OUString::createFromAscii(asciiString)
+
+//=============================================================================
+//=============================================================================
+
+#if (defined UNX) || (defined OS2)
+void main( int argc, char * argv[] )
+#else
+void _cdecl main( int argc, char * argv[] )
+#endif
+{
+ TimeValue aTimeout;
+ aTimeout.Seconds = 5;
+ aTimeout.Nanosec = 0;
+
+ Reference< XMultiServiceFactory > xORB = createRegistryServiceFactory(
+ ::rtl::OUString::createFromAscii("l:\\bin.a\\applicat.rdb"),
+ ::rtl::OUString()
+ );
+ if (!xORB.is())
+ {
+ fprintf(stdout, "could not create the service factory !\n\n");
+ return;
+ }
+
+ try
+ {
+ Reference< XSimpleRegistry > xConfigurationRegistry;
+ printf("instantiating the configuration registry access\n\r");
+ xConfigurationRegistry = xConfigurationRegistry.query(
+ xORB->createInstance(::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationRegistry"))
+ );
+
+ const sal_Char* pLayoutNode = "com.sun.star.Inet";
+ printf("opening the registry access to %s\n\r", pLayoutNode);
+ xConfigurationRegistry->open(UNI_STRING(pLayoutNode), sal_False, sal_False);
+
+ printf("retrieving the root key, enumerating elements\n\r");
+ Reference< XRegistryKey > xRoot = xConfigurationRegistry->getRootKey();
+ Sequence< ::rtl::OUString > aKeyNames = xRoot->getKeyNames();
+ const ::rtl::OUString* pKeyNames = aKeyNames.getConstArray();
+ for (sal_Int32 i=0; i<aKeyNames.getLength(); ++i, ++pKeyNames)
+ printf("\t%i\t%s\n\r", i, ASCII_STRING(*pKeyNames));
+
+ const sal_Char* pUpdateKey = "Proxy/NoProxy";
+ printf("retrieving the key for %s\n\r", pUpdateKey);
+ Reference< XRegistryKey > xTabStopsKey = xRoot->openKey(UNI_STRING(pUpdateKey));
+
+/* xTabStopsKey->createKey(UNI_STRING("blupp"));
+
+ Sequence< ::rtl::OUString > sLanguages = xTabStopsKey->getStringListValue();
+ sLanguages.realloc(sLanguages.getLength() + 1);
+ sLanguages[sLanguages.getLength() - 1] = UNI_STRING("ru");
+ xTabStopsKey->setStringListValue(sLanguages);
+*/
+
+ ::rtl::OUString sTest = xTabStopsKey->getStringValue();
+ xTabStopsKey->setStringValue(UNI_STRING("blimp"));
+
+ printf("flushing the changes\n\r");
+ Reference< XFlushable > xCommit(xConfigurationRegistry, UNO_QUERY);
+ xCommit->flush();
+ }
+ catch(RuntimeException& e)
+ {
+ printf("\n\r\n\rcaught an RuntimeException :\n\r");
+ printf(" exception message : %s\n\r", ASCII_STRING(e.Message));
+ return;
+ }
+ catch(Exception& e)
+ {
+ printf("\n\r\n\rcaught an Exception :\n\r");
+ printf(" exception message : %s\n\r", ASCII_STRING(e.Message));
+ return;
+ }
+}
diff --git a/configmgr/workben/apitest/cfgupdate.cxx b/configmgr/workben/apitest/cfgupdate.cxx
new file mode 100644
index 000000000000..bde03bba9600
--- /dev/null
+++ b/configmgr/workben/apitest/cfgupdate.cxx
@@ -0,0 +1,435 @@
+/*************************************************************************
+ *
+ * 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: cfgupdate.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_configmgr.hxx"
+#define _PRIVATE_TEST_
+
+#include <iostream>
+using namespace std;
+
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/uno/Type.hxx>
+#include <com/sun/star/uno/TypeClass.hpp>
+
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/container/XHierarchicalName.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/container/XNameReplace.hpp>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/beans/XExactName.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+#include <com/sun/star/beans/XHierarchicalPropertySet.hpp>
+
+
+#include <rtl/ustring.hxx>
+#include <rtl/string.hxx>
+#include <osl/time.h>
+#include <cppuhelper/servicefactory.hxx>
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/uno/Any.h>
+
+#include "createpropertyvalue.hxx"
+
+#include "typeconverter.hxx"
+
+// #include <com/sun/star/configuration/XConfigurationSync.hpp>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::beans;
+//using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::util;
+
+using ::rtl::OUString;
+using ::rtl::OString;
+//using namespace ::configmgr;
+
+using namespace ::cppu;
+
+#define ASCII(x) ::rtl::OUString::createFromAscii(x)
+
+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;
+}
+
+void showSequence(const Sequence<OUString> &aSeq)
+{
+ OUString aArray;
+ const OUString *pStr = aSeq.getConstArray();
+ for (int i=0;i<aSeq.getLength();i++)
+ {
+ OUString aStr = pStr[i];
+ // aArray += aStr + ASCII(", ");
+ cout << aStr << endl;
+ }
+ volatile int dummy = 0;
+}
+
+//=============================================================================
+//=============================================================================
+void test_read_access(Reference< XInterface >& xIface, Reference< XMultiServiceFactory > &xMSF);
+//=============================================================================
+struct prompt_and_wait
+{
+ char const* myText;
+ prompt_and_wait(char const* text = "") : myText(text) {}
+ ~prompt_and_wait()
+ {
+ cout << myText << ">" << endl;
+ int const mx = int( (+0u - +1u) >> 1);
+
+ char c=0;
+ if (cin.get(c) && c != '\n')
+ cin.ignore(mx,'\n');
+ }
+};
+static prompt_and_wait exit_prompt("Quitting\nQ");
+
+
+// -----------------------------------------------------------------------------
+Sequence<Any> createSequence(const OUString &sUser, const OUString &sPasswd)
+{
+ Sequence< Any > aCPArgs;
+
+ if (sUser.getLength() > 0)
+ {
+ aCPArgs.realloc(1);
+ aCPArgs[0] <<= configmgr::createPropertyValue(ASCII("user"), sUser);
+ }
+ if (sPasswd.getLength() > 0)
+ {
+ aCPArgs.realloc(2);
+ aCPArgs[1] <<= configmgr::createPropertyValue(ASCII("password"), sPasswd);
+ }
+ return aCPArgs;
+}
+
+//=============================================================================
+#include <string.h>
+#if (defined UNX) || (defined OS2)
+#else
+#include <conio.h>
+#endif
+
+OString input(const char* pDefaultText, char cEcho)
+{
+ // PRE: a Default Text would be shown, cEcho is a Value which will show if a key is pressed.
+ const int MAX_INPUT_LEN = 500;
+ char aBuffer[MAX_INPUT_LEN];
+
+ strcpy(aBuffer, pDefaultText);
+ int nLen = strlen(aBuffer);
+
+#ifdef WNT
+ char ch = '\0';
+
+ cout << aBuffer;
+ cout.flush();
+
+ while(ch != 13)
+ {
+ ch = getch();
+ if (ch == 8)
+ {
+ if (nLen > 0)
+ {
+ cout << "\b \b";
+ cout.flush();
+ --nLen;
+ aBuffer[nLen] = '\0';
+ }
+ else
+ {
+ cout << "\a";
+ cout.flush();
+ }
+ }
+ else if (ch != 13)
+ {
+ if (nLen < MAX_INPUT_LEN)
+ {
+ if (cEcho == 0)
+ {
+ cout << ch;
+ }
+ else
+ {
+ cout << cEcho;
+ }
+ cout.flush();
+ aBuffer[nLen++] = ch;
+ aBuffer[nLen] = '\0';
+ }
+ else
+ {
+ cout << "\a";
+ cout.flush();
+ }
+ }
+ }
+#else
+ if (!cin.getline(aBuffer,sizeof aBuffer))
+ return OString();
+#endif
+ return OString(aBuffer);
+}
+
+// -----------------------------------------------------------------------------
+rtl::OUString enterValue(const char* _aStr, const char* _aDefault, bool _bIsAPassword)
+{
+ cout << _aStr;
+ cout.flush();
+ OString aTxt = input(_aDefault, _bIsAPassword ? '*' : 0);
+
+ OUString sValue = OUString::createFromAscii(aTxt);
+ return sValue;
+}
+
+// -----------------------------------------------------------------------------
+Reference< XNameAccess > beginChanges(Reference< XMultiServiceFactory > xFactory, OUString sPath)
+{
+ Sequence< Any > aArgs(1);
+ aArgs[0] <<= configmgr::createPropertyValue(ASCII("nodepath"),sPath);
+
+ cout << "starting update for node:" << sPath << endl;
+
+ Reference< XNameAccess > xTree(xFactory->createInstanceWithArguments(OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"),
+ aArgs), UNO_QUERY);
+
+ return xTree;
+}
+
+template <class Type>
+// -----------------------------------------------------------------------------
+void update(Reference< XInterface > xIFace, OUString sRelPath, Type sValue)
+{
+ Reference< XHierarchicalPropertySet > xTree(xIFace, UNO_QUERY);
+ Any aValue;
+ aValue <<= sValue;
+
+ cout << "updating node:" << sRelPath << endl;
+ xTree->setHierarchicalPropertyValue(sRelPath, aValue);
+}
+
+// -----------------------------------------------------------------------------
+Reference< XHierarchicalPropertySet > insertTree(Reference< XInterface > xIFace, OUString aName)
+{
+ if (!aName.getLength())
+ aName = enterValue("/nEnter a Tree to insert: ", "", false);
+
+ Reference< XSingleServiceFactory > xFactory(xIFace, UNO_QUERY);
+ Reference< XHierarchicalPropertySet > xNewElement(xFactory->createInstance(), UNO_QUERY);
+
+ cout << "inserting new tree element:" << aName << endl;
+
+ Any aTree;
+ aTree <<= xNewElement;
+ Reference< XNameContainer >(xFactory, UNO_QUERY)->insertByName(aName, aTree);
+
+ return xNewElement;
+}
+
+// -----------------------------------------------------------------------------
+void removeTree(Reference< XInterface > xIFace, OUString aName)
+{
+ if (!aName.getLength())
+ aName = enterValue("/nEnter a Tree to remove: ", "", false);
+
+ cout << "removing new tree element:" << aName << endl;
+
+ Reference< XNameContainer >(xIFace, UNO_QUERY)->removeByName(aName);
+}
+
+// -----------------------------------------------------------------------------
+void commitChanges(Reference< XInterface > xIFace)
+{
+ cout << "committing changes:" << endl;
+
+ Reference< XChangesBatch > xChangesBatch(xIFace, UNO_QUERY);
+ xChangesBatch->commitChanges();
+}
+
+// -----------------------------------------------------------------------------
+void displayTree(Reference< XNameAccess > xIFace, sal_Int32 nLevel)
+{
+ const char* pTab = " ";
+ Sequence<OUString> aNames( xIFace->getElementNames() );
+ for (int i = 0; i < aNames.getLength(); ++i)
+ {
+ Any aElement = xIFace->getByName(aNames[i]);
+ Reference< XNameAccess > xAccess;
+ Reference< XSingleServiceFactory > xFactory;
+ aElement >>= xFactory;
+ aElement >>= xAccess;
+
+ cout << endl;
+ for (int j = 0; j < nLevel; j++)
+ cout << " ";
+
+ if (xAccess.is())
+ {
+ OUString sType;
+ if (xFactory.is())
+ sType = OUString::createFromAscii(" type = 'set' " );
+
+ cout << "<" << aNames[i] << sType << ">";
+ displayTree(xAccess, nLevel + 1);
+ cout << endl << "</" << aNames[i] << ">";
+ }
+ else
+ cout << "<" << aNames[i] << "/>";
+
+ }
+ ::flush(cout);
+}
+
+// -----------------------------------------------------------------------------
+// ---------------------------------- M A I N ----------------------------------
+// -----------------------------------------------------------------------------
+
+#if (defined UNX) || (defined OS2)
+int main( int argc, char * argv[] )
+#else
+int _cdecl main( int argc, char * argv[] )
+#endif
+{
+ TimeValue aTimeout;
+ aTimeout.Seconds = 5;
+ aTimeout.Nanosec = 0;
+
+ // cout << " Please insert Text: ";
+ // cout.flush();
+ // OString aTxt = input("Der Text", 0);
+ // cout << endl << "You inserted: " << aTxt.getStr() << endl;
+ //
+ // cout << "Please insert Password: ";
+ // cout.flush();
+ // OString aPasswd = input("", '*');
+ // cout << endl << "You inserted: " << aPasswd.getStr() << endl;
+
+ try
+ {
+ OUString const sServiceRegistry = OUString::createFromAscii( argc > 1 ? argv[1] : "applicat.rdb" );
+ Reference< XMultiServiceFactory > xORB = createRegistryServiceFactory(
+ sServiceRegistry,
+ ::rtl::OUString()
+ );
+ if (!xORB.is())
+ {
+ ::flush(cout);
+ cerr << "Could not create the service factory !\n\n";
+ return 1;
+ }
+ cout << "Service factory created !\n---------------------------------------------------------------" << endl;
+
+ Sequence< Any > aCPArgs;
+
+ /*OUString sServerType = enterValue("Enter Servertype: ", "remote", false);
+ cout << endl;*/
+
+
+ rtl::OUString sFilePath;
+ rtl::OUString sPort;
+ rtl::OUString sUser;
+
+ sUser = enterValue("Enter User: ", "user1", false);
+ cout << endl;
+
+ OUString sPasswd;// = enterValue("Enter Password: ", "", true);
+ cout << endl;
+
+ aCPArgs = createSequence(sUser, sPasswd);
+
+ Reference< XMultiServiceFactory > xCfgProvider(
+ xORB->createInstanceWithArguments(
+ ::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider"),
+ aCPArgs),
+ UNO_QUERY);
+ if (!xCfgProvider.is())
+ {
+ ::flush(cout);
+ cerr << "Could not create the configuration provider !\n\n";
+ return 3;
+ }
+
+ Reference< XNameAccess > xUpdateAccess;
+
+// now do updates for the user
+ xUpdateAccess = beginChanges(xCfgProvider, OUString::createFromAscii("org.openoffice.Security"));
+ displayTree(xUpdateAccess, 0);
+
+ update(xUpdateAccess, OUString::createFromAscii("_3D_Engine/Dithering"), sal_Bool(sal_False));
+
+/* xUpdateAccess = beginChanges(xCfgProvider, OUString::createFromAscii("org.openoffice.Inet"));
+
+ update(xUpdateAccess, OUString::createFromAscii("Proxy/FTP/Port"), sal_Int32(11));
+ update(xUpdateAccess, OUString::createFromAscii("Proxy/FTP/Name"), OUString::createFromAscii("Test3"));
+ update(xUpdateAccess, OUString::createFromAscii("DNS/IP_Address"), OUString::createFromAscii("Test4"));
+*/
+ commitChanges(xUpdateAccess);
+
+// now do updates with inserting and removing of nodes
+
+ xUpdateAccess = beginChanges(xCfgProvider, OUString::createFromAscii("org.openoffice.Security/MountPoints"));
+ displayTree(xUpdateAccess, 0);
+
+ Reference< XHierarchicalPropertySet > xTree = insertTree(xUpdateAccess, OUString());
+ update(xUpdateAccess, OUString::createFromAscii("InstallationDirectory/Directory"), OUString::createFromAscii("Test1"));
+ removeTree(xUpdateAccess, OUString());
+ commitChanges(xUpdateAccess);
+ }
+ catch (Exception& e)
+ {
+ ::flush(cout);
+ cerr << "Caught exception: " << e.Message << endl;
+ }
+/*
+ catch (...)
+ {
+ ::flush(cout);
+ cerr << "BUG: Caught UNKNOWN exception (?) " << endl;
+ }
+*/
+ return 0;
+}
+
diff --git a/configmgr/workben/apitest/makefile.mk b/configmgr/workben/apitest/makefile.mk
new file mode 100644
index 000000000000..08b46a53f873
--- /dev/null
+++ b/configmgr/workben/apitest/makefile.mk
@@ -0,0 +1,128 @@
+#*************************************************************************
+#
+# 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.15 $
+#
+# 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=$(PRJ)$/source
+
+PRJNAME=configmgr
+
+TARGET=cfgapi
+TARGET2=cfgreg
+TARGET3=cfgadduser
+TARGET4=cfgadmin
+TARGET5=cfgupdate
+TARGET6=cfgapi_timetest
+TARGETTYPE=CUI
+LIBTARGET=NO
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+.INCLUDE : settings.mk
+
+# --- Files --------------------------------------------------------
+
+# ... common for all test executables ..............................
+APPSTDLIBS=\
+ $(SALLIB) \
+ $(VOSLIB) \
+ $(CPPULIB) \
+ $(CPPUHELPERLIB)
+
+# ... cfgapi ..............................
+APP1STDLIBS = $(APPSTDLIBS)
+
+APP1STDLIBS+=$(STDLIBCPP)
+
+APP1TARGET= $(TARGET)
+APP1OBJS= \
+ $(SLO)$/cfgapi.obj \
+ $(SLO)$/strimpl.obj \
+ $(SLO)$/typeconverter.obj \
+ $(SLO)$/simpletypehelper.obj \
+
+# ... cfgapi_timetest ..............................
+APP6STDLIBS = $(APPSTDLIBS)
+
+APP6STDLIBS+=$(STDLIBCPP)
+
+APP6TARGET= $(TARGET6)
+APP6OBJS= \
+ $(SLO)$/cfgapi_timetest.obj \
+ $(SLO)$/strimpl.obj \
+ $(SLO)$/typeconverter.obj \
+ $(SLO)$/simpletypehelper.obj \
+
+# ... cfgreg ..............................
+APP2STDLIBS = $(APPSTDLIBS)
+
+APP2STDLIBS+=$(STDLIBCPP)
+
+APP2TARGET= $(TARGET2)
+APP2OBJS= \
+ $(SLO)$/cfgregistry.obj \
+
+# ... cfgadduser ..............................
+APP3STDLIBS = $(APPSTDLIBS)
+
+APP3STDLIBS+=$(STDLIBCPP)
+
+APP3TARGET= $(TARGET3)
+APP3OBJS= \
+ $(SLO)$/cfgadduser.obj \
+
+# ... cfgadmin ..............................
+APP4STDLIBS = $(APPSTDLIBS)
+
+APP4STDLIBS+=$(STDLIBCPP)
+
+APP4TARGET= $(TARGET4)
+APP4OBJS= \
+ $(SLO)$/cfgadmin.obj \
+ $(SLO)$/strimpl.obj \
+ $(SLO)$/typeconverter.obj \
+ $(SLO)$/simpletypehelper.obj \
+
+# ... cfgupdate ..............................
+APP5STDLIBS = $(APPSTDLIBS)
+
+APP5STDLIBS+=$(STDLIBCPP)
+
+APP5TARGET= $(TARGET5)
+APP5OBJS= \
+ $(SLO)$/cfgupdate.obj \
+ $(SLO)$/strimpl.obj \
+ $(SLO)$/typeconverter.obj \
+ $(SLO)$/simpletypehelper.obj \
+
+.INCLUDE : target.mk
+
+
diff --git a/configmgr/workben/apitest/sregistry b/configmgr/workben/apitest/sregistry
new file mode 100644
index 000000000000..f4f353181f25
--- /dev/null
+++ b/configmgr/workben/apitest/sregistry
@@ -0,0 +1,8 @@
+[configuration]
+servertype=remote
+[RemoteRegistry]
+Server=munch-11072:100
+Timeout=2500
+[LocalRegistry]
+rootpath="G:\Configuration"
+
diff --git a/configmgr/workben/local_io/cfgfile.cxx b/configmgr/workben/local_io/cfgfile.cxx
new file mode 100644
index 000000000000..90f6578385de
--- /dev/null
+++ b/configmgr/workben/local_io/cfgfile.cxx
@@ -0,0 +1,97 @@
+/*************************************************************************
+ *
+ * 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: cfgfile.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_configmgr.hxx"
+
+
+// -----------------------------------------------------------------------------
+// ------------------------------------ main ------------------------------------
+// -----------------------------------------------------------------------------
+
+/*
+ OUString operator+(const OUString &a, const OUString &b)
+ {
+ OUString c = a;
+ c += b;
+ return c;
+ }
+*/
+
+namespace configmgr
+{
+ void simpleMappingTest();
+
+ void importTest();
+ void exportTest();
+
+ void hierarchyTest();
+ //void simpleTest();
+ void speedTest();
+ void stringTest();
+ void classTest();
+ void hash_test();
+ void testRefs();
+ void ConfigName();
+
+ void oslTest();
+}
+
+
+
+#if (defined UNX) || (defined OS2)
+int main( int argc, char * argv[] )
+#else
+ int _cdecl main( int argc, char * argv[] )
+#endif
+{
+
+// configmgr::hierarchyTest();
+
+
+// configmgr::importTest();
+// configmgr::exportTest();
+// configmgr::speedTest();
+// configmgr::simpleTest();
+
+// configmgr::simpleMappingTest();
+// configmgr::stringTest();
+// configmgr::classTest();
+
+// configmgr::hash_test();
+
+ // configmgr::testRefs();
+ // configmgr::ConfigName();
+
+ configmgr::oslTest();
+ return 0;
+}
+
+
diff --git a/configmgr/workben/local_io/cfglocal.cxx b/configmgr/workben/local_io/cfglocal.cxx
new file mode 100644
index 000000000000..da01b4f51232
--- /dev/null
+++ b/configmgr/workben/local_io/cfglocal.cxx
@@ -0,0 +1,623 @@
+/*************************************************************************
+ *
+ * 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: cfglocal.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_configmgr.hxx"
+#define _PRIVATE_TEST_
+
+#include <memory.h>
+#include <string.h>
+#include <stdio.h>
+#include <vos/socket.hxx>
+#include "attributes.hxx"
+
+#ifndef _CONFIGMGR_SESSION_REMOTESESSION_HXX_
+#include "remotesession.hxx"
+#endif
+#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
+#include <cppuhelper/servicefactory.hxx>
+#include <cppuhelper/implbase1.hxx>
+#include <vos/conditn.hxx>
+
+#include <osl/time.h>
+
+#include "localsession.hxx"
+#include "confname.hxx"
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::xml;
+using namespace ::vos;
+using namespace ::cppu;
+using namespace ::configmgr;
+using namespace rtl;
+
+// #define USE_LAYOUT_NODE
+
+//=============================================================================
+//= a dirty littly class for printing ascii characters
+//=============================================================================
+class OAsciiOutput
+{
+protected:
+ sal_Char* m_pCharacters;
+
+public:
+ OAsciiOutput(const ::rtl::OUString& _rUnicodeChars);
+ ~OAsciiOutput() { delete m_pCharacters; }
+
+ const sal_Char* getCharacters() const { return m_pCharacters; }
+};
+
+//-----------------------------------------------------------------------------
+OAsciiOutput::OAsciiOutput(const ::rtl::OUString& _rUnicodeChars)
+{
+ sal_Int32 nLen = _rUnicodeChars.getLength();
+ m_pCharacters = new sal_Char[nLen + 1];
+ sal_Char* pFillPtr = m_pCharacters;
+ const sal_Unicode* pSourcePtr = _rUnicodeChars.getStr();
+#ifdef DBG_UTIL
+ sal_Bool bAsserted = sal_False;
+#endif
+ for (sal_Int32 i=0; i<nLen; ++i, ++pFillPtr, ++pSourcePtr)
+ {
+ OSL_ENSURE(bAsserted || !(bAsserted = (*pSourcePtr >= 0x80)),
+ "OAsciiOutput::OAsciiOutput : non-ascii character found !");
+ *pFillPtr = *reinterpret_cast<const sal_Char*>(pSourcePtr);
+ }
+ *pFillPtr = 0;
+}
+
+#define ASCII_STRING(rtlOUString) OAsciiOutput(rtlOUString).getCharacters()
+#define UNI_STRING(salCharPtr) ::rtl::OUString::createFromAscii(salCharPtr)
+
+//=============================================================================
+//= OOpenNodeCallback
+//=============================================================================
+typedef ::cppu::WeakImplHelper1< sax::XDocumentHandler > OOpenNodeCallback_Base;
+class OOpenNodeCallback : public IOpenObjectCallback, public OOpenNodeCallback_Base
+{
+protected:
+ OUString m_sNodeId;
+ ::vos::OCondition& m_rFinishCondition;
+
+ enum ACTION { STARTELEMENT, CHARACTERS, ENDELEMENT };
+ ACTION m_eLastAction;
+ sal_Int32 m_nLevel;
+ sal_Bool m_bCloseStartTag;
+
+protected:
+ ~OOpenNodeCallback()
+ {
+ }
+
+public:
+ OOpenNodeCallback(::vos::OCondition& _rFinishCond) : m_rFinishCondition(_rFinishCond), m_nLevel(0), m_eLastAction(ENDELEMENT), m_bCloseStartTag(sal_False) { }
+
+ OUString getNodeId() const { return m_sNodeId; }
+
+ // IOpenObjectCallback
+ virtual void gotObjectId(const OUString &aName);
+
+ // IDataRequestCallback
+ virtual Reference< sax::XDocumentHandler > getDataReader() { return static_cast< sax::XDocumentHandler* >(this); }
+
+ // IRequestCallback
+ virtual void acknowledged(sal_Int32 _nTransId);
+ virtual void failed(sal_Int32 _nErrorCode);
+ virtual void done(const StatusInfo& _rStatus);
+
+ // IInterface
+ virtual void SAL_CALL acquire( ) throw (::com::sun::star::uno::RuntimeException) { OOpenNodeCallback_Base::acquire(); }
+ virtual void SAL_CALL release( ) throw (::com::sun::star::uno::RuntimeException) { OOpenNodeCallback_Base::release(); }
+
+ // XDocumentHandler
+ virtual void SAL_CALL startDocument( ) throw(sax::SAXException, RuntimeException) { }
+ virtual void SAL_CALL endDocument( ) throw(sax::SAXException, RuntimeException) { }
+ virtual void SAL_CALL startElement( const ::rtl::OUString& aName, const Reference< sax::XAttributeList >& xAttribs ) throw(sax::SAXException, RuntimeException);
+ virtual void SAL_CALL endElement( const ::rtl::OUString& aName ) throw(sax::SAXException, RuntimeException);
+ virtual void SAL_CALL characters( const ::rtl::OUString& aChars ) throw(sax::SAXException, RuntimeException);
+ virtual void SAL_CALL ignorableWhitespace( const ::rtl::OUString& aWhitespaces ) throw(sax::SAXException, RuntimeException) { }
+ virtual void SAL_CALL processingInstruction( const ::rtl::OUString& aTarget, const ::rtl::OUString& aData ) throw(sax::SAXException, RuntimeException) { }
+ virtual void SAL_CALL setDocumentLocator( const Reference< sax::XLocator >& xLocator ) throw(sax::SAXException, RuntimeException) { }
+};
+
+//.............................................................................
+inline void linefeed()
+{
+ // printf("\n");
+}
+
+//.............................................................................
+void printTabs(sal_Int32 _nCount)
+{
+ sal_Char* pBuffer = new sal_Char[2 * _nCount + 1];
+ memset(pBuffer, ' ', 2 * _nCount);
+ pBuffer[2 * _nCount] = 0;
+ // printf(pBuffer);
+}
+
+//-----------------------------------------------------------------------------
+void SAL_CALL OOpenNodeCallback::startElement( const ::rtl::OUString& _rName, const Reference< sax::XAttributeList >& xAttribs ) throw(sax::SAXException, RuntimeException)
+{
+ switch (m_eLastAction)
+ {
+ case STARTELEMENT:
+ if (m_bCloseStartTag)
+ {
+ // printf(">");
+ }
+
+ m_bCloseStartTag = sal_False;
+ // no break
+ case CHARACTERS:
+ case ENDELEMENT:
+ linefeed();
+ printTabs(m_nLevel);
+ break;
+ }
+ m_eLastAction = STARTELEMENT;
+ ++m_nLevel;
+ // printf("<%s", ASCII_STRING(_rName));
+ m_bCloseStartTag = sal_True;
+}
+
+//-----------------------------------------------------------------------------
+void SAL_CALL OOpenNodeCallback::endElement( const ::rtl::OUString& _rName ) throw(sax::SAXException, RuntimeException)
+{
+ --m_nLevel;
+ switch (m_eLastAction)
+ {
+ case STARTELEMENT:
+ if (m_bCloseStartTag)
+ {
+ // printf("/>");
+ }
+
+ m_bCloseStartTag = sal_False;
+ break;
+ case ENDELEMENT:
+ linefeed();
+ printTabs(m_nLevel);
+ // dont break
+ case CHARACTERS:
+ // printf("</%s>", ASCII_STRING(_rName));
+ break;
+ }
+ m_eLastAction = ENDELEMENT;
+}
+
+//-----------------------------------------------------------------------------
+void SAL_CALL OOpenNodeCallback::characters( const ::rtl::OUString& _rChars ) throw(sax::SAXException, RuntimeException)
+{
+ if (STARTELEMENT == m_eLastAction)
+ {
+ if (m_bCloseStartTag && _rChars.trim().getLength())
+ {
+ // printf(">");
+ m_bCloseStartTag = sal_False;
+ }
+ }
+ if (_rChars.trim().getLength() != 0)
+ {
+ // printf("%s", ASCII_STRING(_rChars));
+ m_eLastAction = CHARACTERS;
+ }
+}
+
+//-----------------------------------------------------------------------------
+void OOpenNodeCallback::gotObjectId(const OUString &_nId)
+{
+ m_sNodeId = _nId;
+ // printf("object id %i\n", m_nNodeId);
+}
+
+//-----------------------------------------------------------------------------
+void OOpenNodeCallback::acknowledged(sal_Int32 _nTransId)
+{
+ // printf("acknowledged, transaction id : %i\n", _nTransId);
+}
+
+//-----------------------------------------------------------------------------
+void OOpenNodeCallback::failed(sal_Int32 _nErrorCode)
+{
+ // printf("failed because of a connection error (%i)\n", _nErrorCode);
+ m_rFinishCondition.set();
+}
+
+//-----------------------------------------------------------------------------
+void OOpenNodeCallback::done(const StatusInfo& _rStatus)
+{
+ if (_rStatus.nCode)
+ {
+ printf("\n\ndone, but had an error : %s\n", ASCII_STRING(_rStatus.sMessage));
+ }
+ else
+ {
+ // printf("\n\nsuccessfully done\n", ASCII_STRING(_rStatus.sMessage));
+ }
+
+ m_rFinishCondition.set();
+}
+
+//=============================================================================
+//= ONodeUpdater
+//=============================================================================
+class ONodeUpdater : public IDOMNodeDataProvider
+{
+ sal_Bool m_bWriterLevel;
+ sal_Bool m_bAdd;
+public:
+ ONodeUpdater(sal_Bool _bStartAtWriterLevel, sal_Bool bAdd) : m_bWriterLevel(_bStartAtWriterLevel), m_bAdd(bAdd) { }
+
+ virtual void writeNodeData(const Reference< sax::XDocumentHandler >& _rHandler);
+};
+
+//-----------------------------------------------------------------------------
+void ONodeUpdater::writeNodeData(const Reference< sax::XDocumentHandler >& _rHandler)
+{
+ AttributeListImpl *pAttr = new AttributeListImpl;
+ Reference< sax::XAttributeList > xEmptyAttrList = pAttr;
+
+ pAttr = new AttributeListImpl;
+ pAttr->addAttribute(UNI_STRING("type"),UNI_STRING("CDATA"),UNI_STRING("string"));
+ Reference< sax::XAttributeList > xStringAttrList = pAttr;
+
+ if (m_bWriterLevel)
+ _rHandler->startElement(UNI_STRING("Writer"), xEmptyAttrList);
+#ifdef USE_LAYOUT_NODE
+ _rHandler->startElement(UNI_STRING("Layout"), xEmptyAttrList);
+ _rHandler->startElement(UNI_STRING("TabStops"), xEmptyAttrList);
+ if (m_bAdd)
+ _rHandler->characters(UNI_STRING("0.90"));
+ else
+ _rHandler->characters(UNI_STRING("99.99"));
+
+ _rHandler->endElement(UNI_STRING("TabStops"));
+ _rHandler->endElement(UNI_STRING("Layout"));
+#else
+ // _rHandler->startElement(UNI_STRING("com.sun.star.office.Setup"), xEmptyAttrList);
+ _rHandler->startElement(UNI_STRING("Modules"), xEmptyAttrList);
+ _rHandler->startElement(UNI_STRING("StandFonts"), xEmptyAttrList);
+ _rHandler->startElement(UNI_STRING("Standard"), xStringAttrList);
+ _rHandler->startElement(UNI_STRING("value"), xEmptyAttrList);
+ if (m_bAdd)
+ _rHandler->characters(UNI_STRING("Arial"));
+ else
+ _rHandler->characters(UNI_STRING("Courier"));
+
+ _rHandler->endElement(UNI_STRING("value"));
+ _rHandler->endElement(UNI_STRING("Standard"));
+ _rHandler->endElement(UNI_STRING("StandFonts"));
+ _rHandler->endElement(UNI_STRING("Modules"));
+ // _rHandler->endElement(UNI_STRING("com.sun.star.office.Setup"));
+
+ _rHandler->ignorableWhitespace(OUString());
+#endif
+ if (m_bWriterLevel)
+ _rHandler->endElement(UNI_STRING("Writer"));
+}
+
+//=============================================================================
+//= OSessionListener
+//=============================================================================
+class OSessionListener : public ISessionListener
+{
+protected:
+ oslInterlockedCount m_refCount;
+
+public:
+ // ISessionListener
+ virtual void nodeUpdated(const ::rtl::OUString& _rNodePath);
+ virtual void nodeDeleted(const ::rtl::OUString& _rNodePath);
+ virtual void nodeAdded(const ::rtl::OUString& _rNodePath);
+
+ // IInterface
+ virtual void SAL_CALL acquire( ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL release( ) throw (::com::sun::star::uno::RuntimeException);
+};
+
+//-----------------------------------------------------------------------------
+void OSessionListener::nodeUpdated(const ::rtl::OUString& _rNodePath)
+{
+ // printf("[listener] : a node was updated, node path : %s\n", ASCII_STRING(_rNodePath));
+}
+
+//-----------------------------------------------------------------------------
+void OSessionListener::nodeDeleted(const ::rtl::OUString& _rNodePath)
+{
+ // printf("[listener] : a node was deleted, node path : %s\n", ASCII_STRING(_rNodePath));
+}
+
+//-----------------------------------------------------------------------------
+void OSessionListener::nodeAdded(const ::rtl::OUString& _rNodePath)
+{
+ // printf("\n[listener] : a node was added, node path : %s", ASCII_STRING(_rNodePath));
+}
+
+//-----------------------------------------------------------------------------
+void SAL_CALL OSessionListener::acquire( ) throw (::com::sun::star::uno::RuntimeException)
+{
+ osl_incrementInterlockedCount(&m_refCount);
+}
+
+//-----------------------------------------------------------------------------
+void SAL_CALL OSessionListener::release( ) throw (::com::sun::star::uno::RuntimeException)
+{
+ if (!osl_decrementInterlockedCount(&m_refCount))
+ delete this;
+}
+
+//=============================================================================
+//=============================================================================
+
+//=============================================================================
+static ::rtl::OUString sHost;
+static sal_Int32 nPort;
+static ::rtl::OUString sRegistry = ::rtl::OUString::createFromAscii("applicat.rdb");
+
+//=============================================================================
+sal_Bool collectArgs(int argc, char * argv[])
+{
+ if (argc > 1)
+ {
+ sal_Char* pConnectTo = argv[1];
+ sal_Char* pSeparator = strchr(pConnectTo, ':');
+ if (pSeparator && (0 != *(pSeparator + 1)))
+ {
+ sHost = ::rtl::OUString(pConnectTo, pSeparator - pConnectTo, RTL_TEXTENCODING_ASCII_US);
+ nPort = ::rtl::OUString::createFromAscii(pSeparator + 1).toInt32();
+
+ if (argc > 2)
+ sRegistry = ::rtl::OUString::createFromAscii(argv[2]);
+ return sal_True;
+ }
+ }
+
+ printf("cfgclient - registry server client test ...\n\r\n\r");
+ printf("usage :\n\r");
+ printf(" cfgclient <server>:<port> [<registry file>]\n\r\n\r");
+ printf(" <server> : machine to connect to\n\r");
+ printf(" <port> : port to connect to\n\r");
+ printf(" <registry file> : (optional) registry to bootstrap from. defaulted to \"applicat.rdb\"\n\r\n\r");
+ return sal_False;
+}
+
+//=============================================================================
+
+#if (defined UNX) || (defined OS2)
+void main( int argc, char * argv[] )
+#else
+void _cdecl main( int argc, char * argv[] )
+#endif
+{
+ Reference< XMultiServiceFactory > xORB;
+ try
+ {
+ xORB = createRegistryServiceFactory(sRegistry, ::rtl::OUString());
+ }
+ catch (Exception& e)
+ {
+ printf("could not bootstrap the services from %s\n\r", ASCII_STRING(sRegistry));
+ printf(" (error message : %s)", ASCII_STRING(e.Message));
+ }
+
+ if (!xORB.is())
+ {
+ fprintf(stdout, "could not create the service factory !");
+ return;
+ }
+
+ ORef< OSessionListener > xListener = new OSessionListener;
+ {
+/*
+ ORemoteSession aSession(xORB);
+ // --------- connect ----------
+ sal_Bool bSuccess = aSession.connect(sHost, nPort, &aTimeout);
+ if (!bSuccess)
+ {
+ printf("could not connect to the server (error : %i) ...", aSession.getConnectionError());
+ return;
+ }
+*/
+
+ void testSession(const Reference< XMultiServiceFactory > &xORB, bool bPrint);
+
+ for (int i=0;i<100;i++)
+ {
+ TimeValue aStartTime, aEndTime;
+ osl_getSystemTime(&aStartTime);
+ testSession(xORB, false);
+ osl_getSystemTime(&aEndTime);
+
+ sal_Int32 nSeconds = aEndTime.Seconds - aStartTime.Seconds;
+ sal_Int32 nNanoSec = aEndTime.Nanosec - aStartTime.Nanosec;
+ if (nNanoSec < 0)
+ {
+ nNanoSec = 1000000000 - nNanoSec;
+ nSeconds++;
+ }
+
+ cout << "Time: " << nSeconds << ". " << nNanoSec << endl;
+ }
+ }
+}
+
+void testSession(const Reference< XMultiServiceFactory > &xORB, bool bPrint)
+{
+ TimeValue aTimeout;
+ aTimeout.Seconds = 5;
+ aTimeout.Nanosec = 0;
+
+
+ // create it .. and connect
+ LocalSession aSession(xORB);
+
+ // --------- openSession ----------
+
+ OUString aRootPath = OUString::createFromAscii("f:/local/SRC598/configmgr/workben/local_io");
+ // f:/local/SRC595/configmgr/workben/local_io);
+ aSession.open(aRootPath);
+
+ if (aSession.isOpen())
+ {
+ if (bPrint) printf("\nopened the session ...");
+ }
+ else
+ {
+ printf("\ncould not open the session ... exiting\n\n");
+ return;
+ }
+
+ // aSession.setListener(xListener.getBodyPtr());
+
+ OCondition aWaitForSomething;
+ aWaitForSomething.reset();
+
+ // --------- openNode ----------
+ char* pWriterNode = "com.sun.star.Setup/Modules";
+ if (bPrint) printf("\nsending an openNode request for %s ...\n", pWriterNode);
+ ORef< OOpenNodeCallback > xOpenCallback = new OOpenNodeCallback(aWaitForSomething);
+ aSession.openNode(UNI_STRING(pWriterNode), 2, xOpenCallback.getBodyPtr());
+
+ aTimeout.Seconds = 30;
+ switch (aWaitForSomething.wait(&aTimeout))
+ {
+ case ICondition::result_error:
+ printf("error while waiting for the callback ... exiting\n\n");
+ return;
+ case ICondition::result_timeout:
+ if (bPrint) printf("timed out ... exiting\n\n");
+ return;
+ }
+
+ OUString sOpenedNode = xOpenCallback->getNodeId();
+
+// aSession.getNode(UNI_STRING("com.sun.star.Spreadsheet"), NULL);
+//
+// // --------- getNode (1) ----------
+//#ifdef USE_LAYOUT_NODE
+// char* pLayoutNode = "com.sun.star.office.Setup/Modules";
+//#else
+ char* pLayoutNode = "com.sun.star.Setup/Modules";
+//#endif
+// printf("\nsending an getNode request for %s ...\n", pLayoutNode);
+// aWaitForSomething.reset();
+// aSession.getNode(UNI_STRING(pLayoutNode), new OOpenNodeCallback(aWaitForSomething));
+//
+// switch (aWaitForSomething.wait(&aTimeout))
+// {
+// case ICondition::result_error:
+// printf("error while waiting for the callback ... exiting\n\n");
+// return;
+// case ICondition::result_timeout:
+// printf("timed out ... exiting\n\n");
+// return;
+// }
+
+ // --------- addNode ----------
+ if (bPrint) printf("\n\naddNode ....");
+ ONodeUpdater aAddTabstops(sal_False, true); // true = WRITER LEVEL
+ aWaitForSomething.reset();
+ aSession.addNode(sOpenedNode, UNI_STRING(pLayoutNode), &aAddTabstops, new OOpenNodeCallback(aWaitForSomething));
+ switch (aWaitForSomething.wait(&aTimeout))
+ {
+ case ICondition::result_error:
+ printf("error while waiting for the callback ... exiting\n\n");
+ return;
+ case ICondition::result_timeout:
+ if (bPrint) printf("timed out ... exiting\n\n");
+ return;
+ }
+
+ // --------- updateNode ----------
+ if (bPrint) printf("\n\nokay, let's try an update ....\n");
+
+ ONodeUpdater aUpdateWriter(sal_False, false);
+ aWaitForSomething.reset();
+ aSession.updateNode(sOpenedNode, UNI_STRING(pLayoutNode), &aUpdateWriter, new OOpenNodeCallback(aWaitForSomething));
+
+ switch (aWaitForSomething.wait(&aTimeout))
+ {
+ case ICondition::result_error:
+ printf("error while waiting for the callback ... exiting\n\n");
+ return;
+ case ICondition::result_timeout:
+ if (bPrint) printf("timed out ... exiting\n\n");
+ return;
+ }
+
+ // --------- deleteNode ----------
+ char* pLayoutNode2 = "com.sun.star.Setup/Modules/StandFonts";
+
+ if (bPrint) printf("\n\ndeleteNode ....");
+ aWaitForSomething.reset();
+ aSession.deleteNode(sOpenedNode, UNI_STRING(pLayoutNode2), new OOpenNodeCallback(aWaitForSomething));
+ switch (aWaitForSomething.wait(&aTimeout))
+ {
+ case ICondition::result_error:
+ printf("error while waiting for the callback ... exiting\n\n");
+ return;
+ case ICondition::result_timeout:
+ if (bPrint) printf("timed out ... exiting\n\n");
+ return;
+ }
+
+/*
+ // --------- startListening ----------
+ printf("\n\nadding a listener for the Layout node\n");
+ Sequence< ::rtl::OUString > aNodesToListen(1);
+ aNodesToListen[0] = UNI_STRING(pLayoutNode);
+ aSession.startListening(aNodesToListen, NULL);
+
+ printf("waiting 10 seconds ....\n\n");
+ aWaitForSomething.reset();
+ aTimeout.Seconds = 10;
+ aWaitForSomething.wait(&aTimeout);
+*/
+ // --------- getNode (2) ----------
+// printf("\ndoing a new getNode for the Layout node ...\n");
+// aWaitForSomething.reset();
+// aSession.getNode(UNI_STRING(pLayoutNode), new OOpenNodeCallback(aWaitForSomething));
+// switch (aWaitForSomething.wait(&aTimeout))
+// {
+// case ICondition::result_error:
+// printf("error while waiting for the callback ... exiting\n\n");
+// return;
+// case ICondition::result_timeout:
+// printf("timed out ... exiting\n\n");
+// return;
+// }
+
+ aSession.closeNode(sOpenedNode, NULL);
+ aSession.close(NULL);
+
+}
+
diff --git a/configmgr/workben/local_io/com.sun.star.office.Setup.xml b/configmgr/workben/local_io/com.sun.star.office.Setup.xml
new file mode 100644
index 000000000000..4018ab3b8d5d
--- /dev/null
+++ b/configmgr/workben/local_io/com.sun.star.office.Setup.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<com.sun.star.office.Setup>
+ <Language>
+ <Language_ID Type="string"><value>1033</value></Language_ID>
+ </Language>
+ <Modules>
+ <SCalc Type="boolean">
+ <value>true</value>
+ </SCalc>
+ <SChart Type="boolean">
+ <value>true</value>
+ </SChart>
+ <SDraw Type="boolean">
+ <value>true</value>
+ </SDraw>
+ <SImage Type="boolean">
+ <value>true</value>
+ </SImage>
+ <SImpress Type="boolean">
+ <value>true</value>
+ </SImpress>
+ <SMath Type="boolean">
+ <value>true</value>
+ </SMath>
+ <SWriter Type="boolean">
+ <value>true</value>
+ </SWriter>
+ </Modules>
+</com.sun.star.office.Setup> \ No newline at end of file
diff --git a/configmgr/workben/local_io/filetest.cxx b/configmgr/workben/local_io/filetest.cxx
new file mode 100644
index 000000000000..aa7f1a6ad1b7
--- /dev/null
+++ b/configmgr/workben/local_io/filetest.cxx
@@ -0,0 +1,93 @@
+/*************************************************************************
+ *
+ * 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: filetest.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_configmgr.hxx"
+#include <iostream>
+#include<osl/file.hxx>
+
+#include <rtl/ustring.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+
+// -----------------------------------------------------------------------------
+// --------------------------------- namespaces ---------------------------------
+// -----------------------------------------------------------------------------
+using namespace com::sun::star::uno;
+
+using ::rtl::OUString;
+using ::osl::File;
+// -----------------------------------------------------------------------------
+// ---------------------------------- defines ----------------------------------
+// -----------------------------------------------------------------------------
+#define ASCII(x) OUString::createFromAscii(x)
+
+
+// -----------------------------------------------------------------------------
+// ------------------------------------ main ------------------------------------
+// -----------------------------------------------------------------------------
+
+/*
+OUString operator+(const OUString &a, const OUString &b)
+{
+ OUString c = a;
+ c += b;
+ return c;
+}
+*/
+
+#if (defined UNX) || (defined OS2)
+int main( int argc, char * argv[] )
+#else
+int _cdecl main( int argc, char * argv[] )
+#endif
+{
+ OUString aPath = ASCII("f:/local/SRC598/configmgr/workben/local_io");
+ OUString aFilename = ASCII("com.sun.star.office.Setup");
+ OUString aExtension = ASCII("xml");
+
+ OUString aFullname = aPath + ASCII("/") + aFilename + ASCII(".") + aExtension;
+
+ // Filename convertieren
+ OUString aURL;
+ File aConvert(ASCII(""));
+ aConvert.normalizePath(aFullname, aURL);
+
+ // File oeffnen
+ File aFile(aURL);
+ aFile.open(osl_File_OpenFlag_Read);
+
+ sal_uInt64 nBytesRead;
+ Sequence< sal_Int8 > aBufferSeq(2000);
+ sal_Int8 *pBuff = aBufferSeq.getArray();
+ aFile.read(pBuff, 2000, nBytesRead);
+
+ aFile.close();
+ return 0;
+}
diff --git a/configmgr/workben/local_io/makefile.mk b/configmgr/workben/local_io/makefile.mk
new file mode 100644
index 000000000000..9b839d0fd795
--- /dev/null
+++ b/configmgr/workben/local_io/makefile.mk
@@ -0,0 +1,114 @@
+#*************************************************************************
+#
+# 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.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.
+#
+#*************************************************************************
+
+PRJ=..$/..
+PRJINC=$(PRJ)$/source
+
+PRJNAME=configmgr
+
+TARGET=cfgfile
+TARGETTYPE=CUI
+LIBTARGET=NO
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+.INCLUDE : settings.mk
+
+# --- Files --------------------------------------------------------
+
+# ... common for all test executables ..............................
+APPSTDLIBS=\
+ $(SALLIB) \
+ $(VOSLIB) \
+ $(CPPULIB) \
+ $(UNOTOOLSLIB) \
+ $(CPPUHELPERLIB) \
+
+
+# ... FileTests .....................................................
+APP1STDLIBS = $(APPSTDLIBS) \
+ $(STDLIBCPP) \
+
+APP1STDLIBS+=$(STDLIBCPP)
+
+APP1TARGET= $(TARGET)
+
+APP1OBJS= \
+ $(SLO)$/cfgfile.obj \
+ $(SLO)$/oslstream.obj \
+ $(SLO)$/filehelper.obj \
+ $(SLO)$/simpletest.obj \
+ $(SLO)$/strimpl.obj \
+ $(SLO)$/confname.obj \
+
+# $(SLO)$/xmlexport.obj \
+# $(SLO)$/xmlimport.obj \
+
+# $(SLO)$/xmltreebuilder.obj \
+# $(SLO)$/cmtree.obj \
+# $(SLO)$/cmtreemodel.obj \
+# $(SLO)$/typeconverter.obj \
+# $(SLO)$/changes.obj \
+# $(SLO)$/xmlformater.obj \
+# $(SLO)$/attributes.obj \
+# $(SLO)$/tracer.obj \
+
+
+# ... common for all test executables ..............................
+# APP2STDLIBS = $(APPSTDLIBS)
+#
+# APP2STDLIBS+=$(STDLIBCPP)
+#
+# APP2TARGET= cfglocal
+# APP2OBJS= \
+# $(SLO)$/cfglocal.obj \
+# $(SLO)$/receivethread.obj \
+# $(SLO)$/redirector.obj \
+# $(SLO)$/socketstream.obj \
+# $(SLO)$/attributes.obj \
+# $(SLO)$/localsession.obj \
+# $(SLO)$/saxtools.obj \
+# $(SLO)$/mergeupdates.obj \
+# $(SLO)$/oslstream.obj \
+# $(SLO)$/configsession.obj \
+# $(SLO)$/confname.obj \
+# $(SLO)$/sessionstream.obj \
+# $(SLO)$/filehelper.obj \
+# $(SLO)$/tracer.obj \
+# $(SLO)$/updatedom.obj \
+# $(SLO)$/strconverter.obj \
+# $(SLO)$/strimpl.obj \
+#
+
+.INCLUDE : target.mk
+
+
diff --git a/configmgr/workben/local_io/org.openoffice.test.xml b/configmgr/workben/local_io/org.openoffice.test.xml
new file mode 100644
index 000000000000..ff8e37be411c
--- /dev/null
+++ b/configmgr/workben/local_io/org.openoffice.test.xml
@@ -0,0 +1,70 @@
+<?xml version='1.0' encoding='UTF-8'?>
+
+<org.openoffice.test
+xmlns="http://openoffice.org/2000/registry/components/org.openoffice.Inet"
+xmlns:cfg="http://openoffice.org/2000/registry/instance"
+xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xml:lang="en-US">
+
+<!-- long -->
+ <Long cfg:type="long">100000000000000</Long>
+ <LongList cfg:type="long" cfg:derivedBy="list">1 2 3
+
+ 4 5
+
+
+
+
+ 6 7 8 9</LongList>
+ <LongList2 cfg:type="long" cfg:derivedBy="list" cfg:separator=".">1.2.3.4.5.6.7.8.9</LongList2>
+
+<!-- double -->
+ <DoubleWithDot cfg:type="double">.787564</DoubleWithDot>
+ <EuroDM cfg:type="double">1.95583</EuroDM>
+ <ZeroDotZeroZeroOne cfg:type="double">0.001</ZeroDotZeroZeroOne>
+ <ZeroDotOne cfg:type="double">0.1</ZeroDotOne>
+ <NZeroDotOne cfg:type="double">-0.1</NZeroDotOne>
+
+<!-- binary -->
+ <Binary cfg:type="binary" cfg:nullable="true" xsi:null="true"/>
+ <Binary2 cfg:type="binary" xsi:null="true"/>
+ <Binary3 cfg:type="binary" >010203040506070809</Binary3>
+ <Binary4 cfg:type="binary" cfg:nullable="true">000102030405060708090a</Binary4>
+
+<!-- Strings -->
+ <NullString cfg:type="string" xsi:null="true"/>
+ <String cfg:type="string">Identifier</String>
+ <StringList cfg:type="string" cfg:derivedBy="list">file:/ private:explorer private:help private:newmenu private:schedule private:searchfolder private:user</StringList>
+ <List cfg:type="string" cfg:derivedBy="list">NULL</List>
+ <PathAutoCorrect cfg:type="string" cfg:separator=":" cfg:derivedBy="list">$(inst)/share/autocorr:$(user)/autocorr</PathAutoCorrect>
+ <List2 cfg:type="string" cfg:derivedBy="list" cfg:separator="stupid" >NULLstupidFIRSTstupidSECONDstupid</List2>
+ <SeparatorKiller cfg:type="string" cfg:derivedBy="list" cfg:separator="." > .,.;.:.#.|.a._.!.$.%./.(.)=.?.+.*.#.~.'.\.{.}._</SeparatorKiller>
+
+<!-- localized -->
+ <LocaleString cfg:type="string" cfg:localized="true">
+ <cfg:value xml:lang="en-US">This is a string</cfg:value>
+ <cfg:value xml:lang="de-DE">Dies ist ein String</cfg:value>
+ </LocaleString>
+
+<!-- boolean -->
+ <BoolFalse cfg:type="boolean">false</BoolFalse>
+ <BoolTrue cfg:type="boolean">true</BoolTrue>
+ <BoolList cfg:type="boolean" cfg:derivedBy="list">true true false</BoolList>
+ <BoolNULL cfg:type="boolean" xsi:null="true"/>
+
+<!-- int -->
+ <Integer cfg:type="int">3</Integer>
+ <IntegerNullWithXsi cfg:type="int" xsi:null="true">10</IntegerNullWithXsi>
+ <IntegerNull cfg:type="int"/>
+
+ <IntList cfg:type="int" cfg:derivedBy="list">1 2 3 4 5 6 7 8 224 226 222 223 5</IntList>
+
+<!-- short -->
+ <Short cfg:type="short">100</Short>
+
+ <Inner>
+ <Inner2>
+ <IntList cfg:type="int" cfg:derivedBy="list">224 226 222 223 5</IntList>
+ </Inner2>
+ </Inner>
+
+</org.openoffice.test>
diff --git a/configmgr/workben/local_io/simpletest.cxx b/configmgr/workben/local_io/simpletest.cxx
new file mode 100644
index 000000000000..8a26cbe21112
--- /dev/null
+++ b/configmgr/workben/local_io/simpletest.cxx
@@ -0,0 +1,761 @@
+/*************************************************************************
+ *
+ * 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: simpletest.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_configmgr.hxx"
+
+#include <memory>
+#include <vector>
+#include <stack>
+#include<osl/file.hxx>
+
+#include <rtl/ustring.hxx>
+#include <rtl/string.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <cppuhelper/implbase1.hxx>
+#include <cppuhelper/implbase2.hxx>
+#include <cppuhelper/servicefactory.hxx>
+
+#ifndef _COM_SUN_STAR_LANG_XCOMPONENT_HDL_
+#include <com/sun/star/lang/XComponent.hpp>
+#endif
+#ifndef _COM_SUN_STAR_IO_XACTIVEDATASOURCE_HDL_
+#include <com/sun/star/io/XActiveDataSource.hpp>
+#endif
+#ifndef _COM_SUN_STAR_IO_XACTIVEDATASINK_HDL_
+#include <com/sun/star/io/XActiveDataSink.hpp>
+#endif
+#ifndef _COM_SUN_STAR_IO_XACTIVEDATACONTROL_HDL_
+#include <com/sun/star/io/XActiveDataControl.hpp>
+#endif
+#ifndef _COM_SUN_STAR_IO_XDATATRANSFEREVENTLISTENER_HDL_
+#include <com/sun/star/io/XDataTransferEventListener.hpp>
+#endif
+#ifndef _COM_SUN_STAR_IO_XDATAIMPORTER_HDL_
+#include <com/sun/star/io/XDataImporter.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_IO_XINPUTSTREAM_HDL_
+#include <com/sun/star/io/XInputStream.hpp>
+#endif
+#include <com/sun/star/xml/sax/XParser.hpp>
+#include <com/sun/star/xml/sax/SAXParseException.hpp>
+#include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
+
+#include <com/sun/star/xml/sax/InputSource.hpp>
+#include <vos/thread.hxx>
+
+#include <vos/pipe.hxx>
+#include <osl/diagnose.h>
+#include "oslstream.hxx"
+#include <com/sun/star/xml/sax/XAttributeList.hpp>
+
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XHierarchicalName.hpp>
+
+#include <com/sun/star/container/XNameReplace.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+#include <com/sun/star/script/XTypeConverter.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <osl/conditn.hxx>
+
+#include "xmltreebuilder.hxx"
+
+#include "dataimport.hxx"
+
+#include "createpropertyvalue.hxx"
+#include "strdecl.hxx"
+
+#include "confname.hxx"
+
+#include "FileHelper.hxx"
+
+// -----------------------------------------------------------------------------
+// --------------------------------- namespaces ---------------------------------
+// -----------------------------------------------------------------------------
+namespace uno = com::sun::star::uno;
+namespace lang = com::sun::star::lang;
+namespace io = com::sun::star::io;
+namespace sax = com::sun::star::xml::sax;
+namespace script = com::sun::star::script;
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::xml::sax;
+using namespace ::com::sun::star::io;
+using namespace rtl;
+using namespace osl;
+
+// -----------------------------------------------------------------------------
+// ---------------------------------- defines ----------------------------------
+// -----------------------------------------------------------------------------
+#ifndef ASCII
+#define ASCII(x) OUString::createFromAscii(x)
+#endif
+
+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;
+}
+
+
+// -----------------------------------------------------------------------------
+// ---------------------------------- a Class ----------------------------------
+// -----------------------------------------------------------------------------
+// <Name a="xyz" b="bar">
+
+//==========================================================================
+//= Visitors
+//==========================================================================
+
+
+namespace configmgr
+{
+
+ class XMLSimpleDocHandler : public ::cppu::WeakImplHelper1<sax::XDocumentHandler>
+ {
+ // uno::Reference< sax::XDocumentHandler > m_xWriter; // the service object for writing XML code
+
+ sal_Int32 m_nElementDepth;
+ sal_Int32 m_nIgnoreLevel;
+ public:
+ XMLSimpleDocHandler::XMLSimpleDocHandler()
+ {}
+
+
+ // DECLARE_UNO3_DEFAULTS(XMLReadFilter, CmDocumentHandler_BASE);
+
+ // XDocumentHandler
+ virtual void SAL_CALL startDocument(void)
+ throw (sax::SAXException, uno::RuntimeException)
+ {
+ }
+
+ virtual void SAL_CALL endDocument(void)
+ throw(sax::SAXException, uno::RuntimeException)
+ {
+ }
+
+ virtual void SAL_CALL startElement(const rtl::OUString& aName,
+ const uno::Reference< sax::XAttributeList > &_xAttrList)
+ throw(sax::SAXException, uno::RuntimeException)
+ {
+ sal_Int16 nAttrCount = _xAttrList.is() ? _xAttrList->getLength() : 0;
+ for( sal_Int16 i=0; i < nAttrCount; i++ )
+ {
+ OUString aParamName( _xAttrList->getNameByIndex( i ) );
+ OUString aParamValue( _xAttrList->getValueByIndex( i ) );
+ volatile int dummy = 0;
+ }
+ }
+
+ virtual void SAL_CALL endElement(const rtl::OUString& aName)
+ throw(sax::SAXException, uno::RuntimeException)
+ {
+ }
+
+ virtual void SAL_CALL characters(const rtl::OUString& aChars)
+ throw(sax::SAXException, uno::RuntimeException)
+ {}
+
+
+ virtual void SAL_CALL ignorableWhitespace(const rtl::OUString& aWhitespaces)
+ throw(sax::SAXException, uno::RuntimeException)
+ {}
+
+
+ virtual void SAL_CALL processingInstruction(const rtl::OUString& aTarget,
+ const rtl::OUString& aData)
+ throw(sax::SAXException, uno::RuntimeException)
+ {}
+
+ virtual void SAL_CALL setDocumentLocator(const uno::Reference< sax::XLocator > &xLocator)
+ throw(sax::SAXException, uno::RuntimeException)
+ {}
+ };
+
+// -----------------------------------------------------------------------------
+// ------------------------------------ Test ------------------------------------
+// -----------------------------------------------------------------------------
+#define ASCII_STRING(rtlOUString) rtl::OUStringToOString(rtlOUString, RTL_TEXTENCODING_ASCII_US).getStr()
+ static ::rtl::OUString sRegistry = ::rtl::OUString::createFromAscii("applicat.rdb");
+
+ void simpleTest()
+ {
+ uno::Reference< lang::XMultiServiceFactory > xMSF;
+ try
+ {
+ xMSF = cppu::createRegistryServiceFactory(sRegistry, ::rtl::OUString());
+ }
+ catch (uno::Exception& e)
+ {
+ cout << "could not bootstrap the services from " << ASCII_STRING(sRegistry) << endl ;
+ cout << " (error message : " << ASCII_STRING(e.Message) << ")" << endl;
+ }
+
+ if (!xMSF.is())
+ {
+ cerr << "could not create the service factory !" << endl;
+ return;
+ }
+
+ OUString aPath = ASCII("e:/temp/Test");
+ OUString aFilename = ASCII("calc");
+ OUString aExtension = ASCII("xml");
+
+ OUString aFullname = aPath + ASCII("/") + aFilename + ASCII(".") + aExtension;
+
+ // Filename convertieren
+ OUString aURL;
+ File aConvert(ASCII(""));
+ aConvert.normalizePath(aFullname, aURL);
+
+ // File oeffnen
+ File aFile(aURL);
+ aFile.open(osl_File_OpenFlag_Read);
+
+ uno::Reference<io::XInputStream> xInputStream =
+ new configmgr::OSLInputStreamWrapper(aFile);
+
+ // connect stream to input stream to the parser
+ InputSource aInputSource;
+ Reference<XInputStream> xPipeInput( xInputStream, UNO_QUERY );
+ aInputSource.aInputStream = xPipeInput;
+
+ Reference< sax::XParser > xParser;
+ xParser = Reference< sax::XParser > (
+ xMSF->createInstance(
+ ::rtl::OUString::createFromAscii("com.sun.star.xml.sax.Parser")), UNO_QUERY);
+
+ XMLSimpleDocHandler *pTest = new XMLSimpleDocHandler();
+
+ // get filter
+ Reference<XDocumentHandler> xFilter = pTest;
+
+ // connect parser and filter
+ xParser->setDocumentHandler( xFilter );
+
+ // parse
+ sal_Int16 nRet = 0;
+ OUString sError;
+ try
+ {
+ xParser->parseStream( aInputSource );
+ }
+ catch( SAXParseException &e )
+ {
+ OUString sLine = OUString::valueOf(e.LineNumber);
+ OUString aStr = ASCII("SAXParseException occured in ");
+ sError = aStr + ASCII(" Line: (") + sLine + ASCII(")");
+
+ OSL_ENSURE(0, rtl::OUStringToOString(sError,RTL_TEXTENCODING_ASCII_US).getStr());
+ nRet = 3;
+ }
+ catch( SAXException &e )
+ {
+ sError = e.Message;
+ OSL_ENSURE(0, rtl::OUStringToOString(sError,RTL_TEXTENCODING_ASCII_US).getStr());
+ nRet = 4;
+ }
+ catch( IOException &e )
+ {
+ sError = e.Message;
+ OSL_ENSURE(0, rtl::OUStringToOString(sError,RTL_TEXTENCODING_ASCII_US).getStr());
+ nRet = 5;
+ }
+ }
+
+
+#include <osl/time.h>
+#include <rtl/string.hxx>
+
+class TimeTest
+{
+ TimeValue m_aStartTime, m_aEndTime;
+ bool m_bStarted;
+public:
+ TimeTest()
+ :m_bStarted(false)
+ {
+ }
+
+ void start()
+ {
+ m_bStarted = true;
+ osl_getSystemTime(&m_aStartTime);
+ }
+ void stop()
+ {
+ osl_getSystemTime(&m_aEndTime);
+ OSL_ENSURE(m_bStarted, "Not Started.");
+ m_bStarted = false;
+ }
+ void showTime(const rtl::OString & aWhatStr)
+ {
+ OSL_ENSURE(!m_bStarted, "Not Stopped.");
+
+ sal_Int32 nSeconds = m_aEndTime.Seconds - m_aStartTime.Seconds;
+ sal_Int32 nNanoSec = m_aEndTime.Nanosec - m_aStartTime.Nanosec;
+ if (nNanoSec < 0)
+ {
+ nNanoSec = 1000000000 - nNanoSec;
+ nSeconds++;
+ }
+ rtl::OString aStr = "Time for ";
+ aStr += aWhatStr;
+ aStr += " : ";
+ aStr += rtl::OString::valueOf(nSeconds);
+ aStr += ".";
+ aStr += rtl::OString::valueOf(nNanoSec);
+
+ cout << aStr.getStr() << endl;
+ }
+
+};
+
+// -----------------------------------------------------------------------------
+// -------------------------------- Mapping Test --------------------------------
+// -----------------------------------------------------------------------------
+// Simple Map created with a stl::vector
+
+typedef ::std::pair< rtl::OUString, rtl::OUString > Assoc;
+// typedef ::std::set<Assoc, ltNode> MappingTable;
+typedef std::vector<Assoc> MappingTable;
+
+rtl::OUString mapTo(const rtl::OUString& aFrom, bool bToNew)
+{
+ static MappingTable aMap;
+ if (aMap.empty())
+ {
+ // Fill Map old, new
+
+ aMap.push_back(Assoc(ASCII("value"), TAG_VALUE));
+ aMap.push_back(Assoc(ASCII("type"), ATTR_TYPE));
+ aMap.push_back(Assoc(ASCII("instance"), ATTR_INSTANCE));
+ }
+ if (bToNew)
+ {
+ // check, if we should convert first to second
+ for (std::vector<Assoc>::const_iterator it = aMap.begin();it != aMap.end();++it)
+ {
+ if ((*it).first.equals(aFrom))
+ return (*it).second;
+ }
+ }
+ else
+ {
+ // check if we should convert second to first
+ for (std::vector<Assoc>::const_iterator it = aMap.begin();it != aMap.end();++it)
+ {
+ if ((*it).second.equals(aFrom))
+ return (*it).first;
+ }
+ }
+
+ // do nothing!
+ return aFrom;
+}
+// -----------------------------------------------------------------------------
+void simpleMappingTest()
+{
+ OUString aValue = ASCII("value");
+ OUString aNew;
+
+ aNew = mapTo(aValue, true); // true for ToNew
+ aNew = mapTo(aNew, false);
+ aNew = mapTo(aNew, false);
+
+ volatile int dummy = 0;
+}
+
+// -----------------------------------------------------------------------------
+ void speedTest()
+ {
+ // check speed of:
+ // ASCII("value")
+ // TAG_VALUE
+ // ...
+
+ sal_Int32 nCount = 1000 * 1000 * 100;
+ sal_Int32 n;
+
+ cout << "Starting Timetest" << endl;
+ TimeTest tt;
+ tt.start();
+ for(n=0;n<nCount;n++)
+ {
+ }
+ tt.stop();
+ tt.showTime("Leere Schleife: ");
+
+
+ nCount = 1000 * 1000 * 5;
+ rtl::OUString aStr;
+
+ tt.start();
+ for(n=0;n<nCount;n++)
+ {
+ aStr = ASCII("value");
+ }
+ tt.stop();
+ tt.showTime("ASCII() ");
+
+
+ OUString aValue = ASCII("value");
+ tt.start();
+ for(n=0;n<nCount;n++)
+ {
+ aStr = TAG_VALUE;
+ }
+ tt.stop();
+ tt.showTime("TAG_VALUE: ");
+
+ }
+
+OUString changeToComSunStarPath(const OUString &aPath)
+{
+ static OUString aOO = ASCII("org.OpenOffice");
+ static OUString aCSS = ASCII("com.sun.star");
+ OUString aNewPath;
+
+ // compare
+ if (aPath.compareTo( aOO, aOO.getLength() ) == 0)
+ {
+ aNewPath = aCSS;
+ aNewPath += aPath.copy(aOO.getLength());
+ return aNewPath;
+ }
+ return aPath;
+}
+
+void stringTest2()
+{
+ OUString aPath = ASCII("org.OpenOffice.Setup/blah/blub");
+
+ OUString aNewPath = changeToComSunStarPath(aPath);
+ volatile int dummy = 0;
+}
+
+/*
+
+class A
+{
+public:
+ static void run() {
+ cout << "This is A::run();" << endl;
+ }
+
+};
+
+class B : public A
+{
+public:
+
+ static void run() {
+ cout << "This is B::run();" << endl;
+ }
+};
+
+void classTest()
+{
+ A a;
+ B b;
+ B::run();
+}
+*/
+
+// -----------------------------------------------------------------------------
+// ------------------------------------ Map ------------------------------------
+// -----------------------------------------------------------------------------
+struct ltstr
+{
+ bool operator()(const rtl::OUString &s1, const rtl::OUString &s2) const
+ {
+ return s1.compareTo(s2) < 0 ? true : false;
+ }
+};
+
+void stringTest()
+{
+ map<const OUString, int, ltstr> months;
+
+ months[ASCII("january")] = 31;
+ months[ASCII("february")] = 28;
+ months[ASCII("march")] = 31;
+ months[ASCII("april")] = 30;
+ months[ASCII("may")] = 31;
+ months[ASCII("june")] = 30;
+ months[ASCII("july")] = 31;
+ months[ASCII("august")] = 31;
+ months[ASCII("september")] = 30;
+ months[ASCII("october")] = 31;
+ months[ASCII("november")] = 30;
+ months[ASCII("december")] = 31;
+
+ cout << "june -> " << months[ASCII("june")] << endl;
+ map<const OUString, int, ltstr>::iterator cur = months.find(ASCII("april"));
+ // map<const OUString, int, ltstr>::iterator prev = cur;
+ map<const OUString, int, ltstr>::iterator next = cur;
+ // ++next;
+ // --prev;
+ // cout << "Previous (in alphabetical order) is " << (*prev).first << endl;
+ for(int i=0;i<12;i++)
+ {
+ cout << "Next (in alphabetical order) is " << (*next).first << " days " << (*next).second << endl;
+ ++next;
+ }
+}
+
+// -----------------------------------------------------------------------------
+// ---------------------------------- HashMap ----------------------------------
+// -----------------------------------------------------------------------------
+#include <hash_map>
+
+
+namespace test {
+
+struct eqstr
+{
+ bool operator()(const rtl::OUString &s1, const rtl::OUString &s2) const
+ {
+ return s1.equals(s2) == sal_True ? true : false;
+ }
+};
+
+struct hash_oustring
+{
+ // This hash funktion is a copy of hash<char*> from SGI-STL
+ size_t operator()(const rtl::OUString &_s) const
+ {
+ sal_Int64 nStrLen = _s.getLength();
+ const sal_Unicode *pStr = _s.getStr();
+ unsigned long h = 0;
+ for (sal_Int64 i=0;i<nStrLen; ++i)
+ h = 5*h + *pStr++;
+
+ return size_t(h);
+ }
+};
+
+void hash_test()
+{
+ hash_map<const rtl::OUString, rtl::OUString, hash_oustring, eqstr> months;
+
+ rtl::OUString sJanuary = ASCII("january");
+ months[sJanuary] = ASCII("31");
+ months[ASCII("february")] = ASCII("28");
+ months[ASCII("march")] = ASCII("31");
+ months[ASCII("april")] = ASCII("30");
+ months[ASCII("may")] = ASCII("31");
+ months[ASCII("june")] = ASCII("30");
+ months[ASCII("july")] = ASCII("31");
+ months[ASCII("august")] = ASCII("31");
+ months[ASCII("september")] = ASCII("30");
+ months[ASCII("october")] = ASCII("31");
+ months[ASCII("november")] = ASCII("30");
+ months[ASCII("december")] = ASCII("31");
+
+ cout << "september -> " << months[ASCII("september")] << endl;
+ cout << "april -> " << months[ASCII("april")] << endl;
+ cout << "june -> " << months[ASCII("june")] << endl;
+ cout << "november -> " << months[ASCII("november")] << endl;
+}
+}
+
+
+// -----------------------------------------------------------------------------
+// Fri Nov 10 15:10:45 2000
+// -----------------------------------------------------------------------------
+
+#include <vos/ref.hxx>
+
+class Options : public vos::OReference
+{
+ int m_aValue;
+public:
+ int getValue() {return m_aValue;}
+ void setValue(int _aValue) {m_aValue = _aValue;}
+
+
+};
+
+class A
+{
+ vos::ORef<Options> m_aOptions;
+public:
+
+ vos::ORef<Options> getOptions() {return m_aOptions;}
+ void setOptions(vos::ORef<Options>& _aOptions) {
+ m_aOptions = _aOptions;
+ }
+};
+
+void testRefs()
+{
+ vos::ORef<Options> aO = new Options;
+ aO->setValue(10);
+
+ A a,b;
+ a.setOptions(aO);
+ b.setOptions(aO);
+ cout << "Options from a : " << a.getOptions()->getValue() << endl;
+ cout << "Options from b : " << b.getOptions()->getValue() << endl;
+
+ aO->setValue(20);
+ cout << "Options from a : " << a.getOptions()->getValue() << endl;
+ cout << "Options from b : " << b.getOptions()->getValue() << endl;
+}
+
+
+
+void ConfigName()
+{
+ // OUString aSubtreePath = ASCII("/org.openoffice.office.common/path/blah/blub");
+ OUString aSubtreePath = ASCII("/org.openoffice.office.common");
+ ConfigurationName aName(aSubtreePath);
+ OUString a = aName.localName();
+ OUString b = aName.fullName();
+ OUString c = aName.moduleName();
+ ConfigurationName aParentName(aName.getParentName());
+ OUString d = aParentName.fullName();
+
+
+ {
+ ConfigurationName aName( ASCII("/" ));
+
+ std::stack< rtl::OUString, std::vector<rtl::OUString> > m_aStringStack;
+
+ if (aName.localName().getLength() != 0)
+ {
+ for (ConfigurationName::Iterator it = aName.begin();
+ it != aName.end();
+ ++it)
+ {
+ rtl::OUString aName = *it;
+ m_aStringStack.push(aName);
+ // m_xHandler->startElement(*it, rList);
+ volatile int dummy = 0;
+ }
+ }
+
+ // bBack = writeChanges();
+
+ while(!m_aStringStack.empty())
+ {
+ OUString aName = m_aStringStack.top();
+ m_aStringStack.pop();
+ }
+ }
+}
+
+void ConfigName2()
+{
+ OUString aSubtreePath = ASCII("/org.openoffice.office.common/path/blah/blub");
+ ConfigurationName aName(aSubtreePath);
+ ConfigurationName aParent = aName.getParentName();
+
+ for (ConfigurationName::Iterator it = aName.begin();
+ it != aName.end();
+ ++it)
+ {
+ rtl::OUString aName = *it;
+ volatile int dummy = 0;
+ }
+}
+
+// -----------------------------------------------------------------------------
+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 <<= (rtl::OString& _rAsciiString, const rtl::OUString& _rUnicodeString)
+{
+ _rAsciiString = rtl::OUStringToOString(_rUnicodeString,RTL_TEXTENCODING_ASCII_US);
+}
+
+// -----------------------------------------------------------------------------
+bool isBTimeGreaterATime(TimeValue const& A, TimeValue const& B)
+{
+ if (B.Seconds > A.Seconds) return true;
+ if (B.Nanosec > A.Nanosec) return true;
+
+ // lower or equal
+ return false;
+}
+
+// -----------------------------------------------------------------------------
+
+void oslTest()
+{
+
+ OUString aDirectory(FileHelper::convertFilenameToFileURL(ASCII("c:/temp/file.out.1")));
+ TimeValue a = FileHelper::getFileModificationStamp(aDirectory);
+
+ OUString aDirectory2(FileHelper::convertFilenameToFileURL(ASCII("c:/temp/file.out.2")));
+ TimeValue b = FileHelper::getFileModificationStamp(aDirectory2);
+
+ if (isBTimeGreaterATime(a,b))
+ {
+ OSL_ENSURE(false, "FileB ist neuer als FileA");
+ }
+
+
+/*
+ OUString aDirectory(FileHelper::convertFilenameToFileURL(ASCII("c:/temp/dies")));
+ 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());
+ }
+*/
+}
+
+} // namespace configmgr
diff --git a/configmgr/workben/local_io/xmlexport.cxx b/configmgr/workben/local_io/xmlexport.cxx
new file mode 100644
index 000000000000..6302ccb8b947
--- /dev/null
+++ b/configmgr/workben/local_io/xmlexport.cxx
@@ -0,0 +1,239 @@
+/*************************************************************************
+ *
+ * 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: xmlexport.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_configmgr.hxx"
+
+#include<iostream>
+#include<osl/file.hxx>
+
+#include <rtl/ustring.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <cppuhelper/implbase1.hxx>
+#include <cppuhelper/implbase2.hxx>
+#include <cppuhelper/servicefactory.hxx>
+/*
+#include <cppuhelper/implbase1.hxx>
+*/
+#ifndef _COM_SUN_STAR_LANG_XCOMPONENT_HDL_
+#include <com/sun/star/lang/XComponent.hpp>
+#endif
+#ifndef _COM_SUN_STAR_IO_XDATATRANSFEREVENTLISTENER_HDL_
+#include <com/sun/star/io/XDataTransferEventListener.hpp>
+#endif
+#ifndef _COM_SUN_STAR_IO_XDATAIMPORTER_HDL_
+#include <com/sun/star/io/XDataExporter.hpp>
+#endif
+#ifndef _COM_SUN_STAR_IO_XINPUTSTREAM_HDL_
+#include <com/sun/star/io/XOutputStream.hpp>
+#endif
+#include <com/sun/star/io/XActiveDataSource.hpp>
+#include <com/sun/star/xml/sax/SAXParseException.hpp>
+#include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
+#include <osl/diagnose.h>
+#include <com/sun/star/xml/sax/XAttributeList.hpp>
+
+#include "oslstream.hxx"
+#include "attributes.hxx"
+#include "typeconverter.hxx"
+#include "xmlformater.hxx"
+#include "filehelper.hxx"
+
+
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+
+#include "createpropertyvalue.hxx"
+// -----------------------------------------------------------------------------
+// --------------------------------- namespaces ---------------------------------
+// -----------------------------------------------------------------------------
+namespace configmgr
+{
+
+ namespace uno = com::sun::star::uno;
+ namespace lang = com::sun::star::lang;
+ namespace io = com::sun::star::io;
+ namespace sax = com::sun::star::xml::sax;
+ namespace beans = com::sun::star::beans;
+
+ using ::rtl::OUString;
+ using ::osl::File;
+
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::lang;
+ using namespace ::com::sun::star::container;
+
+// -----------------------------------------------------------------------------
+// ---------------------------------- defines ----------------------------------
+// -----------------------------------------------------------------------------
+#define ASCII(x) OUString::createFromAscii(x)
+
+// -----------------------------------------------------------------------------
+ class Listener : public ::cppu::WeakImplHelper1<io::XDataTransferEventListener>
+ {
+ virtual void SAL_CALL disposing( const lang::EventObject& Source )
+ throw(::com::sun::star::uno::RuntimeException)
+ {
+ OSL_ENSURE(0, "disposing");
+ }
+
+
+ virtual void SAL_CALL finished( const io::DataTransferEvent& aEvent )
+ throw(uno::RuntimeException)
+ {
+ OSL_ENSURE(0, "finished");
+ }
+
+ virtual void SAL_CALL cancelled( const io::DataTransferEvent& aEvent )
+ throw(uno::RuntimeException)
+ {
+ OSL_ENSURE(0, "cancelled");
+ }
+ };
+
+ class Component: public ::cppu::WeakImplHelper1<lang::XComponent>
+ {
+ virtual void SAL_CALL dispose( )
+ throw(uno::RuntimeException)
+ {
+ OSL_ENSURE(0, "dispose");
+
+ }
+ virtual void SAL_CALL addEventListener( const uno::Reference< lang::XEventListener >& xListener )
+ throw(uno::RuntimeException)
+ {
+ OSL_ENSURE(0, "addEventListener");
+ }
+ virtual void SAL_CALL removeEventListener( const uno::Reference< lang::XEventListener >& aListener )
+ throw(uno::RuntimeException)
+ {
+ OSL_ENSURE(0, "removeEventListener");
+ }
+ };
+
+
+
+
+
+#define ASCII_STRING(rtlOUString) rtl::OUStringToOString(rtlOUString, RTL_TEXTENCODING_ASCII_US).getStr()
+ static ::rtl::OUString sRegistry = ::rtl::OUString::createFromAscii("applicat.rdb");
+
+
+
+
+
+
+
+
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+ void exportTest()
+ {
+ uno::Reference< lang::XMultiServiceFactory > xMSF;
+ try
+ {
+ xMSF = cppu::createRegistryServiceFactory(sRegistry, ::rtl::OUString());
+ }
+ catch (uno::Exception& e)
+ {
+ cout << "could not bootstrap the services from " << ASCII_STRING(sRegistry) << endl ;
+ cout << " (error message : " << ASCII_STRING(e.Message) << ")" << endl;
+ }
+
+ if (!xMSF.is())
+ {
+ cerr << "could not create the service factory !" << endl;
+ return;
+ }
+
+ OUString aPath = ASCII("l:/SRC601/configmgr/workben/local_io");
+ OUString sFilename = ASCII("exported_config");
+ OUString aExtension = ASCII("xml");
+
+ OUString aFullname = aPath + ASCII("/") + sFilename + ASCII(".") + aExtension;
+
+ // Filename convertieren
+ OUString aURL;
+ File aConvert(ASCII(""));
+ aConvert.normalizePath(aFullname, aURL);
+
+ FileHelper::tryToRemoveFile(aURL);
+
+ rtl::OUString sError;
+
+ // File oeffnen
+ File aFile(aURL);
+ osl::FileBase::RC eError = aFile.open(OpenFlag_Write | OpenFlag_Create);
+
+ if (eError != osl_File_E_None)
+ {
+ sError = ASCII("XMLExportTest:");
+ rtl::OString aStr = rtl::OUStringToOString(sError,RTL_TEXTENCODING_ASCII_US);
+ OSL_ENSURE(0, aStr.getStr());
+ return;
+ }
+
+ // create an outputstream
+ uno::Reference<io::XOutputStream> xOutputStream = new configmgr::OSLOutputStreamWrapper(aFile);
+
+ // Listener & Component
+ uno::Reference<io::XDataTransferEventListener> rListener = new Listener();
+ uno::Reference<lang::XComponent> rComponent = new Component();
+
+
+ OUString sPath = ASCII("com.sun.star.ucb.Hierarchy");
+
+ // Create a TypeConverter
+ uno::Reference<script::XTypeConverter> aConverter;
+ aConverter = aConverter.query(xMSF->createInstance(ASCII( "com.sun.star.script.Converter" )) );
+
+ // prepare parameters for DataExport
+ Sequence< uno::Any > aArgs(4);
+ aArgs[0] <<= createPropertyValue(ASCII("PackageName"), sFilename);
+ aArgs[1] <<= createPropertyValue(ASCII("Path"), sPath); // multiple occur possible
+ aArgs[2] <<= createPropertyValue(ASCII("TypeConverter"), aConverter); // optional
+ aArgs[3] <<= createPropertyValue(ASCII("Path"), ASCII("com.sun.star.office.Setup")); // multiple occur possible
+
+ // important: createInstanceWithArguments will throw an IllegalArgumentException() if
+ // parameters are wrong...
+ Reference< XInterface > xDataExport = xMSF->createInstanceWithArguments(
+ OUString::createFromAscii("com.sun.star.configuration.DataExport"),
+ aArgs);
+
+ uno::Reference<io::XDataExporter> rExporter(xDataExport, UNO_QUERY);
+
+ // Export Data
+ rExporter->exportData(xOutputStream, rComponent, rListener);
+ }
+
+} // namespace configmgr
diff --git a/configmgr/workben/local_io/xmlimport.cxx b/configmgr/workben/local_io/xmlimport.cxx
new file mode 100644
index 000000000000..d910edd22b56
--- /dev/null
+++ b/configmgr/workben/local_io/xmlimport.cxx
@@ -0,0 +1,472 @@
+/*************************************************************************
+ *
+ * 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: xmlimport.cxx,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.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_configmgr.hxx"
+
+#include <memory>
+#include <vector>
+#include <stack>
+#include<osl/file.hxx>
+
+#include <rtl/ustring.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <cppuhelper/implbase1.hxx>
+#include <cppuhelper/implbase2.hxx>
+#include <cppuhelper/servicefactory.hxx>
+
+#ifndef _COM_SUN_STAR_LANG_XCOMPONENT_HDL_
+#include <com/sun/star/lang/XComponent.hpp>
+#endif
+#ifndef _COM_SUN_STAR_IO_XACTIVEDATASOURCE_HDL_
+#include <com/sun/star/io/XActiveDataSource.hpp>
+#endif
+#ifndef _COM_SUN_STAR_IO_XACTIVEDATASINK_HDL_
+#include <com/sun/star/io/XActiveDataSink.hpp>
+#endif
+#ifndef _COM_SUN_STAR_IO_XACTIVEDATACONTROL_HDL_
+#include <com/sun/star/io/XActiveDataControl.hpp>
+#endif
+#ifndef _COM_SUN_STAR_IO_XDATATRANSFEREVENTLISTENER_HDL_
+#include <com/sun/star/io/XDataTransferEventListener.hpp>
+#endif
+#ifndef _COM_SUN_STAR_IO_XDATAIMPORTER_HDL_
+#include <com/sun/star/io/XDataImporter.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_IO_XINPUTSTREAM_HDL_
+#include <com/sun/star/io/XInputStream.hpp>
+#endif
+#include <com/sun/star/xml/sax/XParser.hpp>
+#include <com/sun/star/xml/sax/SAXParseException.hpp>
+#include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
+
+#include <com/sun/star/xml/sax/InputSource.hpp>
+#include <vos/thread.hxx>
+
+#include <vos/pipe.hxx>
+#include <osl/diagnose.h>
+#include "oslstream.hxx"
+#include <com/sun/star/xml/sax/XAttributeList.hpp>
+
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XHierarchicalName.hpp>
+
+#include <com/sun/star/container/XNameReplace.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+#include <com/sun/star/script/XTypeConverter.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <osl/conditn.hxx>
+
+#include "xmltreebuilder.hxx"
+
+#include "dataimport.hxx"
+
+#include "createpropertyvalue.hxx"
+// -----------------------------------------------------------------------------
+// --------------------------------- namespaces ---------------------------------
+// -----------------------------------------------------------------------------
+namespace uno = com::sun::star::uno;
+namespace lang = com::sun::star::lang;
+namespace io = com::sun::star::io;
+namespace sax = com::sun::star::xml::sax;
+namespace script = com::sun::star::script;
+
+using ::rtl::OUString;
+using ::osl::File;
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::util;
+
+// -----------------------------------------------------------------------------
+// ---------------------------------- defines ----------------------------------
+// -----------------------------------------------------------------------------
+#ifndef ASCII
+#define ASCII(x) OUString::createFromAscii(x)
+#endif
+
+
+// -----------------------------------------------------------------------------
+// ---------------------------------- a Class ----------------------------------
+// -----------------------------------------------------------------------------
+// <Name a="xyz" b="bar">
+
+//==========================================================================
+//= Visitors
+//==========================================================================
+
+
+// -----------------------------------------------------------------------------
+class Listener : public ::cppu::WeakImplHelper1<io::XDataTransferEventListener>
+{
+ osl::Condition m_aCondition;
+public:
+ Listener()
+ {
+ m_aCondition.reset(); // will block
+ }
+
+ virtual void SAL_CALL disposing( const lang::EventObject& Source )
+ throw(::com::sun::star::uno::RuntimeException)
+ {
+ OSL_ENSURE(0, "disposing");
+ m_aCondition.set(); // will not block
+ }
+
+ virtual void SAL_CALL finished( const io::DataTransferEvent& aEvent )
+ throw(uno::RuntimeException)
+ {
+ OSL_ENSURE(0, "finished");
+ m_aCondition.set(); // will not block
+ }
+
+ virtual void SAL_CALL cancelled( const io::DataTransferEvent& aEvent )
+ throw(uno::RuntimeException)
+ {
+ OSL_ENSURE(0, "cancelled");
+ m_aCondition.set(); // will not block
+ }
+public:
+ void wait()
+ {
+ m_aCondition.wait();
+ }
+};
+
+class Component: public ::cppu::WeakImplHelper1<lang::XComponent>
+{
+ virtual void SAL_CALL dispose( )
+ throw(uno::RuntimeException)
+ {
+ OSL_ENSURE(0, "dispose");
+
+ }
+ virtual void SAL_CALL addEventListener( const uno::Reference< lang::XEventListener >& xListener )
+ throw(uno::RuntimeException)
+ {
+ OSL_ENSURE(0, "addEventListener");
+ }
+ virtual void SAL_CALL removeEventListener( const uno::Reference< lang::XEventListener >& aListener )
+ throw(uno::RuntimeException)
+ {
+ OSL_ENSURE(0, "removeEventListener");
+ }
+};
+
+
+
+namespace configmgr
+{
+
+// -----------------------------------------------------------------------------
+// ------------------------------------ Test ------------------------------------
+// -----------------------------------------------------------------------------
+#define ASCII_STRING(rtlOUString) rtl::OUStringToOString(rtlOUString, RTL_TEXTENCODING_ASCII_US).getStr()
+ static ::rtl::OUString sRegistry = ::rtl::OUString::createFromAscii("applicat.rdb");
+
+ void importTest()
+ {
+ uno::Reference< lang::XMultiServiceFactory > xMSF;
+ try
+ {
+ xMSF = cppu::createRegistryServiceFactory(sRegistry, ::rtl::OUString());
+ }
+ catch (uno::Exception& e)
+ {
+ cout << "could not bootstrap the services from " << ASCII_STRING(sRegistry) << endl ;
+ cout << " (error message : " << ASCII_STRING(e.Message) << ")" << endl;
+ }
+
+ if (!xMSF.is())
+ {
+ cerr << "could not create the service factory !" << endl;
+ return;
+ }
+
+ OUString aPath = ASCII("l:/SRC601/configmgr/workben/local_io");
+ OUString aFilename = ASCII("hierarchy");
+ OUString aExtension = ASCII("xml");
+
+ OUString aFullname = aPath + ASCII("/") + aFilename + ASCII(".") + aExtension;
+
+ // Filename convertieren
+ OUString aURL;
+ File aConvert(ASCII(""));
+ aConvert.normalizePath(aFullname, aURL);
+
+ // File oeffnen
+ File aFile(aURL);
+ aFile.open(osl_File_OpenFlag_Read);
+
+ // sal_uInt64 nBytesRead;
+ // uno::Sequence< sal_Int8 > aBufferSeq(2000);
+ // sal_Int8 *pBuff = aBufferSeq.getArray();
+ // aFile.read(pBuff, 2000, nBytesRead);
+ //
+ // aFile.close();
+
+ uno::Reference<io::XInputStream> xInputStream = new configmgr::OSLInputStreamWrapper(aFile);
+
+ uno::Reference <uno::XInterface> xPump = xMSF->createInstance( L"com.sun.star.io.Pump" );
+ OSL_ENSURE(xPump.is(), "there is no pump");
+
+ uno::Reference<io::XActiveDataSink> xPumpSink(xPump, uno::UNO_QUERY);
+ xPumpSink->setInputStream(xInputStream);
+
+ uno::Reference<io::XActiveDataSource> xPumpSource(xPump, uno::UNO_QUERY);
+
+ Listener *pListener = new Listener();
+ uno::Reference<io::XDataTransferEventListener> rListener = pListener;
+ uno::Reference<lang::XComponent> rComponent = new Component();
+
+ // Create a TypeConverter
+ uno::Reference<script::XTypeConverter> aConverter;
+ aConverter = aConverter.query(xMSF->createInstance(ASCII( "com.sun.star.script.Converter" )) );
+
+ Sequence< uno::Any > aArgs(1); // optional arg.
+ aArgs[0] <<= configmgr::createPropertyValue(ASCII("TypeConverter"), aConverter);
+
+ Reference< XInterface > xDataImport = xMSF->createInstanceWithArguments(
+ OUString::createFromAscii("com.sun.star.configuration.DataImport"),
+ aArgs);
+
+ if (xDataImport.is())
+ {
+ uno::Reference<io::XDataImporter> rImporter(xDataImport, UNO_QUERY);
+
+ // Import Data
+ rImporter->importData(xPumpSource, rComponent, rListener);
+
+ // lets pump
+ uno::Reference<io::XActiveDataControl> xControl(xPump, uno::UNO_QUERY);
+ xControl->start();
+
+ // TEST:
+ // rImporter->cancel();
+
+ // pImporter->wait();
+ // Wait until the listener send ready
+ pListener->wait();
+ }
+ return;
+ }
+
+// -----------------------------------------------------------------------------
+// -------------------------------- Import Test --------------------------------
+// -----------------------------------------------------------------------------
+
+ // ----------- TEST ReadAccess -----------
+ void showSequence(const Sequence<OUString> &aSeq);
+
+void hierarchyTest()
+{
+
+ uno::Reference< lang::XMultiServiceFactory > xMSF;
+ try
+ {
+ xMSF = cppu::createRegistryServiceFactory(sRegistry, ::rtl::OUString());
+ }
+ catch (uno::Exception& e)
+ {
+ cout << "could not bootstrap the services from " << ASCII_STRING(sRegistry) << endl ;
+ cout << " (error message : " << ASCII_STRING(e.Message) << ")" << endl;
+ }
+
+ if (!xMSF.is())
+ {
+ cerr << "could not create the service factory !" << endl;
+ return;
+ }
+
+
+ Reference< XMultiServiceFactory > xCfgProvider( xMSF->createInstance(
+ ::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider")),
+ UNO_QUERY);
+
+ if (!xCfgProvider.is())
+ {
+ OSL_ENSURE(0, "No Configuration Provider");
+ }
+
+ OUString sPath = ASCII("com.sun.star.ucb.Hierarchy");
+
+ Sequence< Any > aArgs(1);
+ aArgs[0] <<= sPath;
+
+ Reference< XInterface > xCfgUpdt = xCfgProvider->createInstanceWithArguments(
+ OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"),
+ aArgs);
+
+ Reference< XNameAccess > xNameAccess(xCfgUpdt, UNO_QUERY);
+
+ // which Names are exist?
+ showSequence(xNameAccess->getElementNames());
+
+ OUString aNamePath = ASCII("Root");
+ if (xNameAccess->hasByName(aNamePath))
+ {
+ Any aAny;
+ aAny = xNameAccess->getByName(aNamePath);
+ TypeClass aTypeClass = aAny.getValueTypeClass();
+ if (aAny.getValueTypeClass() == TypeClass_INTERFACE)
+ {
+ Reference< XInterface > xInterface;
+ aAny >>= xInterface;
+ Reference< XNameAccess > xNameAccess2(xInterface, UNO_QUERY);
+ if (xNameAccess.is())
+ {
+ Sequence<OUString> aSeq = xNameAccess2->getElementNames();
+ showSequence(aSeq);
+
+ // insert a new set
+/*
+ Reference<XHierarchicalName> xHierarchical(xNameAccess, UNO_QUERY);
+ OUString aHierachicalName = xHierarchical->getHierarchicalName();
+
+ Sequence< Any > aArgs(2);
+ aArgs[0] <<= aHierachicalName;
+ sal_Int32 nLevels=1;
+ aArgs[1] <<= nLevels;
+
+ Reference< XInterface > xCfgNewUpdt = xCfgProvider->createInstanceWithArguments(
+ OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"),
+ aArgs);
+*/
+ Reference< lang::XSingleServiceFactory > xChildFactory(xNameAccess2, UNO_QUERY);
+ if (xChildFactory.is())
+ {
+ Reference< XInterface > xChild = xChildFactory->createInstance();
+ if (xChild.is())
+ {
+ Reference<XNameAccess> xObjectOnTheMedow(xChild, UNO_QUERY);
+
+
+
+
+ // which Names are exist?
+ showSequence(xObjectOnTheMedow->getElementNames());
+
+ OUString aChildren = ASCII("Children");
+ if (xObjectOnTheMedow->hasByName(aChildren))
+ {
+ Any aAny;
+ aAny = xObjectOnTheMedow->getByName(aChildren);
+ TypeClass aTypeClass = aAny.getValueTypeClass();
+ if (aAny.getValueTypeClass() == TypeClass_INTERFACE)
+ {
+ Reference< XInterface > xInterface;
+ aAny >>= xInterface;
+ Reference< XNameAccess > xChildFromOOM(xInterface, UNO_QUERY);
+
+ if (xChildFromOOM.is())
+ {
+ // insert a new Object in the new Object
+
+ Reference< lang::XSingleServiceFactory > xChildFactory(xChildFromOOM, UNO_QUERY);
+ if (xChildFactory.is())
+ {
+ Reference< XInterface > xChild = xChildFactory->createInstance();
+ if (xChild.is())
+ {
+ Reference<XNameContainer> xNameContainer(xChildFromOOM, UNO_QUERY);
+ if (xNameContainer.is())
+ {
+ xNameContainer->insertByName(ASCII("Test2"), makeAny(xChild));
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ Reference<XNameContainer> xNameContainer(xNameAccess2, UNO_QUERY);
+ if (xNameContainer.is())
+ {
+ xNameContainer->insertByName(ASCII("Test"), makeAny(xObjectOnTheMedow));
+ }
+ }
+
+ // commit changes
+ Reference< XChangesBatch > xChangesBatch(xCfgUpdt, UNO_QUERY);
+ if (xChangesBatch.is())
+ {
+ xChangesBatch->commitChanges();
+ }
+ }
+
+ Sequence<OUString> aSeq2 = xNameAccess2->getElementNames();
+ showSequence(aSeq2);
+
+/*
+ OUString *pStr = aSeq.getArray();
+ for (int i=0;i<aSeq.getLength();i++)
+ {
+ OUString aStr = pStr[i];
+ Any aAny;
+ aAny = xNameAccess->getByName(aStr);
+ TypeClass aTypeClass = aAny.getValueTypeClass();
+
+ Reference< XNameReplace > xNameReplace(xNameAccess, UNO_QUERY);
+
+ Any aNewAny;
+ sal_Bool bValue = false;
+ aNewAny <<= bValue;
+ xNameReplace->replaceByName(aStr, aNewAny);
+
+ volatile int dummy = 0;
+ }
+*/
+ }
+ }
+ volatile int dummy = 0;
+ }
+}
+
+// ------------------------------ Helperfunctions ------------------------------
+
+ void showSequence(const Sequence<OUString> &aSeq)
+ {
+ OUString aArray;
+ const OUString *pStr = aSeq.getConstArray();
+ for (int i=0;i<aSeq.getLength();i++)
+ {
+ OUString aStr = pStr[i];
+ aArray += aStr + ASCII(", ");
+ }
+ volatile int dummy = 0;
+ }
+
+} // namespace configmgr
diff --git a/configmgr/workben/logger/exports.dxp b/configmgr/workben/logger/exports.dxp
new file mode 100644
index 000000000000..9630d7e06768
--- /dev/null
+++ b/configmgr/workben/logger/exports.dxp
@@ -0,0 +1,3 @@
+component_getImplementationEnvironment
+component_writeInfo
+component_getFactory
diff --git a/configmgr/workben/logger/loggerdfn.cxx b/configmgr/workben/logger/loggerdfn.cxx
new file mode 100644
index 000000000000..8449da042c03
--- /dev/null
+++ b/configmgr/workben/logger/loggerdfn.cxx
@@ -0,0 +1,154 @@
+/*************************************************************************
+ *
+ * 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: loggerdfn.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_configmgr.hxx"
+
+#include "simplelogger.hxx"
+#include <com/sun/star/registry/XRegistryKey.hpp>
+#ifndef _CPPUHELPER_IMPLEMENTATIONENTRY_HXX_
+#include <cppuhelper/implementationentry.hxx>
+#endif
+#include <rtl/ustrbuf.hxx>
+
+namespace cssuno = com::sun::star::uno;
+using rtl::OUString;
+using rtl::OUStringBuffer;
+
+//==============================================================================
+
+static cssuno::Reference<cssuno::XInterface> SAL_CALL
+ createSimpleLogger( const cssuno::Reference<cssuno::XComponentContext>& aContext)
+{
+ return * new logger::SimpleLogger(aContext,"configuration.log") ;
+}
+//==============================================================================
+
+// adapted from the corresponding cppuhelper function
+static sal_Bool component_writeInfoHelper_withSingleton(
+ void *pServiceManager, void *pRegistryKey ,
+ const cppu::ImplementationEntry entries[],
+ char const * const singletons[])
+{
+ using namespace com::sun::star::registry;
+ using rtl::OUString;
+
+ sal_Bool bRet = sal_False;
+ try
+ {
+ if( pRegistryKey )
+ {
+ for( sal_Int32 i = 0; entries[i].create ; i ++ )
+ {
+ rtl::OUStringBuffer buf( 124 );
+ buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("/") );
+ buf.append( entries[i].getImplementationName() );
+ buf.appendAscii(RTL_CONSTASCII_STRINGPARAM( "/UNO/SERVICES" ) );
+ cssuno::Reference< XRegistryKey > xNewKey(
+ static_cast< XRegistryKey * >( pRegistryKey )->createKey( buf.makeStringAndClear() ) );
+
+ cssuno::Sequence< OUString > const seq = entries[i].getSupportedServiceNames();
+ for ( sal_Int32 nPos = 0 ; nPos < seq.getLength(); nPos ++ )
+ xNewKey->createKey( seq[nPos] );
+
+ if (singletons[i])
+ {
+ rtl::OUStringBuffer buf( 124 );
+ buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("/") );
+ buf.append( entries[i].getImplementationName() );
+ buf.appendAscii(RTL_CONSTASCII_STRINGPARAM( "/UNO/SINGLETONS/" ) );
+ buf.appendAscii(singletons[i]);
+ cssuno::Reference< XRegistryKey > xNewKey(
+ static_cast< XRegistryKey * >( pRegistryKey )->createKey( buf.makeStringAndClear() ) );
+
+ xNewKey->setStringValue(entries[i].getImplementationName());
+ }
+ }
+ bRet = sal_True;
+ }
+ }
+ catch ( InvalidRegistryException & )
+ {
+ OSL_ENSURE( sal_False, "### InvalidRegistryException!" );
+ }
+ catch ( cssuno::Exception & )
+ {
+ OSL_ENSURE( sal_False, "### Unexpected UNO Exception!" );
+ }
+ return bRet;
+}
+
+//------------------------------------------------------------------------------
+
+static const cppu::ImplementationEntry kImplementations_entries[] =
+{
+ {
+ createSimpleLogger,
+ logger::SimpleLogger::getImplementationName_static,
+ logger::SimpleLogger::getSupportedServiceNames_static,
+ cppu::createSingleComponentFactory,
+ NULL,
+ 0
+ },
+ { NULL }
+} ;
+static const char * const kSingleton_names[] =
+{
+ "com.sun.star.configuration.theLogger",
+ NULL
+};
+
+//------------------------------------------------------------------------------
+
+extern "C" void SAL_CALL component_getImplementationEnvironment(
+ const sal_Char **aEnvTypeName,
+ uno_Environment **aEnvironment) {
+ *aEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME ;
+}
+//------------------------------------------------------------------------------
+
+extern "C" sal_Bool SAL_CALL component_writeInfo(void *aServiceManager,
+ void *aRegistryKey) {
+ return component_writeInfoHelper_withSingleton( aServiceManager,
+ aRegistryKey,
+ kImplementations_entries,
+ kSingleton_names) ;
+}
+//------------------------------------------------------------------------------
+
+extern "C" void *component_getFactory(const sal_Char *aImplementationName,
+ void *aServiceManager,
+ void *aRegistryKey) {
+ return cppu::component_getFactoryHelper(aImplementationName,
+ aServiceManager,
+ aRegistryKey,
+ kImplementations_entries) ;
+}
+//------------------------------------------------------------------------------
diff --git a/configmgr/workben/logger/makefile.mk b/configmgr/workben/logger/makefile.mk
new file mode 100644
index 000000000000..a7d37cb00274
--- /dev/null
+++ b/configmgr/workben/logger/makefile.mk
@@ -0,0 +1,73 @@
+#*************************************************************************
+#
+# 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=$(PRJ)$/source
+PRJNAME=configmgr
+TARGET=simplelogger
+ENABLE_EXCEPTIONS=TRUE
+
+# Version
+SYSMGR_MAJOR=1
+
+# --- Settings ---
+
+.INCLUDE : settings.mk
+DLLPRE =
+
+# --- Files ---
+
+
+SLOFILES=\
+ $(SLO)$/simplelogger.obj \
+ $(SLO)$/loggerdfn.obj
+
+LIB1TARGET=$(SLB)$/_$(TARGET).lib
+LIB1OBJFILES=$(SLOFILES)
+
+SHL1TARGET=$(TARGET)$(SYSMGR_MAJOR).uno
+SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+SHL1LIBS=$(LIB1TARGET)
+SHL1IMPLIB=i$(SHL1TARGET)
+SHL1STDLIBS= \
+ $(CPPUHELPERLIB) \
+ $(CPPULIB) \
+ $(SALLIB)
+
+DEF1NAME=$(SHL1TARGET)
+DEF1EXPORTFILE=exports.dxp
+DEF1DES=Configuration: Simple Logger
+
+# --- Targets ---
+
+.INCLUDE : target.mk
+
diff --git a/configmgr/workben/logger/simplelogger.cxx b/configmgr/workben/logger/simplelogger.cxx
new file mode 100644
index 000000000000..3ca78547f65c
--- /dev/null
+++ b/configmgr/workben/logger/simplelogger.cxx
@@ -0,0 +1,177 @@
+/*************************************************************************
+ *
+ * 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: simplelogger.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_configmgr.hxx"
+
+#include "simplelogger.hxx"
+#include <com/sun/star/util/logging/LogLevel.hpp>
+
+#include <osl/thread.h>
+#include <stdlib.h> // for getenv
+
+namespace logger
+{
+
+ namespace LogLevel = com::sun::star::util::logging::LogLevel;
+
+//==============================================================================
+static rtl::OString level2str(sal_Int32 nLevel)
+{
+ return rtl::OString::valueOf(nLevel);
+}
+
+sal_Int32 str2level(rtl::OString const & str)
+{
+ return str.toInt32();
+}
+
+//------------------------------------------------------------------------------
+SimpleLogger::SimpleLogger( const uno::Reference<uno::XComponentContext>& xContext, char const * name)
+: mContext(xContext)
+, mName( OUString::createFromAscii(name) )
+, mOutput(stderr)
+, mLevel(LogLevel::INFO)
+{
+ if (char const * fname = getenv("CFG_LOGFILE"))
+ {
+ mOutput = fopen(fname,"a+");
+ OSL_ENSURE(mOutput,"ERROR: could not open logfile\n");
+ }
+
+ if (char const * level = getenv("CFG_LOGLEVEL"))
+ {
+ mLevel = str2level(level);
+ }
+}
+//------------------------------------------------------------------------------
+SimpleLogger::~SimpleLogger()
+{
+}
+//------------------------------------------------------------------------------
+uno::Reference< logging::XLogger > SAL_CALL
+ SimpleLogger::getLogger( const OUString& name )
+ throw (uno::RuntimeException)
+{
+ if (name == mName) return this;
+
+ // try whatever
+ uno::Reference< logging::XLogger > xNamedLogger;
+ if (mContext.is())
+ {
+ OUString const singleton(RTL_CONSTASCII_USTRINGPARAM("/singletons/"));
+ mContext->getValueByName(singleton.concat(name)) >>= xNamedLogger;
+ }
+ return xNamedLogger;
+}
+
+//------------------------------------------------------------------------------
+sal_Int32 SAL_CALL SimpleLogger::getLevel( ) throw (uno::RuntimeException)
+{
+ return mLevel;
+}
+
+//------------------------------------------------------------------------------
+OUString SAL_CALL SimpleLogger::getName( ) throw (uno::RuntimeException)
+{
+ return mName;
+}
+
+//------------------------------------------------------------------------------
+sal_Bool SAL_CALL SimpleLogger::isLoggable( sal_Int32 level ) throw (uno::RuntimeException)
+{
+ return mOutput && level >= mLevel;
+}
+
+//------------------------------------------------------------------------------
+#define OU2OUT( ustr ) ( rtl::OUStringToOString( ustr, enc ).getStr() )
+
+void SAL_CALL SimpleLogger::logp( sal_Int32 level, const OUString& sourceClass, const OUString& sourceMethod, const OUString& msg )
+ throw (uno::RuntimeException)
+{
+ rtl_TextEncoding enc = osl_getThreadTextEncoding();
+ if (mOutput && level > mLevel)
+ {
+ fprintf( mOutput, "%s {%s.%s}: [%s] %s\n", OU2OUT(mName),
+ OU2OUT(sourceClass) , OU2OUT(sourceMethod),
+ level2str(level).getStr(), OU2OUT(msg) );
+ }
+}
+
+//------------------------------------------------------------------------------
+
+OUString SAL_CALL SimpleLogger::getImplementationName_static()
+{
+ static const char kImplementationName[] = "com.sun.star.comp.configmgr.logging.SimpleLogger";
+
+ return OUString(RTL_CONSTASCII_USTRINGPARAM(kImplementationName)) ;
+}
+//------------------------------------------------------------------------------
+
+rtl::OUString SAL_CALL SimpleLogger::getImplementationName()
+ throw (uno::RuntimeException)
+{
+ return getImplementationName_static() ;
+}
+//------------------------------------------------------------------------------
+
+uno::Sequence<rtl::OUString> SAL_CALL SimpleLogger::getSupportedServiceNames_static()
+{
+ uno::Sequence<rtl::OUString> aServices(2) ;
+ aServices[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.logging.SimpleLogger")) ;
+ aServices[1] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.util.logging.Logger")) ;
+
+ return aServices ;
+}
+//------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL SimpleLogger::supportsService(
+ const rtl::OUString& aServiceName)
+ throw (uno::RuntimeException)
+{
+ uno::Sequence< rtl::OUString > const svc = getSupportedServiceNames_static();
+
+ for(sal_Int32 i = 0; i < svc.getLength(); ++i )
+ if(svc[i] == aServiceName)
+ return true;
+ return false;
+}
+//------------------------------------------------------------------------------
+
+uno::Sequence<rtl::OUString>
+SAL_CALL SimpleLogger::getSupportedServiceNames()
+ throw (uno::RuntimeException)
+{
+ return getSupportedServiceNames_static() ;
+}
+//------------------------------------------------------------------------------
+
+
+} // namespace logger
diff --git a/configmgr/workben/logger/simplelogger.hxx b/configmgr/workben/logger/simplelogger.hxx
new file mode 100644
index 000000000000..81cfeb70a1ef
--- /dev/null
+++ b/configmgr/workben/logger/simplelogger.hxx
@@ -0,0 +1,86 @@
+#ifndef CONFIGMGR_SIMPLELOGGER_HXX_
+#define CONFIGMGR_SIMPLELOGGER_HXX_
+
+#include "simplelogger.hxx"
+#include <com/sun/star/util/logging/XLogger.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <cppuhelper/implbase2.hxx>
+
+#include <stdio.h>
+
+namespace logger {
+
+namespace uno = com::sun::star::uno ;
+namespace lang = com::sun::star::lang ;
+namespace logging = com::sun::star::util::logging ;
+using rtl::OUString;
+
+typedef cppu::WeakImplHelper2< logging::XLogger,
+ lang::XServiceInfo> LoggerBase ;
+
+
+/**
+ Class implementing the Logger service
+ */
+class SimpleLogger : public LoggerBase
+{
+public :
+ /**
+ Service constructor from a service factory.
+
+ @param xContext component context
+ */
+ explicit
+ SimpleLogger( const uno::Reference<uno::XComponentContext>& xContext, char const * name) ;
+
+ /** Destructor */
+ ~SimpleLogger() ;
+
+ // XLogger
+ virtual uno::Reference< logging::XLogger > SAL_CALL
+ getLogger( const OUString& name )
+ throw (uno::RuntimeException);
+
+ virtual sal_Int32 SAL_CALL getLevel( ) throw (uno::RuntimeException);
+ virtual OUString SAL_CALL getName( ) throw (uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isLoggable( sal_Int32 level ) throw (uno::RuntimeException);
+
+ virtual void SAL_CALL
+ logp( sal_Int32 level, const OUString& sourceClass, const OUString& sourceMethod, const OUString& msg )
+ throw (uno::RuntimeException);
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName()
+ throw (uno::RuntimeException) ;
+
+ virtual sal_Bool SAL_CALL supportsService( const OUString& aServiceName)
+ throw (uno::RuntimeException) ;
+
+ virtual uno::Sequence<OUString> SAL_CALL
+ getSupportedServiceNames(void) throw (uno::RuntimeException) ;
+
+ /**
+ Provides the implementation name.
+
+ @return implementation name
+ */
+ static OUString SAL_CALL getImplementationName_static() ;
+ /**
+ Provides the list of supported services.
+
+ @return list of service names
+ */
+ static uno::Sequence<OUString> SAL_CALL getSupportedServiceNames_static() ;
+
+private:
+ /** Component Context */
+ uno::Reference<uno::XComponentContext> mContext ;
+ OUString mName;
+ FILE * mOutput;
+ sal_Int32 mLevel;
+} ;
+
+} // namespace logger
+
+#endif
diff --git a/configmgr/workben/memory/logmechanism.hxx b/configmgr/workben/memory/logmechanism.hxx
new file mode 100644
index 000000000000..a76886d33bd7
--- /dev/null
+++ b/configmgr/workben/memory/logmechanism.hxx
@@ -0,0 +1,105 @@
+/*************************************************************************
+ *
+ * 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: logmechanism.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.
+ *
+ ************************************************************************/
+
+#ifndef __FRAMEWORK_MACROS_DEBUG_LOGMECHANISM_HXX_
+#define __FRAMEWORK_MACROS_DEBUG_LOGMECHANISM_HXX_
+
+//*****************************************************************************************************************
+// generic macros for logging
+//*****************************************************************************************************************
+
+#ifdef ENABLE_LOGMECHANISM
+
+ //_____________________________________________________________________________________________________________
+ // includes
+ //_____________________________________________________________________________________________________________
+
+ #ifndef _RTL_STRING_HXX_
+ #include <rtl/string.hxx>
+ #endif
+
+ #include <stdio.h>
+
+ /*_____________________________________________________________________________________________________________
+ WRITE_LOGFILE( SFILENAME, STEXT )
+
+ Log any information in file. We append any information at file and don't clear it anymore.
+ ( Use new scope in macro to declare pFile more then on time in same "parentscope"!
+ Don't control pFile before access! What will you doing if its not valid? Log an error ...
+ An error and an error is an error ... )
+
+ Attention: You must use "%s" and STEXT as parameter ... because otherwise encoded strings (they include e.g. %...)
+ are handled wrong.
+ _____________________________________________________________________________________________________________*/
+
+ #define WRITE_LOGFILE( SFILENAME, STEXT ) \
+ { \
+ ::rtl::OString _swriteLogfileFileName ( SFILENAME ); \
+ ::rtl::OString _swriteLogfileText ( STEXT ); \
+ FILE* pFile = fopen( _swriteLogfileFileName.getStr(), "a" ); \
+ fprintf( pFile, "%s", _swriteLogfileText.getStr() ); \
+ fclose ( pFile ); \
+ }
+
+ /*_____________________________________________________________________________________________________________
+ LOGTYPE
+
+ For other debug macros we need information about the output mode. If user forget to set this information we
+ do it for him. Valid values are: LOGTYPE_FILECONTINUE
+ LOGTYPE_FILEEXIT
+ LOGTYPE_MESSAGEBOX
+ The normal case is LOGTYPE_MESSAGEBOX to show assertions in normal manner!
+ _____________________________________________________________________________________________________________*/
+
+ #define LOGTYPE_MESSAGEBOX 1
+ #define LOGTYPE_FILECONTINUE 2
+ #define LOGTYPE_FILEEXIT 3
+
+ #ifndef LOGTYPE
+ #define LOGTYPE \
+ LOGTYPE_MESSAGEBOX
+ #endif
+
+#else // #ifdef ENABLE_LOGMECHANISM
+
+ /*_____________________________________________________________________________________________________________
+ If right testmode is'nt set - implements these macro empty!
+ _____________________________________________________________________________________________________________*/
+
+ #define WRITE_LOGFILE( SFILENAME, STEXT )
+ #undef LOGTYPE
+
+#endif // #ifdef ENABLE_LOGMECHANISM
+
+//*****************************************************************************************************************
+// end of file
+//*****************************************************************************************************************
+
+#endif // #ifndef __FRAMEWORK_MACROS_DEBUG_LOGMECHANISM_HXX_
diff --git a/configmgr/workben/memory/main.cxx b/configmgr/workben/memory/main.cxx
new file mode 100644
index 000000000000..7d42754f1cf3
--- /dev/null
+++ b/configmgr/workben/memory/main.cxx
@@ -0,0 +1,80 @@
+/*************************************************************************
+ *
+ * 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: main.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_configmgr.hxx"
+#include <iostream>
+using namespace std;
+
+#define ENABLE_MEMORYMEASURE
+#define ENABLE_LOGMECHANISM
+
+// If you wish to enable this memory measure macros ... you need "windows.h"
+// But it's not agood idea to include it in your header!!! Because it's not compatible to VCL header .-(
+// So you must include it here ... in cxx, where you whish to use it.
+#ifdef ENABLE_MEMORYMEASURE
+ #define VCL_NEED_BASETSD
+ #include <tools/presys.h>
+ #include <windows.h>
+ #include <tools/postsys.h>
+ #undef VCL_NEED_BASETSD
+#endif
+#include "memorymeasure.hxx"
+
+#include "logmechanism.hxx"
+// -----------------------------------------------------------------------------
+// ---------------------------------- M A I N ----------------------------------
+// -----------------------------------------------------------------------------
+
+#if (defined UNX) || (defined OS2)
+int main( int argc, char * argv[] )
+#else
+int _cdecl main( int argc, char * argv[] )
+#endif
+{
+
+ START_MEMORYMEASURE( aMemoryInfo );
+
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "first start" );
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "1" );
+
+ sal_Char* pTest = new sal_Char[1000 * 1000 * 50];
+ sal_Char* pTest1 = new sal_Char[1000 * 1000 * 50];
+ sal_Char* pTest2 = new sal_Char[1000 * 1000 * 50];
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "2" );
+
+ LOG_MEMORYMEASURE( "FirstTest_of_memusage", "Values of memory access for standard filters.", aMemoryInfo );
+
+ return 0;
+}
+
diff --git a/configmgr/workben/memory/makefile.mk b/configmgr/workben/memory/makefile.mk
new file mode 100644
index 000000000000..cad7b533e6f2
--- /dev/null
+++ b/configmgr/workben/memory/makefile.mk
@@ -0,0 +1,259 @@
+#*************************************************************************
+#
+# 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 $
+#
+# 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=$(PRJ)$/source
+
+PRJNAME=configmgr
+
+TARGET=memorytest
+TARGET2=memorytesthack
+TARGETTYPE=CUI
+LIBTARGET=NO
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+.INCLUDE : settings.mk
+
+# --- Files --------------------------------------------------------
+
+# ... common for all test executables ..............................
+APPSTDLIBS=\
+ $(SALLIB) \
+ $(VOSLIB) \
+ $(CPPULIB) \
+ $(CPPUHELPERLIB) \
+ $(COMPHELPERLIB) \
+
+# ... cfgapi ..............................
+# APP1STDLIBS = $(APPSTDLIBS)
+#
+# APP1STDLIBS+=$(STDLIBCPP)
+#
+# APP1TARGET= $(TARGET)
+# APP1OBJS= \
+# $(SLO)$/cfgapi2.obj \
+# $(SLO)$/strimpl.obj \
+# $(SLO)$/typeconverter.obj \
+# $(SLO)$/simpletypehelper.obj \
+# $(SLO)$/memory.obj \
+
+# ... cfgapi ..............................
+APP2STDLIBS = $(APPSTDLIBS)
+
+APP2STDLIBS+= $(STDLIBCPP)
+
+# CFLAGS+=-DWITHOUTAPI
+
+APP2TARGET= $(TARGET2)
+APP2OBJS= \
+ $(SLO)$/memorytests.obj \
+ $(SLO)$/testmodules.obj \
+ $(SLO)$/treeload.obj \
+ $(SLO)$/accessimpl.obj \
+ $(SLO)$/adminproviderimpl.obj \
+ $(SLO)$/apiaccessobj.obj \
+ $(SLO)$/apifactory.obj \
+ $(SLO)$/apifactoryimpl.obj \
+ $(SLO)$/apinodeaccess.obj \
+ $(SLO)$/apinodeupdate.obj \
+ $(SLO)$/apinotifierimpl.obj \
+ $(SLO)$/apiserviceinfo.obj \
+ $(SLO)$/apitreeaccess.obj \
+ $(SLO)$/apitreeimplobj.obj \
+ $(SLO)$/attributelist.obj \
+ $(SLO)$/attributeparser.obj \
+ $(SLO)$/binarybasereader.obj \
+ $(SLO)$/binarydecide.obj \
+ $(SLO)$/binaryreader.obj \
+ $(SLO)$/binarywritehandler.obj \
+ $(SLO)$/binarywriter.obj \
+ $(SLO)$/bootstrap.obj \
+ $(SLO)$/broadcaster.obj \
+ $(SLO)$/cachewritescheduler.obj \
+ $(SLO)$/changes.obj \
+ $(SLO)$/cmtree.obj \
+ $(SLO)$/cmtreemodel.obj \
+ $(SLO)$/collectchanges.obj \
+ $(SLO)$/committer.obj \
+ $(SLO)$/confeventhelpers.obj \
+ $(SLO)$/confevents.obj \
+ $(SLO)$/configexcept.obj \
+ $(SLO)$/configgroup.obj \
+ $(SLO)$/confignotifier.obj \
+ $(SLO)$/configpath.obj \
+ $(SLO)$/configsession.obj \
+ $(SLO)$/configset.obj \
+ $(SLO)$/confname.obj \
+ $(SLO)$/confprovider2.obj \
+ $(SLO)$/confproviderimpl2.obj \
+ $(SLO)$/confsvccomponent.obj \
+ $(SLO)$/disposetimer.obj \
+ $(SLO)$/elementaccess.obj \
+ $(SLO)$/elementimpl.obj \
+ $(SLO)$/encodename.obj \
+ $(SLO)$/filehelper.obj \
+ $(SLO)$/generatecache.obj \
+ $(SLO)$/groupaccess.obj \
+ $(SLO)$/groupimpl.obj \
+ $(SLO)$/groupobjects.obj \
+ $(SLO)$/groupupdate.obj \
+ $(SLO)$/invalidatetree.obj \
+ $(SLO)$/listenercontainer.obj \
+ $(SLO)$/loader.obj \
+ $(SLO)$/localizednodebuilder.obj \
+ $(SLO)$/localizedtreeactions.obj \
+ $(SLO)$/localsession.obj \
+ $(SLO)$/matchlocale.obj \
+ $(SLO)$/mergechange.obj \
+ $(SLO)$/namehelper.obj \
+ $(SLO)$/nodechange.obj \
+ $(SLO)$/nodechangeimpl.obj \
+ $(SLO)$/nodechangeinfo.obj \
+ $(SLO)$/nodefactory.obj \
+ $(SLO)$/nodeimpl.obj \
+ $(SLO)$/nodeimplobj.obj \
+ $(SLO)$/noderef.obj \
+ $(SLO)$/notifycallback.obj \
+ $(SLO)$/oslstream.obj \
+ $(SLO)$/pathhelper.obj \
+ $(SLO)$/portalstream.obj \
+ $(SLO)$/propertiesfilterednotifier.obj \
+ $(SLO)$/propertyinfohelper.obj \
+ $(SLO)$/propertysetaccess.obj \
+ $(SLO)$/propsetaccessimpl.obj \
+ $(SLO)$/provider.obj \
+ $(SLO)$/providerfactory.obj \
+ $(SLO)$/providerimpl.obj \
+ $(SLO)$/receivethread.obj \
+ $(SLO)$/redirector.obj \
+ $(SLO)$/remotesession.obj \
+ $(SLO)$/roottree.obj \
+ $(SLO)$/saxadapter.obj \
+ $(SLO)$/saxtools.obj \
+ $(SLO)$/sessionfactory.obj \
+ $(SLO)$/sessionstream.obj \
+ $(SLO)$/setaccess.obj \
+ $(SLO)$/setnodeimpl.obj \
+ $(SLO)$/setobjects.obj \
+ $(SLO)$/setupdate.obj \
+ $(SLO)$/simpletypehelper.obj \
+ $(SLO)$/socketstream.obj \
+ $(SLO)$/strimpl.obj \
+ $(SLO)$/synchronize.obj \
+ $(SLO)$/template.obj \
+ $(SLO)$/templateimpl.obj \
+ $(SLO)$/timestamp.obj \
+ $(SLO)$/tracer.obj \
+ $(SLO)$/translatechanges.obj \
+ $(SLO)$/treeactions.obj \
+ $(SLO)$/treebuildercallback.obj \
+ $(SLO)$/treecache.obj \
+ $(SLO)$/treedata.obj \
+ $(SLO)$/treeimpl.obj \
+ $(SLO)$/treeiterators.obj \
+ $(SLO)$/treenodefactory.obj \
+ $(SLO)$/trivialbufferedfile.obj \
+ $(SLO)$/typeconverter.obj \
+ $(SLO)$/updatehandler.obj \
+ $(SLO)$/updateimpl.obj \
+ $(SLO)$/updatetree.obj \
+ $(SLO)$/userimpl.obj \
+ $(SLO)$/valueconverter.obj \
+ $(SLO)$/valuehandler.obj \
+ $(SLO)$/valuenodebuilder.obj \
+ $(SLO)$/writesubtreeasbinaryhandler.obj \
+ $(SLO)$/xmlformater.obj \
+ $(SLO)$/xmltreebuilder.obj \
+ $(SLO)$/valuemembernode.obj \
+ $(SLO)$/anypair.obj \
+
+# $(SLO)$/memory.obj \
+
+
+# $(SLO)$/strimpl.obj \
+# $(SLO)$/typeconverter.obj \
+# $(SLO)$/simpletypehelper.obj \
+# $(SLO)$/memory.obj \
+# $(SLO)$/loadwithtreemanager.obj \
+# $(SLO)$/localsession.obj \
+# $(SLO)$/configsession.obj \
+# $(SLO)$/confname.obj \
+# $(SLO)$/tracer.obj \
+# $(SLO)$/generatecache.obj \
+# $(SLO)$/treeactions.obj \
+# $(SLO)$/cmtreemodel.obj \
+# $(SLO)$/cmtree.obj \
+# $(SLO)$/xmltreebuilder.obj \
+# $(SLO)$/xmlformater.obj \
+# $(SLO)$/binaryreader.obj \
+# $(SLO)$/binarybasereader.obj \
+# $(SLO)$/binarywriter.obj \
+# $(SLO)$/binarywritehandler.obj \
+# $(SLO)$/binarydecide.obj \
+# $(SLO)$/writesubtreeasbinaryhandler.obj \
+# $(SLO)$/oslstream.obj \
+# $(SLO)$/pathhelper.obj \
+# $(SLO)$/treecache.obj \
+# $(SLO)$/updatetree.obj \
+# $(SLO)$/attributeparser.obj \
+# $(SLO)$/updatehandler.obj \
+# $(SLO)$/synchronize.obj \
+# $(SLO)$/filehelper.obj \
+# $(SLO)$/mergechange.obj \
+# $(SLO)$/providerimpl.obj \
+# $(SLO)$/bootstrap.obj \
+# $(SLO)$/matchlocale.obj \
+# $(SLO)$/changes.obj \
+# $(SLO)$/configexcept.obj \
+# $(SLO)$/valuehandler.obj \
+# $(SLO)$/treenodefactory.obj \
+# $(SLO)$/attributelist.obj \
+# $(SLO)$/namehelper.obj \
+# $(SLO)$/localizedtreeactions.obj \
+# $(SLO)$/trivialbufferedfile.obj \
+# $(SLO)$/cachewritescheduler.obj \
+# $(SLO)$/disposetimer.obj \
+# $(SLO)$/noderef.obj \
+# $(SLO)$/treedata.obj \
+# $(SLO)$/confevents.obj \
+# $(SLO)$/treebuildercallback.obj \
+# $(SLO)$/loader.obj \
+# $(SLO)$/apifactoryimpl.obj \
+# $(SLO)$/apitreeimplobj.obj \
+
+# $(SLO)$/.obj \
+
+
+.INCLUDE : target.mk
+
+
diff --git a/configmgr/workben/memory/memorymeasure.hxx b/configmgr/workben/memory/memorymeasure.hxx
new file mode 100644
index 000000000000..75313e23aa85
--- /dev/null
+++ b/configmgr/workben/memory/memorymeasure.hxx
@@ -0,0 +1,228 @@
+/*************************************************************************
+ *
+ * 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: memorymeasure.hxx,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 __FRAMEWORK_MACROS_DEBUG_MEMORYMEASURE_HXX_
+#define __FRAMEWORK_MACROS_DEBUG_MEMORYMEASURE_HXX_
+
+// *************************************************************************************************************
+// special macros for time measures
+// 1) LOGFILE_MEMORYMEASURE used it to define log file for this operations (default will be set automaticly)
+// 2) MAKE_MEMORY_SNAPSHOT make snapshot of currently set memory informations of OS
+// 3) LOG_MEMORYMEASURE write measured time to logfile
+// *************************************************************************************************************
+
+#ifdef ENABLE_MEMORYMEASURE
+
+#if !defined( WIN ) && !defined( WNT )
+#error "Macros to measure memory access not available under platforms different from windows!"
+#endif
+
+//_________________________________________________________________________________________________________________
+// includes
+//_________________________________________________________________________________________________________________
+
+#include <rtl/strbuf.hxx>
+
+#ifndef __SGI_STL_VECTOR
+#include <vector>
+#endif
+
+/*_____________________________________________________________________________________________________________
+ LOGFILE_MEMORYMEASURE
+
+ For follow macros we need a special log file. If user forget to specify anyone, we must do it for him!
+ _____________________________________________________________________________________________________________*/
+
+#ifndef LOGFILE_MEMORYMEASURE
+#define LOGFILE_MEMORYMEASURE "memorymeasure.log"
+#endif
+
+/*_____________________________________________________________________________________________________________
+ class MemoryMeasure
+
+ We use this baseclass to collect all snapshots in one object and analyze this information at one point.
+ Macros of this file are used to enable using of this class by special compile-parameter only!
+ _____________________________________________________________________________________________________________*/
+
+class _DBGMemoryMeasure
+{
+ //---------------------------------------------------------------------------------------------------------
+private:
+ struct _MemoryInfo
+ {
+ MEMORYSTATUS aStatus ;
+ ::rtl::OString sComment ;
+ };
+
+ //---------------------------------------------------------------------------------------------------------
+public:
+ //_____________________________________________________________________________________________________
+ inline _DBGMemoryMeasure()
+ {
+ makeSnapshot("Initializing Data");
+ }
+ //_____________________________________________________________________________________________________
+ inline _DBGMemoryMeasure(const ::rtl::OString& sComment)
+ {
+ makeSnapshot(sComment);
+ }
+
+ //_____________________________________________________________________________________________________
+ // clear used container!
+ inline ~_DBGMemoryMeasure()
+ {
+ ::std::vector< _MemoryInfo >().swap( m_lSnapshots );
+ }
+
+ //_____________________________________________________________________________________________________
+ inline void makeSnapshot( const ::rtl::OString& sComment )
+ {
+ _MemoryInfo aInfo;
+ aInfo.sComment = sComment;
+ GlobalMemoryStatus ( &(aInfo.aStatus) );
+ m_lSnapshots.push_back( aInfo );
+ }
+
+ //_____________________________________________________________________________________________________
+ inline ::rtl::OString getLog()
+ {
+ ::rtl::OStringBuffer sBuffer( 10000 );
+
+ if( m_lSnapshots.size() > 0 )
+ {
+ // Write informations to return buffer
+ ::std::vector< _MemoryInfo >::const_iterator pItem1;
+ ::std::vector< _MemoryInfo >::const_iterator pItem2;
+
+ pItem1 = m_lSnapshots.begin();
+ pItem2 = pItem1;
+ ++pItem2;
+
+ while( pItem1!=m_lSnapshots.end() )
+ {
+ sBuffer.append( "snap [ " );
+ sBuffer.append( pItem1->sComment );
+ sBuffer.append( " ]\n\tavail phys\t=\t" );
+ sBuffer.append( (sal_Int32)pItem1->aStatus.dwAvailPhys );
+ sBuffer.append( "\n\tavail page\t=\t" );
+ sBuffer.append( (sal_Int32)pItem1->aStatus.dwAvailPageFile );
+ sBuffer.append( "\n\tavail virt\t=\t" );
+ sBuffer.append( (sal_Int32)pItem1->aStatus.dwAvailVirtual );
+
+ if( pItem1 == m_lSnapshots.begin() )
+ {
+ sBuffer.append( "\n\t[initial values]\n\n" );
+ }
+ else if( pItem2 != m_lSnapshots.end() )
+ {
+ sBuffer.append( "\n\tdifference\t=\t[ " );
+ sBuffer.append( (sal_Int32)(pItem2->aStatus.dwAvailPhys - pItem1->aStatus.dwAvailPhys ) );
+ sBuffer.append( ", " );
+ sBuffer.append( (sal_Int32)(pItem2->aStatus.dwAvailPageFile - pItem1->aStatus.dwAvailPageFile ) );
+ sBuffer.append( ", " );
+ sBuffer.append( (sal_Int32)(pItem2->aStatus.dwAvailVirtual - pItem1->aStatus.dwAvailVirtual ) );
+ sBuffer.append( " ]\n\n" );
+ }
+ else
+ {
+ sBuffer.append( "\n\t[final values]\n\n" );
+ }
+ if( pItem1!=m_lSnapshots.end() ) ++pItem1;
+ if( pItem2!=m_lSnapshots.end() ) ++pItem2;
+ }
+ // clear current list ... make it empty for further snapshots!
+ ::std::vector< _MemoryInfo >().swap( m_lSnapshots );
+ }
+
+ return sBuffer.makeStringAndClear();
+ }
+
+ //---------------------------------------------------------------------------------------------------------
+private:
+ ::std::vector< _MemoryInfo > m_lSnapshots;
+};
+
+/*_____________________________________________________________________________________________________________
+ START_MEMORY_MEASURE
+
+ Create new object to measure memory access.
+ _____________________________________________________________________________________________________________*/
+
+#define START_MEMORYMEASURE( AOBJECT ) \
+ _DBGMemoryMeasure AOBJECT;
+
+#define START_MEMORYMEASURE_FOR( AOBJECT, SCOMMENT ) \
+ _DBGMemoryMeasure AOBJECT( SCOMMENT );
+
+ /*_____________________________________________________________________________________________________________
+ MAKE_MEMORY_SNAPSHOT
+
+ Make snapshot of currently set memory informations of OS.
+ see _DBGMemoryMeasure for further informations
+ _____________________________________________________________________________________________________________*/
+
+#define MAKE_MEMORY_SNAPSHOT( AOBJECT, SCOMMENT ) \
+ AOBJECT.makeSnapshot( SCOMMENT );
+
+ /*_____________________________________________________________________________________________________________
+ LOG_MEMORYMEASURE( SOPERATION, SCOMMENT, AOBJECT )
+
+ Write measured values to logfile.
+ _____________________________________________________________________________________________________________*/
+
+#define LOG_MEMORYMEASURE( SOPERATION, SCOMMENT, AOBJECT ) \
+ { \
+ ::rtl::OStringBuffer _sBuffer( 256 ); \
+ _sBuffer.append( SOPERATION ); \
+ _sBuffer.append( "\n" ); \
+ _sBuffer.append( SCOMMENT ); \
+ _sBuffer.append( "\n\n" ); \
+ _sBuffer.append( AOBJECT.getLog() ); \
+ WRITE_LOGFILE( LOGFILE_MEMORYMEASURE, _sBuffer.makeStringAndClear() ) \
+ }
+
+#else // #ifdef ENABLE_MEMORYMEASURE
+
+/*_____________________________________________________________________________________________________________
+ If right testmode is'nt set - implements these macros empty!
+ _____________________________________________________________________________________________________________*/
+
+#undef LOGFILE_MEMORYMEASURE
+#define START_MEMORYMEASURE( AOBJECT )
+#define MAKE_MEMORY_SNAPSHOT( AOBJECT, SCOMMENT )
+#define LOG_MEMORYMEASURE( SOPERATION, SCOMMENT, AOBJECT )
+
+#endif // #ifdef ENABLE_MEMORYMEASURE
+
+//*****************************************************************************************************************
+// end of file
+//*****************************************************************************************************************
+
+#endif // #ifndef __FRAMEWORK_MACROS_DEBUG_MEMORYMEASURE_HXX_
diff --git a/configmgr/workben/memory/memorytests.cxx b/configmgr/workben/memory/memorytests.cxx
new file mode 100644
index 000000000000..a3080e250c99
--- /dev/null
+++ b/configmgr/workben/memory/memorytests.cxx
@@ -0,0 +1,1244 @@
+/*************************************************************************
+ *
+ * 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: memorytests.cxx,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.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_configmgr.hxx"
+#define _PRIVATE_TEST_
+
+#include <iostream>
+#include <vector>
+#include "treeload.hxx"
+
+#include <fstream>
+
+#define ENABLE_MEMORYMEASURE
+#define ENABLE_LOGMECHANISM
+
+// If you wish to enable this memory measure macros ... you need "windows.h"
+// But it's not agood idea to include it in your header!!! Because it's not compatible to VCL header .-(
+// So you must include it here ... in cxx, where you whish to use it.
+#ifdef ENABLE_MEMORYMEASURE
+ #define VCL_NEED_BASETSD
+ #include <tools/presys.h>
+ #include <windows.h>
+ #include <tools/postsys.h>
+ #undef VCL_NEED_BASETSD
+#endif
+#include "memorymeasure.hxx"
+
+#include "logmechanism.hxx"
+
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/uno/Type.hxx>
+#include <com/sun/star/uno/TypeClass.hpp>
+
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XHierarchicalName.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/container/XNameReplace.hpp>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/beans/XExactName.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+
+#include <rtl/ustring.hxx>
+#include <rtl/string.hxx>
+#include <cppuhelper/servicefactory.hxx>
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/uno/Any.h>
+#include <osl/profile.hxx>
+#include <osl/process.h>
+#include <osl/file.h>
+
+#include <conio.h>
+
+#include "createpropertyvalue.hxx"
+
+#include "typeconverter.hxx"
+
+#include "testmodules.hxx"
+
+#include "valuenode.hxx"
+
+namespace configmgr
+{
+
+using namespace std;
+
+namespace css = com::sun::star;
+namespace uno = css::uno;
+namespace lang = css::lang;
+
+using namespace uno;
+using namespace lang;
+
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::util;
+
+using ::rtl::OUString;
+using ::rtl::OString;
+
+using namespace ::cppu;
+
+#define ASCII(x) ::rtl::OUString::createFromAscii(x)
+
+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;
+}
+
+void showSequence(const Sequence<OUString> &aSeq)
+{
+ OUString aArray;
+ const OUString *pStr = aSeq.getConstArray();
+ for (int i=0;i<aSeq.getLength();i++)
+ {
+ OUString aStr = pStr[i];
+ // aArray += aStr + ASCII(", ");
+ cout << aStr << endl;
+ }
+ volatile int dummy = 0;
+}
+
+//=============================================================================
+
+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();
+}
+
+// -----------------------------------------------------------------------------
+
+rtl::OString input(const char* pDefaultText, char cEcho)
+{
+ // PRE: a Default Text would be shown, cEcho is a Value which will show if a key is pressed.
+ const int MAX_INPUT_LEN = 500;
+ char aBuffer[MAX_INPUT_LEN];
+
+ strcpy(aBuffer, pDefaultText);
+ int nLen = strlen(aBuffer);
+
+#ifdef WNT
+ char ch = '\0';
+
+ cout << aBuffer;
+ cout.flush();
+
+ while(ch != 13)
+ {
+ ch = getch();
+ if (ch == 8)
+ {
+ if (nLen > 0)
+ {
+ cout << "\b \b";
+ cout.flush();
+ --nLen;
+ aBuffer[nLen] = '\0';
+ }
+ else
+ {
+ cout << "\a";
+ cout.flush();
+ }
+ }
+ else if (ch != 13)
+ {
+ if (nLen < MAX_INPUT_LEN)
+ {
+ if (cEcho == 0)
+ {
+ cout << ch;
+ }
+ else
+ {
+ cout << cEcho;
+ }
+ cout.flush();
+ aBuffer[nLen++] = ch;
+ aBuffer[nLen] = '\0';
+ }
+ else
+ {
+ cout << "\a";
+ cout.flush();
+ }
+ }
+ }
+#else
+ if (!cin.getline(aBuffer,sizeof aBuffer))
+ return OString();
+#endif
+ return rtl::OString(aBuffer);
+}
+
+// -----------------------------------------------------------------------------
+rtl::OUString enterValue(const char* _aStr, const char* _aDefault, bool _bIsAPassword)
+{
+ cout << _aStr;
+ cout.flush();
+
+ rtl::OUString sValue;
+ sValue <<= input(_aDefault, _bIsAPassword ? '*' : 0);
+ return sValue;
+}
+//=============================================================================
+
+uno::Reference< lang::XMultiServiceFactory > getORB();
+// -----------------------------------------------------------------------------
+
+
+Reference< XChangesBatch > xChangesBatch = NULL;
+void commit()
+{
+ if (xChangesBatch.is())
+ {
+ xChangesBatch->commitChanges();
+ }
+}
+
+// -----------------------------------------------------------------------------
+static sal_Bool s_bInitialized = sal_False;
+#ifdef LLA_PRIVAT_DEBUG
+// static const sal_Char* s_pSourcePath = "//./l|/src632/configmgr/workben/local_io/share";
+// static const sal_Char* s_pUpdatePath = "//./l|/src632/configmgr/workben/local_io/user";
+static const sal_Char* s_pSourcePath = "file:///f:/office60_633/share/config/registry";
+static const sal_Char* s_pUpdatePath = "file:///f:/office60_633/user/config/registry";
+static const sal_Char* s_pRootNode = "org.openoffice.test";
+static const sal_Char* s_pServerType = "local";
+static const sal_Char* s_pLocale = "de-DE";
+static const sal_Char* s_pServer = "";
+static const sal_Char* s_pUser = "";
+static const sal_Char* s_pPassword = "";
+#else
+static const sal_Char* s_pSourcePath = "file:///g:/src/configmgr/workben/local_io/share";
+static const sal_Char* s_pUpdatePath = "file:///g:/src/configmgr/workben/local_io/user";
+static const sal_Char* s_pRootNode = "org.openoffice.test";
+static const sal_Char* s_pServerType = "local";
+static const sal_Char* s_pLocale = "de-DE";
+static const sal_Char* s_pServer = "lautrec-3108:19205";
+static const sal_Char* s_pUser = "lars";
+static const sal_Char* s_pPassword = "";
+#endif
+
+static bool m_bChange = false;
+// -----------------------------------------------------------------------------
+static void loadDefaults()
+{
+ if (s_bInitialized)
+ return;
+
+ s_bInitialized = sal_True;
+
+ try
+ {
+ // the executable file name
+ ::rtl::OUString sExecutable;
+ osl_getExecutableFile(&sExecutable.pData);
+ // cut the name, add a cfgapi.ini to the path
+ sal_Int32 nLastSep = sExecutable.lastIndexOf('/');
+ if (-1 != nLastSep)
+ sExecutable = sExecutable.copy(0, nLastSep + 1);
+#ifdef UNX
+ sExecutable += ::rtl::OUString::createFromAscii("cfgapirc");
+#else
+ sExecutable += ::rtl::OUString::createFromAscii("cfgapi.ini");
+#endif
+ ::rtl::OUString sNormalized;
+ sNormalized = sExecutable;
+ if (1) // osl_File_E_None == osl_normalizePath(sExecutable.pData, &sNormalized.pData))
+ {
+ ::osl::Profile aProfile(sNormalized);
+
+ static ::rtl::OString sSection("defaults");
+ static ::rtl::OString sSourcePath("sourcepath");
+ static ::rtl::OString sUpdatePath("updatepath");
+ static ::rtl::OString sRootNode("rootnode");
+ static ::rtl::OString sServerType("servertype");
+ static ::rtl::OString sLocale("Locale");
+ static ::rtl::OString sServer("Server");
+ static ::rtl::OString sUser("User");
+ static ::rtl::OString sPassword("Password");
+
+ // read some strings.
+ // Do this static because we want to redirect the global static character pointers to the buffers.
+ static ::rtl::OString s_sSourcePath = aProfile.readString(sSection, sSourcePath, s_pSourcePath);
+ static ::rtl::OString s_sUpdatePath = aProfile.readString(sSection, sUpdatePath, s_pUpdatePath);
+ static ::rtl::OString s_sRootNode = aProfile.readString(sSection, sRootNode, s_pRootNode);
+ static ::rtl::OString s_sServerType = aProfile.readString(sSection, sServerType, s_pServerType);
+ static ::rtl::OString s_sLocale = aProfile.readString(sSection, sLocale, s_pLocale);
+ static ::rtl::OString s_sServer = aProfile.readString(sSection, sServer, s_pServer);
+ static ::rtl::OString s_sUser = aProfile.readString(sSection, sUser, s_pUser);
+ static ::rtl::OString s_sPassword = aProfile.readString(sSection, sPassword, s_pPassword);
+
+ // do this redirection
+ s_pSourcePath = s_sSourcePath.getStr();
+ s_pUpdatePath = s_sUpdatePath.getStr();
+ s_pRootNode = s_sRootNode.getStr();
+ s_pServerType = s_sServerType.getStr();
+ s_pLocale = s_sLocale.getStr();
+ s_pServer = s_sServer.getStr();
+ s_pUser = s_sUser.getStr();
+ s_pPassword = s_sPassword.getStr();
+ }
+ }
+ catch(std::exception& e)
+ {
+ e.what(); // silence warnings
+ }
+}
+
+// -----------------------------------------------------------------------------
+Sequence<Any> createSequence(const OUString &sUser, const OUString &sPasswd)
+{
+ Sequence< Any > aCPArgs;
+
+ if (sUser.getLength() > 0)
+ {
+ aCPArgs.realloc(1);
+ aCPArgs[0] <<= configmgr::createPropertyValue(ASCII("user"), sUser);
+ }
+ if (sPasswd.getLength() > 0)
+ {
+ aCPArgs.realloc(2);
+ aCPArgs[1] <<= configmgr::createPropertyValue(ASCII("password"), sPasswd);
+ }
+ return aCPArgs;
+}
+
+//=============================================================================
+#include <string.h>
+#if (defined UNX) || (defined OS2)
+#else
+#include <conio.h>
+#endif
+
+// -----------------------------------------------------------------------------
+
+void test_configuration_provider(uno::Reference<lang::XMultiServiceFactory> _xCfgProvider,
+ rtl::OUString const& _sUser, bool _bLocal, sal_Int32 _nCount);
+
+
+// -----------------------------------------------------------------------------
+
+uno::Reference<lang::XMultiServiceFactory>
+getProvider(
+ uno::Reference< lang::XMultiServiceFactory > _xServiceRegistry,
+ rtl::OUString const& _sServerType,
+ rtl::OUString const& _sSharePath, rtl::OUString const& _sUserPath,
+ bool &_bLocal)
+{
+ try
+ {
+ Sequence< Any > aCPArgs;
+
+ OUString sServerType = _sServerType; // enterValue("servertype: ", s_pServerType, false);
+
+ rtl::OUString sUser;
+
+ _bLocal = sServerType.equalsIgnoreAsciiCase(ASCII("local")) || sServerType.equalsIgnoreAsciiCase(ASCII("setup"));
+ if (!_bLocal)
+ {
+ rtl::OUString sServer;
+ sServer = enterValue("server : ", s_pServer,false);
+ cout << endl;
+
+ sUser = enterValue("user : ", s_pUser, false);
+ cout << endl;
+
+ OUString sPasswd = enterValue("password: ", s_pPassword, true);
+ cout << endl;
+
+ aCPArgs = createSequence(sUser, sPasswd);
+
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ aCPArgs[aCPArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("server"), sServer);
+
+ OUString sTimeout = ASCII("10000");
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ aCPArgs[aCPArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("timeout"), sTimeout);
+
+ }
+ else
+ {
+ rtl::OUString sSharePath, sUserPath;
+ sSharePath = _sSharePath;// enterValue("share path: ", s_pSourcePath, false);
+ // cout << endl;
+ sUserPath = _sUserPath; // enterValue("user path : ", s_pUpdatePath, false);
+ // cout << endl;
+
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ sal_Int32 nCount = aCPArgs.getLength() - 1;
+ Any *pAny = &aCPArgs[nCount];
+ *pAny <<= configmgr::createPropertyValue(ASCII("sourcepath"), sSharePath);
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ aCPArgs[aCPArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("updatepath"), sUserPath);
+ }
+
+ aCPArgs.realloc(aCPArgs.getLength() + 1);
+ aCPArgs[aCPArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("servertype"), sServerType);
+
+ Reference< XMultiServiceFactory > xCfgProvider(
+ _xServiceRegistry->createInstanceWithArguments(
+ ::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider"),
+ aCPArgs),
+ UNO_QUERY);
+ if (!xCfgProvider.is())
+ {
+ ::flush(cout);
+ cerr << "Could not create the configuration provider !\n\n";
+ return 0;
+ }
+// -----------------------------------------------------------------------------
+ return xCfgProvider;
+ }
+ catch (Exception& e)
+ {
+ ::flush(cout);
+ cerr << "Caught exception: " << e.Message << endl;
+ }
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+sal_Int32 m_nCount = 0;
+
+void test(uno::Reference<lang::XMultiServiceFactory> _xORB, rtl::OUString const& _sSharePath,
+ rtl::OUString const& _sUserPath)
+{
+
+ rtl::OUString sUser;
+ bool bLocal;
+ cout << ++m_nCount << ". start test with new provider\n";
+ {
+ START_MEMORYMEASURE_FOR( aMemoryInfo, "*** API Test Execution ***" );
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "initialisierungs-check" );
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "- Erzeuge Provider" );
+
+ uno::Reference<lang::XMultiServiceFactory>xCfgProvider =
+ getProvider(_xORB, ASCII("local"), _sSharePath, _sUserPath,
+ bLocal);
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "- Habe Provider, starte Test" );
+
+ test_configuration_provider(xCfgProvider, sUser, bLocal, 0); // xml
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "- Test gelaufen, starte erneut" );
+
+ test_configuration_provider(xCfgProvider, sUser, bLocal, 0); // xml
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "- Test gelaufen, entsorge Provider" );
+
+ uno::Reference<lang::XComponent>xComponent(xCfgProvider,UNO_QUERY);
+ xComponent->dispose();
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "- Provider disposed" );
+
+ LOG_MEMORYMEASURE( "---------------- API Memory Test 2-----------------------------", "- Test memory traces.", aMemoryInfo );
+ }
+
+ cout << "finish provider test\n";
+
+ // Test Version 1 and 3, it MUST be equal
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+static rtl::OUString makeFileURL(OUString const& sMaybeURL)
+{
+ rtl::OUString const fileURLStart(RTL_CONSTASCII_USTRINGPARAM("file:/"));
+
+ if ( 0 != fileURLStart.compareTo(sMaybeURL, fileURLStart.getLength()) )
+ {
+ OUString sURL;
+ if (!osl_getFileURLFromSystemPath(sMaybeURL.pData, &sURL.pData))
+ return sURL;
+ }
+
+ return sMaybeURL;
+}
+// -----------------------------------------------------------------------------
+static rtl::OUString makeSystemPath(OUString const& sMaybeURL)
+{
+ rtl::OUString const fileURLStart(RTL_CONSTASCII_USTRINGPARAM("file:/"));
+
+ if ( 0 == fileURLStart.compareTo(sMaybeURL, fileURLStart.getLength()) )
+ {
+ OUString sSysPath;
+ if (!osl_getSystemPathFromFileURL(sMaybeURL.pData, &sSysPath.pData))
+ return sSysPath;
+ }
+
+ return sMaybeURL;
+}
+// -----------------------------------------------------------------------------
+// ---------------------------------- M A I N ----------------------------------
+// -----------------------------------------------------------------------------
+
+int main( int argc, char * argv[] )
+{
+ TimeValue aTimeout;
+ aTimeout.Seconds = 5;
+ aTimeout.Nanosec = 0;
+
+ sal_Int32 nSizeISubtree = sizeof(ISubtree);
+ sal_Int32 nSizeINode = sizeof(INode);
+ sal_Int32 nSizeIValueNode = sizeof(ValueNode);
+ {
+ loadDefaults();
+
+ Reference< XMultiServiceFactory > xORB = getORB();
+
+ rtl::OUString sSharePath = makeSystemPath(enterValue("share path: ", s_pSourcePath, false));
+ cout << endl;
+ rtl::OUString sUserPath = makeSystemPath(enterValue("user path : ", s_pUpdatePath, false));
+ cout << endl;
+
+ // test(xORB, sSharePath, sUserPath, ASCII("org.openoffice.test"));
+
+ // char* pMem = new char[1000 * 1000 * 10];
+ // showMemoryStatistic();
+
+// test(xORB, sSharePath, sUserPath, ASCII("org.openoffice.Office.Views"));
+
+ START_MEMORYMEASURE_FOR( aMemoryInfo, "*** API Test Main ***" );
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "initialisierungs-check" );
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "starte test !" );
+
+ test(xORB, sSharePath, sUserPath);
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "tests beendet !" );
+
+ // stop the programm clear.
+ Reference< XComponent > xComponent(xORB, UNO_QUERY);
+ xComponent->dispose();
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "ORB disposed." );
+
+ LOG_MEMORYMEASURE( "---------------- API Memory Test-------------------------------", "Outer memory traces.", aMemoryInfo );
+ }
+ return 0;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+void test(Reference< XHierarchicalName >& xAccessName)
+{
+ if (xAccessName.is())
+ {
+ // cout << "Accessing Node: " << xAccessName->getHierarchicalName();
+ }
+ else
+ {
+ // cout << "BUG: XHierarchicalName not available";
+ }
+ // cout << endl;
+}
+void test(Reference< XNamed >& xAccess)
+{
+ if (xAccess.is())
+ {
+ // cout << "Node is named: " << xAccess->getName();
+ }
+ else
+ {
+ // cout << "BUG: XNamed not available";
+ }
+ // cout << endl;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+void fillAllNames(Reference<XNameAccess >& xAccess, Sequence<OUString>& _aSeq)
+{
+ if (xAccess.is())
+ {
+ _aSeq = Sequence <OUString>(xAccess->getElementNames());
+
+ // cout << "Element Names: (" << _aSeq.getLength() << ")";
+ // for (int i = 0; i < _aSeq.getLength(); ++i)
+ // cout << "\n[" << i << "] -\t" << _aSeq[i];
+ //cout << endl;
+ }
+ else
+ {
+ // cout << "BUG: XNameAccess not available";
+ }
+ // cout << endl;
+}
+void write(Reference< XChild >& xChild)
+{
+ if (xChild.is())
+ {
+ // cout << "\n[ P ] -\tParent";
+ }
+ else
+ {
+ // cout << "BUG: Parent not available (no XChild)";
+ }
+ // cout << endl;
+}
+///////////////////////////////////////////////////////////////////////////////////////////
+
+// -----------------------------------------------------------------------------
+Reference< XInterface > readaccess(uno::Reference< lang::XMultiServiceFactory > &xMSF,
+ uno::Reference< uno::XInterface > const& xIface,
+ rtl::OString const& buf,
+ ostream& outStream)
+{
+ Reference< XInterface > xNext;
+ try
+ {
+ Reference< XNameAccess > xAccess(xIface, UNO_QUERY);
+ Reference< XHierarchicalNameAccess > xDeepAccess(xIface, UNO_QUERY);
+ Reference< XExactName > xExactName(xIface, UNO_QUERY);
+
+ if (xAccess.is() || xDeepAccess.is())
+ {
+ OUString aName;
+ OUString aInput = OUString::createFromAscii(buf);
+
+ if (xExactName.is())
+ {
+ ::rtl::OUString sTemp = xExactName->getExactName(aInput);
+ if (sTemp.getLength())
+ aInput = sTemp;
+ }
+
+ if (xAccess.is() && xAccess->hasByName(aInput))
+ {
+ aName = aInput;
+ }
+ else if (xDeepAccess.is() && xDeepAccess->hasByHierarchicalName(aInput))
+ {
+ aName = aInput;
+ }
+ else if ('0' <= buf[0] && buf[0] <= '9' && xAccess.is())
+ {
+ int n = atoi(buf);
+ Sequence<OUString> aNames = xAccess->getElementNames();
+ if (0 <= n && n < aNames.getLength())
+ aName = aNames[n];
+ }
+
+ if (aName.getLength())
+ {
+ bool bNest = aInput.indexOf(sal_Unicode('/')) >= 0;
+
+ Any aElement = bNest ?
+ ( xDeepAccess.is() ?
+ xDeepAccess->getByHierarchicalName(aName) : Any()
+ ) :
+ ( xAccess.is() ?
+ xAccess->getByName(aName) : Any()
+ );
+
+ while (aElement.getValueTypeClass() == TypeClass_ANY)
+ {
+ Any aWrap(aElement);
+ aWrap >>= aElement;
+ }
+ sal_Bool bValue = true;
+ sal_Bool bValueOk = false;
+
+ switch (aElement.getValueTypeClass() )
+ {
+ case TypeClass_INTERFACE:
+ bValue = false;
+ if (aElement >>= xNext)
+ {
+ outStream << "Group: " << aName << endl;
+ }
+ else
+ {
+ outStream << "ERROR: can't get the interface" << endl;
+ }
+ break;
+ case TypeClass_BOOLEAN:
+ {
+ sal_Bool* pVal = (sal_Bool*)aElement.getValue();
+ bValueOk = (pVal != 0);
+
+ outStream << "VALUE '" << aName << "' is a BOOLEAN = ";
+ if (!bValueOk)
+ outStream << "NULL (error!!)";
+ else if (*pVal)
+ outStream << "'TRUE'";
+ else
+ outStream << "'FALSE'";
+
+ outStream << endl;
+
+ // tryToChange(xAccess, aName, pVal);
+ break;
+ }
+ case TypeClass_SHORT:
+ {
+ sal_Int16 aValue;
+ outStream << "VALUE '" << aName << "' is a SHORT (16 bit) = ";
+ if (bValueOk = (aElement >>= aValue))
+ {
+ outStream << aValue;
+ // tryToChange(xAccess, aName, aValue);
+ }
+ else
+ {
+ outStream << "ERROR RETRIEVING VALUE";
+ }
+ outStream << endl;
+
+ break;
+ }
+ case TypeClass_LONG:
+ {
+
+ sal_Int32 aValue;
+ outStream << "VALUE '" << aName << "' is a INT (32 bit) = ";
+ if (bValueOk = (aElement >>= aValue))
+ {
+ outStream << aValue;
+ // tryToChange(xAccess, aName, aValue);
+ }
+ else
+ {
+ outStream << "ERROR RETRIEVING VALUE";
+ }
+ outStream << endl;
+ break;
+ }
+ case TypeClass_HYPER:
+ {
+ sal_Int64 aValue;
+ outStream << "VALUE '" << aName << "' is a LONG (64 bit) = ";
+ if (bValueOk = (aElement >>= aValue))
+ {
+ outStream << double(aValue);
+ // tryToChange(xAccess, aName, aValue);
+ }
+ else
+ {
+ outStream << "ERROR RETRIEVING VALUE";
+ }
+ outStream << endl;
+ break;
+ }
+ case TypeClass_DOUBLE:
+ {
+ double aValue;
+ outStream << "VALUE '" << aName << "' is a DOUBLE = ";
+ if (bValueOk = (aElement >>= aValue))
+ {
+ outStream << aValue;
+ }
+ else
+ {
+ outStream << "ERROR RETRIEVING VALUE";
+ }
+ outStream << endl;
+ break;
+ }
+ case TypeClass_STRING:
+ {
+ OUString aValue;
+ outStream << "VALUE '" << aName << "' is a STRING = ";
+ if (bValueOk = (aElement >>= aValue))
+ {
+ outStream << "\"" << aValue << "\"";
+ // tryToChange(xAccess, aName, aValue);
+ }
+ else
+ {
+ outStream << "ERROR RETRIEVING VALUE";
+ }
+ outStream << endl;
+ break;
+ }
+ case TypeClass_SEQUENCE:
+ {
+ outStream << "VALUE '" << aName << "' is a SEQUENCE or BINARY" << endl;
+
+ Type aTypeS = configmgr::getSequenceElementType(aElement.getValueType());
+ OUString sType = configmgr::toTypeName(aTypeS.getTypeClass());
+ outStream << "UNO type is " << aElement.getValueType().getTypeName() << endl;
+ outStream << "Real type is Sequence<" << sType << ">" << endl;
+ // outSequence(aElement, aTypeS, outStream);
+ bValueOk = true;
+ break;
+ }
+ case TypeClass_VOID:
+ outStream << "ELEMENT '" << aName << "' is NULL and VOID " << endl;
+ bValueOk = true;
+ break;
+ default:
+ outStream << "Error: ELEMENT '" << aName << "' is of unknown or unrecognized type" << endl;
+ break;
+ }
+
+ }
+ else
+ {
+ outStream << "Error: No element \"" << aInput << "\" found." <<endl;
+ }
+ }
+ }
+ catch (Exception& e)
+ {
+ outStream << "An Exception occurred: " << e.Message << endl;
+ }
+ catch (...)
+ {
+ outStream << "An UNKNOWN Exception occurred !" << endl;
+ }
+
+ return xNext;
+}
+
+
+
+
+// -----------------------------------------------------------------------------
+void test_read_access( uno::Reference< lang::XMultiServiceFactory > &xMSF,
+ uno::Reference< uno::XInterface >& xIface,
+ ofstream & out)
+{
+ Sequence<OUString> aAllNames;
+
+ using com::sun::star::uno::UNO_QUERY;
+
+ // cout << "\n\n---------------------------------------------------------------" << endl;
+ Reference< XNameAccess > xAccess(xIface, UNO_QUERY);
+ Reference< XChild > xChild(xIface, UNO_QUERY);
+ Reference< XHierarchicalName > xAccessPath(xIface,UNO_QUERY);
+ Reference< XNamed > xAccessName(xIface,UNO_QUERY);
+// Reference< XHierarchicalNameAccess >& xAccess(xIface, UNO_QUERY);
+
+ test(xAccessPath);
+ test(xAccessName);
+ fillAllNames(xAccess, aAllNames);
+ write(xChild);
+
+ for (sal_Int32 i=0;i<aAllNames.getLength();i++)
+ {
+ OString aValue;
+ aValue <<= aAllNames[i];
+ uno::Reference<uno::XInterface> xFace = readaccess(xMSF, xIface, aValue, out);
+ if (xFace.is())
+ {
+ test_read_access(xMSF, xFace, out);
+ }
+ }
+}
+
+// -----------------------------------------------------------------------------
+void test_read_access( uno::Reference< lang::XMultiServiceFactory > &xMSF,
+ uno::Reference< uno::XInterface >& xIface,
+ rtl::OString aFilename)
+{
+ ofstream out(aFilename.getStr());
+ test_read_access(xMSF, xIface, out);
+}
+
+// -----------------------------------------------------------------------------
+void test_configuration_provider(uno::Reference<lang::XMultiServiceFactory> _xCfgProvider,
+ rtl::OUString const& _sUser, bool _bLocal,
+ sal_Int32 _nCount)
+{
+ START_MEMORYMEASURE_FOR( aMemoryInfo, "*** Configuration Provider Loop Test ***" );
+ START_MEMORYMEASURE_FOR( aInnerMemoryInfo, "*** Configuration Provider Module Details ***" );
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "initialisierungs-check" );
+ MAKE_MEMORY_SNAPSHOT( aInnerMemoryInfo, "initialisierungs-check" );
+
+ std::vector< Reference< XInterface > > aLoadedModules;
+ aLoadedModules.reserve(configtest::s_nTestModules);
+
+ Sequence< Any > aArgs;
+ aArgs = createSequence(_sUser, ASCII(""));
+
+ if (!_bLocal)
+ {
+ OUString sLocale = enterValue("locale : ", s_pLocale, false);
+ cout << endl;
+ aArgs.realloc(aArgs.getLength() + 1);
+ aArgs[aArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("locale"), sLocale);
+ }
+
+#if 0
+ sal_Bool bLazyWrite = true;
+ aArgs.realloc(aArgs.getLength() + 1);
+ aArgs[aArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("lazywrite"), bLazyWrite);
+#else
+ sal_Bool bNoCache = true;
+ aArgs.realloc(aArgs.getLength() + 1);
+ aArgs[aArgs.getLength() - 1] <<= configmgr::createPropertyValue(ASCII("nocache"), bNoCache);
+#endif
+
+ sal_Int32 nPathIdx = aArgs.getLength();
+ aArgs.realloc(nPathIdx + 1);
+
+ const OString sInnerInfoText("- - - Loading module: ");
+ MAKE_MEMORY_SNAPSHOT( aInnerMemoryInfo, "- - - Before Loading Modules" );
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "- - Prepared Arguments - Lade Module" );
+
+ for (char const * const * ppTestModule = configtest::s_aTestModules; *ppTestModule; ++ppTestModule)
+ {
+ OUString sPath = OUString::createFromAscii(*ppTestModule);
+ cout << "\t" << ++_nCount << ". test with node: " << sPath << endl;
+
+ aArgs[nPathIdx] <<= configmgr::createPropertyValue(ASCII("nodepath"), sPath);
+
+ MAKE_MEMORY_SNAPSHOT( aInnerMemoryInfo, sInnerInfoText.concat(*ppTestModule) );
+ Reference< XInterface > xIFace = _xCfgProvider->createInstanceWithArguments(
+ /* OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"), */
+ OUString::createFromAscii("com.sun.star.configuration.ConfigurationAccess"),
+ aArgs);
+ // cout << "---------------------------------------------------------------\n Configuration Read/Write Access created !\n---------------------------------------------------------------" << endl;
+
+ aLoadedModules.push_back(xIFace);
+ /*
+ xChangesBatch = Reference< XChangesBatch >(xIFace, UNO_QUERY);
+
+ Sequence<OUString> aSeq = _xCfgProvider->getAvailableServiceNames();
+
+ OString sPath;
+ sPath <<= _sPath;
+
+ OString aFilename = "c:\\temp\\fileout_";
+ aFilename += sPath;
+ aFilename += OString::valueOf(_nCount);
+ aFilename += ".txt";
+ test_read_access(_xCfgProvider, xIFace, aFilename);
+ */
+ }
+ MAKE_MEMORY_SNAPSHOT( aInnerMemoryInfo, "- - - Done Loading modules" );
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "- - Alle Module geladen" );
+
+ aLoadedModules.clear();
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "- - Module released" );
+
+ LOG_MEMORYMEASURE( "---------------- API Memory Test 3 -----------------------------", "- - Provider memory traces.", aMemoryInfo );
+ LOG_MEMORYMEASURE( "---------------- API Memory Test 4 -----------------------------", "- - - Module memory traces.", aInnerMemoryInfo );
+
+}
+
+
+// -----------------------------------------------------------------------------
+// ----------------------------------- Main 2 -----------------------------------
+// -----------------------------------------------------------------------------
+
+int requestTest( int argc, char * argv[] )
+{
+ TimeValue aTimeout;
+ aTimeout.Seconds = 5;
+ aTimeout.Nanosec = 0;
+
+ sal_Int32 nSizeISubtree = sizeof(ISubtree);
+ sal_Int32 nSizeINode = sizeof(INode);
+ sal_Int32 nSizeIValueNode = sizeof(ValueNode);
+ {
+ loadDefaults();
+
+ Reference< XMultiServiceFactory > xORB = getORB();
+
+ rtl::OUString sSharePath = makeFileURL(enterValue("share path: ", s_pSourcePath, false));
+ cout << endl;
+ rtl::OUString sUserPath = makeFileURL(enterValue("user path : ", s_pUpdatePath, false));
+ cout << endl;
+
+ START_MEMORYMEASURE_FOR( aMemoryInfo, "*** Request Tree Test ***" );
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "initialisierungs-check" );
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "create tree manager" );
+
+ OTreeLoad aTreeLoad(xORB, sSharePath, sUserPath);
+ sal_Int32 nIdx = 0;
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "created tree manager" );
+
+ OString const sInnerInfoText("- Loading module: ");
+
+ START_MEMORYMEASURE_FOR( aInnerMemoryInfo, "*** Request Tree Test Details ***" );
+ MAKE_MEMORY_SNAPSHOT( aInnerMemoryInfo, "initialisierungs-check" );
+
+ MAKE_MEMORY_SNAPSHOT( aInnerMemoryInfo, "- before loading modules" );
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "request subtrees" );
+
+ for (char const * const * ppRequestModule = configtest::s_aTestModules; *ppRequestModule; ++ppRequestModule)
+ {
+ MAKE_MEMORY_SNAPSHOT( aInnerMemoryInfo, sInnerInfoText.concat(*ppRequestModule) );
+ aTreeLoad.requestSubtree( OUString::createFromAscii(*ppRequestModule));
+ }
+
+ MAKE_MEMORY_SNAPSHOT( aInnerMemoryInfo, "- loaded all modules" );
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "release subtrees" );
+
+ for (char const * const * ppReleaseModule = configtest::s_aTestModules; *ppReleaseModule; ++ppReleaseModule)
+ aTreeLoad.releaseSubtree( OUString::createFromAscii(*ppReleaseModule));
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "ich habe fertig." );
+ LOG_MEMORYMEASURE( "---------------- Request Memory Test ---------------------------", "Direct Cache Access memory traces.", aMemoryInfo );
+ LOG_MEMORYMEASURE( "---------------- Request Memory Detail -------------------------", "Module request memory traces.", aInnerMemoryInfo );
+ }
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+// --------------------------------- Trust Test ---------------------------------
+// -----------------------------------------------------------------------------
+
+int trust( int argc, char * argv[] )
+{
+ Reference< XMultiServiceFactory > xORB = getORB();
+
+ std::vector<char*> aMemHolder;
+ aMemHolder.reserve(1024);
+
+ START_MEMORYMEASURE_FOR( aMemoryInfo, "Allocator check" );
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "initialisierungs-check" );
+
+ sal_Int32 const total_alloc = 8 * 1024 * 1024;
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "get 8 MB" );
+
+ char* pChar = new char[total_alloc];
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "free 8 MB" );
+
+ delete [] pChar;
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "deleted 8 MB" );
+
+ sal_Int32 const chunk = 8 * 1024;
+ sal_Int32 const alloc_count = total_alloc/chunk;
+
+ sal_Int32 const msg_count = 16;
+ sal_Int32 const loop_count = alloc_count/msg_count;
+ sal_Int32 const loop_allocation = loop_count * chunk;
+
+ OString const sPieces = OString::valueOf(alloc_count).concat(" pieces");
+ OString const sInnerMessage = OString("Allocating ").concat(OString::valueOf(loop_count))
+ .concat(" chunks [").concat(OString::valueOf(loop_allocation)).concat(" Bytes].");
+
+ START_MEMORYMEASURE( aInnerMemoryInfo );
+ MAKE_MEMORY_SNAPSHOT( aInnerMemoryInfo, "initialisierungs-check" );
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, OString("get 8 MB as ").concat(sPieces) );
+
+ for (sal_Int32 i=0;i<alloc_count/loop_count;i++)
+ {
+ MAKE_MEMORY_SNAPSHOT( aInnerMemoryInfo, sInnerMessage );
+ for (sal_Int32 j=0;j<loop_count;j++)
+ {
+
+ pChar = new char[8 * 1024];
+ aMemHolder.push_back(pChar);
+ }
+ }
+ MAKE_MEMORY_SNAPSHOT( aInnerMemoryInfo, "last allocation done" );
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "free pieces" );
+
+ pChar = NULL;
+ for (std::vector<char*>::iterator it = aMemHolder.begin();
+ it != aMemHolder.end();
+ it++)
+ {
+ pChar = *it;
+ delete []pChar;
+ }
+ aMemHolder.clear();
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, OString("get another 8 MB as ").concat(sPieces) );
+
+
+ for (sal_Int32 j=0;j<alloc_count;j++)
+ {
+ pChar = new char[8 * 1024];
+ aMemHolder.push_back(pChar);
+ }
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "free second set of pieces" );
+
+ pChar = NULL;
+ for (std::vector<char*>::iterator jt = aMemHolder.begin();
+ jt != aMemHolder.end();
+ jt++)
+ {
+ pChar = *jt;
+ delete []pChar;
+ }
+ aMemHolder.clear();
+
+ MAKE_MEMORY_SNAPSHOT( aMemoryInfo, "ich habe fertig." );
+ LOG_MEMORYMEASURE( "---------------- Trust Memory Test ----------------------------", "Cross-checked memory traces.", aMemoryInfo );
+ LOG_MEMORYMEASURE( "---------------- Small Allocation Loop ------------------------", "Allocation Loop Detail memory traces.", aInnerMemoryInfo );
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+static uno::Reference< lang::XMultiServiceFactory > g_xORB;
+static void createORB(char const* pRegistry)
+{
+ if (!g_xORB.is())
+ try
+ {
+ rtl::OUString const sServiceRegistry = OUString::createFromAscii(pRegistry);
+
+ g_xORB = createRegistryServiceFactory( sServiceRegistry, ::rtl::OUString() );
+
+ }
+ catch (uno::Exception &e)
+ {
+ cerr << "Exception creating the service factory: " << e.Message << "\n";
+ }
+ else
+ cerr << "Trying to recreate the service factory\n";
+
+ if (!g_xORB.is())
+ {
+ ::flush(cout);
+ cerr << "Could not create the service factory '" << pRegistry << "' !\n";
+ exit(-2);
+ }
+}
+uno::Reference< lang::XMultiServiceFactory > getORB()
+{
+ if (!g_xORB.is())
+ {
+ createORB( "applicat.rdb" );
+ }
+ return g_xORB;
+}
+// -----------------------------------------------------------------------------
+
+
+} // namespace configmgr
+// -----------------------------------------------------------------------------
+void usage()
+{
+ cerr << "Wrong or missing parameters.\nUsage:\n"
+ "\tmemorytest [-r <registry.rdb>] (all | trust | request | api)+ [clear] [(+<module>|-<module>)+]\n";
+
+ exit(-1);
+}
+
+// -----------------------------------------------------------------------------
+// ------------------------------------ Main ------------------------------------
+// -----------------------------------------------------------------------------
+#if (defined UNX) || (defined OS2)
+int main( int argc, char * argv[] )
+#else
+int _cdecl main( int argc, char * argv[] )
+#endif
+{
+ if (argc > 1 && !::rtl_str_compare(argv[1], "-r" ) )
+ {
+ if (!argv[2]) usage();
+
+ configmgr::createORB(argv[2]);
+
+ argv += 2;
+ argc -= 2;
+ }
+ configmgr::getORB(); // ensures there is one
+
+ enum TestSelect { TEST_TRUST = 01, TEST_REQUEST = 02, TEST_API = 04, TEST_ALL = 07 };
+
+ unsigned nSelect = 0;
+ while (argc >= 1 && argv[1] != NULL)
+ {
+ if ( !::rtl_str_compareIgnoreAsciiCase(argv[1], "trust" ) ) nSelect |= TEST_TRUST;
+ else if ( !::rtl_str_compareIgnoreAsciiCase(argv[1], "request") ) nSelect |= TEST_REQUEST;
+ else if ( !::rtl_str_compareIgnoreAsciiCase(argv[1], "api" ) ) nSelect |= TEST_API;
+ else if ( !::rtl_str_compareIgnoreAsciiCase(argv[1], "all" ) ) nSelect |= TEST_ALL;
+ else break;
+
+ // here we found a known selector, so look on
+ ++argv;
+ --argc;
+ }
+
+ if (nSelect == 0) usage();
+
+//--------------------
+#define DO_TEST( test, func ) \
+ if (nSelect & TEST_##test) \
+ { \
+ char const * const test_name = #test; \
+ if (int nRet = func(argc, argv)) \
+ cerr << "Test: " << test_name << " returned with error code " << nRet << endl; \
+ else \
+ cerr << "Test: " << test_name << " finished without error !\n" ; \
+ } else // to allow a semicolon
+//--------------------
+
+ DO_TEST( TRUST , configmgr::trust );
+ DO_TEST( REQUEST , configmgr::requestTest );
+ DO_TEST( API , configmgr::main );
+
+ return 0;
+}
+
diff --git a/configmgr/workben/memory/testmodules.cxx b/configmgr/workben/memory/testmodules.cxx
new file mode 100644
index 000000000000..c914cc54bc3a
--- /dev/null
+++ b/configmgr/workben/memory/testmodules.cxx
@@ -0,0 +1,87 @@
+/*************************************************************************
+ *
+ * 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: testmodules.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_configmgr.hxx"
+
+#include "testmodules.hxx"
+
+
+namespace configtest
+{
+ #if 0 // more modules
+ +"org.openoffice.Office.Common",
+ +"org.openoffice.Office.Linguistic",
+ x"org.openoffice.Office.TypeDetection",
+ x"org.openoffice.Setup",
+ -"org.openoffice.UserProfile",
+ +"org.openoffice.Inet",
+ -"org.openoffice.Office.Calc",
+ -"org.openoffice.Office.Chart",
+ -"org.openoffice.Office.DataAccess",
+ -"org.openoffice.Office.Draw",
+ -"org.openoffice.Office.Impress",
+ -"org.openoffice.Office.Java",
+ -"org.openoffice.Office.Labels",
+ -"org.openoffice.Office.Math",
+ +"org.openoffice.Office.Views",
+ +"org.openoffice.Office.Writer",
+ +"org.openoffice.Office.WriterWeb",
+ +"org.openoffice.ucb.Configuration",
+ -"org.openoffice.ucb.Hierarchy",
+ x"org.openoffice.ucb.Store",
+ #endif
+
+ char const * const s_aTestModules[] =
+ {
+ "org.openoffice.Office.Common",
+ "org.openoffice.Setup/CJK/Enable",
+ "org.openoffice.Setup/Office/Modules",
+ "org.openoffice.Inet",
+ "org.openoffice.Office.Views",
+ "org.openoffice.Setup/Product",
+ "org.openoffice.ucb.Configuration",
+ "org.openoffice.ucb.Store/ContentProperties",
+ "org.openoffice.Office.TypeDetection",
+ "org.openoffice.Office.Writer",
+ "org.openoffice.Office.WriterWeb",
+ "org.openoffice.Office.Linguistic",
+ NULL // end marker
+ };
+ unsigned int const s_nTestModules = sizeof s_aTestModules/sizeof 0[s_aTestModules];
+
+ std::vector<char const *> listTestModules(int argc, char* argv[])
+ {
+ std::vector<char const *> aModuleList( s_aTestModules, s_aTestModules + s_nTestModules);
+ return aModuleList;
+ }
+}
+
+
diff --git a/configmgr/workben/memory/testmodules.hxx b/configmgr/workben/memory/testmodules.hxx
new file mode 100644
index 000000000000..ed76bb894340
--- /dev/null
+++ b/configmgr/workben/memory/testmodules.hxx
@@ -0,0 +1,41 @@
+/*************************************************************************
+ *
+ * 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: testmodules.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.
+ *
+ ************************************************************************/
+
+#ifndef CONFIGMGR_WORKBEN_TESTMODULES_
+#include <vector>
+
+namespace configtest
+{
+ extern char const * const s_aTestModules[];
+ extern unsigned int const s_nTestModules;
+ extern std::vector<char const *> listTestModules(int argc, char* argv[]);
+}
+#endif // CONFIGMGR_WORKBEN_TESTMODULES_
+
diff --git a/configmgr/workben/memory/treeload.cxx b/configmgr/workben/memory/treeload.cxx
new file mode 100644
index 000000000000..f1f578c3efae
--- /dev/null
+++ b/configmgr/workben/memory/treeload.cxx
@@ -0,0 +1,84 @@
+/*************************************************************************
+ *
+ * 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: treeload.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_configmgr.hxx"
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <localsession.hxx>
+#include <treecache.hxx>
+#include <options.hxx>
+#include <rtl/ustring.hxx>
+#include "treeload.hxx"
+
+// -----------------------------------------------------------------------------
+namespace configmgr
+{
+ namespace uno = ::com::sun::star::uno;
+ namespace lang = ::com::sun::star::lang;
+
+#define ASCII(x) ::rtl::OUString::createFromAscii(x)
+
+// -----------------------------------------------------------------------------
+// ------------------------- requestSubtree without API -------------------------
+// -----------------------------------------------------------------------------
+
+ OTreeLoad::OTreeLoad(uno::Reference<lang::XMultiServiceFactory> const& _xServiceProvider,
+ rtl::OUString const& _sSourceDirectory, rtl::OUString const& _sUpdateDirectory) throw (uno::Exception)
+ :m_xServiceProvider(_xServiceProvider)
+{
+ // Create a TypeConverter
+ uno::Reference<script::XTypeConverter> xConverter;
+ xConverter = xConverter.query(m_xServiceProvider->createInstance(ASCII( "com.sun.star.script.Converter" )) );
+
+ m_xDefaultOptions = new OOptions(xConverter);
+ m_xDefaultOptions->setNoCache(true);
+
+ // create it .. and connect
+ std::auto_ptr<LocalSession> pLocal( new LocalSession(m_xServiceProvider) );
+ sal_Bool bOpen = pLocal->open(_sSourceDirectory, _sUpdateDirectory);
+
+ IConfigSession* pConfigSession = pLocal.release();
+
+ m_pTreeMgr = new TreeManager(pConfigSession, m_xDefaultOptions);
+}
+// -----------------------------------------------------------------------------
+ISubtree* OTreeLoad::requestSubtree( OUString const& aSubtreePath) throw (uno::Exception)
+{
+ return m_pTreeMgr->requestSubtree(aSubtreePath, m_xDefaultOptions, /* MinLevel */ -1);
+}
+// -----------------------------------------------------------------------------
+void OTreeLoad::releaseSubtree( OUString const& aSubtreePath) throw (uno::Exception)
+{
+ m_pTreeMgr->releaseSubtree(aSubtreePath, m_xDefaultOptions);
+}
+
+// -----------------------------------------------------------------------------
+} // namespace
diff --git a/configmgr/workben/memory/treeload.hxx b/configmgr/workben/memory/treeload.hxx
new file mode 100644
index 000000000000..088c5d24d4cc
--- /dev/null
+++ b/configmgr/workben/memory/treeload.hxx
@@ -0,0 +1,41 @@
+#ifndef CONFIGMGR_TREELOAD_HXX
+#define CONFIGMGR_TREELOAD_HXX
+
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+
+#ifndef _CONFIGMGR_LOCAL_LOCAL_HXX_
+#include <localsession.hxx>
+#endif
+
+#ifndef _CONFIGMGR_TREECACHE_HXX_
+#include <treecache.hxx>
+#endif
+#include <options.hxx>
+#include <rtl/ustring.hxx>
+
+// -----------------------------------------------------------------------------
+namespace configmgr
+{
+ namespace uno = ::com::sun::star::uno;
+ namespace lang = ::com::sun::star::lang;
+
+// -----------------------------------------------------------------------------
+class OTreeLoad
+{
+ // LocalSession* m_pLocalSession; // in TreeMgr
+ TreeManager* m_pTreeMgr;
+ ::vos::ORef<OOptions> m_xDefaultOptions;
+ uno::Reference<lang::XMultiServiceFactory> m_xServiceProvider;
+
+public:
+
+ OTreeLoad(uno::Reference<lang::XMultiServiceFactory> const& _xServiceProvider,
+ rtl::OUString const& _sSourceDirectory, rtl::OUString const& _sUpdateDirectory);
+
+ ISubtree* requestSubtree(rtl::OUString const& aSubtreePath);
+ void releaseSubtree(rtl::OUString const& aSubtreePath);
+};
+
+} // namespace
+
+#endif