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