diff options
Diffstat (limited to 'configmgr/workben/apitest')
-rw-r--r-- | configmgr/workben/apitest/cfgadduser.cxx | 358 | ||||
-rw-r--r-- | configmgr/workben/apitest/cfgadmin.cxx | 520 | ||||
-rw-r--r-- | configmgr/workben/apitest/cfgapi.cxx | 868 | ||||
-rw-r--r-- | configmgr/workben/apitest/cfgapi_timetest.cxx | 960 | ||||
-rw-r--r-- | configmgr/workben/apitest/cfgregistry.cxx | 172 | ||||
-rw-r--r-- | configmgr/workben/apitest/cfgupdate.cxx | 435 | ||||
-rw-r--r-- | configmgr/workben/apitest/makefile.mk | 128 | ||||
-rw-r--r-- | configmgr/workben/apitest/sregistry | 8 |
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" + |