xref: /trunk/main/registry/tools/rdbedit.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
151134e9eSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
351134e9eSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
451134e9eSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
551134e9eSAndrew Rist  * distributed with this work for additional information
651134e9eSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
751134e9eSAndrew Rist  * to you under the Apache License, Version 2.0 (the
851134e9eSAndrew Rist  * "License"); you may not use this file except in compliance
951134e9eSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
1151134e9eSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
1351134e9eSAndrew Rist  * Unless required by applicable law or agreed to in writing,
1451134e9eSAndrew Rist  * software distributed under the License is distributed on an
1551134e9eSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1651134e9eSAndrew Rist  * KIND, either express or implied.  See the License for the
1751134e9eSAndrew Rist  * specific language governing permissions and limitations
1851134e9eSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
2051134e9eSAndrew Rist  *************************************************************/
2151134e9eSAndrew Rist 
2251134e9eSAndrew 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 
isFileUrl(const OString & fileName)48cdf0e10cSrcweir sal_Bool isFileUrl(const OString& fileName)
49cdf0e10cSrcweir {
50cdf0e10cSrcweir     if (fileName.indexOf("file://") == 0 )
51cdf0e10cSrcweir         return sal_True;
52cdf0e10cSrcweir     return sal_False;
53cdf0e10cSrcweir }
54cdf0e10cSrcweir 
convertToFileUrl(const OString & fileName)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 {
operator ()LessString95cdf0e10cSrcweir     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:
Options()108cdf0e10cSrcweir     Options()
109cdf0e10cSrcweir         : m_bVerbose(false)
110cdf0e10cSrcweir         {}
~Options()111cdf0e10cSrcweir     ~Options()
112cdf0e10cSrcweir         {}
113cdf0e10cSrcweir 
114cdf0e10cSrcweir     bool initOptions(int ac, char* av[]);
115cdf0e10cSrcweir 
116cdf0e10cSrcweir     OString prepareHelp();
117cdf0e10cSrcweir     OString prepareVersion();
118cdf0e10cSrcweir 
getProgramName()119cdf0e10cSrcweir     const OString& getProgramName()
120cdf0e10cSrcweir         { return m_program; }
getTypeReg()121cdf0e10cSrcweir     const OString& getTypeReg()
122cdf0e10cSrcweir         { return m_typeRegName; }
getKeyName()123cdf0e10cSrcweir     const OString& getKeyName()
124cdf0e10cSrcweir         { return m_keyName; }
getCommand()125*a180b29cSHerbert Dürr     Command getCommand()
126cdf0e10cSrcweir         { return m_command; }
verbose()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 
initOptions(int ac,char * av[])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 
prepareHelp()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 
prepareVersion()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__)
main(int argc,char * argv[])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 }
313