xref: /AOO41X/main/registry/tools/rdbedit.cxx (revision 47148b3bc50811ceb41802e4cc50a5db21535900)
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 
isFileUrl(const OString & fileName)48 sal_Bool isFileUrl(const OString& fileName)
49 {
50     if (fileName.indexOf("file://") == 0 )
51         return sal_True;
52     return sal_False;
53 }
54 
convertToFileUrl(const OString & fileName)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 {
operator ()LessString95     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:
Options()108     Options()
109         : m_bVerbose(false)
110         {}
~Options()111     ~Options()
112         {}
113 
114     bool initOptions(int ac, char* av[]);
115 
116     OString prepareHelp();
117     OString prepareVersion();
118 
getProgramName()119     const OString& getProgramName()
120         { return m_program; }
getTypeReg()121     const OString& getTypeReg()
122         { return m_typeRegName; }
getKeyName()123     const OString& getKeyName()
124         { return m_keyName; }
getCommand()125     Command getCommand()
126         { return m_command; }
verbose()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 
initOptions(int ac,char * av[])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 
prepareHelp()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 
prepareVersion()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__)
main(int argc,char * argv[])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