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
1051134e9eSAndrew Rist *
1151134e9eSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
1251134e9eSAndrew Rist *
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.
1951134e9eSAndrew Rist *
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 }
313cdf0e10cSrcweir
314cdf0e10cSrcweir
315