xref: /trunk/main/registry/inc/registry/registry.hxx (revision f006f9b4)
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 #ifndef _REGISTRY_REGISTRY_HXX_
25 #define _REGISTRY_REGISTRY_HXX_
26 
27 #include <registry/regtype.h>
28 #include <rtl/ustring.hxx>
29 #include "registry/registrydllapi.h"
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 /** specifies a collection of function pointers which represents the complete registry C-API.
36 
37     This funtions pointers are used by the C++ wrapper to call the C-API.
38 */
39 struct Registry_Api
40 {
41 	void	  	(REGISTRY_CALLTYPE *acquire) 			(RegHandle);
42 	void	  	(REGISTRY_CALLTYPE *release) 			(RegHandle);
43 	sal_Bool 	(REGISTRY_CALLTYPE *isReadOnly)			(RegHandle);
44 	RegError 	(REGISTRY_CALLTYPE *openRootKey)		(RegHandle, RegKeyHandle*);
45 	RegError	(REGISTRY_CALLTYPE *getName)			(RegHandle, rtl_uString**);
46 	RegError 	(REGISTRY_CALLTYPE *createRegistry)		(rtl_uString*, RegHandle*);
47 	RegError 	(REGISTRY_CALLTYPE *openRegistry)		(rtl_uString*, RegHandle*, RegAccessMode);
48 	RegError 	(REGISTRY_CALLTYPE *closeRegistry)		(RegHandle);
49 	RegError 	(REGISTRY_CALLTYPE *destroyRegistry)	(RegHandle,	rtl_uString*);
50 	RegError 	(REGISTRY_CALLTYPE *loadKey)			(RegHandle, RegKeyHandle, rtl_uString*, rtl_uString*);
51 	RegError 	(REGISTRY_CALLTYPE *saveKey)			(RegHandle, RegKeyHandle, rtl_uString*, rtl_uString*);
52 	RegError 	(REGISTRY_CALLTYPE *mergeKey)			(RegHandle, RegKeyHandle, rtl_uString*, rtl_uString*, sal_Bool, sal_Bool);
53 	RegError 	(REGISTRY_CALLTYPE *dumpRegistry) 		(RegHandle, RegKeyHandle);
54 	void	  	(REGISTRY_CALLTYPE *acquireKey) 	  	(RegKeyHandle);
55 	void	  	(REGISTRY_CALLTYPE *releaseKey) 	  	(RegKeyHandle);
56 	sal_Bool 	(REGISTRY_CALLTYPE *isKeyReadOnly)	  	(RegKeyHandle);
57 	RegError  	(REGISTRY_CALLTYPE *getKeyName)			(RegKeyHandle, rtl_uString**);
58 	RegError 	(REGISTRY_CALLTYPE *createKey)			(RegKeyHandle, rtl_uString*, RegKeyHandle*);
59 	RegError 	(REGISTRY_CALLTYPE *openKey)			(RegKeyHandle, rtl_uString*, RegKeyHandle*);
60 	RegError 	(REGISTRY_CALLTYPE *openSubKeys)		(RegKeyHandle, rtl_uString*, RegKeyHandle**, sal_uInt32*);
61 	RegError 	(REGISTRY_CALLTYPE *closeSubKeys)		(RegKeyHandle*, sal_uInt32);
62 	RegError 	(REGISTRY_CALLTYPE *deleteKey)			(RegKeyHandle, rtl_uString*);
63 	RegError 	(REGISTRY_CALLTYPE *closeKey)			(RegKeyHandle);
64 	RegError 	(REGISTRY_CALLTYPE *setValue)			(RegKeyHandle, rtl_uString*, RegValueType, RegValue, sal_uInt32);
65 	RegError 	(REGISTRY_CALLTYPE *setLongListValue)	(RegKeyHandle, rtl_uString*, sal_Int32*, sal_uInt32);
66 	RegError 	(REGISTRY_CALLTYPE *setStringListValue)	(RegKeyHandle, rtl_uString*, sal_Char**, sal_uInt32);
67 	RegError 	(REGISTRY_CALLTYPE *setUnicodeListValue)(RegKeyHandle, rtl_uString*, sal_Unicode**, sal_uInt32);
68 	RegError 	(REGISTRY_CALLTYPE *getValueInfo)		(RegKeyHandle, rtl_uString*, RegValueType*, sal_uInt32*);
69 	RegError 	(REGISTRY_CALLTYPE *getValue)			(RegKeyHandle, rtl_uString*, RegValue);
70 	RegError 	(REGISTRY_CALLTYPE *getLongListValue)	(RegKeyHandle, rtl_uString*, sal_Int32**, sal_uInt32*);
71 	RegError 	(REGISTRY_CALLTYPE *getStringListValue)	(RegKeyHandle, rtl_uString*, sal_Char***, sal_uInt32*);
72 	RegError 	(REGISTRY_CALLTYPE *getUnicodeListValue)(RegKeyHandle, rtl_uString*, sal_Unicode***, sal_uInt32*);
73 	RegError 	(REGISTRY_CALLTYPE *freeValueList)		(RegValueType, RegValue, sal_uInt32);
74 	RegError 	(REGISTRY_CALLTYPE *createLink) 		(RegKeyHandle, rtl_uString*, rtl_uString*);
75 	RegError 	(REGISTRY_CALLTYPE *deleteLink)			(RegKeyHandle, rtl_uString*);
76 	RegError 	(REGISTRY_CALLTYPE *getKeyType)			(RegKeyHandle, rtl_uString*, RegKeyType*);
77 	RegError 	(REGISTRY_CALLTYPE *getLinkTarget)		(RegKeyHandle, rtl_uString*, rtl_uString**);
78 	RegError 	(REGISTRY_CALLTYPE *getResolvedKeyName)	(RegKeyHandle, rtl_uString*, sal_Bool, rtl_uString**);
79 	RegError 	(REGISTRY_CALLTYPE *getKeyNames)		(RegKeyHandle, rtl_uString*, rtl_uString***, sal_uInt32*);
80 	RegError 	(REGISTRY_CALLTYPE *freeKeyNames)		(rtl_uString**, sal_uInt32);
81 };
82 
83 /** the API initialization function.
84 */
85 REGISTRY_DLLPUBLIC Registry_Api* REGISTRY_CALLTYPE initRegistry_Api(void);
86 
87 #ifdef __cplusplus
88 }
89 #endif
90 
91 
92 class RegistryKey;
93 
94 //-----------------------------------------------------------------------------
95 
96 /** The Registry provides the functionality to read and write information in a registry file.
97 
98 	The class is implemented inline and use a C-Api.
99 */
100 class Registry
101 {
102 public:
103 	/** Default constructor.
104 	 */
105 	inline Registry();
106 
107 	/// Copy constructcor
108 	inline Registry(const Registry& toCopy);
109 
110 	/// Destructor. The Destructor close the registry if it is open.
111 	inline ~Registry();
112 
113 	/// Assign operator
114 	inline Registry& operator = (const Registry& toAssign);
115 
116 	/// checks if the registry points to a valid registry data file.
117 	inline sal_Bool	isValid() const;
118 
119 	/**	returns the access mode of the registry.
120 
121 		@return	TRUE if the access mode is readonly else FALSE.
122 	*/
123 	inline sal_Bool 	isReadOnly() const;
124 
125 	/**	opens the root key of the registry.
126 
127 		@param 	rRootKey reference to a RegistryKey which is filled with the rootkey.
128 		@return	REG_NO_ERROR if succeeds else an error code.
129 	*/
130 	inline RegError openRootKey(RegistryKey& rRootKey);
131 
132 	/// returns the name of the current registry data file.
133 	inline ::rtl::OUString getName();
134 
135 	/**	creates a new registry with the specified name and creates a root key.
136 
137 		@param	registryName specifies the name of the new registry.
138 		@return	REG_NO_ERROR if succeeds else an error code.
139 	*/
140 	inline RegError create(const ::rtl::OUString& registryName);
141 
142 	/**	opens a registry with the specified name.
143 
144         If the registry already points to a valid registry, the old registry will be closed.
145 		@param	registryName specifies a registry name.
146 		@param 	accessMode specifies the access mode for the registry, REG_READONLY or REG_READWRITE.
147 		@return	REG_NO_ERROR if succeeds else an error code.
148 	*/
149 	inline RegError open(const ::rtl::OUString& registryName,
150 					   	 RegAccessMode accessMode);
151 
152 	/// closes explicitly the current registry data file.
153 	inline RegError close();
154 
155 	/**	destroys a registry.
156 
157 		@param registryName specifies a registry name, if the name is an empty string the registry
158                             itselfs will be destroyed.
159 		@return	REG_NO_ERROR if succeeds else an error code.
160 	*/
161 	inline RegError destroy(const ::rtl::OUString& registryName);
162 
163 	/**	loads registry information from a specified file and save it under the
164 		specified keyName.
165 
166         @param	rKey references a currently open key. The key which should store the registry information
167                      is a subkey of this key.
168         @param	keyName	specifies the name of the key which stores the registry information. If keyName is
169                         is an empty string the registry information will be saved under the key specified
170                         by rKey.
171 		@param	regFileName	specifies the file containing the registry information.
172 		@return	REG_NO_ERROR if succeeds else an error code.
173 	*/
174 	inline RegError loadKey(RegistryKey& rKey,
175 				  			 const ::rtl::OUString& keyName,
176 				  			 const ::rtl::OUString& regFileName);
177 
178 	/**	saves the registry information of the specified key and all subkeys and save
179 		it in the specified file.
180 
181 		@param	rKey references a currently open key. The key which information is saved by this
182                      function is a subkey of this key.
183 		@param	keyName	specifies the name of the key which information should be stored.
184                         If keyName is an empty string the registry information under the key specified
185                         by rKey is saved in the specified file.
186 		@param	regFileName	specifies the file containing the registry information.
187 		@return	REG_NO_ERROR if succeeds else an error code.
188 	*/
189 	inline RegError saveKey(RegistryKey& rKey,
190 				  			 const ::rtl::OUString& keyName,
191 				  			 const ::rtl::OUString& regFileName);
192 
193 	/**	merges the registry information of the specified key with the registry
194 		information of the specified file.
195 
196         All existing keys will be extended and existing key values will be overwritten.
197 		@param	rKey references a currently open key. The key which information is merged by this
198                      function is a subkey of this key
199 		@param	keyName	specifies the name of the key which will be merged.
200                         If keyName is an empty string the registry information under the key specified
201                         by rKey is merged with the information from the specified file.
202 		@param	regFileName	specifies the file containing the registry information.
203 		@param	bWarnings if TRUE the function returns an error if a key already exists.
204 		@param	bReport if TRUE the function reports warnings on stdout if a key already exists.
205 		@return	REG_NO_ERROR if succeeds else an error code. If it returns an error the registry will
206                 restore the state before merging.
207 	*/
208 	inline RegError mergeKey(RegistryKey& rKey,
209 				   			 const ::rtl::OUString& keyName,
210 				   			 const ::rtl::OUString& regFileName,
211 							 sal_Bool bWarnings = sal_False,
212 				   			 sal_Bool bReport = sal_False);
213 
214     /**	This function reports the complete registry information of a key and all of its subkeys.
215 
216         All information which are available (keynames, value types, values, ...)
217         will be printed to stdout for report issues only.
218 	    @param	rKey references a currently open key which content will be reported.
219 	    @return	REG_NO_ERROR if succeeds else an error code.
220     */
221 	inline RegError dumpRegistry(RegistryKey& rKey);
222 
223 	friend class RegistryKey;
224 	friend class RegistryKeyArray;
225 	friend class RegistryKeyNames;
226 
227     /// returns the used registry Api.
getApi()228 	const Registry_Api* getApi() { return m_pApi; }
229 protected:
230 
231     /// stores the used and initialized registry Api.
232 	const Registry_Api*							 m_pApi;
233     /// stores the handle of the underlying registry file on which most of the functions work.
234 	RegHandle									 m_hImpl;
235 };
236 
237 
238 //-----------------------------------------------------------------------------
239 
240 /** RegistryKeyArray represents an array of open keys.
241 
242 	RegistryKeyArray is a helper class to work with an array of keys.
243 */
244 class RegistryKeyArray
245 {
246 public:
247 	/// Default constructor
248 	inline RegistryKeyArray();
249 
250 	/// Destructor, all subkeys will be closed.
251 	inline ~RegistryKeyArray();
252 
253 	/// returns the open key specified by index.
254 	inline RegistryKey getElement(sal_uInt32 index);
255 
256 	/// returns the length of the array.
257 	inline sal_uInt32 getLength();
258 
259 	friend class RegistryKey;
260 protected:
261     /** sets the data of the key array.
262 
263         @param registry specifies the registry files where the keys are located.
264         @param phKeys points to an array of open keys.
265         @param length specifies the length of the array specified by phKeys.
266      */
267 	inline void setKeyHandles(Registry& registry, RegKeyHandle* phKeys, sal_uInt32 length);
268     /// close all subkeys
269 	inline RegError closeKeyHandles();
270 
271     /// stores the number of open subkeys, the number of elements.
272 	sal_uInt32 	   	m_length;
273     /// stores an array of open subkeys.
274 	RegKeyHandle*	m_phKeys;
275     /// stores the handle to the registry file where the appropriate keys are located.
276 	Registry		m_registry;
277 };
278 
279 
280 /** RegistryKeyNames represents an array of key names.
281 
282 	RegistryKeyNames is a helper class to work with an array of key names.
283 */
284 class RegistryKeyNames
285 {
286 public:
287 	/// Default constructor
288 	inline RegistryKeyNames();
289 
290 	/// Destructor, the internal array with key names will be deleted.
291 	inline ~RegistryKeyNames();
292 
293 	/// returns the name of the key sepecified by index.
294 	inline ::rtl::OUString getElement(sal_uInt32 index);
295 
296 	/// returns the length of the array.
297 	inline sal_uInt32 getLength();
298 
299 	friend class RegistryKey;
300 protected:
301     /** sets the data of the array.
302 
303         @param registry specifies the registry files where the keys are located.
304         @param pKeyNames points to an array of key names.
305         @param length specifies the length of the array specified by pKeyNames.
306      */
307 	inline void setKeyNames(Registry& registry, rtl_uString** pKeyNames, sal_uInt32 length);
308     /// delete the array of key names.
309 	inline RegError freeKeyNames();
310 
311     /// stores the number of key names, the number of elements.
312 	sal_uInt32 		m_length;
313     /// stores an array of key names.
314 	rtl_uString**	m_pKeyNames;
315     /// stores the handle to the registry file where the appropriate keys are located.
316 	Registry		m_registry;
317 };
318 
319 //-----------------------------------------------------------------------------
320 
321 /** RegistryValueList represents a value list of the specified type.
322 
323 	RegistryValueList is a helper class to work with a list value.
324 */
325 template<class ValueType>
326 class RegistryValueList
327 {
328 public:
329 	/// Default constructor
RegistryValueList()330 	RegistryValueList()
331 		: m_length(0)
332 		, m_pValueList(NULL)
333 		, m_valueType(RG_VALUETYPE_NOT_DEFINED)
334 		{}
335 
336 	/// Destructor, the internal value list will be freed.
~RegistryValueList()337 	~RegistryValueList()
338 	{
339 		if (m_pValueList)
340 		{
341 			m_registry.getApi()->freeValueList(m_valueType, m_pValueList, m_length);
342 		}
343 	}
344 
345 	/// returns the value of the list specified by index.
getElement(sal_uInt32 index)346 	ValueType getElement(sal_uInt32 index)
347 	{
348 		if (m_registry.isValid() && index < m_length)
349 		{
350 			return m_pValueList[index];
351 		} else
352 		{
353 			return 0;
354 		}
355 	}
356 
357 	/// returns the length of the list.
getLength()358 	sal_uInt32 getLength()
359 	{
360 		return m_length;
361 	}
362 
363 	friend class RegistryKey;
364 protected:
365     /** sets the data of the value list.
366 
367         @param registry specifies the registry files where the appropriate key is located.
368         @param valueType specifies the type of the list values.
369         @param pValueList points to a value list.
370         @param length specifies the length of the list.
371      */
setValueList(Registry & registry,RegValueType valueType,ValueType * pValueList,sal_uInt32 length)372 	void setValueList(Registry& registry, RegValueType valueType,
373 					  ValueType* pValueList, sal_uInt32 length)
374 	{
375 		m_length = length;
376 		m_pValueList = pValueList;
377 		m_valueType = valueType;
378 		m_registry = registry;
379 	}
380 
381     /// stores the length of the list, the number of elements.
382 	sal_uInt32 		m_length;
383     /// stores the value list.
384 	ValueType*		m_pValueList;
385     /// stores the type of the list elements
386 	RegValueType	m_valueType;
387     /** stores the handle to the registry file where the appropriate key to this
388         value is located.
389     */
390 	Registry		m_registry;
391 };
392 
393 //-----------------------------------------------------------------------------
394 
395 /** RegistryKey reads or writes information of the underlying key in a registry.
396 
397 	Class is inline and use a load on call C-Api.
398 */
399 class RegistryKey
400 {
401 public:
402 	/// Default constructor
403 	inline RegistryKey();
404 
405 	/// Copy constructor
406 	inline RegistryKey(const RegistryKey& toCopy);
407 
408 	/// Destructor, close the key if it references an open one.
409 	inline ~RegistryKey();
410 
411 	/// Assign operator
412 	inline RegistryKey& operator = (const RegistryKey& toAssign);
413 
414 	/// checks if the key points to a valid registry key.
415 	inline sal_Bool	isValid() const;
416 
417 	/**	returns the access mode of the key.
418 
419 		@return	TRUE if access mode is read only else FALSE.
420 	*/
421 	inline sal_Bool 	isReadOnly() const;
422 
423 	/// returns the full qualified name of the key beginning with the rootkey.
424 	inline ::rtl::OUString getName();
425 
426 	/**	creates a new key or opens a key if the specified key already exists.
427 
428         The specified keyname is relativ to this key.
429 		@param	keyName	specifies the name of the key which will be opened or created.
430 		@param	rNewKey	references a RegistryKey which will be filled with the new or open key.
431 		@return	REG_NO_ERROR if succeeds else an error code.
432 	*/
433 	inline RegError createKey(const ::rtl::OUString& keyName,
434 							  RegistryKey& rNewKey);
435 
436 	/**	opens the specified key.
437 
438         The specified keyname is relativ to this key.
439 		@param	keyName	specifies the name of the key which will be opened.
440 		@param	rOpenKey references a RegistryKey which will be filled with the open key.
441 		@return	REG_NO_ERROR if succeeds else an error code.
442 	*/
443 	inline RegError openKey(const ::rtl::OUString& keyName,
444 				  			RegistryKey& rOpenKey);
445 
446 	/**	opens all subkeys of the specified key.
447 
448         The specified keyname is relativ to this key.
449 		@param	keyName	specifies the name of the key which subkeys will be opened.
450 		@param	rSubKeys reference a RegistryKeyArray which will be filled with the open subkeys.
451 		@return	REG_NO_ERROR if succeeds else an error code.
452 	*/
453 	inline RegError openSubKeys(const ::rtl::OUString& keyName,
454 					  	  		RegistryKeyArray& rSubKeys);
455 
456 	/**	returns an array with the names of all subkeys of the specified key.
457 
458         The specified keyname is relativ to this key.
459 		@param	keyName	specifies the name of the key which subkey names will be returned.
460 		@param	rSubKeyNames reference a RegistryKeyNames array which will be filled with the subkey names.
461 		@return	REG_NO_ERROR if succeeds else an error code.
462 	*/
463 	inline RegError getKeyNames(const ::rtl::OUString& keyName,
464 					  	  		RegistryKeyNames& rSubKeyNames);
465 
466 	/**	closes all keys specified in the array.
467 
468 		@param	rSubKeys reference a RegistryKeyArray which contains the open keys.
469 		@return	REG_NO_ERROR if succeeds else an error code.
470 	*/
471 	inline RegError closeSubKeys(RegistryKeyArray& rSubKeys);
472 
473 	/**	deletes the specified key.
474 
475 		@param	keyName	specifies the name of the key which will be deleted.
476 		@return	REG_NO_ERROR if succeeds else an error code.
477 	*/
478 	inline RegError deleteKey(const ::rtl::OUString& keyName);
479 
480 	/// closes explicitly the current key
481 	inline RegError closeKey();
482 
483 	/// releases the current key
484 	inline void releaseKey();
485 
486 	/**	sets a value of a key.
487 
488 		@param	keyName	specifies the name of the key which value will be set.
489                         If keyName is an empty string, the value will be set for the key
490                         specified by hKey.
491 		@param	valueType specifies the type of the value.
492 		@param	pData points to a memory block containing the data for the value.
493 		@param	valueSize specifies the size of pData in bytes
494 		@return	REG_NO_ERROR if succeeds else an error code.
495 	*/
496 	inline RegError setValue(const ::rtl::OUString& keyName,
497 				   			 RegValueType valueType,
498 				   			 RegValue pValue,
499 				   			 sal_uInt32 valueSize);
500 
501 	/**	sets a long list value of a key.
502 
503 		@param	keyName	specifies the name of the key which value will be set.
504                         If keyName is an empty string, the value will be set for the key
505                         specified by hKey.
506 		@param	pValueList points to an array of longs containing the data for the value.
507 		@param	len specifies the length of the list (the array referenced by pValueList).
508 		@return	REG_NO_ERROR if succeeds else an error code.
509 	*/
510 	inline RegError setLongListValue(const ::rtl::OUString& keyName,
511 				   			 		 sal_Int32* pValueList,
512 				   			 		 sal_uInt32 len);
513 
514 	/**	sets an ascii list value of a key.
515 
516 		@param	keyName	specifies the name of the key which value will be set.
517                         If keyName is an empty string, the value will be set for the key
518                         specified by hKey.
519 		@param	pValueList points to an array of sal_Char* containing the data for the value.
520 		@param	len specifies the length of the list (the array referenced by pValueList).
521 		@return	REG_NO_ERROR if succeeds else an error code.
522 	*/
523 	inline RegError setStringListValue(const ::rtl::OUString& keyName,
524 				   			 		   sal_Char** pValueList,
525 				   			 		   sal_uInt32 len);
526 
527 	/**	sets an unicode string list value of a key.
528 
529 		@param	keyName	specifies the name of the key which value will be set.
530                         If keyName is an empty string, the value will be set for the key
531                         specified by hKey.
532 		@param	pValueList points to an array of sal_Unicode* containing the data for the value.
533 		@param	len specifies the length of the list (the array referenced by pValueList).
534 		@return	REG_NO_ERROR if succeeds else an error code.
535 	*/
536 	inline RegError setUnicodeListValue(const ::rtl::OUString& keyName,
537 				   			 		    sal_Unicode** pValueList,
538 				   			 		  	sal_uInt32 len);
539 
540 	/**	gets info about type and size of a value.
541 
542 		@param	keyName	specifies the name of the key which value info will be returned.
543                         If keyName is an empty string, the value info of the key
544                         specified by hKey will be returned.
545 		@param	pValueType returns the type of the value.
546 		@param	pValueSize returns the size of the value in bytes or the length of a list value.
547 		@return	REG_NO_ERROR if succeeds else an error code.
548 	*/
549 	inline RegError getValueInfo(const ::rtl::OUString& keyName,
550 					   			 RegValueType* pValueType,
551 					   			 sal_uInt32* pValueSize);
552 
553 	/**	gets the value of a key.
554 
555 		@param	keyName	specifies the name of the key which value will be returned.
556                         If keyName is an empty string, the value is get from the key
557                         specified by hKey.
558 		@param	pValue points to an allocated memory block receiving the data of the value.
559 		@return	REG_NO_ERROR if succeeds else an error code.
560 	*/
561 	inline RegError getValue(const ::rtl::OUString& keyName,
562 				   			 RegValue pValue);
563 
564 	/**	gets a long list value of a key.
565 
566 		@param	keyName	specifies the name of the key which value will be returned.
567                         If keyName is an empty string, the value is get from the key
568                         specified by hKey.
569 		@param	rValueList references a RegistryValueList which will be filled with the long values.
570 		@return	REG_NO_ERROR if succeeds else an error code.
571 	*/
572 	inline RegError getLongListValue(const ::rtl::OUString& keyName,
573 					  	  			  RegistryValueList<sal_Int32>& rValueList);
574 
575 	/**	gets an ascii list value of a key.
576 
577 		@param	keyName	specifies the name of the key which value will be returned.
578                         If keyName is an empty string, the value is get from the key
579                         specified by hKey.
580 		@param	rValueList references a RegistryValueList which will be filled with the ascii values.
581 		@return	REG_NO_ERROR if succeeds else an error code.
582 	*/
583 	inline RegError getStringListValue(const ::rtl::OUString& keyName,
584 					  	  			   RegistryValueList<sal_Char*>& rValueList);
585 
586 	/**	gets a unicode value of a key.
587 
588 		@param	keyName	specifies the name of the key which value will be returned.
589                         If keyName is an empty string, the value is get from the key
590                         specified by hKey.
591 		@param	rValueList reference a RegistryValueList which will be filled with the unicode values.
592 		@return	REG_NO_ERROR if succeeds else an error code.
593 	*/
594 	inline RegError getUnicodeListValue(const ::rtl::OUString& keyName,
595 					  	  			  	RegistryValueList<sal_Unicode*>& rValueList);
596 
597     /** used to create a link.
598 
599         @obsolete Links are no longer supported.
600 
601         @return	REG_INVALID_LINK
602      */
603 	inline RegError	createLink(const ::rtl::OUString& linkName,
604 							   const ::rtl::OUString& linkTarget);
605 
606     /** used to delete a link.
607 
608         @obsolete Links are no longer supported.
609 
610         @return	REG_INVALID_LINK
611      */
612 	inline RegError	deleteLink(const ::rtl::OUString& linkName);
613 
614     /** returns the type of the specified key.
615 
616         @param name specifies the name of the key or link.
617         @param pKeyType returns the type of the key (always RG_KEYTYPE).
618 		@return	REG_NO_ERROR if succeeds else an error code.
619      */
620 	inline RegError	getKeyType(const ::rtl::OUString& name,
621 						   	   RegKeyType* pKeyType) const;
622 
623     /** used to return the target of a link.
624 
625         @obsolete Links are no longer supported.
626 
627         @return	REG_INVALID_LINK
628      */
629 	inline RegError getLinkTarget(const ::rtl::OUString& linkName,
630 							  	  ::rtl::OUString& rLinkTarget) const;
631 
632 	/** resolves a keyname.
633 
634 		@param	keyName specifies the name of the key which will be resolved relativ to this key.
635                         The resolved name will be prefixed with the name of this key.
636         @param firstLinkOnly ignored
637 		@return	REG_NO_ERROR if succeeds else an error code.
638 	 */
639 	inline RegError getResolvedKeyName(const ::rtl::OUString& keyName,
640 									   sal_Bool firstLinkOnly,
641 						  	  		   ::rtl::OUString& rResolvedName) const;
642 
643 	/// returns the name of the registry in which the key is defined.
644 	inline ::rtl::OUString getRegistryName();
645 
646 	/// returns the registry in which the key is defined.
getRegistry() const647 	Registry getRegistry() const { return m_registry; }
648 
649 	friend class Registry;
650 public:
651     /** Constructor, which initialize a RegistryKey with registry and an valid key handle.
652 
653         This constructor is internal only.
654         @internal
655     */
656 	inline RegistryKey(Registry&	registry,
657 					   RegKeyHandle hKey);
658 
659     /** returns the internal key handle.
660 
661         @internal
662      */
getKeyHandle() const663 	RegKeyHandle getKeyHandle() const { return m_hImpl; }
664 
665 protected:
666     /** sets the internal registry on which this key should work.
667 
668         @internal
669      */
670 	inline void setRegistry(Registry& registry);
671 
672     /// stores the registry on which this key works
673 	Registry		m_registry;
674     /// stores the current key handle of this key
675 	RegKeyHandle	m_hImpl;
676 };
677 
678 
679 //-----------------------------------------------------------------------------
680 
RegistryKeyArray()681 inline RegistryKeyArray::RegistryKeyArray()
682 	: m_length(0)
683 	, m_phKeys(NULL)
684 {
685 }
686 
~RegistryKeyArray()687 inline RegistryKeyArray::~RegistryKeyArray()
688 {
689 	if (m_phKeys)
690 		m_registry.m_pApi->closeSubKeys(m_phKeys, m_length);
691 }
692 
getElement(sal_uInt32 index)693 inline RegistryKey RegistryKeyArray::getElement(sal_uInt32 index)
694 {
695 	if (m_registry.isValid() && index < m_length)
696 		return RegistryKey(m_registry, m_phKeys[index]);
697 	else
698 		return RegistryKey();
699 }
700 
getLength()701 inline sal_uInt32 RegistryKeyArray::getLength()
702 {
703 	return m_length;
704 }
705 
setKeyHandles(Registry & registry,RegKeyHandle * phKeys,sal_uInt32 length)706 inline void RegistryKeyArray::setKeyHandles(Registry& registry,
707 											RegKeyHandle* phKeys,
708 											sal_uInt32 length)
709 {
710 	m_phKeys = phKeys;
711 	m_length = length;
712 	m_registry = registry;
713 }
714 
closeKeyHandles()715 inline RegError RegistryKeyArray::closeKeyHandles()
716 {
717 	if (m_registry.isValid() && m_phKeys)
718 	{
719 		RegError ret;
720 		ret = m_registry.m_pApi->closeSubKeys(m_phKeys, m_length);
721 		m_registry = Registry();
722 		m_length = 0;
723 		m_phKeys = NULL;
724 		return ret;
725 	} else
726 		return(REG_INVALID_KEY);
727 }
728 
729 //-----------------------------------------------------------------------------
730 
RegistryKeyNames()731 inline RegistryKeyNames::RegistryKeyNames()
732 	: m_length(0)
733 	, m_pKeyNames(NULL)
734 {
735 }
736 
~RegistryKeyNames()737 inline RegistryKeyNames::~RegistryKeyNames()
738 {
739 	if (m_pKeyNames)
740 		m_registry.m_pApi->freeKeyNames(m_pKeyNames, m_length);
741 }
742 
getElement(sal_uInt32 index)743 inline ::rtl::OUString RegistryKeyNames::getElement(sal_uInt32 index)
744 {
745 
746 	if (m_pKeyNames && index < m_length)
747 		return m_pKeyNames[index];
748 	else
749 		return ::rtl::OUString();
750 }
751 
getLength()752 inline sal_uInt32 RegistryKeyNames::getLength()
753 {
754 	return m_length;
755 }
756 
setKeyNames(Registry & registry,rtl_uString ** pKeyNames,sal_uInt32 length)757 inline void RegistryKeyNames::setKeyNames(Registry& registry,
758 										  rtl_uString** pKeyNames,
759 										  sal_uInt32 length)
760 {
761 	m_pKeyNames = pKeyNames;
762 	m_length = length;
763 	m_registry = registry;
764 }
765 
freeKeyNames()766 inline RegError RegistryKeyNames::freeKeyNames()
767 {
768 	if (m_registry.isValid() && m_pKeyNames)
769 	{
770 		RegError ret = REG_NO_ERROR;
771 		ret = m_registry.m_pApi->freeKeyNames(m_pKeyNames, m_length);
772 		m_registry = Registry();
773 		m_length = 0;
774 		m_pKeyNames = NULL;
775 		return ret;
776 	} else
777 		return REG_INVALID_KEY;
778 }
779 
780 //-----------------------------------------------------------------------------
781 
RegistryKey()782 inline RegistryKey::RegistryKey()
783 	: m_hImpl(NULL)
784 	{ }
785 
RegistryKey(Registry & registry,RegKeyHandle hKey)786 inline RegistryKey::RegistryKey(Registry& registry, RegKeyHandle hKey)
787 	: m_registry(registry)
788 	, m_hImpl(hKey)
789 	{
790 		if (m_hImpl)
791 			m_registry.m_pApi->acquireKey(m_hImpl);
792 	}
793 
RegistryKey(const RegistryKey & toCopy)794 inline RegistryKey::RegistryKey(const RegistryKey& toCopy)
795 	: m_registry(toCopy.m_registry)
796 	, m_hImpl(toCopy.m_hImpl)
797 	{
798 		if (m_hImpl)
799 			m_registry.m_pApi->acquireKey(m_hImpl);
800 	}
801 
setRegistry(Registry & registry)802 inline void RegistryKey::setRegistry(Registry& registry)
803 	{
804 		m_registry = registry;
805 	}
806 
~RegistryKey()807 inline RegistryKey::~RegistryKey()
808 	{
809 		if (m_hImpl)
810 			m_registry.m_pApi->releaseKey(m_hImpl);
811 	}
812 
operator =(const RegistryKey & toAssign)813 inline RegistryKey& RegistryKey::operator = (const RegistryKey& toAssign)
814 {
815 	m_registry = toAssign.m_registry;
816 
817 	if (toAssign.m_hImpl)
818 		m_registry.m_pApi->acquireKey(toAssign.m_hImpl);
819 	if (m_hImpl)
820 		m_registry.m_pApi->releaseKey(m_hImpl);
821 	m_hImpl = toAssign.m_hImpl;
822 
823 	return *this;
824 }
825 
isValid() const826 inline sal_Bool RegistryKey::isValid() const
827 	{  return (m_hImpl != NULL); }
828 
isReadOnly() const829 inline sal_Bool RegistryKey::isReadOnly() const
830 	{
831 		if 	(m_registry.isValid())
832 			return (m_registry.m_pApi)->isKeyReadOnly(m_hImpl);
833 		else
834 			return sal_False;
835 	}
836 
getName()837 inline ::rtl::OUString RegistryKey::getName()
838 	{
839 		::rtl::OUString sRet;
840 		if (m_registry.isValid())
841 			m_registry.m_pApi->getKeyName(m_hImpl, &sRet.pData);
842 		return sRet;;
843 	}
844 
createKey(const::rtl::OUString & keyName,RegistryKey & rNewKey)845 inline RegError RegistryKey::createKey(const ::rtl::OUString& keyName,
846 						   			   RegistryKey& rNewKey)
847 	{
848 		if (rNewKey.isValid()) rNewKey.closeKey();
849 		if (m_registry.isValid())
850 		{
851 			RegError ret = m_registry.m_pApi->createKey(m_hImpl, keyName.pData, &rNewKey.m_hImpl);
852 			if (!ret) rNewKey.setRegistry(m_registry);
853 			return ret;
854 		} else
855 			return REG_INVALID_KEY;
856 	}
857 
openKey(const::rtl::OUString & keyName,RegistryKey & rOpenKey)858 inline RegError RegistryKey::openKey(const ::rtl::OUString& keyName,
859 			  			 		  RegistryKey& rOpenKey)
860 	{
861 		if (rOpenKey.isValid()) rOpenKey.closeKey();
862 		if (m_registry.isValid())
863 		{
864 			RegError ret = m_registry.m_pApi->openKey(m_hImpl, keyName.pData,
865 													&rOpenKey.m_hImpl);
866 			if (!ret) rOpenKey.setRegistry(m_registry);
867 			return ret;
868 		} else
869 			return REG_INVALID_KEY;
870 	}
871 
openSubKeys(const::rtl::OUString & keyName,RegistryKeyArray & rSubKeys)872 inline RegError RegistryKey::openSubKeys(const ::rtl::OUString& keyName,
873 										 RegistryKeyArray& rSubKeys)
874 	{
875 		if (m_registry.isValid())
876 		{
877 			RegError 		ret = REG_NO_ERROR;
878 			RegKeyHandle* 	pSubKeys;
879 			sal_uInt32 		nSubKeys;
880 	 		ret = m_registry.m_pApi->openSubKeys(m_hImpl, keyName.pData,
881 	 												 &pSubKeys, &nSubKeys);
882 	 		if ( ret )
883 			{
884 				return ret;
885 			} else
886 			{
887 				rSubKeys.setKeyHandles(m_registry, pSubKeys, nSubKeys);
888 				return ret;
889 			}
890 		} else
891 			return REG_INVALID_KEY;
892 	}
893 
getKeyNames(const::rtl::OUString & keyName,RegistryKeyNames & rSubKeyNames)894 inline RegError RegistryKey::getKeyNames(const ::rtl::OUString& keyName,
895 					  	  				 RegistryKeyNames& rSubKeyNames)
896 	{
897 		if (m_registry.isValid())
898 		{
899 			RegError 		ret = REG_NO_ERROR;
900 			rtl_uString**	pSubKeyNames;
901 			sal_uInt32 		nSubKeys;
902 	 		ret = m_registry.m_pApi->getKeyNames(m_hImpl, keyName.pData,
903 	 											 &pSubKeyNames, &nSubKeys);
904 	 		if ( ret )
905 			{
906 				return ret;
907 			} else
908 			{
909 				rSubKeyNames.setKeyNames(m_registry, pSubKeyNames, nSubKeys);
910 				return ret;
911 			}
912 		} else
913 			return REG_INVALID_KEY;
914 	}
915 
closeSubKeys(RegistryKeyArray & rSubKeys)916 inline RegError RegistryKey::closeSubKeys(RegistryKeyArray& rSubKeys)
917 	{
918 		if (m_registry.isValid())
919 			return rSubKeys.closeKeyHandles();
920 		else
921 			return REG_INVALID_KEY;
922 	}
923 
deleteKey(const::rtl::OUString & keyName)924 inline RegError RegistryKey::deleteKey(const ::rtl::OUString& keyName)
925 	{
926 		if (m_registry.isValid())
927 			return m_registry.m_pApi->deleteKey(m_hImpl, keyName.pData);
928 		else
929 			return REG_INVALID_KEY;
930 	}
931 
closeKey()932 inline RegError RegistryKey::closeKey()
933 	{
934 		if (m_registry.isValid())
935 		{
936 			RegError ret = m_registry.m_pApi->closeKey(m_hImpl);
937 			if (!ret)
938 			{
939 				m_hImpl = NULL;
940 				m_registry = Registry();
941 			}
942 			return ret;
943 		} else
944 			return REG_INVALID_KEY;
945 	}
946 
releaseKey()947 inline void RegistryKey::releaseKey()
948 {
949 	if (m_registry.isValid() && (m_hImpl != 0))
950 	{
951 		m_registry.m_pApi->releaseKey(m_hImpl), m_hImpl = 0;
952 	}
953 }
954 
setValue(const::rtl::OUString & keyName,RegValueType valueType,RegValue pValue,sal_uInt32 valueSize)955 inline RegError RegistryKey::setValue(const ::rtl::OUString& keyName,
956 			   			  		   	  RegValueType valueType,
957 			   			  		      RegValue pValue,
958 			   			  		   	  sal_uInt32 valueSize)
959 	{
960 		if (m_registry.isValid())
961 			return m_registry.m_pApi->setValue(m_hImpl, keyName.pData, valueType,
962 								 			   pValue, valueSize);
963 		else
964 			return REG_INVALID_KEY;
965 	}
966 
setLongListValue(const::rtl::OUString & keyName,sal_Int32 * pValueList,sal_uInt32 len)967 inline RegError RegistryKey::setLongListValue(const ::rtl::OUString& keyName,
968 			   			 					  sal_Int32* pValueList,
969 						   			 		  sal_uInt32 len)
970 	{
971 		if (m_registry.isValid())
972 			return m_registry.m_pApi->setLongListValue(m_hImpl, keyName.pData,
973 								 			   		   pValueList, len);
974 		else
975 			return REG_INVALID_KEY;
976 	}
977 
setStringListValue(const::rtl::OUString & keyName,sal_Char ** pValueList,sal_uInt32 len)978 inline RegError RegistryKey::setStringListValue(const ::rtl::OUString& keyName,
979 			   			 					   sal_Char** pValueList,
980 						   			 		   sal_uInt32 len)
981 	{
982 		if (m_registry.isValid())
983 			return m_registry.m_pApi->setStringListValue(m_hImpl, keyName.pData,
984 								 			   			pValueList, len);
985 		else
986 			return REG_INVALID_KEY;
987 	}
988 
setUnicodeListValue(const::rtl::OUString & keyName,sal_Unicode ** pValueList,sal_uInt32 len)989 inline RegError RegistryKey::setUnicodeListValue(const ::rtl::OUString& keyName,
990 			   			 					   	 sal_Unicode** pValueList,
991 						   			 		   	 sal_uInt32 len)
992 	{
993 		if (m_registry.isValid())
994 			return m_registry.m_pApi->setUnicodeListValue(m_hImpl, keyName.pData,
995 								 			   			  pValueList, len);
996 		else
997 			return REG_INVALID_KEY;
998 	}
999 
getValueInfo(const::rtl::OUString & keyName,RegValueType * pValueType,sal_uInt32 * pValueSize)1000 inline RegError RegistryKey::getValueInfo(const ::rtl::OUString& keyName,
1001 				   			  		   	  RegValueType* pValueType,
1002 				   			  		   	  sal_uInt32* pValueSize)
1003 	{
1004 		if (m_registry.isValid())
1005 			return m_registry.m_pApi->getValueInfo(m_hImpl, keyName.pData, pValueType, pValueSize);
1006 		else
1007 			return REG_INVALID_KEY;
1008 	}
1009 
getValue(const::rtl::OUString & keyName,RegValue pValue)1010 inline RegError RegistryKey::getValue(const ::rtl::OUString& keyName,
1011 			   			  		   RegValue pValue)
1012 	{
1013 		if (m_registry.isValid())
1014 			return m_registry.m_pApi->getValue(m_hImpl, keyName.pData, pValue);
1015 		else
1016 			return REG_INVALID_KEY;
1017 	}
1018 
getLongListValue(const::rtl::OUString & keyName,RegistryValueList<sal_Int32> & rValueList)1019 inline RegError RegistryKey::getLongListValue(const ::rtl::OUString& keyName,
1020 				  	  			  		RegistryValueList<sal_Int32>& rValueList)
1021 	{
1022 		if (m_registry.isValid())
1023 		{
1024 			RegError 	ret = REG_NO_ERROR;
1025 			sal_Int32* 	pValueList;
1026 			sal_uInt32 	length;
1027 	 		ret = m_registry.m_pApi->getLongListValue(m_hImpl, keyName.pData,
1028 	 												 &pValueList, &length);
1029 	 		if ( ret )
1030 			{
1031 				return ret;
1032 			} else
1033 			{
1034 				rValueList.setValueList(m_registry, RG_VALUETYPE_LONGLIST,
1035 										pValueList, length);
1036 				return ret;
1037 			}
1038 		} else
1039 			return REG_INVALID_KEY;
1040 	}
1041 
getStringListValue(const::rtl::OUString & keyName,RegistryValueList<sal_Char * > & rValueList)1042 inline RegError RegistryKey::getStringListValue(const ::rtl::OUString& keyName,
1043 				  	  			  				RegistryValueList<sal_Char*>& rValueList)
1044 	{
1045 		if (m_registry.isValid())
1046 		{
1047 			RegError 	ret = REG_NO_ERROR;
1048 			sal_Char** 	pValueList;
1049 			sal_uInt32 	length;
1050 	 		ret = m_registry.m_pApi->getStringListValue(m_hImpl, keyName.pData,
1051 	 												 &pValueList, &length);
1052 	 		if ( ret )
1053 			{
1054 				return ret;
1055 			} else
1056 			{
1057 				rValueList.setValueList(m_registry, RG_VALUETYPE_STRINGLIST,
1058 										pValueList, length);
1059 				return ret;
1060 			}
1061 		} else
1062 			return REG_INVALID_KEY;
1063 	}
1064 
getUnicodeListValue(const::rtl::OUString & keyName,RegistryValueList<sal_Unicode * > & rValueList)1065 inline RegError RegistryKey::getUnicodeListValue(const ::rtl::OUString& keyName,
1066 				  	  			  		RegistryValueList<sal_Unicode*>& rValueList)
1067 	{
1068 		if (m_registry.isValid())
1069 		{
1070 			RegError 		ret = REG_NO_ERROR;
1071 			sal_Unicode** 	pValueList;
1072 			sal_uInt32 		length;
1073 	 		ret = m_registry.m_pApi->getUnicodeListValue(m_hImpl, keyName.pData,
1074 	 												 &pValueList, &length);
1075 	 		if ( ret )
1076 			{
1077 				return ret;
1078 			} else
1079 			{
1080 				rValueList.setValueList(m_registry, RG_VALUETYPE_UNICODELIST,
1081 										pValueList, length);
1082 				return ret;
1083 			}
1084 		} else
1085 			return REG_INVALID_KEY;
1086 	}
1087 
createLink(const::rtl::OUString & linkName,const::rtl::OUString & linkTarget)1088 inline RegError	RegistryKey::createLink(const ::rtl::OUString& linkName,
1089 						   				const ::rtl::OUString& linkTarget)
1090 	{
1091 		if (m_registry.isValid())
1092 			return m_registry.m_pApi->createLink(m_hImpl, linkName.pData, linkTarget.pData);
1093 		else
1094 			return REG_INVALID_KEY;
1095 	}
1096 
deleteLink(const::rtl::OUString & linkName)1097 inline RegError	RegistryKey::deleteLink(const ::rtl::OUString& linkName)
1098 	{
1099 		if (m_registry.isValid())
1100 			return m_registry.m_pApi->deleteLink(m_hImpl, linkName.pData);
1101 		else
1102 			return REG_INVALID_KEY;
1103 	}
1104 
getKeyType(const::rtl::OUString & keyName,RegKeyType * pKeyType) const1105 inline RegError	RegistryKey::getKeyType(const ::rtl::OUString& keyName,
1106 					   	   				RegKeyType* pKeyType) const
1107 	{
1108 		if (m_registry.isValid())
1109 			return m_registry.m_pApi->getKeyType(m_hImpl, keyName.pData, pKeyType);
1110 		else
1111 			return REG_INVALID_KEY;
1112 	}
1113 
getLinkTarget(const::rtl::OUString & linkName,::rtl::OUString & rLinkTarget) const1114 inline RegError RegistryKey::getLinkTarget(const ::rtl::OUString& linkName,
1115 						  	  			   ::rtl::OUString& rLinkTarget) const
1116 	{
1117 		if (m_registry.isValid())
1118 		{
1119 			return m_registry.m_pApi->getLinkTarget(m_hImpl,
1120 													linkName.pData,
1121 													&rLinkTarget.pData);
1122 		} else
1123 			return REG_INVALID_KEY;
1124 	}
1125 
1126 
getResolvedKeyName(const::rtl::OUString & keyName,sal_Bool firstLinkOnly,::rtl::OUString & rResolvedName) const1127 inline RegError RegistryKey::getResolvedKeyName(const ::rtl::OUString& keyName,
1128 								   				sal_Bool firstLinkOnly,
1129 					  	  		   				::rtl::OUString& rResolvedName) const
1130 	{
1131 		if (m_registry.isValid())
1132 			return m_registry.m_pApi->getResolvedKeyName(m_hImpl,
1133 														 keyName.pData,
1134 														 firstLinkOnly,
1135 														 &rResolvedName.pData);
1136 		else
1137 			return REG_INVALID_KEY;
1138 	}
1139 
getRegistryName()1140 inline ::rtl::OUString RegistryKey::getRegistryName()
1141 	{
1142 		if (m_registry.isValid())
1143 		{
1144 			return m_registry.getName();
1145 		} else
1146 			return ::rtl::OUString();
1147 	}
1148 
1149 //-----------------------------------------------------------------------------
1150 
Registry()1151 inline Registry::Registry()
1152 	: m_pApi(initRegistry_Api())
1153 	, m_hImpl(NULL)
1154 	{ }
1155 
Registry(const Registry & toCopy)1156 inline Registry::Registry(const Registry& toCopy)
1157 	: m_pApi(toCopy.m_pApi)
1158 	, m_hImpl(toCopy.m_hImpl)
1159 	{
1160 		if (m_hImpl)
1161 			m_pApi->acquire(m_hImpl);
1162 	}
1163 
1164 
~Registry()1165 inline Registry::~Registry()
1166 	{
1167 		if (m_hImpl)
1168 			m_pApi->release(m_hImpl);
1169 	}
1170 
operator =(const Registry & toAssign)1171 inline Registry& Registry::operator = (const Registry& toAssign)
1172 {
1173 	if (toAssign.m_hImpl)
1174 		toAssign.m_pApi->acquire(toAssign.m_hImpl);
1175 	if (m_hImpl)
1176 		m_pApi->release(m_hImpl);
1177 
1178 	m_pApi  = toAssign.m_pApi;
1179 	m_hImpl = toAssign.m_hImpl;
1180 
1181 	return *this;
1182 }
1183 
isValid() const1184 inline sal_Bool Registry::isValid() const
1185 	{  return ( m_hImpl != NULL ); }
1186 
isReadOnly() const1187 inline sal_Bool Registry::isReadOnly() const
1188 	{  return m_pApi->isReadOnly(m_hImpl); }
1189 
openRootKey(RegistryKey & rRootKey)1190 inline RegError Registry::openRootKey(RegistryKey& rRootKey)
1191 	{
1192 		rRootKey.setRegistry(*this);
1193 		return m_pApi->openRootKey(m_hImpl, &rRootKey.m_hImpl);
1194 	}
1195 
getName()1196 inline ::rtl::OUString Registry::getName()
1197 	{
1198 		::rtl::OUString sRet;
1199 		m_pApi->getName(m_hImpl, &sRet.pData);
1200 		return sRet;
1201 	}
1202 
create(const::rtl::OUString & registryName)1203 inline RegError Registry::create(const ::rtl::OUString& registryName)
1204 	{
1205 		if (m_hImpl)
1206 			m_pApi->release(m_hImpl);
1207 		return m_pApi->createRegistry(registryName.pData, &m_hImpl);
1208 	}
1209 
open(const::rtl::OUString & registryName,RegAccessMode accessMode)1210 inline RegError Registry::open(const ::rtl::OUString& registryName,
1211 				   			   RegAccessMode accessMode)
1212 	{
1213 		if (m_hImpl)
1214 			m_pApi->release(m_hImpl);
1215 		return m_pApi->openRegistry(registryName.pData, &m_hImpl, accessMode);
1216 	}
1217 
close()1218 inline RegError Registry::close()
1219 	{
1220 		RegError ret = m_pApi->closeRegistry(m_hImpl);
1221 		if (!ret)
1222 			m_hImpl = NULL;
1223 		return ret;
1224 	}
1225 
destroy(const::rtl::OUString & registryName)1226 inline RegError Registry::destroy(const ::rtl::OUString& registryName)
1227 	{
1228 		RegError ret = m_pApi->destroyRegistry(m_hImpl, registryName.pData);
1229 		if ( !ret && (registryName.getLength() == 0) )
1230 			m_hImpl = NULL;
1231 		return ret;
1232 	}
1233 
loadKey(RegistryKey & rKey,const::rtl::OUString & keyName,const::rtl::OUString & regFileName)1234 inline RegError Registry::loadKey(RegistryKey& rKey,
1235 			  			 		   const ::rtl::OUString& keyName,
1236 			  			 		   const ::rtl::OUString& regFileName)
1237 	{  return m_pApi->loadKey(m_hImpl, rKey.m_hImpl, keyName.pData, regFileName.pData); }
1238 
saveKey(RegistryKey & rKey,const::rtl::OUString & keyName,const::rtl::OUString & regFileName)1239 inline RegError Registry::saveKey(RegistryKey& rKey,
1240 			  			 		  const ::rtl::OUString& keyName,
1241 			  			 		  const ::rtl::OUString& regFileName)
1242 	{  return m_pApi->saveKey(m_hImpl, rKey.m_hImpl, keyName.pData, regFileName.pData); }
1243 
mergeKey(RegistryKey & rKey,const::rtl::OUString & keyName,const::rtl::OUString & regFileName,sal_Bool bWarnings,sal_Bool bReport)1244 inline RegError Registry::mergeKey(RegistryKey& rKey,
1245 			   			  			const ::rtl::OUString& keyName,
1246 			   			  			const ::rtl::OUString& regFileName,
1247 			   			  			sal_Bool bWarnings,
1248 			   			  			sal_Bool bReport)
1249 	{  return m_pApi->mergeKey(m_hImpl, rKey.m_hImpl, keyName.pData, regFileName.pData, bWarnings, bReport); }
1250 
dumpRegistry(RegistryKey & rKey)1251 inline RegError Registry::dumpRegistry(RegistryKey& rKey)
1252 	{  return m_pApi->dumpRegistry(m_hImpl, rKey.m_hImpl); }
1253 
1254 
1255 #endif
1256