2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 * @file FIo_RegistryCore.cpp
19 * @brief This is the implementation file for _RegistryCore class.
24 #include <unique_ptr.h>
26 #include <FBaseInteger.h>
27 #include <FBaseDouble.h>
28 #include <FBaseFloat.h>
29 #include <FBaseUuId.h>
30 #include <FBaseByteBuffer.h>
31 #include <FBaseColIEnumerator.h>
32 #include <FBaseUtilStringTokenizer.h>
33 #include <FBaseResult.h>
34 #include <FBaseSysLog.h>
35 #include <FBaseColAllElementsDeleter.h>
37 #include <FIoRegistry.h>
39 #include <FBase_StringConverter.h>
40 #include <FBase_LocalizedNumParser.h>
41 #include <FApp_AppInfo.h>
42 #include "FIo_FileImpl.h"
43 #include "FIo_NormalRegistry.h"
44 #include "FIo_SecureRegistry.h"
45 #include "FIo_RegistryCore.h"
46 #include "FIo_SecureIoUtil.h"
49 using namespace Tizen::Base;
50 using namespace Tizen::Base::Utility;
51 using namespace Tizen::Base::Collection;
53 namespace Tizen { namespace Io
56 static const size_t _MAX_REG_OPENMODE_LENGTH = 2;
58 #define _REGISTRY_SECTION_MARKER_CHAR L'#'
59 #define _REGISTRY_SECTION_VALUE_ASSIGNMENT_MARKER_CHAR L'='
61 class _RegistrySection
65 ~_RegistrySection(void);
68 LinkedList __entryList;
69 friend class _RegistryCore;
72 _RegistrySection::~_RegistrySection(void)
74 __entryList.RemoveAll(true);
85 _RegistryCore::_RegistryCore(void)
98 _RegistryCore::~_RegistryCore(void)
104 _RegistryCore::VerifyRegistryOpenMode(const char* pOpenMode)
106 if (pOpenMode == null)
108 SysLog(NID_IO, "[E_INVALID_ARG] The specified openMode is null.");
112 if (strlen(pOpenMode) > _MAX_REG_OPENMODE_LENGTH)
114 SysLog(NID_IO, "[E_INVALID_ARG] The specified openMode (%s) is invalid.", pOpenMode);
118 switch (pOpenMode[0])
132 SysLog(NID_IO, "[E_INVALID_ARG] The specified openMode (%s) is invalid.", pOpenMode);
136 switch (pOpenMode[1])
141 if (pOpenMode[2] == '\0')
149 SysLog(NID_IO, "[E_INVALID_ARG] The specified openMode (%s) is invalid.", pOpenMode);
153 SysLog(NID_IO, "[E_INVALID_ARG] The specified openMode (%s) is invalid.", pOpenMode);
161 _RegistryCore::Parse(void)
163 result r = E_SUCCESS;
165 bool sectionFound = false;
168 unique_ptr<char[]> pEntryName(null);
169 unique_ptr<char[]> pEntryValue(null);
170 int firstTokenPos = 0;
173 if (_pBuffer == null)
175 SysLog(NID_IO, "The buffer is empty.");
179 String inputStr = String((char*)_pBuffer);
180 StringTokenizer lineTok(inputStr, L"\n");
182 r = lineTok.GetNextToken(line);
184 while (r == E_SUCCESS)
187 if (line.GetLength() == 0)
189 r = lineTok.GetNextToken(line);
193 // find registry section marker
194 line.GetCharAt(0, ch);
195 if (ch == _REGISTRY_SECTION_MARKER_CHAR)
199 // skip '#' and "\n' at the end
200 r = line.SubString(1, line.GetLength() - 1, sectionName);
201 SysTryCatch(NID_IO, !IsFailed(r), , r, "[%s] Propagated.", GetErrorMessage(r));
203 // if End of the document follows section name without newline character.
204 sectionName.GetCharAt(sectionName.GetLength() - 1, ch);
207 sectionName.SetLength(sectionName.GetLength() - 1); //Remove '\n'
210 // for compatibility check if line contains '\r' at the end
211 sectionName.GetCharAt(sectionName.GetLength() - 1, ch);
214 sectionName.SetLength(sectionName.GetLength() - 1); //Remove '\r'
217 //TODO: check if remaining data in sectionName is valid or not
218 //after removing '#', '\n', and '\r', sectionName should contain at least 1 valid character
220 sectionName.GetLength() > 0, r = E_PARSING_FAILED, E_PARSING_FAILED,
221 "[E_PARSING_FAILED] Section length cannot be <2.");
223 unique_ptr<char[]> pSectionName(_StringConverter::CopyToCharArrayN(sectionName));
224 SysTryCatch(NID_IO, pSectionName != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
225 "[E_OUT_OF_MEMORY] The memory is insufficient.");
227 if (!_RegistryCore::CheckSectionName(pSectionName.get()))
229 SysTryCatch(NID_IO, false, r = E_PARSING_FAILED, E_PARSING_FAILED,
230 "[E_PARSING_FAILED] Section name could not be parsed.");
233 r = _RegistryCore::AddSection(_sectionList, sectionName);
234 SysTryCatch(NID_IO, !IsFailed(r), , r, "[%s] Propagated.", GetErrorMessage(r));
236 else // not a section.. but may belongs to a section (entry)
238 // ignores blank lines
239 line.GetCharAt(0, ch);
240 if ((ch == L'\n') || (ch == L'\r'))
242 r = lineTok.GetNextToken(line);
247 // Need to check for tabs, spaces in the beginning of each line
249 // if no section found till now.. ignore
250 if (sectionFound == false)
252 r = lineTok.GetNextToken(line);
256 // if End of the document follows entry value without newline character.
257 line.GetCharAt(line.GetLength() - 1, ch);
260 line.SetLength(line.GetLength() - 1); //Remove '\n'
263 line.GetCharAt(line.GetLength() - 1, ch);
266 line.SetLength(line.GetLength() - 1); //Remove '\r'
269 String entryName("");
272 // we will have sectionitem=value (or) sectionitem= (or) sectionitem
273 // as our string. Break this into entry and value
274 StringTokenizer strTok(line, L"=");
276 // extract entry name
277 if (strTok.HasMoreTokens())
279 line.IndexOf(L'=', 0, firstTokenPos); // position of first occurance of '=' in a line
280 if (firstTokenPos == 0)
282 // entryName should not be empty. i.e., "=value" or just '=' is invalid case
283 SysTryCatch(NID_IO, false, r = E_PARSING_FAILED, E_PARSING_FAILED,
284 "[E_PARSING_FAILED] Entry name cannot be empty.");
288 strTok.GetNextToken(entryName);
291 else // missing '=' in entry line or entry line does not seem to contain "xxx=xxx" format
293 SysTryCatch(NID_IO, false, r = E_PARSING_FAILED, E_PARSING_FAILED, "[E_PARSING_FAILED] invalid entry Line found.");
296 // check if entry name contains invalid chars
297 pEntryName.reset(_StringConverter::CopyToCharArrayN(entryName));
298 SysTryCatch(NID_IO, pEntryName, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
299 "[E_OUT_OF_MEMORY] The memory is insufficient.");
301 if (!_RegistryCore::CheckEntryName(pEntryName.get()))
303 SysTryCatch(NID_IO, false, r = E_PARSING_FAILED, E_PARSING_FAILED,
304 "[E_PARSING_FAILED] Entry name could not be parsed.");
307 line.SubString(firstTokenPos + 1, entryVal); // extract entry value
309 // check if entry value contains invalid chars
310 pEntryValue.reset(_StringConverter::CopyToCharArrayN(entryVal));
311 SysTryCatch(NID_IO, pEntryValue, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
312 "[E_OUT_OF_MEMORY] The memory is insufficient.");
314 length = strlen(pEntryValue.get());
317 if (!_RegistryCore::CheckEntryValue(pEntryValue.get()))
319 SysTryCatch(NID_IO, false, r = E_PARSING_FAILED, E_PARSING_FAILED,
320 "[E_PARSING_FAILED] Entry value could not be parsed.");
324 // add the entry and value
325 r = _RegistryCore::AddValue(_sectionList, sectionName, entryName, entryVal);
326 SysTryCatch(NID_IO, !IsFailed(r), , r, "[%s] Propagated.", GetErrorMessage(r));
328 r = lineTok.GetNextToken(line);
331 if (r == E_OUT_OF_RANGE)
339 if (r == E_PARSING_FAILED && Tizen::App::_AppInfo::IsOspCompat() == false)
341 r = E_INVALID_FORMAT;
344 SysLog(NID_IO, "[%s] exception occurred.", GetErrorMessage(r));
349 _RegistryCore::Load(const String& regPath, const char* pOpenMode)
351 result r = E_SUCCESS;
352 delete[] _pBuffer; //clear existing buffer
356 // open registry file
357 unique_ptr<_FileImpl> pFileImpl(new (std::nothrow) _FileImpl());
358 SysTryReturnResult(NID_IO, pFileImpl != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
360 r = pFileImpl->Construct(regPath, pOpenMode, null);
361 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Constructing the file has failed.", GetErrorMessage(r));
363 // reset the section list to be sure that its empty
364 _sectionList.RemoveAll(true);
366 if (_truncate == false)
368 // load the registry file
369 r = pFileImpl->ReadN((char**)&_pBuffer, _length);
376 __pFileImpl = pFileImpl.release();
382 _RegistryCore::AddSection(const String& sectionName)
384 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
386 result r = E_SUCCESS;
387 bool sectionFound = false;
389 // Get section information
390 unique_ptr<IEnumerator> pEnum(_sectionList.GetEnumeratorN());
393 return GetLastResult();
396 while (pEnum->MoveNext() == E_SUCCESS)
398 _RegistrySection* pRegSection = dynamic_cast <_RegistrySection*>(pEnum->GetCurrent());
399 SysTryReturn(NID_IO, pRegSection != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
400 GetErrorMessage(GetLastResult()));
402 if (pRegSection->__sectionName == sectionName)
409 if (sectionFound == true)
411 return E_SECTION_ALREADY_EXIST;
414 // create a key with section name
415 unique_ptr<_RegistrySection> pRegSection(new (std::nothrow) _RegistrySection());
416 SysTryReturnResult(NID_IO, pRegSection != null, E_OUT_OF_MEMORY,
417 "The memory is insufficient.");
419 pRegSection->__sectionName = sectionName;
421 // add new section and section-entry map
422 r = _sectionList.Add(*(pRegSection.release()));
423 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
430 _RegistryCore::RemoveSection(const String& sectionName)
432 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
434 result r = E_SUCCESS;
435 _RegistrySection* pRegSection = null;
436 bool sectionFound = false;
438 if (_sectionList.GetCount() == 0)
440 return E_SECTION_NOT_FOUND;
443 // Get section information
444 unique_ptr<IEnumerator> pEnum(_sectionList.GetEnumeratorN());
447 return GetLastResult();
450 while (pEnum->MoveNext() == E_SUCCESS)
452 pRegSection = dynamic_cast< _RegistrySection* >(pEnum->GetCurrent());
453 SysTryReturn(NID_IO, pRegSection != null, GetLastResult(), GetLastResult(), "[%s] Propagating.",
454 GetErrorMessage(GetLastResult()));
456 if (pRegSection->__sectionName == sectionName)
463 if (sectionFound == false)
465 return E_SECTION_NOT_FOUND;
468 r = _sectionList.Remove(*pRegSection, true);
469 SysTryReturnResult(NID_IO, !IsFailed(r), E_IO, "system error");
476 _RegistryCore::GetSectionListN(IList** pRetList)
478 result r = E_SUCCESS;
479 unique_ptr<IEnumerator> pEnum(null);
480 _RegistrySection* pSection = null;
482 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
483 SysTryReturnResult(NID_IO, pRetList != null, E_INVALID_ARG, "pList cannot be null.");
485 // construct an array list to be returned
486 unique_ptr<ArrayList, AllElementsDeleter> pSectionList(new (std::nothrow) ArrayList());
487 SysTryReturnResult(NID_IO, pSectionList != null, E_OUT_OF_MEMORY,
488 "The memory is insufficient.");
490 r = pSectionList->Construct();
491 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
493 // if no sectons, return empty list
494 if (_sectionList.GetCount() == 0)
496 *pRetList = pSectionList.release();
500 // copy from class section list to the new list and return
501 pEnum.reset(_sectionList.GetEnumeratorN());
502 SysTryReturn(NID_IO, pEnum != null, GetLastResult(), GetLastResult(), "[%s] Section list is empty.", GetErrorMessage(GetLastResult()));
504 while (pEnum->MoveNext() == E_SUCCESS)
506 pSection = dynamic_cast <_RegistrySection*>(pEnum->GetCurrent());
507 SysTryReturn(NID_IO, pSection != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
508 GetErrorMessage(GetLastResult()));
510 unique_ptr<String> pSectionName(new (std::nothrow) String(pSection->__sectionName));
511 SysTryReturnResult(NID_IO, pSectionName != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
513 r = pSectionList->Add(*(pSectionName.release()));
514 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
517 *pRetList = pSectionList.release();
523 _RegistryCore::GetEntryList(const String& sectionName, Collection::HashMap& retMap)
525 result r = E_SUCCESS;
526 unique_ptr<IEnumerator> pEnum(null);
527 unique_ptr<String> pKeyEntryStr(null);
528 unique_ptr<String> pKeyValStr(null);
529 bool sectionFound = false;
530 _RegistrySection* pRegSection = null;
531 _RegistryEntry* pRegEntry = null;
533 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
535 if (_sectionList.GetCount() == 0)
537 return E_SECTION_NOT_FOUND;
540 // Get section information
541 pEnum.reset(_sectionList.GetEnumeratorN());
542 SysTryReturnResult(NID_IO, pEnum != null, E_SYSTEM, "Section list is empty.");
544 while (pEnum->MoveNext() == E_SUCCESS)
546 pRegSection = dynamic_cast <_RegistrySection*>(pEnum->GetCurrent());
547 SysTryReturn(NID_IO, pRegSection != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
548 GetErrorMessage(GetLastResult()));
550 if (pRegSection->__sectionName == sectionName)
557 if (sectionFound == false)
559 return E_SECTION_NOT_FOUND;
562 // copy from item list to the new list and return
563 pEnum.reset((pRegSection->__entryList).GetEnumeratorN());
564 SysTryReturn(NID_IO, pEnum != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
565 GetErrorMessage(GetLastResult()));
567 while (pEnum->MoveNext() == E_SUCCESS)
569 pRegEntry = dynamic_cast <_RegistryEntry*>(pEnum->GetCurrent());
570 SysTryReturn(NID_IO, pRegEntry != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
571 GetErrorMessage(GetLastResult()));
573 pKeyEntryStr.reset(new (std::nothrow) String((pRegEntry->entryName)));
574 SysTryCatch(NID_IO, pKeyEntryStr != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
575 "[E_OUT_OF_MEMORY] The memory is insufficient.");
576 pKeyValStr.reset(new (std::nothrow) String((pRegEntry->entryValue)));
577 SysTryCatch(NID_IO, pKeyValStr != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
578 "[E_OUT_OF_MEMORY] The memory is insufficient.");
580 r = retMap.Add(*(pKeyEntryStr.release()), *(pKeyValStr.release()));
581 SysTryCatch(NID_IO, !IsFailed(r), , r, "[%s] Propagated.", GetErrorMessage(r));
587 retMap.RemoveAll(true);
593 _RegistryCore::GetEntryListN(const String& sectionName, HashMap** pRetList)
595 result r = E_SUCCESS;
597 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
598 SysTryReturnResult(NID_IO, pRetList != null, E_INVALID_ARG, "pRetList cannot be null.");
600 // construct an array list to be returned
601 unique_ptr<HashMap, AllElementsDeleter> pEntryList(new (std::nothrow) HashMap());
602 SysTryReturnResult(NID_IO, pEntryList != null, E_OUT_OF_MEMORY,
603 "The memory is insufficient.");
604 r = pEntryList->Construct();
605 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
606 r = GetEntryList(sectionName, *(pEntryList.get()));
607 *pRetList = pEntryList.release();
613 _RegistryCore::GetAllEntriesN(const String& sectionName)
615 result r = E_SUCCESS;
616 HashMap* pMap = null;
618 r = GetEntryListN(sectionName, &pMap);
619 SysTryCatch(NID_IO, !IsFailed(r), , r, "[%s] Propagated.", GetErrorMessage(r));
621 SetLastResult(E_SUCCESS);
630 _RegistryCore::GetAllEntryNamesN(const String& sectionName)
632 result r = E_SUCCESS;
634 unique_ptr<ArrayList, AllElementsDeleter> pEntryList(new (std::nothrow) ArrayList());
635 SysTryReturn(NID_IO, pEntryList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
637 r = pEntryList->Construct();
638 SysTryReturn(NID_IO, !IsFailed(r), null, r, "[%s] Propagated.", GetErrorMessage(r));
640 unique_ptr<IMap, AllElementsDeleter> pMap(this->GetAllEntriesN(sectionName));
641 SysTryReturn(NID_IO, pMap != null, null, GetLastResult(), "[%s] Getting all entries was failed.",
642 GetErrorMessage(GetLastResult()));
644 unique_ptr<IMapEnumerator> pMapEnum(pMap->GetMapEnumeratorN());
645 SysTryReturn(NID_IO, pMapEnum, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
646 while (pMapEnum->MoveNext() == E_SUCCESS)
648 String* pKey = dynamic_cast< String* >(pMapEnum->GetKey());
649 SysTryReturn(NID_IO, pKey != null, null, E_IO, "[E_OUT_OF_MEMORY] The system error occurred.");
651 String* pEntryName = new (std::nothrow) String(*pKey);
652 SysTryReturn(NID_IO, pEntryName != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
654 r = pEntryList->Add(*pEntryName);
655 SysTryReturn(NID_IO, !IsFailed(r), null, r, "[%s] Propagated.", GetErrorMessage(r));
658 SetLastResult(E_SUCCESS);
659 return pEntryList.release();
663 _RegistryCore::GetValue(const String& sectionName, const String& entryName, String& valStr)
665 bool sectionFound = false;
666 bool entryFound = false;
667 _RegistrySection* pRegSection = null;
668 _RegistryEntry* pRegEntry = null;
670 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
672 if (_sectionList.GetCount() == 0)
674 return E_SECTION_NOT_FOUND;
677 // Get section information
678 unique_ptr<IEnumerator> pEnum(_sectionList.GetEnumeratorN());
681 return GetLastResult();
684 while (pEnum->MoveNext() == E_SUCCESS)
686 pRegSection = dynamic_cast <_RegistrySection*>(pEnum->GetCurrent());
687 SysTryReturn(NID_IO, pRegSection != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
688 GetErrorMessage(GetLastResult()));
690 if (pRegSection->__sectionName == sectionName)
697 if (sectionFound == false)
699 return E_SECTION_NOT_FOUND;
702 pEnum.reset(pRegSection->__entryList.GetEnumeratorN());
705 return GetLastResult();
708 while (pEnum->MoveNext() == E_SUCCESS)
710 pRegEntry = dynamic_cast <_RegistryEntry*>(pEnum->GetCurrent());
711 SysTryReturn(NID_IO, pRegEntry != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
712 GetErrorMessage(GetLastResult()));
714 if (pRegEntry->entryName == entryName)
716 valStr = pRegEntry->entryValue;
722 SysTryLog(NID_IO, entryFound, "Entry not found");
724 return((entryFound == true) ? E_SUCCESS : E_KEY_NOT_FOUND);
728 _RegistryCore::AddValue(const String& sectionName, const String& entryName, const String& valStr)
730 result r = E_SUCCESS;
731 bool sectionFound = false;
732 bool entryFound = false;
733 _RegistrySection* pRegSection = null;
736 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
738 // Get section information
739 unique_ptr<IEnumerator> pEnum(_sectionList.GetEnumeratorN());
742 return GetLastResult();
745 while (pEnum->MoveNext() == E_SUCCESS)
747 pRegSection = dynamic_cast <_RegistrySection*>(pEnum->GetCurrent());
748 SysTryReturn(NID_IO, pRegSection != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
749 GetErrorMessage(GetLastResult()));
751 if (pRegSection->__sectionName == sectionName)
758 if (sectionFound == false)
760 return E_SECTION_NOT_FOUND;
763 pEnum.reset(pRegSection->__entryList.GetEnumeratorN());
766 return GetLastResult();
769 while (pEnum->MoveNext() == E_SUCCESS)
771 _RegistryEntry* pRegEntry = dynamic_cast <_RegistryEntry*>(pEnum->GetCurrent());
772 SysTryReturn(NID_IO, pRegEntry != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
773 GetErrorMessage(GetLastResult()));
775 if (pRegEntry->entryName == entryName)
782 if (entryFound == true)
784 return E_KEY_ALREADY_EXIST;
787 unique_ptr<_RegistryEntry> pRegEntry(new (std::nothrow) _RegistryEntry());
788 SysTryReturnResult(NID_IO, pRegEntry != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
790 unique_ptr<char[]> pEntryName(_StringConverter::CopyToCharArrayN(entryName));
791 SysTryReturnResult(NID_IO, pEntryName != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
793 length = strlen(pEntryName.get());
794 if (!_RegistryCore::CheckEntryName(pEntryName.get()))
796 SysTryReturnResult(NID_IO, false, E_PARSING_FAILED, "Entry name could not be parsed.");
799 unique_ptr<char[]> pEntryValue(_StringConverter::CopyToCharArrayN(valStr));
800 SysTryReturnResult(NID_IO, pEntryValue != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
802 length = strlen(pEntryValue.get());
803 if (length > 0 && !_RegistryCore::CheckEntryValue(pEntryValue.get()))
805 SysTryReturnResult(NID_IO, false, E_PARSING_FAILED, "Entry value could not be parsed.");
808 pRegEntry->entryName = entryName;
809 pRegEntry->entryValue = valStr;
811 r = pRegSection->__entryList.Add(*(pRegEntry.release()));
812 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
819 _RegistryCore::SetValue(const String& sectionName, const String& entryName, const String& valStr)
821 result r = E_SUCCESS;
822 bool sectionFound = false;
823 bool entryFound = false;
824 _RegistryEntry* pRegEntry = null;
825 _RegistrySection* pRegSection = null;
829 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
831 if (_sectionList.GetCount() == 0)
833 return E_SECTION_NOT_FOUND;
836 // Get section information
837 unique_ptr<IEnumerator> pEnum(_sectionList.GetEnumeratorN());
840 return GetLastResult();
843 while (pEnum->MoveNext() == E_SUCCESS)
845 pRegSection = dynamic_cast< _RegistrySection* >(pEnum->GetCurrent());
846 SysTryReturn(NID_IO, pRegSection != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
847 GetErrorMessage(GetLastResult()));
849 if (pRegSection->__sectionName == sectionName)
856 if (sectionFound == false)
858 return E_SECTION_NOT_FOUND;
861 pEnum.reset(pRegSection->__entryList.GetEnumeratorN());
864 return GetLastResult();
867 while (pEnum->MoveNext() == E_SUCCESS)
869 pRegEntry = dynamic_cast< _RegistryEntry* >(pEnum->GetCurrent());
870 SysTryReturn(NID_IO, pRegEntry != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
871 GetErrorMessage(GetLastResult()));
873 if (pRegEntry->entryName == entryName)
881 if (entryFound == false)
883 return E_KEY_NOT_FOUND;
886 if (valStr.GetLength() > 0)
888 unique_ptr<char[]> pEntryValue(_StringConverter::CopyToCharArrayN(valStr));
889 SysTryReturnResult(NID_IO, pEntryValue != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
891 length = strlen(pEntryValue.get());
892 if (!_RegistryCore::CheckEntryValue(pEntryValue.get()))
894 return E_PARSING_FAILED;
898 pRegEntry->entryValue = valStr;
899 r = pRegSection->__entryList.SetAt(*pRegEntry, entryIndex);
900 SysTryReturnResult(NID_IO, !IsFailed(r), E_IO, "system error");
907 _RegistryCore::RemoveValue(const String& sectionName, const String& entryName)
909 result r = E_SUCCESS;
910 bool sectionFound = false;
911 bool entryFound = false;
912 _RegistryEntry* pRegEntry = null;
913 _RegistrySection* pRegSection = null;
915 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
917 if (_sectionList.GetCount() <= 0)
919 return E_SECTION_NOT_FOUND;
922 // Get section information
923 unique_ptr<IEnumerator> pEnum(_sectionList.GetEnumeratorN());
926 return E_SECTION_NOT_FOUND;
929 while (pEnum->MoveNext() == E_SUCCESS)
931 pRegSection = dynamic_cast <_RegistrySection*>(pEnum->GetCurrent());
932 SysTryReturn(NID_IO, pRegSection != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
933 GetErrorMessage(GetLastResult()));
935 if (pRegSection->__sectionName == sectionName)
942 if (sectionFound == false)
944 return E_SECTION_NOT_FOUND;
947 pEnum.reset(pRegSection->__entryList.GetEnumeratorN());
950 return E_SECTION_NOT_FOUND;
953 while (pEnum->MoveNext() == E_SUCCESS)
955 pRegEntry = dynamic_cast <_RegistryEntry*>(pEnum->GetCurrent());
956 SysTryReturn(NID_IO, pRegEntry != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
957 GetErrorMessage(GetLastResult()));
959 if (pRegEntry->entryName == entryName)
966 if (entryFound == false)
968 return E_KEY_NOT_FOUND;
971 r = pRegSection->__entryList.Remove(*pRegEntry, true);
972 SysTryReturnResult(NID_IO, !IsFailed(r), E_IO, "system error");
979 _RegistryCore::Flush(void)
985 _RegistryCore::Write(void)
987 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
989 if (_pBuffer == null)
991 SysLog(NID_IO, "The buffer is empty.");
995 result r = __pFileImpl->Seek(FILESEEKPOSITION_BEGIN, 0);
996 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
998 r = __pFileImpl->Truncate(0);
999 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
1001 r = __pFileImpl->Write(_pBuffer, _length);
1002 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
1004 r = __pFileImpl->Flush();
1005 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
1011 _RegistryCore::PrepareToWrite(void)
1013 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
1015 result r = E_SUCCESS;
1016 _RegistryEntry* pRegEntry = null;
1017 _RegistrySection* pRegSection = null;
1020 delete[] _pBuffer; //clear existing buffer
1024 if (_write == false)
1026 SysLog(NID_IO, "[E_ILLEGAL_ACCESS] Registry cannot be flushed as it was opened in read only mode.");
1027 return E_ILLEGAL_ACCESS;
1030 // if no sections, do nothing
1031 if (_sectionList.GetCount() == 0)
1033 unique_ptr<char[]> pFilePath(_StringConverter::CopyToCharArrayN(_regPath));
1034 int res = truncate(pFilePath.get(), 0);
1039 // write the registry map to a file
1040 // Get section information
1041 unique_ptr<IEnumerator> pSectionEnum(_sectionList.GetEnumeratorN());
1042 SysTryReturn(NID_IO, pSectionEnum != null, GetLastResult(), GetLastResult(), "[%s] Section list is empty.",
1043 GetErrorMessage(GetLastResult()));
1045 while (pSectionEnum->MoveNext() == E_SUCCESS)
1048 pRegSection = dynamic_cast <_RegistrySection*>(pSectionEnum->GetCurrent());
1049 SysTryReturn(NID_IO, pRegSection != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
1050 GetErrorMessage(GetLastResult()));
1052 // write section name to file
1053 r = inputBuffer.Append(String(L"#" + pRegSection->__sectionName + String(L'\n')));
1054 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
1056 // read the entries for this section
1057 unique_ptr<IEnumerator> pEntryEnum(pRegSection->__entryList.GetEnumeratorN());
1058 SysTryReturn(NID_IO, pSectionEnum != null, GetLastResult(), GetLastResult(), "[%s] Entry list is empty.",
1059 GetErrorMessage(GetLastResult()));
1061 while (pEntryEnum->MoveNext() == E_SUCCESS)
1063 pRegEntry = dynamic_cast <_RegistryEntry*>(pEntryEnum->GetCurrent());
1064 SysTryReturn(NID_IO, pRegEntry != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
1065 GetErrorMessage(GetLastResult()));
1067 // write entry name to file
1068 r = inputBuffer.Append(pRegEntry->entryName + String(L"=" + pRegEntry->entryValue + String(L'\n')));
1069 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
1074 _pBuffer = (byte*)_StringConverter::CopyToCharArrayN(inputBuffer);
1075 SysTryReturn(NID_IO, _pBuffer != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
1076 GetErrorMessage(GetLastResult()));
1078 _length = strlen((char*)_pBuffer);
1084 _RegistryCore::GetSectionIndex(const String& sectionName)
1086 bool sectionFound = false;
1087 _RegistrySection* pRegSection = null;
1090 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
1091 SysTryReturn(NID_IO, sectionName.GetLength() > 0, -1, E_INVALID_ARG,
1092 "[E_INVALID_ARG] sectionName.GetLength() <= 0");
1094 SysTryReturn(NID_IO, _sectionList.GetCount() > 0, -1, E_SECTION_NOT_FOUND, "[E_SECTION_NOT_FOUND] Section not found.");
1096 // Get section information
1097 unique_ptr<IEnumerator> pEnum(_sectionList.GetEnumeratorN());
1098 SysTryReturn(NID_IO, pEnum != null, GetLastResult(), GetLastResult(), "[%s] Section list is empty.",
1099 GetErrorMessage(GetLastResult()));
1101 while (pEnum->MoveNext() == E_SUCCESS)
1103 pRegSection = dynamic_cast <_RegistrySection*>(pEnum->GetCurrent());
1104 SysTryReturn(NID_IO, pRegSection != null, -1, GetLastResult(), "[%s] Propagated.",
1105 GetErrorMessage(GetLastResult()));
1107 if (pRegSection->__sectionName == sectionName)
1109 sectionFound = true;
1115 if (sectionFound == false)
1117 return E_SECTION_NOT_FOUND;
1120 SetLastResult(E_SUCCESS);
1125 _RegistryCore::Removekey(const String& sectionName, const String& keyName)
1127 result r = E_SUCCESS;
1128 int sectionIndex = -1;
1129 int entryIndex = -1;
1131 sectionIndex = GetSectionIndex(sectionName);
1132 r = GetLastResult();
1133 SysTryReturnVoidResult(NID_IO, !IsFailed(r), r, "[%s] Propagated.", GetErrorMessage(r));
1135 entryIndex = GetEntryIndex(sectionIndex, keyName);
1136 r = GetLastResult();
1137 SysTryReturnVoidResult(NID_IO, !IsFailed(r), r, "[%s] Propagated.", GetErrorMessage(r));
1139 RemoveEntry(sectionIndex, entryIndex);
1140 r = GetLastResult();
1141 SysTryReturnVoidResult(NID_IO, !IsFailed(r), r, "[%s] Propagated.", GetErrorMessage(r));
1143 SetLastResult(E_SUCCESS);
1148 _RegistryCore::GetAllSectionCount(void)
1150 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
1152 SetLastResult(E_SUCCESS);
1153 return _sectionList.GetCount();
1157 _RegistryCore::GetAllEntryCount(int sectionIndex)
1159 _RegistrySection* pRegSection = null;
1162 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
1163 SysTryReturn(NID_IO, sectionIndex >= 0, 0, E_INVALID_ARG, "[E_INVALID_ARG] sectionIndex < 0.");
1164 listSize = _sectionList.GetCount();
1165 SysTryReturn(NID_IO, listSize > 0, 0, E_SECTION_NOT_FOUND, "[E_INVALID_ARG] section listSize <= 0.");
1166 SysTryReturn(NID_IO, sectionIndex >= listSize, 0, E_SECTION_NOT_FOUND,
1167 "[E_INVALID_ARG] sectionIndex > listSize.");
1169 pRegSection = (_RegistrySection*) GetSectionByIndex(sectionIndex);
1170 SysTryReturn(NID_IO, pRegSection != null, 0, E_SECTION_NOT_FOUND,
1171 "[E_SECTION_NOT_FOUND] section was not found.");
1173 SetLastResult(E_SUCCESS);
1174 return pRegSection->__entryList.GetCount();
1178 _RegistryCore::RemoveEntry(int sectionIndex, int entryIndex)
1180 result r = E_SUCCESS;
1182 int entryListSize = 0;
1183 _RegistrySection* pRegSection = null;
1185 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
1186 SysTryReturnVoidResult(NID_IO, sectionIndex >= 0, E_INVALID_ARG, "[E_INVALID_ARG] sectionIndex < 0.");
1187 SysTryReturnVoidResult(NID_IO, entryIndex >= 0, E_INVALID_ARG, "[E_INVALID_ARG] entryIndex < 0.");
1189 listSize = _sectionList.GetCount();
1190 SysTryReturnVoidResult(NID_IO, listSize > 0, E_SECTION_NOT_FOUND,
1191 "[E_SECTION_NOT_FOUND] section listSize <= 0.");
1192 SysTryReturnVoidResult(NID_IO, sectionIndex < listSize, E_SECTION_NOT_FOUND,
1193 "[E_SECTION_NOT_FOUND] sectionIndex >= listSize.");
1195 pRegSection = (_RegistrySection*) GetSectionByIndex(sectionIndex);
1196 SysTryReturnVoidResult(NID_IO, pRegSection != null, E_SECTION_NOT_FOUND,
1197 "[E_SECTION_NOT_FOUND] Section at index (%d) not found.", sectionIndex);
1199 r = GetLastResult();
1200 SysTryReturnVoidResult(NID_IO, !IsFailed(r), r,"[%s] Propagated.", GetErrorMessage(r));
1202 entryListSize = pRegSection->__entryList.GetCount();
1203 SysTryReturnVoidResult(NID_IO, (entryListSize > 0 || entryIndex < entryListSize), E_KEY_NOT_FOUND,
1204 "[E_KEY_NOT_FOUND] entryListSize is 0 or entryIndex >= entryListSize.");
1206 r = pRegSection->__entryList.RemoveAt(entryIndex, true);
1207 SysTryReturnVoidResult(NID_IO, !IsFailed(r), r, "[%s] Propagated.", GetErrorMessage(r));
1209 SetLastResult(E_SUCCESS);
1213 _RegistryCore::ModifyEntryValue(int sectionIndex, int entryIndex, _RegValueType type, const void* pValue, int size)
1215 SetLastResult(E_UNSUPPORTED_OPERATION);
1219 _RegistryCore::GetEntryIndex(int sectionIndex, const String& entryName)
1221 _RegistrySection* pRegSection = null;
1222 _RegistryEntry* pRegEntry = null;
1224 bool entryFound = false;
1225 int entryIndex = -1;
1227 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
1228 SysTryReturn(NID_IO, sectionIndex >= 0, -1, E_INVALID_ARG, "[E_INVALID_ARG]sectionIndex < 0.");
1229 SysTryReturn(NID_IO, entryName.GetLength() > 0, -1, E_INVALID_ARG, "[E_INVALID_ARG]entryName length < 0.");
1231 listSize = _sectionList.GetCount();
1232 SysTryReturn(NID_IO, listSize > 0, -1, E_SECTION_NOT_FOUND,
1233 "[E_SECTION_NOT_FOUND]Registry section list is empty.");
1234 SysTryReturn(NID_IO, sectionIndex < listSize, -1, E_SECTION_NOT_FOUND,
1235 "[E_SECTION_NOT_FOUND]sectionIndex >= listSize.");
1237 pRegSection = (_RegistrySection*) GetSectionByIndex(sectionIndex);
1238 SysTryReturn(NID_IO, pRegSection != null, -1, E_SECTION_NOT_FOUND,
1239 "[E_SECTION_NOT_FOUND] Section at index (%d) not found.", sectionIndex);
1241 // read the entries for this section
1242 unique_ptr<IEnumerator> pEntryEnum(pRegSection->__entryList.GetEnumeratorN());
1243 SysTryReturn(NID_IO, pEntryEnum != null, -1, GetLastResult(), "[%s] Entry list is empty.",
1244 GetErrorMessage(GetLastResult()));
1247 while (pEntryEnum->MoveNext() == E_SUCCESS)
1249 pRegEntry = dynamic_cast <_RegistryEntry*>(pEntryEnum->GetCurrent());
1250 SysTryReturn(NID_IO, pRegEntry != null, -1, GetLastResult(), "[%s] Propagated.",
1251 GetErrorMessage(GetLastResult()));
1253 if (entryName == pRegEntry->entryName)
1261 SysTryReturn(NID_IO, entryFound != false, -1, E_KEY_NOT_FOUND, "[E_KEY_NOT_FOUND] entry was not found.");
1263 SetLastResult(E_SUCCESS);
1268 _RegistryCore::GetEntryName(int sectionIndex, int entryIndex)
1270 _RegistrySection* pRegSection = null;
1271 _RegistryEntry* pRegEntry = null;
1276 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
1277 SysTryReturn(NID_IO, sectionIndex >= 0, empty, E_INVALID_ARG, "[E_INVALID_ARG]sectionIndex < 0.");
1278 SysTryReturn(NID_IO, entryIndex >= 0, empty, E_INVALID_ARG, "[E_INVALID_ARG]entryIndex < 0.");
1280 listSize = _sectionList.GetCount();
1281 SysTryReturn(NID_IO, listSize > 0, empty, E_SECTION_NOT_FOUND,
1282 "[E_SECTION_NOT_FOUND]Registry section list is empty.");
1283 SysTryReturn(NID_IO, sectionIndex < listSize, empty, E_SECTION_NOT_FOUND,
1284 "[E_SECTION_NOT_FOUND]sectionIndex >= listSize.");
1286 pRegSection = (_RegistrySection*) GetSectionByIndex(sectionIndex);
1287 SysTryReturn(NID_IO, pRegSection != null, empty, E_SECTION_NOT_FOUND,
1288 "[E_SECTION_NOT_FOUND] Section at index (%d) not found.", sectionIndex);
1290 // read the entries for this section
1291 unique_ptr<IEnumerator> pEntryEnum(pRegSection->__entryList.GetEnumeratorN());
1292 SysTryReturn(NID_IO, pEntryEnum != null, empty, GetLastResult(), "[%s] Entry list is empty.",
1293 GetErrorMessage(GetLastResult()));
1295 tmpIndex = entryIndex;
1296 while (pEntryEnum->MoveNext() == E_SUCCESS)
1300 pRegEntry = dynamic_cast <_RegistryEntry*>(pEntryEnum->GetCurrent());
1301 SysTryReturn(NID_IO, pRegEntry != null, empty, GetLastResult(), "[%s] Propagated.",
1302 GetErrorMessage(GetLastResult()));
1309 SysTryReturn(NID_IO, pRegEntry != null, empty, E_KEY_NOT_FOUND, "[E_KEY_NOT_FOUND] entry was not found.");
1311 SetLastResult(E_SUCCESS);
1312 return pRegEntry->entryName;
1316 _RegistryCore::GetEntryValue(int sectionIndex, int entryIndex, _RegValueType type, void* pValue, int* pSize)
1318 _RegistrySection* pRegSection = null;
1319 _RegistryEntry* pRegEntry = null;
1320 result r = E_SUCCESS;
1322 int tmpEntryIndex = -1;
1323 int entryListSize = 0;
1324 String strValueEncoded;
1326 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
1327 SysTryReturnVoidResult(NID_IO, sectionIndex >= 0, E_INVALID_ARG, "[E_INVALID_ARG]sectionIndex < 0.");
1328 SysTryReturnVoidResult(NID_IO, type >= 0 && type <= REG_VALUE_TYPE_MAX, E_INVALID_ARG,
1329 "[E_INVALID_ARG] invalid registry type.");
1330 SysTryReturnVoidResult(NID_IO, pValue != null, E_INVALID_ARG, "[E_INVALID_ARG]pValue is null.");
1331 SysTryReturnVoidResult(NID_IO, pSize != null, E_INVALID_ARG, "[E_INVALID_ARG]pSize is null.");
1332 SysTryReturnVoidResult(NID_IO, *pSize > 0, E_INVALID_ARG, "[E_INVALID_ARG] *pSize < 0.");
1334 listSize = _sectionList.GetCount();
1335 SysTryReturnVoidResult(NID_IO, listSize > 0, E_SECTION_NOT_FOUND,
1336 "[E_SECTION_NOT_FOUND]Registry section list is empty.");
1337 SysTryReturnVoidResult(NID_IO, sectionIndex < listSize, E_SECTION_NOT_FOUND,
1338 "[E_SECTION_NOT_FOUND]sectionIndex >= listSize.");
1340 pRegSection = (_RegistrySection*) GetSectionByIndex(sectionIndex);
1341 SysTryReturnVoidResult(NID_IO, pRegSection != null, E_SECTION_NOT_FOUND,
1342 "[E_SECTION_NOT_FOUND] section at index (%d) is not available.", sectionIndex);
1344 entryListSize = pRegSection->__entryList.GetCount();
1345 SysTryReturnVoidResult(NID_IO, entryListSize > 0, E_KEY_NOT_FOUND, "[E_KEY_NOT_FOUND]Entry list is empty.");
1346 SysTryReturnVoidResult(NID_IO, entryIndex < entryListSize, E_KEY_NOT_FOUND, "[E_KEY_NOT_FOUND]Entry not found.");
1348 // read the entries for this section
1349 unique_ptr< IEnumerator > pEntryEnum(pRegSection->__entryList.GetEnumeratorN());
1350 SysTryReturnVoidResult(NID_IO, pEntryEnum != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND]Entry list is empty.");
1352 tmpEntryIndex = entryIndex;
1353 while (pEntryEnum->MoveNext() == E_SUCCESS)
1355 if (entryIndex == 0)
1357 pRegEntry = dynamic_cast <_RegistryEntry*>(pEntryEnum->GetCurrent());
1358 SysTryReturnVoidResult(NID_IO, pRegEntry != null, GetLastResult(), "[%s] Propagated.",
1359 GetErrorMessage(GetLastResult()));
1367 SysTryReturnVoidResult(NID_IO, pRegEntry != null, E_KEY_NOT_FOUND,
1368 "[E_KEY_NOT_FOUND] Entry was not found.");
1370 strValueEncoded = pRegEntry->entryValue;
1372 DecodeData(strValueEncoded, type, pValue, pSize);
1373 r = GetLastResult();
1374 SysTryReturnVoidResult(NID_IO, !IsFailed(r), E_PARSING_FAILED, "[%s] Propagated.", GetErrorMessage(r));
1376 SetLastResult(E_SUCCESS);
1381 _RegistryCore::GetSectionName(int sectionIndex)
1383 _RegistrySection* pRegSection = null;
1384 result r = E_SUCCESS;
1386 String sectionName("");
1388 SysAssertf(_constructed == true, "Not yet constructed. Construct() should be called before use.\n");
1389 SysTryReturn(NID_IO, sectionIndex >= 0, sectionName, E_INVALID_ARG, "[E_INVALID_ARG]sectionIndex < 0.");
1391 listSize = _sectionList.GetCount();
1392 SysTryReturn(NID_IO, listSize > 0, sectionName, E_SECTION_NOT_FOUND,
1393 "[E_SECTION_NOT_FOUND]Registry section list is empty.");
1394 SysTryReturn(NID_IO, sectionIndex < listSize, sectionName, E_SECTION_NOT_FOUND,
1395 "[E_SECTION_NOT_FOUND]sectionIndex >= listSize.");
1397 pRegSection = (_RegistrySection*) GetSectionByIndex(sectionIndex);
1398 SysTryReturn(NID_IO, pRegSection != null, sectionName, E_SECTION_NOT_FOUND,
1399 "[E_SECTION_NOT_FOUND] sectionIndex is not available.");
1401 r = GetLastResult();
1402 SysTryReturn(NID_IO, !IsFailed(r), sectionName, r, "[%s] Propagated.", GetErrorMessage(r));
1404 SetLastResult(E_SUCCESS);
1405 return pRegSection->__sectionName;
1409 _RegistryCore::GetSectionByIndex(int sectionIndex)
1411 _RegistrySection* pRegSection = null;
1412 int index = sectionIndex;
1414 // Get section information
1415 unique_ptr<IEnumerator> pEnum(_sectionList.GetEnumeratorN());
1416 SysTryReturn(NID_IO, pEnum != null, null, GetLastResult(),
1417 "[%s] section list is empty.", GetErrorMessage(GetLastResult()));
1419 while (pEnum->MoveNext() == E_SUCCESS)
1423 pRegSection = dynamic_cast< _RegistrySection* >(pEnum->GetCurrent());
1424 SysTryReturn(NID_IO, pRegSection != null, null, GetLastResult(), "[%s] Propagated.",
1425 GetErrorMessage(GetLastResult()));
1432 SysTryReturn(NID_IO, pRegSection != null, null, E_SECTION_NOT_FOUND,
1433 "[E_SECTION_NOT_FOUND] Section was not found.");
1435 SetLastResult(E_SUCCESS);
1441 _RegistryCore::DecodeData(const String& strValueEncoded, _RegValueType type, void* pValue, int* pSize)
1443 SysAssert(strValueEncoded.GetLength() > 0);
1446 SysAssert(pSize && *pSize > 0);
1448 SysTryReturnVoidResult(NID_IO, pValue != null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument.");
1449 SysTryReturnVoidResult(NID_IO, pSize != null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument.");
1453 case REG_VALUE_TYPE_INT: // (-2147483647 - 1) ~ 2147483647
1456 result r = E_SUCCESS;
1458 if (*pSize != sizeof(int))
1460 SetLastResult(E_INVALID_ARG);
1464 r = Integer::Parse(strValueEncoded, retIntVal);
1465 SysTryReturnVoidResult(NID_IO, !IsFailed(r), E_PARSING_FAILED, "[%s] Propagated.", GetErrorMessage(r));
1467 *(int*) pValue = retIntVal;
1471 case REG_VALUE_TYPE_REAL: // Holds signed IEEE 64-bit (8-byte) double-precision floating-point numbers
1472 // ranging in value from -1.79769313486231570E+308 through -4.94065645841246544E-324
1473 // for negative values and from 4.94065645841246544E-324 through 1.79769313486231570E+308
1474 // for positive values.
1476 double retDoubleVal = 0;
1478 if (*pSize != sizeof(double))
1480 SetLastResult(E_INVALID_ARG);
1484 retDoubleVal = _LocalizedNumParser::ToDouble(strValueEncoded, "C");
1485 result r = GetLastResult();
1486 SysTryReturnVoidResult(NID_IO, r == E_SUCCESS, E_PARSING_FAILED, "[%s] Propagated.", GetErrorMessage(r));
1488 *(double*) pValue = retDoubleVal;
1493 case REG_VALUE_TYPE_STRING:
1495 // if(*pSize != sizeof(String))
1497 // SetLastResult(E_INVALID_ARG);
1500 *(String*) pValue = strValueEncoded;
1504 case REG_VALUE_TYPE_BINARY:
1506 SetLastResult(E_PARSING_FAILED);
1510 case REG_VALUE_TYPE_UUID:
1513 result r = E_SUCCESS;
1515 r = UuId::Parse(strValueEncoded, retUuIdVal);
1516 SysTryReturnVoidResult(NID_IO, !IsFailed(r), E_PARSING_FAILED, "[%s] Propagated.", GetErrorMessage(r));
1518 *(UuId*) pValue = retUuIdVal;
1522 case REG_VALUE_TYPE_UUIDSET:
1524 SetLastResult(E_PARSING_FAILED);
1529 SysAssert(0); // should not happen!
1533 SetLastResult(E_SUCCESS);
1538 _RegistryCore::AddSection(LinkedList& sectionList, const String& sectionName)
1540 result r = E_SUCCESS;
1541 bool sectionFound = false;
1543 // Get section information
1544 unique_ptr<IEnumerator> pEnum(sectionList.GetEnumeratorN());
1547 return GetLastResult();
1550 while (pEnum->MoveNext() == E_SUCCESS)
1552 _RegistrySection* pRegSection = dynamic_cast <_RegistrySection*>(pEnum->GetCurrent());
1553 SysTryReturn(NID_IO, pRegSection != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
1554 GetErrorMessage(GetLastResult()));
1556 if (pRegSection->__sectionName == sectionName)
1558 sectionFound = true;
1563 if (sectionFound == true)
1565 return E_SECTION_ALREADY_EXIST;
1568 // create a key with section name
1569 unique_ptr<_RegistrySection> pRegSection(new (std::nothrow) _RegistrySection());
1571 SysTryReturnResult(NID_IO, pRegSection != null, E_OUT_OF_MEMORY,
1572 "The memory is insufficient.");
1574 pRegSection->__sectionName = sectionName;
1576 // add new section and section-entry map
1577 r = sectionList.Add(*(pRegSection.release()));
1578 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
1584 _RegistryCore::AddValue(LinkedList& sectionList, const String& sectionName, const String& entryName, const String& valStr)
1586 result r = E_SUCCESS;
1587 bool sectionFound = false;
1588 bool entryFound = false;
1589 _RegistrySection* pRegSection = null;
1591 // Get section information
1592 unique_ptr<IEnumerator> pEnum(sectionList.GetEnumeratorN());
1595 return GetLastResult();
1598 while (pEnum->MoveNext() == E_SUCCESS)
1600 pRegSection = dynamic_cast <_RegistrySection*>(pEnum->GetCurrent());
1601 SysTryReturn(NID_IO, pRegSection != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
1602 GetErrorMessage(GetLastResult()));
1604 if (pRegSection->__sectionName == sectionName)
1606 sectionFound = true;
1611 if (sectionFound == false)
1613 return E_SECTION_NOT_FOUND;
1616 pEnum.reset(pRegSection->__entryList.GetEnumeratorN());
1619 return GetLastResult();
1622 while (pEnum->MoveNext() == E_SUCCESS)
1624 _RegistryEntry* pRegEntry = dynamic_cast <_RegistryEntry*>(pEnum->GetCurrent());
1625 SysTryReturn(NID_IO, pRegEntry != null, GetLastResult(), GetLastResult(), "[%s] Propagated.",
1626 GetErrorMessage(GetLastResult()));
1628 if (pRegEntry->entryName == entryName)
1635 if (entryFound == true)
1637 return E_KEY_ALREADY_EXIST;
1640 unique_ptr<_RegistryEntry> pRegEntry(new (std::nothrow) _RegistryEntry());
1641 SysTryReturnResult(NID_IO, pRegEntry != null, E_OUT_OF_MEMORY,
1642 "The memory is insufficient.");
1644 pRegEntry->entryName = entryName;
1645 pRegEntry->entryValue = valStr;
1647 r = pRegSection->__entryList.Add(*(pRegEntry.release()));
1648 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
1654 _RegistryCore::CheckSectionName(char* pSectionName)
1661 if (pSectionName == null)
1666 pFrom = pSectionName;
1667 length = strlen(pSectionName);
1668 pTo = pSectionName + (length - 1);
1670 if (!pFrom || !pTo || pFrom > pTo)
1675 for (pTemp = pFrom; pTemp <= pTo; pTemp++)
1677 if (*pTemp == '\0' || *pTemp == '\n' || *pTemp == '#' || *pTemp == '=')
1687 _RegistryCore::CheckEntryName(char* pEntryName)
1694 if (pEntryName == null)
1700 length = strlen(pEntryName);
1701 pTo = pEntryName + (length - 1);
1703 if (!pFrom || !pTo || pFrom > pTo)
1708 for (pTemp = pFrom; pTemp <= pTo; pTemp++)
1710 if (*pTemp == '\0' || *pTemp == '\n' || *pTemp == '#' || *pTemp == '=')
1720 _RegistryCore::CheckEntryValue(char* pEntryVal)
1727 if (pEntryVal == null)
1733 length = strlen(pEntryVal);
1734 pTo = pEntryVal + (length - 1);
1736 if (!pFrom || !pTo || pFrom > pTo)
1741 for (pTemp = pFrom; pTemp <= pTo; pTemp++)
1743 if (*pTemp == '\0' || *pTemp == '\n')
1753 _RegistryCore::ConvertToSecureRegistry(const String& plainRegPath, const String& secureRegPath, const ByteBuffer* pKey)
1755 result r = E_SUCCESS;
1757 if (File::IsFileExist(secureRegPath))
1759 r = GetLastResult();
1762 r = E_FILE_ALREADY_EXIST;
1763 SysLog(NID_IO, "[E_FILE_ALREADY_EXIST] The secure registry already exists.");
1767 SysLog(NID_IO, "[%s]Propagated.", GetErrorMessage(r));
1772 unique_ptr<_NormalRegistry> pNormalReg(new (std::nothrow) _NormalRegistry());
1773 SysTryReturnResult(NID_IO, pNormalReg != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
1775 r = pNormalReg->Load(plainRegPath, "r");
1776 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
1778 unique_ptr<_SecureRegistry> pSecureReg(new (std::nothrow) _SecureRegistry());
1779 SysTryReturnResult(NID_IO, pSecureReg != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
1781 r = pSecureReg->Construct(secureRegPath, "w+", pKey);
1782 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
1784 if (pNormalReg->_pBuffer != null && pNormalReg->_length > 0)
1786 pSecureReg->_pBuffer = pNormalReg->_pBuffer;
1787 pSecureReg->_length = pNormalReg->_length;
1789 pNormalReg->_pBuffer = null;
1790 pNormalReg->_length = 0;
1792 r = pSecureReg->Parse();
1793 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
1796 r = pSecureReg->Flush();
1797 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
1803 _RegistryCore::LockN(FileLockType lockType)
1805 SysAssertf(_constructed == true && __pFileImpl != null, "Not yet constructed. Construct() should be called before use.\n");
1806 return __pFileImpl->LockN(lockType);
1810 _RegistryCore::TryToLockN(FileLockType lockType)
1812 SysAssertf(_constructed == true && __pFileImpl != null, "Not yet constructed. Construct() should be called before use.\n");
1813 return __pFileImpl->TryToLockN(lockType);