1*51134e9eSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*51134e9eSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*51134e9eSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*51134e9eSAndrew Rist * distributed with this work for additional information 6*51134e9eSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*51134e9eSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*51134e9eSAndrew Rist * "License"); you may not use this file except in compliance 9*51134e9eSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*51134e9eSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*51134e9eSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*51134e9eSAndrew Rist * software distributed under the License is distributed on an 15*51134e9eSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*51134e9eSAndrew Rist * KIND, either express or implied. See the License for the 17*51134e9eSAndrew Rist * specific language governing permissions and limitations 18*51134e9eSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*51134e9eSAndrew Rist *************************************************************/ 21*51134e9eSAndrew Rist 22*51134e9eSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_registry.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <stdio.h> 28cdf0e10cSrcweir #include <string.h> 29cdf0e10cSrcweir 30cdf0e10cSrcweir #include "registry/registry.hxx" 31cdf0e10cSrcweir #include "registry/reflread.hxx" 32cdf0e10cSrcweir #include <rtl/ustring.hxx> 33cdf0e10cSrcweir #include <rtl/alloc.h> 34cdf0e10cSrcweir #include <osl/process.h> 35cdf0e10cSrcweir #include <osl/diagnose.h> 36cdf0e10cSrcweir #include <osl/thread.h> 37cdf0e10cSrcweir #include <osl/file.hxx> 38cdf0e10cSrcweir 39cdf0e10cSrcweir #ifdef SAL_UNX 40cdf0e10cSrcweir #define SEPARATOR '/' 41cdf0e10cSrcweir #else 42cdf0e10cSrcweir #define SEPARATOR '\\' 43cdf0e10cSrcweir #endif 44cdf0e10cSrcweir 45cdf0e10cSrcweir using namespace ::rtl; 46cdf0e10cSrcweir using namespace ::osl; 47cdf0e10cSrcweir 48cdf0e10cSrcweir sal_Bool isFileUrl(const OString& fileName) 49cdf0e10cSrcweir { 50cdf0e10cSrcweir if (fileName.indexOf("file://") == 0 ) 51cdf0e10cSrcweir return sal_True; 52cdf0e10cSrcweir return sal_False; 53cdf0e10cSrcweir } 54cdf0e10cSrcweir 55cdf0e10cSrcweir OUString convertToFileUrl(const OString& fileName) 56cdf0e10cSrcweir { 57cdf0e10cSrcweir if ( isFileUrl(fileName) ) 58cdf0e10cSrcweir { 59cdf0e10cSrcweir return OStringToOUString(fileName, osl_getThreadTextEncoding()); 60cdf0e10cSrcweir } 61cdf0e10cSrcweir 62cdf0e10cSrcweir OUString uUrlFileName; 63cdf0e10cSrcweir OUString uFileName(fileName.getStr(), fileName.getLength(), osl_getThreadTextEncoding()); 64cdf0e10cSrcweir if ( fileName.indexOf('.') == 0 || fileName.indexOf(SEPARATOR) < 0 ) 65cdf0e10cSrcweir { 66cdf0e10cSrcweir OUString uWorkingDir; 67cdf0e10cSrcweir if (osl_getProcessWorkingDir(&uWorkingDir.pData) != osl_Process_E_None) 68cdf0e10cSrcweir { 69cdf0e10cSrcweir OSL_ASSERT(false); 70cdf0e10cSrcweir } 71cdf0e10cSrcweir if (FileBase::getAbsoluteFileURL(uWorkingDir, uFileName, uUrlFileName) 72cdf0e10cSrcweir != FileBase::E_None) 73cdf0e10cSrcweir { 74cdf0e10cSrcweir OSL_ASSERT(false); 75cdf0e10cSrcweir } 76cdf0e10cSrcweir } else 77cdf0e10cSrcweir { 78cdf0e10cSrcweir if (FileBase::getFileURLFromSystemPath(uFileName, uUrlFileName) 79cdf0e10cSrcweir != FileBase::E_None) 80cdf0e10cSrcweir { 81cdf0e10cSrcweir OSL_ASSERT(false); 82cdf0e10cSrcweir } 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir return uUrlFileName; 86cdf0e10cSrcweir } 87cdf0e10cSrcweir 88cdf0e10cSrcweir #define U2S( s ) \ 89cdf0e10cSrcweir OUStringToOString(s, RTL_TEXTENCODING_UTF8).getStr() 90cdf0e10cSrcweir #define S2U( s ) \ 91cdf0e10cSrcweir OStringToOUString(s, RTL_TEXTENCODING_UTF8) 92cdf0e10cSrcweir 93cdf0e10cSrcweir struct LessString 94cdf0e10cSrcweir { 95cdf0e10cSrcweir sal_Bool operator()(const OUString& str1, const OUString& str2) const 96cdf0e10cSrcweir { 97cdf0e10cSrcweir return (str1 < str2); 98cdf0e10cSrcweir } 99cdf0e10cSrcweir }; 100cdf0e10cSrcweir 101cdf0e10cSrcweir enum Command { 102cdf0e10cSrcweir DELETEKEY 103cdf0e10cSrcweir }; 104cdf0e10cSrcweir 105cdf0e10cSrcweir class Options 106cdf0e10cSrcweir { 107cdf0e10cSrcweir public: 108cdf0e10cSrcweir Options() 109cdf0e10cSrcweir : m_bVerbose(false) 110cdf0e10cSrcweir {} 111cdf0e10cSrcweir ~Options() 112cdf0e10cSrcweir {} 113cdf0e10cSrcweir 114cdf0e10cSrcweir bool initOptions(int ac, char* av[]); 115cdf0e10cSrcweir 116cdf0e10cSrcweir OString prepareHelp(); 117cdf0e10cSrcweir OString prepareVersion(); 118cdf0e10cSrcweir 119cdf0e10cSrcweir const OString& getProgramName() 120cdf0e10cSrcweir { return m_program; } 121cdf0e10cSrcweir const OString& getTypeReg() 122cdf0e10cSrcweir { return m_typeRegName; } 123cdf0e10cSrcweir const OString& getKeyName() 124cdf0e10cSrcweir { return m_keyName; } 125cdf0e10cSrcweir const Command getCommand() 126cdf0e10cSrcweir { return m_command; } 127cdf0e10cSrcweir bool verbose() 128cdf0e10cSrcweir { return m_bVerbose; } 129cdf0e10cSrcweir protected: 130cdf0e10cSrcweir OString m_program; 131cdf0e10cSrcweir OString m_typeRegName; 132cdf0e10cSrcweir OString m_keyName; 133cdf0e10cSrcweir Command m_command; 134cdf0e10cSrcweir bool m_bVerbose; 135cdf0e10cSrcweir }; 136cdf0e10cSrcweir 137cdf0e10cSrcweir bool Options::initOptions(int ac, char* av[]) 138cdf0e10cSrcweir { 139cdf0e10cSrcweir bool bRet = true; 140cdf0e10cSrcweir sal_uInt16 i=1; 141cdf0e10cSrcweir 142cdf0e10cSrcweir if (ac < 2) 143cdf0e10cSrcweir { 144cdf0e10cSrcweir fprintf(stderr, "%s", prepareHelp().getStr()); 145cdf0e10cSrcweir bRet = sal_False; 146cdf0e10cSrcweir } 147cdf0e10cSrcweir 148cdf0e10cSrcweir m_program = av[0]; 149cdf0e10cSrcweir sal_Int32 index = -1; 150cdf0e10cSrcweir if ((index=m_program.lastIndexOf(SEPARATOR)) > 0) 151cdf0e10cSrcweir m_program = av[0]+index+1; 152cdf0e10cSrcweir 153cdf0e10cSrcweir char *s=NULL; 154cdf0e10cSrcweir for (; i < ac; i++) 155cdf0e10cSrcweir { 156cdf0e10cSrcweir if (av[i][0] == '-') 157cdf0e10cSrcweir { 158cdf0e10cSrcweir switch (av[i][1]) 159cdf0e10cSrcweir { 160cdf0e10cSrcweir case 'r': 161cdf0e10cSrcweir case 'R': 162cdf0e10cSrcweir if (av[i][2] == '\0') 163cdf0e10cSrcweir { 164cdf0e10cSrcweir if (i < ac - 1 && av[i+1][0] != '-') 165cdf0e10cSrcweir { 166cdf0e10cSrcweir i++; 167cdf0e10cSrcweir s = av[i]; 168cdf0e10cSrcweir } else 169cdf0e10cSrcweir { 170cdf0e10cSrcweir fprintf(stderr, "%s: invalid option '%s'\n", m_program.getStr(), av[i]); 171cdf0e10cSrcweir bRet = sal_False; 172cdf0e10cSrcweir break; 173cdf0e10cSrcweir } 174cdf0e10cSrcweir } else 175cdf0e10cSrcweir { 176cdf0e10cSrcweir s = av[i] + 2; 177cdf0e10cSrcweir } 178cdf0e10cSrcweir m_typeRegName = OString(s); 179cdf0e10cSrcweir break; 180cdf0e10cSrcweir case 'd': 181cdf0e10cSrcweir case 'D': 182cdf0e10cSrcweir if (av[i][2] == '\0') 183cdf0e10cSrcweir { 184cdf0e10cSrcweir if (i < ac - 1 && av[i+1][0] != '-') 185cdf0e10cSrcweir { 186cdf0e10cSrcweir i++; 187cdf0e10cSrcweir s = av[i]; 188cdf0e10cSrcweir } else 189cdf0e10cSrcweir { 190cdf0e10cSrcweir fprintf(stderr, "%s: invalid option '%s'\n", m_program.getStr(), av[i]); 191cdf0e10cSrcweir bRet = sal_False; 192cdf0e10cSrcweir break; 193cdf0e10cSrcweir } 194cdf0e10cSrcweir } else 195cdf0e10cSrcweir { 196cdf0e10cSrcweir s = av[i] + 2; 197cdf0e10cSrcweir } 198cdf0e10cSrcweir m_keyName = OString(s); 199cdf0e10cSrcweir break; 200cdf0e10cSrcweir case 'v': 201cdf0e10cSrcweir case 'V': 202cdf0e10cSrcweir if (av[i][2] != '\0') 203cdf0e10cSrcweir { 204cdf0e10cSrcweir fprintf(stderr, "%s: invalid option '%s'\n", m_program.getStr(), av[i]); 205cdf0e10cSrcweir bRet = sal_False; 206cdf0e10cSrcweir } 207cdf0e10cSrcweir m_bVerbose = true; 208cdf0e10cSrcweir break; 209cdf0e10cSrcweir case 'h': 210cdf0e10cSrcweir case '?': 211cdf0e10cSrcweir if (av[i][2] != '\0') 212cdf0e10cSrcweir { 213cdf0e10cSrcweir fprintf(stderr, "%s: invalid option '%s'\n", m_program.getStr(), av[i]); 214cdf0e10cSrcweir bRet = false; 215cdf0e10cSrcweir } else 216cdf0e10cSrcweir { 217cdf0e10cSrcweir fprintf(stdout, "%s", prepareHelp().getStr()); 218cdf0e10cSrcweir exit(0); 219cdf0e10cSrcweir } 220cdf0e10cSrcweir break; 221cdf0e10cSrcweir default: 222cdf0e10cSrcweir fprintf(stderr, "%s: unknown option '%s'\n", m_program.getStr(), av[i]); 223cdf0e10cSrcweir bRet = false; 224cdf0e10cSrcweir break; 225cdf0e10cSrcweir } 226cdf0e10cSrcweir } else 227cdf0e10cSrcweir { 228cdf0e10cSrcweir fprintf(stderr, "%s: unknown option '%s'\n", m_program.getStr(), av[i]); 229cdf0e10cSrcweir bRet = false; 230cdf0e10cSrcweir } 231cdf0e10cSrcweir } 232cdf0e10cSrcweir 233cdf0e10cSrcweir return bRet; 234cdf0e10cSrcweir } 235cdf0e10cSrcweir 236cdf0e10cSrcweir OString Options::prepareHelp() 237cdf0e10cSrcweir { 238cdf0e10cSrcweir OString help("\nusing: "); 239cdf0e10cSrcweir help += m_program + " -r<filename> <command>\n"; 240cdf0e10cSrcweir help += " -r<filename> = filename specifies the name of the type registry.\n"; 241cdf0e10cSrcweir help += "Commands:\n"; 242cdf0e10cSrcweir help += " -d <keyname> = delete the specified key from the registry. Keyname\n"; 243cdf0e10cSrcweir help += " specifies the name of the key that get deleted.\n"; 244cdf0e10cSrcweir help += " -v = verbose output.\n"; 245cdf0e10cSrcweir help += " -h|-? = print this help message and exit.\n"; 246cdf0e10cSrcweir help += prepareVersion(); 247cdf0e10cSrcweir 248cdf0e10cSrcweir return help; 249cdf0e10cSrcweir } 250cdf0e10cSrcweir 251cdf0e10cSrcweir OString Options::prepareVersion() 252cdf0e10cSrcweir { 253cdf0e10cSrcweir OString version(m_program); 254cdf0e10cSrcweir version += " Version 1.0\n\n"; 255cdf0e10cSrcweir return version; 256cdf0e10cSrcweir } 257cdf0e10cSrcweir 258cdf0e10cSrcweir static Options options; 259cdf0e10cSrcweir 260cdf0e10cSrcweir 261cdf0e10cSrcweir #if (defined UNX) || (defined OS2) || (defined __MINGW32__) 262cdf0e10cSrcweir int main( int argc, char * argv[] ) 263cdf0e10cSrcweir #else 264cdf0e10cSrcweir int _cdecl main( int argc, char * argv[] ) 265cdf0e10cSrcweir #endif 266cdf0e10cSrcweir { 267cdf0e10cSrcweir if ( !options.initOptions(argc, argv) ) 268cdf0e10cSrcweir { 269cdf0e10cSrcweir exit(1); 270cdf0e10cSrcweir } 271cdf0e10cSrcweir 272cdf0e10cSrcweir OUString typeRegName( convertToFileUrl(options.getTypeReg()) ); 273cdf0e10cSrcweir 274cdf0e10cSrcweir Registry typeReg; 275cdf0e10cSrcweir 276cdf0e10cSrcweir if ( typeReg.open(typeRegName, REG_READWRITE) ) 277cdf0e10cSrcweir { 278cdf0e10cSrcweir fprintf(stderr, "%s: open registry \"%s\" failed\n", 279cdf0e10cSrcweir options.getProgramName().getStr(), options.getTypeReg().getStr()); 280cdf0e10cSrcweir exit(2); 281cdf0e10cSrcweir } 282cdf0e10cSrcweir 283cdf0e10cSrcweir RegistryKey typeRoot; 284cdf0e10cSrcweir if ( typeReg.openRootKey(typeRoot) ) 285cdf0e10cSrcweir { 286cdf0e10cSrcweir fprintf(stderr, "%s: open root key of registry \"%s\" failed\n", 287cdf0e10cSrcweir options.getProgramName().getStr(), options.getTypeReg().getStr()); 288cdf0e10cSrcweir exit(3); 289cdf0e10cSrcweir } 290cdf0e10cSrcweir 291cdf0e10cSrcweir if ( options.getCommand() == DELETEKEY ) 292cdf0e10cSrcweir { 293cdf0e10cSrcweir if ( typeRoot.deleteKey(S2U(options.getKeyName())) ) 294cdf0e10cSrcweir { 295cdf0e10cSrcweir fprintf(stderr, "%s: delete key \"%s\" of registry \"%s\" failed\n", 296cdf0e10cSrcweir options.getProgramName().getStr(), options.getKeyName().getStr(), options.getTypeReg().getStr()); 297cdf0e10cSrcweir exit(4); 298cdf0e10cSrcweir } else { 299cdf0e10cSrcweir if (options.verbose()) 300cdf0e10cSrcweir fprintf(stderr, "%s: delete key \"%s\" of registry \"%s\"\n", 301cdf0e10cSrcweir options.getProgramName().getStr(), options.getKeyName().getStr(), options.getTypeReg().getStr()); 302cdf0e10cSrcweir } 303cdf0e10cSrcweir } 304cdf0e10cSrcweir 305cdf0e10cSrcweir typeRoot.releaseKey(); 306cdf0e10cSrcweir if ( typeReg.close() ) 307cdf0e10cSrcweir { 308cdf0e10cSrcweir fprintf(stderr, "%s: closing registry \"%s\" failed\n", 309cdf0e10cSrcweir options.getProgramName().getStr(), options.getTypeReg().getStr()); 310cdf0e10cSrcweir exit(5); 311cdf0e10cSrcweir } 312cdf0e10cSrcweir } 313cdf0e10cSrcweir 314cdf0e10cSrcweir 315