| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_registry.hxx" |
| |
| #include "keyimpl.hxx" |
| |
| #include "reflcnst.hxx" |
| #include "rtl/alloc.h" |
| #include "rtl/memory.h" |
| #include "rtl/ustrbuf.hxx" |
| |
| using rtl::OUString; |
| using rtl::OUStringBuffer; |
| using namespace store; |
| |
| namespace { static char const VALUE_PREFIX[] = "$VL_"; } |
| |
| //********************************************************************* |
| // ORegKey() |
| // |
| ORegKey::ORegKey(const OUString& keyName, ORegistry* pReg) |
| : m_refCount(1) |
| , m_name(keyName) |
| , m_bDeleted(0) |
| , m_bModified(0) |
| , m_pRegistry(pReg) |
| { |
| } |
| |
| //********************************************************************* |
| // ~ORegKey() |
| // |
| ORegKey::~ORegKey() |
| { |
| OSL_POSTCOND(m_refCount == 0, "registry::ORegKey::dtor(): refcount not zero."); |
| } |
| |
| //********************************************************************* |
| // acquireKey |
| // |
| RegError ORegKey::acquireKey(RegKeyHandle hKey) |
| { |
| return m_pRegistry->acquireKey(hKey); |
| } |
| |
| //********************************************************************* |
| // releaseKey |
| // |
| RegError ORegKey::releaseKey(RegKeyHandle hKey) |
| { |
| return m_pRegistry->releaseKey(hKey); |
| } |
| |
| //********************************************************************* |
| // createKey |
| // |
| RegError ORegKey::createKey(const OUString& keyName, RegKeyHandle* phNewKey) |
| { |
| return m_pRegistry->createKey(this, keyName, phNewKey); |
| } |
| |
| |
| //********************************************************************* |
| // openKey |
| // |
| RegError ORegKey::openKey(const OUString& keyName, RegKeyHandle* phOpenKey) |
| { |
| return m_pRegistry->openKey(this, keyName, phOpenKey); |
| } |
| |
| |
| //********************************************************************* |
| // openSubKeys |
| // |
| RegError ORegKey::openSubKeys(const OUString& keyName, RegKeyHandle** phOpenSubKeys, sal_uInt32* pnSubKeys) |
| { |
| RegError _ret = REG_NO_ERROR; |
| |
| *phOpenSubKeys = 0; |
| *pnSubKeys = 0; |
| |
| ORegKey* pKey = this; |
| if ( keyName.getLength() ) |
| { |
| _ret = openKey(keyName, (RegKeyHandle*)&pKey); |
| if (_ret != REG_NO_ERROR) |
| return _ret; |
| } |
| |
| sal_uInt32 nSubKeys = pKey->countSubKeys(); |
| *pnSubKeys = nSubKeys; |
| |
| ORegKey** pSubKeys; |
| pSubKeys = (ORegKey**)rtl_allocateZeroMemory(nSubKeys * sizeof(ORegKey*)); |
| |
| OStoreDirectory::iterator iter; |
| OStoreDirectory rStoreDir(pKey->getStoreDir()); |
| storeError _err = rStoreDir.first(iter); |
| |
| nSubKeys = 0; |
| while ( _err == store_E_None ) |
| { |
| if ( iter.m_nAttrib & STORE_ATTRIB_ISDIR ) |
| { |
| OUString const sSubKeyName = iter.m_pszName; |
| |
| ORegKey* pOpenSubKey = 0; |
| _ret = pKey->openKey(sSubKeyName, (RegKeyHandle*)&pOpenSubKey); |
| if (_ret != REG_NO_ERROR) |
| { |
| *phOpenSubKeys = NULL; |
| *pnSubKeys = 0; |
| rtl_freeMemory(pSubKeys); // @@@ leaking 'pSubKeys[0...nSubkeys-1]' |
| return _ret; // @@@ leaking 'pKey' |
| } |
| |
| pSubKeys[nSubKeys] = pOpenSubKey; |
| |
| nSubKeys++; |
| } |
| |
| _err = rStoreDir.next(iter); |
| } |
| |
| *phOpenSubKeys = (RegKeyHandle*)pSubKeys; |
| if (keyName.getLength()) |
| { |
| (void) releaseKey(pKey); |
| } |
| return REG_NO_ERROR; |
| } |
| |
| |
| //********************************************************************* |
| // getKeyNames |
| // |
| RegError ORegKey::getKeyNames(const OUString& keyName, |
| rtl_uString*** pSubKeyNames, |
| sal_uInt32* pnSubKeys) |
| { |
| RegError _ret = REG_NO_ERROR; |
| |
| *pSubKeyNames = 0; |
| *pnSubKeys = 0; |
| |
| ORegKey* pKey = this; |
| if (keyName.getLength()) |
| { |
| _ret = openKey(keyName, (RegKeyHandle*)&pKey); |
| if (_ret != REG_NO_ERROR) |
| return _ret; |
| } |
| |
| sal_uInt32 nSubKeys = pKey->countSubKeys(); |
| *pnSubKeys = nSubKeys; |
| |
| rtl_uString** pSubKeys = 0; |
| pSubKeys = (rtl_uString**)rtl_allocateZeroMemory(nSubKeys * sizeof(rtl_uString*)); |
| |
| OStoreDirectory::iterator iter; |
| OStoreDirectory rStoreDir(pKey->getStoreDir()); |
| storeError _err = rStoreDir.first(iter); |
| |
| nSubKeys = 0; |
| |
| while ( _err == store_E_None ) |
| { |
| if ( iter.m_nAttrib & STORE_ATTRIB_ISDIR) |
| { |
| OUString const sSubKeyName = iter.m_pszName; |
| |
| OUString sFullKeyName(pKey->getName()); |
| if (sFullKeyName.getLength() > 1) |
| sFullKeyName += m_pRegistry->ROOT; |
| sFullKeyName += sSubKeyName; |
| |
| rtl_uString_newFromString(&pSubKeys[nSubKeys], sFullKeyName.pData); |
| |
| nSubKeys++; |
| } |
| |
| _err = rStoreDir.next(iter); |
| } |
| |
| *pSubKeyNames = pSubKeys; |
| if (keyName.getLength()) |
| { |
| releaseKey(pKey); |
| } |
| return REG_NO_ERROR; |
| } |
| |
| |
| //********************************************************************* |
| // closeKey |
| // |
| RegError ORegKey::closeKey(RegKeyHandle hKey) |
| { |
| return (m_pRegistry->closeKey(hKey)); |
| } |
| |
| |
| //********************************************************************* |
| // deleteKey |
| // |
| RegError ORegKey::deleteKey(const OUString& keyName) |
| { |
| return (m_pRegistry->deleteKey(this, keyName)); |
| } |
| |
| |
| //********************************************************************* |
| // getValueType |
| // |
| RegError ORegKey::getValueInfo(const OUString& valueName, RegValueType* pValueType, sal_uInt32* pValueSize) const |
| { |
| OStoreStream rValue; |
| sal_uInt8* pBuffer; |
| storeAccessMode accessMode = VALUE_MODE_OPEN; |
| |
| if (m_pRegistry->isReadOnly()) |
| { |
| accessMode = VALUE_MODE_OPENREAD; |
| } |
| |
| OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); |
| sImplValueName += valueName; |
| |
| REG_GUARD(m_pRegistry->m_mutex); |
| |
| if ( rValue.create(m_pRegistry->getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, accessMode) ) |
| { |
| *pValueType = RG_VALUETYPE_NOT_DEFINED; |
| *pValueSize = 0; |
| return REG_VALUE_NOT_EXISTS; |
| } |
| |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE); |
| |
| sal_uInt32 readBytes; |
| if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) ) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| if (readBytes != VALUE_HEADERSIZE) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| |
| sal_uInt32 size; |
| sal_uInt8 type = *((sal_uInt8*)pBuffer); |
| readUINT32(pBuffer+VALUE_TYPEOFFSET, size); |
| |
| *pValueType = (RegValueType)type; |
| // if (*pValueType == RG_VALUETYPE_UNICODE) |
| // { |
| // *pValueSize = (size / 2) * sizeof(sal_Unicode); |
| // } else |
| // { |
| if (*pValueType > 4) |
| { |
| rtl_freeMemory(pBuffer); |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(4); |
| rValue.readAt(VALUE_HEADEROFFSET, pBuffer, 4, readBytes); |
| |
| readUINT32(pBuffer, size); |
| } |
| |
| *pValueSize = size; |
| // } |
| |
| rtl_freeMemory(pBuffer); |
| return REG_NO_ERROR; |
| } |
| |
| |
| //********************************************************************* |
| // setValue |
| // |
| RegError ORegKey::setValue(const OUString& valueName, RegValueType vType, RegValue value, sal_uInt32 vSize) |
| { |
| OStoreStream rValue; |
| sal_uInt8* pBuffer; |
| |
| if (m_pRegistry->isReadOnly()) |
| { |
| return REG_REGISTRY_READONLY; |
| } |
| |
| if (vType > 4) |
| { |
| return REG_INVALID_VALUE; |
| } |
| |
| OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); |
| sImplValueName += valueName; |
| |
| REG_GUARD(m_pRegistry->m_mutex); |
| |
| if ( rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT , sImplValueName, VALUE_MODE_CREATE) ) |
| { |
| return REG_SET_VALUE_FAILED; |
| } |
| |
| sal_uInt32 size = vSize; |
| |
| sal_uInt8 type = (sal_uInt8)vType; |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE + size); |
| rtl_copyMemory(pBuffer, &type, 1); |
| |
| writeUINT32(pBuffer+VALUE_TYPEOFFSET, size); |
| |
| switch (vType) |
| { |
| case RG_VALUETYPE_NOT_DEFINED: |
| rtl_copyMemory(pBuffer+VALUE_HEADEROFFSET, value, size); |
| break; |
| case RG_VALUETYPE_LONG: |
| writeINT32(pBuffer+VALUE_HEADEROFFSET, *((sal_Int32*)value)); |
| break; |
| case RG_VALUETYPE_STRING: |
| writeUtf8(pBuffer+VALUE_HEADEROFFSET, (const sal_Char*)value); |
| break; |
| case RG_VALUETYPE_UNICODE: |
| writeString(pBuffer+VALUE_HEADEROFFSET, (const sal_Unicode*)value); |
| break; |
| case RG_VALUETYPE_BINARY: |
| rtl_copyMemory(pBuffer+VALUE_HEADEROFFSET, value, size); |
| break; |
| default: |
| OSL_ASSERT(false); |
| break; |
| } |
| |
| sal_uInt32 writenBytes; |
| if ( rValue.writeAt(0, pBuffer, VALUE_HEADERSIZE+size, writenBytes) ) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_SET_VALUE_FAILED; |
| } |
| if (writenBytes != (VALUE_HEADERSIZE+size)) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_SET_VALUE_FAILED; |
| } |
| setModified(); |
| |
| rtl_freeMemory(pBuffer); |
| return REG_NO_ERROR; |
| } |
| |
| //********************************************************************* |
| // setLongListValue |
| // |
| RegError ORegKey::setLongListValue(const OUString& valueName, sal_Int32* pValueList, sal_uInt32 len) |
| { |
| OStoreStream rValue; |
| sal_uInt8* pBuffer; |
| |
| if (m_pRegistry->isReadOnly()) |
| { |
| return REG_REGISTRY_READONLY; |
| } |
| |
| OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); |
| sImplValueName += valueName; |
| |
| REG_GUARD(m_pRegistry->m_mutex); |
| |
| if (rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, VALUE_MODE_CREATE) ) |
| { |
| return REG_SET_VALUE_FAILED; |
| } |
| |
| sal_uInt32 size = 4; // 4 Bytes (sal_uInt32) fuer die Laenge |
| |
| size += len * 4; |
| |
| sal_uInt8 type = (sal_uInt8)RG_VALUETYPE_LONGLIST; |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE + size); |
| rtl_copyMemory(pBuffer, &type, 1); |
| |
| writeUINT32(pBuffer+VALUE_TYPEOFFSET, size); |
| writeUINT32(pBuffer+VALUE_HEADEROFFSET, len); |
| |
| sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays |
| |
| for (sal_uInt32 i=0; i < len; i++) |
| { |
| writeINT32(pBuffer+VALUE_HEADEROFFSET+offset, pValueList[i]); |
| offset += 4; |
| } |
| |
| sal_uInt32 writenBytes; |
| if ( rValue.writeAt(0, pBuffer, VALUE_HEADERSIZE+size, writenBytes) ) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_SET_VALUE_FAILED; |
| } |
| if (writenBytes != (VALUE_HEADEROFFSET+size)) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_SET_VALUE_FAILED; |
| } |
| setModified(); |
| |
| rtl_freeMemory(pBuffer); |
| return REG_NO_ERROR; |
| } |
| |
| //********************************************************************* |
| // setStringListValue |
| // |
| RegError ORegKey::setStringListValue(const OUString& valueName, sal_Char** pValueList, sal_uInt32 len) |
| { |
| OStoreStream rValue; |
| sal_uInt8* pBuffer; |
| |
| if (m_pRegistry->isReadOnly()) |
| { |
| return REG_REGISTRY_READONLY; |
| } |
| |
| OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); |
| sImplValueName += valueName; |
| |
| REG_GUARD(m_pRegistry->m_mutex); |
| |
| if (rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, VALUE_MODE_CREATE) ) |
| { |
| return REG_SET_VALUE_FAILED; |
| } |
| |
| sal_uInt32 size = 4; // 4 Bytes (sal_uInt32) fuer die Laenge |
| |
| sal_uInt32 i; |
| for (i=0; i < len; i++) |
| { |
| size += 4 + strlen(pValueList[i]) + 1; |
| } |
| |
| sal_uInt8 type = (sal_uInt8)RG_VALUETYPE_STRINGLIST; |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE + size); |
| rtl_copyMemory(pBuffer, &type, 1); |
| |
| writeUINT32(pBuffer+VALUE_TYPEOFFSET, size); |
| writeUINT32(pBuffer+VALUE_HEADEROFFSET, len); |
| |
| sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays; |
| sal_uInt32 sLen = 0; |
| |
| for (i=0; i < len; i++) |
| { |
| sLen = strlen(pValueList[i]) + 1; |
| writeUINT32(pBuffer+VALUE_HEADEROFFSET+offset, sLen); |
| |
| offset += 4; |
| writeUtf8(pBuffer+VALUE_HEADEROFFSET+offset, pValueList[i]); |
| offset += sLen; |
| } |
| |
| sal_uInt32 writenBytes; |
| if ( rValue.writeAt(0, pBuffer, VALUE_HEADERSIZE+size, writenBytes) ) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_SET_VALUE_FAILED; |
| } |
| if (writenBytes != (VALUE_HEADERSIZE+size)) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_SET_VALUE_FAILED; |
| } |
| setModified(); |
| |
| rtl_freeMemory(pBuffer); |
| return REG_NO_ERROR; |
| } |
| |
| //********************************************************************* |
| // setUnicodeListValue |
| // |
| RegError ORegKey::setUnicodeListValue(const OUString& valueName, sal_Unicode** pValueList, sal_uInt32 len) |
| { |
| OStoreStream rValue; |
| sal_uInt8* pBuffer; |
| |
| if (m_pRegistry->isReadOnly()) |
| { |
| return REG_REGISTRY_READONLY; |
| } |
| |
| OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); |
| sImplValueName += valueName; |
| |
| REG_GUARD(m_pRegistry->m_mutex); |
| |
| if (rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, VALUE_MODE_CREATE) ) |
| { |
| return REG_SET_VALUE_FAILED; |
| } |
| |
| sal_uInt32 size = 4; // 4 Bytes (sal_uInt32) fuer die Laenge |
| |
| sal_uInt32 i; |
| for (i=0; i < len; i++) |
| { |
| size += 4 + ((rtl_ustr_getLength(pValueList[i]) +1) * 2); |
| } |
| |
| sal_uInt8 type = (sal_uInt8)RG_VALUETYPE_UNICODELIST; |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE + size); |
| rtl_copyMemory(pBuffer, &type, 1); |
| |
| writeUINT32(pBuffer+VALUE_TYPEOFFSET, size); |
| writeUINT32(pBuffer+VALUE_HEADEROFFSET, len); |
| |
| sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays; |
| sal_uInt32 sLen = 0; |
| |
| for (i=0; i < len; i++) |
| { |
| sLen = (rtl_ustr_getLength(pValueList[i]) + 1) * 2; |
| writeUINT32(pBuffer+VALUE_HEADEROFFSET+offset, sLen); |
| |
| offset += 4; |
| writeString(pBuffer+VALUE_HEADEROFFSET+offset, pValueList[i]); |
| offset += sLen; |
| } |
| |
| sal_uInt32 writenBytes; |
| if ( rValue.writeAt(0, pBuffer, VALUE_HEADERSIZE+size, writenBytes) ) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_SET_VALUE_FAILED; |
| } |
| if (writenBytes != (VALUE_HEADERSIZE+size)) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_SET_VALUE_FAILED; |
| } |
| setModified(); |
| |
| rtl_freeMemory(pBuffer); |
| return REG_NO_ERROR; |
| } |
| |
| //********************************************************************* |
| // getValue |
| // |
| RegError ORegKey::getValue(const OUString& valueName, RegValue value) const |
| { |
| OStoreStream rValue; |
| sal_uInt8* pBuffer; |
| RegValueType valueType; |
| sal_uInt32 valueSize; |
| storeAccessMode accessMode = VALUE_MODE_OPEN; |
| |
| if (m_pRegistry->isReadOnly()) |
| { |
| accessMode = VALUE_MODE_OPENREAD; |
| } |
| |
| OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); |
| sImplValueName += valueName; |
| |
| REG_GUARD(m_pRegistry->m_mutex); |
| |
| if (rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, accessMode) ) |
| { |
| return REG_VALUE_NOT_EXISTS; |
| } |
| |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE); |
| |
| sal_uInt32 readBytes; |
| if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) ) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| if (readBytes != VALUE_HEADERSIZE) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| |
| sal_uInt8 type = *((sal_uInt8*)pBuffer); |
| valueType = (RegValueType)type; |
| readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize); |
| |
| rtl_freeMemory(pBuffer); |
| |
| if (valueType > 4) |
| { |
| return REG_INVALID_VALUE; |
| } |
| |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); |
| |
| if ( rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, readBytes) ) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| if (readBytes != valueSize) |
| { |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| |
| switch (valueType) |
| { |
| case RG_VALUETYPE_NOT_DEFINED: |
| rtl_copyMemory(value, pBuffer, valueSize); |
| break; |
| case RG_VALUETYPE_LONG: |
| readINT32(pBuffer, *((sal_Int32*)value)); |
| break; |
| case RG_VALUETYPE_STRING: |
| readUtf8(pBuffer, (sal_Char*)value, valueSize); |
| break; |
| case RG_VALUETYPE_UNICODE: |
| readString(pBuffer, (sal_Unicode*)value, valueSize); |
| break; |
| case RG_VALUETYPE_BINARY: |
| rtl_copyMemory(value, pBuffer, valueSize); |
| break; |
| case RG_VALUETYPE_LONGLIST: |
| case RG_VALUETYPE_STRINGLIST: |
| case RG_VALUETYPE_UNICODELIST: |
| rtl_copyMemory(value, pBuffer, valueSize); |
| break; |
| } |
| |
| |
| rtl_freeMemory(pBuffer); |
| return REG_NO_ERROR; |
| } |
| |
| //********************************************************************* |
| // getLongListValue |
| // |
| RegError ORegKey::getLongListValue(const OUString& valueName, sal_Int32** pValueList, sal_uInt32* pLen) const |
| { |
| OStoreStream rValue; |
| sal_uInt8* pBuffer; |
| RegValueType valueType; |
| sal_uInt32 valueSize; |
| storeAccessMode accessMode = VALUE_MODE_OPEN; |
| |
| if (m_pRegistry->isReadOnly()) |
| { |
| accessMode = VALUE_MODE_OPENREAD; |
| } |
| |
| OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); |
| sImplValueName += valueName; |
| |
| REG_GUARD(m_pRegistry->m_mutex); |
| |
| if (rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, accessMode) ) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| return REG_VALUE_NOT_EXISTS; |
| } |
| |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE); |
| |
| sal_uInt32 readBytes; |
| if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) ) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| if (readBytes != VALUE_HEADERSIZE) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| |
| sal_uInt8 type = *((sal_uInt8*)pBuffer); |
| valueType = (RegValueType)type; |
| |
| if (valueType != RG_VALUETYPE_LONGLIST) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| |
| readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize); |
| |
| rtl_freeMemory(pBuffer); |
| |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); |
| |
| if ( rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, readBytes) ) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| if (readBytes != valueSize) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| |
| sal_uInt32 len = 0; |
| readUINT32(pBuffer, len); |
| |
| *pLen = len; |
| sal_Int32* pVList = (sal_Int32*)rtl_allocateZeroMemory(len * sizeof(sal_Int32)); |
| |
| sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays; |
| |
| for (sal_uInt32 i=0; i < len; i++) |
| { |
| readINT32(pBuffer+offset, pVList[i]); |
| offset += 4; |
| } |
| |
| *pValueList = pVList; |
| rtl_freeMemory(pBuffer); |
| return REG_NO_ERROR; |
| } |
| |
| //********************************************************************* |
| // getStringListValue |
| // |
| RegError ORegKey::getStringListValue(const OUString& valueName, sal_Char*** pValueList, sal_uInt32* pLen) const |
| { |
| OStoreStream rValue; |
| sal_uInt8* pBuffer; |
| RegValueType valueType; |
| sal_uInt32 valueSize; |
| storeAccessMode accessMode = VALUE_MODE_OPEN; |
| |
| if (m_pRegistry->isReadOnly()) |
| { |
| accessMode = VALUE_MODE_OPENREAD; |
| } |
| |
| OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); |
| sImplValueName += valueName; |
| |
| REG_GUARD(m_pRegistry->m_mutex); |
| |
| if ( rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, accessMode) ) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| return REG_VALUE_NOT_EXISTS; |
| } |
| |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE); |
| |
| sal_uInt32 readBytes; |
| if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) ) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| if (readBytes != VALUE_HEADERSIZE) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| |
| sal_uInt8 type = *((sal_uInt8*)pBuffer); |
| valueType = (RegValueType)type; |
| |
| if (valueType != RG_VALUETYPE_STRINGLIST) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| |
| readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize); |
| |
| rtl_freeMemory(pBuffer); |
| |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); |
| |
| if ( rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, readBytes) ) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| if (readBytes != valueSize) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| |
| sal_uInt32 len = 0; |
| readUINT32(pBuffer, len); |
| |
| *pLen = len; |
| sal_Char** pVList = (sal_Char**)rtl_allocateZeroMemory(len * sizeof(sal_Char*)); |
| |
| sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays; |
| sal_uInt32 sLen = 0; |
| |
| sal_Char *pValue; |
| for (sal_uInt32 i=0; i < len; i++) |
| { |
| readUINT32(pBuffer+offset, sLen); |
| |
| offset += 4; |
| |
| pValue = (sal_Char*)rtl_allocateMemory(sLen); |
| readUtf8(pBuffer+offset, pValue, sLen); |
| pVList[i] = pValue; |
| |
| offset += sLen; |
| } |
| |
| *pValueList = pVList; |
| rtl_freeMemory(pBuffer); |
| return REG_NO_ERROR; |
| } |
| |
| //********************************************************************* |
| // getUnicodeListValue |
| // |
| RegError ORegKey::getUnicodeListValue(const OUString& valueName, sal_Unicode*** pValueList, sal_uInt32* pLen) const |
| { |
| OStoreStream rValue; |
| sal_uInt8* pBuffer; |
| RegValueType valueType; |
| sal_uInt32 valueSize; |
| storeAccessMode accessMode = VALUE_MODE_OPEN; |
| |
| if (m_pRegistry->isReadOnly()) |
| { |
| accessMode = VALUE_MODE_OPENREAD; |
| } |
| |
| OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); |
| sImplValueName += valueName; |
| |
| REG_GUARD(m_pRegistry->m_mutex); |
| |
| if ( rValue.create(getStoreFile(), m_name + m_pRegistry->ROOT, sImplValueName, accessMode) ) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| return REG_VALUE_NOT_EXISTS; |
| } |
| |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE); |
| |
| sal_uInt32 readBytes; |
| if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) ) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| if (readBytes != VALUE_HEADERSIZE) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| |
| sal_uInt8 type = *((sal_uInt8*)pBuffer); |
| valueType = (RegValueType)type; |
| |
| if (valueType != RG_VALUETYPE_UNICODELIST) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| |
| readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize); |
| |
| rtl_freeMemory(pBuffer); |
| |
| pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); |
| |
| if ( rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, readBytes) ) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| if (readBytes != valueSize) |
| { |
| pValueList = NULL; |
| *pLen = 0; |
| rtl_freeMemory(pBuffer); |
| return REG_INVALID_VALUE; |
| } |
| |
| sal_uInt32 len = 0; |
| readUINT32(pBuffer, len); |
| |
| *pLen = len; |
| sal_Unicode** pVList = (sal_Unicode**)rtl_allocateZeroMemory(len * sizeof(sal_Unicode*)); |
| |
| sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays; |
| sal_uInt32 sLen = 0; |
| |
| sal_Unicode *pValue; |
| for (sal_uInt32 i=0; i < len; i++) |
| { |
| readUINT32(pBuffer+offset, sLen); |
| |
| offset += 4; |
| |
| pValue = (sal_Unicode*)rtl_allocateMemory((sLen / 2) * sizeof(sal_Unicode)); |
| readString(pBuffer+offset, pValue, sLen); |
| pVList[i] = pValue; |
| |
| offset += sLen; |
| } |
| |
| *pValueList = pVList; |
| rtl_freeMemory(pBuffer); |
| return REG_NO_ERROR; |
| } |
| |
| //********************************************************************* |
| // getKeyType() |
| // |
| RegError ORegKey::getKeyType(const OUString& name, RegKeyType* pKeyType) const |
| { |
| *pKeyType = RG_KEYTYPE; |
| |
| REG_GUARD(m_pRegistry->m_mutex); |
| |
| if ( name.getLength() ) |
| { |
| ORegKey* pThis = const_cast< ORegKey* >(this); |
| |
| RegKeyHandle hKey = 0; |
| RegError _ret = pThis->openKey(name, &hKey); |
| if (_ret != REG_NO_ERROR) |
| return _ret; |
| (void) pThis->releaseKey(hKey); |
| } |
| |
| return REG_NO_ERROR; |
| } |
| |
| RegError ORegKey::getResolvedKeyName(const OUString& keyName, |
| OUString& resolvedName) |
| { |
| if (keyName.getLength() == 0) |
| return REG_INVALID_KEYNAME; |
| |
| resolvedName = getFullPath(keyName); |
| return REG_NO_ERROR; |
| } |
| |
| //********************************************************************* |
| // countSubKeys() |
| // |
| sal_uInt32 ORegKey::countSubKeys() |
| { |
| REG_GUARD(m_pRegistry->m_mutex); |
| |
| OStoreDirectory::iterator iter; |
| OStoreDirectory rStoreDir = getStoreDir(); |
| storeError _err = rStoreDir.first(iter); |
| sal_uInt32 count = 0; |
| |
| while ( _err == store_E_None ) |
| { |
| if ( iter.m_nAttrib & STORE_ATTRIB_ISDIR ) |
| { |
| count++; |
| } |
| |
| _err = rStoreDir.next(iter); |
| } |
| |
| return count; |
| } |
| |
| OStoreDirectory ORegKey::getStoreDir() |
| { |
| OStoreDirectory rStoreDir; |
| OUString fullPath; |
| OUString relativName; |
| storeAccessMode accessMode = KEY_MODE_OPEN; |
| |
| if ( m_name.equals(m_pRegistry->ROOT) ) |
| { |
| fullPath = OUString(); |
| relativName = OUString(); |
| } else |
| { |
| fullPath = m_name.copy(0, m_name.lastIndexOf('/') + 1); |
| relativName = m_name.copy(m_name.lastIndexOf('/') + 1); |
| } |
| |
| if (m_pRegistry->isReadOnly()) |
| { |
| accessMode = KEY_MODE_OPENREAD; |
| } |
| |
| rStoreDir.create(getStoreFile(), fullPath, relativName, accessMode); |
| |
| return rStoreDir; |
| } |
| |
| OUString ORegKey::getFullPath(OUString const & path) const { |
| OSL_ASSERT(m_name.getLength() != 0 && path.getLength() != 0); |
| OUStringBuffer b(m_name); |
| if (b.charAt(b.getLength() - 1) == '/') { |
| if (path[0] == '/') { |
| b.append(path.getStr() + 1, path.getLength() - 1); |
| } else { |
| b.append(path); |
| } |
| } else { |
| if (path[0] != '/') { |
| b.append(sal_Unicode('/')); |
| } |
| b.append(path); |
| } |
| return b.makeStringAndClear(); |
| } |