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