javamanager/javasettings/appmngrplugin/src/appmngr2midletinfoiterator.cpp
branchRCL_3
changeset 66 2455ef1f5bbc
parent 19 04becd199f91
child 71 d5e927d5853b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javasettings/appmngrplugin/src/appmngr2midletinfoiterator.cpp	Wed Sep 01 12:33:18 2010 +0100
@@ -0,0 +1,579 @@
+/*
+* Copyright (c) 2002-2008 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:  Implementation of CAppMngr2MidletInfoIterator
+*
+*/
+
+
+#include <StringLoader.h>               // StringLoader
+#include <SWInstCommonUI.rsg>           // Resource IDs
+#include <javaapplicationsettings.rsg>           // Midlet resource IDs
+#include <AknUtils.h>                   // AknTextUtils
+#include <SWInstDefs.h>                 // KJadMimeType
+#include <appmngr2drmutils.h>           // TAppMngr2DRMUtils
+
+#include "appmngr2midletinfoiterator.h" // CAppMngr2MidletInfoIterator
+#include "appmngr2midletappinfo.h"      // CAppMngr2MidletAppInfo
+#include "appmngr2midletpackageinfo.h"  // CAppMngr2MidletPackageInfo
+#include "appmngr2midletmanifestreader.h"
+#include "appmngr2midletresourcehandler.h" // CAppMngr2MidletResourceHandler
+
+#include "logger.h"
+#include "securitystoragedatadefs.h"
+#include "s60commonutils.h"
+
+using namespace std;
+using namespace java::util;
+
+_LIT(KJava, "\x202AJava\x2122\x202C"); // Trade mark sign
+_LIT(KLRE, "\x202A"); // Bidirectional text control
+_LIT(KPDF, "\x202C"); // Bidirectional text control
+_LIT(KLeftParenthes, "(");
+_LIT(KListSeparatorAndSpace, ", ");
+
+/*void CleanUpResetAndDestroy(TAny *aArray)
+{
+    if (aArray)
+    {
+        RPointerArray<HBufC>* array=(RPointerArray<HBufC>*)aArray;
+        array->ResetAndDestroy();
+        array->Close();
+    }
+}*/
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletInfoIterator::NewL()
+// ---------------------------------------------------------------------------
+//
+CAppMngr2MidletInfoIterator* CAppMngr2MidletInfoIterator::NewL(
+    CAppMngr2InfoBase& aMidlet, TAppMngr2InfoType aInfoType, RFs& aFs, CAppMngr2MidletResourceHandler& aResourceHandler)
+{
+    LOG(EJavaAppMngrPlugin, EInfo, " + CAppMngr2MidletInfoIterator::NewL ");
+    CAppMngr2MidletInfoIterator* self =
+        new(ELeave) CAppMngr2MidletInfoIterator(aMidlet, aInfoType, aFs, aResourceHandler);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    LOG(EJavaAppMngrPlugin, EInfo, " - CAppMngr2MidletInfoIterator::NewL ");
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletInfoIterator::~CAppMngr2MidletInfoIterator()
+// ---------------------------------------------------------------------------
+//
+CAppMngr2MidletInfoIterator::~CAppMngr2MidletInfoIterator()
+{
+    LOG(EJavaAppMngrPlugin, EInfo, " CAppMngr2MidletInfoIterator::~CAppMngr2MidletInfoIterator ");
+    delete iInfoUrl;
+    iInfoUrl = NULL;
+    delete iUpdateUrl;
+    iUpdateUrl = NULL;
+}
+
+// ---------------------------------------------------------
+// CAppMngr2MidletInfoIterator::GetInfoUrlL()
+// ---------------------------------------------------------
+//
+const TDesC& CAppMngr2MidletInfoIterator::GetInfoUrlL()
+{
+    if (!iInfoUrl)
+    {
+        return KNullDesC;
+    }
+    return *iInfoUrl;
+}
+
+// ---------------------------------------------------------
+// CAppMngr2MidletInfoIterator::GetUpdateUrlL()
+// ---------------------------------------------------------
+//
+const TDesC& CAppMngr2MidletInfoIterator::GetUpdateUrlL()
+{
+    if (!iUpdateUrl)
+    {
+        return KNullDesC;
+    }
+    return *iUpdateUrl;
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletInfoIterator::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::ConstructL()
+{
+    LOG(EJavaAppMngrPlugin, EInfo, " CAppMngr2MidletInfoIterator::ConstructL ");
+    BaseConstructL();
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletInfoIterator::SetAllFieldsL()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetAllFieldsL()
+{
+    LOG(EJavaAppMngrPlugin, EInfo, " + CAppMngr2MidletInfoIterator::SetAllFieldsL ");
+    SetFieldL(R_SWCOMMON_DETAIL_NAME, iInfo.Name());
+
+    if (iInfoType == EAppMngr2StatusInstalled)
+    {
+        CAppMngr2MidletAppInfo* midletInfo =
+            reinterpret_cast<CAppMngr2MidletAppInfo*>(&iInfo);
+        SetInstalledAppsInfoL(*midletInfo);
+    }
+    else
+    {
+        CAppMngr2MidletPackageInfo* packageInfo =
+            reinterpret_cast<CAppMngr2MidletPackageInfo*>(&iInfo);
+        // Create at least base iterator
+        TRAP_IGNORE(SetNotInstalledAppsInfoL(*packageInfo));
+    }
+    LOG(EJavaAppMngrPlugin, EInfo, " - CAppMngr2MidletInfoIterator::SetAllFieldsL ");
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletInfoIterator::SetInstalledAppsInfoL()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetInstalledAppsInfoL(
+    CAppMngr2MidletAppInfo& aMidlet)
+{
+    LOG(EJavaAppMngrPlugin, EInfo, " + CAppMngr2MidletInfoIterator::SetInstalledAppsInfoL ");
+    //Version
+    SetVersionL(aMidlet.Version());
+    //Supplier
+    SetVendorNameL(aMidlet.Vendor());
+    //Status
+    SetStatusL();
+    //Memory
+    SetLocationL();
+    //Size
+    SetFieldL(R_SWCOMMON_DETAIL_APPSIZE, aMidlet.Details());
+    //Domain category
+    SetDomainL(aMidlet.SecurityDomainCategory(), aMidlet.SecurityDomainName());
+    //Technology
+    SetFieldL(R_SWCOMMON_DETAIL_TECHNOLOGY, KJava);
+    //Data size
+    SetDataL(aMidlet.DataSize());
+    //Info URL
+    SetInfoUrlL(aMidlet.InfoUrl());
+    //Content
+    SetContentL(aMidlet.Content());
+    // Permissions
+    SetPermissionsL(aMidlet.Permissions());
+    //Description
+    SetTypeL(aMidlet.Description());
+    // Update URL
+    SetUpdateUrlL(aMidlet.UpdateUrl());
+
+    LOG(EJavaAppMngrPlugin, EInfo, " - CAppMngr2MidletInfoIterator::SetInstalledAppsInfoL ");
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletInfoIterator::SetNotInstalledAppsInfoL()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetNotInstalledAppsInfoL(
+    CAppMngr2MidletPackageInfo& aPackage)
+{
+    LOG(EJavaAppMngrPlugin, EInfo, " + CAppMngr2MidletInfoIterator::SetNotInstalledAppsInfoL ");
+    TFileName protectedFileName = aPackage.ProtectedFileName();
+
+    if ((aPackage.IsDRMProtected()) &&
+            (TAppMngr2DRMUtils::IsDRMRightsObjectMissingL(protectedFileName)))
+    {
+        // Application DRM protected. Rights object is missing
+        return;
+    }
+
+    std::auto_ptr<AppMngr2MidletManifestReader>reader(
+        new AppMngr2MidletManifestReader(iFs));
+
+    RPointerArray<MJavaAttribute> attributes;
+
+    reader->ReadManifestL(aPackage.FileName(), attributes);
+
+    if (attributes.Count() == 0)
+    {
+        // no midlet suite attributes
+        return;
+    }
+
+    // Version
+    _LIT(KMIDletVersion, "MIDlet-Version");
+    TInt index = AttributeValueIndex(attributes, KMIDletVersion);
+    if (KErrNotFound != index)
+    {
+        SetVersionL(attributes[index]->Value());
+    }
+    //Status
+    SetStatusL();
+    //Memory
+    SetLocationL();
+    //Size
+    SetFieldL(R_SWCOMMON_DETAIL_APPSIZE, aPackage.Details());
+    //Data, we do not show, if package is not installed
+    //Technology
+    SetFieldL(R_SWCOMMON_DETAIL_TECHNOLOGY, KJava);
+
+    //Description
+    _LIT(KMIDletDescription, "MIDlet-Description");
+    index = AttributeValueIndex(attributes, KMIDletDescription);
+    if (KErrNotFound != index)
+    {
+        SetTypeL(attributes[index]->Value());
+    }
+
+    //URL
+    _LIT(KMIDletInfoURL, "MIDlet-Info-URL");
+    index = AttributeValueIndex(attributes, KMIDletInfoURL);
+    if (KErrNotFound != index)
+    {
+        SetInfoUrlL(attributes[index]->Value());
+    }
+
+    //Required permissions, we do not show, if package is not installed
+    //Domain category, we do not show, if package is not installed
+    //Content
+    SetContentL(attributes);
+
+    //CleanupStack::PopAndDestroy(); //suiteAttributes host
+    //attributes.ResetAndDestroy();
+    //CleanupStack::PopAndDestroy(&attributes);
+    attributes.ResetAndDestroy();
+
+
+    LOG(EJavaAppMngrPlugin, EInfo, " - CAppMngr2MidletInfoIterator::SetNotInstalledAppsInfoL ");
+}
+
+
+// ---------------------------------------------------------
+// CAppMngr2MidletInfoIterator::SetStatusL()
+// ---------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetStatusL()
+{
+    HBufC* status = NULL;
+    TInt resourceOffset = iResourceHandler.AddResourceFileL();
+    if (iInfoType == EAppMngr2StatusInstalled)
+    {
+        status = StringLoader::LoadLC(R_SWCOMMON_DETAIL_VALUE_INSTALLED);
+    }
+    else  // iInfoType is EAppMngr2StatusNotInstalled
+    {
+        CAppMngr2MidletPackageInfo* pckg
+        = static_cast<CAppMngr2MidletPackageInfo*>(&iInfo); // Not own
+        if (pckg->JadFileName() != KNullDesC()
+                && pckg->JarFileName() == KNullDesC())
+        {
+            status = StringLoader::LoadLC(R_JAVA_INFO_STAT_NOT_LOADED);
+        }
+        else
+        {
+            status = StringLoader::LoadLC(
+                         R_SWCOMMON_DETAIL_VALUE_NOT_INSTALLED);
+        }
+    }
+    if (resourceOffset > 0)
+    {
+        iResourceHandler.DeleteResourceFile(resourceOffset);
+    }
+    SetFieldL(R_SWCOMMON_DETAIL_STATUS, *status);
+    CleanupStack::PopAndDestroy(status);
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletInfoIterator::CAppMngr2MidletInfoIterator()
+// ---------------------------------------------------------------------------
+//
+CAppMngr2MidletInfoIterator::CAppMngr2MidletInfoIterator(
+    CAppMngr2InfoBase& aMidlet, TAppMngr2InfoType aInfoType, RFs& aFs, CAppMngr2MidletResourceHandler& aResourceHandler) :
+        CAppMngr2InfoIterator(aMidlet, aInfoType), iFs(aFs), iResourceHandler(aResourceHandler)
+{
+    LOG(EJavaAppMngrPlugin, EInfo, " CAppMngr2MidletInfoIterator::CAppMngr2MidletInfoIterator ");
+}
+
+// ---------------------------------------------------------
+// CAppMngr2MidletInfoIterator::SetVersionL()
+// ---------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetVersionL(const TDesC& aVersion)
+{
+    HBufC* version = aVersion.AllocLC();
+    TPtr ptrVersion = version->Des();
+    AknTextUtils::DisplayTextLanguageSpecificNumberConversion(ptrVersion);
+    HBufC* tmpBuf = HBufC::NewLC(
+                        KLRE().Length() + version->Length() + KPDF().Length());
+
+    TInt position = version->Find(KLeftParenthes());
+    if (position >= 0)
+    {
+        // Add bidirectional text control
+        tmpBuf->Des() = version->Mid(0, position);
+        tmpBuf->Des() += KLRE();
+        tmpBuf->Des() += version->Mid(position, version->Length() - position);
+        tmpBuf->Des() += KPDF();
+    }
+    else
+    {
+        tmpBuf->Des() = *version;
+    }
+
+    SetFieldL(R_SWCOMMON_DETAIL_VERSION, *tmpBuf);
+    CleanupStack::PopAndDestroy(tmpBuf);
+    CleanupStack::PopAndDestroy(version);
+}
+
+// ---------------------------------------------------------
+// CAppMngr2MidletInfoIterator::SetVendorNameL()
+// ---------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetVendorNameL(const TDesC& aVendor)
+{
+    //Set vendor
+    HBufC* vendor = NULL;
+    if (aVendor.Length() > 0)
+    {
+        vendor = aVendor.AllocL();
+    }
+    else
+    {
+        vendor = StringLoader::LoadL(R_SWCOMMON_DETAIL_VALUE_UNKNOWN_SUPPLIER);
+    }
+    CleanupStack::PushL(vendor);
+    SetFieldL(R_SWCOMMON_DETAIL_SUPPLIER, *vendor);
+    CleanupStack::PopAndDestroy(vendor);
+}
+
+// ---------------------------------------------------------
+// CAppMngr2MidletInfoIterator::SetDomainL()
+// ---------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetDomainL(const std::wstring aSecurityDomainCategory, const std::wstring /*aSecurityDomainName*/)
+{
+    HBufC* domainString = NULL;
+    if (aSecurityDomainCategory == UNIDENTIFIED_THIRD_PARTY_DOMAIN_CATEGORY)
+    {
+        domainString = StringLoader::LoadLC(R_SWCOMMON_DETAIL_VALUE_UNT_3RD_PARTY);
+    }
+    else if (aSecurityDomainCategory == IDENTIFIED_THIRD_PARTY_DOMAIN_CATEGORY)
+    {
+        domainString = StringLoader::LoadLC(R_SWCOMMON_DETAIL_VALUE_3RD_PARTY);
+    }
+    else if (aSecurityDomainCategory == OPERATOR_DOMAIN_CATEGORY)
+    {
+        domainString = StringLoader::LoadLC(R_SWCOMMON_DETAIL_VALUE_OPERATOR);
+    }
+    else if (aSecurityDomainCategory == MANUFACTURER_DOMAIN_CATEGORY)
+    {
+        domainString = StringLoader::LoadLC(R_SWCOMMON_DETAIL_VALUE_MANUFACTURER);
+    }
+    else
+    {
+        domainString = S60CommonUtils::wstringToDes(aSecurityDomainCategory.c_str());
+        CleanupStack::PushL(domainString);
+    }
+    SetFieldL(R_SWCOMMON_DETAIL_DOMAIN, *domainString);
+    CleanupStack::PopAndDestroy(domainString);
+}
+
+// CAppMngr2MidletInfoIterator::SetDataL()
+// -----------------------------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetDataL(const TDesC& aDataSize)
+{
+    if (aDataSize != KNullDesC)
+    {
+        TLex numLexer(aDataSize);
+        TInt32 id(0);
+        User::LeaveIfError(numLexer.Val(id));
+        HBufC* data = StringLoader::LoadLC(R_SWCOMMON_DETAIL_VALUE_SIZE,
+                                           id / 1024);
+        SetFieldL(R_SWCOMMON_DETAIL_DATASIZE, *data);
+        CleanupStack::PopAndDestroy(data);
+    }
+    else
+    {
+        HBufC* unknow = StringLoader::LoadLC(
+                            R_SWCOMMON_DETAIL_VALUE_UNKNOWN_DATA);
+        SetFieldL(R_SWCOMMON_DETAIL_DATASIZE, *unknow);
+        CleanupStack::PopAndDestroy(unknow);
+    }
+}
+
+// ---------------------------------------------------------
+// CAppMngr2MidletInfoIterator::SetInfoUrlL()
+// ---------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetInfoUrlL(const TDesC& aInfoUrl)
+{
+    if (aInfoUrl.Length() > 0)
+    {
+        SetFieldL(R_SWCOMMON_DETAIL_INFO_URL, aInfoUrl);
+        if (iInfoUrl)
+        {
+            delete iInfoUrl;
+            iInfoUrl = NULL;
+        }
+        iInfoUrl = aInfoUrl.AllocL();
+    }
+    else
+    {
+        HBufC* unknow = StringLoader::LoadLC(
+                            R_SWCOMMON_DETAIL_VALUE_UNKNOWN_URL);
+        SetFieldL(R_SWCOMMON_DETAIL_INFO_URL, *unknow);
+        CleanupStack::PopAndDestroy(unknow);
+    }
+}
+
+// ---------------------------------------------------------
+// CAppMngr2MidletInfoIterator::SetUpdateUrlL()
+// ---------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetUpdateUrlL(const TDesC& aUpdateUrl)
+{
+    delete iUpdateUrl;
+    iUpdateUrl = NULL;
+    iUpdateUrl = aUpdateUrl.AllocL();
+}
+
+// ---------------------------------------------------------
+// CAppMngr2MidletInfoIterator::SetContentL()
+// ---------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetContentL(const TDesC& aContent)
+{
+    SetFieldL(R_SWCOMMON_DETAIL_CONTENT, aContent);
+}
+
+// ---------------------------------------------------------
+// CAppMngr2MidletInfoIterator::SetPermisisonsL()
+// ---------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetPermissionsL(const TDesC& aPermissions)
+{
+    if (aPermissions.Length() > 0)
+    {
+        SetFieldL(R_SWCOMMON_DETAIL_PERMISSIONS, aPermissions);
+    }
+}
+
+// ---------------------------------------------------------
+// CAppMngr2MidletInfoIterator::SetContentL()
+// ---------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetContentL(
+    const RPointerArray<Java::MJavaAttribute>& aAttributes)
+{
+    // Read MIdlet-x attributes until not found.
+    _LIT(KMIDletIndexPrefix, "MIDlet-%d");
+    _LIT(KColon, ",");
+
+    TInt index = KErrNone;
+    TInt midletIndex = 1;
+
+    // Read all MIDlet names belogning to the suite.
+    HBufC16* names = NULL;
+
+    while (index != KErrNotFound)
+    {
+        TBuf16<15> midletAttrName;
+        midletAttrName.Format(KMIDletIndexPrefix, midletIndex);
+        index = AttributeValueIndex(aAttributes, midletAttrName);
+
+        if (KErrNotFound != index)
+        {
+            std::auto_ptr<HBufC16>midletName(
+                aAttributes[index]->Value().AllocL());
+            TPtrC16 midletNamePtr(midletName->Des());
+
+            TInt delimIndex = midletNamePtr.Find(KColon);
+
+            if (KErrNotFound != delimIndex)
+            {
+                // Use only name.
+                TPtrC16 onlyName = midletNamePtr.Left(delimIndex);
+
+                //if (firstRound)
+                if (names == NULL || names->Des() == KNullDesC)
+                {
+                    // Append MIDlet name to names.
+                    names = HBufC16::NewL(onlyName.Length());
+                    TPtr namesPtr(names->Des());
+                    namesPtr.Append(onlyName);
+                    CleanupStack::PushL(names);
+                }
+                else
+                {
+                    // Append MIDlet name to names.
+                    HBufC16* tmp = HBufC16::NewL(names->Length()
+                                                 + KListSeparatorAndSpace().Length()
+                                                 + onlyName.Length());
+                    TPtr tmpPtr(tmp->Des());
+                    tmpPtr.Copy(*names);
+                    tmpPtr.Append(KListSeparatorAndSpace);
+                    tmpPtr.Append(onlyName);
+                    CleanupStack::PopAndDestroy(names);
+                    names = tmp;
+                    CleanupStack::PushL(names);
+                }
+            }
+            midletIndex++;
+        }
+    }
+    SetContentL(*names);
+    CleanupStack::PopAndDestroy(names);
+}
+
+// ---------------------------------------------------------
+// CAppMngr2MidletInfoIterator::SetTypeL()
+// ---------------------------------------------------------
+//
+void CAppMngr2MidletInfoIterator::SetTypeL(const TDesC& aDescription)
+{
+    if (aDescription.Length() > 0)
+    {
+        SetFieldL(R_SWCOMMON_DETAIL_TYPE, aDescription);
+    }
+    else
+    {
+        HBufC* unknow = StringLoader::LoadLC(
+                            R_SWCOMMON_DETAIL_VALUE_UNKNOWN_TYPE);
+        SetFieldL(R_SWCOMMON_DETAIL_TYPE, *unknow);
+        CleanupStack::PopAndDestroy(unknow);
+    }
+}
+
+// ---------------------------------------------------------
+// CAppMngr2MidletInfoIterator::AttributeValueIndex()
+// ---------------------------------------------------------
+//
+TInt CAppMngr2MidletInfoIterator::AttributeValueIndex(
+    const RPointerArray<MJavaAttribute>& aAttrs, const TDesC& aName)
+{
+    TInt index = KErrNotFound;
+    for (TInt i = 0; i < aAttrs.Count(); i++)
+    {
+        if (aAttrs[i]->Name() == aName)
+        {
+            index = i;
+            break;
+        }
+    }
+    return index;
+}