1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
21 #include <registry/registry.h>
22 #include <registry/registry.hxx>
24 #include <osl/process.h>
26 #include "keyimpl.hxx"
27 #include "regimpl.hxx"
30 #if defined(WIN32) || defined(WNT)
42 //*********************************************************************
45 static void REGISTRY_CALLTYPE
acquire(RegHandle hReg
)
47 ORegistry
* pReg
= (ORegistry
*) hReg
;
54 //*********************************************************************
57 static void REGISTRY_CALLTYPE
release(RegHandle hReg
)
59 ORegistry
* pReg
= (ORegistry
*) hReg
;
63 if (pReg
->release() == 0)
72 //*********************************************************************
75 static RegError REGISTRY_CALLTYPE
getName(RegHandle hReg
, rtl_uString
** pName
)
81 pReg
= (ORegistry
*)hReg
;
84 rtl_uString_assign(pName
, pReg
->getName().pData
);
88 rtl_uString_new(pName
);
89 return REG_REGISTRY_NOT_OPEN
;
93 rtl_uString_new(pName
);
94 return REG_INVALID_REGISTRY
;
98 //*********************************************************************
101 static sal_Bool REGISTRY_CALLTYPE
isReadOnly(RegHandle hReg
)
104 return ((ORegistry
*)hReg
)->isReadOnly();
110 //*********************************************************************
113 static RegError REGISTRY_CALLTYPE
createRegistry(rtl_uString
* registryName
,
114 RegHandle
* phRegistry
)
118 ORegistry
* pReg
= new ORegistry();
119 if ((ret
= pReg
->initRegistry(registryName
, REG_CREATE
)))
130 //*********************************************************************
133 static RegError REGISTRY_CALLTYPE
openRootKey(RegHandle hReg
,
134 RegKeyHandle
* phRootKey
)
140 pReg
= (ORegistry
*)hReg
;
142 return REG_REGISTRY_NOT_OPEN
;
146 return REG_INVALID_REGISTRY
;
149 *phRootKey
= pReg
->getRootKey();
155 //*********************************************************************
158 static RegError REGISTRY_CALLTYPE
openRegistry(rtl_uString
* registryName
,
159 RegHandle
* phRegistry
,
160 RegAccessMode accessMode
)
164 ORegistry
* pReg
= new ORegistry();
165 if ((_ret
= pReg
->initRegistry(registryName
, accessMode
)))
178 //*********************************************************************
181 static RegError REGISTRY_CALLTYPE
closeRegistry(RegHandle hReg
)
187 pReg
= (ORegistry
*)hReg
;
189 return REG_REGISTRY_NOT_OPEN
;
191 RegError ret
= REG_NO_ERROR
;
192 if (pReg
->release() == 0)
198 ret
= pReg
->closeRegistry();
203 return REG_INVALID_REGISTRY
;
208 //*********************************************************************
211 static RegError REGISTRY_CALLTYPE
destroyRegistry(RegHandle hReg
,
212 rtl_uString
* registryName
)
218 pReg
= (ORegistry
*)hReg
;
220 return REG_INVALID_REGISTRY
;
222 RegError ret
= pReg
->destroyRegistry(registryName
);
225 if (!registryName
->length
)
234 return REG_INVALID_REGISTRY
;
239 //*********************************************************************
242 static RegError REGISTRY_CALLTYPE
loadKey(RegHandle hReg
,
244 rtl_uString
* keyName
,
245 rtl_uString
* regFileName
)
248 ORegistry
* pReg
= static_cast< ORegistry
* >(hReg
);
250 return REG_INVALID_REGISTRY
;
253 return REG_REGISTRY_NOT_OPEN
;
255 ORegKey
* pKey
= static_cast< ORegKey
* >(hKey
);
257 return REG_INVALID_KEY
;
259 if (pKey
->getRegistry() != pReg
)
260 return REG_INVALID_KEY
;
261 if (pKey
->isDeleted())
262 return REG_INVALID_KEY
;
263 if (pKey
->isReadOnly())
264 return REG_REGISTRY_READONLY
;
267 ORegKey
* pNewKey
= 0;
268 RegError _ret
= pKey
->openKey(keyName
, (RegKeyHandle
*)&pNewKey
);
269 if (_ret
== REG_NO_ERROR
)
271 pKey
->releaseKey(pNewKey
);
272 pKey
->deleteKey(keyName
);
275 _ret
= pKey
->createKey(keyName
, (RegKeyHandle
*)&pNewKey
);
276 if (_ret
!= REG_NO_ERROR
)
279 _ret
= pReg
->loadKey(pNewKey
, regFileName
);
280 if (_ret
!= REG_NO_ERROR
)
282 pKey
->releaseKey(pNewKey
);
283 pKey
->deleteKey(keyName
);
287 return pKey
->closeKey(pNewKey
);
290 //*********************************************************************
293 static RegError REGISTRY_CALLTYPE
saveKey(RegHandle hReg
,
295 rtl_uString
* keyName
,
296 rtl_uString
* regFileName
)
299 ORegistry
* pReg
= static_cast< ORegistry
* >(hReg
);
301 return REG_INVALID_REGISTRY
;
304 return REG_REGISTRY_NOT_OPEN
;
306 ORegKey
* pKey
= static_cast< ORegKey
* >(hKey
);
308 return REG_INVALID_KEY
;
310 if (pKey
->getRegistry() != pReg
)
311 return REG_INVALID_KEY
;
312 if (pKey
->isDeleted())
313 return REG_INVALID_KEY
;
315 ORegKey
* pNewKey
= 0;
316 RegError _ret
= pKey
->openKey(keyName
, (RegKeyHandle
*)&pNewKey
);
317 if (_ret
!= REG_NO_ERROR
)
320 _ret
= pReg
->saveKey(pNewKey
, regFileName
);
321 if (_ret
!= REG_NO_ERROR
)
323 (void) pKey
->releaseKey(pNewKey
);
327 return pKey
->releaseKey(pNewKey
);
330 //*********************************************************************
333 static RegError REGISTRY_CALLTYPE
mergeKey(RegHandle hReg
,
335 rtl_uString
* keyName
,
336 rtl_uString
* regFileName
,
340 ORegistry
* pReg
= static_cast< ORegistry
* >(hReg
);
342 return REG_INVALID_REGISTRY
;
344 return REG_REGISTRY_NOT_OPEN
;
346 ORegKey
* pKey
= static_cast< ORegKey
* >(hKey
);
348 return REG_INVALID_KEY
;
349 if (pKey
->getRegistry() != pReg
)
350 return REG_INVALID_KEY
;
351 if (pKey
->isDeleted())
352 return REG_INVALID_KEY
;
353 if (pKey
->isReadOnly())
354 return REG_REGISTRY_READONLY
;
358 ORegKey
* pNewKey
= 0;
359 RegError _ret
= pKey
->createKey(keyName
, (RegKeyHandle
*)&pNewKey
);
360 if (_ret
!= REG_NO_ERROR
)
363 _ret
= pReg
->loadKey(pNewKey
, regFileName
, bWarnings
, bReport
);
364 if (_ret
!= REG_NO_ERROR
&& (_ret
!= REG_MERGE_CONFLICT
|| bWarnings
))
367 (void) pKey
->closeKey(pNewKey
);
369 (void) pKey
->releaseKey(pNewKey
);
373 return (pNewKey
!= pKey
) ? pKey
->closeKey(pNewKey
) : pKey
->releaseKey(pNewKey
);
376 return pReg
->loadKey(pKey
, regFileName
, bWarnings
, bReport
);
379 //*********************************************************************
382 static RegError REGISTRY_CALLTYPE
dumpRegistry(RegHandle hReg
,
385 ORegistry
* pReg
= static_cast< ORegistry
* >(hReg
);
387 return REG_INVALID_REGISTRY
;
389 return REG_REGISTRY_NOT_OPEN
;
391 ORegKey
* pKey
= static_cast< ORegKey
* >(hKey
);
393 return REG_INVALID_KEY
;
394 if (pKey
->getRegistry() != pReg
)
395 return REG_INVALID_KEY
;
396 if (pKey
->isDeleted())
397 return REG_INVALID_KEY
;
399 return pReg
->dumpRegistry(hKey
);
402 //*********************************************************************
405 REG_DLLPUBLIC Registry_Api
* REGISTRY_CALLTYPE
initRegistry_Api(void)
407 static Registry_Api aApi
= {&acquire
,
433 &setUnicodeListValue
,
438 &getUnicodeListValue
,
453 //*********************************************************************
456 REG_DLLPUBLIC RegError REGISTRY_CALLTYPE
reg_loadKey(RegKeyHandle hKey
,
457 rtl_uString
* keyName
,
458 rtl_uString
* regFileName
)
463 pKey
= (ORegKey
*)hKey
;
465 return REG_INVALID_KEY
;
467 return loadKey(pKey
->getRegistry(), hKey
, keyName
, regFileName
);
470 //*********************************************************************
473 REG_DLLPUBLIC RegError REGISTRY_CALLTYPE
reg_saveKey(RegKeyHandle hKey
,
474 rtl_uString
* keyName
,
475 rtl_uString
* regFileName
)
480 pKey
= (ORegKey
*)hKey
;
482 return REG_INVALID_KEY
;
484 return saveKey(pKey
->getRegistry(), hKey
, keyName
, regFileName
);
487 //*********************************************************************
490 REG_DLLPUBLIC RegError REGISTRY_CALLTYPE
reg_mergeKey(RegKeyHandle hKey
,
491 rtl_uString
* keyName
,
492 rtl_uString
* regFileName
,
499 pKey
= (ORegKey
*)hKey
;
501 return REG_INVALID_KEY
;
503 return mergeKey(pKey
->getRegistry(), hKey
, keyName
, regFileName
, bWarnings
, bReport
);
506 //*********************************************************************
507 // reg_createRegistry
509 REG_DLLPUBLIC RegError REGISTRY_CALLTYPE
reg_createRegistry(rtl_uString
* registryName
,
510 RegHandle
* phRegistry
)
514 ORegistry
* pReg
= new ORegistry();
515 if ((ret
= pReg
->initRegistry(registryName
, REG_CREATE
)))
526 //*********************************************************************
529 REG_DLLPUBLIC RegError REGISTRY_CALLTYPE
reg_openRootKey(RegHandle hRegistry
,
530 RegKeyHandle
* phRootKey
)
532 return openRootKey(hRegistry
, phRootKey
);
536 //*********************************************************************
539 REG_DLLPUBLIC RegError REGISTRY_CALLTYPE
reg_getName(RegHandle hRegistry
, rtl_uString
** pName
)
541 return getName(hRegistry
, pName
);
545 //*********************************************************************
548 REG_DLLPUBLIC sal_Bool REGISTRY_CALLTYPE
reg_isReadOnly(RegHandle hRegistry
)
550 return isReadOnly(hRegistry
);
554 //*********************************************************************
557 REG_DLLPUBLIC RegError REGISTRY_CALLTYPE
reg_openRegistry(rtl_uString
* registryName
,
558 RegHandle
* phRegistry
,
559 RegAccessMode accessMode
)
563 ORegistry
* pReg
= new ORegistry();
564 if ((_ret
= pReg
->initRegistry(registryName
, accessMode
)))
575 //*********************************************************************
578 REG_DLLPUBLIC RegError REGISTRY_CALLTYPE
reg_closeRegistry(RegHandle hRegistry
)
584 pReg
= (ORegistry
*)hRegistry
;
589 return REG_REGISTRY_NOT_OPEN
;
594 //*********************************************************************
595 // reg_destroyRegistry
597 REG_DLLPUBLIC RegError REGISTRY_CALLTYPE
reg_destroyRegistry(RegHandle hRegistry
,
598 rtl_uString
* registryName
)
600 return destroyRegistry(hRegistry
, registryName
);
604 //*********************************************************************
607 REG_DLLPUBLIC RegError REGISTRY_CALLTYPE
reg_dumpRegistry(RegKeyHandle hKey
)
612 pKey
= (ORegKey
*)hKey
;
614 return REG_INVALID_KEY
;
616 return dumpRegistry(pKey
->getRegistry(), hKey
);
620 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */