diff options
Diffstat (limited to 'registry/tools/checksingleton.cxx')
-rw-r--r-- | registry/tools/checksingleton.cxx | 462 |
1 files changed, 162 insertions, 300 deletions
diff --git a/registry/tools/checksingleton.cxx b/registry/tools/checksingleton.cxx index 228665014..586a74ea1 100644 --- a/registry/tools/checksingleton.cxx +++ b/registry/tools/checksingleton.cxx @@ -29,297 +29,150 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_registry.hxx" -#include <stdio.h> -#include <string.h> - #include "registry/registry.hxx" #include "registry/reflread.hxx" -#include <rtl/ustring.hxx> -#include <rtl/alloc.h> -#include <osl/process.h> -#include <osl/diagnose.h> -#include <osl/thread.h> -#include <osl/file.hxx> - -#ifdef SAL_UNX -#define SEPARATOR '/' -#else -#define SEPARATOR '\\' -#endif +#include "fileurl.hxx" +#include "options.hxx" -using namespace ::rtl; -using namespace ::osl; +#include "rtl/ustring.hxx" +#include "osl/diagnose.h" -sal_Bool isFileUrl(const OString& fileName) -{ - if (fileName.indexOf("file://") == 0 ) - return sal_True; - return sal_False; -} +#include <stdio.h> +#include <string.h> -OUString convertToFileUrl(const OString& fileName) -{ - if ( isFileUrl(fileName) ) - { - return OStringToOUString(fileName, osl_getThreadTextEncoding()); - } +#include <vector> +#include <string> - OUString uUrlFileName; - OUString uFileName(fileName.getStr(), fileName.getLength(), osl_getThreadTextEncoding()); - if ( fileName.indexOf('.') == 0 || fileName.indexOf(SEPARATOR) < 0 ) - { - OUString uWorkingDir; - if (osl_getProcessWorkingDir(&uWorkingDir.pData) != osl_Process_E_None) - { - OSL_ASSERT(false); - } - if (FileBase::getAbsoluteFileURL(uWorkingDir, uFileName, uUrlFileName) - != FileBase::E_None) - { - OSL_ASSERT(false); - } - } else - { - if (FileBase::getFileURLFromSystemPath(uFileName, uUrlFileName) - != FileBase::E_None) - { - OSL_ASSERT(false); - } - } - - return uUrlFileName; -} +using namespace rtl; +using namespace registry::tools; #define U2S( s ) \ OUStringToOString(s, RTL_TEXTENCODING_UTF8).getStr() #define S2U( s ) \ OStringToOUString(s, RTL_TEXTENCODING_UTF8) -struct LessString -{ - sal_Bool operator()(const OUString& str1, const OUString& str2) const - { - return (str1 < str2); - } -}; - -class Options +class Options_Impl : public Options { public: - Options() - : m_bForceOutput(sal_False) + explicit Options_Impl(char const * program) + : Options (program), m_bForceOutput(false) {} - ~Options() - {} - - sal_Bool initOptions(int ac, char* av[], sal_Bool bCmdFile=sal_False); - OString prepareHelp(); - OString prepareVersion(); - - const OString& getProgramName() - { return m_program; } - const OString& getIndexReg() + std::string const & getIndexReg() const { return m_indexRegName; } - const OString& getTypeReg() + std::string const & getTypeReg() const { return m_typeRegName; } - sal_Bool hasBase() - { return m_base.getLength() > 0; } - const OString& getBase() + bool hasBase() const + { return (m_base.getLength() > 0); } + const OString & getBase() const { return m_base; } - sal_Bool forceOutput() + bool forceOutput() const { return m_bForceOutput; } + protected: - OString m_program; - OString m_indexRegName; - OString m_typeRegName; + virtual void printUsage_Impl() const; + virtual bool initOptions_Impl (std::vector< std::string > & rArgs); + + std::string m_indexRegName; + std::string m_typeRegName; OString m_base; - sal_Bool m_bForceOutput; + bool m_bForceOutput; }; -sal_Bool Options::initOptions(int ac, char* av[], sal_Bool bCmdFile) +// virtual +void Options_Impl::printUsage_Impl() const { - sal_Bool bRet = sal_True; - sal_uInt16 i=0; + std::string const & rProgName = getProgramName(); + fprintf(stderr, + "Usage: %s -r<filename> -o<filename> [-options] | @<filename>\n", rProgName.c_str() + ); + fprintf(stderr, + " -o<filename> = filename specifies the name of the new singleton index registry.\n" + " -r<filename> = filename specifies the name of the type registry.\n" + " @<filename> = filename specifies a command file.\n" + "Options:\n" + " -b<name> = name specifies the name of a start key. The types will be searched\n" + " under this key in the type registry.\n" + " -f = force the output of all found singletons.\n" + " -h|-? = print this help message and exit.\n" + ); + fprintf(stderr, + "\n%s Version 1.0\n\n", rProgName.c_str() + ); +} - if (!bCmdFile) +// virtual +bool Options_Impl::initOptions_Impl(std::vector< std::string > & rArgs) +{ + std::vector< std::string >::const_iterator first = rArgs.begin(), last = rArgs.end(); + for (; first != last; ++first) { - bCmdFile = sal_True; - - m_program = av[0]; - - if (ac < 2) + std::string option (*first); + if ((*first)[0] != '-') { - fprintf(stderr, "%s", prepareHelp().getStr()); - bRet = sal_False; + return badOption("invalid", option.c_str()); } - - i = 1; - } else - { - i = 0; - } - - char *s=NULL; - for (; i < ac; i++) - { - if (av[i][0] == '-') + switch ((*first)[1]) { - switch (av[i][1]) + case 'r': + case 'R': + { + if (!((++first != last) && ((*first)[0] != '-'))) + { + return badOption("invalid", option.c_str()); + } + m_typeRegName = OString((*first).c_str(), (*first).size()); + break; + } + case 'o': + case 'O': { - case 'r': - case 'R': - if (av[i][2] == '\0') - { - if (i < ac - 1 && av[i+1][0] != '-') - { - i++; - s = av[i]; - } else - { - fprintf(stderr, "%s: invalid option '%s'\n", m_program.getStr(), av[i]); - bRet = sal_False; - break; - } - } else - { - s = av[i] + 2; - } - m_typeRegName = OString(s); - break; - case 'o': - case 'O': - if (av[i][2] == '\0') - { - if (i < ac - 1 && av[i+1][0] != '-') - { - i++; - s = av[i]; - } else - { - fprintf(stderr, "%s: invalid option '%s'\n", m_program.getStr(), av[i]); - bRet = sal_False; - break; - } - } else - { - s = av[i] + 2; - } - m_indexRegName = OString(s); - break; - case 'b': - case 'B': - if (av[i][2] == '\0') - { - if (i < ac - 1 && av[i+1][0] != '-') - { - i++; - s = av[i]; - } else - { - fprintf(stderr, "%s: invalid option '%s'\n", m_program.getStr(), av[i]); - bRet = sal_False; - break; - } - } else - { - s = av[i] + 2; - } - m_base = OString(s); - break; - case 'f': - case 'F': - if (av[i][2] != '\0') - { - fprintf(stderr, "%s: invalid option '%s'\n", m_program.getStr(), av[i]); - bRet = sal_False; - } - m_bForceOutput = sal_True; - break; - case 'h': - case '?': - if (av[i][2] != '\0') - { - fprintf(stderr, "%s: invalid option '%s'\n", m_program.getStr(), av[i]); - bRet = sal_False; - } else - { - fprintf(stdout, "%s", prepareHelp().getStr()); - exit(0); - } - break; - default: - fprintf(stderr, "%s: unknown option '%s'\n", m_program.getStr(), av[i]); - bRet = sal_False; - break; + if (!((++first != last) && ((*first)[0] != '-'))) + { + return badOption("invalid", option.c_str()); + } + m_indexRegName = (*first); + break; } - } else - { - if (av[i][0] == '@') + case 'b': + case 'B': { - FILE* cmdFile = fopen(av[i]+1, "r"); - if( cmdFile == NULL ) - { - fprintf(stderr, "%s", prepareHelp().getStr()); - bRet = sal_False; - } else + if (!((++first != last) && ((*first)[0] != '-'))) { - int rargc=0; - char* rargv[512]; - char buffer[512]; - - while ( fscanf(cmdFile, "%s", buffer) != EOF ) - { - rargv[rargc]= strdup(buffer); - rargc++; - } - fclose(cmdFile); - - bRet = initOptions(rargc, rargv, bCmdFile); - - for (long j=0; j < rargc; j++) - { - free(rargv[j]); - } + return badOption("invalid", option.c_str()); + } + m_base = OString((*first).c_str(), (*first).size()); + break; + } + case 'f': + case 'F': + { + if ((*first).size() > 2) + { + return badOption("invalid", option.c_str()); } - } else + m_bForceOutput = sal_True; + break; + } + case 'h': + case '?': { - fprintf(stderr, "%s: unknown option '%s'\n", m_program.getStr(), av[i]); - bRet = sal_False; + if ((*first).size() > 2) + { + return badOption("invalid", option.c_str()); + } + return printUsage(); + // break; // unreachable } + default: + return badOption("unknown", option.c_str()); + // break; // unreachable } } - - return bRet; + return true; } -OString Options::prepareHelp() -{ - OString help("\nusing: "); - help += m_program + " -r<filename> -o<filename> [-options] | @<filename>\n"; - help += " -o<filename> = filename specifies the name of the new singleton index registry.\n"; - help += " -r<filename> = filename specifies the name of the type registry.\n"; - help += " @<filename> = filename specifies a command file.\n"; - help += "Options:\n"; - help += " -b<name> = name specifies the name of a start key. The types will be searched\n"; - help += " under this key in the type registry.\n"; - help += " -f = force the output of all found singletons.\n"; - help += " -h|-? = print this help message and exit.\n"; - help += prepareVersion(); - - return help; -} - -OString Options::prepareVersion() -{ - OString version("\nSun Microsystems (R) "); - version += m_program + " Version 1.0\n\n"; - return version; -} - -static Options options; - -static sal_Bool checkSingletons(RegistryKey& singletonKey, RegistryKey& typeKey) +static sal_Bool checkSingletons(Options_Impl const & options, RegistryKey& singletonKey, RegistryKey& typeKey) { RegValueType valueType = RG_VALUETYPE_NOT_DEFINED; sal_uInt32 size = 0; @@ -327,24 +180,22 @@ static sal_Bool checkSingletons(RegistryKey& singletonKey, RegistryKey& typeKey) sal_Bool bRet = sal_False; RegError e = typeKey.getValueInfo(tmpName, &valueType, &size); - - if ( e != REG_VALUE_NOT_EXISTS && e != REG_INVALID_VALUE && valueType == RG_VALUETYPE_BINARY) + if ((e != REG_VALUE_NOT_EXISTS) && (e != REG_INVALID_VALUE) && (valueType == RG_VALUETYPE_BINARY)) { - RegistryKey entryKey; - RegValue value = rtl_allocateMemory(size); - - typeKey.getValue(tmpName, value); + std::vector< sal_uInt8 > value(size); + typeKey.getValue(tmpName, &value[0]); // @@@ broken api: write to buffer w/o buffer size. - RegistryTypeReader reader((sal_uInt8*)value, size, sal_False); - + RegistryTypeReader reader(&value[0], value.size(), sal_False); if ( reader.isValid() && reader.getTypeClass() == RT_TYPE_SINGLETON ) { - OUString singletonName = reader.getTypeName().replace('/', '.'); + RegistryKey entryKey; + OUString singletonName = reader.getTypeName().replace('/', '.'); if ( singletonKey.createKey(singletonName, entryKey) ) { fprintf(stderr, "%s: could not create SINGLETONS entry for \"%s\"\n", - options.getProgramName().getStr(), U2S( singletonName )); - } else + options.getProgramName().c_str(), U2S( singletonName )); + } + else { bRet = sal_True; OUString value2 = reader.getSuperTypeName(); @@ -353,30 +204,26 @@ static sal_Bool checkSingletons(RegistryKey& singletonKey, RegistryKey& typeKey) (RegValue)value2.getStr(), sizeof(sal_Unicode)* (value2.getLength()+1)) ) { fprintf(stderr, "%s: could not create data entry for singleton \"%s\"\n", - options.getProgramName().getStr(), U2S( singletonName )); + options.getProgramName().c_str(), U2S( singletonName )); } if ( options.forceOutput() ) { fprintf(stderr, "%s: create SINGLETON entry for \"%s\" -> \"%s\"\n", - options.getProgramName().getStr(), U2S( singletonName ), U2S(value2)); + options.getProgramName().c_str(), U2S( singletonName ), U2S(value2)); } } } - - rtl_freeMemory(value); } RegistryKeyArray subKeys; - typeKey.openSubKeys(tmpName, subKeys); sal_uInt32 length = subKeys.getLength(); - RegistryKey elementKey; for (sal_uInt32 i = 0; i < length; i++) { - elementKey = subKeys.getElement(i); - if ( checkSingletons(singletonKey, elementKey) ) + RegistryKey elementKey = subKeys.getElement(i); + if ( checkSingletons(options, singletonKey, elementKey) ) { bRet = sal_True; } @@ -390,69 +237,85 @@ int main( int argc, char * argv[] ) int _cdecl main( int argc, char * argv[] ) #endif { - if ( !options.initOptions(argc, argv) ) + std::vector< std::string > args; + for (int i = 1; i < argc; i++) { - exit(1); + int result = Options::checkArgument(args, argv[i], strlen(argv[i])); + if (result != 0) + { + // failure. + return (result); + } } - OUString indexRegName( convertToFileUrl(options.getIndexReg()) ); - OUString typeRegName( convertToFileUrl(options.getTypeReg()) ); - - Registry indexReg; - Registry typeReg; + Options_Impl options(argv[0]); + if (!options.initOptions(args)) + { + options.printUsage(); + return (1); + } + OUString indexRegName( convertToFileUrl(options.getIndexReg().c_str(), options.getIndexReg().size()) ); + Registry indexReg; if ( indexReg.open(indexRegName, REG_READWRITE) ) { if ( indexReg.create(indexRegName) ) { fprintf(stderr, "%s: open registry \"%s\" failed\n", - options.getProgramName().getStr(), options.getIndexReg().getStr()); - exit(2); + options.getProgramName().c_str(), options.getIndexReg().c_str()); + return (2); } } + + OUString typeRegName( convertToFileUrl(options.getTypeReg().c_str(), options.getTypeReg().size()) ); + Registry typeReg; if ( typeReg.open(typeRegName, REG_READONLY) ) { fprintf(stderr, "%s: open registry \"%s\" failed\n", - options.getProgramName().getStr(), options.getTypeReg().getStr()); - exit(3); + options.getProgramName().c_str(), options.getTypeReg().c_str()); + return (3); } - RegistryKey indexRoot, typeRoot; + RegistryKey indexRoot; if ( indexReg.openRootKey(indexRoot) ) { fprintf(stderr, "%s: open root key of registry \"%s\" failed\n", - options.getProgramName().getStr(), options.getIndexReg().getStr()); - exit(4); + options.getProgramName().c_str(), options.getIndexReg().c_str()); + return (4); } + + RegistryKey typeRoot; if ( typeReg.openRootKey(typeRoot) ) { fprintf(stderr, "%s: open root key of registry \"%s\" failed\n", - options.getProgramName().getStr(), options.getTypeReg().getStr()); - exit(5); + options.getProgramName().c_str(), options.getTypeReg().c_str()); + return (5); } - RegistryKey singletonKey, typeKey; + RegistryKey typeKey; if ( options.hasBase() ) { if ( typeRoot.openKey(S2U(options.getBase()), typeKey) ) { fprintf(stderr, "%s: open base key of registry \"%s\" failed\n", - options.getProgramName().getStr(), options.getTypeReg().getStr()); - exit(6); + options.getProgramName().c_str(), options.getTypeReg().c_str()); + return (6); } - } else + } + else { typeKey = typeRoot; } + RegistryKey singletonKey; if ( indexRoot.createKey(OUString(RTL_CONSTASCII_USTRINGPARAM("SINGLETONS")), singletonKey) ) { fprintf(stderr, "%s: open/create SINGLETONS key of registry \"%s\" failed\n", - options.getProgramName().getStr(), options.getIndexReg().getStr()); - exit(7); + options.getProgramName().c_str(), options.getIndexReg().c_str()); + return (7); } - sal_Bool bSingletonsExist = checkSingletons(singletonKey, typeKey); + sal_Bool bSingletonsExist = checkSingletons(options, singletonKey, typeKey); indexRoot.releaseKey(); typeRoot.releaseKey(); @@ -461,25 +324,24 @@ int _cdecl main( int argc, char * argv[] ) if ( indexReg.close() ) { fprintf(stderr, "%s: closing registry \"%s\" failed\n", - options.getProgramName().getStr(), options.getIndexReg().getStr()); - exit(9); + options.getProgramName().c_str(), options.getIndexReg().c_str()); + return (9); } if ( !bSingletonsExist ) { if ( indexReg.destroy(OUString()) ) { fprintf(stderr, "%s: destroy registry \"%s\" failed\n", - options.getProgramName().getStr(), options.getIndexReg().getStr()); - exit(10); + options.getProgramName().c_str(), options.getIndexReg().c_str()); + return (10); } } if ( typeReg.close() ) { fprintf(stderr, "%s: closing registry \"%s\" failed\n", - options.getProgramName().getStr(), options.getTypeReg().getStr()); - exit(11); + options.getProgramName().c_str(), options.getTypeReg().c_str()); + return (11); } } - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file |