xref: /aoo41x/main/registry/source/keyimpl.cxx (revision 51134e9e)
1*51134e9eSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*51134e9eSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*51134e9eSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*51134e9eSAndrew Rist  * distributed with this work for additional information
6*51134e9eSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*51134e9eSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*51134e9eSAndrew Rist  * "License"); you may not use this file except in compliance
9*51134e9eSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*51134e9eSAndrew Rist  *
11*51134e9eSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*51134e9eSAndrew Rist  *
13*51134e9eSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*51134e9eSAndrew Rist  * software distributed under the License is distributed on an
15*51134e9eSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*51134e9eSAndrew Rist  * KIND, either express or implied.  See the License for the
17*51134e9eSAndrew Rist  * specific language governing permissions and limitations
18*51134e9eSAndrew Rist  * under the License.
19*51134e9eSAndrew Rist  *
20*51134e9eSAndrew Rist  *************************************************************/
21*51134e9eSAndrew Rist 
22*51134e9eSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_registry.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "keyimpl.hxx"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "reflcnst.hxx"
30cdf0e10cSrcweir #include "rtl/alloc.h"
31cdf0e10cSrcweir #include "rtl/memory.h"
32cdf0e10cSrcweir #include "rtl/ustrbuf.hxx"
33cdf0e10cSrcweir 
34cdf0e10cSrcweir using rtl::OUString;
35cdf0e10cSrcweir using rtl::OUStringBuffer;
36cdf0e10cSrcweir using namespace store;
37cdf0e10cSrcweir 
38cdf0e10cSrcweir namespace { static char const VALUE_PREFIX[] = "$VL_"; }
39cdf0e10cSrcweir 
40cdf0e10cSrcweir //*********************************************************************
41cdf0e10cSrcweir //  ORegKey()
42cdf0e10cSrcweir //
ORegKey(const OUString & keyName,ORegistry * pReg)43cdf0e10cSrcweir ORegKey::ORegKey(const OUString& keyName, ORegistry* pReg)
44cdf0e10cSrcweir 	: m_refCount(1)
45cdf0e10cSrcweir 	, m_name(keyName)
46cdf0e10cSrcweir 	, m_bDeleted(0)
47cdf0e10cSrcweir 	, m_bModified(0)
48cdf0e10cSrcweir     , m_pRegistry(pReg)
49cdf0e10cSrcweir {
50cdf0e10cSrcweir }
51cdf0e10cSrcweir 
52cdf0e10cSrcweir //*********************************************************************
53cdf0e10cSrcweir //  ~ORegKey()
54cdf0e10cSrcweir //
~ORegKey()55cdf0e10cSrcweir ORegKey::~ORegKey()
56cdf0e10cSrcweir {
57cdf0e10cSrcweir 	OSL_POSTCOND(m_refCount == 0, "registry::ORegKey::dtor(): refcount not zero.");
58cdf0e10cSrcweir }
59cdf0e10cSrcweir 
60cdf0e10cSrcweir //*********************************************************************
61cdf0e10cSrcweir //  acquireKey
62cdf0e10cSrcweir //
acquireKey(RegKeyHandle hKey)63cdf0e10cSrcweir RegError ORegKey::acquireKey(RegKeyHandle hKey)
64cdf0e10cSrcweir {
65cdf0e10cSrcweir     return m_pRegistry->acquireKey(hKey);
66cdf0e10cSrcweir }
67cdf0e10cSrcweir 
68cdf0e10cSrcweir //*********************************************************************
69cdf0e10cSrcweir //  releaseKey
70cdf0e10cSrcweir //
releaseKey(RegKeyHandle hKey)71cdf0e10cSrcweir RegError ORegKey::releaseKey(RegKeyHandle hKey)
72cdf0e10cSrcweir {
73cdf0e10cSrcweir     return m_pRegistry->releaseKey(hKey);
74cdf0e10cSrcweir }
75cdf0e10cSrcweir 
76cdf0e10cSrcweir //*********************************************************************
77cdf0e10cSrcweir //  createKey
78cdf0e10cSrcweir //
createKey(const OUString & keyName,RegKeyHandle * phNewKey)79cdf0e10cSrcweir RegError ORegKey::createKey(const OUString& keyName, RegKeyHandle* phNewKey)
80cdf0e10cSrcweir {
81cdf0e10cSrcweir     return m_pRegistry->createKey(this, keyName, phNewKey);
82cdf0e10cSrcweir }
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 
85cdf0e10cSrcweir //*********************************************************************
86cdf0e10cSrcweir //  openKey
87cdf0e10cSrcweir //
openKey(const OUString & keyName,RegKeyHandle * phOpenKey)88cdf0e10cSrcweir RegError ORegKey::openKey(const OUString& keyName, RegKeyHandle* phOpenKey)
89cdf0e10cSrcweir {
90cdf0e10cSrcweir     return m_pRegistry->openKey(this, keyName, phOpenKey);
91cdf0e10cSrcweir }
92cdf0e10cSrcweir 
93cdf0e10cSrcweir 
94cdf0e10cSrcweir //*********************************************************************
95cdf0e10cSrcweir //  openSubKeys
96cdf0e10cSrcweir //
openSubKeys(const OUString & keyName,RegKeyHandle ** phOpenSubKeys,sal_uInt32 * pnSubKeys)97cdf0e10cSrcweir RegError ORegKey::openSubKeys(const OUString& keyName, RegKeyHandle** phOpenSubKeys, sal_uInt32* pnSubKeys)
98cdf0e10cSrcweir {
99cdf0e10cSrcweir     RegError _ret = REG_NO_ERROR;
100cdf0e10cSrcweir 
101cdf0e10cSrcweir 	*phOpenSubKeys = 0;
102cdf0e10cSrcweir 	*pnSubKeys = 0;
103cdf0e10cSrcweir 
104cdf0e10cSrcweir     ORegKey* pKey = this;
105cdf0e10cSrcweir     if ( keyName.getLength() )
106cdf0e10cSrcweir     {
107cdf0e10cSrcweir         _ret = openKey(keyName, (RegKeyHandle*)&pKey);
108cdf0e10cSrcweir         if (_ret != REG_NO_ERROR)
109cdf0e10cSrcweir             return _ret;
110cdf0e10cSrcweir     }
111cdf0e10cSrcweir 
112cdf0e10cSrcweir     sal_uInt32 nSubKeys = pKey->countSubKeys();
113cdf0e10cSrcweir     *pnSubKeys = nSubKeys;
114cdf0e10cSrcweir 
115cdf0e10cSrcweir     ORegKey** pSubKeys;
116cdf0e10cSrcweir     pSubKeys = (ORegKey**)rtl_allocateZeroMemory(nSubKeys * sizeof(ORegKey*));
117cdf0e10cSrcweir 
118cdf0e10cSrcweir     OStoreDirectory::iterator   iter;
119cdf0e10cSrcweir     OStoreDirectory             rStoreDir(pKey->getStoreDir());
120cdf0e10cSrcweir     storeError                  _err = rStoreDir.first(iter);
121cdf0e10cSrcweir 
122cdf0e10cSrcweir     nSubKeys = 0;
123cdf0e10cSrcweir     while ( _err == store_E_None )
124cdf0e10cSrcweir     {
125cdf0e10cSrcweir         if ( iter.m_nAttrib & STORE_ATTRIB_ISDIR )
126cdf0e10cSrcweir         {
127cdf0e10cSrcweir 			OUString const sSubKeyName = iter.m_pszName;
128cdf0e10cSrcweir 
129cdf0e10cSrcweir 			ORegKey* pOpenSubKey = 0;
130cdf0e10cSrcweir             _ret = pKey->openKey(sSubKeyName, (RegKeyHandle*)&pOpenSubKey);
131cdf0e10cSrcweir             if (_ret != REG_NO_ERROR)
132cdf0e10cSrcweir             {
133cdf0e10cSrcweir                 *phOpenSubKeys = NULL;
134cdf0e10cSrcweir                 *pnSubKeys = 0;
135cdf0e10cSrcweir 				rtl_freeMemory(pSubKeys); // @@@ leaking 'pSubKeys[0...nSubkeys-1]'
136cdf0e10cSrcweir                 return _ret;              // @@@ leaking 'pKey'
137cdf0e10cSrcweir             }
138cdf0e10cSrcweir 
139cdf0e10cSrcweir             pSubKeys[nSubKeys] = pOpenSubKey;
140cdf0e10cSrcweir 
141cdf0e10cSrcweir             nSubKeys++;
142cdf0e10cSrcweir         }
143cdf0e10cSrcweir 
144cdf0e10cSrcweir         _err = rStoreDir.next(iter);
145cdf0e10cSrcweir     }
146cdf0e10cSrcweir 
147cdf0e10cSrcweir     *phOpenSubKeys = (RegKeyHandle*)pSubKeys;
148cdf0e10cSrcweir     if (keyName.getLength())
149cdf0e10cSrcweir     {
150cdf0e10cSrcweir 		(void) releaseKey(pKey);
151cdf0e10cSrcweir     }
152cdf0e10cSrcweir     return REG_NO_ERROR;
153cdf0e10cSrcweir }
154cdf0e10cSrcweir 
155cdf0e10cSrcweir 
156cdf0e10cSrcweir //*********************************************************************
157cdf0e10cSrcweir //  getKeyNames
158cdf0e10cSrcweir //
getKeyNames(const OUString & keyName,rtl_uString *** pSubKeyNames,sal_uInt32 * pnSubKeys)159cdf0e10cSrcweir RegError ORegKey::getKeyNames(const OUString& keyName,
160cdf0e10cSrcweir                               rtl_uString*** pSubKeyNames,
161cdf0e10cSrcweir                               sal_uInt32* pnSubKeys)
162cdf0e10cSrcweir {
163cdf0e10cSrcweir     RegError _ret = REG_NO_ERROR;
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 	*pSubKeyNames = 0;
166cdf0e10cSrcweir 	*pnSubKeys = 0;
167cdf0e10cSrcweir 
168cdf0e10cSrcweir     ORegKey* pKey = this;
169cdf0e10cSrcweir     if (keyName.getLength())
170cdf0e10cSrcweir     {
171cdf0e10cSrcweir         _ret = openKey(keyName, (RegKeyHandle*)&pKey);
172cdf0e10cSrcweir         if (_ret != REG_NO_ERROR)
173cdf0e10cSrcweir             return _ret;
174cdf0e10cSrcweir     }
175cdf0e10cSrcweir 
176cdf0e10cSrcweir     sal_uInt32 nSubKeys = pKey->countSubKeys();
177cdf0e10cSrcweir     *pnSubKeys = nSubKeys;
178cdf0e10cSrcweir 
179cdf0e10cSrcweir     rtl_uString** pSubKeys = 0;
180cdf0e10cSrcweir     pSubKeys = (rtl_uString**)rtl_allocateZeroMemory(nSubKeys * sizeof(rtl_uString*));
181cdf0e10cSrcweir 
182cdf0e10cSrcweir     OStoreDirectory::iterator   iter;
183cdf0e10cSrcweir     OStoreDirectory             rStoreDir(pKey->getStoreDir());
184cdf0e10cSrcweir     storeError                  _err = rStoreDir.first(iter);
185cdf0e10cSrcweir 
186cdf0e10cSrcweir     nSubKeys = 0;
187cdf0e10cSrcweir 
188cdf0e10cSrcweir     while ( _err == store_E_None )
189cdf0e10cSrcweir     {
190cdf0e10cSrcweir         if ( iter.m_nAttrib & STORE_ATTRIB_ISDIR)
191cdf0e10cSrcweir         {
192cdf0e10cSrcweir 			OUString const sSubKeyName = iter.m_pszName;
193cdf0e10cSrcweir 
194cdf0e10cSrcweir 			OUString sFullKeyName(pKey->getName());
195cdf0e10cSrcweir             if (sFullKeyName.getLength() > 1)
196cdf0e10cSrcweir                 sFullKeyName += m_pRegistry->ROOT;
197cdf0e10cSrcweir             sFullKeyName += sSubKeyName;
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 			rtl_uString_newFromString(&pSubKeys[nSubKeys], sFullKeyName.pData);
200cdf0e10cSrcweir 
201cdf0e10cSrcweir             nSubKeys++;
202cdf0e10cSrcweir         }
203cdf0e10cSrcweir 
204cdf0e10cSrcweir         _err = rStoreDir.next(iter);
205cdf0e10cSrcweir     }
206cdf0e10cSrcweir 
207cdf0e10cSrcweir     *pSubKeyNames = pSubKeys;
208cdf0e10cSrcweir     if (keyName.getLength())
209cdf0e10cSrcweir     {
210cdf0e10cSrcweir 		releaseKey(pKey);
211cdf0e10cSrcweir     }
212cdf0e10cSrcweir     return REG_NO_ERROR;
213cdf0e10cSrcweir }
214cdf0e10cSrcweir 
215cdf0e10cSrcweir 
216cdf0e10cSrcweir //*********************************************************************
217cdf0e10cSrcweir //  closeKey
218cdf0e10cSrcweir //
closeKey(RegKeyHandle hKey)219cdf0e10cSrcweir RegError ORegKey::closeKey(RegKeyHandle hKey)
220cdf0e10cSrcweir {
221cdf0e10cSrcweir     return (m_pRegistry->closeKey(hKey));
222cdf0e10cSrcweir }
223cdf0e10cSrcweir 
224cdf0e10cSrcweir 
225cdf0e10cSrcweir //*********************************************************************
226cdf0e10cSrcweir //  deleteKey
227cdf0e10cSrcweir //
deleteKey(const OUString & keyName)228cdf0e10cSrcweir RegError ORegKey::deleteKey(const OUString& keyName)
229cdf0e10cSrcweir {
230cdf0e10cSrcweir     return (m_pRegistry->deleteKey(this, keyName));
231cdf0e10cSrcweir }
232cdf0e10cSrcweir 
233cdf0e10cSrcweir 
234cdf0e10cSrcweir //*********************************************************************
235cdf0e10cSrcweir //  getValueType
236cdf0e10cSrcweir //
getValueInfo(const OUString & valueName,RegValueType * pValueType,sal_uInt32 * pValueSize) const237cdf0e10cSrcweir RegError ORegKey::getValueInfo(const OUString& valueName, RegValueType* pValueType, sal_uInt32* pValueSize) const
238cdf0e10cSrcweir {
239cdf0e10cSrcweir     OStoreStream    rValue;
240cdf0e10cSrcweir     sal_uInt8*      pBuffer;
241cdf0e10cSrcweir     storeAccessMode accessMode = VALUE_MODE_OPEN;
242cdf0e10cSrcweir 
243cdf0e10cSrcweir     if (m_pRegistry->isReadOnly())
244cdf0e10cSrcweir     {
245cdf0e10cSrcweir         accessMode = VALUE_MODE_OPENREAD;
246cdf0e10cSrcweir     }
247cdf0e10cSrcweir 
248cdf0e10cSrcweir     OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) );
249cdf0e10cSrcweir     sImplValueName += valueName;
250cdf0e10cSrcweir 
251cdf0e10cSrcweir     REG_GUARD(m_pRegistry->m_mutex);
252cdf0e10cSrcweir 
253cdf0e10cSrcweir     if ( rValue.create(m_pRegistry->getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, accessMode) )
254cdf0e10cSrcweir     {
255cdf0e10cSrcweir         *pValueType = RG_VALUETYPE_NOT_DEFINED;
256cdf0e10cSrcweir         *pValueSize = 0;
257cdf0e10cSrcweir         return REG_VALUE_NOT_EXISTS;
258cdf0e10cSrcweir     }
259cdf0e10cSrcweir 
260cdf0e10cSrcweir     pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE);
261cdf0e10cSrcweir 
262cdf0e10cSrcweir     sal_uInt32  readBytes;
263cdf0e10cSrcweir     if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) )
264cdf0e10cSrcweir     {
265cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
266cdf0e10cSrcweir         return REG_INVALID_VALUE;
267cdf0e10cSrcweir     }
268cdf0e10cSrcweir     if (readBytes != VALUE_HEADERSIZE)
269cdf0e10cSrcweir     {
270cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
271cdf0e10cSrcweir         return REG_INVALID_VALUE;
272cdf0e10cSrcweir     }
273cdf0e10cSrcweir 
274cdf0e10cSrcweir     sal_uInt32  size;
275cdf0e10cSrcweir     sal_uInt8   type = *((sal_uInt8*)pBuffer);
276cdf0e10cSrcweir     readUINT32(pBuffer+VALUE_TYPEOFFSET, size);
277cdf0e10cSrcweir 
278cdf0e10cSrcweir     *pValueType = (RegValueType)type;
279cdf0e10cSrcweir //    if (*pValueType == RG_VALUETYPE_UNICODE)
280cdf0e10cSrcweir //    {
281cdf0e10cSrcweir //        *pValueSize = (size / 2) * sizeof(sal_Unicode);
282cdf0e10cSrcweir //    } else
283cdf0e10cSrcweir //    {
284cdf0e10cSrcweir         if (*pValueType > 4)
285cdf0e10cSrcweir         {
286cdf0e10cSrcweir             rtl_freeMemory(pBuffer);
287cdf0e10cSrcweir             pBuffer = (sal_uInt8*)rtl_allocateMemory(4);
288cdf0e10cSrcweir             rValue.readAt(VALUE_HEADEROFFSET, pBuffer, 4, readBytes);
289cdf0e10cSrcweir 
290cdf0e10cSrcweir             readUINT32(pBuffer, size);
291cdf0e10cSrcweir         }
292cdf0e10cSrcweir 
293cdf0e10cSrcweir         *pValueSize = size;
294cdf0e10cSrcweir //    }
295cdf0e10cSrcweir 
296cdf0e10cSrcweir     rtl_freeMemory(pBuffer);
297cdf0e10cSrcweir     return REG_NO_ERROR;
298cdf0e10cSrcweir }
299cdf0e10cSrcweir 
300cdf0e10cSrcweir 
301cdf0e10cSrcweir //*********************************************************************
302cdf0e10cSrcweir //  setValue
303cdf0e10cSrcweir //
setValue(const OUString & valueName,RegValueType vType,RegValue value,sal_uInt32 vSize)304cdf0e10cSrcweir RegError ORegKey::setValue(const OUString& valueName, RegValueType vType, RegValue value, sal_uInt32 vSize)
305cdf0e10cSrcweir {
306cdf0e10cSrcweir     OStoreStream    rValue;
307cdf0e10cSrcweir     sal_uInt8*      pBuffer;
308cdf0e10cSrcweir 
309cdf0e10cSrcweir     if (m_pRegistry->isReadOnly())
310cdf0e10cSrcweir     {
311cdf0e10cSrcweir         return REG_REGISTRY_READONLY;
312cdf0e10cSrcweir     }
313cdf0e10cSrcweir 
314cdf0e10cSrcweir     if (vType > 4)
315cdf0e10cSrcweir     {
316cdf0e10cSrcweir         return REG_INVALID_VALUE;
317cdf0e10cSrcweir     }
318cdf0e10cSrcweir 
319cdf0e10cSrcweir     OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) );
320cdf0e10cSrcweir     sImplValueName += valueName;
321cdf0e10cSrcweir 
322cdf0e10cSrcweir     REG_GUARD(m_pRegistry->m_mutex);
323cdf0e10cSrcweir 
324cdf0e10cSrcweir     if ( rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT , sImplValueName, VALUE_MODE_CREATE) )
325cdf0e10cSrcweir     {
326cdf0e10cSrcweir         return REG_SET_VALUE_FAILED;
327cdf0e10cSrcweir     }
328cdf0e10cSrcweir 
329cdf0e10cSrcweir     sal_uInt32 size = vSize;
330cdf0e10cSrcweir 
331cdf0e10cSrcweir     sal_uInt8 type = (sal_uInt8)vType;
332cdf0e10cSrcweir     pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE + size);
333cdf0e10cSrcweir     rtl_copyMemory(pBuffer, &type, 1);
334cdf0e10cSrcweir 
335cdf0e10cSrcweir     writeUINT32(pBuffer+VALUE_TYPEOFFSET, size);
336cdf0e10cSrcweir 
337cdf0e10cSrcweir     switch (vType)
338cdf0e10cSrcweir     {
339cdf0e10cSrcweir         case RG_VALUETYPE_NOT_DEFINED:
340cdf0e10cSrcweir             rtl_copyMemory(pBuffer+VALUE_HEADEROFFSET, value, size);
341cdf0e10cSrcweir             break;
342cdf0e10cSrcweir         case RG_VALUETYPE_LONG:
343cdf0e10cSrcweir             writeINT32(pBuffer+VALUE_HEADEROFFSET, *((sal_Int32*)value));
344cdf0e10cSrcweir             break;
345cdf0e10cSrcweir         case RG_VALUETYPE_STRING:
346cdf0e10cSrcweir             writeUtf8(pBuffer+VALUE_HEADEROFFSET, (const sal_Char*)value);
347cdf0e10cSrcweir             break;
348cdf0e10cSrcweir         case RG_VALUETYPE_UNICODE:
349cdf0e10cSrcweir             writeString(pBuffer+VALUE_HEADEROFFSET, (const sal_Unicode*)value);
350cdf0e10cSrcweir             break;
351cdf0e10cSrcweir         case RG_VALUETYPE_BINARY:
352cdf0e10cSrcweir             rtl_copyMemory(pBuffer+VALUE_HEADEROFFSET, value, size);
353cdf0e10cSrcweir             break;
354cdf0e10cSrcweir         default:
355cdf0e10cSrcweir             OSL_ASSERT(false);
356cdf0e10cSrcweir             break;
357cdf0e10cSrcweir     }
358cdf0e10cSrcweir 
359cdf0e10cSrcweir     sal_uInt32  writenBytes;
360cdf0e10cSrcweir     if ( rValue.writeAt(0, pBuffer, VALUE_HEADERSIZE+size, writenBytes) )
361cdf0e10cSrcweir     {
362cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
363cdf0e10cSrcweir         return REG_SET_VALUE_FAILED;
364cdf0e10cSrcweir     }
365cdf0e10cSrcweir     if (writenBytes != (VALUE_HEADERSIZE+size))
366cdf0e10cSrcweir     {
367cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
368cdf0e10cSrcweir         return REG_SET_VALUE_FAILED;
369cdf0e10cSrcweir     }
370cdf0e10cSrcweir 	setModified();
371cdf0e10cSrcweir 
372cdf0e10cSrcweir     rtl_freeMemory(pBuffer);
373cdf0e10cSrcweir     return REG_NO_ERROR;
374cdf0e10cSrcweir }
375cdf0e10cSrcweir 
376cdf0e10cSrcweir //*********************************************************************
377cdf0e10cSrcweir //  setLongListValue
378cdf0e10cSrcweir //
setLongListValue(const OUString & valueName,sal_Int32 * pValueList,sal_uInt32 len)379cdf0e10cSrcweir RegError ORegKey::setLongListValue(const OUString& valueName, sal_Int32* pValueList, sal_uInt32 len)
380cdf0e10cSrcweir {
381cdf0e10cSrcweir     OStoreStream    rValue;
382cdf0e10cSrcweir     sal_uInt8*      pBuffer;
383cdf0e10cSrcweir 
384cdf0e10cSrcweir     if (m_pRegistry->isReadOnly())
385cdf0e10cSrcweir     {
386cdf0e10cSrcweir         return REG_REGISTRY_READONLY;
387cdf0e10cSrcweir     }
388cdf0e10cSrcweir 
389cdf0e10cSrcweir     OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) );
390cdf0e10cSrcweir     sImplValueName += valueName;
391cdf0e10cSrcweir 
392cdf0e10cSrcweir     REG_GUARD(m_pRegistry->m_mutex);
393cdf0e10cSrcweir 
394cdf0e10cSrcweir     if (rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, VALUE_MODE_CREATE) )
395cdf0e10cSrcweir     {
396cdf0e10cSrcweir         return REG_SET_VALUE_FAILED;
397cdf0e10cSrcweir     }
398cdf0e10cSrcweir 
399cdf0e10cSrcweir     sal_uInt32 size = 4; // 4 Bytes (sal_uInt32) fuer die Laenge
400cdf0e10cSrcweir 
401cdf0e10cSrcweir     size += len * 4;
402cdf0e10cSrcweir 
403cdf0e10cSrcweir     sal_uInt8 type = (sal_uInt8)RG_VALUETYPE_LONGLIST;
404cdf0e10cSrcweir     pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE + size);
405cdf0e10cSrcweir     rtl_copyMemory(pBuffer, &type, 1);
406cdf0e10cSrcweir 
407cdf0e10cSrcweir     writeUINT32(pBuffer+VALUE_TYPEOFFSET, size);
408cdf0e10cSrcweir     writeUINT32(pBuffer+VALUE_HEADEROFFSET, len);
409cdf0e10cSrcweir 
410cdf0e10cSrcweir     sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays
411cdf0e10cSrcweir 
412cdf0e10cSrcweir     for (sal_uInt32 i=0; i < len; i++)
413cdf0e10cSrcweir     {
414cdf0e10cSrcweir         writeINT32(pBuffer+VALUE_HEADEROFFSET+offset, pValueList[i]);
415cdf0e10cSrcweir         offset += 4;
416cdf0e10cSrcweir     }
417cdf0e10cSrcweir 
418cdf0e10cSrcweir     sal_uInt32  writenBytes;
419cdf0e10cSrcweir     if ( rValue.writeAt(0, pBuffer, VALUE_HEADERSIZE+size, writenBytes) )
420cdf0e10cSrcweir     {
421cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
422cdf0e10cSrcweir         return REG_SET_VALUE_FAILED;
423cdf0e10cSrcweir     }
424cdf0e10cSrcweir     if (writenBytes != (VALUE_HEADEROFFSET+size))
425cdf0e10cSrcweir     {
426cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
427cdf0e10cSrcweir         return REG_SET_VALUE_FAILED;
428cdf0e10cSrcweir     }
429cdf0e10cSrcweir 	setModified();
430cdf0e10cSrcweir 
431cdf0e10cSrcweir     rtl_freeMemory(pBuffer);
432cdf0e10cSrcweir     return REG_NO_ERROR;
433cdf0e10cSrcweir }
434cdf0e10cSrcweir 
435cdf0e10cSrcweir //*********************************************************************
436cdf0e10cSrcweir //  setStringListValue
437cdf0e10cSrcweir //
setStringListValue(const OUString & valueName,sal_Char ** pValueList,sal_uInt32 len)438cdf0e10cSrcweir RegError ORegKey::setStringListValue(const OUString& valueName, sal_Char** pValueList, sal_uInt32 len)
439cdf0e10cSrcweir {
440cdf0e10cSrcweir     OStoreStream    rValue;
441cdf0e10cSrcweir     sal_uInt8*      pBuffer;
442cdf0e10cSrcweir 
443cdf0e10cSrcweir     if (m_pRegistry->isReadOnly())
444cdf0e10cSrcweir     {
445cdf0e10cSrcweir         return REG_REGISTRY_READONLY;
446cdf0e10cSrcweir     }
447cdf0e10cSrcweir 
448cdf0e10cSrcweir     OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) );
449cdf0e10cSrcweir     sImplValueName += valueName;
450cdf0e10cSrcweir 
451cdf0e10cSrcweir     REG_GUARD(m_pRegistry->m_mutex);
452cdf0e10cSrcweir 
453cdf0e10cSrcweir     if (rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, VALUE_MODE_CREATE) )
454cdf0e10cSrcweir     {
455cdf0e10cSrcweir         return REG_SET_VALUE_FAILED;
456cdf0e10cSrcweir     }
457cdf0e10cSrcweir 
458cdf0e10cSrcweir     sal_uInt32 size = 4; // 4 Bytes (sal_uInt32) fuer die Laenge
459cdf0e10cSrcweir 
460cdf0e10cSrcweir     sal_uInt32 i;
461cdf0e10cSrcweir     for (i=0; i < len; i++)
462cdf0e10cSrcweir     {
463cdf0e10cSrcweir         size +=  4 + strlen(pValueList[i]) + 1;
464cdf0e10cSrcweir     }
465cdf0e10cSrcweir 
466cdf0e10cSrcweir     sal_uInt8 type = (sal_uInt8)RG_VALUETYPE_STRINGLIST;
467cdf0e10cSrcweir     pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE + size);
468cdf0e10cSrcweir     rtl_copyMemory(pBuffer, &type, 1);
469cdf0e10cSrcweir 
470cdf0e10cSrcweir     writeUINT32(pBuffer+VALUE_TYPEOFFSET, size);
471cdf0e10cSrcweir     writeUINT32(pBuffer+VALUE_HEADEROFFSET, len);
472cdf0e10cSrcweir 
473cdf0e10cSrcweir     sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays;
474cdf0e10cSrcweir     sal_uInt32 sLen = 0;
475cdf0e10cSrcweir 
476cdf0e10cSrcweir     for (i=0; i < len; i++)
477cdf0e10cSrcweir     {
478cdf0e10cSrcweir         sLen = strlen(pValueList[i]) + 1;
479cdf0e10cSrcweir         writeUINT32(pBuffer+VALUE_HEADEROFFSET+offset, sLen);
480cdf0e10cSrcweir 
481cdf0e10cSrcweir         offset += 4;
482cdf0e10cSrcweir         writeUtf8(pBuffer+VALUE_HEADEROFFSET+offset, pValueList[i]);
483cdf0e10cSrcweir         offset += sLen;
484cdf0e10cSrcweir     }
485cdf0e10cSrcweir 
486cdf0e10cSrcweir     sal_uInt32  writenBytes;
487cdf0e10cSrcweir     if ( rValue.writeAt(0, pBuffer, VALUE_HEADERSIZE+size, writenBytes) )
488cdf0e10cSrcweir     {
489cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
490cdf0e10cSrcweir         return REG_SET_VALUE_FAILED;
491cdf0e10cSrcweir     }
492cdf0e10cSrcweir     if (writenBytes != (VALUE_HEADERSIZE+size))
493cdf0e10cSrcweir     {
494cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
495cdf0e10cSrcweir         return REG_SET_VALUE_FAILED;
496cdf0e10cSrcweir     }
497cdf0e10cSrcweir 	setModified();
498cdf0e10cSrcweir 
499cdf0e10cSrcweir     rtl_freeMemory(pBuffer);
500cdf0e10cSrcweir     return REG_NO_ERROR;
501cdf0e10cSrcweir }
502cdf0e10cSrcweir 
503cdf0e10cSrcweir //*********************************************************************
504cdf0e10cSrcweir //  setUnicodeListValue
505cdf0e10cSrcweir //
setUnicodeListValue(const OUString & valueName,sal_Unicode ** pValueList,sal_uInt32 len)506cdf0e10cSrcweir RegError ORegKey::setUnicodeListValue(const OUString& valueName, sal_Unicode** pValueList, sal_uInt32 len)
507cdf0e10cSrcweir {
508cdf0e10cSrcweir     OStoreStream    rValue;
509cdf0e10cSrcweir     sal_uInt8*      pBuffer;
510cdf0e10cSrcweir 
511cdf0e10cSrcweir     if (m_pRegistry->isReadOnly())
512cdf0e10cSrcweir     {
513cdf0e10cSrcweir         return REG_REGISTRY_READONLY;
514cdf0e10cSrcweir     }
515cdf0e10cSrcweir 
516cdf0e10cSrcweir     OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) );
517cdf0e10cSrcweir     sImplValueName += valueName;
518cdf0e10cSrcweir 
519cdf0e10cSrcweir     REG_GUARD(m_pRegistry->m_mutex);
520cdf0e10cSrcweir 
521cdf0e10cSrcweir     if (rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, VALUE_MODE_CREATE) )
522cdf0e10cSrcweir     {
523cdf0e10cSrcweir         return REG_SET_VALUE_FAILED;
524cdf0e10cSrcweir     }
525cdf0e10cSrcweir 
526cdf0e10cSrcweir     sal_uInt32 size = 4; // 4 Bytes (sal_uInt32) fuer die Laenge
527cdf0e10cSrcweir 
528cdf0e10cSrcweir     sal_uInt32 i;
529cdf0e10cSrcweir     for (i=0; i < len; i++)
530cdf0e10cSrcweir     {
531cdf0e10cSrcweir         size +=  4 + ((rtl_ustr_getLength(pValueList[i]) +1) * 2);
532cdf0e10cSrcweir     }
533cdf0e10cSrcweir 
534cdf0e10cSrcweir     sal_uInt8 type = (sal_uInt8)RG_VALUETYPE_UNICODELIST;
535cdf0e10cSrcweir     pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE + size);
536cdf0e10cSrcweir     rtl_copyMemory(pBuffer, &type, 1);
537cdf0e10cSrcweir 
538cdf0e10cSrcweir     writeUINT32(pBuffer+VALUE_TYPEOFFSET, size);
539cdf0e10cSrcweir     writeUINT32(pBuffer+VALUE_HEADEROFFSET, len);
540cdf0e10cSrcweir 
541cdf0e10cSrcweir     sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays;
542cdf0e10cSrcweir     sal_uInt32 sLen = 0;
543cdf0e10cSrcweir 
544cdf0e10cSrcweir     for (i=0; i < len; i++)
545cdf0e10cSrcweir     {
546cdf0e10cSrcweir         sLen = (rtl_ustr_getLength(pValueList[i]) + 1) * 2;
547cdf0e10cSrcweir         writeUINT32(pBuffer+VALUE_HEADEROFFSET+offset, sLen);
548cdf0e10cSrcweir 
549cdf0e10cSrcweir         offset += 4;
550cdf0e10cSrcweir         writeString(pBuffer+VALUE_HEADEROFFSET+offset, pValueList[i]);
551cdf0e10cSrcweir         offset += sLen;
552cdf0e10cSrcweir     }
553cdf0e10cSrcweir 
554cdf0e10cSrcweir     sal_uInt32  writenBytes;
555cdf0e10cSrcweir     if ( rValue.writeAt(0, pBuffer, VALUE_HEADERSIZE+size, writenBytes) )
556cdf0e10cSrcweir     {
557cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
558cdf0e10cSrcweir         return REG_SET_VALUE_FAILED;
559cdf0e10cSrcweir     }
560cdf0e10cSrcweir     if (writenBytes != (VALUE_HEADERSIZE+size))
561cdf0e10cSrcweir     {
562cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
563cdf0e10cSrcweir         return REG_SET_VALUE_FAILED;
564cdf0e10cSrcweir     }
565cdf0e10cSrcweir 	setModified();
566cdf0e10cSrcweir 
567cdf0e10cSrcweir     rtl_freeMemory(pBuffer);
568cdf0e10cSrcweir     return REG_NO_ERROR;
569cdf0e10cSrcweir }
570cdf0e10cSrcweir 
571cdf0e10cSrcweir //*********************************************************************
572cdf0e10cSrcweir //  getValue
573cdf0e10cSrcweir //
getValue(const OUString & valueName,RegValue value) const574cdf0e10cSrcweir RegError ORegKey::getValue(const OUString& valueName, RegValue value) const
575cdf0e10cSrcweir {
576cdf0e10cSrcweir     OStoreStream    rValue;
577cdf0e10cSrcweir     sal_uInt8*      pBuffer;
578cdf0e10cSrcweir     RegValueType    valueType;
579cdf0e10cSrcweir     sal_uInt32      valueSize;
580cdf0e10cSrcweir     storeAccessMode accessMode = VALUE_MODE_OPEN;
581cdf0e10cSrcweir 
582cdf0e10cSrcweir     if (m_pRegistry->isReadOnly())
583cdf0e10cSrcweir     {
584cdf0e10cSrcweir         accessMode = VALUE_MODE_OPENREAD;
585cdf0e10cSrcweir     }
586cdf0e10cSrcweir 
587cdf0e10cSrcweir     OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) );
588cdf0e10cSrcweir     sImplValueName += valueName;
589cdf0e10cSrcweir 
590cdf0e10cSrcweir     REG_GUARD(m_pRegistry->m_mutex);
591cdf0e10cSrcweir 
592cdf0e10cSrcweir     if (rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, accessMode) )
593cdf0e10cSrcweir     {
594cdf0e10cSrcweir         return REG_VALUE_NOT_EXISTS;
595cdf0e10cSrcweir     }
596cdf0e10cSrcweir 
597cdf0e10cSrcweir     pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE);
598cdf0e10cSrcweir 
599cdf0e10cSrcweir     sal_uInt32  readBytes;
600cdf0e10cSrcweir     if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) )
601cdf0e10cSrcweir     {
602cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
603cdf0e10cSrcweir         return REG_INVALID_VALUE;
604cdf0e10cSrcweir     }
605cdf0e10cSrcweir     if (readBytes != VALUE_HEADERSIZE)
606cdf0e10cSrcweir     {
607cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
608cdf0e10cSrcweir         return REG_INVALID_VALUE;
609cdf0e10cSrcweir     }
610cdf0e10cSrcweir 
611cdf0e10cSrcweir     sal_uInt8   type = *((sal_uInt8*)pBuffer);
612cdf0e10cSrcweir     valueType = (RegValueType)type;
613cdf0e10cSrcweir     readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize);
614cdf0e10cSrcweir 
615cdf0e10cSrcweir     rtl_freeMemory(pBuffer);
616cdf0e10cSrcweir 
617cdf0e10cSrcweir     if (valueType > 4)
618cdf0e10cSrcweir     {
619cdf0e10cSrcweir         return REG_INVALID_VALUE;
620cdf0e10cSrcweir     }
621cdf0e10cSrcweir 
622cdf0e10cSrcweir     pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize);
623cdf0e10cSrcweir 
624cdf0e10cSrcweir     if ( rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, readBytes) )
625cdf0e10cSrcweir     {
626cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
627cdf0e10cSrcweir         return REG_INVALID_VALUE;
628cdf0e10cSrcweir     }
629cdf0e10cSrcweir     if (readBytes != valueSize)
630cdf0e10cSrcweir     {
631cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
632cdf0e10cSrcweir         return REG_INVALID_VALUE;
633cdf0e10cSrcweir     }
634cdf0e10cSrcweir 
635cdf0e10cSrcweir     switch (valueType)
636cdf0e10cSrcweir     {
637cdf0e10cSrcweir         case RG_VALUETYPE_NOT_DEFINED:
638cdf0e10cSrcweir             rtl_copyMemory(value, pBuffer, valueSize);
639cdf0e10cSrcweir             break;
640cdf0e10cSrcweir         case RG_VALUETYPE_LONG:
641cdf0e10cSrcweir             readINT32(pBuffer, *((sal_Int32*)value));
642cdf0e10cSrcweir             break;
643cdf0e10cSrcweir         case RG_VALUETYPE_STRING:
644cdf0e10cSrcweir             readUtf8(pBuffer, (sal_Char*)value, valueSize);
645cdf0e10cSrcweir             break;
646cdf0e10cSrcweir         case RG_VALUETYPE_UNICODE:
647cdf0e10cSrcweir             readString(pBuffer, (sal_Unicode*)value, valueSize);
648cdf0e10cSrcweir             break;
649cdf0e10cSrcweir         case RG_VALUETYPE_BINARY:
650cdf0e10cSrcweir             rtl_copyMemory(value, pBuffer, valueSize);
651cdf0e10cSrcweir             break;
652cdf0e10cSrcweir         case RG_VALUETYPE_LONGLIST:
653cdf0e10cSrcweir         case RG_VALUETYPE_STRINGLIST:
654cdf0e10cSrcweir         case RG_VALUETYPE_UNICODELIST:
655cdf0e10cSrcweir             rtl_copyMemory(value, pBuffer, valueSize);
656cdf0e10cSrcweir             break;
657cdf0e10cSrcweir     }
658cdf0e10cSrcweir 
659cdf0e10cSrcweir 
660cdf0e10cSrcweir     rtl_freeMemory(pBuffer);
661cdf0e10cSrcweir     return REG_NO_ERROR;
662cdf0e10cSrcweir }
663cdf0e10cSrcweir 
664cdf0e10cSrcweir //*********************************************************************
665cdf0e10cSrcweir //  getLongListValue
666cdf0e10cSrcweir //
getLongListValue(const OUString & valueName,sal_Int32 ** pValueList,sal_uInt32 * pLen) const667cdf0e10cSrcweir RegError ORegKey::getLongListValue(const OUString& valueName, sal_Int32** pValueList, sal_uInt32* pLen) const
668cdf0e10cSrcweir {
669cdf0e10cSrcweir     OStoreStream    rValue;
670cdf0e10cSrcweir     sal_uInt8*      pBuffer;
671cdf0e10cSrcweir     RegValueType    valueType;
672cdf0e10cSrcweir     sal_uInt32      valueSize;
673cdf0e10cSrcweir     storeAccessMode accessMode = VALUE_MODE_OPEN;
674cdf0e10cSrcweir 
675cdf0e10cSrcweir     if (m_pRegistry->isReadOnly())
676cdf0e10cSrcweir     {
677cdf0e10cSrcweir         accessMode = VALUE_MODE_OPENREAD;
678cdf0e10cSrcweir     }
679cdf0e10cSrcweir 
680cdf0e10cSrcweir     OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) );
681cdf0e10cSrcweir     sImplValueName += valueName;
682cdf0e10cSrcweir 
683cdf0e10cSrcweir     REG_GUARD(m_pRegistry->m_mutex);
684cdf0e10cSrcweir 
685cdf0e10cSrcweir     if (rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, accessMode) )
686cdf0e10cSrcweir     {
687cdf0e10cSrcweir         pValueList = NULL;
688cdf0e10cSrcweir         *pLen = 0;
689cdf0e10cSrcweir         return REG_VALUE_NOT_EXISTS;
690cdf0e10cSrcweir     }
691cdf0e10cSrcweir 
692cdf0e10cSrcweir     pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE);
693cdf0e10cSrcweir 
694cdf0e10cSrcweir     sal_uInt32  readBytes;
695cdf0e10cSrcweir     if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) )
696cdf0e10cSrcweir     {
697cdf0e10cSrcweir         pValueList = NULL;
698cdf0e10cSrcweir         *pLen = 0;
699cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
700cdf0e10cSrcweir         return REG_INVALID_VALUE;
701cdf0e10cSrcweir     }
702cdf0e10cSrcweir     if (readBytes != VALUE_HEADERSIZE)
703cdf0e10cSrcweir     {
704cdf0e10cSrcweir         pValueList = NULL;
705cdf0e10cSrcweir         *pLen = 0;
706cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
707cdf0e10cSrcweir         return REG_INVALID_VALUE;
708cdf0e10cSrcweir     }
709cdf0e10cSrcweir 
710cdf0e10cSrcweir     sal_uInt8   type = *((sal_uInt8*)pBuffer);
711cdf0e10cSrcweir     valueType = (RegValueType)type;
712cdf0e10cSrcweir 
713cdf0e10cSrcweir     if (valueType != RG_VALUETYPE_LONGLIST)
714cdf0e10cSrcweir     {
715cdf0e10cSrcweir         pValueList = NULL;
716cdf0e10cSrcweir         *pLen = 0;
717cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
718cdf0e10cSrcweir         return REG_INVALID_VALUE;
719cdf0e10cSrcweir     }
720cdf0e10cSrcweir 
721cdf0e10cSrcweir     readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize);
722cdf0e10cSrcweir 
723cdf0e10cSrcweir     rtl_freeMemory(pBuffer);
724cdf0e10cSrcweir 
725cdf0e10cSrcweir     pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize);
726cdf0e10cSrcweir 
727cdf0e10cSrcweir     if ( rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, readBytes) )
728cdf0e10cSrcweir     {
729cdf0e10cSrcweir         pValueList = NULL;
730cdf0e10cSrcweir         *pLen = 0;
731cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
732cdf0e10cSrcweir         return REG_INVALID_VALUE;
733cdf0e10cSrcweir     }
734cdf0e10cSrcweir     if (readBytes != valueSize)
735cdf0e10cSrcweir     {
736cdf0e10cSrcweir         pValueList = NULL;
737cdf0e10cSrcweir         *pLen = 0;
738cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
739cdf0e10cSrcweir         return REG_INVALID_VALUE;
740cdf0e10cSrcweir     }
741cdf0e10cSrcweir 
742cdf0e10cSrcweir     sal_uInt32 len = 0;
743cdf0e10cSrcweir     readUINT32(pBuffer, len);
744cdf0e10cSrcweir 
745cdf0e10cSrcweir     *pLen = len;
746cdf0e10cSrcweir     sal_Int32* pVList = (sal_Int32*)rtl_allocateZeroMemory(len * sizeof(sal_Int32));
747cdf0e10cSrcweir 
748cdf0e10cSrcweir     sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays;
749cdf0e10cSrcweir 
750cdf0e10cSrcweir     for (sal_uInt32 i=0; i < len; i++)
751cdf0e10cSrcweir     {
752cdf0e10cSrcweir         readINT32(pBuffer+offset, pVList[i]);
753cdf0e10cSrcweir         offset += 4;
754cdf0e10cSrcweir     }
755cdf0e10cSrcweir 
756cdf0e10cSrcweir     *pValueList = pVList;
757cdf0e10cSrcweir     rtl_freeMemory(pBuffer);
758cdf0e10cSrcweir     return REG_NO_ERROR;
759cdf0e10cSrcweir }
760cdf0e10cSrcweir 
761cdf0e10cSrcweir //*********************************************************************
762cdf0e10cSrcweir //  getStringListValue
763cdf0e10cSrcweir //
getStringListValue(const OUString & valueName,sal_Char *** pValueList,sal_uInt32 * pLen) const764cdf0e10cSrcweir RegError ORegKey::getStringListValue(const OUString& valueName, sal_Char*** pValueList, sal_uInt32* pLen) const
765cdf0e10cSrcweir {
766cdf0e10cSrcweir     OStoreStream    rValue;
767cdf0e10cSrcweir     sal_uInt8*      pBuffer;
768cdf0e10cSrcweir     RegValueType    valueType;
769cdf0e10cSrcweir     sal_uInt32      valueSize;
770cdf0e10cSrcweir     storeAccessMode accessMode = VALUE_MODE_OPEN;
771cdf0e10cSrcweir 
772cdf0e10cSrcweir     if (m_pRegistry->isReadOnly())
773cdf0e10cSrcweir     {
774cdf0e10cSrcweir         accessMode = VALUE_MODE_OPENREAD;
775cdf0e10cSrcweir     }
776cdf0e10cSrcweir 
777cdf0e10cSrcweir     OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) );
778cdf0e10cSrcweir     sImplValueName += valueName;
779cdf0e10cSrcweir 
780cdf0e10cSrcweir     REG_GUARD(m_pRegistry->m_mutex);
781cdf0e10cSrcweir 
782cdf0e10cSrcweir     if ( rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, accessMode) )
783cdf0e10cSrcweir     {
784cdf0e10cSrcweir         pValueList = NULL;
785cdf0e10cSrcweir         *pLen = 0;
786cdf0e10cSrcweir         return REG_VALUE_NOT_EXISTS;
787cdf0e10cSrcweir     }
788cdf0e10cSrcweir 
789cdf0e10cSrcweir     pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE);
790cdf0e10cSrcweir 
791cdf0e10cSrcweir     sal_uInt32  readBytes;
792cdf0e10cSrcweir     if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) )
793cdf0e10cSrcweir     {
794cdf0e10cSrcweir         pValueList = NULL;
795cdf0e10cSrcweir         *pLen = 0;
796cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
797cdf0e10cSrcweir         return REG_INVALID_VALUE;
798cdf0e10cSrcweir     }
799cdf0e10cSrcweir     if (readBytes != VALUE_HEADERSIZE)
800cdf0e10cSrcweir     {
801cdf0e10cSrcweir         pValueList = NULL;
802cdf0e10cSrcweir         *pLen = 0;
803cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
804cdf0e10cSrcweir         return REG_INVALID_VALUE;
805cdf0e10cSrcweir     }
806cdf0e10cSrcweir 
807cdf0e10cSrcweir     sal_uInt8   type = *((sal_uInt8*)pBuffer);
808cdf0e10cSrcweir     valueType = (RegValueType)type;
809cdf0e10cSrcweir 
810cdf0e10cSrcweir     if (valueType != RG_VALUETYPE_STRINGLIST)
811cdf0e10cSrcweir     {
812cdf0e10cSrcweir         pValueList = NULL;
813cdf0e10cSrcweir         *pLen = 0;
814cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
815cdf0e10cSrcweir         return REG_INVALID_VALUE;
816cdf0e10cSrcweir     }
817cdf0e10cSrcweir 
818cdf0e10cSrcweir     readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize);
819cdf0e10cSrcweir 
820cdf0e10cSrcweir     rtl_freeMemory(pBuffer);
821cdf0e10cSrcweir 
822cdf0e10cSrcweir     pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize);
823cdf0e10cSrcweir 
824cdf0e10cSrcweir     if ( rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, readBytes) )
825cdf0e10cSrcweir     {
826cdf0e10cSrcweir         pValueList = NULL;
827cdf0e10cSrcweir         *pLen = 0;
828cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
829cdf0e10cSrcweir         return REG_INVALID_VALUE;
830cdf0e10cSrcweir     }
831cdf0e10cSrcweir     if (readBytes != valueSize)
832cdf0e10cSrcweir     {
833cdf0e10cSrcweir         pValueList = NULL;
834cdf0e10cSrcweir         *pLen = 0;
835cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
836cdf0e10cSrcweir         return REG_INVALID_VALUE;
837cdf0e10cSrcweir     }
838cdf0e10cSrcweir 
839cdf0e10cSrcweir     sal_uInt32 len = 0;
840cdf0e10cSrcweir     readUINT32(pBuffer, len);
841cdf0e10cSrcweir 
842cdf0e10cSrcweir     *pLen = len;
843cdf0e10cSrcweir     sal_Char** pVList = (sal_Char**)rtl_allocateZeroMemory(len * sizeof(sal_Char*));
844cdf0e10cSrcweir 
845cdf0e10cSrcweir     sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays;
846cdf0e10cSrcweir     sal_uInt32 sLen = 0;
847cdf0e10cSrcweir 
848cdf0e10cSrcweir     sal_Char *pValue;
849cdf0e10cSrcweir     for (sal_uInt32 i=0; i < len; i++)
850cdf0e10cSrcweir     {
851cdf0e10cSrcweir         readUINT32(pBuffer+offset, sLen);
852cdf0e10cSrcweir 
853cdf0e10cSrcweir         offset += 4;
854cdf0e10cSrcweir 
855cdf0e10cSrcweir         pValue = (sal_Char*)rtl_allocateMemory(sLen);
856cdf0e10cSrcweir         readUtf8(pBuffer+offset, pValue, sLen);
857cdf0e10cSrcweir         pVList[i] = pValue;
858cdf0e10cSrcweir 
859cdf0e10cSrcweir         offset += sLen;
860cdf0e10cSrcweir     }
861cdf0e10cSrcweir 
862cdf0e10cSrcweir     *pValueList = pVList;
863cdf0e10cSrcweir     rtl_freeMemory(pBuffer);
864cdf0e10cSrcweir     return REG_NO_ERROR;
865cdf0e10cSrcweir }
866cdf0e10cSrcweir 
867cdf0e10cSrcweir //*********************************************************************
868cdf0e10cSrcweir //  getUnicodeListValue
869cdf0e10cSrcweir //
getUnicodeListValue(const OUString & valueName,sal_Unicode *** pValueList,sal_uInt32 * pLen) const870cdf0e10cSrcweir RegError ORegKey::getUnicodeListValue(const OUString& valueName, sal_Unicode*** pValueList, sal_uInt32* pLen) const
871cdf0e10cSrcweir {
872cdf0e10cSrcweir     OStoreStream    rValue;
873cdf0e10cSrcweir     sal_uInt8*      pBuffer;
874cdf0e10cSrcweir     RegValueType    valueType;
875cdf0e10cSrcweir     sal_uInt32      valueSize;
876cdf0e10cSrcweir     storeAccessMode accessMode = VALUE_MODE_OPEN;
877cdf0e10cSrcweir 
878cdf0e10cSrcweir     if (m_pRegistry->isReadOnly())
879cdf0e10cSrcweir     {
880cdf0e10cSrcweir         accessMode = VALUE_MODE_OPENREAD;
881cdf0e10cSrcweir     }
882cdf0e10cSrcweir 
883cdf0e10cSrcweir     OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) );
884cdf0e10cSrcweir     sImplValueName += valueName;
885cdf0e10cSrcweir 
886cdf0e10cSrcweir     REG_GUARD(m_pRegistry->m_mutex);
887cdf0e10cSrcweir 
888cdf0e10cSrcweir     if ( rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, accessMode) )
889cdf0e10cSrcweir     {
890cdf0e10cSrcweir         pValueList = NULL;
891cdf0e10cSrcweir         *pLen = 0;
892cdf0e10cSrcweir         return REG_VALUE_NOT_EXISTS;
893cdf0e10cSrcweir     }
894cdf0e10cSrcweir 
895cdf0e10cSrcweir     pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE);
896cdf0e10cSrcweir 
897cdf0e10cSrcweir     sal_uInt32  readBytes;
898cdf0e10cSrcweir     if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) )
899cdf0e10cSrcweir     {
900cdf0e10cSrcweir         pValueList = NULL;
901cdf0e10cSrcweir         *pLen = 0;
902cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
903cdf0e10cSrcweir         return REG_INVALID_VALUE;
904cdf0e10cSrcweir     }
905cdf0e10cSrcweir     if (readBytes != VALUE_HEADERSIZE)
906cdf0e10cSrcweir     {
907cdf0e10cSrcweir         pValueList = NULL;
908cdf0e10cSrcweir         *pLen = 0;
909cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
910cdf0e10cSrcweir         return REG_INVALID_VALUE;
911cdf0e10cSrcweir     }
912cdf0e10cSrcweir 
913cdf0e10cSrcweir     sal_uInt8   type = *((sal_uInt8*)pBuffer);
914cdf0e10cSrcweir     valueType = (RegValueType)type;
915cdf0e10cSrcweir 
916cdf0e10cSrcweir     if (valueType != RG_VALUETYPE_UNICODELIST)
917cdf0e10cSrcweir     {
918cdf0e10cSrcweir         pValueList = NULL;
919cdf0e10cSrcweir         *pLen = 0;
920cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
921cdf0e10cSrcweir         return REG_INVALID_VALUE;
922cdf0e10cSrcweir     }
923cdf0e10cSrcweir 
924cdf0e10cSrcweir     readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize);
925cdf0e10cSrcweir 
926cdf0e10cSrcweir     rtl_freeMemory(pBuffer);
927cdf0e10cSrcweir 
928cdf0e10cSrcweir     pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize);
929cdf0e10cSrcweir 
930cdf0e10cSrcweir     if ( rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, readBytes) )
931cdf0e10cSrcweir     {
932cdf0e10cSrcweir         pValueList = NULL;
933cdf0e10cSrcweir         *pLen = 0;
934cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
935cdf0e10cSrcweir         return REG_INVALID_VALUE;
936cdf0e10cSrcweir     }
937cdf0e10cSrcweir     if (readBytes != valueSize)
938cdf0e10cSrcweir     {
939cdf0e10cSrcweir         pValueList = NULL;
940cdf0e10cSrcweir         *pLen = 0;
941cdf0e10cSrcweir         rtl_freeMemory(pBuffer);
942cdf0e10cSrcweir         return REG_INVALID_VALUE;
943cdf0e10cSrcweir     }
944cdf0e10cSrcweir 
945cdf0e10cSrcweir     sal_uInt32 len = 0;
946cdf0e10cSrcweir     readUINT32(pBuffer, len);
947cdf0e10cSrcweir 
948cdf0e10cSrcweir     *pLen = len;
949cdf0e10cSrcweir     sal_Unicode** pVList = (sal_Unicode**)rtl_allocateZeroMemory(len * sizeof(sal_Unicode*));
950cdf0e10cSrcweir 
951cdf0e10cSrcweir     sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays;
952cdf0e10cSrcweir     sal_uInt32 sLen = 0;
953cdf0e10cSrcweir 
954cdf0e10cSrcweir     sal_Unicode *pValue;
955cdf0e10cSrcweir     for (sal_uInt32 i=0; i < len; i++)
956cdf0e10cSrcweir     {
957cdf0e10cSrcweir         readUINT32(pBuffer+offset, sLen);
958cdf0e10cSrcweir 
959cdf0e10cSrcweir         offset += 4;
960cdf0e10cSrcweir 
961cdf0e10cSrcweir         pValue = (sal_Unicode*)rtl_allocateMemory((sLen / 2) * sizeof(sal_Unicode));
962cdf0e10cSrcweir         readString(pBuffer+offset, pValue, sLen);
963cdf0e10cSrcweir         pVList[i] = pValue;
964cdf0e10cSrcweir 
965cdf0e10cSrcweir         offset += sLen;
966cdf0e10cSrcweir     }
967cdf0e10cSrcweir 
968cdf0e10cSrcweir     *pValueList = pVList;
969cdf0e10cSrcweir     rtl_freeMemory(pBuffer);
970cdf0e10cSrcweir     return REG_NO_ERROR;
971cdf0e10cSrcweir }
972cdf0e10cSrcweir 
973cdf0e10cSrcweir //*********************************************************************
974cdf0e10cSrcweir //  getKeyType()
975cdf0e10cSrcweir //
getKeyType(const OUString & name,RegKeyType * pKeyType) const976cdf0e10cSrcweir RegError ORegKey::getKeyType(const OUString& name, RegKeyType* pKeyType) const
977cdf0e10cSrcweir {
978cdf0e10cSrcweir     *pKeyType = RG_KEYTYPE;
979cdf0e10cSrcweir 
980cdf0e10cSrcweir     REG_GUARD(m_pRegistry->m_mutex);
981cdf0e10cSrcweir 
982cdf0e10cSrcweir     if ( name.getLength() )
983cdf0e10cSrcweir     {
984cdf0e10cSrcweir 		ORegKey* pThis = const_cast< ORegKey* >(this);
985cdf0e10cSrcweir 
986cdf0e10cSrcweir 		RegKeyHandle hKey = 0;
987cdf0e10cSrcweir         RegError _ret = pThis->openKey(name, &hKey);
988cdf0e10cSrcweir         if (_ret != REG_NO_ERROR)
989cdf0e10cSrcweir             return _ret;
990cdf0e10cSrcweir         (void) pThis->releaseKey(hKey);
991cdf0e10cSrcweir     }
992cdf0e10cSrcweir 
993cdf0e10cSrcweir 	return REG_NO_ERROR;
994cdf0e10cSrcweir }
995cdf0e10cSrcweir 
getResolvedKeyName(const OUString & keyName,OUString & resolvedName)996cdf0e10cSrcweir RegError ORegKey::getResolvedKeyName(const OUString& keyName,
997cdf0e10cSrcweir                                      OUString& resolvedName)
998cdf0e10cSrcweir {
999cdf0e10cSrcweir     if (keyName.getLength() == 0)
1000cdf0e10cSrcweir         return REG_INVALID_KEYNAME;
1001cdf0e10cSrcweir 
1002cdf0e10cSrcweir     resolvedName = getFullPath(keyName);
1003cdf0e10cSrcweir     return REG_NO_ERROR;
1004cdf0e10cSrcweir }
1005cdf0e10cSrcweir 
1006cdf0e10cSrcweir //*********************************************************************
1007cdf0e10cSrcweir //  countSubKeys()
1008cdf0e10cSrcweir //
countSubKeys()1009cdf0e10cSrcweir sal_uInt32 ORegKey::countSubKeys()
1010cdf0e10cSrcweir {
1011cdf0e10cSrcweir     REG_GUARD(m_pRegistry->m_mutex);
1012cdf0e10cSrcweir 
1013cdf0e10cSrcweir     OStoreDirectory::iterator   iter;
1014cdf0e10cSrcweir     OStoreDirectory             rStoreDir = getStoreDir();
1015cdf0e10cSrcweir     storeError                  _err = rStoreDir.first(iter);
1016cdf0e10cSrcweir     sal_uInt32                  count = 0;
1017cdf0e10cSrcweir 
1018cdf0e10cSrcweir     while ( _err == store_E_None )
1019cdf0e10cSrcweir     {
1020cdf0e10cSrcweir         if ( iter.m_nAttrib & STORE_ATTRIB_ISDIR )
1021cdf0e10cSrcweir         {
1022cdf0e10cSrcweir             count++;
1023cdf0e10cSrcweir         }
1024cdf0e10cSrcweir 
1025cdf0e10cSrcweir         _err = rStoreDir.next(iter);
1026cdf0e10cSrcweir     }
1027cdf0e10cSrcweir 
1028cdf0e10cSrcweir     return count;
1029cdf0e10cSrcweir }
1030cdf0e10cSrcweir 
getStoreDir()1031cdf0e10cSrcweir OStoreDirectory ORegKey::getStoreDir()
1032cdf0e10cSrcweir {
1033cdf0e10cSrcweir     OStoreDirectory rStoreDir;
1034cdf0e10cSrcweir     OUString        fullPath;
1035cdf0e10cSrcweir     OUString        relativName;
1036cdf0e10cSrcweir     storeAccessMode accessMode = KEY_MODE_OPEN;
1037cdf0e10cSrcweir 
1038cdf0e10cSrcweir     if ( m_name.equals(m_pRegistry->ROOT) )
1039cdf0e10cSrcweir     {
1040cdf0e10cSrcweir         fullPath = OUString();
1041cdf0e10cSrcweir         relativName = OUString();
1042cdf0e10cSrcweir     } else
1043cdf0e10cSrcweir 	{
1044cdf0e10cSrcweir     	fullPath = m_name.copy(0, m_name.lastIndexOf('/') + 1);
1045cdf0e10cSrcweir     	relativName = m_name.copy(m_name.lastIndexOf('/') + 1);
1046cdf0e10cSrcweir 	}
1047cdf0e10cSrcweir 
1048cdf0e10cSrcweir     if (m_pRegistry->isReadOnly())
1049cdf0e10cSrcweir     {
1050cdf0e10cSrcweir         accessMode = KEY_MODE_OPENREAD;
1051cdf0e10cSrcweir     }
1052cdf0e10cSrcweir 
1053cdf0e10cSrcweir     rStoreDir.create(getStoreFile(), fullPath, relativName, accessMode);
1054cdf0e10cSrcweir 
1055cdf0e10cSrcweir     return rStoreDir;
1056cdf0e10cSrcweir }
1057cdf0e10cSrcweir 
getFullPath(OUString const & path) const1058cdf0e10cSrcweir OUString ORegKey::getFullPath(OUString const & path) const {
1059cdf0e10cSrcweir     OSL_ASSERT(m_name.getLength() != 0 && path.getLength() != 0);
1060cdf0e10cSrcweir     OUStringBuffer b(m_name);
1061cdf0e10cSrcweir     if (b.charAt(b.getLength() - 1) == '/') {
1062cdf0e10cSrcweir         if (path[0] == '/') {
1063cdf0e10cSrcweir             b.append(path.getStr() + 1, path.getLength() - 1);
1064cdf0e10cSrcweir         } else {
1065cdf0e10cSrcweir             b.append(path);
1066cdf0e10cSrcweir         }
1067cdf0e10cSrcweir     } else {
1068cdf0e10cSrcweir         if (path[0] != '/') {
1069cdf0e10cSrcweir             b.append(sal_Unicode('/'));
1070cdf0e10cSrcweir         }
1071cdf0e10cSrcweir         b.append(path);
1072cdf0e10cSrcweir     }
1073cdf0e10cSrcweir     return b.makeStringAndClear();
1074cdf0e10cSrcweir }
1075