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.hxx>
23 #include "keyimpl.hxx"
24 #include "regimpl.hxx"
36 static void REGISTRY_CALLTYPE
acquire(RegHandle hReg
)
38 ORegistry
* pReg
= static_cast<ORegistry
*>(hReg
);
47 static void REGISTRY_CALLTYPE
release(RegHandle hReg
)
49 ORegistry
* pReg
= static_cast<ORegistry
*>(hReg
);
51 if (pReg
&& pReg
->release() == 0)
61 static RegError REGISTRY_CALLTYPE
getName(RegHandle hReg
, rtl_uString
** pName
)
65 ORegistry
* pReg
= static_cast<ORegistry
*>(hReg
);
68 rtl_uString_assign(pName
, pReg
->getName().pData
);
69 return RegError::NO_ERROR
;
72 rtl_uString_new(pName
);
73 return RegError::REGISTRY_NOT_OPEN
;
77 rtl_uString_new(pName
);
78 return RegError::INVALID_REGISTRY
;
84 static sal_Bool REGISTRY_CALLTYPE
isReadOnly(RegHandle hReg
)
87 return static_cast<ORegistry
*>(hReg
)->isReadOnly();
95 static RegError REGISTRY_CALLTYPE
createRegistry(rtl_uString
* registryName
,
96 RegHandle
* phRegistry
)
100 ORegistry
* pReg
= new ORegistry();
101 if ((ret
= pReg
->initRegistry(registryName
, RegAccessMode::READWRITE
, true/*bCreate*/)) != RegError::NO_ERROR
)
104 *phRegistry
= nullptr;
110 return RegError::NO_ERROR
;
116 static RegError REGISTRY_CALLTYPE
openRootKey(RegHandle hReg
,
117 RegKeyHandle
* phRootKey
)
123 pReg
= static_cast<ORegistry
*>(hReg
);
125 return RegError::REGISTRY_NOT_OPEN
;
129 return RegError::INVALID_REGISTRY
;
132 *phRootKey
= pReg
->getRootKey();
134 return RegError::NO_ERROR
;
140 static RegError REGISTRY_CALLTYPE
openRegistry(rtl_uString
* registryName
,
141 RegHandle
* phRegistry
,
142 RegAccessMode accessMode
)
146 ORegistry
* pReg
= new ORegistry();
147 if ((_ret
= pReg
->initRegistry(registryName
, accessMode
)) != RegError::NO_ERROR
)
149 *phRegistry
= nullptr;
157 return RegError::NO_ERROR
;
163 static RegError REGISTRY_CALLTYPE
closeRegistry(RegHandle hReg
)
167 ORegistry
*pReg
= static_cast<ORegistry
*>(hReg
);
169 return RegError::REGISTRY_NOT_OPEN
;
171 RegError ret
= RegError::NO_ERROR
;
172 if (pReg
->release() == 0)
178 ret
= pReg
->closeRegistry();
183 return RegError::INVALID_REGISTRY
;
190 static RegError REGISTRY_CALLTYPE
destroyRegistry(RegHandle hReg
,
191 rtl_uString
* registryName
)
195 ORegistry
*pReg
= static_cast<ORegistry
*>(hReg
);
197 return RegError::INVALID_REGISTRY
;
199 RegError ret
= pReg
->destroyRegistry(registryName
);
200 if (ret
== RegError::NO_ERROR
)
202 if (!registryName
->length
)
211 return RegError::INVALID_REGISTRY
;
218 static RegError REGISTRY_CALLTYPE
mergeKey(RegHandle hReg
,
220 rtl_uString
* keyName
,
221 rtl_uString
* regFileName
,
225 ORegistry
* pReg
= static_cast< ORegistry
* >(hReg
);
227 return RegError::INVALID_REGISTRY
;
229 return RegError::REGISTRY_NOT_OPEN
;
231 ORegKey
* pKey
= static_cast< ORegKey
* >(hKey
);
233 return RegError::INVALID_KEY
;
234 if (pKey
->getRegistry() != pReg
)
235 return RegError::INVALID_KEY
;
236 if (pKey
->isDeleted())
237 return RegError::INVALID_KEY
;
238 if (pKey
->isReadOnly())
239 return RegError::REGISTRY_READONLY
;
243 ORegKey
* pNewKey
= nullptr;
244 RegError _ret
= pKey
->createKey(keyName
, reinterpret_cast<RegKeyHandle
*>(&pNewKey
));
245 if (_ret
!= RegError::NO_ERROR
)
248 _ret
= pReg
->loadKey(pNewKey
, regFileName
, bWarnings
, bReport
);
249 if (_ret
!= RegError::NO_ERROR
&& (_ret
!= RegError::MERGE_CONFLICT
|| bWarnings
))
252 (void) pKey
->closeKey(pNewKey
);
254 (void) pKey
->releaseKey(pNewKey
);
258 return (pNewKey
!= pKey
) ? pKey
->closeKey(pNewKey
) : pKey
->releaseKey(pNewKey
);
261 return pReg
->loadKey(pKey
, regFileName
, bWarnings
, bReport
);
267 static RegError REGISTRY_CALLTYPE
dumpRegistry(RegHandle hReg
,
270 ORegistry
* pReg
= static_cast< ORegistry
* >(hReg
);
272 return RegError::INVALID_REGISTRY
;
274 return RegError::REGISTRY_NOT_OPEN
;
276 ORegKey
* pKey
= static_cast< ORegKey
* >(hKey
);
278 return RegError::INVALID_KEY
;
279 if (pKey
->getRegistry() != pReg
)
280 return RegError::INVALID_KEY
;
281 if (pKey
->isDeleted())
282 return RegError::INVALID_KEY
;
284 return pReg
->dumpRegistry(hKey
);
290 Registry_Api
* REGISTRY_CALLTYPE
initRegistry_Api()
292 static Registry_Api aApi
= {&acquire
,
315 &setUnicodeListValue
,
320 &getUnicodeListValue
,
334 RegError REGISTRY_CALLTYPE
reg_openRootKey(RegHandle hRegistry
,
335 RegKeyHandle
* phRootKey
)
337 return openRootKey(hRegistry
, phRootKey
);
343 RegError REGISTRY_CALLTYPE
reg_openRegistry(rtl_uString
* registryName
,
344 RegHandle
* phRegistry
)
348 ORegistry
* pReg
= new ORegistry();
349 if ((_ret
= pReg
->initRegistry(registryName
, RegAccessMode::READONLY
)) != RegError::NO_ERROR
)
352 *phRegistry
= nullptr;
358 return RegError::NO_ERROR
;
364 RegError REGISTRY_CALLTYPE
reg_closeRegistry(RegHandle hRegistry
)
368 ORegistry
* pReg
= static_cast<ORegistry
*>(hRegistry
);
370 return RegError::NO_ERROR
;
373 return RegError::REGISTRY_NOT_OPEN
;
380 RegError REGISTRY_CALLTYPE
reg_dumpRegistry(RegKeyHandle hKey
)
385 pKey
= static_cast<ORegKey
*>(hKey
);
387 return RegError::INVALID_KEY
;
389 return dumpRegistry(pKey
->getRegistry(), hKey
);
393 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */