javacommons/security/src/utils/storagehandler.cpp
branchRCL_3
changeset 14 04becd199f91
child 17 0fd27995241b
--- /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<int>& 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<int>& 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;
+    }
+}