javamanager/javaregistry/client/src/writeablejavaregistrypackageentry.cpp
branchRCL_3
changeset 14 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javaregistry/client/src/writeablejavaregistrypackageentry.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,472 @@
+/*
+* Copyright (c) 2005-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:  writeablejavaregistrypackageentry implementation
+*
+*/
+
+
+// INCLUDES
+
+#include <memory>
+#include <e32base.h>
+#include <appversion.h>
+
+#include "writeablejavaregistrypackageentry.h"
+#include "securitystoragedatadefs.h"
+#include "javacommonutils.h"
+#include "javastoragenames.h"
+#include "javasizehelpclient.h"
+#include "javasymbianoslayer.h"
+#include "logger.h"
+
+using namespace Java::Manager::Registry;
+using namespace java::storage;
+using namespace java::util;
+using namespace std;
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ---------------------------------------------------------------------------
+// CJavaRegistryPackageEntry::CJavaRegistryPackageEntry
+// ---------------------------------------------------------------------------
+//
+CWriteableJavaRegistryPackageEntry::CWriteableJavaRegistryPackageEntry
+(JavaStorageApplicationEntry_t& aEntry, TJavaRegistryEntryType aType) :
+        CWriteableJavaRegistryEntry(aEntry , aType)
+{
+}
+
+// ---------------------------------------------------------------------------
+// CWriteableJavaRegistryPackageEntry::~CWriteableJavaRegistryPackageEntry
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CWriteableJavaRegistryPackageEntry::
+~CWriteableJavaRegistryPackageEntry()
+{
+    if (iVendor)
+    {
+        delete iVendor;
+        iVendor = NULL;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CWriteableJavaRegistryPackageEntry::Version
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TAppVersion CWriteableJavaRegistryPackageEntry::Version() const
+{
+    JELOG2(EJavaStorage);
+
+    wstring value = L"";
+    EntryAttributeValue(iEntry, VERSION, value);
+    return wstringToAppVersion(value);
+}
+
+// ---------------------------------------------------------------------------
+// CWriteableJavaRegistryPackageEntry::Vendor
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& CWriteableJavaRegistryPackageEntry::Vendor() const
+{
+    JELOG2(EJavaStorage);
+
+    if (!iVendor)
+    {
+        wstring value = L"";
+        EntryAttributeValue(iEntry, VENDOR, value);
+
+        if (value == L"")
+        {
+            return KNullDesC;
+        }
+        else
+        {
+            iVendor = wstringToBuf(value);
+        }
+    }
+    return *iVendor;
+}
+
+
+// ---------------------------------------------------------------------------
+// CWriteableJavaRegistryPackageEntry::IsUninstallable
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CWriteableJavaRegistryPackageEntry::IsUninstallable() const
+{
+    JELOG2(EJavaStorage);
+
+    TBool result = ETrue;
+
+    _LIT(KBlockUninstall, "Nokia-MIDlet-Block-Uninstall");
+    const MJavaAttribute* blockUninstall = NULL;
+    TRAPD(err, blockUninstall = AttributeL(KBlockUninstall));
+
+    if (KErrNone != err)
+    {
+        ELOG1(EJavaStorage, "Cannot read Block uninstall attribute: %d", err);
+        return ETrue;
+    }
+
+    _LIT(KValueTrue, "true");
+
+    // If attribute is present and value is set to true.
+    if (blockUninstall && blockUninstall->Value().CompareF(KValueTrue) == 0)
+    {
+        // Check it is authorized i.e. belongs to manufacturer or operator
+        // domain
+        wstring value = L"";
+        EntryAttributeValue(iEntry, ID, value);
+
+        java::util::Uid suiteUid(value);
+        JavaStorageApplicationEntry_t suiteEntry;
+
+        StorageEntry(suiteUid, MIDP_PACKAGE_TABLE, suiteEntry);
+        value.clear();
+
+        EntryAttributeValue(suiteEntry, SECURITY_DOMAIN_CATEGORY, value);
+
+        if (value.size() > 0)
+        {
+            try
+            {
+                if (value == OPERATOR_DOMAIN_CATEGORY
+                        || value == MANUFACTURER_DOMAIN_CATEGORY)
+
+                {
+                    result = EFalse;
+                }
+            }
+            catch (ExceptionBase& e)
+            {
+                ELOG1WSTR(EJavaStorage,
+                          "Security domain UTF-8 conversion failed: %s", value);
+            }
+        }
+    }
+
+    if (blockUninstall)
+    {
+        delete blockUninstall;
+        blockUninstall = NULL;
+    }
+
+    return result;
+}
+
+// ---------------------------------------------------------------------------
+// CWriteableJavaRegistryPackageEntry::GetEmbeddedEntries
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CWriteableJavaRegistryPackageEntry::
+GetEmbeddedEntries(RArray<TUid>& aUids) const
+{
+    JELOG2(EJavaStorage);
+
+    wstring value = L"";
+    EntryAttributeValue(iEntry, ID, value);
+
+    JavaStorageApplicationList_t apps;
+    java::util::Uid uid(value);
+    SuiteEntries(uid, apps);
+
+    if (apps.size() != 0)
+    {
+        JavaStorageEntry attr;
+        attr.setEntry(ID, L"");
+        JavaStorageApplicationList_t::const_iterator appsIter;
+
+        for (appsIter = apps.begin(); appsIter != apps.end(); ++appsIter)
+        {
+            JavaStorageApplicationEntry_t::const_iterator entryIter
+            = (*appsIter).find(attr);
+
+            if (entryIter != (*appsIter).end())
+            {
+                wstring attrValue = L"";
+                EntryAttributeValue((*appsIter), ID, attrValue);
+
+                if (attrValue.size() > 0)
+                {
+                    java::util::Uid appUid(attrValue);
+                    TUid converted;
+                    TInt err = uidToTUid(appUid, converted);
+                    if (KErrNone == err)
+                    {
+                        aUids.Append(converted);
+                    }
+                    else
+                    {
+                        ELOG1(EJavaStorage, "Uid TUid conversion err: %d",
+                              err);
+                    }
+                }
+            }
+        }
+    }
+    apps.clear();
+}
+
+// ---------------------------------------------------------------------------
+// CWriteableJavaRegistryPackageEntry::NumberOfEmbeddedEntries
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CWriteableJavaRegistryPackageEntry::
+NumberOfEmbeddedEntries() const
+{
+    JELOG2(EJavaStorage);
+
+    wstring value = L"";
+    EntryAttributeValue(iEntry, ID, value);
+
+    JavaStorageApplicationList_t apps;
+    java::util::Uid uid(value);
+    SuiteEntries(uid, apps);
+
+    return apps.size();
+}
+
+// ---------------------------------------------------------------------------
+// CWriteableJavaRegistryPackageEntry::EmbeddedEntryByUidL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CWriteableJavaRegistryEntry*
+CWriteableJavaRegistryPackageEntry::
+EmbeddedEntryByUidL(const TUid& aEntryUid) const
+{
+    JELOG2(EJavaStorage);
+
+    JavaStorageApplicationEntry_t attributes;
+    java::util::Uid entryUid;
+
+    StorageEntry(
+        TUidToUid(aEntryUid, entryUid), APPLICATION_TABLE, attributes);
+
+    if (0 == attributes.size())
+    {
+        WLOG(EJavaStorage, "Entry does not exists");
+        return NULL;
+    }
+
+    return new CWriteableJavaRegistryEntry(attributes, EMidp2Midlet);
+}
+
+// ---------------------------------------------------------------------------
+// CWriteableJavaRegistryPackageEntry::EmbeddedEntryByNumberL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CWriteableJavaRegistryEntry*
+CWriteableJavaRegistryPackageEntry::
+EmbeddedEntryByNumberL(TInt aEntryNum) const
+{
+    JELOG2(EJavaStorage);
+
+    if (aEntryNum < 0)
+    {
+        User::Leave(KErrArgument);
+    }
+
+    wstring value = L"";
+    EntryAttributeValue(iEntry, ID, value);
+
+    JavaStorageApplicationList_t apps;
+    java::util::Uid uid(value);
+    SuiteEntries(uid, apps);
+
+    // aEntryNum is zero based whereas apps is one based.
+    if (aEntryNum >= apps.size())
+    {
+        return NULL;
+    }
+
+    JavaStorageApplicationList_t::const_iterator iter = apps.begin();
+
+    for (int i = 0; i < aEntryNum; i++)
+    {
+        ++iter;
+    }
+
+    value.clear();
+
+    EntryAttributeValue((*iter), ID, value);
+
+    java::util::Uid appUid(value);
+    JavaStorageApplicationEntry_t attributes;
+
+    StorageEntry(appUid, APPLICATION_TABLE, attributes);
+
+    if (attributes.size() == 0)
+    {
+        ELOG1WSTR(EJavaStorage,
+                  "No attributes for embedded entry: %s",
+                  appUid.toString());
+        return NULL;
+    }
+    else
+    {
+        return new CWriteableJavaRegistryEntry(attributes, EMidp2Midlet);
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CWriteableJavaRegistryPackageEntry::AttributeL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const MJavaAttribute* CWriteableJavaRegistryPackageEntry::
+AttributeL(const TDesC& aName) const
+{
+    JELOG2(EJavaStorage);
+    return CWriteableJavaRegistryEntry::AttributeL(aName);
+}
+
+// ---------------------------------------------------------------------------
+// CWriteableJavaRegistryPackageEntry::AttributesL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const RPointerArray<MJavaAttribute>&
+CWriteableJavaRegistryPackageEntry::AttributesL() const
+{
+    JELOG2(EJavaStorage);
+    return CWriteableJavaRegistryEntry::AttributesL();
+}
+
+// ---------------------------------------------------------------------------
+// CWriteableJavaRegistryPackageEntry::UsedUserDiskSpace
+// ---------------------------------------------------------------------------
+EXPORT_C TInt64 CWriteableJavaRegistryPackageEntry::UsedUserDiskSpace() const
+{
+    JELOG(EJavaStorage, "CJavaRegistryPackageEntry::UsedUserDiskSpace()");
+
+    wstring rootPath = L"";
+    EntryAttributeValue(iEntry, ROOT_PATH, rootPath);
+
+    auto_ptr<HBufC> suitePath(HBufC16::New(rootPath.size() + 1));
+
+    if (!suitePath.get())
+    {
+        ELOG(EJavaStorage, "Cannot allocate suite path.");
+        return 0;
+    }
+
+    TPtr16 suitePathPtr(suitePath->Des());
+    suitePathPtr = (const TUint16*)rootPath.c_str();
+
+    RJavaSizeHelpClient session;
+    TInt err = session.Connect();
+
+    TInt r = 0;
+
+    if (KErrNone == err)
+    {
+        r = session.GetUserUsedDiskSpace(suitePathPtr);
+        session.Close();
+    }
+    wstring jarPath = L"";
+    EntryAttributeValue(iEntry, JAR_PATH, jarPath);
+
+    wstring::size_type startIdx = 0;
+
+    if (jarPath.find(rootPath, startIdx) == string::npos)
+    {
+        // As ROOT_PATH is not parth of the JAR_PATH this application suite
+        // is preinstalled and its JAR size is added to ROOT_PATH count.
+        wstring value = L"";
+        EntryAttributeValue(iEntry, INITIAL_SIZE, value);
+        r += JavaCommonUtils::wstringToInt(value);
+    }
+    return r;
+}
+
+// ---------------------------------------------------------------------------
+// CWriteableJavaRegistryPackageEntry::IsPreinstalled
+// ---------------------------------------------------------------------------
+EXPORT_C TBool CWriteableJavaRegistryPackageEntry::IsPreinstalled() const
+{
+    JELOG2(EJavaStorage);
+    TBool isPreinstalled = EFalse;
+    wstring name = L"";
+    wstring vendor = L"";
+
+    EntryAttributeValue(iEntry, PACKAGE_NAME, name);
+    EntryAttributeValue(iEntry, VENDOR, vendor);
+
+    JavaStorageApplicationList_t apps;
+    JavaStorageApplicationEntry_t searchQuery;
+    JavaStorageEntry attr;
+    attr.setEntry(NAME, name);
+    searchQuery.insert(attr);
+    attr.setEntry(VENDOR, vendor);
+    searchQuery.insert(attr);
+
+    try
+    {
+        auto_ptr<JavaStorage> js(JavaStorage::createInstance());
+        js->open();
+        js->search(PREINSTALL_TABLE, searchQuery, apps);
+        js->close();
+        js.reset(0);
+    }
+    catch (JavaStorageException& jse)
+    {
+        ELOG1(EJavaStorage, "IsPreinstalled: Search failed: %s ",
+              jse.toString().c_str());
+    }
+    searchQuery.clear();
+
+    if (apps.size() > 0)
+    {
+        wstring installState = L"";
+        EntryAttributeValue(apps.front(), INSTALL_STATE, installState);
+
+        // INSTALL_STATE 1 indicates preinstallation.
+        if (installState == L"1")
+        {
+            isPreinstalled = ETrue;
+        }
+    }
+
+    return isPreinstalled;
+}
+
+// ---------------------------------------------------------------------------
+// CWriteableJavaRegistryPackageEntry::SuiteEntries
+// ---------------------------------------------------------------------------
+//
+void CWriteableJavaRegistryPackageEntry::SuiteEntries(
+    const java::util::Uid& aUid,
+    JavaStorageApplicationList_t& aApps) const
+{
+    JavaStorageApplicationEntry_t searchQuery;
+    JavaStorageEntry attr;
+    attr.setEntry(PACKAGE_ID, aUid.toString());
+    searchQuery.insert(attr);
+    attr.setEntry(ID, L"");
+    searchQuery.insert(attr);
+
+    try
+    {
+        auto_ptr<JavaStorage> js(JavaStorage::createInstance());
+        js->open();
+        js->search(APPLICATION_TABLE, searchQuery, aApps);
+        js->close();
+        js.reset(0);
+    }
+    catch (JavaStorageException& jse)
+    {
+        ELOG1(EJavaStorage, "Search failed: %s ",
+              jse.toString().c_str());
+    }
+    searchQuery.clear();
+}