browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadMgrUiUserInteractions.cpp
changeset 0 dd21522fd290
child 10 a359256acfc6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadMgrUiUserInteractions.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,1383 @@
+/*
+* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:  Supports user interaction dialogs for downloads
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "CDownloadMgrUiUserInteractions.h"
+#include    "CUserInteractionsUtils.h"
+#include    "CDownloadMgrUiDownloadsList.h"
+#include    "CDownloadMgrUiLibRegistry.h"
+#include    "UserInteractionsEventHandler.h"
+#include    "AsyncEventHandlerArray.h"
+#include    "UiLibLogger.h"
+#include    "DMgrUiLibPanic.h"
+#include    "MDownloadHandlerObserver.h"
+#include    <e32std.h>
+#include    <e32def.h>
+#include    <StringLoader.h>
+#include    <DownloadMgrUiLib.rsg>
+#include    <AknQueryDialog.h>
+#include    <avkon.rsg>
+#include    <eikon.hrh>
+#include    <eikappui.h>
+#include    <apparc.h>
+#include    <AknServerApp.h>
+#include    <DRMCommon.h>
+
+// LOCAL CONSTANTS AND MACROS
+const TInt KPostponedDownloadsGranularity = 1;
+
+/**
+* Extension class.
+*/
+NONSHARABLE_CLASS( CUserInteractionsExtension ) : public CBase,
+                                                  public MDownloadHandlerObserver
+    {
+    public:  // Constructors and destructor
+        
+        /**
+        * Two-phased constructor.
+        */
+        static CUserInteractionsExtension* NewL
+             ( CDownloadMgrUiUserInteractions& aUserInteractions );
+        
+        /**
+        * Destructor.
+        */
+        virtual ~CUserInteractionsExtension();
+
+    public: // New functions
+
+        /**
+        * Postpone handling the given COD download. The download is placed to a 
+        * LIFO queue. Call SchedulePostponedDownloadL() to invoke the handling 
+        * of a download in the list.
+        * @param aDownload The download to be postponed.
+        */
+        void PostponeCodHandlingL( RHttpDownload& aDownload );
+
+        /**
+        * Check if the given download is postponed.
+        * @param aDownload The download in question.
+        * @return true/false.
+        */
+        TBool IsPostponed( RHttpDownload& aDownload ) const;
+
+        /**
+        * Schedule a postponed download for running.
+        */
+        void SchedulePostponedDownloadL();
+
+    protected: // Constructors
+
+        /**
+        * C++ default constructor.
+        */
+        CUserInteractionsExtension( CDownloadMgrUiUserInteractions& aUserInteractions );
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL();
+
+    protected: // From MDownloadHandlerObserver
+
+        void NotifyHandlerExit( RHttpDownload* aDownload, TInt aReason );
+
+    public: // Data
+
+        CDownloadMgrUiUserInteractions& iUserInteractions;
+        TBuf<KMaxPath> iFileName; ///< Buffer for file name.
+        // Attributes
+        TBool iIsCompletedStateHandled; ///< Event handling preferencies
+        TBool iSuppressDownloadConfirmation;
+        CArrayPtrFlat< RHttpDownload >* iPostponedCodDownloads; ///< Owned.
+    };
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsExtension::CUserInteractionsExtension
+// -----------------------------------------------------------------------------
+//
+CUserInteractionsExtension::CUserInteractionsExtension
+    ( CDownloadMgrUiUserInteractions& aUserInteractions )
+:   iUserInteractions( aUserInteractions ), 
+    iFileName( KNullDesC ), 
+    iIsCompletedStateHandled( ETrue )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsExtension::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsExtension::ConstructL()
+    {
+    CLOG_ENTERFN("CUserInteractionsExtension::ConstructL");
+    CLOG_LEAVEFN("CUserInteractionsExtension::ConstructL");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsExtension::NewL
+// -----------------------------------------------------------------------------
+//
+CUserInteractionsExtension* CUserInteractionsExtension::NewL
+    ( CDownloadMgrUiUserInteractions& aUserInteractions )
+    {
+    CUserInteractionsExtension* self = 
+        new (ELeave) CUserInteractionsExtension( aUserInteractions );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// Destructor
+CUserInteractionsExtension::~CUserInteractionsExtension()
+    {
+    CLOG_ENTERFN("CUserInteractionsExtension::~CUserInteractionsExtension");
+    delete iPostponedCodDownloads;
+    CLOG_WRITE(" iPostponedCodDownloads OK");
+    CLOG_LEAVEFN("CUserInteractionsExtension::~CUserInteractionsExtension");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsExtension::PostponeCodHandlingL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsExtension::PostponeCodHandlingL( RHttpDownload& aDownload )
+    {
+    CLOG_ENTERFN("CUserInteractionsExtension::PostponeCodHandlingL");
+
+    if ( !iPostponedCodDownloads )
+        {
+        iPostponedCodDownloads = new (ELeave) CArrayPtrFlat< RHttpDownload >
+                                            ( KPostponedDownloadsGranularity );
+        CLOG_WRITE(" new OK");
+        }
+    // Insert download at the end of the array
+    iPostponedCodDownloads->AppendL( &aDownload );
+
+    CLOG_LEAVEFN("CUserInteractionsExtension::PostponeCodHandlingL");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsExtension::IsPostponed
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsExtension::IsPostponed( RHttpDownload& aDownload ) const
+    {
+    CLOG_ENTERFN("CUserInteractionsExtension::IsPostponed");
+    
+    TInt index( KErrNotFound );
+    TKeyArrayFix cmpKey( 0, ECmpTUint32 );
+    TInt err = KErrNotFound;
+    if ( iPostponedCodDownloads )
+        {
+        err = iPostponedCodDownloads->Find( &aDownload, cmpKey, index );
+        CLOG_WRITE_FORMAT(" err: %d", err);
+        CLOG_WRITE_FORMAT(" index: %d", index);
+        }
+        
+    CLOG_LEAVEFN("CUserInteractionsExtension::IsPostponed");
+    return !err;
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsExtension::SchedulePostponedDownloadL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsExtension::SchedulePostponedDownloadL()
+    {
+    CLOG_ENTERFN("CUserInteractionsExtension::SchedulePostponedDownloadL");
+    
+    // Start next download handling
+    if ( iPostponedCodDownloads )
+        {
+        TInt postponedCodDlCount = iPostponedCodDownloads->Count();
+        CLOG_WRITE_FORMAT(" postponedCodDlCount: %d", postponedCodDlCount);
+        if ( postponedCodDlCount )
+            {
+            // Restart the first COD download in the list
+            RHttpDownload* codDl = (RHttpDownload*) iPostponedCodDownloads->At(0);
+            TInt errorRet = codDl->Start();
+            CLOG_WRITE_FORMAT(" errorRet: %d", errorRet);
+            User::LeaveIfError( errorRet );
+            // Remove the download from the lifo list, but do not delete it!
+            iPostponedCodDownloads->Delete(0);
+            }
+        }
+        
+    CLOG_LEAVEFN("CUserInteractionsExtension::SchedulePostponedDownloadL");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsExtension::NotifyHandlerExit
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsExtension::NotifyHandlerExit( RHttpDownload* aDownload, 
+                                                     TInt aReason )
+    {
+    CLOG_ENTERFN("CUserInteractionsExtension::NotifyHandlerExit");
+    CLOG_WRITE_FORMAT(" aReason: %d", aReason);
+
+    // Delete the download if the handler terminated without error
+    if ( aReason == KErrNone || aReason == EEikCmdExit || aReason == EAknCmdExit )
+        {
+        if ( aDownload )
+            {
+            /* return value is ignored */aDownload->Delete();
+            CLOG_WRITE(" Delete OK");
+            }
+        }
+
+    // Propagate the event to the registered observer, too
+    if ( iUserInteractions.iServerAppExitObserver != 0 )
+        {
+        CLOG_WRITE(" Propagating event...");
+        iUserInteractions.iServerAppExitObserver->HandleServerAppExit( aReason );
+        }
+
+    CLOG_LEAVEFN("CUserInteractionsExtension::NotifyHandlerExit");
+    }
+
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::CDownloadMgrUiUserInteractions
+// -----------------------------------------------------------------------------
+//
+CDownloadMgrUiUserInteractions::CDownloadMgrUiUserInteractions
+    ( CDownloadMgrUiLibRegistry& aRegistryModel )
+:   CDownloadMgrUiBase( aRegistryModel ),
+    iDlgActive ( EFalse )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiUserInteractions::ConstructL()
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::ConstructL");
+
+    BaseConstructL();
+    CLOG_WRITE(" BaseConstructL");
+    iExtension = CUserInteractionsExtension::NewL( *this );
+    CLOG_WRITE(" iExtension");
+    iUiUtils = CUserInteractionsUtils::NewL( *this, iRegistryModel );
+    CLOG_WRITE(" iUiUtils");
+    iEventHandlerArray = new(ELeave)CAsyncEventHandlerArray();
+    CLOG_WRITE(" iEventHandlerArray");
+    // Cancel the Soft Notifications belonging to this client
+    iUiUtils->CancelSoftNotifStndL
+        ( TVwsViewId(iRegistryModel.ClientAppUid(),TUid::Null()), 
+          TUid::Null(), KNullDesC8 );
+    iUiUtils->CancelSoftNotifEmbL
+        ( TVwsViewId(iRegistryModel.ClientAppUid(),TUid::Null()), 
+          TUid::Null(), KNullDesC8 );
+
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::ConstructL");
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::NewL
+// -----------------------------------------------------------------------------
+//
+CDownloadMgrUiUserInteractions* CDownloadMgrUiUserInteractions::NewL
+    ( CDownloadMgrUiLibRegistry& aRegistryModel )
+    {
+    CDownloadMgrUiUserInteractions* self = 
+        new ( ELeave ) CDownloadMgrUiUserInteractions( aRegistryModel );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// Destructor
+CDownloadMgrUiUserInteractions::~CDownloadMgrUiUserInteractions()
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::~CDownloadMgrUiUserInteractions");
+
+    delete iEventHandlerArray;
+    iEventHandlerArray = 0;
+    CLOG_WRITE(" iEventHandlerArray");
+    delete iUiUtils;
+    iUiUtils = 0;
+    CLOG_WRITE(" iUiUtils");
+    // iExtension should be the last deleted.
+    delete iExtension;
+    iExtension = 0;
+    CLOG_WRITE(" iExtension");
+
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::~CDownloadMgrUiUserInteractions");
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::OkToExitL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+TBool CDownloadMgrUiUserInteractions::OkToExitL()
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::OkToExitL");
+
+    TBool okToExit = EFalse;
+    TInt downloadCnt = iRegistryModel.DownloadCount();
+    CLOG_WRITE_FORMAT(" downloadCnt: %d", downloadCnt);
+    // do nothing if this is 0
+    if ( downloadCnt == 0 )
+        {
+        okToExit = ETrue;
+        CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::OkToExitL");
+        return okToExit;
+        }
+
+    // will delete client's completed, not hidden downloads
+    THttpDownloadState state;
+    THttpProgressState progState;
+    TBool isHiddenDel = EFalse;
+    TBool isCodDownload( EFalse );
+    TBool isProg (EFalse);
+    // check if progressive download, if yes, will NOT delete from the list, otherwise will
+    const CDownloadArray& downloadsDel = iRegistryModel.DownloadMgr().CurrentDownloads();
+    for ( TInt i = downloadCnt - 1; i >= 0; --i )
+        {
+        RHttpDownload* dl = downloadsDel.At(i); // current download
+        dl->GetIntAttribute(EDlAttrState, (TInt32&)state);
+        
+         //Changes for the bug JERI-7P8CF2
+         //Changes made in the server side to fix the video center receiving unexpected events
+         //Reassigning these events back to the changes done in server side
+         if( state  == EHttpDlCompleted )
+		     {
+             state  = EHttpDlMultipleMOCompleted;
+		     }
+         else if(state  == EHttpDlFailed )
+		     {
+		      state  = EHttpDlMultipleMOFailed;
+		     }
+        
+        if ( state == EHttpDlMultipleMOCompleted )
+            {
+            dl->GetBoolAttribute( EDlAttrHidden, isHiddenDel ); // return value ignored
+            dl->GetIntAttribute( EDlAttrProgressState, (TInt32&)progState );
+            dl->GetBoolAttribute( EDlAttrProgressive, isProg ); 
+            if ( (!isHiddenDel && ( progState == EHttpProgContentFileMoved || progState == EHttpProgContentFileMovedAndDestFNChanged )&& !isProg) )
+                {
+                User::LeaveIfError( dl->Delete() );
+                }
+            }
+        }
+       
+    downloadCnt = iRegistryModel.DownloadCount();
+
+    // Client is intrested in only those downloads for that the 
+    // media has not been removed or pausable (non-pausable downloads 
+    // will be deleted).
+    TInt32 noMediaDownloads(0);
+    iRegistryModel.DownloadMgr().GetIntAttribute( EDlMgrNoMediaDls, noMediaDownloads );
+    CLOG_WRITE_FORMAT(" noMediaDownloads: %d", noMediaDownloads);
+    // Return value is ignored.
+    // If it returns an error, then 'noMediaDownloads' is considered 0.
+
+    // Count hidden downloads, too.
+    TInt32 hiddenDownloads = 0;
+    TBool isHidden;
+    const CDownloadArray& downloads = iRegistryModel.DownloadMgr().CurrentDownloads();
+    for ( TInt i = 0; i < downloadCnt; ++i )
+        {
+        RHttpDownload* dl = downloads.At(i); // current download
+        dl->GetBoolAttribute( EDlAttrHidden, isHidden ); // return value ignored
+        if ( isHidden )
+            {
+            ++hiddenDownloads;
+            }
+        }
+       
+    CLOG_WRITE_FORMAT(" hiddenDownloads: %d", hiddenDownloads);
+
+    // Check if there is progressively played download
+    TInt32 progressivelyPlayed = 0;
+    for ( TInt i = downloadCnt - 1; i >=0; --i )
+	{
+        RHttpDownload* dl = downloads.At(i); //current download
+        dl->GetBoolAttribute( EDlAttrProgressive, isProg );
+        if (isProg && state==EHttpDlMultipleMOCompleted) 
+		{
+                progressivelyPlayed++;
+                break;
+		}
+	}
+      
+    TBool isPausable; 
+    for ( TInt i = 0; i < downloadCnt; ++i )
+        {
+            RHttpDownload* dl = downloads.At(i);
+            dl->GetBoolAttribute( EDlAttrPausable, isPausable );
+            if(!isPausable)
+            {
+                   break;
+            }
+        }
+    downloadCnt = downloadCnt - noMediaDownloads - hiddenDownloads - progressivelyPlayed;
+    CLOG_WRITE_FORMAT(" downloads result: %d", downloadCnt);
+    if ( downloadCnt < 1 ||  isPausable)
+        {
+        okToExit = ETrue;
+        }
+    else
+        {
+        HBufC* prompt = StringLoader::LoadLC( downloadCnt==1 ? 
+                        R_DMUL_EXIT_CONF_SING : R_DMUL_EXIT_CONF_PLUR );
+        CAknQueryDialog* conf = CAknQueryDialog::NewL();
+        conf->PrepareLC( R_DMUL_EXIT_CONF );
+        conf->SetPromptL( *prompt );
+        TInt resp = conf->RunLD();
+        CleanupStack::PopAndDestroy( prompt ); // prompt
+        
+        downloadCnt = iRegistryModel.DownloadCount();
+
+        TBool isProgressive (EFalse);
+        if ( resp == EAknSoftkeyYes || resp == EAknSoftkeyOk )
+		    {
+            for ( TInt i = downloadCnt - 1; i >=0; --i )
+		        {
+	            RHttpDownload* dl = downloads.At(i); //current download
+                dl->GetBoolAttribute( EDlAttrProgressive, isProgressive );
+                dl->GetBoolAttribute( EDlAttrPausable , isPausable );
+                if (!( isProgressive || isPausable ) ) // delete only no-PDL downloads and Non pausable Downloads
+    			    {
+                    // Delete not attached downloads.
+    	            dl->Delete(); // Return value ignored.
+			        }
+		        }
+            okToExit = ETrue;
+    		}
+        else
+            {
+            if ( iRegistryModel.DownloadsListInstalled() )
+                {
+                // Make visible
+                iRegistryModel.DownloadsList().DisplayDownloadsListL();
+                }
+            }
+        }
+
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::OkToExitL");
+    return okToExit;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::PrepareToExit
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+TInt CDownloadMgrUiUserInteractions::PrepareToExit( CEikAppUi& aAppUi, 
+                                                    TClientAppExitType aExitType, 
+                                                    TVwsViewId aViewId, 
+                                                    TUid aCustomMessageId, 
+                                                    const TDesC8& aViewActivationMsg )
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::PrepareToExit");
+
+    // send a message to all running PD applications and tell that browser is exiting
+    TRAP_IGNORE( iUiUtils->SendMsgTerminateToPdAppsL());
+
+    TRAPD( err, PrepareToExitL( &aAppUi, aExitType, aViewId, aCustomMessageId, 
+                                aViewActivationMsg ) );
+	CLOG_WRITE_FORMAT(" err: %d",err);
+
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::PrepareToExit");
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::PrepareToExit
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+TInt CDownloadMgrUiUserInteractions::PrepareToExit( TUint32 aAppUid,
+                                                    TUint32 aViewId, 
+                                                    TUint32 aCustomMessageId )
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::PrepareToExit 2");
+
+    // send a message to all running PD applications and tell that browser is exiting
+    TRAP_IGNORE( iUiUtils->SendMsgTerminateToPdAppsL());
+
+    // Convert parameters to the necessary form
+    TVwsViewId viewId( TUid::Uid(aAppUid), TUid::Uid(aViewId) );
+    TUid customMessageId( TUid::Uid(aCustomMessageId) );
+    
+    TRAPD( err, PrepareToExitL( 0, ETerminatedBySystem, viewId, customMessageId, 
+                                KNullDesC8 ) );
+	CLOG_WRITE_FORMAT(" err: %d",err);
+
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::PrepareToExit 2");
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::HandleDownloadL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+void CDownloadMgrUiUserInteractions::HandleDownloadL( RHttpDownload& aDownload )
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::HandleDownloadL");
+    CLOG_WRITE_FORMAT("aDownload: 0x%x",&aDownload);
+
+    // Handle only completed downloads.
+    // check if it is COD download. They do not require any handling - just delete them.
+    if ( CodDownloadL( aDownload ) )
+        {
+        // Nothing to do with COD - just delete it.
+        User::LeaveIfError( aDownload.Delete() );
+        CLOG_WRITE(" Delete OK");
+        }
+    else
+        {
+        // Handling depends on EDlAttrAction
+        TInt32 action(0);
+        User::LeaveIfError( aDownload.GetIntAttribute
+                            ( EDlAttrAction, action ) );
+        CLOG_WRITE_FORMAT(" EDlAttrAction: %d",action);
+
+        if ( action == EDoNothing )
+            {
+            // Do nothing
+            }
+        else if ( action & EMove )
+            {
+            // Move content to the location pointed by EDlAttrDestFilename.
+            User::LeaveIfError( aDownload.Move() );
+            }
+        else if ( action & EPdLaunch )
+            {
+        	// again do nothing since it's already launched during the process 
+            }
+        else
+            {
+            // Defaulting to Launch
+            HBufC8* ctype = iUiUtils->ContentTypeL( aDownload, ETrue );
+            CleanupStack::PushL( ctype );
+            TBool isLaunchType( KSisxApplication().Find( *ctype ) != KErrNotFound || KWidgetMimeType().Find (*ctype) != KErrNotFound );
+            if(!isLaunchType)
+                {
+                isLaunchType = KPipApplication().Find( *ctype ) != KErrNotFound ;
+                }
+            if(!isLaunchType)
+                {
+                isLaunchType = KSharingConfig().Find( *ctype ) != KErrNotFound ;
+                }                
+            if( isLaunchType )
+                {
+                // launch content
+                iUiUtils->HandleContentL( aDownload, *iExtension );
+                }
+            else if ( iUiUtils->DrmDownloadL( aDownload ) )
+                {
+
+                if( iUiUtils->IsCorruptedDcfL( aDownload ) )
+                    {
+                    aDownload.Delete();
+                    // Show 'File corrupted' info note.
+                    iUiUtils->InfoNoteL( R_DMUL_OK_NOTE, R_DMUL_ERROR_CORRUPTED );
+                    }
+                else
+                    {
+                    TBool isBadMimeInDcf = iUiUtils->IsBadMimeInDcfL( aDownload );
+                    TBool isSupported = EFalse;
+                    if ( isBadMimeInDcf )
+                        {
+                        isSupported = EFalse;
+                        }
+                    else
+                        {
+                        isSupported = iUiUtils->IsContentTypeSupportedL( aDownload );
+                        }
+                    TBool previewRights;
+                    if ( iUiUtils->DrmRightsOnThePhoneL( aDownload, previewRights ) )
+                        {
+                        // get content type of media file in drm content
+                        isLaunchType = KDrmInnerContentTypesToLaunch().Find( *ctype ) != KErrNotFound;
+                        if( isLaunchType )
+                            {
+                            // launch content
+                            iUiUtils->HandleContentL( aDownload, *iExtension );
+                            }
+                        else if ( previewRights )
+                            {
+                            // Normal behaviour
+                            HandleNormalDownloadL( aDownload );
+                            }
+                        else
+                            {
+                            HandleCompletionWithQueryL( aDownload, IsUiBusy(), isSupported, ETrue, ETrue );
+                            }
+                        }
+                    else
+                        {
+                        // No rights on the phone
+                        HandleCompletionWithQueryL( aDownload, IsUiBusy(), isSupported, ETrue, EFalse );
+                        }
+                    }
+                }
+            else // Normal download
+                {
+                HandleNormalDownloadL( aDownload );
+                }
+             CleanupStack::PopAndDestroy( ctype );    
+            }
+        }
+
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::HandleDownloadL");
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::GetIntAttributeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+void CDownloadMgrUiUserInteractions::GetIntAttributeL( const TUint /*aAttribute*/, TInt32& /*aValue*/ )
+    {
+    User::Leave( KErrNotSupported );
+    }
+    
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::GetBoolAttributeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+void CDownloadMgrUiUserInteractions::GetBoolAttributeL( const TUint aAttribute, TBool& aValue )
+    {
+    if ( aAttribute == EAttrSuppressDownloadConfirmation )
+        {
+        aValue = iExtension->iSuppressDownloadConfirmation;
+        }
+    else
+        {
+        User::Leave( KErrNotSupported );
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::GetStringAttributeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+void CDownloadMgrUiUserInteractions::GetStringAttributeL( const TUint /*aAttribute*/, TDes16& /*aValue*/  )
+    {
+    User::Leave( KErrNotSupported );
+    }
+    
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::GetStringAttributeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+void CDownloadMgrUiUserInteractions::GetStringAttributeL( const TUint /*aAttribute*/, TDes8& /*aValue*/  )
+    {
+    User::Leave( KErrNotSupported );
+    }
+    
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::SetIntAttributeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+void CDownloadMgrUiUserInteractions::SetIntAttributeL( const TUint /*aAttribute*/, TInt32 /*aValue*/ )
+    {
+    User::Leave( KErrNotSupported );
+    }
+    
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::SetBoolAttributeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+void CDownloadMgrUiUserInteractions::SetBoolAttributeL( const TUint aAttribute, TBool aValue )
+    {
+    if ( aAttribute == EAttrSuppressDownloadConfirmation )
+        {
+        iExtension->iSuppressDownloadConfirmation = aValue;
+        }
+    else
+        {
+        User::Leave( KErrNotSupported );
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::SetStringAttributeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+void CDownloadMgrUiUserInteractions::SetStringAttributeL( const TUint /*aAttribute*/, const TDesC16& /*aValue*/ )
+    {
+    User::Leave( KErrNotSupported );
+    }
+    
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::SetStringAttributeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+void CDownloadMgrUiUserInteractions::SetStringAttributeL( const TUint /*aAttribute*/, const TDesC8& /*aValue*/ )
+    {
+    User::Leave( KErrNotSupported );
+    }
+    
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::HandleCompletionWithQueryL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiUserInteractions::HandleCompletionWithQueryL
+    ( RHttpDownload& aDownload,
+      TBool aIsUiBusy,
+      TBool aIsSupported,
+      TBool aIsDrm,
+      TBool aDrmRightsOnPhone )
+    {
+    if( !iDlgActive )
+        {
+        iDlgActive = ETrue;
+        TRAPD( err, DoHandleCompletionWithQueryL( aDownload, aIsUiBusy,
+            aIsSupported, aIsDrm, aDrmRightsOnPhone ));
+        iDlgActive = EFalse;
+        User::LeaveIfError( err );
+        }
+    }
+  
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::DoHandleCompletionWithQueryL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiUserInteractions::DoHandleCompletionWithQueryL
+    ( RHttpDownload& aDownload, TBool CLOG_ONLY( aIsUiBusy ), 
+                                                      TBool aIsSupported, 
+                                                      TBool aIsDrm, 
+                                                      TBool aDrmRightsOnPhone )
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::HandleCompletionWithQueryL");
+    CLOG_WRITE_FORMAT(" aIsUiBusy: %d",aIsUiBusy);
+    CLOG_WRITE_FORMAT(" aIsSupported: %d",aIsSupported);
+    CLOG_WRITE_FORMAT(" aIsDrm: %d",aIsDrm);
+    CLOG_WRITE_FORMAT(" aDrmRightsOnPhone: %d",aDrmRightsOnPhone);
+
+    // File name :
+    User::LeaveIfError( aDownload.GetStringAttribute
+                      ( EDlAttrName, iExtension->iFileName ) );
+
+    HBufC* queryText = StringLoader::LoadLC
+                       ( R_DMUL_COMPLETED_CONF, iExtension->iFileName );
+
+    CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+    // Set up the initial dialog. Some parameters are changed then.
+    dlg->PrepareLC( R_DMUL_COMPL_DOWNLOAD_CONF );
+    CLOG_WRITE(" PrepareLC OK");
+    dlg->SetPromptL( *queryText );
+    
+    // Set up softkeys:
+    TInt cbaResourceId(0);
+    TInt okSkMeans(0);
+    if ( aIsDrm && aIsSupported )
+        {
+        if ( !aDrmRightsOnPhone )
+            {
+            // aIsUiBusy must be EFalse!
+            cbaResourceId = R_DMUL_SOFTKEYS_COMPL_DRM_SAVE;
+            okSkMeans = EAknSoftkeySave;
+            }
+        else
+            {
+            cbaResourceId = R_DMUL_SOFTKEYS_COMPL_DRM;
+            okSkMeans = EAknSoftkeyShow;
+            }
+        }
+    else
+        {
+        // aIsUiBusy must be EFalse!
+        if ( aIsSupported )
+            {
+            cbaResourceId = R_DMUL_SOFTKEYS_COMPL_DL;
+            okSkMeans = EAknSoftkeyShow;
+            }
+        else
+            {
+            cbaResourceId = R_DMUL_SOFTKEYS_UNSUPP_COMPL_DL;
+            okSkMeans = EAknSoftkeySave;
+            }
+        }
+    dlg->ButtonGroupContainer().SetCommandSetL( cbaResourceId );
+
+    // Execute it.
+    TInt skId = dlg->RunLD();
+    CLOG_WRITE_FORMAT(" RunLD %d",skId);
+    dlg = NULL;
+
+    CleanupStack::PopAndDestroy( /*queryText*/ ); // queryText
+
+    // Translate OK key to the proper meaning
+    if ( skId == EAknSoftkeyOk )
+        {
+        skId = okSkMeans;
+        }
+        
+    if ( skId == EAknSoftkeyShow )
+        {
+        // First clode the downloads list.
+        if ( iRegistryModel.DownloadsListInstalled() )
+            {
+            iRegistryModel.DownloadsList().CancelDisplayingDownloadsList();
+            }
+        iUiUtils->HandleContentL( aDownload, *iExtension );
+        // After the termination of the handler, download is removed 
+        // from the list of downloads in NotifyHandlerExit().
+        }
+    else if ( skId == EAknSoftkeySave )
+        {
+        iUiUtils->SaveContentL( aDownload );
+        // The save (moving) procedure is asynchronous!
+        // When ends, HandleDMgrEventL() is called.
+        }
+    else
+        {
+        // Do nothing.
+        }
+
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::HandleCompletionWithQueryL");
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::PrepareToExitL
+// Behaviour depends on:
+// - EDlMgrExitAction is EExitDelete or not
+// - some download is non-pausable - these will always be deleted by DM engine
+// - hidden downloads
+// - no media downloads are taken into account!
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiUserInteractions::PrepareToExitL( CEikAppUi* /*aAppUi*/, 
+                                                     TClientAppExitType aExitType, 
+                                                     TVwsViewId aViewId, 
+                                                     TUid aCustomMessageId, 
+                                                     const TDesC8& aViewActivationMsg )
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::PrepareToExitL");
+
+    __ASSERT_ALWAYS( aExitType==ETerminatedBySystem, Panic( EUiLibPanCalledWhenUserExit ) );
+
+    TInt32 exitAction( EExitNothing );
+    User::LeaveIfError( iRegistryModel.DownloadMgr().
+                        GetIntAttribute( EDlMgrExitAction, exitAction ) );
+    CLOG_WRITE_FORMAT(" exitAction: %d",exitAction);
+    
+    if ( exitAction == EExitDelete )
+        {
+        // No need to initialize soft notifications - downloads will be deleted
+        CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::PrepareToExitL");
+        return;
+        }
+        
+    // count non-pausable and hidden downloads
+    TInt downloadCnt = iRegistryModel.DownloadCount();
+    TInt ignoredDownloads = 0;
+    TBool isPausable(0);
+    TBool isHidden(0);
+    TBool isNoMedia(0);
+    TInt err(0);
+    THttpDownloadState state;
+    const CDownloadArray& downloads = iRegistryModel.DownloadMgr().CurrentDownloads();
+    for( TInt i = 0; i < downloadCnt; ++i )
+        {
+        RHttpDownload* dl = downloads.At(i); // current download
+        err = dl->GetBoolAttribute( EDlAttrPausable, isPausable );
+        if ( !err )
+            {
+            err = dl->GetBoolAttribute( EDlAttrHidden, isHidden );
+            }
+        if( !err )
+            {
+            err = dl->GetIntAttribute(EDlAttrState, (TInt32&)state);
+            //Changes for the bug JERI-7P8CF2
+            //Changes made in the server side to fix  the video center receiving unexpected events
+            //Reassigning these events back to the changes done in server side
+            if(!err && state  == EHttpDlCompleted )
+		       {
+                state  = EHttpDlMultipleMOCompleted;
+		       }
+            else if(!err && state  == EHttpDlFailed )
+		       {
+		       state  = EHttpDlMultipleMOFailed;
+		       }
+          
+            }
+        if ( !err )
+        	{
+        	err = dl->GetBoolAttribute( EDlAttrNoMedia, isNoMedia );
+        	}
+        CLOG_WRITE_FORMAT(" err: %d",err);
+        if ( !err && ( !isPausable || isHidden ||isNoMedia || state == EHttpDlMultipleMOCompleted  ) )
+            {
+            ++ignoredDownloads;
+            }
+        }
+    CLOG_WRITE_FORMAT(" downloadCnt: %d",downloadCnt);
+    CLOG_WRITE_FORMAT(" ignoredDownloads: %d",ignoredDownloads);
+        
+    // the new downloadCnt holds only those downloads, that count from the 
+    // point of soft notifications
+    downloadCnt = downloadCnt - ignoredDownloads;
+    
+    // Is the App server app?
+    TBool startedAsServerApp = ((CEikonEnv&)iCoeEnv).StartedAsServerApp();
+    CLOG_WRITE_FORMAT(" startedAsServerApp: %d",startedAsServerApp);
+    if ( startedAsServerApp )
+        {
+        if ( downloadCnt > 0 )
+            {
+            // Display GSN-Emb.
+            iUiUtils->InitializeSoftNotifEmbL
+                ( aViewId, aCustomMessageId, aViewActivationMsg );
+
+            // And check if there is a running stand-alone instance from the 
+            // same application. If there is no such, then initialize GSN-Stnd.
+            if ( IsStandAloneAppRunning() )
+                {
+                // The stand-alone app will show GSN, if necessary when terminated.
+                }
+            else
+                {
+                // It has to initialize GSN-Stnd
+                iUiUtils->InitializeSoftNotifStndL
+                    ( aViewId, aCustomMessageId, aViewActivationMsg );
+                }
+            }
+        else
+            {
+            // No downloads left in - don't show GSN.
+            }
+        }
+    else                                        // Stand-alone
+        {
+        if ( downloadCnt > 0 )
+            {
+            // Display GSN-Stnd.
+            iUiUtils->InitializeSoftNotifStndL
+                ( aViewId, aCustomMessageId, aViewActivationMsg );
+            }
+        else
+            {
+            // No downloads left in - don't show GSN.
+            }
+        }
+
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::PrepareToExitL");
+    }
+    
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::IsStandAloneAppRunning
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadMgrUiUserInteractions::IsStandAloneAppRunning()
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::IsStandAloneAppRunning");
+
+    TBool ret(0);
+    if ( !((CEikonEnv&)iCoeEnv).StartedAsServerApp() )
+        {
+        // This is the stand-alone app.
+        ret = ETrue;
+        }
+    else
+        {
+        TApaTaskList apaTaskList( iCoeEnv.WsSession() );
+        TUid appUid = iRegistryModel.ClientAppUid();
+        TApaTask apaTask = apaTaskList.FindApp( appUid );
+        ret = apaTask.Exists();
+        }
+
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::IsStandAloneAppRunning");
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::DeleteEventHandlerShowingDlConfirmation
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiUserInteractions::DeleteEventHandlerShowingDlConfirmation
+                                   ( RHttpDownload& aDownload )
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::DeleteEventHandlerShowingDlConfirmation");
+
+    // Find the event handler of this download
+    TInt handlerCount = iEventHandlerArray->Count();
+    for( TInt i = 0; i < handlerCount; ++i )
+        {
+        CUserInteractionsEventHandler* handlerI = 
+            (CUserInteractionsEventHandler*)iEventHandlerArray->At(i);
+        if ( &(handlerI->Download()) == &aDownload )
+            {
+            // found one.
+            if ( handlerI->DownloadConfirmationShown() )
+                {
+                delete handlerI;
+                iEventHandlerArray->Remove( handlerI );
+                --i;
+                --handlerCount;
+                }
+            }
+        }
+
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::DeleteEventHandlerShowingDlConfirmation");
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::DeleteEventHandlers
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiUserInteractions::DeleteEventHandlers( RHttpDownload& aDownload )
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::DeleteEventHandlers");
+
+    // Find the event handler of this download
+    TInt handlerCount = iEventHandlerArray->Count();
+    for( TInt i = 0; i < handlerCount; ++i )
+        {
+        CUserInteractionsEventHandler* handlerI = 
+            (CUserInteractionsEventHandler*)iEventHandlerArray->At(i);
+        if ( &(handlerI->Download()) == &aDownload )
+            {
+            // found one.
+            delete handlerI;
+            iEventHandlerArray->Remove( handlerI );
+            --i;
+            --handlerCount;
+            }
+        }
+
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::DeleteEventHandlers");
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::DownloadConfirmationsShown
+// -----------------------------------------------------------------------------
+//
+TInt CDownloadMgrUiUserInteractions::DownloadConfirmationsShown() const
+    {
+    TInt count( 0 );
+    TInt totalCount = iEventHandlerArray->Count();
+    CUserInteractionsEventHandler* eventHandler = NULL;
+    for ( TInt i = 0; i < totalCount; ++i )
+        {
+        eventHandler = (CUserInteractionsEventHandler*)(*iEventHandlerArray)[i];
+        if ( eventHandler->DownloadConfirmationShown() )
+            {
+            count++;
+            }
+        }
+    return count;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::IsUiBusy
+// UI is busy, if:
+// - DocHandler exists in CUserInteractionsUtils.
+// - CodHandler ServiceFlow is running.
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadMgrUiUserInteractions::IsUiBusy() const
+    {
+    TBool isUiBusy( ETrue ); // True by default.
+    if ( iUiUtils->IsUiBusy() )
+        {
+        isUiBusy = ETrue;
+        }
+    else if ( IsCodServiceFlowRunning() )
+        {
+        isUiBusy = ETrue;
+        }
+    else
+        {
+        isUiBusy = EFalse;
+        }
+    return isUiBusy;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::PostponeCodHandlingL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiUserInteractions::PostponeCodHandlingL( RHttpDownload& aDownload )
+    {
+    iExtension->PostponeCodHandlingL( aDownload );
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::IsPostponed
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadMgrUiUserInteractions::IsPostponed( RHttpDownload& aDownload ) const
+    {
+    return iExtension->IsPostponed( aDownload );
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::SchedulePostponedDownloadL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiUserInteractions::SchedulePostponedDownloadL()
+    {
+    iExtension->SchedulePostponedDownloadL();
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::IsCodServiceFlowRunning
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadMgrUiUserInteractions::IsCodServiceFlowRunning() const
+    {
+    TBool isCodServiceFlowRunning( ETrue ); // true by default
+    TRAP_IGNORE( isCodServiceFlowRunning = IsCodServiceFlowRunningL() );
+    return isCodServiceFlowRunning;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::IsCodServiceFlowRunning
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadMgrUiUserInteractions::IsCodServiceFlowRunning
+                                    ( RHttpDownload& aDownload ) const
+    {
+    TBool isCodServiceFlowRunning( ETrue ); // true by default
+    TRAP_IGNORE( isCodServiceFlowRunning = IsCodServiceFlowRunningL( aDownload ) );
+    return isCodServiceFlowRunning;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::IsCodServiceFlowRunningL
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadMgrUiUserInteractions::IsCodServiceFlowRunningL() const
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::IsCodServiceFlowRunningL");
+    
+    TBool isCodServiceFlowRunning( EFalse ); // false by default!
+    // Walk through the list of downloads.
+    RHttpDownloadMgr& dMgr = iRegistryModel.DownloadMgr();
+    TInt downloads = dMgr.CurrentDownloads().Count();
+    for ( TInt i = 0; i < downloads; ++i )
+        {
+        RHttpDownload* download = 
+            (RHttpDownload*)(dMgr.CurrentDownloads().At(i));
+        CLOG_WRITE_FORMAT(" download: %x",download);
+        
+        if ( IsCodServiceFlowRunningL( *download ) )
+            {
+            CLOG_WRITE(" Found!");
+            isCodServiceFlowRunning = ETrue;
+            break;
+            }
+        }
+
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::IsCodServiceFlowRunningL");
+    return isCodServiceFlowRunning;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::IsCodServiceFlowRunningL
+// CodHandler ServiceFlow is running, if a COD download is hidden, but it is 
+// not in the so called postponed downloads list.
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadMgrUiUserInteractions::IsCodServiceFlowRunningL
+                                    ( RHttpDownload& aDownload ) const
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::IsCodServiceFlowRunningL DL");
+    
+    TBool isCodServiceFlowRunning( EFalse ); // false by default!
+    // COD download?
+    TBool isCodDownload( EFalse );
+    User::LeaveIfError( aDownload.GetBoolAttribute
+                      ( EDlAttrCodDownload, isCodDownload ) );
+    CLOG_WRITE_FORMAT(" isCodDownload: %d",isCodDownload);
+    if ( isCodDownload )
+        {
+        // check if hidden?
+        TBool isHidden( EFalse );
+        User::LeaveIfError( aDownload.GetBoolAttribute
+                          ( EDlAttrHidden, isHidden ) );
+        CLOG_WRITE_FORMAT(" isHidden: %d",isHidden);
+        if ( isHidden )
+            {
+            // if it is not in postponed downloads list...
+            if ( !IsPostponed( aDownload ) )
+                {
+                isCodServiceFlowRunning = ETrue;
+                }
+            }
+        }
+
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::IsCodServiceFlowRunningL DL");
+    return isCodServiceFlowRunning;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::HandleNormalDownloadL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiUserInteractions::HandleNormalDownloadL( RHttpDownload& aDownload )
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::HandleNormalDownloadL");
+
+    if ( IsUiBusy() )
+        {
+        // It's handling a downloaded content. Do not open a new.
+        CLOG_WRITE(" IsUiBusy() true");
+        }
+    else
+        {
+        iRegistryModel.DownloadsList().DisplayDownloadsListL(aDownload);
+        } 
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::HandleNormalDownloadL");
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::CodDownloadL
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadMgrUiUserInteractions::CodDownloadL( RHttpDownload& aDownload ) const
+    {
+    CLOG_ENTERFN("CDownloadMgrUiUserInteractions::CodDownloadL");
+
+    TBool isCodDownload( EFalse );
+    User::LeaveIfError( aDownload.GetBoolAttribute
+                        ( EDlAttrCodDownload, isCodDownload ) );
+                        
+    CLOG_WRITE_FORMAT(" ret: %d",isCodDownload);
+    CLOG_LEAVEFN("CDownloadMgrUiUserInteractions::CodDownloadL");
+    return isCodDownload;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiUserInteractions::HandleDMgrEventL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiUserInteractions::HandleDMgrEventL
+    ( RHttpDownload& aDownload, THttpDownloadEvent aEvent )
+    {
+    CLOG_WRITE_EVENT("UsrInt",&aDownload,aEvent);
+
+    if ( aEvent.iDownloadState == EHttpDlMediaInserted ||  
+         aEvent.iDownloadState == EHttpDlPausable || 
+         aEvent.iDownloadState == EHttpDlNonPausable )
+        {
+        // This event is not handled by User Interactions Event Handler
+        }
+    else if ( aEvent.iDownloadState == EHttpDlDeleted || 
+              aEvent.iDownloadState == EHttpDlDeleting )
+        {
+        DeleteEventHandlers( aDownload );
+        iUiUtils->DownloadHasBeenDeleted( &aDownload );
+        }
+    else if ( aEvent.iDownloadState == EHttpDlAlreadyRunning )
+        {
+        // Display information note
+        CUserInteractionsUtils::InfoNoteL( R_DMUL_OK_NOTE, R_DMUL_NOTE_DOWNLOADING );
+        }
+    else if ( aEvent.iDownloadState == EHttpDlInprogress )
+        {
+        if ( aEvent.iProgressState == EHttpProgResponseHeaderReceived || 
+             aEvent.iProgressState == EHttpContTypeRecognitionAvail || 
+             aEvent.iProgressState == EHttpProgSupportedMultiPart || 
+             aEvent.iProgressState == EHttpProgDlNameChanged )             
+            {
+            // Create the asynchronous event handler that will handle the event.
+            CUserInteractionsEventHandler* asyncHandler = 
+                new (ELeave) CUserInteractionsEventHandler
+                ( aDownload, aEvent, iRegistryModel, *iEventHandlerArray, *iUiUtils );
+            CleanupStack::PushL( asyncHandler );
+            // iEventHandlerArray will own it
+            iEventHandlerArray->AppendL( asyncHandler );
+            CleanupStack::Pop( asyncHandler ); // asyncHandler - ownership transferred
+            }
+        // If COD is downloaded, close download confirmation query for this download:
+        // COD shows accept/reject query too.
+        else if ( aEvent.iProgressState == EHttpProgCodDescriptorDownloaded )
+            {
+            // delete event handlers showing download confirmation.
+            DeleteEventHandlerShowingDlConfirmation( aDownload );
+            }
+        else if ( aEvent.iProgressState == EHttpProgCodDescriptorAccepted || 
+                  aEvent.iProgressState == EHttpProgCodLoadEnd            ||
+			      aEvent.iProgressState == EHttpProgCodPdAvailable ) 
+            {
+            // Open downloads list.
+            // Create the asynchronous event handler that will handle the event, because 
+            // it will run a 'wait' dialog.
+            CUserInteractionsEventHandler* asyncHandler = 
+                new (ELeave) CUserInteractionsEventHandler
+                ( aDownload, aEvent, iRegistryModel, *iEventHandlerArray, *iUiUtils );
+            CleanupStack::PushL( asyncHandler );
+            // iEventHandlerArray will own it
+            iEventHandlerArray->AppendL( asyncHandler );
+            CleanupStack::Pop( asyncHandler ); // asyncHandler - ownership transferred
+            }
+        }
+    else if ( aEvent.iDownloadState == EHttpDlPaused )
+        {
+        if ( aEvent.iProgressState == EHttpContentTypeReceived )
+            {
+            // Create the asynchronous event handler that will handle the event.
+            CUserInteractionsEventHandler* asyncHandler = 
+                new (ELeave) CUserInteractionsEventHandler
+                ( aDownload, aEvent, iRegistryModel, *iEventHandlerArray, *iUiUtils );
+            CleanupStack::PushL( asyncHandler );
+            // iEventHandlerArray will own it
+            iEventHandlerArray->AppendL( asyncHandler );
+            CleanupStack::Pop( asyncHandler ); // asyncHandler - ownership transferred
+            }
+        }
+    else
+        {
+        // In case of completed or failed download, delete event handlers 
+        // that are showing download confirmation.
+        if ( aEvent.iDownloadState == EHttpDlMultipleMOCompleted || 
+             aEvent.iDownloadState == EHttpDlMultipleMOFailed )
+            {
+            DeleteEventHandlerShowingDlConfirmation( aDownload );
+            }
+            
+        // Create the asynchronous event handler that will handle the event.
+        CUserInteractionsEventHandler* asyncHandler = 
+            new (ELeave) CUserInteractionsEventHandler
+            ( aDownload, aEvent, iRegistryModel, *iEventHandlerArray, *iUiUtils );
+        CleanupStack::PushL( asyncHandler );
+        // iEventHandlerArray will own it
+        iEventHandlerArray->AppendL( asyncHandler );
+        CleanupStack::Pop( asyncHandler ); // asyncHandler - ownership transferred
+        }
+    }
+
+/* End of file. */
+