summaryrefslogtreecommitdiff
path: root/configmgr/workben/apitest
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/workben/apitest')
-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
8 files changed, 3449 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"
+