javamanager/javasettings/appmngrplugin/src/appmngr2midletpckginfofactory.cpp
branchRCL_3
changeset 14 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javasettings/appmngrplugin/src/appmngr2midletpckginfofactory.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,380 @@
+/*
+* Copyright (c) 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:  MidletPackageInfo Factory implementation
+*
+*/
+
+
+#include <caf/caf.h>                         // ContentAccess::CContent
+
+#include "appmngr2midletpckginfofactory.h"   // CAppMngr2MidletPakageInfoFactory
+#include "appmngr2midletpackageinfo.h"       // CAppMngr2MidletPackageInfo
+#include "appmngr2recognizedfile.h"          // CAppMngr2RecognizedFile
+#include "appmngr2midletresourcehandler.h" // CAppMngr2MidletResourceHandler
+
+#include "logger.h"                          // LOG
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletPackageInfo::NewL()
+// ---------------------------------------------------------------------------
+//
+CAppMngr2MidletPckgInfoFactory* CAppMngr2MidletPckgInfoFactory::NewL(
+    CAppMngr2Runtime& aRuntime, RFs& aFs, CAppMngr2MidletResourceHandler& aResourceHandler)
+{
+    LOG(EJavaAppMngrPlugin, EInfo, "+ CAppMngr2MidletPckgInfoFactory::NewL ");
+    CAppMngr2MidletPckgInfoFactory* self
+    = new(ELeave) CAppMngr2MidletPckgInfoFactory(aRuntime, aFs, aResourceHandler);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    LOG(EJavaAppMngrPlugin, EInfo, "- CAppMngr2MidletPckgInfoFactory::NewL ");
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletPckgInfoFactory::~CAppMngr2MidletPckgInfoFactory()
+// ---------------------------------------------------------------------------
+//
+CAppMngr2MidletPckgInfoFactory::~CAppMngr2MidletPckgInfoFactory()
+{
+    LOG(EJavaAppMngrPlugin, EInfo, "CAppMngr2MidletPckgInfoFactory::~CAppMngr2MidletPckgInfoFactory ");
+    Cancel();
+    delete iMatcher;
+    iMatcher = NULL;
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletPckgInfoFactory::GetInstallationFilesL()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2MidletPckgInfoFactory::GetInstallationFilesL(
+    RPointerArray<CAppMngr2PackageInfo>& aPackageInfos,
+    const RPointerArray<CAppMngr2RecognizedFile>& aFileList,
+    TRequestStatus& aStatus)
+{
+    LOG(EJavaAppMngrPlugin, EInfo, "+ CAppMngr2MidletPckgInfoFactory::GetInstallationFilesL ");
+
+    if (IsActive())
+    {
+        User::Leave(KErrInUse);
+    }
+
+    iCounter = 0;
+    iState = ENextPckg;
+    iPackageInfos = &aPackageInfos;
+    iFileList = &aFileList;
+    iExtStatus = &aStatus;
+    *iExtStatus = KRequestPending;
+    LOG(EJavaAppMngrPlugin, EInfo, "CAppMngr2MidletPckgInfoFactory::GetInstallationFilesL:SetActive()");
+    SetActive();
+    CompleteRequest(iStatus, KErrNone);
+
+    LOG(EJavaAppMngrPlugin, EInfo, "- CAppMngr2MidletPckgInfoFactory::GetInstallationFilesL ");
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletPckgInfoFactory::RunL()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2MidletPckgInfoFactory::RunL()
+{
+    LOG1(EJavaAppMngrPlugin, EInfo, "+ CAppMngr2MidletPckgInfoFactory::RunL, iState: %d ", iState);
+
+    CAppMngr2PackageInfo* packageInfo = NULL;
+
+    switch (iState)
+    {
+    case ENextPckg :
+    {
+        if (iCounter < iFileList->Count())
+        {
+            LOG1(EJavaAppMngrPlugin, EInfo, "CAppMngr2MidletPckgInfoFactory::RunL:ENextPckg: iCounter = %d", iCounter);
+
+            // skip processing if this files was already matched
+            TBool found(EFalse);
+            CAppMngr2RecognizedFile* recognized = (*iFileList)[iCounter]; // not owned
+            for (TInt i(0); i < iPackageInfos->Count(); i++)
+            {
+                CAppMngr2MidletPackageInfo* package
+                = static_cast<CAppMngr2MidletPackageInfo*>((*iPackageInfos)[i]); // not owned
+
+                if ((recognized->FileName() == package->JadFileName())
+                        || (recognized->FileName() == package->JarFileName()))
+                {
+                    found = ETrue;
+                    break;
+                }
+            }
+
+            if (found)
+            {
+                // Continue with next file
+                iCounter++;
+                iState = ENextPckg;
+                CompleteRequest(iStatus, KErrNone);
+            }
+            else
+            {
+                // Get installation file
+                // Counter must be incremented before leave
+                TInt index = iCounter;
+                iCounter++;
+                GetInstallationFileL((*iFileList)[index]->FileName(),
+                                     (*iFileList)[index]->DataType());
+                // GetInstallationFileL() changes iState
+            }
+
+            LOG(EJavaAppMngrPlugin, EInfo, "CAppMngr2MidletPckgInfoFactory::RunL:ENextPckg:SetActive()");
+            SetActive();
+        }
+        else
+        {
+            // File name list has been processed
+            // Let's complete GetInstallationFilesL
+            User::RequestComplete(iExtStatus, KErrNone);
+        }
+        break;
+    }
+    case EMatchedJar :
+    {
+        if (iJadFile.Length() == 0)
+        {
+            // Standalone JAR
+            iJadFile = KNullDesC;
+        }
+        iState = EAppendPckg; // Next state
+        LOG(EJavaAppMngrPlugin, EInfo, "CAppMngr2MidletPckgInfoFactory::RunL:EMatchedJar:SetActive()");
+        SetActive();
+        CompleteRequest(iStatus, KErrNone);
+        break;
+    }
+    case EMatchedJad :
+    {
+        if (iJarFile.Length() == 0)
+        {
+            // Standalone JAD
+            iJarFile = KNullDesC;
+        }
+        iState = EAppendPckg; // Next state
+        LOG(EJavaAppMngrPlugin, EInfo, "CAppMngr2MidletPckgInfoFactory::RunL:EMatchedJad:SetActive()");
+        SetActive();
+        CompleteRequest(iStatus, KErrNone);
+        break;
+    }
+    case EAppendPckg :
+    {
+        packageInfo = CAppMngr2MidletPackageInfo::NewL(
+                          iRuntime, iJadFile, iJarFile, iFs, iResourceHandler);
+        CleanupStack::PushL(packageInfo);
+        iPackageInfos->AppendL(packageInfo);
+
+        CleanupStack::Pop(packageInfo);
+        iState = ENextPckg; // Next state
+        LOG(EJavaAppMngrPlugin, EInfo, "CAppMngr2MidletPckgInfoFactory::RunL:EAppendPckg:SetActive()");
+        SetActive();
+        CompleteRequest(iStatus, KErrNone);
+        break;
+    }
+    default :
+    {
+        LOG1(EJavaAppMngrPlugin, EInfo, " Incorrect state, iCounter = %d", iCounter);
+
+        User::RequestComplete(iExtStatus, KErrGeneral);
+        break;
+    }
+    }
+
+    LOG(EJavaAppMngrPlugin, EInfo, "- CAppMngr2MidletPckgInfoFactory::RunL ");
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletPckgInfoFactory::DoCancel()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2MidletPckgInfoFactory::DoCancel()
+{
+    LOG(EJavaAppMngrPlugin, EInfo, "CAppMngr2MidletPckgInfoFactory::DoCancel ");
+    CancelMatching();
+    if (iExtStatus->Int() == KRequestPending)
+    {
+        User::RequestComplete(iExtStatus, KErrCancel);
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletPckgInfoFactory::RunError()
+// ---------------------------------------------------------------------------
+//
+TInt CAppMngr2MidletPckgInfoFactory::RunError(TInt /*aError*/)
+{
+    LOG(EJavaAppMngrPlugin, EInfo, "CAppMngr2MidletPckgInfoFactory::RunError ");
+    // Creation of pckg info fails continue with next one
+    iState = ENextPckg; // Next state
+    LOG(EJavaAppMngrPlugin, EInfo, "CAppMngr2MidletPckgInfoFactory::RunError:SetActive()");
+    SetActive();
+    CompleteRequest(iStatus, KErrGeneral);
+    return KErrNone;
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletPckgInfoFactory::GetInstallationFileL()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2MidletPckgInfoFactory
+::GetInstallationFileL(const TDesC& aFileName, const TDataType& aDataType)
+
+{
+    LOG(EJavaAppMngrPlugin, EInfo, "+ CAppMngr2MidletPckgInfoFactory::GetInstallationFileL ");
+
+    TInt err(KErrNone);
+    iJadFile.Zero();
+    iJarFile.Zero();
+
+    // Check MIME type
+    TPtrC8 mimePtr8(aDataType.Des8());
+    if (mimePtr8 == SwiUI::KJarMIMEType)
+    {
+        // JAR
+        iJarFile = aFileName;
+        // Matching JAR's JAD. MatchL is internally asynchronous
+        TRAP(err, MatchL(iJarFile, SwiUI::KJarMIMEType, iJadFile, iStatus));
+
+        if (err != KErrNone)
+        {
+            // Corrupted JAR, allow to create standalone package
+            CancelMatching();
+            iState = EAppendPckg; // Next state
+            CompleteRequest(iStatus, KErrNone);
+        }
+        iState = EMatchedJar; // Next state
+    }
+    else if (mimePtr8 == SwiUI::KJadMIMEType)
+    {
+        // JAD
+        iJadFile = aFileName;
+        // Matching JAD's JAR. MatchL is internally asynchronous
+        TRAP(err, MatchL(iJadFile, SwiUI::KJadMIMEType, iJarFile, iStatus));
+
+        if (err != KErrNone)
+        {
+            // Corrupted JAD, allow to create standalone package
+            CancelMatching();
+            iState = EAppendPckg; // Next state
+            CompleteRequest(iStatus, KErrNone);
+        }
+        iState = EMatchedJad; // Next state
+    }
+    else
+    {
+        // File name is not recognized
+        User::Leave(KErrGeneral);
+    }
+
+    LOG(EJavaAppMngrPlugin, EInfo, "- CAppMngr2MidletPckgInfoFactory::GetInstallationFileL ");
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletPckgInfoFactory::CAppMngr2MidletPckgInfoFactory()
+// ---------------------------------------------------------------------------
+//
+CAppMngr2MidletPckgInfoFactory
+::CAppMngr2MidletPckgInfoFactory(CAppMngr2Runtime& aRuntime, RFs& aFs, CAppMngr2MidletResourceHandler& aResourceHandler) :
+        CActive(CActive::EPriorityStandard), iFs(aFs), iRuntime(aRuntime), iResourceHandler(aResourceHandler)
+{
+    LOG(EJavaAppMngrPlugin, EInfo, "CAppMngr2MidletPckgInfoFactory::CAppMngr2MidletPckgInfoFactory ");
+    CActiveScheduler::Add(this);
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletPckgInfoFactory::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2MidletPckgInfoFactory::ConstructL()
+{
+    LOG(EJavaAppMngrPlugin, EInfo, "CAppMngr2MidletPckgInfoFactory::ConstructL ");
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletPckgInfoFactory::CompleteRequest()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2MidletPckgInfoFactory::CompleteRequest(TRequestStatus& aRequestStatus,
+        TInt aStatus)
+{
+    LOG(EJavaAppMngrPlugin, EInfo, "CAppMngr2MidletPckgInfoFactory::CompleteRequest ");
+    TRequestStatus* status = &aRequestStatus;
+    User::RequestComplete(status, aStatus);
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletPckgInfoFactory::MatchL()
+// -----------------------------------------------------------------------------
+//
+void CAppMngr2MidletPckgInfoFactory::MatchL(const TDesC& aMatchingFileName,
+        const TDesC8& aMatchingMimeType,
+        TDes& aMatchedFileName,
+        TRequestStatus &aStatus)
+{
+    LOG(EJavaAppMngrPlugin, EInfo, " + CAppMngr2MidletPckgInfoFactory::MatchL ");
+    TParse parser;
+    User::LeaveIfError(parser.Set(aMatchingFileName, NULL, NULL));
+
+    if (!iMatcher)
+    {
+        iMatcher = CJcfJadJarMatcher::NewL(this, iFs);
+    }
+
+    if (aMatchingMimeType == SwiUI::KJarMIMEType)
+    {
+        iMatcher->MatchJadL(
+            aMatchingFileName, parser.DriveAndPath(), &aMatchedFileName);
+    }
+    else if (aMatchingMimeType == SwiUI::KJadMIMEType)
+    {
+        iMatcher->MatchJarL(
+            aMatchingFileName, parser.DriveAndPath(), &aMatchedFileName);
+    }
+    else
+    {
+        User::Leave(KErrGeneral);
+    }
+
+    aStatus = KRequestPending;
+    LOG(EJavaAppMngrPlugin, EInfo, " - CAppMngr2MidletPckgInfoFactory::MatchL ");
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletPckgInfoFactory::CancelMathing()
+// -----------------------------------------------------------------------------
+//
+void CAppMngr2MidletPckgInfoFactory::CancelMatching()
+{
+    LOG(EJavaAppMngrPlugin, EInfo, " + CAppMngr2MidletPckgInfoFactory::CancelMatching ");
+    delete iMatcher;
+    iMatcher = NULL;
+    LOG(EJavaAppMngrPlugin, EInfo, " - CAppMngr2MidletPckgInfoFactory::CancelMatching ");
+}
+
+// ---------------------------------------------------------------------------
+// CAppMngr2MidletPckgInfoFactory::Update()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2MidletPckgInfoFactory::Update(TInt aArg1)
+{
+    LOG(EJavaAppMngrPlugin, EInfo, " CAppMngr2MidletPckgInfoFactory::UpdateL ");
+    CompleteRequest(iStatus, aArg1);
+}