xref: /aoo41x/main/registry/tools/rdbedit.cxx (revision a180b29c)
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