javamanager/javainstaller/installer/src.s60/jadjarmatcher/jadjarmatcherscanfrominbox.cpp
branchRCL_3
changeset 19 04becd199f91
child 50 023eef975703
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javainstaller/installer/src.s60/jadjarmatcher/jadjarmatcherscanfrominbox.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,514 @@
+/*
+* Copyright (c) 2008-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:  This class is used to find matching JAR file in
+/                the Inbox. This class is derived from CActive.
+*
+*/
+
+
+#include <cmsvattachment.h>
+#include <cmsvmimeheaders.h>
+#include <e32std.h>
+#include <miutset.h>
+#include <mmsvattachmentmanager.h>
+#include <msvids.h>
+
+#include "jadjarmatcherscanfrominbox.h"
+#include "javacommonutils.h"
+#include "logger.h"
+
+namespace java
+{
+
+_LIT(KJadExt, ".jad");
+_LIT(KJarExt, ".jar");
+_LIT(KDcfExt, ".dcf");
+_LIT(KDmExt, ".dm");
+_LIT8(KJadMimeType, "text");
+_LIT8(KJadMimeSubType, "vnd.sun.j2me.app-descriptor");
+_LIT8(KJarMimeType, "application");
+_LIT8(KJarMimeSubType1, "java-archive");
+_LIT8(KJarMimeSubType2, "java");
+_LIT8(KJarMimeSubType3, "x-java-archive");
+const TInt KExtLength = 4;
+
+
+// ---------------------------------------------------------------------------
+//    To construct new CJadJarMatcherScanJarFilesFromInbox.
+// -----------------------------------------------------------------------------
+CJadJarMatcherScanFromInbox::CJadJarMatcherScanFromInbox()
+{
+}
+
+
+// ---------------------------------------------------------------------------
+//    To destruct CJadJarMatcherScanJarFilesFromInbox. Cancel
+//    any outstanding request. Delete all C-objects owned by this object.
+// -----------------------------------------------------------------------------
+CJadJarMatcherScanFromInbox::~CJadJarMatcherScanFromInbox()
+{
+    Cleanup();
+}
+
+
+// ---------------------------------------------------------------------------
+//  To execute Inbox scan. This method starts long running task,
+//  which seeks Jad/Jar files from Inbox.
+// -----------------------------------------------------------------------------
+void CJadJarMatcherScanFromInbox::ScanFromInboxL(
+    HBufC16* aStartFilename, RArray<RFile>& aResultArray, TBool aJarScan)
+{
+    JELOG(EJavaInstaller, "CJadJarMatcherScanFromInbox::ScanFromInboxL()");
+    Cleanup();
+    if (aJarScan)
+    {
+        LOG1WSTR(EJavaInstaller, EInfo, "Inbox Jar scan started for %s",
+                 (wchar_t *)(aStartFilename->Des().PtrZ()));
+    }
+    else
+    {
+        LOG1WSTR(EJavaInstaller, EInfo, "Inbox Jad scan started for %s",
+                 (wchar_t *)(aStartFilename->Des().PtrZ()));
+    }
+
+    // Setup ActiveScheduler, CMsvSession needs it.
+    CActiveScheduler* scheduler = NULL;
+    if (NULL == CActiveScheduler::Current())
+    {
+        // Must create active scheduler for this JNI thread
+        scheduler = new(ELeave) CActiveScheduler();
+        CActiveScheduler::Install(scheduler);
+    }
+    CleanupStack::PushL(scheduler);
+
+    // Open CMsvSession and search through Inbox.
+    iSession = CMsvSession::OpenSyncL(*this);
+    LOG(EJavaInstaller, EInfo, "CMsvSession opened");
+    RArray<TMsvId> rootEntryArray;
+    CleanupClosePushL(rootEntryArray);
+    SeekRootEntriesL(rootEntryArray);
+    LOG1(EJavaInstaller, EInfo, "Number of root entries: %d", rootEntryArray.Count());
+    RArray<TMsvId> entryArray;
+    CleanupClosePushL(entryArray);
+    for (TInt rootIndex = 0; rootIndex < rootEntryArray.Count(); rootIndex++)
+    {
+        SeekEntriesL(rootEntryArray[rootIndex], entryArray);
+        LOG1(EJavaInstaller, EInfo, "Number of entries: %d", entryArray.Count());
+    }
+    InitAttachmentScan();
+    RFile startAtta; // RFile for aStartFilename
+    TBool startAttaFound = EFalse;
+    for (TInt entryIndex = 0; entryIndex < entryArray.Count(); entryIndex++)
+    {
+        TInt attaCount = 0;
+        TRAPD(err, attaCount = OpenAttachmentManagerL(entryArray[entryIndex]));
+        if (KErrNone == err)
+        {
+            LOG1(EJavaInstaller, EInfo, "Number of attachments: %d", attaCount);
+            for (TInt attaIndex = 0; attaIndex < attaCount; attaIndex++)
+            {
+                CMsvAttachment* attaInfo = NULL;
+                TRAP(err, attaInfo = iAttaMan->GetAttachmentInfoL(attaIndex));
+                if (KErrNone == err && !startAttaFound)
+                {
+                    if (attaInfo->FilePath().CompareF(aStartFilename->Des()) == 0)
+                    {
+                        TRAP(err, startAtta =
+                                 iAttaMan->GetAttachmentFileL(attaInfo->Id()));
+                        if (KErrNone == err)
+                        {
+                            startAttaFound = ETrue;
+                        }
+                    }
+                }
+                if (KErrNone == err)
+                {
+                    if (aJarScan)
+                    {
+                        if (CMsvAttachment::EMsvMessageEntry != attaInfo->Type() &&
+                                IsAttachmentPossibleJarFileL(*attaInfo))
+                        {
+                            RFile atta;
+                            TRAP(err, atta = iAttaMan->GetAttachmentFileL(attaInfo->Id()));
+                            if (KErrNone == err)
+                            {
+                                aResultArray.Insert(atta, 0);
+                            }
+                        }
+                    }
+                    else
+                    {
+                        if (CMsvAttachment::EMsvMessageEntry != attaInfo->Type() &&
+                                IsAttachmentPossibleJadFileL(*attaInfo))
+                        {
+                            RFile atta;
+                            TRAP(err, atta = iAttaMan->GetAttachmentFileL(attaInfo->Id()));
+                            if (KErrNone == err)
+                            {
+                                aResultArray.Insert(atta, 0);
+                            }
+                        }
+                    }
+                    delete attaInfo;
+                }
+            }
+        }
+    }
+
+    if (startAttaFound)
+    {
+        LOG(EJavaInstaller, EInfo, "Found handle for startFilename");
+        aResultArray.Insert(startAtta, 0);
+    }
+    else
+    {
+        ELOG(EJavaInstaller, "Inbox scan did not find startFilename");
+        User::Leave(KErrPathNotFound);
+    }
+
+    CleanupStack::PopAndDestroy(&entryArray);
+    CleanupStack::PopAndDestroy(&rootEntryArray);
+    Cleanup();
+    LOG(EJavaInstaller, EInfo, "End of Inbox scan");
+
+    CleanupStack::PopAndDestroy(scheduler);
+}
+
+
+// ---------------------------------------------------------------------------
+//    To seek root entries.
+// -----------------------------------------------------------------------------
+void CJadJarMatcherScanFromInbox::SeekRootEntriesL(RArray<TMsvId>& aRootEntryArray)
+{
+    JELOG(EJavaInstaller, "CJadJarMatcherScanFromInbox::SeekRootEntriesL()");
+
+    CMsvEntry* entry = iSession->GetEntryL(KMsvRootIndexEntryIdValue);
+    CleanupStack::PushL(entry);
+
+    const TInt count = entry->Count();
+
+    // Check mail-boxes.
+    for (TInt loop = 0; loop < count; loop++)
+    {
+        if ((*entry)[loop].iType.iUid == KUidMsvServiceEntryValue)
+        {
+            TMsvEntry index = (*entry)[loop];
+            if (KUidMsgTypePOP3 == index.iMtm || KUidMsgTypeIMAP4 == index.iMtm)
+            {
+                aRootEntryArray.Insert((*entry)[loop].Id(), 0);
+            }
+        }
+    }
+
+    CleanupStack::PopAndDestroy(entry);
+
+    aRootEntryArray.Insert(KMsvGlobalInBoxIndexEntryId, 0);
+}
+
+
+// ---------------------------------------------------------------------------
+//    To seek entries recursively.
+// -----------------------------------------------------------------------------
+void CJadJarMatcherScanFromInbox::SeekEntriesL(TMsvId aId, RArray<TMsvId>& aEntryArray)
+{
+    JELOG(EJavaInstaller, "CJadJarMatcherScanFromInbox::SeekEntriesL()");
+    LOG1(EJavaInstaller, EInfo, "Entry Id: %d", aId);
+
+    CMsvEntry* entry = iSession->GetEntryL(aId);
+    CleanupStack::PushL(entry);
+
+    const TInt count = entry->Count();
+
+    // If current entry fulfils all defined constrains it is added into
+    // the array.
+    {
+        TBool store = EFalse;
+        TRAPD(err, store = entry->HasStoreL());
+        if (KErrNone == err && store)
+        {
+            TMsvEntry index = entry->Entry();
+
+            if (index.iType.iUid == KUidMsvMessageEntryValue ||
+                    index.iType.iUid == KUidMsvAttachmentEntryValue)
+            {
+                if (index.Visible() && index.Complete() &&
+                        !index.InPreparation() && !index.Deleted())
+                {
+                    aEntryArray.Insert(aId, 0);
+                }
+            }
+        }
+    }
+
+    // Check all child entries.
+    for (TInt loop = 0; loop < count; loop++)
+    {
+        if ((*entry)[loop].iType.iUid == KUidMsvFolderEntryValue ||
+                (*entry)[loop].iType.iUid == KUidMsvMessageEntryValue ||
+                (*entry)[loop].iType.iUid == KUidMsvAttachmentEntryValue)
+        {
+            SeekEntriesL((*entry)[loop].Id(), aEntryArray);
+        }
+    }
+
+    CleanupStack::PopAndDestroy(entry);
+}
+
+
+// ---------------------------------------------------------------------------
+//    To open an attachment manager.
+// -----------------------------------------------------------------------------
+TInt CJadJarMatcherScanFromInbox::OpenAttachmentManagerL(TMsvId& aId)
+{
+    JELOG(EJavaInstaller, "CJadJarMatcherScanFromInbox::OpenAttachmentManagerL");
+    iEntry = iSession->GetEntryL(aId);
+    iStore = iEntry->ReadStoreL();
+    iAttaMan = &iStore->AttachmentManagerL();
+    return iAttaMan->AttachmentCount();
+}
+
+
+// ---------------------------------------------------------------------------
+//    To indicate that a message server event has occured. This
+//    method handles events coming from the messaging server. If
+//    EMsvServerReady has come, session is established and MTM client can be
+//    instantiated. Otherwise the scanning is stopped with general error code.
+// -----------------------------------------------------------------------------
+void CJadJarMatcherScanFromInbox::HandleSessionEventL(
+    TMsvSessionEvent /*aEvent*/, TAny */*aArg1*/,
+    TAny */*aArg2*/, TAny */*aArg3*/)
+{
+    //LOG1(EJavaInstaller, EInfo, "CJadJarMatcherScanFromInbox::HandleSessionEventL: %d", aEvent);
+}
+
+
+// ---------------------------------------------------------------------------
+//    To check whether an attachment is possible JAD file or not.
+//    Operation returns false if at least one of the following statements is
+//    true:
+//    1) The type of the attachment is neither 'a file' nor 'a linked
+//    file'.
+//    2) The file extension is not '.jad'.
+//    3) The MIME type is defined and it is not MIME for JAD file.
+//    Otherwise operation returns true.
+//    Preconditions. The following conditions must be true prior to calling
+//    this method;
+//    otherwise, its operation is undefined. - None. Postconditions. The
+//    following condition is true immediately after returning from this method.
+//    - None.
+//    @param aAttaInfo - an attachment to be checked.
+//    @return False if file is not JAD file.
+// -----------------------------------------------------------------------------
+TBool CJadJarMatcherScanFromInbox::IsAttachmentPossibleJadFileL(const CMsvAttachment&  aAttaInfo)
+{
+    JELOG(EJavaInstaller, "CJadJarMatcherScanFromInbox::IsAttachmentPossibleJadFileL");
+
+    // 1
+    CMsvAttachment::TMsvAttachmentType type = aAttaInfo.Type();
+
+    if (CMsvAttachment::EMsvFile != type &&
+            CMsvAttachment::EMsvLinkedFile != type)
+    {
+        LOG(EJavaInstaller, EInfo,
+            "IsAttachmentPossibleJadFileL: EFalse - an attachment is not a file");
+        return EFalse;
+    }
+
+    // 2
+    TParsePtrC name(aAttaInfo.FilePath());
+
+    if (name.Ext().Length() > KExtLength)
+    {
+        LOG(EJavaInstaller, EInfo,
+            "IsAttachmentPossibleJadFileL: EFalse - file extension is too long");
+        return EFalse;
+    }
+    else
+    {
+        TBuf<KExtLength> ext(name.Ext());
+
+        // Convert the content to lower case.
+        ext.LowerCase();
+
+        // Compare extensions.
+        if (0 != ext.Compare(KJadExt))
+        {
+            LOG(EJavaInstaller, EInfo,
+                "IsAttachmentPossibleJadFileL: EFalse - file extension is not .jad");
+            return EFalse;
+        }
+    }
+
+    // 3
+    CMsvMimeHeaders* mimeHeaders = CMsvMimeHeaders::NewL();
+    CleanupStack::PushL(mimeHeaders);
+
+    // Restore MIME headers.
+    mimeHeaders->RestoreL(const_cast<CMsvAttachment&>(aAttaInfo));
+
+    if (NULL != mimeHeaders)
+    {
+        HBufC8* mt = mimeHeaders->ContentType().AllocL();
+        CleanupStack::PushL(mt);
+
+        HBufC8* ms = mimeHeaders->ContentSubType().AllocL();
+        CleanupStack::PushL(ms);
+
+        // Check whether MIME is not for JAD file.
+        if ((mt->Length() > 0 || ms->Length() > 0) && (
+                    0 != mt->Compare(KJadMimeType) || 0 != ms->Compare(
+                        KJadMimeSubType)))
+        {
+            LOG(EJavaInstaller, EInfo,
+                "IsAttachmentPossibleJadFileL: EFalse - mime is not for jad");
+            CleanupStack::PopAndDestroy(ms);
+            CleanupStack::PopAndDestroy(mt);
+            CleanupStack::PopAndDestroy(mimeHeaders);
+            return EFalse;
+        }
+        CleanupStack::PopAndDestroy(ms);
+        CleanupStack::PopAndDestroy(mt);
+    }
+
+    LOG(EJavaInstaller, EInfo,
+        "IsAttachmentPossibleJadFileL: ETrue - file is likely jad file");
+    CleanupStack::PopAndDestroy(mimeHeaders);
+    return ETrue;
+}
+
+
+// ---------------------------------------------------------------------------
+//    To check whether an attachment is possible JAR file or not.
+//    Operation returns false if at least one of following statements is true:
+//    1) The type of the attachment is neither 'a file' nor 'a linked file'.
+//    2) The file extension is not '.jar'.
+//    3) The MIME type is defined and it is not MIME for JAR file.
+//    Otherwise operation returns true. Preconditions.
+//    The following conditions must be true prior to calling this method,
+//    otherwise, its operation is undefined. - None. Postconditions. The
+//    following condition is true immediately after returning from this method.
+//    - None.
+//    @param aAttaInfo - an attachment to be checked.
+//    @return False if file is not JAR file.
+// -----------------------------------------------------------------------------
+TBool CJadJarMatcherScanFromInbox::IsAttachmentPossibleJarFileL(
+    const CMsvAttachment&  aAttaInfo)
+{
+    JELOG(EJavaInstaller, "CJadJarMatcherScanFromInbox::IsAttachmentPossibleJarFileL()");
+
+    // 1
+    CMsvAttachment::TMsvAttachmentType type = aAttaInfo.Type();
+
+    if (CMsvAttachment::EMsvFile != type &&
+            CMsvAttachment::EMsvLinkedFile != type)
+    {
+        LOG(EJavaInstaller, EInfo,
+            "IsAttachmentPossibleJarFileL: EFalse - an attachment is not a file");
+        return EFalse;
+    }
+
+    // 2
+    TParsePtrC name(aAttaInfo.FilePath());
+
+    if (name.Ext().Length() > KExtLength)
+    {
+        LOG(EJavaInstaller, EInfo,
+            "IsAttachmentPossibleJarFileL: EFalse - file extension is too long");
+        return EFalse;
+    }
+    else
+    {
+        TBuf<KExtLength> ext(name.Ext());
+
+        // Convert the content to lower case.
+        ext.LowerCase();
+
+        // Compare extensions.
+        if (0 != ext.Compare(KJarExt) &&
+                0 != ext.Compare(KDcfExt) &&
+                0 != ext.Compare(KDmExt))
+        {
+            LOG(EJavaInstaller, EInfo,
+                "IsAttachmentPossibleJarFileL: EFalse - file extension is not .jar, .dcf or .dm");
+            return EFalse;
+        }
+    }
+
+    // 3
+    CMsvMimeHeaders* mimeHeaders = CMsvMimeHeaders::NewL();
+    CleanupStack::PushL(mimeHeaders);
+
+    // Restore MIME headers.
+    mimeHeaders->RestoreL(const_cast<CMsvAttachment&>(aAttaInfo));
+
+    // Check whether MIME is not for JAR file.
+    if (NULL != mimeHeaders)
+    {
+        HBufC8* mt = mimeHeaders->ContentType().AllocL();
+        CleanupStack::PushL(mt);
+
+        HBufC8* ms = mimeHeaders->ContentSubType().AllocL();
+        CleanupStack::PushL(ms);
+        if ((mt->Length() > 0 || ms->Length() > 0) &&
+                (0 != mt->Compare(KJarMimeType) ||
+                 (0 != ms->Compare(KJarMimeSubType1) &&
+                  0 != ms->Compare(KJarMimeSubType2) &&
+                  0 != ms->Compare(KJarMimeSubType3))))
+        {
+            LOG(EJavaInstaller, EInfo,
+                "IsAttachmentPossibleJarFileL: EFalse - mime is not for jar");
+            CleanupStack::PopAndDestroy(ms);
+            CleanupStack::PopAndDestroy(mt);
+            CleanupStack::PopAndDestroy(mimeHeaders);
+            return EFalse;
+        }
+        CleanupStack::PopAndDestroy(ms);
+        CleanupStack::PopAndDestroy(mt);
+    }
+
+    LOG(EJavaInstaller, EInfo,
+        "IsAttachmentPossibleJarFileL: ETrue - file is likely jar file");
+    CleanupStack::PopAndDestroy(mimeHeaders);
+    return ETrue;
+}
+
+
+// ---------------------------------------------------------------------------
+//    To do clean-up for next round.
+// -----------------------------------------------------------------------------
+void CJadJarMatcherScanFromInbox::Cleanup()
+{
+    JELOG(EJavaInstaller, "CJadJarMatcherScanFromInbox::Cleanup()");
+    delete iStore;
+    iStore = NULL;
+    delete iEntry;
+    iEntry = NULL;
+    delete iSession;
+    iSession = NULL;
+}
+
+
+// ---------------------------------------------------------------------------
+//    To delete store objects.
+// -----------------------------------------------------------------------------
+void CJadJarMatcherScanFromInbox::InitAttachmentScan()
+{
+    JELOG(EJavaInstaller, "CJadJarMatcherScanFromInbox::InitAttachmentScan()");
+    delete iStore;
+    iStore = NULL;
+    delete iEntry;
+    iEntry = NULL;
+}
+
+} // namespace java