From 7edc63de737cd40f070b35ea70e8ef7229e241d3 Mon Sep 17 00:00:00 2001 From: Oliver Bolte Date: Thu, 18 Nov 2004 07:52:26 +0000 Subject: [PATCH] INTEGRATION: CWS nativefixer1 (1.1.2); FILE ADDED 2004/11/09 12:02:11 obr 1.1.2.2: #i35939# do not convert second parameter to file url and return 0 on success 2004/11/09 10:50:25 jsc 1.1.2.1: #i35939# new helper tool for registering components --- cpputools/source/regcomplazy/regcomplazy.cxx | 388 +++++++++++++++++++ 1 file changed, 388 insertions(+) create mode 100755 cpputools/source/regcomplazy/regcomplazy.cxx diff --git a/cpputools/source/regcomplazy/regcomplazy.cxx b/cpputools/source/regcomplazy/regcomplazy.cxx new file mode 100755 index 000000000000..aff886431853 --- /dev/null +++ b/cpputools/source/regcomplazy/regcomplazy.cxx @@ -0,0 +1,388 @@ +/************************************************************************* + * + * $RCSfile: regcomplazy.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: obo $ $Date: 2004-11-18 08:52:26 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include + +#include "sal/main.h" +#include +#include +#include +#include +#include + +#include +#include + +#include + + +#define OUSTR(x) ::rtl::OUString::createFromAscii( x ) +#define OSToOUS(x) ::rtl::OStringToOUString(x, osl_getThreadTextEncoding()) +#define OUSToOS(x) ::rtl::OUStringToOString(x, osl_getThreadTextEncoding()) +using namespace ::rtl; + +typedef ::std::vector< ::rtl::OString > OSVector; + +typedef ::std::pair< ::rtl::OString, OSVector > DataPair; + +typedef ::std::vector< DataPair > DataVector; + +struct CompDescriptor { + OString sImplementationName; + OString sComponentName; + OString sLoaderName; + OSVector vSupportedServices; + DataVector vData; +}; + +typedef ::std::vector< CompDescriptor > CDescrVector; + +static void print_options() SAL_THROW( () ) +{ + printf( + "\nusage: regcomplazy [-v]registry_file cmp_descr_file ...\n\n" + "Register a cmponent using a comp description file.\n" + "Option -v prints verbose output on stdout.\n" ); +} + +static bool checkImplValue(RegistryValueList* pValueList, OString sImplName) { + int i = 0; + for (i=0; i < pValueList->getLength(); i++) { + if (sImplName.equals(pValueList->getElement(i))) + return true; + } + + return false; +} + +//================================================================================================== +SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) +{ + if (argc < 3) + { + print_options(); + return 1; + } + + bool bVerbose = false; + int nPos = 1; + if ('-' == argv[ nPos ][ 0 ] && 'v' == argv[ nPos ][ 1 ]) + { + if ('\0' != argv[ nPos ][ 2 ]) + { + print_options(); + return 1; + } + bVerbose = true; + ++nPos; + } + + OUString sys_path( OUSTR( argv[ nPos ] ) ); + OUString reg_url; + oslFileError rc = osl_getFileURLFromSystemPath( sys_path.pData, ®_url.pData ); + if (osl_File_E_None != rc) + { + if (bVerbose) + fprintf( stderr, "\nERROR: cannot make file url out of %s\n", argv[nPos]); + return 1; + } + + FILE* fDescr = fopen(argv[ ++nPos ], "r"); + OStringBuffer sBuffer(512); + + if ( fDescr) { + size_t totalSize = 0; + size_t readSize = 0; + char pBuffer[513]; + + while ( !feof(fDescr) ) + { + if ( (readSize = fread(pBuffer, 1, 512, fDescr)) > 0 + && !ferror(fDescr) ) { + totalSize += readSize; + if (totalSize >= 512) + sBuffer.ensureCapacity(totalSize * 2); + + sBuffer.append(pBuffer, readSize); + } + } + } + + OString sDescr = sBuffer.makeStringAndClear(); + sal_Int32 nTokenIndex = 0; + sal_Int32 nIndex = 0; + + CDescrVector vDescr; + CompDescriptor descr; + bool bFirst = true; + + do { + OString sTmp = sDescr.getToken(0, '\x0A', nTokenIndex); + OString sToken(sTmp); + if (sTmp.pData->buffer[sTmp.getLength()-1] == '\x0D') + sToken = sTmp.copy(0, sTmp.getLength()-1); + + if (nIndex = sToken.indexOf("[Data]") >= 0) { + do { + OString sTmp = sDescr.getToken(0, '\x0A', nTokenIndex); + OString sToken(sTmp); + if (sTmp.pData->buffer[sTmp.getLength()-1] == '\x0D') + sToken = sTmp.copy(0, sTmp.getLength()-1); + + if ((sToken.getLength() > 0) && (sToken.pData->buffer[0] != '[')) { + OString dataKey(sToken.copy(0, sToken.indexOf('='))); + OString sValues(sToken.copy(sToken.indexOf('=')+1)); + sal_Int32 nVIndex = 0; + OSVector vValues; + do { + OString sValue = sValues.getToken(0, ';', nVIndex); + vValues.push_back(sValue); + } while (nVIndex >= 0 ); + descr.vData.push_back(DataPair(dataKey, vValues)); + } else + break; + } while (nTokenIndex >= 0 ); + } + if ( nIndex = sToken.indexOf("[ComponentDescriptor]") >= 0) { + if (bFirst) + bFirst = false; + else + vDescr.push_back(descr); + + descr = CompDescriptor(); + } + else if ( nIndex = sToken.indexOf("ImplementationName=") >= 0) { + descr.sImplementationName = sToken.copy(19); + } + else if ( nIndex = sToken.indexOf("ComponentName=") >= 0) { + descr.sComponentName = sToken.copy(14); + } + else if ( nIndex = sToken.indexOf("LoaderName=") >= 0) { + descr.sLoaderName = sToken.copy(11); + } + else if ( (nIndex = sToken.indexOf("[SupportedServices]") < 0) && + (sToken.getLength() > 0) && + (sToken.pData->buffer[0] != '[') ) { + descr.vSupportedServices.push_back(sToken); + } + } while (nTokenIndex >= 0 ); + // insert the last descriptor + vDescr.push_back(descr); + + RegistryLoader* pLoader = new RegistryLoader(); + if (!pLoader->isLoaded()) + { + delete pLoader; + return 1; + } + + Registry *pReg = new Registry(*pLoader); + delete pLoader; + + RegistryKey rootKey, key, subKey, serviceKey; + + if (pReg->open(reg_url, REG_READWRITE)) + { + if (pReg->create(reg_url)) + { + if (bVerbose) + fprintf(stderr, "ERROR: open registry \"%s\" failed\n", argv[1]); + return 1; + } + } + if (pReg->openRootKey(rootKey)) { + if (bVerbose) + fprintf(stderr, "ERROR: open root key failed\n"); + return 1; + } + + CDescrVector::const_iterator comp_iter = vDescr.begin(); + do { + OString sImplName = (*comp_iter).sImplementationName; + OUStringBuffer sbImpl; + sbImpl.appendAscii("/IMPLEMENTATIONS/"); + sbImpl.append(OSToOUS(sImplName)); + OUString sImplKeyName = sbImpl.makeStringAndClear(); + + if (rootKey.openKey(sImplKeyName, key) == REG_NO_ERROR) { + if (bVerbose) { + fprintf(stderr, "WARNING: implementation entry for \"%s\" already exists, existing entries are overwritten\n", sImplName.getStr()); + } + } else { + if (rootKey.createKey(sImplKeyName, key)) { + if (bVerbose) { + fprintf(stderr, "ERROR: can't create new implementation entry \"%s\".\n", sImplName.getStr()); + } + return 1; + } + } + + OString sLoaderName = (*comp_iter).sLoaderName; + OUString usKeyName(OUSTR("UNO/ACTIVATOR")); + key.createKey(usKeyName, subKey); + subKey.setValue(OUString(), RG_VALUETYPE_STRING, + (sal_Char*)sLoaderName.getStr(), sLoaderName.getLength()+1); + + OString sCompName = (*comp_iter).sComponentName; + usKeyName = OUSTR("UNO/LOCATION"); + key.createKey(usKeyName, subKey); + subKey.setValue(OUString(), RG_VALUETYPE_STRING, + (sal_Char*)sCompName.getStr(), sCompName.getLength()+1); + + if ((*comp_iter).vData.size() > 0) { + usKeyName = OUSTR("DATA"); + RegistryKey dataKey, valueKey; + key.createKey(usKeyName, dataKey); + + DataVector::const_iterator data_iter = ((*comp_iter).vData).begin(); + do { + OUString sDataKey(OSToOUS((*data_iter).first)); + dataKey.createKey(sDataKey, valueKey); + + OSVector::const_iterator value_iter = ((*data_iter).second).begin(); + int vlen = (*data_iter).second.size(); + sal_Char** pValueList = (sal_Char**)rtl_allocateZeroMemory( + vlen * sizeof(sal_Char*)); + int i = 0; + do { + pValueList[i] = (sal_Char*)rtl_allocateZeroMemory( + (*value_iter).getLength()+1 * sizeof(sal_Char)); + rtl_copyMemory(pValueList[i], (sal_Char*)(*value_iter).getStr(), + (*value_iter).getLength()+1); + i++; + value_iter++; + } while (value_iter != (*data_iter).second.end()); + + valueKey.setStringListValue(OUString(), pValueList, vlen); + + // free memory + for (i=0; i valueList; + serviceKey.getStringListValue(usServiceKeyName, valueList); + if ( checkImplValue(&valueList, sImplName) ) { + serv_iter++; + continue; + } + + sal_Int32 nServices = valueList.getLength()+1; + sal_Char** pImplList = (sal_Char**)rtl_allocateZeroMemory( + nServices * sizeof(sal_Char*)); + pImplList[0] = (sal_Char*)rtl_allocateZeroMemory( + sImplName.getLength()+1 * sizeof(sal_Char)); + rtl_copyMemory(pImplList[0], (sal_Char*)sImplName.getStr(), + sImplName.getLength()+1); + int i = 0; + for (i=0; i < valueList.getLength(); i++) { + pImplList[i+1]=valueList.getElement(i); + } + key.setStringListValue(OUString(), pImplList, nServices); + + // free memory + rtl_freeMemory(pImplList[0]); + rtl_freeMemory(pImplList); + + } else { + serviceKey.createKey(usServiceKeyName, key); + + sal_Char* pImplList[1]; + pImplList[0] = (sal_Char*)rtl_allocateZeroMemory( + sImplName.getLength()+1 * sizeof(sal_Char)); + rtl_copyMemory(pImplList[0], (sal_Char*)sImplName.getStr(), + sImplName.getLength()+1); + key.setStringListValue(OUString(), pImplList, 1); + + // free memory + rtl_freeMemory(pImplList[0]); + } + serv_iter++; + } while (serv_iter != (*comp_iter).vSupportedServices.end()); + + comp_iter++; + } while (comp_iter != vDescr.end()); + + key.closeKey(); + subKey.closeKey(); + serviceKey.closeKey(); + rootKey.closeKey(); + pReg->close(); + + return 0; +}