xref: /trunk/main/registry/source/regkey.cxx (revision 51134e9e)
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 "regkey.hxx"
28 
29 #include	<registry/registry.hxx>
30 #include	<rtl/alloc.h>
31 #include	"regimpl.hxx"
32 #include	"keyimpl.hxx"
33 
34 using rtl::OUString;
35 
36 //*********************************************************************
37 //	acquireKey
38 //
acquireKey(RegKeyHandle hKey)39 void REGISTRY_CALLTYPE acquireKey(RegKeyHandle hKey)
40 {
41 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
42 	if (pKey != 0)
43 	{
44 		ORegistry* pReg = pKey->getRegistry();
45 		(void) pReg->acquireKey(pKey);
46 	}
47 }
48 
49 
50 //*********************************************************************
51 //	releaseKey
52 //
releaseKey(RegKeyHandle hKey)53 void REGISTRY_CALLTYPE releaseKey(RegKeyHandle hKey)
54 {
55 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
56 	if (pKey != 0)
57 	{
58 		ORegistry* pReg = pKey->getRegistry();
59 		(void) pReg->releaseKey(pKey);
60 	}
61 }
62 
63 
64 //*********************************************************************
65 //	isKeyReadOnly
66 //
isKeyReadOnly(RegKeyHandle hKey)67 sal_Bool REGISTRY_CALLTYPE isKeyReadOnly(RegKeyHandle hKey)
68 {
69 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
70 	return (pKey != 0) ? pKey->isReadOnly() : sal_False;
71 }
72 
73 
74 //*********************************************************************
75 //	getKeyName
76 //
getKeyName(RegKeyHandle hKey,rtl_uString ** pKeyName)77 RegError REGISTRY_CALLTYPE getKeyName(RegKeyHandle hKey, rtl_uString** pKeyName)
78 {
79 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
80 	if (pKey)
81 	{
82 		rtl_uString_assign( pKeyName, pKey->getName().pData );
83 		return REG_NO_ERROR;
84 	} else
85 	{
86 		rtl_uString_new(pKeyName);
87 		return REG_INVALID_KEY;
88 	}
89 }
90 
91 
92 //*********************************************************************
93 //	createKey
94 //
createKey(RegKeyHandle hKey,rtl_uString * keyName,RegKeyHandle * phNewKey)95 RegError REGISTRY_CALLTYPE createKey(RegKeyHandle hKey,
96 									 rtl_uString* keyName,
97 									 RegKeyHandle* phNewKey)
98 {
99 	*phNewKey = 0;
100 
101 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
102 	if (!pKey)
103 		return REG_INVALID_KEY;
104 
105 	if (pKey->isDeleted())
106 		return REG_INVALID_KEY;
107 
108 	if (pKey->isReadOnly())
109 		return REG_REGISTRY_READONLY;
110 
111 	return pKey->createKey(keyName, phNewKey);
112 }
113 
114 //*********************************************************************
115 //	openKey
116 //
openKey(RegKeyHandle hKey,rtl_uString * keyName,RegKeyHandle * phOpenKey)117 RegError REGISTRY_CALLTYPE openKey(RegKeyHandle hKey,
118 								   rtl_uString* keyName,
119 								   RegKeyHandle* phOpenKey)
120 {
121 	*phOpenKey = 0;
122 
123 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
124 	if (!pKey)
125 		return REG_INVALID_KEY;
126 
127 	if (pKey->isDeleted())
128 		return REG_INVALID_KEY;
129 
130 	return pKey->openKey(keyName, phOpenKey);
131 }
132 
133 //*********************************************************************
134 //	openSubKeys
135 //
openSubKeys(RegKeyHandle hKey,rtl_uString * keyName,RegKeyHandle ** pphSubKeys,sal_uInt32 * pnSubKeys)136 RegError REGISTRY_CALLTYPE openSubKeys(RegKeyHandle hKey,
137 									   rtl_uString* keyName,
138 									   RegKeyHandle** pphSubKeys,
139 									   sal_uInt32* pnSubKeys)
140 {
141 	*pphSubKeys = NULL;
142 	*pnSubKeys = 0;
143 
144 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
145 	if (!pKey)
146 		return REG_INVALID_KEY;
147 
148 	if (pKey->isDeleted())
149 		return REG_INVALID_KEY;
150 
151 	return pKey->openSubKeys(keyName, pphSubKeys, pnSubKeys);
152 }
153 
154 //*********************************************************************
155 //	closeSubKeys
156 //
closeSubKeys(RegKeyHandle * phSubKeys,sal_uInt32 nSubKeys)157 RegError REGISTRY_CALLTYPE closeSubKeys(RegKeyHandle* phSubKeys,
158 										sal_uInt32 nSubKeys)
159 {
160 	if (phSubKeys == 0 || nSubKeys == 0)
161 		return REG_INVALID_KEY;
162 
163 	ORegistry* pReg = ((ORegKey*)(phSubKeys[0]))->getRegistry();
164 	for (sal_uInt32 i = 0; i < nSubKeys; i++)
165 	{
166 		(void) pReg->closeKey(phSubKeys[i]);
167 	}
168 	rtl_freeMemory(phSubKeys);
169 
170 	return REG_NO_ERROR;
171 }
172 
173 //*********************************************************************
174 //	deleteKey
175 //
deleteKey(RegKeyHandle hKey,rtl_uString * keyName)176 RegError REGISTRY_CALLTYPE deleteKey(RegKeyHandle hKey,
177 									 rtl_uString* keyName)
178 {
179 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
180 	if (!pKey)
181 		return REG_INVALID_KEY;
182 
183 	if (pKey->isDeleted())
184 		return REG_INVALID_KEY;
185 
186 	if (pKey->isReadOnly())
187 		return REG_REGISTRY_READONLY;
188 
189 	return pKey->deleteKey(keyName);
190 }
191 
192 //*********************************************************************
193 //	closeKey
194 //
closeKey(RegKeyHandle hKey)195 RegError REGISTRY_CALLTYPE closeKey(RegKeyHandle hKey)
196 {
197 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
198 	if (!pKey)
199 		return REG_INVALID_KEY;
200 
201 	return pKey->closeKey(hKey);
202 }
203 
204 //*********************************************************************
205 //	setValue
206 //
setValue(RegKeyHandle hKey,rtl_uString * keyName,RegValueType valueType,RegValue pData,sal_uInt32 valueSize)207 RegError REGISTRY_CALLTYPE setValue(RegKeyHandle hKey,
208 								   	rtl_uString* keyName,
209 								   	RegValueType valueType,
210 								   	RegValue pData,
211 								   	sal_uInt32 valueSize)
212 {
213 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
214 	if (!pKey)
215 		return REG_INVALID_KEY;
216 
217 	if (pKey->isDeleted())
218 		return REG_INVALID_KEY;
219 
220 	if (pKey->isReadOnly())
221 		return REG_REGISTRY_READONLY;
222 
223 	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
224 	if (keyName->length)
225 	{
226 		ORegKey* pSubKey = 0;
227 		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
228 		if (_ret1 != REG_NO_ERROR)
229 			return _ret1;
230 
231         _ret1 = pSubKey->setValue(valueName, valueType, pData, valueSize);
232 		if (_ret1 != REG_NO_ERROR)
233 		{
234             RegError _ret2 = pKey->closeKey(pSubKey);
235 			if (_ret2)
236 				return _ret2;
237 			else
238 				return _ret1;
239 		}
240 
241 		return pKey->closeKey(pSubKey);
242 	}
243 
244 	return pKey->setValue(valueName, valueType, pData, valueSize);
245 }
246 
247 //*********************************************************************
248 //	setLongValueList
249 //
setLongListValue(RegKeyHandle hKey,rtl_uString * keyName,sal_Int32 * pValueList,sal_uInt32 len)250 RegError REGISTRY_CALLTYPE setLongListValue(RegKeyHandle hKey,
251 						   		 	  		rtl_uString* keyName,
252 				   			 		  		sal_Int32* pValueList,
253 				   			 		  		sal_uInt32 len)
254 {
255 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
256 	if (!pKey)
257 		return REG_INVALID_KEY;
258 
259 	if (pKey->isDeleted())
260 		return REG_INVALID_KEY;
261 
262 	if (pKey->isReadOnly())
263 		return REG_REGISTRY_READONLY;
264 
265 	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
266 	if (keyName->length)
267 	{
268 		ORegKey* pSubKey = 0;
269 		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
270 		if (_ret1 != REG_NO_ERROR)
271 			return _ret1;
272 
273         _ret1 = pSubKey->setLongListValue(valueName, pValueList, len);
274 		if (_ret1 != REG_NO_ERROR)
275 		{
276             RegError _ret2 = pKey->closeKey(pSubKey);
277 			if (_ret2 != REG_NO_ERROR)
278 				return _ret2;
279 			else
280 				return _ret1;
281 		}
282 
283 		return pKey->closeKey(pSubKey);
284 	}
285 
286 	return pKey->setLongListValue(valueName, pValueList, len);
287 }
288 
289 //*********************************************************************
290 //	setStringValueList
291 //
setStringListValue(RegKeyHandle hKey,rtl_uString * keyName,sal_Char ** pValueList,sal_uInt32 len)292 RegError REGISTRY_CALLTYPE setStringListValue(RegKeyHandle hKey,
293 						   		 	  		 rtl_uString* keyName,
294 				   			 		  		 sal_Char** pValueList,
295 				   			 		  		 sal_uInt32 len)
296 {
297 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
298 	if (!pKey)
299 		return REG_INVALID_KEY;
300 
301 	if (pKey->isDeleted())
302 		return REG_INVALID_KEY;
303 
304 	if (pKey->isReadOnly())
305 		return REG_REGISTRY_READONLY;
306 
307 	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
308 	if (keyName->length)
309 	{
310 		ORegKey* pSubKey = 0;
311 		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
312 		if (_ret1 != REG_NO_ERROR)
313 			return _ret1;
314 
315         _ret1 = pSubKey->setStringListValue(valueName, pValueList, len);
316 		if (_ret1 != REG_NO_ERROR)
317 		{
318             RegError _ret2 = pKey->closeKey(pSubKey);
319 			if (_ret2 != REG_NO_ERROR)
320 				return _ret2;
321 			else
322 				return _ret1;
323 		}
324 
325 		return pKey->closeKey(pSubKey);
326 	}
327 
328 	return pKey->setStringListValue(valueName, pValueList, len);
329 }
330 
331 //*********************************************************************
332 //	setUnicodeValueList
333 //
setUnicodeListValue(RegKeyHandle hKey,rtl_uString * keyName,sal_Unicode ** pValueList,sal_uInt32 len)334 RegError REGISTRY_CALLTYPE setUnicodeListValue(RegKeyHandle hKey,
335 						   		 	  		   rtl_uString* keyName,
336 				   			 		  		   sal_Unicode** pValueList,
337 				   			 		  		   sal_uInt32 len)
338 {
339 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
340 	if (!pKey)
341 		return REG_INVALID_KEY;
342 
343 	if (pKey->isDeleted())
344 		return REG_INVALID_KEY;
345 
346 	if (pKey->isReadOnly())
347 		return REG_REGISTRY_READONLY;
348 
349 	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
350 	if (keyName->length)
351 	{
352 		ORegKey* pSubKey = 0;
353 		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
354 		if (_ret1 != REG_NO_ERROR)
355 			return _ret1;
356 
357         _ret1 = pSubKey->setUnicodeListValue(valueName, pValueList, len);
358 		if (_ret1 != REG_NO_ERROR)
359 		{
360             RegError _ret2 = pKey->closeKey(pSubKey);
361 			if (_ret2 != REG_NO_ERROR)
362 				return _ret2;
363 			else
364 				return _ret1;
365 		}
366 
367 		return pKey->closeKey(pSubKey);
368 	}
369 
370 	return pKey->setUnicodeListValue(valueName, pValueList, len);
371 }
372 
373 //*********************************************************************
374 //	getValueInfo
375 //
getValueInfo(RegKeyHandle hKey,rtl_uString * keyName,RegValueType * pValueType,sal_uInt32 * pValueSize)376 RegError REGISTRY_CALLTYPE getValueInfo(RegKeyHandle hKey,
377 										rtl_uString* keyName,
378 										RegValueType* pValueType,
379 										sal_uInt32* pValueSize)
380 {
381 	*pValueType = RG_VALUETYPE_NOT_DEFINED;
382 	*pValueSize = 0;
383 
384 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
385 	if (!pKey)
386 		return REG_INVALID_KEY;
387 
388 	if (pKey->isDeleted())
389 		return REG_INVALID_KEY;
390 
391 	RegValueType valueType;
392 	sal_uInt32   valueSize;
393 
394 	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
395 	if (keyName->length)
396 	{
397 		ORegKey* pSubKey = 0;
398 		RegError _ret = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
399 		if (_ret != REG_NO_ERROR)
400 			return _ret;
401 
402 		if (pSubKey->getValueInfo(valueName, &valueType, &valueSize) != REG_NO_ERROR)
403 		{
404             (void) pKey->releaseKey(pSubKey);
405 			return REG_INVALID_VALUE;
406 		}
407 
408 		*pValueType = valueType;
409 		*pValueSize = valueSize;
410 
411 		return pKey->releaseKey(pSubKey);
412 	}
413 
414 
415 	if (pKey->getValueInfo(valueName, &valueType, &valueSize) != REG_NO_ERROR)
416 	{
417 		return REG_INVALID_VALUE;
418 	}
419 
420 	*pValueType = valueType;
421 	*pValueSize = valueSize;
422 
423 	return REG_NO_ERROR;
424 }
425 
426 //*********************************************************************
427 //	getValueInfo
428 //
getValue(RegKeyHandle hKey,rtl_uString * keyName,RegValue pValue)429 RegError REGISTRY_CALLTYPE getValue(RegKeyHandle hKey,
430 									rtl_uString* keyName,
431 									RegValue pValue)
432 {
433 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
434 	if (!pKey)
435 		return REG_INVALID_KEY;
436 
437 	if (pKey->isDeleted())
438 		return REG_INVALID_KEY;
439 
440 	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
441 	if (keyName->length)
442 	{
443 		ORegKey* pSubKey = 0;
444 		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
445 		if (_ret1 != REG_NO_ERROR)
446 			return _ret1;
447 
448         _ret1 = pSubKey->getValue(valueName, pValue);
449 		if (_ret1 != REG_NO_ERROR)
450 		{
451             (void) pKey->releaseKey(pSubKey);
452 			return _ret1;
453 		}
454 
455 		return pKey->releaseKey(pSubKey);
456 	}
457 
458 	return pKey->getValue(valueName, pValue);
459 }
460 
461 //*********************************************************************
462 //	getLongValueList
463 //
getLongListValue(RegKeyHandle hKey,rtl_uString * keyName,sal_Int32 ** pValueList,sal_uInt32 * pLen)464 RegError REGISTRY_CALLTYPE getLongListValue(RegKeyHandle hKey,
465 											rtl_uString* keyName,
466 											sal_Int32** pValueList,
467 											sal_uInt32* pLen)
468 {
469 	OSL_PRECOND((pValueList != 0) && (pLen != 0), "registry::getLongListValue(): invalid parameter");
470 	*pValueList = 0, *pLen = 0;
471 
472 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
473 	if (!pKey)
474 		return REG_INVALID_KEY;
475 
476 	if (pKey->isDeleted())
477 		return REG_INVALID_KEY;
478 
479 	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
480 	if (keyName->length)
481 	{
482 		ORegKey* pSubKey = 0;
483 		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
484 		if (_ret1 != REG_NO_ERROR)
485 			return _ret1;
486 
487         _ret1 = pSubKey->getLongListValue(valueName, pValueList, pLen);
488 		if (_ret1 != REG_NO_ERROR)
489 		{
490             (void) pKey->releaseKey(pSubKey);
491 			return _ret1;
492 		}
493 
494 		return pKey->releaseKey(pSubKey);
495 	}
496 
497 	return pKey->getLongListValue(valueName, pValueList, pLen);
498 }
499 
500 //*********************************************************************
501 //	getStringValueList
502 //
getStringListValue(RegKeyHandle hKey,rtl_uString * keyName,sal_Char *** pValueList,sal_uInt32 * pLen)503 RegError REGISTRY_CALLTYPE getStringListValue(RegKeyHandle hKey,
504 											  rtl_uString* keyName,
505 											  sal_Char*** pValueList,
506 											  sal_uInt32* pLen)
507 {
508 	OSL_PRECOND((pValueList != 0) && (pLen != 0), "registry::getStringListValue(): invalid parameter");
509 	*pValueList = 0, *pLen = 0;
510 
511 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
512 	if (!pKey)
513 		return REG_INVALID_KEY;
514 
515 	if (pKey->isDeleted())
516 		return REG_INVALID_KEY;
517 
518 	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
519 	if (keyName->length)
520 	{
521 		ORegKey* pSubKey = 0;
522 		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
523 		if (_ret1 != REG_NO_ERROR)
524 			return _ret1;
525 
526         _ret1 = pSubKey->getStringListValue(valueName, pValueList, pLen);
527 		if (_ret1 != REG_NO_ERROR)
528 		{
529             (void) pKey->releaseKey(pSubKey);
530 			return _ret1;
531 		}
532 
533 		return pKey->releaseKey(pSubKey);
534 	}
535 
536 	return pKey->getStringListValue(valueName, pValueList, pLen);
537 }
538 
539 //*********************************************************************
540 //	getUnicodeListValue
541 //
getUnicodeListValue(RegKeyHandle hKey,rtl_uString * keyName,sal_Unicode *** pValueList,sal_uInt32 * pLen)542 RegError REGISTRY_CALLTYPE getUnicodeListValue(RegKeyHandle hKey,
543 											   rtl_uString* keyName,
544 											   sal_Unicode*** pValueList,
545 											   sal_uInt32* pLen)
546 {
547 	OSL_PRECOND((pValueList != 0) && (pLen != 0), "registry::getUnicodeListValue(): invalid parameter");
548 	*pValueList = 0, *pLen = 0;
549 
550 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
551 	if (!pKey)
552 		return REG_INVALID_KEY;
553 
554 	if (pKey->isDeleted())
555 		return REG_INVALID_KEY;
556 
557 	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
558 	if (keyName->length)
559 	{
560 		ORegKey* pSubKey = 0;
561 		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
562 		if (_ret1 != REG_NO_ERROR)
563 			return _ret1;
564 
565         _ret1 = pSubKey->getUnicodeListValue(valueName, pValueList, pLen);
566 		if (_ret1 != REG_NO_ERROR)
567 		{
568             (void) pKey->releaseKey(pSubKey);
569 			return _ret1;
570 		}
571 
572 		return pKey->releaseKey(pSubKey);
573 	}
574 
575 	return pKey->getUnicodeListValue(valueName, pValueList, pLen);
576 }
577 
578 //*********************************************************************
579 //	freeValueList
580 //
freeValueList(RegValueType valueType,RegValue pValueList,sal_uInt32 len)581 RegError REGISTRY_CALLTYPE freeValueList(RegValueType valueType,
582 					   			  		 RegValue pValueList,
583 					   			  		 sal_uInt32 len)
584 {
585 	switch (valueType)
586 	{
587 		case 5:
588 			{
589 				rtl_freeMemory(pValueList);
590 			}
591 			break;
592 		case 6:
593 			{
594 				sal_Char** pVList = (sal_Char**)pValueList;
595 				for (sal_uInt32 i=0; i < len; i++)
596 				{
597 					rtl_freeMemory(pVList[i]);
598 				}
599 
600 				rtl_freeMemory(pVList);
601 			}
602 			break;
603 		case 7:
604 			{
605 				sal_Unicode** pVList = (sal_Unicode**)pValueList;
606 				for (sal_uInt32 i=0; i < len; i++)
607 				{
608 					rtl_freeMemory(pVList[i]);
609 				}
610 
611 				rtl_freeMemory(pVList);
612 			}
613 			break;
614 		default:
615 			return REG_INVALID_VALUE;
616 	}
617 
618 	pValueList = NULL;
619 	return REG_NO_ERROR;
620 }
621 
622 //*********************************************************************
623 //	createLink
624 //
createLink(RegKeyHandle,rtl_uString *,rtl_uString *)625 RegError REGISTRY_CALLTYPE createLink(RegKeyHandle, rtl_uString*, rtl_uString*)
626 {
627     return REG_INVALID_LINK; // links are no longer supported
628 }
629 
630 //*********************************************************************
631 //	deleteLink
632 //
deleteLink(RegKeyHandle,rtl_uString *)633 RegError REGISTRY_CALLTYPE deleteLink(RegKeyHandle, rtl_uString*)
634 {
635     return REG_INVALID_LINK; // links are no longer supported
636 }
637 
638 //*********************************************************************
639 //	getKeyType
640 //
getKeyType(RegKeyHandle hKey,rtl_uString * keyName,RegKeyType * pKeyType)641 RegError REGISTRY_CALLTYPE getKeyType(RegKeyHandle hKey,
642 									  rtl_uString* keyName,
643 					   				  RegKeyType* pKeyType)
644 {
645 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
646 	if (!pKey)
647 		return REG_INVALID_KEY;
648 
649 	if (pKey->isDeleted())
650 		return REG_INVALID_KEY;
651 
652 	return pKey->getKeyType(keyName, pKeyType);
653 }
654 
655 //*********************************************************************
656 //	getLinkTarget
657 //
getLinkTarget(RegKeyHandle,rtl_uString *,rtl_uString **)658 RegError REGISTRY_CALLTYPE getLinkTarget(
659     RegKeyHandle, rtl_uString*, rtl_uString**)
660 {
661     return REG_INVALID_LINK; // links are no longer supported
662 }
663 
664 //*********************************************************************
665 //	getName
666 //
getResolvedKeyName(RegKeyHandle hKey,rtl_uString * keyName,sal_Bool,rtl_uString ** pResolvedName)667 RegError REGISTRY_CALLTYPE getResolvedKeyName(RegKeyHandle hKey,
668 											  rtl_uString* keyName,
669 											  sal_Bool,
670 							  				  rtl_uString** pResolvedName)
671 {
672 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
673 	if (!pKey)
674 		return REG_INVALID_KEY;
675 
676 	if (pKey->isDeleted())
677 		return REG_INVALID_KEY;
678 
679 	OUString resolvedName;
680 	RegError _ret = pKey->getResolvedKeyName(keyName, resolvedName);
681 	if (_ret == REG_NO_ERROR)
682 		rtl_uString_assign(pResolvedName, resolvedName.pData);
683 	return _ret;
684 }
685 
686 //*********************************************************************
687 //	getKeyNames
688 //
getKeyNames(RegKeyHandle hKey,rtl_uString * keyName,rtl_uString *** pSubKeyNames,sal_uInt32 * pnSubKeys)689 RegError REGISTRY_CALLTYPE getKeyNames(RegKeyHandle hKey,
690 									   rtl_uString* keyName,
691 						  			   rtl_uString*** pSubKeyNames,
692 						  			   sal_uInt32* pnSubKeys)
693 {
694 	ORegKey* pKey = static_cast< ORegKey* >(hKey);
695 	if (!pKey)
696 		return REG_INVALID_KEY;
697 
698 	if (pKey->isDeleted())
699 		return REG_INVALID_KEY;
700 
701 	return pKey->getKeyNames(keyName, pSubKeyNames, pnSubKeys);
702 }
703 
704 //*********************************************************************
705 //	freeKeyNames
706 //
freeKeyNames(rtl_uString ** pKeyNames,sal_uInt32 nKeys)707 RegError REGISTRY_CALLTYPE freeKeyNames(rtl_uString** pKeyNames,
708 						  			    sal_uInt32 nKeys)
709 {
710 	for (sal_uInt32 i=0; i < nKeys; i++)
711 	{
712 		rtl_uString_release(pKeyNames[i]);
713 	}
714 
715 	rtl_freeMemory(pKeyNames);
716 
717 	return REG_NO_ERROR;
718 }
719 
720 //*********************************************************************
721 //  C API
722 //
723 
724 //*********************************************************************
725 //	reg_createKey
726 //
reg_createKey(RegKeyHandle hKey,rtl_uString * keyName,RegKeyHandle * phNewKey)727 RegError REGISTRY_CALLTYPE reg_createKey(RegKeyHandle hKey,
728 										 rtl_uString* keyName,
729 										 RegKeyHandle* phNewKey)
730 {
731 	if (!hKey)
732  		return REG_INVALID_KEY;
733 
734 	return createKey(hKey, keyName, phNewKey);
735 }
736 
737 //*********************************************************************
738 //	reg_openKey
739 //
reg_openKey(RegKeyHandle hKey,rtl_uString * keyName,RegKeyHandle * phOpenKey)740 RegError REGISTRY_CALLTYPE reg_openKey(RegKeyHandle hKey,
741 									   rtl_uString* keyName,
742 									   RegKeyHandle* phOpenKey)
743 {
744 	if (!hKey)
745 		return REG_INVALID_KEY;
746 
747 	return openKey(hKey, keyName, phOpenKey);
748 }
749 
750 //*********************************************************************
751 //	reg_openSubKeys
752 //
reg_openSubKeys(RegKeyHandle hKey,rtl_uString * keyName,RegKeyHandle ** pphSubKeys,sal_uInt32 * pnSubKeys)753 RegError REGISTRY_CALLTYPE reg_openSubKeys(RegKeyHandle hKey,
754 										   rtl_uString* keyName,
755 										   RegKeyHandle** pphSubKeys,
756 										   sal_uInt32* pnSubKeys)
757 {
758 	if (!hKey)
759 		return REG_INVALID_KEY;
760 
761 	return openSubKeys(hKey, keyName, pphSubKeys, pnSubKeys);
762 }
763 
764 //*********************************************************************
765 //	reg_closeSubKeys
766 //
reg_closeSubKeys(RegKeyHandle * pphSubKeys,sal_uInt32 nSubKeys)767 RegError REGISTRY_CALLTYPE reg_closeSubKeys(RegKeyHandle* pphSubKeys,
768 											sal_uInt32 nSubKeys)
769 {
770 	if (!pphSubKeys)
771 		return REG_INVALID_KEY;
772 
773 	return closeSubKeys(pphSubKeys, nSubKeys);
774 }
775 
776 //*********************************************************************
777 //	reg_deleteKey
778 //
reg_deleteKey(RegKeyHandle hKey,rtl_uString * keyName)779 RegError REGISTRY_CALLTYPE reg_deleteKey(RegKeyHandle hKey,
780 										 rtl_uString* keyName)
781 {
782 	if (!hKey)
783 		return REG_INVALID_KEY;
784 
785 	return deleteKey(hKey, keyName);
786 }
787 
788 //*********************************************************************
789 //	reg_closeKey
790 //
reg_closeKey(RegKeyHandle hKey)791 RegError REGISTRY_CALLTYPE reg_closeKey(RegKeyHandle hKey)
792 {
793 	if (!hKey)
794 		return REG_INVALID_KEY;
795 
796 	return closeKey(hKey);
797 }
798 
799 
800 //*********************************************************************
801 //	reg_getKeyName
802 //
reg_getKeyName(RegKeyHandle hKey,rtl_uString ** pKeyName)803 RegError REGISTRY_CALLTYPE reg_getKeyName(RegKeyHandle hKey, rtl_uString** pKeyName)
804 {
805 	if (hKey)
806 	{
807 		rtl_uString_assign( pKeyName, ((ORegKey*)hKey)->getName().pData );
808 		return REG_NO_ERROR;
809 	} else
810 	{
811 		rtl_uString_new( pKeyName );
812 		return REG_INVALID_KEY;
813 	}
814 }
815 
816 //*********************************************************************
817 //	reg_setValue
818 //
reg_setValue(RegKeyHandle hKey,rtl_uString * keyName,RegValueType valueType,RegValue pData,sal_uInt32 valueSize)819 RegError REGISTRY_CALLTYPE reg_setValue(RegKeyHandle hKey,
820 										rtl_uString* keyName,
821 										RegValueType valueType,
822 										RegValue pData,
823 										sal_uInt32 valueSize)
824 {
825 	if (!hKey)
826 		return REG_INVALID_KEY;
827 
828 	return setValue(hKey, keyName, valueType, pData, valueSize);
829 }
830 
831 //*********************************************************************
832 //	reg_setLongListValue
833 //
reg_setLongListValue(RegKeyHandle hKey,rtl_uString * keyName,sal_Int32 * pValueList,sal_uInt32 len)834 RegError REGISTRY_CALLTYPE reg_setLongListValue(RegKeyHandle hKey,
835 					   		 	  				rtl_uString* keyName,
836 			   			 		  				sal_Int32* pValueList,
837 			   			 		  				sal_uInt32 len)
838 {
839 	if (!hKey)
840 		return REG_INVALID_KEY;
841 
842 	return setLongListValue(hKey, keyName, pValueList, len);
843 }
844 
845 //*********************************************************************
846 //	reg_setStringListValue
847 //
reg_setStringListValue(RegKeyHandle hKey,rtl_uString * keyName,sal_Char ** pValueList,sal_uInt32 len)848 RegError REGISTRY_CALLTYPE reg_setStringListValue(RegKeyHandle hKey,
849 					   		 	  			  	  rtl_uString* keyName,
850 			   			 		  			  	  sal_Char** pValueList,
851 			   			 		  			  	  sal_uInt32 len)
852 {
853 	if (!hKey)
854 		return REG_INVALID_KEY;
855 
856 	return setStringListValue(hKey, keyName, pValueList, len);
857 }
858 
859 //*********************************************************************
860 //	reg_setUnicodeListValue
861 //
reg_setUnicodeListValue(RegKeyHandle hKey,rtl_uString * keyName,sal_Unicode ** pValueList,sal_uInt32 len)862 RegError REGISTRY_CALLTYPE reg_setUnicodeListValue(RegKeyHandle hKey,
863 					   		 	  			   	   rtl_uString* keyName,
864 			   			 		  			   	   sal_Unicode** pValueList,
865 			   			 		  			   	   sal_uInt32 len)
866 {
867 	if (!hKey)
868 		return REG_INVALID_KEY;
869 
870 	return setUnicodeListValue(hKey, keyName, pValueList, len);
871 }
872 
873 //*********************************************************************
874 //	reg_getValueInfo
875 //
reg_getValueInfo(RegKeyHandle hKey,rtl_uString * keyName,RegValueType * pValueType,sal_uInt32 * pValueSize)876 RegError REGISTRY_CALLTYPE reg_getValueInfo(RegKeyHandle hKey,
877 											rtl_uString* keyName,
878 											RegValueType* pValueType,
879 											sal_uInt32* pValueSize)
880 {
881 	if (!hKey)
882 		return REG_INVALID_KEY;
883 
884 	return getValueInfo(hKey, keyName, pValueType, pValueSize);
885 }
886 
887 //*********************************************************************
888 //	reg_getValueInfo
889 //
reg_getValue(RegKeyHandle hKey,rtl_uString * keyName,RegValue pData)890 RegError REGISTRY_CALLTYPE reg_getValue(RegKeyHandle hKey,
891 										rtl_uString* keyName,
892 										RegValue pData)
893 {
894 	if (!hKey)
895 		return REG_INVALID_KEY;
896 
897 	return getValue(hKey, keyName, pData);
898 }
899 
900 //*********************************************************************
901 //	reg_getLongListValue
902 //
reg_getLongListValue(RegKeyHandle hKey,rtl_uString * keyName,sal_Int32 ** pValueList,sal_uInt32 * pLen)903 RegError REGISTRY_CALLTYPE reg_getLongListValue(RegKeyHandle hKey,
904 					   		 	  				rtl_uString* keyName,
905 			   			 		  				sal_Int32** pValueList,
906 			   			 		  				sal_uInt32* pLen)
907 {
908 	if (!hKey)
909 		return REG_INVALID_KEY;
910 
911 	return getLongListValue(hKey, keyName, pValueList, pLen);
912 }
913 
914 //*********************************************************************
915 //	reg_getStringListValue
916 //
reg_getStringListValue(RegKeyHandle hKey,rtl_uString * keyName,sal_Char *** pValueList,sal_uInt32 * pLen)917 RegError REGISTRY_CALLTYPE reg_getStringListValue(RegKeyHandle hKey,
918 				   			  					  rtl_uString* keyName,
919 				   			  					  sal_Char*** pValueList,
920 				   			  					  sal_uInt32* pLen)
921 {
922 	if (!hKey)
923 		return REG_INVALID_KEY;
924 
925 	return getStringListValue(hKey, keyName, pValueList, pLen);
926 }
927 
928 //*********************************************************************
929 //	reg_getUnicodeListValue
930 //
reg_getUnicodeListValue(RegKeyHandle hKey,rtl_uString * keyName,sal_Unicode *** pValueList,sal_uInt32 * pLen)931 RegError REGISTRY_CALLTYPE reg_getUnicodeListValue(RegKeyHandle hKey,
932 					   		 	  				   rtl_uString* keyName,
933 			   			 		  				   sal_Unicode*** pValueList,
934 			   			 		  				   sal_uInt32* pLen)
935 {
936 	if (!hKey)
937 		return REG_INVALID_KEY;
938 
939 	return getUnicodeListValue(hKey, keyName, pValueList, pLen);
940 }
941 
942 //*********************************************************************
943 //	reg_freeValueList
944 //
reg_freeValueList(RegValueType valueType,RegValue pValueList,sal_uInt32 len)945 RegError REGISTRY_CALLTYPE reg_freeValueList(RegValueType valueType,
946 				   			  				 RegValue pValueList,
947 				   			  				 sal_uInt32 len)
948 {
949 	if (pValueList)
950 		return freeValueList(valueType, pValueList, len);
951 	else
952 		return REG_INVALID_VALUE;
953 }
954 
955 //*********************************************************************
956 //	reg_createLink
957 //
reg_createLink(RegKeyHandle hKey,rtl_uString * linkName,rtl_uString * linkTarget)958 RegError REGISTRY_CALLTYPE reg_createLink(RegKeyHandle hKey,
959 				  			   		      rtl_uString* linkName,
960 										  rtl_uString* linkTarget)
961 {
962 	if (!hKey)
963 		return REG_INVALID_KEY;
964 
965 	return createLink(hKey, linkName, linkTarget);
966 }
967 
968 //*********************************************************************
969 //	reg_deleteLink
970 //
reg_deleteLink(RegKeyHandle hKey,rtl_uString * linkName)971 RegError REGISTRY_CALLTYPE reg_deleteLink(RegKeyHandle hKey,
972 								  		  rtl_uString* linkName)
973 {
974 	if (!hKey)
975 		return REG_INVALID_KEY;
976 
977 	return deleteLink(hKey, linkName);
978 }
979 
980 //*********************************************************************
981 //	reg_getKeyType
982 //
reg_getKeyType(RegKeyHandle hKey,rtl_uString * keyName,RegKeyType * pKeyType)983 RegError REGISTRY_CALLTYPE reg_getKeyType(RegKeyHandle hKey,
984 										  rtl_uString* keyName,
985 					   					  RegKeyType* pKeyType)
986 {
987 	if (!hKey)
988 		return REG_INVALID_KEY;
989 
990 	return getKeyType(hKey, keyName, pKeyType);
991 }
992 
993 //*********************************************************************
994 //	reg_getLinkTarget
995 //
reg_getLinkTarget(RegKeyHandle hKey,rtl_uString * linkName,rtl_uString ** pLinkTarget)996 RegError REGISTRY_CALLTYPE reg_getLinkTarget(RegKeyHandle hKey,
997 											 rtl_uString* linkName,
998 						  					 rtl_uString** pLinkTarget)
999 {
1000 	if (!hKey)
1001 		return REG_INVALID_KEY;
1002 
1003 	return getLinkTarget(hKey, linkName, pLinkTarget);
1004 }
1005 
1006 //*********************************************************************
1007 //	reg_getResolvedKeyName
1008 //
reg_getResolvedKeyName(RegKeyHandle hKey,rtl_uString * keyName,sal_Bool firstLinkOnly,rtl_uString ** pResolvedName)1009 RegError REGISTRY_CALLTYPE reg_getResolvedKeyName(RegKeyHandle hKey,
1010 											  	  rtl_uString* keyName,
1011 											  	  sal_Bool firstLinkOnly,
1012 							  				  	  rtl_uString** pResolvedName)
1013 {
1014 	if (!hKey)
1015 		return REG_INVALID_KEY;
1016 
1017 	return getResolvedKeyName(hKey, keyName, firstLinkOnly, pResolvedName);
1018 }
1019