diff -r f5050f1da672 -r 04becd199f91 javacommons/security/src/utils/storagehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javacommons/security/src/utils/storagehandler.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,183 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#include "storagehandler.h" +#include "javacommonutils.h" +#include "javastoragenames.h" +#include "javastorage.h" +#include "logger.h" + +using namespace std; +using namespace java::storage; +using namespace java::security; +using namespace java::util; + +StorageHandler::StorageHandler() +{ + iStorage = JavaStorage::createInstance(); + iStorage->open(JAVA_DATABASE_NAME); +} + +void StorageHandler::readValidCerts(const Uid& aUid, std::list& aCerts) +{ + JavaStorageEntry attr; + JavaStorageApplicationEntry_t entry; + + attr.setEntry(ID, aUid.toString()); + entry.insert(attr); + + attr.setEntry(VALID_CERTS, L""); + entry.insert(attr); + + JavaStorageApplicationList_t foundApps; + + iStorage->search(MIDP_PACKAGE_TABLE, entry, foundApps); + + wstring certIndexes = L""; + findEntry(foundApps, VALID_CERTS, certIndexes); + + wstring::size_type startIdx = 0; + wstring::size_type endIdx = 0; + const char delim = ','; + + while (wstring::npos != startIdx || wstring::npos != endIdx) + { + endIdx = certIndexes.find(delim, startIdx); + if (endIdx == wstring::npos) break; // Not found + + if (startIdx != endIdx) // Skip 1,,2 case + { + addToValidCerts(certIndexes.substr( + startIdx, (endIdx - startIdx)), aCerts); + } + startIdx = endIdx + 1; + } + + // Read last one + if ((startIdx = certIndexes.find_last_of(delim)) != wstring::npos) + { + addToValidCerts(certIndexes.substr(startIdx + 1, + (certIndexes.size() - startIdx)), aCerts); + } + + // If only one cert index without delimiter + if (aCerts.size() == 0 && certIndexes.size() > 0) + { + addToValidCerts(certIndexes, aCerts); + } +} + +void StorageHandler::getChainFromIndex( + const JavaStorageApplicationList_t& aAttributes, + const int aIndex, + std::string& aChain) +{ + int i = 1; + wstring chain = L""; + bool foundPart = true; + const wstring attrPrefix = L"MIDlet-Certificate-"; + JavaStorageEntry attr; + + do + { + wstring indexedAttrName = attrPrefix; + indexedAttrName.append(JavaCommonUtils::intToWstring(aIndex)) + .append(L"-").append(JavaCommonUtils::intToWstring(i)); + + attr.setEntry(NAME, indexedAttrName); + + JavaStorageApplicationEntry_t findEntry; + findEntry.insert(attr); + + bool found = false; + JavaStorageApplicationList_t::const_iterator appIter; + + for (appIter = aAttributes.begin() + ; appIter != aAttributes.end() + ; appIter++) + { + JavaStorageApplicationEntry_t::const_iterator entryFinder + = (*appIter).find(attr); + + if (entryFinder != (*appIter).end()) // Correct one found. + { + attr.setEntry(VALUE, L""); + entryFinder = (*appIter).find(attr); // Get its value. + + if (entryFinder != (*appIter).end()) + { + chain.append((*entryFinder).entryValue()); + } + + found = true; + break; + } + } + + if (!found) + { + foundPart = false; + } + + i++; + } + while (foundPart); + + char* tempStr = JavaCommonUtils::wstringToUtf8(chain); + aChain.append(tempStr); + delete [] tempStr; +} +void StorageHandler::findEntry(const JavaStorageApplicationList_t& queryResult, + const std::wstring& eName, + std::wstring& eValue) +{ + if (queryResult.size() > 0) + { + JavaStorageApplicationEntry_t entry = queryResult.front(); + JavaStorageEntry findPattern; + findPattern.setEntry(eName, L""); + JavaStorageApplicationEntry_t::const_iterator findIterator = + entry.find(findPattern); + if (findIterator != entry.end()) + { + eValue = findIterator->entryValue(); + } + } +} + +void StorageHandler::addToValidCerts( + const wstring& aValue, list& aCerts) +{ + try + { + aCerts.push_back(JavaCommonUtils::wstringToInt(aValue)); + } + catch (ExceptionBase eb) + { + WLOG1WSTR(EJavaStorage, + "Invalid cert index skipped: %s", aValue); + } +} + +StorageHandler::~StorageHandler() +{ + if (NULL != iStorage) + { + iStorage->close(); + delete iStorage; + iStorage = NULL; + } +}