--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/security/legacysupport/storageutils/src/StorageUtils.cpp Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,567 @@
+/*
+* 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 "StorageUtils.h"
+#include "javastoragenames.h"
+#include "javastorage.h"
+#include "javastorageexception.h"
+#include "javasymbianoslayer.h"
+#include "javacommonutils.h"
+
+using namespace std;
+using namespace java::storage;
+using namespace java::security::legacysupport;
+using namespace java::util;
+
+StorageUtils* StorageUtils::NewL()
+{
+ StorageUtils* self = new(ELeave) StorageUtils();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+}
+
+StorageUtils::StorageUtils()
+{
+}
+
+void StorageUtils::ConstructL()
+{
+ try
+ {
+ iStorage = JavaStorage::createInstance();
+ iStorage->open(JAVA_DATABASE_NAME);
+ }
+ catch (JavaStorageException& aJse)
+ {
+ User::Leave(aJse.mStatus);
+ }
+}
+
+void StorageUtils::readOnScreenKeyboardAttributeL(const std::wstring& aMidletSuiteUid, wstring& aValue)
+{
+ try
+ {
+ JavaStorageApplicationEntry_t query;
+ JavaStorageApplicationList_t queryResult;
+ JavaStorageEntry attr;
+ attr.setEntry(ID, aMidletSuiteUid);
+ query.insert(attr);
+ attr.setEntry(ON_SCREEN_KEYPAD, L"");
+ query.insert(attr);
+ iStorage->search(MIDP_PACKAGE_TABLE, query, queryResult);
+ wstring value = L"";
+ findEntry(queryResult, ON_SCREEN_KEYPAD, aValue);
+ if (aValue.size() == 0)
+ {
+ User::Leave(KErrNotFound);
+ }
+ }
+ catch (JavaStorageException& aJse)
+ {
+ User::Leave(KErrNotFound);
+ }
+}
+
+void StorageUtils::writeOnScreenKeyboardAttribute(const std::wstring& aMidletSuiteUid, const wstring& aValue)
+{
+ try
+ {
+ JavaStorageApplicationEntry_t oldEntry;
+ JavaStorageEntry attr;
+ attr.setEntry(ID, aMidletSuiteUid);
+ oldEntry.insert(attr);
+ JavaStorageApplicationEntry_t entry;
+ attr.setEntry(ON_SCREEN_KEYPAD, aValue);
+ entry.insert(attr);
+ iStorage->update(MIDP_PACKAGE_TABLE, entry, oldEntry);
+ }
+ catch (JavaStorageException& aJse)
+ {
+ }
+}
+
+void StorageUtils::readMidletSuitesInfos(vector<MidletSuiteInfo*>& aMidletSuites)
+{
+ try
+ {
+ JavaStorageApplicationEntry_t query;
+ JavaStorageApplicationList_t queryResult;
+ JavaStorageEntry attr;
+ attr.setEntry(ID, L"");
+ query.insert(attr);
+ attr.setEntry(PACKAGE_NAME, L"");
+ query.insert(attr);
+ attr.setEntry(VENDOR, L"");
+ query.insert(attr);
+ attr.setEntry(VERSION, L"");
+ query.insert(attr);
+ iStorage->search(APPLICATION_PACKAGE_TABLE, query, queryResult);
+ JavaStorageApplicationList_t::const_iterator iterator;
+ JavaStorageApplicationList_t domainQueryResult;
+ MidletSuiteInfo* info;
+ for (iterator = queryResult.begin(); iterator != queryResult.end(); iterator++)
+ {
+ std::wstring suiteUid = L"";
+ std::wstring suiteName = L"";
+ std::wstring suiteVendor = L"";
+ std::wstring suiteVersion = L"";
+ std::wstring suiteProtectionDomain = L"";
+ JavaStorageApplicationEntry_t entry = (*iterator);
+ findColumn(entry, ID, suiteUid);
+ findColumn(entry, PACKAGE_NAME, suiteName);
+ findColumn(entry, VENDOR, suiteVendor);
+ findColumn(entry, VERSION, suiteVersion);
+ entry.clear();
+ query.clear();
+ attr.setEntry(ID, suiteUid);
+ query.insert(attr);
+ attr.setEntry(SECURITY_DOMAIN_CATEGORY, L"");
+ query.insert(attr);
+ domainQueryResult.clear();
+ iStorage->search(MIDP_PACKAGE_TABLE, query, domainQueryResult);
+ findEntry(queryResult,SECURITY_DOMAIN_CATEGORY , suiteProtectionDomain);
+ info = new MidletSuiteInfo(suiteUid, suiteName, suiteVendor, suiteVersion, suiteProtectionDomain);
+ aMidletSuites.push_back(info);
+ }
+ }
+ catch (JavaStorageException& aJse)
+ {
+ }
+}
+
+void StorageUtils::readMidletSuiteInfoL(const std::wstring& aMidletSuiteName, const std::wstring& aMidletSuiteVendor, const std::wstring& aMidletSuiteVersion, MidletSuiteInfo& aMidletSuiteInfo)
+{
+ if (aMidletSuiteName.size() == 0
+ || aMidletSuiteVendor.size() == 0
+ || aMidletSuiteVersion.size() == 0)
+ {
+ User::Leave(KErrNotFound);
+ }
+ try
+ {
+ JavaStorageApplicationEntry_t query;
+ JavaStorageApplicationList_t queryResult;
+ JavaStorageEntry attr;
+ wstring midletSuiteUid = L"";
+ attr.setEntry(ID, L"");
+ query.insert(attr);
+ attr.setEntry(PACKAGE_NAME, aMidletSuiteName);
+ query.insert(attr);
+ attr.setEntry(VENDOR, aMidletSuiteVendor);
+ query.insert(attr);
+ attr.setEntry(VERSION, aMidletSuiteVersion);
+ query.insert(attr);
+ iStorage->search(APPLICATION_PACKAGE_TABLE, query, queryResult);
+ findEntry(queryResult, ID, midletSuiteUid);
+ wstring midletSuiteVersion = aMidletSuiteVersion;
+ if (midletSuiteUid.size() == 0)
+ {
+ TAppVersion appVersion = wstringToAppVersion(aMidletSuiteVersion);
+ midletSuiteVersion = JavaCommonUtils::intToWstring(appVersion.iMajor);
+ midletSuiteVersion += L".";
+ midletSuiteVersion += JavaCommonUtils::intToWstring(appVersion.iMinor);
+ query.clear();
+ queryResult.clear();
+ attr.setEntry(ID, L"");
+ query.insert(attr);
+ attr.setEntry(PACKAGE_NAME, aMidletSuiteName);
+ query.insert(attr);
+ attr.setEntry(VENDOR, aMidletSuiteVendor);
+ query.insert(attr);
+ attr.setEntry(VERSION, midletSuiteVersion);
+ query.insert(attr);
+ iStorage->search(APPLICATION_PACKAGE_TABLE, query, queryResult);
+ findEntry(queryResult, ID, midletSuiteUid);
+ if (midletSuiteUid.size() == 0)
+ {
+ // one more try: the long version
+ midletSuiteVersion += L".";
+ midletSuiteVersion += JavaCommonUtils::intToWstring(appVersion.iBuild);
+ query.clear();
+ queryResult.clear();
+ attr.setEntry(ID, L"");
+ query.insert(attr);
+ attr.setEntry(PACKAGE_NAME, aMidletSuiteName);
+ query.insert(attr);
+ attr.setEntry(VENDOR, aMidletSuiteVendor);
+ query.insert(attr);
+ attr.setEntry(VERSION, midletSuiteVersion);
+ query.insert(attr);
+ iStorage->search(APPLICATION_PACKAGE_TABLE, query, queryResult);
+ findEntry(queryResult, ID, midletSuiteUid);
+ if (midletSuiteUid.size() == 0)
+ {
+ User::Leave(KErrNotFound);
+ }
+ }
+ }
+ query.clear();
+ attr.setEntry(ID, midletSuiteUid);
+ query.insert(attr);
+ attr.setEntry(SECURITY_DOMAIN_CATEGORY, L"");
+ query.insert(attr);
+ queryResult.clear();
+ iStorage->search(MIDP_PACKAGE_TABLE, query, queryResult);
+ wstring midletSuiteDomain = L"";
+ findEntry(queryResult,SECURITY_DOMAIN_CATEGORY , midletSuiteDomain);
+ if (midletSuiteDomain.size() == 0)
+ {
+ User::Leave(KErrNotFound);
+ }
+ MidletSuiteInfo midletSuiteInfo(midletSuiteUid,
+ aMidletSuiteName,
+ aMidletSuiteVendor,
+ midletSuiteVersion,
+ midletSuiteDomain);
+ aMidletSuiteInfo = midletSuiteInfo;
+ }
+ catch (JavaStorageException& aJse)
+ {
+ User::Leave(KErrNotFound);
+ }
+}
+
+int StorageUtils::readMidletSuiteSecuritySettings(const std::wstring& aMidletSuiteUid, std::vector<MidletSuiteSecuritySettings>& aMidletSuiteSecuritySettings)
+{
+ try
+ {
+ JavaStorageApplicationEntry_t query;
+ JavaStorageApplicationList_t queryResult;
+ JavaStorageEntry attr;
+ attr.setEntry(ID, aMidletSuiteUid);
+ query.insert(attr);
+ attr.setEntry(FUNCTION_GROUP, L"");
+ query.insert(attr);
+ iStorage->search(MIDP_FUNC_GRP_SETTINGS_TABLE, query, queryResult);
+ JavaStorageApplicationList_t::const_iterator iterator;
+ JavaStorageApplicationList_t settingsQueryResult;
+ MidletSuiteSecuritySettings settings;
+ for (iterator = queryResult.begin(); iterator != queryResult.end(); iterator++)
+ {
+ std::wstring settingsName = L"";
+ JavaStorageApplicationEntry_t entry = (*iterator);
+ findColumn(entry, FUNCTION_GROUP, settingsName);
+ entry.clear();
+ query.clear();
+ attr.setEntry(ID, aMidletSuiteUid);
+ query.insert(attr);
+ attr.setEntry(FUNCTION_GROUP, settingsName);
+ query.insert(attr);
+ attr.setEntry(CURRENT_SETTING, L"");
+ query.insert(attr);
+ attr.setEntry(ALLOWED_SETTINGS , L"");
+ query.insert(attr);
+ settingsQueryResult.clear();
+ iStorage->search(MIDP_FUNC_GRP_SETTINGS_TABLE, query, settingsQueryResult);
+ if (settingsQueryResult.size() > 0)
+ {
+ wstring currentInteractionMode = L"";
+ wstring allowedInteractionModes = L"";
+ findEntry(settingsQueryResult,CURRENT_SETTING , currentInteractionMode);
+ findEntry(settingsQueryResult,ALLOWED_SETTINGS , allowedInteractionModes);
+ if (currentInteractionMode.size() > 0 && allowedInteractionModes.size() > 0)
+ {
+ settings = MidletSuiteSecuritySettings(
+ settingsName,
+ JavaCommonUtils::wstringToInt(currentInteractionMode),
+ JavaCommonUtils::wstringToInt(allowedInteractionModes));
+ }
+ }
+ aMidletSuiteSecuritySettings.push_back(settings);
+ }
+ }
+ catch (JavaStorageException& aJse)
+ {
+ return KErrNotFound;
+ }
+ return KErrNone;
+}
+
+int StorageUtils::readMidletSuiteSecuritySettings(const std::wstring& aMidletSuiteUid, const std::wstring& aSettingsName, MidletSuiteSecuritySettings& aSecuritySettings)
+{
+ try
+ {
+ JavaStorageApplicationEntry_t query;
+ JavaStorageApplicationList_t queryResult;
+ JavaStorageEntry attr;
+ attr.setEntry(ID, aMidletSuiteUid);
+ query.insert(attr);
+ attr.setEntry(FUNCTION_GROUP, aSettingsName);
+ query.insert(attr);
+ iStorage->search(MIDP_FUNC_GRP_SETTINGS_TABLE, query, queryResult);
+ if (queryResult.size() == 0)
+ {
+ return KErrNotFound;
+ }
+ MidletSuiteSecuritySettings settings;
+ queryResult.clear();
+ attr.setEntry(CURRENT_SETTING, L"");
+ query.insert(attr);
+ attr.setEntry(ALLOWED_SETTINGS , L"");
+ query.insert(attr);
+ iStorage->search(MIDP_FUNC_GRP_SETTINGS_TABLE, query, queryResult);
+ if (queryResult.size() > 0)
+ {
+ wstring currentInteractionMode = L"";
+ wstring allowedInteractionModes = L"";
+ findEntry(queryResult,CURRENT_SETTING , currentInteractionMode);
+ findEntry(queryResult,ALLOWED_SETTINGS , allowedInteractionModes);
+ if (currentInteractionMode.size() > 0 && allowedInteractionModes.size() > 0)
+ {
+ settings = MidletSuiteSecuritySettings(
+ JavaCommonUtils::wstringToInt(currentInteractionMode),
+ JavaCommonUtils::wstringToInt(allowedInteractionModes));
+ }
+ }
+ aSecuritySettings = settings;
+ }
+ catch (JavaStorageException& aJse)
+ {
+ return KErrNotFound;
+ }
+ return KErrNone;
+}
+
+int StorageUtils::writeMidletSuiteSecuritySettings(const std::wstring& aMidletSuiteUid, const std::wstring& aSettingsName, int aCurrentInteractionMode)
+{
+ try
+ {
+ JavaStorageApplicationEntry_t entry;
+ JavaStorageApplicationEntry_t oldEntry;
+ JavaStorageEntry attr;
+ attr.setEntry(ID, aMidletSuiteUid);
+ oldEntry.insert(attr);
+ attr.setEntry(FUNCTION_GROUP, aSettingsName);
+ oldEntry.insert(attr);
+ attr.setEntry(CURRENT_SETTING, JavaCommonUtils::intToWstring(aCurrentInteractionMode));
+ entry.insert(attr);
+ iStorage->update(MIDP_FUNC_GRP_SETTINGS_TABLE, entry, oldEntry);
+ }
+ catch (JavaStorageException& aJse)
+ {
+ return KErrNotFound;
+ }
+ return KErrNone;
+}
+
+int StorageUtils::writeUserSecuritySettingsPromptFlag(const std::wstring& aMidletSuiteUid, const std::wstring& aSettingsName, bool aPromptFlag)
+{
+ try
+ {
+ JavaStorageApplicationEntry_t entry;
+ JavaStorageApplicationEntry_t oldEntry;
+ JavaStorageEntry attr;
+ attr.setEntry(ID, aMidletSuiteUid);
+ oldEntry.insert(attr);
+ attr.setEntry(FUNCTION_GROUP, aSettingsName);
+ oldEntry.insert(attr);
+ std::wstring blanketPrompt;
+ if (aPromptFlag)
+ {
+ blanketPrompt = L"1";
+ }
+ else
+ {
+ blanketPrompt = L"0";
+ }
+ attr.setEntry(BLANKET_PROMPT, blanketPrompt);
+ entry.insert(attr);
+ iStorage->update(MIDP_FUNC_GRP_SETTINGS_TABLE, entry, oldEntry);
+ }
+ catch (JavaStorageException& aJse)
+ {
+ return KErrNotFound;
+ }
+ return KErrNone;
+}
+
+StorageUtils::~StorageUtils()
+{
+ if (iStorage != NULL)
+ {
+ iStorage->close();
+ delete iStorage;
+ iStorage = NULL;
+ }
+}
+
+void StorageUtils::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 StorageUtils::findColumn(const JavaStorageApplicationEntry_t& aEntry,
+ const wstring& aColName, wstring& aColValue)
+{
+ JavaStorageEntry findPattern;
+ findPattern.setEntry(aColName, L"");
+ JavaStorageApplicationEntry_t::const_iterator findIterator =
+ aEntry.find(findPattern);
+ if (findIterator != aEntry.end())
+ {
+ aColValue = findIterator->entryValue();
+ }
+}
+
+// Converts a string from either xxx.yy(zzzzz) or xxx.yy.zzzzzz
+// into a TAppVersion representation
+// where xx is the major, yy is the minor and zzzzz is the build
+TAppVersion StorageUtils::wstringToAppVersion(const std::wstring& aVersionString)
+{
+ TAppVersion appVersion;
+ char* temp = JavaCommonUtils::wstringToUtf8(aVersionString);
+ std::string versionStr = temp;
+
+ std::string::size_type idx = 0;
+ idx = versionStr.find(".", idx);
+
+ if (idx != std::string::npos)
+ {
+ versionStr.replace(idx, 1, " ");
+ }
+
+ std::string::size_type tmp = 0;
+ tmp = versionStr.find("(", idx + 1);
+
+ if (tmp != std::string::npos)
+ {
+ idx = tmp;
+ versionStr.replace(idx, 1, " ");
+ }
+ else
+ {
+ tmp = versionStr.find(".", idx + 1);
+ idx = tmp;
+ if (tmp != std::string::npos)
+ {
+ versionStr.replace(idx, 1, " ");
+ }
+ }
+
+ tmp = versionStr.find(")", idx + 1);
+
+ if (tmp != std::string::npos)
+ {
+ idx = tmp;
+ versionStr.replace(idx, 1, " ");
+ }
+ else
+ {
+ tmp = versionStr.find(".", idx + 1);
+ idx = tmp;
+ if (tmp != std::string::npos)
+ {
+ versionStr.replace(idx, 1, " ");
+ }
+ }
+
+ int major = 0;
+ int minor = 0;
+ int build = 0;
+ int result = sscanf(
+ versionStr.c_str(), "%d %d %d", &major, &minor, &build);
+
+ if (major > 0)
+ {
+ appVersion.iMajor = major;
+ }
+
+ if (minor > 0)
+ {
+ appVersion.iMinor = minor;
+ }
+
+ if (build > 0)
+ {
+ appVersion.iBuild = build;
+ }
+ delete[] temp;
+
+ return appVersion;
+}
+
+
+MidletSuiteInfo::MidletSuiteInfo(const std::wstring& aUid,
+ const std::wstring& aName,
+ const std::wstring& aVendor,
+ const std::wstring& aVersion,
+ const std::wstring& aProtectionDomain)
+ : iUid(aUid), iName(aName), iVendor(aVendor), iVersion(aVersion), iProtectionDomain(aProtectionDomain)
+{
+}
+
+MidletSuiteInfo& MidletSuiteInfo::operator=(const MidletSuiteInfo& aMidletSuiteInfo)
+{
+ iUid = aMidletSuiteInfo.iUid;
+ iName = aMidletSuiteInfo.iName;
+ iVendor = aMidletSuiteInfo.iVendor;
+ iVersion = aMidletSuiteInfo.iVersion;
+ iProtectionDomain = aMidletSuiteInfo.iProtectionDomain;
+ return *this;
+}
+
+MidletSuiteInfo::MidletSuiteInfo()
+ : iUid(L""), iName(L""), iVendor(L""), iVersion(L""), iProtectionDomain(L"")
+{
+}
+
+MidletSuiteSecuritySettings::MidletSuiteSecuritySettings(const int aCurrentInteractionMode,
+ const int aAllowedInteractionModes)
+ : iSettingsName(L""), iCurrentInteractionMode(aCurrentInteractionMode), iAllowedInteractionModes(aAllowedInteractionModes)
+{
+}
+
+MidletSuiteSecuritySettings::MidletSuiteSecuritySettings(const std::wstring& aSettingsName,
+ const int aCurrentInteractionMode,
+ const int aAllowedInteractionModes)
+ : iSettingsName(aSettingsName), iCurrentInteractionMode(aCurrentInteractionMode), iAllowedInteractionModes(aAllowedInteractionModes)
+{
+}
+
+MidletSuiteSecuritySettings& MidletSuiteSecuritySettings::operator=(const MidletSuiteSecuritySettings& aMidletSuiteSecuritySettings)
+{
+ iSettingsName = aMidletSuiteSecuritySettings.iSettingsName;
+ iCurrentInteractionMode = aMidletSuiteSecuritySettings.iCurrentInteractionMode;
+ iAllowedInteractionModes = aMidletSuiteSecuritySettings.iAllowedInteractionModes;
+ return *this;
+}
+
+MidletSuiteSecuritySettings::MidletSuiteSecuritySettings(const MidletSuiteSecuritySettings& aMidletSuiteSecuritySettings)
+{
+ iSettingsName = aMidletSuiteSecuritySettings.iSettingsName;
+ iCurrentInteractionMode = aMidletSuiteSecuritySettings.iCurrentInteractionMode;
+ iAllowedInteractionModes = aMidletSuiteSecuritySettings.iAllowedInteractionModes;
+}
+
+MidletSuiteSecuritySettings::MidletSuiteSecuritySettings()
+ : iSettingsName(L""), iCurrentInteractionMode(-1), iAllowedInteractionModes(-1)
+{
+}