browserutilities/downloadmgr/DownloadMgrUiLib/Src/CUserInteractionsUtils.cpp
changeset 0 dd21522fd290
child 1 7c90e6132015
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/downloadmgr/DownloadMgrUiLib/Src/CUserInteractionsUtils.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,2092 @@
+/*
+* 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    "CUserInteractionsUtils.h"
+#include    "MDownloadHandlerObserver.h"
+#include    "CDownloadMgrUiBase.h"
+#include    "CDownloadMgrUiLibRegistry.h"
+#include    "CDownloadMgrUiDownloadsList.h"
+#include    "CDownloadMgrUiUserInteractions.h"
+#include    "UiLibLogger.h"
+#include    "DMgrUiLibPanic.h"
+#include    <DownloadMgrUiLib.rsg>
+#include    <DownloadMgrClient.h>
+#include    <AiwGenericParam.h>
+#include    <DocumentHandler.h>
+#include    <coemain.h>
+#include    <ErrorUI.h>
+#include    <eikenv.h>
+#include    <apmstd.h>
+#include    <CAknFileSelectionDialog.h>
+#include    <CAknMemorySelectionDialog.h>
+#include    <AknQueryDialog.h>
+#include    <StringLoader.h>
+#include    <AknSoftNotificationParameters.h>
+#include    <AknSoftNotifier.h>
+#include    <AknNoteWrappers.h>
+#include    <BrowserDialogsProvider.h>
+#include    <HttpDownloadMgrCommon.h>
+#include    <PathInfo.h>
+#include    <aknglobalnote.h>
+#include    <Oma2Agent.h>
+#include    <DRMCommon.h>
+#include	<apmrec.h>
+#include	<apgcli.h>
+#include    <s32mem.h>
+#include    "bautils.h"
+#include	<etelmm.h>
+#include	<MmTsy_names.h>
+#include    <rconnmon.h>
+#include    <DcfEntry.h>
+#include    <DcfRep.h>
+#include    <MGXFileManagerFactory.h>
+#include    <CMGXFileManager.h>
+
+// LOCAL CONSTANTS AND MACROS
+const TInt KErrorUiHttpStatusBase = -25000;
+const TInt KMinimumSoftNotePriority = 1000;
+#define GLOBAL_HTTP_ERROR( err ) ( KErrorUiHttpStatusBase - err )
+
+const TInt FilenameSuffixMaxLength = 16; // Extra space for localization
+const TInt FilenameSuffixMaxValue = 9999;// Maximum file number
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::CUserInteractionsUtils
+// -----------------------------------------------------------------------------
+//
+CUserInteractionsUtils::CUserInteractionsUtils( CDownloadMgrUiBase& aDMgrUiBase, 
+                                                MDownloadMgrUiLibRegModel& aRegistryModel )
+:   iCoeEnv( *CCoeEnv::Static() ), 
+    iDMgrUiBase( aDMgrUiBase ),
+    iRegistryModel( aRegistryModel ),
+    iDocHandlerUsesTheUi( EFalse )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::ConstructL()
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::ConstructL");
+    iDialogsProv = CBrowserDialogsProvider::NewL( 0 );
+    CLOG_WRITE(" iDialogsProv OK");
+    iSoftNotifier = CAknSoftNotifier::NewL();
+    CLOG_WRITE(" iSoftNotifier OK");
+    iErrorUi = CErrorUI::NewL();
+
+    iUnderTenFormatter = StringLoader::LoadL( R_QTN_IV_NAME_SUFFIX_UNDER_TEN_FORMATTER );
+    iOverTenFormatter = StringLoader::LoadL( R_QTN_IV_NAME_SUFFIX_OVER_TEN_FORMATTER );
+    iSearchChar = (*iUnderTenFormatter)[0];
+    iCodDownload = EFalse;
+
+    CLOG_LEAVEFN("CUserInteractionsUtils::ConstructL");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::NewL
+// -----------------------------------------------------------------------------
+//
+CUserInteractionsUtils* CUserInteractionsUtils::NewL
+( CDownloadMgrUiBase& aDMgrUiBase, MDownloadMgrUiLibRegModel& aRegistryModel )
+    {
+    CUserInteractionsUtils* self = 
+        new ( ELeave ) CUserInteractionsUtils( aDMgrUiBase, aRegistryModel );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// Destructor
+CUserInteractionsUtils::~CUserInteractionsUtils()
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::~CUserInteractionsUtils");
+    // Cancel all executing dialogs/notes/controls
+    CancelAllDialogs();
+    CLOG_WRITE(" CancelAllDialogs OK");
+    delete iDocHandler;
+    CLOG_WRITE(" iDocHandler OK");
+    delete iSoftNotifier;
+    CLOG_WRITE(" iSoftNotifier OK");
+    delete iErrorUi;
+    CLOG_WRITE(" iErrorUi OK");
+    delete iUnderTenFormatter;
+    CLOG_WRITE(" iUnderTenFormatter OK");
+    delete iOverTenFormatter;
+    CLOG_WRITE(" iOverTenFormatter OK");    
+    CLOG_LEAVEFN("CUserInteractionsUtils::~CUserInteractionsUtils");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::ShowErrorNoteL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::ShowErrorNoteL( RHttpDownload& aDownload, 
+                                             TInt32 aErrorId )
+    {
+    TInt32 sysErrorId( KErrNone ); // Global (system-wide) error ID
+
+    // DMgr specific error code. See THttpDownloadMgrError.
+    // Convert it to Symbian OS system-wide error code.
+    switch ( aErrorId )
+        {
+        case EGeneral:
+            {
+            // EDlAttrGlobalErrorId gives the system-wide code.
+            User::LeaveIfError( aDownload.GetIntAttribute
+                              ( EDlAttrGlobalErrorId, sysErrorId ) );
+            break;
+            }
+        case EInternal:
+        	{
+        	sysErrorId = KErrGeneral;
+        	break;
+        	}
+        case EContentFileIntegrity:
+        	{
+        	sysErrorId = KErrCorrupt;
+        	break;
+        	}
+        case EDiskFull:
+            {
+            sysErrorId = KErrDiskFull;
+            break;
+            }
+        case EConnectionFailed:
+        case ETransactionFailed:
+        case EMoveFailed:
+            {
+            // EDlAttrGlobalErrorId gives the system-wide code.
+            User::LeaveIfError( aDownload.GetIntAttribute
+                              ( EDlAttrGlobalErrorId, sysErrorId ) );
+            break;
+            }
+        case EDestFileWriteFailed:
+        	{
+        	sysErrorId = KErrWrite;
+        	break;
+        	}
+        case EMMCRemoved:
+        	{
+        	sysErrorId = KErrNotFound;
+        	break;
+        	}
+        case EBadUrl:
+        	{
+        	sysErrorId = GLOBAL_HTTP_ERROR(414);
+        	break;
+        	}
+        case EWrongDestFilename:
+        	{
+        	sysErrorId = KErrArgument;
+        	break;
+        	}
+        case EDestFileInUse:
+        	{
+        	sysErrorId = KErrAccessDenied;
+        	break;
+        	}
+        case EHttpUnhandled:
+        	{
+            // EDlAttrGlobalErrorId gives the system-wide code.
+            User::LeaveIfError( aDownload.GetIntAttribute
+                              ( EDlAttrGlobalErrorId, sysErrorId ) );
+        	break;
+        	}
+        // Don't show error notification in the following cases:
+        case EHttpAuthenticationFailed:
+        case EProxyAuthenticationFailed:
+        	{
+            sysErrorId = KErrNone;
+            break;
+        	}
+        case EObjectNotFound:
+            {
+            // Convert to global http error code.
+            sysErrorId = GLOBAL_HTTP_ERROR(404);
+            break;
+            }
+        case EPartialContentModified:
+        	{
+            sysErrorId = GLOBAL_HTTP_ERROR(412);
+            break;
+        	}
+        case EContentExpired:
+            {
+            sysErrorId = GLOBAL_HTTP_ERROR(205);
+            break;
+            }
+        case EHttpRestartFailed:
+            {
+            // Show error note by ourself
+            HBufC* errorString = 
+                   iCoeEnv.AllocReadResourceLC( R_DMUL_ERROR_START_FROM_BEGINNING );
+            CAknGlobalNote* globalNote = CAknGlobalNote::NewL();
+            CleanupStack::PushL( globalNote );
+            globalNote->ShowNoteL( EAknGlobalErrorNote, *errorString );
+            CleanupStack::PopAndDestroy( 2, errorString );  // globalNote, errorString
+            sysErrorId = KErrNone; // Do not use errorui
+            break;
+            }
+        default:
+            {
+            sysErrorId = KErrGeneral;
+            break;
+            }
+        }
+
+    if ( sysErrorId != KErrNone )
+        {
+        if ( sysErrorId == KErrHttpPartialResponseReceived )
+            { // FMLK-72653Y : as server closed connection unexpectedly,  
+              // and there is no good error note, use KErrDisconnected instead.
+            iErrorUi->ShowGlobalErrorNoteL( KErrDisconnected, CTextResolver::ECtxAutomatic );
+            }
+        else
+            {
+            iErrorUi->ShowGlobalErrorNoteL( sysErrorId, CTextResolver::ECtxAutomatic );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::ShowErrorNoteL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::ShowErrorNoteL( TInt aErrorId )
+    {
+    iErrorUi->ShowGlobalErrorNoteL( aErrorId, CTextResolver::ECtxAutomatic );
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::IsRecoverableFailL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::IsRecoverableFailL( RHttpDownload& aDownload, 
+                                                  TInt32 aErrorId ) const
+    {
+    TBool recoverable( ETrue );
+
+    // What is the error?
+    TInt32 errorId( aErrorId ); // DMgr specific error ID
+    CLOG_WRITE_FORMAT("Fail reason: %d", errorId);
+    //
+    // EDlAttrGlobalErrorId gives the system-wide code.
+    TInt32 sysErrorId( 0 );
+    User::LeaveIfError( aDownload.GetIntAttribute
+                      ( EDlAttrGlobalErrorId, sysErrorId ) );
+    
+    TBool pausable( ETrue );
+    User::LeaveIfError( aDownload.GetBoolAttribute( EDlAttrPausable, pausable ) );
+    if ( errorId == EObjectNotFound )
+         // Other error situations can be added to the list. //
+        {
+        recoverable = EFalse;
+        }
+    else if ( errorId == ETransactionFailed )
+        {        
+        if ( sysErrorId == KBadMimeType || sysErrorId == -20000 || sysErrorId == KErrHttpPartialResponseReceived || !pausable )
+        // KBadMimeType and -20000 is from DRMFilter
+        // Transaction must be cancelled and download must be deleted
+            {
+            recoverable = EFalse;
+            }
+        else
+            {
+            recoverable = ETrue;
+            }
+        }
+    else if ( errorId == EGeneral )
+        {
+        if ( sysErrorId == KErrNoMemory || sysErrorId == KErrDiskFull )
+        //Memory full or Disk Full can be Recoverable error if Download is Pausable    
+            {
+            recoverable = pausable;
+            }
+        else 
+            {
+            recoverable = EFalse;
+            }
+        }
+    else
+        {
+        recoverable = EFalse;
+        }
+
+    CLOG_WRITE_FORMAT("IsRecoverableFailL: %d", (TInt)recoverable);
+    return recoverable;
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::HandleContentL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::HandleContentL
+( RHttpDownload& aDownload, MDownloadHandlerObserver& aHandlerObserver )
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::HandleContentL");
+
+    __ASSERT_DEBUG( !iRegistryModel.UserInteractions().IsUiBusy(), 
+                    Panic( EUiLibPanDocHandlerAlreadyRunning ) );
+                    
+    if ( iRegistryModel.UserInteractions().IsUiBusy() )
+        {
+        CLOG_WRITE(" IsUiBusy() true");
+        }
+    else
+        {
+        iHandledDownload = &aDownload;
+        iHandlerObserver = &aHandlerObserver;
+
+        // BEGIN: Get attributes for generic params 
+        //=========================
+        //   EDlAttrCurrentUrl
+        //=========================
+        HBufC* url = HBufC::NewLC( KMaxUrlLength );
+        TPtr urlPtr = url->Des();
+        User::LeaveIfError
+            ( aDownload.GetStringAttribute( EDlAttrCurrentUrl, urlPtr ) );
+        CLOG_WRITE_FORMAT(" EDlAttrCurrentUrl: %S",url);
+        //=========================
+        //   EDlAttrDestFilename
+        //=========================
+        HBufC* fileName = HBufC::NewLC( KMaxPath );
+        TPtr fileNamePtr = fileName->Des();
+        TInt32 numMediaObjects = 0;
+        User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrNumMediaObjects, numMediaObjects ) );
+        if (numMediaObjects > KFirstMoIndex)
+            {
+            User::LeaveIfError
+                ( aDownload.GetStringAttribute( EDlAttrDestFilename, KFirstMoIndex, fileNamePtr ) );
+            }
+        else
+            {
+            User::LeaveIfError
+                ( aDownload.GetStringAttribute( EDlAttrDestFilename, fileNamePtr ) );
+            }
+        CLOG_WRITE_FORMAT(" EDlAttrDestFilename: %S",&fileNamePtr);
+
+        // check if file exists, if does not , don't continue
+        if ( !IsDuplicateL( fileNamePtr ) )
+            {
+            HBufC* infoPrompt = StringLoader::LoadLC( R_DMUL_ERROR_FILE_NOT_FOUND);
+            CAknInformationNote* note = new(ELeave)  CAknInformationNote();
+            note->ExecuteLD(*infoPrompt);
+            CleanupStack::PopAndDestroy(infoPrompt);	
+
+            CleanupStack::PopAndDestroy( fileName ); // fileName
+            CleanupStack::PopAndDestroy( url ); // url            
+            return;
+            }
+
+        //=========================
+        //   EDlAttrContentType
+        //=========================
+        HBufC8* contentType = ContentTypeL(aDownload, ETrue, KFirstMoIndex);
+
+        //=========================
+        //   EDlMgrIap
+        //=========================
+        TInt32 iap;
+        User::LeaveIfError
+            ( iRegistryModel.DownloadMgr().GetIntAttribute( EDlMgrIap, iap ) );
+        CLOG_WRITE_FORMAT(" EDlMgrIap: %d",iap);
+        //=========================
+        //   EDlAttrCharSet
+        //=========================
+        HBufC* charset = HBufC::NewLC( KMaxDefAttrLength );
+        TPtr charsetPtr = charset->Des();
+        TInt retVal = aDownload.GetStringAttribute( EDlAttrCharSet, charsetPtr );
+        CLOG_WRITE_FORMAT(" EDlAttrCharSet retVal: %d",retVal);
+        if( ( KErrNotFound == retVal ) || ( KErrNone == retVal ) )
+            {
+            // The Char Set is either found or not found but we don't care!!!
+            CLOG_WRITE_FORMAT(" EDlAttrCharSet: %S",charset);
+            }
+        else
+            {
+            User::Leave( retVal );
+            }
+        //=========================
+        //   EDlAttrRequestReferer
+        //=========================
+        HBufC* refererUri = HBufC::NewLC( KMaxUrlLength );
+        TPtr refererUriPtr = refererUri->Des();
+        retVal = aDownload.GetStringAttribute( EDlAttrRequestReferer, refererUriPtr );
+        CLOG_WRITE_FORMAT(" EDlAttrRequestReferer retVal: %d",retVal);
+        if( ( KErrNotFound == retVal ) || ( KErrNone == retVal ) )
+            {
+            // The Char Set is either found or not found but we don't care!!!
+            CLOG_WRITE_FORMAT(" refererUri: %S",refererUri);
+            }
+        else
+            {
+            User::Leave( retVal );
+            }
+        // END: Get attributes for generic params 
+
+        //Creating generic param list
+        CAiwGenericParamList* genericParamList = CAiwGenericParamList::NewLC();
+
+        TAiwVariant iapVariant( iap );
+        TAiwGenericParam genericParamIap( EGenericParamAccessPoint, iapVariant );
+        genericParamList->AppendL( genericParamIap );
+
+        if( url->Length() )
+            {
+            TAiwVariant urlVariant( *url );
+            TAiwGenericParam genericParamUrl( EGenericParamURL, urlVariant );
+            genericParamList->AppendL( genericParamUrl );
+            }
+        if( charset->Length() )
+            {
+            TAiwVariant charSetVariant( *charset );
+            TAiwGenericParam genericParamCharSet
+                ( EGenericParamCharSet, charSetVariant );
+            genericParamList->AppendL( genericParamCharSet );
+            }
+        if( refererUri->Length() )
+            {
+            TAiwVariant refUriVariant( *refererUri );
+            TAiwGenericParam genericParamRefUri
+                ( EGenericParamReferringURI, refUriVariant );
+            genericParamList->AppendL( genericParamRefUri );
+            }
+        if( fileName->Length() )
+            {
+            TAiwVariant fileNameVariant( *fileName );
+            TAiwGenericParam genericParamFileName
+                ( EGenericParamFile, fileNameVariant );
+            genericParamList->AppendL( genericParamFileName );
+            }
+        
+        CLOG_WRITE_FORMAT(" iDocHandler: %x",iDocHandler);
+    	delete iDocHandler;
+    	iDocHandler = 0;
+        iDocHandler = CDocumentHandler::NewL();
+        iDocHandler->SetExitObserver( this );
+    
+        RFile file;
+        iDocHandler->OpenTempFileL( *fileName, file );
+        CleanupClosePushL( file );
+
+        TDataType dataType( *contentType );
+        TInt docErr( KErrNone );
+        TInt trappedError( KErrNone );
+        iDocHandlerUsesTheUi = ETrue;
+        TRAP( trappedError, 
+              docErr = iDocHandler->OpenFileEmbeddedL( file, 
+                                                       dataType, 
+                                                       *genericParamList ) );
+        CLOG_WRITE_FORMAT(" trappedError: %d",trappedError);
+        CLOG_WRITE_FORMAT(" docErr: %d",docErr);
+        CleanupStack::PopAndDestroy( &file ); // file
+        CLOG_WRITE(" PopAndDestroy file OK");
+        
+        if ( trappedError || docErr )
+            {
+            delete iDocHandler;
+    	    iDocHandler = 0;
+    	    iDocHandlerUsesTheUi = EFalse;
+    	    // Since we know this is an open file error, we should handle it by calling 
+    	    // ShowErrorNotesL instead of propagating the error 
+            if ( trappedError ) 
+                {
+                ShowErrorNoteL (aDownload, trappedError );
+                }
+            else 
+                {
+                ShowErrorNoteL (aDownload, docErr );
+                }            
+            }
+
+        CleanupStack::PopAndDestroy( genericParamList ); // genericParamList
+        CleanupStack::PopAndDestroy( refererUri ); // refererUri
+        CleanupStack::PopAndDestroy( charset ); // charset
+        CleanupStack::PopAndDestroy( fileName ); // fileName
+        CleanupStack::PopAndDestroy( url ); // url
+        }
+
+    CLOG_LEAVEFN("CUserInteractionsUtils::HandleContentL");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::SaveContentL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::SaveContentL( RHttpDownload& aDownload )
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::SaveContentL");
+
+    __ASSERT_DEBUG( iMemSelectionDialog == 0, Panic( EUiLibPanNull ) ); // Only one can run
+
+    TBool boolRet( EFalse );
+    
+    if ( !DrmDownloadL( aDownload ) )
+        {
+        boolRet = SaveContentWithPathSelectionL( aDownload );
+        }
+    else
+        {
+        // DRM download, but...
+        if ( !IsContentTypeSupportedL( aDownload ) )
+            {
+            boolRet = SaveContentWithPathSelectionL( aDownload );
+            }
+        else
+            {
+            // We can use DocHandler's MoveL
+            HBufC* fileName = HBufC::NewLC( KMaxPath );
+            TPtr fileNamePtr = fileName->Des();
+            User::LeaveIfError
+                ( aDownload.GetStringAttribute( EDlAttrDestFilename, fileNamePtr ) );
+            CLOG_WRITE_FORMAT(" EDlAttrDestFilename: %S",&fileNamePtr);
+
+            HBufC* dlName = HBufC::NewLC( KMaxPath );
+            TPtr dlNamePtr = dlName->Des();
+            User::LeaveIfError
+                ( aDownload.GetStringAttribute( EDlAttrName, dlNamePtr ) );
+            CLOG_WRITE_FORMAT(" EDlAttrName: %S",&dlNamePtr);
+            
+            HBufC8* contentType = HBufC8::NewLC( KMaxContentTypeLength );
+            TPtr8 contentTypePtr = contentType->Des();
+            User::LeaveIfError
+                ( aDownload.GetStringAttribute( EDlAttrContentType, contentTypePtr ) );
+            CLOG_WRITE(" EDlAttrContentType OK");
+            TDataType dataType( *contentType );
+
+            CLOG_WRITE_FORMAT(" iDocHandler: %x",iDocHandler);
+        	delete iDocHandler;
+        	iDocHandler = 0;
+            iDocHandler = CDocumentHandler::NewL();
+            CLOG_WRITE(" DocHandler constructed");
+
+            TInt moveRet(0);
+            iDocHandlerUsesTheUi = ETrue;
+            // MoveL is synchronous
+            TRAPD( moveErr, moveRet = iDocHandler->MoveL( *fileName,
+                                                *dlName,
+                                                dataType,
+                                                KEntryAttNormal ) );
+            CLOG_WRITE_FORMAT(" moveErr: %d",moveErr);
+            CLOG_WRITE_FORMAT(" moveRet: %d",moveRet);
+
+            // Delete DocHandler, otherwise IsUiBusy returns ETrue.        
+            delete iDocHandler;
+            iDocHandler = 0;
+            iDocHandlerUsesTheUi = EFalse;
+            CleanupStack::PopAndDestroy( contentType ); // contentType
+            contentType = 0;
+            CleanupStack::PopAndDestroy( dlName ); // dlName
+            dlName = 0;
+            CleanupStack::PopAndDestroy( fileName ); // fileName
+            fileName = 0;
+            
+            if( moveRet == KUserCancel )
+                {
+                // The user cancelled the operation.
+                }
+            else if( moveErr == KErrNone )
+                {
+                boolRet = ETrue;
+                // The download can be deleted
+                User::LeaveIfError( aDownload.Delete() );
+                CLOG_WRITE(" Delete OK");
+                }
+            else if( moveErr == KDRMErrPreviewRights )
+                {
+                // Launch from the download directory
+                }
+            else
+                {
+                // Leave with the error
+                User::Leave( moveErr );
+                }
+            }
+        }
+
+    CLOG_LEAVEFN("CUserInteractionsUtils::SaveContentL");
+    return boolRet;
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::SaveContentWithPathSelectionL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::SaveContentWithPathSelectionL
+    ( RHttpDownload& aDownload )
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::SaveContentWithPathSelectionL");
+
+    TBool boolRet( EFalse );
+
+    // Select memory
+    iMemSelectionDialog = CAknMemorySelectionDialog::NewL
+        ( ECFDDialogTypeSave, R_DMUL_MEMORY_SELECTION_DLG, 
+          /*aShowUnavailableDrives*/EFalse );
+    CLOG_WRITE(" CAknMemorySelectionDialog::NewL OK");
+    CAknMemorySelectionDialog::TMemory mem( CAknMemorySelectionDialog::EPhoneMemory );
+    boolRet = iMemSelectionDialog->ExecuteL( mem );
+    CLOG_WRITE_FORMAT(" MEM boolRet: %d",boolRet);
+    delete iMemSelectionDialog;
+    iMemSelectionDialog = 0;
+    
+    if ( boolRet )
+        {
+        CLOG_WRITE_FORMAT(" mem: %d",(TInt)mem);
+        TBool useMmc = (mem == CAknMemorySelectionDialog::EMemoryCard);
+        
+        __ASSERT_DEBUG( iFileSelectionDialog == 0, Panic( EUiLibPanNull ) ); // Only one can run
+
+        HBufC* fileName = HBufC::NewLC( KMaxPath );
+        TPtr fileNamePtr = fileName->Des();
+        User::LeaveIfError
+            ( aDownload.GetStringAttribute( EDlAttrName, fileNamePtr ) );
+        CLOG_WRITE(" EDlAttrName OK");
+
+        // Select folder
+        TInt resourceId = useMmc ? R_DMUL_MMC_FILE_SELECTION_DLG : 
+                                   R_DMUL_FILE_SELECTION_DLG;
+        iFileSelectionDialog = CAknFileSelectionDialog::NewL
+                             ( ECFDDialogTypeSave, resourceId );
+        CLOG_WRITE(" CAknFileSelectionDialog::NewL OK");
+        TPath selectedPath( KNullDesC );
+        // Execute dialog - it calls CActiveScheduler::Start(), so be careful 
+        // when using data members after ExecuteLD!
+        // TODO introduce deleted, as it uses data after executeld.
+        boolRet = iFileSelectionDialog->ExecuteL( selectedPath );
+        CLOG_WRITE_FORMAT(" FILE boolRet: %d",boolRet);
+        delete iFileSelectionDialog;
+        iFileSelectionDialog = 0;
+
+        if ( boolRet )
+            {
+            // Folder selected. Move file there.
+            fileNamePtr.Insert( 0, selectedPath );
+            CLOG_WRITE_FORMAT(" fileName before EnsureUniqueFileNameL: %S", fileName);
+            TPtr fname = fileName->Des();
+            EnsureUniqueFileNameL( fname );
+            CLOG_WRITE_FORMAT(" fileName after EnsureUniqueFileNameL: %S", fileName);
+            User::LeaveIfError
+                ( aDownload.SetStringAttribute( EDlAttrDestFilename, *fileName ) );
+            CLOG_WRITE(" EDlAttrDestFilename OK");
+            User::LeaveIfError( aDownload.Move() );
+            CLOG_WRITE(" Move OK");
+            }
+            
+        CleanupStack::PopAndDestroy( fileName ); // fileName
+        }
+
+    CLOG_LEAVEFN("CUserInteractionsUtils::SaveContentWithPathSelectionL");
+    return boolRet;
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::EnsureUniqueFileNameL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::EnsureUniqueFileNameL( TPtr& aFileName )
+    {
+    TInt counter( 0 );
+	while ( IsDuplicateL( aFileName ) )
+	    {
+        if ( !GenerateNewNameL( aFileName, counter ) )
+            {
+            break;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::GenerateNewNameL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::GenerateNewNameL( TPtr& aFileName, TInt& aCounter )
+    {
+    HBufC* original = aFileName.AllocLC();
+    TParsePtrC parse( *original );
+    HBufC* nameBuf = HBufC::NewLC( KMaxFileName );
+    TPtr name = nameBuf->Des();
+    name = parse.Name();
+    TInt counter( aCounter );
+    TBool found( EFalse );
+    TInt len = name.Length();
+    TInt i = len - 1;
+    TBool ret( ETrue );
+
+    // Search starting from the end
+    for ( ; i >= 0; --i )
+        {
+        if ( name[i] == iSearchChar )
+            {
+            found = ETrue;
+            break;
+            }
+        }
+    if ( aCounter == 0 && found && i > 0
+            && i <= len - iUnderTenFormatter->Length() )
+        {
+        // Existing counter, parse the count
+        TPtrC oldCounter = name.Right( len - i );
+        TLex lex( oldCounter );
+        if ( lex.Val( counter ) )
+            {
+            counter = 0;
+            }
+        aCounter = counter;
+        }
+    else if ( !found )
+        {
+        // No counter found
+        i = len;
+        }
+    ++counter;
+    ++aCounter;
+    if ( counter > FilenameSuffixMaxValue )
+        {
+        // Count too high, can't generate new name
+        ret = EFalse;
+        }
+    else
+        {
+        TBuf<FilenameSuffixMaxLength> number;
+        HBufC* formatter = iUnderTenFormatter;
+        if ( counter >= 10 )
+            {
+            formatter = iOverTenFormatter;
+            }
+        StringLoader::Format( number, *formatter, -1, counter );
+        // Check for length, the full path must not get too long
+        TPtrC driveAndPath = parse.DriveAndPath();
+        TPtrC ext = parse.Ext();
+        TInt pathLen = driveAndPath.Length() + i + number.Length()
+                        + ext.Length();
+        TInt maxLen = aFileName.MaxLength();
+        if ( pathLen > maxLen )
+            {
+            i -= pathLen - maxLen;
+            }
+        if ( i < 1 )
+            {
+            // At least one character from the old name must be included
+            ret = EFalse;
+            }
+        else
+            {
+            name.SetLength( i );
+            name.Append( number );
+
+            aFileName.Zero();
+            aFileName.Append( driveAndPath );
+            aFileName.Append( name );
+            aFileName.Append( ext );
+            }
+        }
+    CleanupStack::PopAndDestroy( 2, original ); // nameBuf, original
+    return ret;
+    }
+    
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::IsDuplicateL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::IsDuplicateL( const TPtrC& aFileName )
+    {
+	TBool result( EFalse );
+	RFs rfs;
+    User::LeaveIfError( rfs.Connect() );
+    CleanupClosePushL<RFs>( rfs );
+	result = BaflUtils::FileExists( rfs, aFileName );
+    CleanupStack::PopAndDestroy( &rfs );
+	return result;
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::CancelMemorySelectionDialog
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::CancelMemorySelectionDialog()
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::CancelMemorySelectionDialog");
+    if ( iMemSelectionDialog )
+        {
+        delete iMemSelectionDialog;
+        iMemSelectionDialog = 0;
+        }
+    CLOG_LEAVEFN("CUserInteractionsUtils::CancelMemorySelectionDialog");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::CancelFileSelectionDialog
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::CancelFileSelectionDialog()
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::CancelFileSelectionDialog");
+    if ( iFileSelectionDialog )
+        {
+        delete iFileSelectionDialog;
+        iFileSelectionDialog = 0;
+        }
+    CLOG_LEAVEFN("CUserInteractionsUtils::CancelFileSelectionDialog");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::DeleteWithUserConfirmL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::DeleteWithUserConfirmL( RHttpDownload& aDownload )
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::DeleteWithUserConfirmL");
+    
+    TInt32 numMediaObjects(0);
+    aDownload.GetIntAttribute( EDlAttrNumMediaObjects, numMediaObjects );
+    
+    HBufC* fileName = HBufC::NewLC( KMaxPath );
+    TPtr fileNamePtr = fileName->Des();
+    
+    // In case of album, show the album name. Otherwise show file name.
+    TInt err(KErrNone);
+    if (numMediaObjects > 1)
+        {
+        err = aDownload.GetStringAttribute( EDlAttrAlbumName, fileNamePtr );
+        }
+    else
+        {
+        err = aDownload.GetStringAttribute( EDlAttrName, fileNamePtr );
+        }
+        
+    if ( err != KErrNone && err != KErrNotFound )
+        {
+        User::LeaveIfError( err );
+        }
+    TBool fileNameSet = ( err == KErrNone );
+    if ( !fileNameSet )
+        {
+        fileNamePtr.Copy( _L("Filename unknown") );//TODO what to write out?
+        }
+
+    HBufC* prompt = StringLoader::LoadLC( R_DMUL_DOWNLOAD_DEL_CONF, *fileName );
+    CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+    delete iDeleteConfirmDlg;
+    iDeleteConfirmDlg = dlg;
+    // Execute dialog - it calls CActiveScheduler::Start(), so be careful 
+    // when using data members after ExecuteLD!
+    TInt resp = iDeleteConfirmDlg->ExecuteLD
+                    ( R_DMUL_DOWNLOAD_YESNO_CONF_Q, *prompt );
+    iDeleteConfirmDlg = 0;
+    CleanupStack::PopAndDestroy( 2, fileName ); // prompt, fileName
+
+    if ( resp ) // We have to check only that the value is non-zero
+        {
+
+        aDownload.GetBoolAttribute( EDlAttrCodDownload,iCodDownload );	
+        
+	   
+        if(iCodDownload)
+			{
+			CMGXFileManager* mgFileManager = MGXFileManagerFactory::NewFileManagerL(
+	        CEikonEnv::Static()->FsSession() );
+	        
+	        //Assume that all files to be deleted are valid.
+	        TBool fileNotFound = EFalse;
+	        
+			for(TInt i = 1; i <= numMediaObjects; i++)
+		    	{
+                HBufC* fileName = HBufC::NewLC( KMaxPath );
+                TPtr fileNamePtr = fileName->Des();
+                User::LeaveIfError( aDownload.GetStringAttribute( EDlAttrDestFilename,i,fileNamePtr ));		    			    	
+                RFs rfs;
+                User::LeaveIfError( rfs.Connect() );
+                CleanupClosePushL<RFs>( rfs );
+                TFindFile file(rfs);
+                TPtrC ptr(KNullDesC);
+                TInt found = file.FindByPath(fileNamePtr,&ptr); //when second parameter to the API is Null then the it searches for the file in the Dir specified in the first parameter
+                if(found == KErrNotFound)
+                    {
+                    //Found out that at least one file is not found
+                    fileNotFound =ETrue;
+                    }
+
+                rfs.Delete( fileNamePtr );
+                // Notify Media Gallery about new media file
+                if( fileNamePtr.Length() > 0 )
+                   {
+                   TRAP_IGNORE( mgFileManager->UpdateL( fileNamePtr ) );
+                   TRAP_IGNORE( UpdateDCFRepositoryL( fileNamePtr ) );
+                   }
+                else
+                   {
+                   TRAP_IGNORE( mgFileManager->UpdateL() );
+                   }
+                CleanupStack::PopAndDestroy( &rfs );
+                CleanupStack::PopAndDestroy( fileName );    
+                }
+                delete mgFileManager;
+                mgFileManager = NULL;
+                
+                //Inform the user that atleast one file not found.	
+	   		    if(fileNotFound)
+	   		        {
+                    HBufC* infoPrompt = StringLoader::LoadLC( R_DMUL_ERROR_FILE_NOT_FOUND);
+                    CAknInformationNote* note = new(ELeave)  CAknInformationNote();
+                    note->ExecuteLD(*infoPrompt);
+                    CleanupStack::PopAndDestroy(infoPrompt);	   		   				
+	   		        }
+			}    
+			
+        User::LeaveIfError( aDownload.Delete() );
+        CLOG_LEAVEFN("CUserInteractionsUtils::DeleteWithUserConfirmL");
+        return ETrue; // Deleted
+        }
+    else
+        {
+        // Do nothing.
+        CLOG_LEAVEFN("CUserInteractionsUtils::DeleteWithUserConfirmL");
+        return EFalse;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::CancelDeleteConfirmationDialog
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::CancelDeleteConfirmationDialog()
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::CancelDeleteConfirmationDialog");
+    delete iDeleteConfirmDlg;
+    iDeleteConfirmDlg = 0;
+    CLOG_LEAVEFN("CUserInteractionsUtils::CancelDeleteConfirmationDialog");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::CancelWithUserConfirmL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::CancelWithUserConfirmL( RHttpDownload& aDownload )
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::CancelWithUserConfirmL");
+    
+    HBufC* fileName = HBufC::NewLC( KMaxPath );
+    TPtr fileNamePtr = fileName->Des();
+    TInt err = aDownload.GetStringAttribute( EDlAttrName, fileNamePtr );
+    if ( err != KErrNone && err != KErrNotFound )
+        {
+        User::LeaveIfError( err );
+        }
+    TBool fileNameSet = ( err == KErrNone );
+    if ( !fileNameSet )
+        {
+        fileNamePtr.Copy( _L("Filename unknown") );//TODO what to write out?
+        }
+
+    HBufC* prompt = StringLoader::LoadLC( R_DMUL_DOWNLOAD_CAN_CONF, *fileName );
+    CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+    delete iCancelConfirmDlg;
+    iCancelConfirmDlg = dlg;
+    // Execute dialog - it calls CActiveScheduler::Start(), so be careful 
+    // when using data members after ExecuteLD!
+    TInt resp = iCancelConfirmDlg->ExecuteLD
+                    ( R_DMUL_DOWNLOAD_YESNO_CONF_Q, *prompt );
+    iCancelConfirmDlg = 0;
+    CleanupStack::PopAndDestroy( 2, fileName ); // prompt, fileName
+
+    if ( resp ) // We have to check only that the value is non-zero
+        {
+        User::LeaveIfError( aDownload.Delete() );
+        CLOG_LEAVEFN("CUserInteractionsUtils::CancelWithUserConfirmL");
+        return ETrue; // Cancelled
+        }
+    else
+        {
+        // Do nothing.
+        CLOG_LEAVEFN("CUserInteractionsUtils::CancelWithUserConfirmL");
+        return EFalse;
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::CancelAllWithUserConfirmL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::CancelAllWithUserConfirmL( RHttpDownload& /* aDownload */)
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::CancelAllWithUserConfirmL");
+
+    HBufC* prompt = StringLoader::LoadLC( R_DMUL_EXIT_CONF_PLUR );
+    CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+    delete iCancelConfirmDlg;
+    iCancelConfirmDlg = dlg;
+    // Execute dialog - it calls CActiveScheduler::Start(), so be careful 
+    // when using data members after ExecuteLD!
+    TInt resp = iCancelConfirmDlg->ExecuteLD
+                    ( R_DMUL_DOWNLOAD_YESNO_CONF_Q, *prompt );
+    iCancelConfirmDlg = 0;
+    CleanupStack::PopAndDestroy(); // prompt
+    
+    if ( resp ) // We have to check only that the value is non-zero
+        {
+        TInt count = iRegistryModel.DownloadMgr().CurrentDownloads().Count();
+        TInt32 dlState;
+        for(TInt i = 0; i < count; i++)
+        	{
+        	(iRegistryModel.DownloadMgr().CurrentDownloads().At(i))->GetIntAttribute(EDlAttrState, dlState);
+        	
+        	//add fix for the bug  JERI-7P8CF2, if checking against EHttpDlMultipleMOCompleted EHttpDlMultipleMOFailed
+             //Changes for the bug JERI-7P8CF2
+            //Changes made in the server side to fix for the video center receiving unexpected events
+            //Reassigning these events back to the changes done in server side
+            if(dlState  == EHttpDlCompleted )
+		       {
+                dlState  = EHttpDlMultipleMOCompleted;
+		       }
+            else if(dlState  == EHttpDlFailed )
+		       {
+		       dlState  = EHttpDlMultipleMOFailed;
+		       }
+           
+            if(dlState == EHttpDlInprogress || dlState == EHttpDlPaused )
+        	    {
+        	    User::LeaveIfError( (iRegistryModel.DownloadMgr().CurrentDownloads().At(i))->Delete());
+        	    i--;
+        	    count--;
+        	    }
+        	}
+        CLOG_LEAVEFN("CUserInteractionsUtils::CancelAllWithUserConfirmL");
+        return ETrue; // Cancelled
+        }
+    else
+        {
+        // Do nothing.
+        CLOG_LEAVEFN("CUserInteractionsUtils::CancelAllWithUserConfirmL");
+        return EFalse;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::CancelCancelConfirmationDialog
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::CancelCancelConfirmationDialog()
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::CancelCancelConfirmationDialog");
+    delete iCancelConfirmDlg;
+    iCancelConfirmDlg = 0;
+    CLOG_LEAVEFN("CUserInteractionsUtils::CancelCancelConfirmationDialog");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::ShowMediaRemovedNoteL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::ShowMediaRemovedNoteL()
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::ShowMediaRemovedNoteL");
+    if ( iMediaRemovedNote == 0 )
+        {
+        HBufC* value = iCoeEnv.AllocReadResourceLC
+                        ( R_DMUL_ERROR_EXT_MEM_REMOVED );
+        iMediaRemovedNote = 
+            new (ELeave) CAknInformationNote( &iMediaRemovedNote );
+        iMediaRemovedNote->ExecuteLD( *value );
+        CleanupStack::PopAndDestroy( value ); // value
+        }
+    CLOG_LEAVEFN("CUserInteractionsUtils::ShowMediaRemovedNoteL");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::CancelMediaRemovedNote
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::CancelMediaRemovedNote()
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::CancelMediaRemovedNote");
+    if ( iMediaRemovedNote != 0 )
+        {
+        delete iMediaRemovedNote;
+        iMediaRemovedNote = 0;
+        }
+    CLOG_LEAVEFN("CUserInteractionsUtils::CancelMediaRemovedNote");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::GetAndSetHttpAuthCredentialsL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::GetAndSetHttpAuthCredentialsL
+    ( RHttpDownload& aDownload )
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::GetAndSetHttpAuthCredentialsL");
+    
+    HBufC* username = 0;
+    HBufC* password = 0;
+
+    // Get the authentication scheme
+    TInt32 authScheme(0);
+    User::LeaveIfError( aDownload.GetIntAttribute
+                        ( EDlAttrAuthScheme, authScheme ) );
+    CLOG_WRITE_FORMAT(" EDlAttrAuthScheme: %d",authScheme);
+
+    // Get the default (already set) username and other stuff
+    HBufC* userName = HBufC::NewLC( KMaxDefAttrLength );
+    TPtr userNamePtr = userName->Des();
+    TInt getErr = aDownload.GetStringAttribute
+                    ( EDlAttrUsername, userNamePtr );
+    if ( getErr != KErrNone && getErr != KErrNotFound )
+        { // KErrNotFound is also allowed. In this case it has not been set.
+        User::LeaveIfError( getErr );
+        }
+    HBufC* url = HBufC::NewLC( KMaxUrlLength );
+    TPtr urlPtr = url->Des();
+    User::LeaveIfError( aDownload.GetStringAttribute
+                        ( EDlAttrReqUrl, urlPtr ) );
+    // URL must be set!
+    HBufC* realm = HBufC::NewLC( KMaxRealmLength );
+    TPtr realmPtr = realm->Des();
+    getErr = aDownload.GetStringAttribute( EDlAttrRealm, realmPtr );
+    if ( getErr != KErrNone && getErr != KErrNotFound )
+        { // KErrNotFound is also allowed. In this case it has not been set.
+        User::LeaveIfError( getErr );
+        }
+
+    // Execute a wait dialog
+    TBool resp = iDialogsProv->DialogUserAuthenticationLC
+            ( *url, *realm, *userName, username, password, 
+              authScheme == EAuthBasic );
+
+    if ( resp )
+        {
+        if ( authScheme == EAuthBasic && BrowserSettingSecWarningL() )
+            {
+            resp = DisplaySecurityWarningL();
+            }
+        if ( resp )
+            {
+            // Set credentials...
+            User::LeaveIfError( aDownload.SetStringAttribute
+                        ( EDlAttrUsername, *username ) );
+            User::LeaveIfError( aDownload.SetStringAttribute
+                        ( EDlAttrPassword, *password ) );
+            }
+        }
+
+    CleanupStack::PopAndDestroy( 2 ); // username, password
+    CleanupStack::PopAndDestroy( realm ); // realm
+    CleanupStack::PopAndDestroy( url ); // url
+    CleanupStack::PopAndDestroy( userName ); // userName
+    
+    CLOG_LEAVEFN("CUserInteractionsUtils::GetAndSetHttpAuthCredentialsL");
+    return ( resp );
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::GetAndSetProxyAuthCredentialsL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::GetAndSetProxyAuthCredentialsL
+    ( RHttpDownload& aDownload )
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::GetAndSetProxyAuthCredentialsL");
+    
+    HBufC* username = 0;
+    HBufC* password = 0;
+
+    // Get the authentication scheme
+    TInt32 authScheme(0);
+    User::LeaveIfError( aDownload.GetIntAttribute
+                        ( EDlAttrAuthScheme, authScheme ) );
+    CLOG_WRITE_FORMAT(" EDlAttrAuthScheme: %d",authScheme);
+
+    // Get the default (already set) username and other stuff
+    HBufC* userName = HBufC::NewLC( KMaxDefAttrLength );
+    TPtr userNamePtr = userName->Des();
+    User::LeaveIfError( aDownload.GetStringAttribute
+                ( EDlAttrProxyUsername, userNamePtr ) );
+    HBufC* url = HBufC::NewLC( KMaxUrlLength );
+    TPtr urlPtr = url->Des();
+    User::LeaveIfError( aDownload.GetStringAttribute
+                ( EDlAttrReqUrl, urlPtr ) );
+    HBufC* realm = HBufC::NewLC( KMaxRealmLength );
+    TPtr realmPtr = realm->Des();
+    User::LeaveIfError( aDownload.GetStringAttribute
+                ( EDlAttrProxyRealm, realmPtr ) );
+
+    // Execute a wait dialog
+    TBool resp = iDialogsProv->DialogUserAuthenticationLC
+            ( *url, *realm, *userName, username, password, 
+              authScheme == EAuthBasic );
+
+    if ( resp )
+        {
+        if ( authScheme == EAuthBasic && BrowserSettingSecWarningL() )
+            {
+            resp = DisplaySecurityWarningL();
+            }
+        if ( resp )
+            {
+            // Set credentials...
+            User::LeaveIfError( aDownload.SetStringAttribute
+                        ( EDlAttrProxyUsername, *username ) );
+            User::LeaveIfError( aDownload.SetStringAttribute
+                        ( EDlAttrProxyPassword, *password ) );
+            }
+        }
+
+    CleanupStack::PopAndDestroy( 2 ); // username, password
+    CleanupStack::PopAndDestroy( realm ); // realm
+    CleanupStack::PopAndDestroy( url ); // url
+    CleanupStack::PopAndDestroy( userName ); // userName
+    
+    CLOG_LEAVEFN("CUserInteractionsUtils::GetAndSetProxyAuthCredentialsL");
+    return ( resp );
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::CancelCredentialsQueries
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::CancelCredentialsQueries()
+    {
+    if ( iDialogsProv )
+        {
+        iDialogsProv->CancelAll();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::DisplaySecurityWarningL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::DisplaySecurityWarningL()
+    {
+    TBool resp = EFalse;
+
+    // Set up the message text
+    HBufC* message = StringLoader::LoadLC
+                     ( R_DMUL_QUERY_BASIC_AUTHENTICATION );
+    HBufC* okMsg = StringLoader::LoadLC( R_DMUL_OK_BUTTON );
+    HBufC* cancelMsg = StringLoader::LoadLC( R_DMUL_CANCEL_BUTTON );
+
+    resp = iDialogsProv->DialogConfirmL
+           ( KNullDesC, *message, *okMsg, *cancelMsg );
+
+    // Clean up the basic authentication dialog memory
+    CleanupStack::PopAndDestroy( 3, message ); 
+        // message, okMsg, cancelMsg
+
+    return resp;
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::CancelSecurityWarning
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::CancelSecurityWarning()
+    {
+    if ( iDialogsProv )
+        {
+        iDialogsProv->CancelAll();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::BrowserSettingSecWarningL
+// This method must behave the same as 
+// CBrowserSettings::GetHttpSecurityWarnings().
+// See CBrowserSettings !
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::BrowserSettingSecWarningL()
+    {
+    //todo
+    return 1;
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::InitializeSoftNotifStndL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::InitializeSoftNotifStndL( TVwsViewId aViewId, 
+                                                       TUid aCustomMessageId, 
+                                                       const TDesC8& aViewActivationMsg ) const
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::InitializeSoftNotifStndL");
+
+    CAknSoftNotificationParameters* params = 
+        CAknSoftNotificationParameters::NewL
+        (
+        iDMgrUiBase.ResourceFileName(), R_DMUL_GSN_STND, KMinimumSoftNotePriority, 
+        R_AVKON_SOFTKEYS_YES_NO__YES, 
+        CAknNoteDialog::EConfirmationTone, aViewId, aCustomMessageId, 
+        EAknSoftkeyYes, aViewActivationMsg 
+        );
+    CLOG_WRITE(" params OK");
+    CleanupStack::PushL( params );
+
+    iSoftNotifier->AddCustomNotificationL( *params );
+
+    CleanupStack::PopAndDestroy( params ); // params
+
+    CLOG_LEAVEFN("CUserInteractionsUtils::InitializeSoftNotifStndL");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::InitializeSoftNotifEmbL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::InitializeSoftNotifEmbL( TVwsViewId aViewId, 
+                                                      TUid aCustomMessageId, 
+                                                      const TDesC8& aViewActivationMsg ) const
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::InitializeSoftNotifEmbL");
+
+    CAknSoftNotificationParameters* params = 
+        CAknSoftNotificationParameters::NewL
+        (
+        iDMgrUiBase.ResourceFileName(), R_DMUL_GSN_EMB, KMinimumSoftNotePriority, 
+        R_AVKON_SOFTKEYS_YES_NO__YES, 
+        CAknNoteDialog::EConfirmationTone, aViewId, aCustomMessageId, 
+        EAknSoftkeyYes, aViewActivationMsg 
+        );
+    CLOG_WRITE(" params OK");
+    CleanupStack::PushL( params );
+
+    iSoftNotifier->AddCustomNotificationL( *params );
+
+    CleanupStack::PopAndDestroy( params ); // params
+
+    CLOG_LEAVEFN("CUserInteractionsUtils::InitializeSoftNotifEmbL");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::CancelSoftNotifStndL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::CancelSoftNotifStndL( TVwsViewId aViewId, 
+                                                  TUid aCustomMessageId, 
+                                                  const TDesC8& aViewActivationMsg ) const
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::CancelSoftNotifStndL");
+
+    CAknSoftNotificationParameters* params = 
+        CAknSoftNotificationParameters::NewL
+        (
+        iDMgrUiBase.ResourceFileName(), R_DMUL_GSN_STND, KMinimumSoftNotePriority, 
+        R_AVKON_SOFTKEYS_YES_NO__YES, 
+        CAknNoteDialog::EConfirmationTone, aViewId, aCustomMessageId, 
+        EAknSoftkeyYes, aViewActivationMsg 
+        );
+    CLOG_WRITE(" params OK");
+    CleanupStack::PushL( params );
+
+    //TODO From avkon sources it seems that it identifies the soft notification
+    // with the AVKON_NOTE resource ID, which is the same in case of 
+    // all UI Lib clients!!
+    iSoftNotifier->CancelCustomSoftNotificationL( *params );
+
+    CleanupStack::PopAndDestroy( params ); // params
+
+    CLOG_LEAVEFN("CUserInteractionsUtils::CancelSoftNotifStndL");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::CancelSoftNotifEmbL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::CancelSoftNotifEmbL( TVwsViewId aViewId, 
+                                                 TUid aCustomMessageId, 
+                                                 const TDesC8& aViewActivationMsg ) const
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::CancelSoftNotifEmbL");
+
+    CAknSoftNotificationParameters* params = 
+        CAknSoftNotificationParameters::NewL
+        (
+        iDMgrUiBase.ResourceFileName(), R_DMUL_GSN_EMB, KMinimumSoftNotePriority, 
+        R_AVKON_SOFTKEYS_YES_NO__YES, 
+        CAknNoteDialog::EConfirmationTone, aViewId, aCustomMessageId, 
+        EAknSoftkeyYes, aViewActivationMsg 
+        );
+    CLOG_WRITE(" params OK");
+    CleanupStack::PushL( params );
+
+    iSoftNotifier->CancelCustomSoftNotificationL( *params );
+
+    CleanupStack::PopAndDestroy( params ); // params
+
+    CLOG_LEAVEFN("CUserInteractionsUtils::CancelSoftNotifEmbL");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::CancelAllDialogs
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::CancelAllDialogs()
+    {
+    if ( iDialogsProv )
+        {
+        iDialogsProv->CancelAll();
+        delete iDialogsProv;
+        iDialogsProv = 0;
+        }
+    CancelMemorySelectionDialog();
+    CancelFileSelectionDialog();
+    CancelDeleteConfirmationDialog();
+    CancelCancelConfirmationDialog();
+    CancelMediaRemovedNote();
+    CancelCredentialsQueries();
+    CancelSecurityWarning();
+    // The soft notifications should not be cancelled here, 
+    // because they are used in a different context.
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::InfoNoteL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::InfoNoteL( TInt aDialogResourceId, const TInt aPromptResourceId )
+    {
+    HBufC* prompt = StringLoader::LoadLC( aPromptResourceId );
+    InfoNoteL( aDialogResourceId, *prompt );
+    CleanupStack::PopAndDestroy();  // prompt
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::InfoNoteL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::InfoNoteL( TInt aDialogResourceId, const TDesC& aPrompt )
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::InfoNoteL");
+    
+    CAknNoteDialog* dialog = new (ELeave) CAknNoteDialog
+								( REINTERPRET_CAST( CEikDialog**, &dialog ) );
+	CLOG_WRITE(" new");
+    dialog->PrepareLC( aDialogResourceId ) ;
+    CLOG_WRITE(" PrepareLC");
+    dialog->SetCurrentLabelL( EGeneralNote, aPrompt );
+    CLOG_WRITE(" SetCurrentLabelL");
+    dialog->RunDlgLD( CAknNoteDialog::ELongTimeout, CAknNoteDialog::ENoTone );
+    
+    CLOG_LEAVEFN("CUserInteractionsUtils::InfoNoteL");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::IsUiBusy
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::IsUiBusy() const
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::IsUiBusy");
+    CLOG_WRITE_FORMAT(" MS: %x", iMemSelectionDialog);
+    CLOG_WRITE_FORMAT(" FS: %x", iFileSelectionDialog);
+    CLOG_LEAVEFN("CUserInteractionsUtils::IsUiBusy");
+    return (IsDocHandlerRunning() || iMemSelectionDialog!=0 || iFileSelectionDialog!=0);
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::IsDocHandlerRunning
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::IsDocHandlerRunning() const
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::IsDocHandlerRunning");
+    CLOG_WRITE_FORMAT(" %x", iDocHandler);
+    CLOG_WRITE_FORMAT(" %d", iDocHandlerUsesTheUi);
+    CLOG_LEAVEFN("CUserInteractionsUtils::IsDocHandlerRunning");
+    return iDocHandlerUsesTheUi;
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::IsCorruptedDcfL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::IsCorruptedDcfL
+    ( RHttpDownload& aDownload ) const
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::IsCorruptedDcfL");
+    TBool isCorruptedDcf( EFalse );
+
+    DRMCommon* drmCommon = DRMCommon::NewL();
+    CLOG_WRITE(" DRMCommon::NewL OK");
+    CleanupStack::PushL( drmCommon );
+    User::LeaveIfError( drmCommon->Connect() );
+    CLOG_WRITE(" Connect OK");
+
+    HBufC* fileName = HBufC::NewLC( KMaxPath );
+    TPtr fileNamePtr = fileName->Des();
+    User::LeaveIfError
+        ( aDownload.GetStringAttribute( EDlAttrDestFilename, fileNamePtr ) );
+    CLOG_WRITE_FORMAT(" EDlAttrDestFilename: %S",&fileNamePtr);
+
+    DRMCommon::TContentProtection prot;
+    HBufC8* mimeType = 0;
+    HBufC8* contentURI = 0;
+    TUint dataLength = 0;
+    TInt err = drmCommon->GetFileInfo( *fileName, 
+        prot, mimeType, contentURI, dataLength );
+    
+    if ( err == DRMCommon::EVersionNotSupported || 
+         ( err == DRMCommon::EOk && ( !mimeType || !contentURI ) ) )
+        {
+        isCorruptedDcf = ETrue;
+        }
+        
+    delete mimeType;
+    delete contentURI;
+    CleanupStack::PopAndDestroy( fileName );
+    CleanupStack::PopAndDestroy( drmCommon );
+
+    CLOG_WRITE_FORMAT(" ret: %d",isCorruptedDcf);
+    CLOG_LEAVEFN("CUserInteractionsUtils::IsCorruptedDcfL");
+    return isCorruptedDcf;
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::IsBadMimeInDcfL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::IsBadMimeInDcfL
+    ( RHttpDownload& aDownload ) const
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::IsBadMimeInDcfL");
+    TBool isBadMimeInDcfL( EFalse );
+
+    DRMCommon* drmCommon = DRMCommon::NewL();
+    CLOG_WRITE(" DRMCommon::NewL OK");
+    CleanupStack::PushL( drmCommon );
+    User::LeaveIfError( drmCommon->Connect() );
+    CLOG_WRITE(" Connect OK");
+
+    HBufC* fileName = HBufC::NewLC( KMaxPath );
+    TPtr fileNamePtr = fileName->Des();
+    User::LeaveIfError
+        ( aDownload.GetStringAttribute( EDlAttrDestFilename, fileNamePtr ) );
+    CLOG_WRITE_FORMAT(" EDlAttrDestFilename: %S",&fileNamePtr);
+
+    DRMCommon::TContentProtection prot;
+    HBufC8* mimeType = 0;
+    HBufC8* contentURI = 0;
+    TUint dataLength = 0;
+    TInt err = drmCommon->GetFileInfo( *fileName, 
+        prot, mimeType, contentURI, dataLength );
+    
+    if ( err == DRMCommon::EOk )
+        {
+        if ( !mimeType || !contentURI )
+            {
+            isBadMimeInDcfL = ETrue;
+            }
+        else if ( mimeType->CompareF( KOma1DcfContentType ) == KErrNone )
+            {
+            // The MIME type in the DCF is also DCF, which is wrong.
+            // It should contain the real mime type.
+            isBadMimeInDcfL = ETrue;
+            }
+        }
+        
+    delete mimeType;
+    delete contentURI;
+    CleanupStack::PopAndDestroy( fileName );
+    CleanupStack::PopAndDestroy( drmCommon );
+
+    CLOG_WRITE_FORMAT(" ret: %d",isBadMimeInDcfL);
+    CLOG_LEAVEFN("CUserInteractionsUtils::IsBadMimeInDcfL");
+    return isBadMimeInDcfL;
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::DownloadHasBeenDeleted
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::DownloadHasBeenDeleted( RHttpDownload* aDownload )
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::DownloadHasBeenDeleted");
+    if ( iHandledDownload == aDownload )
+        {
+        iHandledDownload = 0;
+        }
+    CLOG_LEAVEFN("CUserInteractionsUtils::DownloadHasBeenDeleted");
+    }
+
+ 
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::LaunchPdAppL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::LaunchPdAppL( RHttpDownload& aDownload, const TBool aProgressively )
+    {
+    CLOG_ENTERFN("CUserInteractionsEventHandler::LaunchPdAppL");
+
+    // Get the PD player application's UID for the download
+    TUid pdPlayerUid = { 0 };    
+    HBufC8* contentType = ContentTypeL( aDownload, ETrue, KFirstMoIndex );
+    TDataType dataType( *contentType );
+    delete contentType;
+    contentType = NULL;
+
+    CDocumentHandler* docHandler = CDocumentHandler::NewLC();
+    TBool pdSupported = docHandler->CanHandleProgressivelyL( dataType, pdPlayerUid );
+    CleanupStack::PopAndDestroy( docHandler ); // docHandler
+    
+    if ( pdSupported )
+        {
+        
+        TInt downloadCnt = iRegistryModel.DownloadCount();
+        TBool isProg(EFalse);
+        
+        const CDownloadArray& downloads = iRegistryModel.DownloadMgr().CurrentDownloads();
+        
+        for ( TInt i = 0; i < downloadCnt ;i++ )
+			{
+        	RHttpDownload* dl = downloads.At(i); //current download
+        	dl->GetBoolAttribute( EDlAttrProgressive, isProg );
+        	if (isProg ) 
+				{
+                dl->SetBoolAttribute( EDlAttrProgressive, EFalse );
+                }
+			}
+      
+        TInt32 numMediaObjects = 0;
+        User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrNumMediaObjects, numMediaObjects ) );
+        
+        // Pack download ID into EGenericParamDownloadId.
+        TInt32 downloadID( -1 );
+        TInt32 activeDownloadID(-1);
+        if ( aProgressively )
+            {
+            User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrId, downloadID ) );        	
+            User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrActiveDownload, activeDownloadID ) );       	
+            }
+
+        
+        CAiwGenericParamList* genParList = CAiwGenericParamList::NewLC();
+        TAiwVariant downloadIdVariant( downloadID );
+        TAiwGenericParam genericParam( EGenericParamDownloadId, downloadIdVariant );
+        genParList->AppendL( genericParam );
+
+		// Pack fileName into EGenericParamFile
+		HBufC* fileName = HBufC::NewLC( KMaxPath );
+		TPtr fileNamePtr = fileName->Des();
+		    // Get first track's name in case of album
+		if (numMediaObjects > KFirstMoIndex)
+		    User::LeaveIfError( aDownload.GetStringAttribute( EDlAttrDestFilename, KFirstMoIndex, fileNamePtr ) );
+		else
+		    User::LeaveIfError( aDownload.GetStringAttribute( EDlAttrDestFilename, fileNamePtr ) );
+		
+        // check if file exists, if does not , don't continue
+        if ( !IsDuplicateL( fileNamePtr ) )
+            {
+            HBufC* infoPrompt = StringLoader::LoadLC( R_DMUL_ERROR_FILE_NOT_FOUND);
+            CAknInformationNote* note = new(ELeave)  CAknInformationNote();
+            note->ExecuteLD(*infoPrompt);
+            CleanupStack::PopAndDestroy(infoPrompt);	
+
+    		CleanupStack::PopAndDestroy( fileName );
+            CleanupStack::PopAndDestroy( genParList );
+
+            return;
+            }
+		
+
+		TAiwVariant fileNameVariant( fileNamePtr );
+		TAiwGenericParam fileNameParam( EGenericParamFile, fileNameVariant );
+		genParList->AppendL( fileNameParam ); 	
+        
+    	
+    	// Since we don't have the EGenericParamId for track index we are using EGenericParamUnspecified.
+    	// Once we get the generic parameter for the id in future,this will be changed.
+        TAiwVariant activeIndexVariant( activeDownloadID );
+        TAiwGenericParam activeIndexParam( EGenericParamUnspecified, activeIndexVariant );
+        genParList->AppendL( activeIndexParam );       
+        
+        HBufC8* param8 = HBufC8::NewLC( KMinLength ); // Must be large enough!!
+        TPtr8 paramPtr8 = param8->Des();
+        RDesWriteStream writeStream( paramPtr8 );
+
+        genParList->ExternalizeL( writeStream );
+
+        writeStream.CommitL();
+        writeStream.Close();
+
+		//Instead of Selecting topmost task matching the UID from all the tasks, opening the standalone application
+        CAknTaskList *taskList = CAknTaskList::NewL(CEikonEnv::Static()->WsSession());
+        TApaTask task = taskList->FindRootApp(pdPlayerUid);
+        TInt result = aDownload.SetBoolAttribute( EDlAttrProgressive, ETrue );
+    
+        if ( task.Exists() )
+            {
+            task.BringToForeground();
+            // 8-bit buffer is required. 
+            task.SendMessage( TUid::Uid( 0 ), *param8 ); // Uid is not used
+            }
+        else 
+            {
+            HBufC* param = HBufC::NewLC( param8->Length() );
+            param->Des().Copy( *param8 );
+            
+            RApaLsSession appArcSession;
+            User::LeaveIfError( appArcSession.Connect() );
+            CleanupClosePushL( appArcSession );
+            TThreadId id;
+            User::LeaveIfError
+                (
+                    appArcSession.StartDocument( *param, pdPlayerUid, id )
+                );
+            if( aProgressively )
+                {
+                User::LeaveIfError( aDownload.SetIntAttribute( EDlAttrActivePlayedDownload, activeDownloadID ) );
+                }            
+            CleanupStack::PopAndDestroy( &appArcSession );
+            CleanupStack::PopAndDestroy( param );
+            }
+
+        CleanupStack::PopAndDestroy( param8 );
+		CleanupStack::PopAndDestroy( fileName );
+        CleanupStack::PopAndDestroy( genParList );
+        }
+    
+    CLOG_LEAVEFN("CUserInteractionsEventHandler::LaunchPdAppL");    
+    }
+
+
+#ifdef __DMGR_PD_TESTHARNESS
+// -----------------------------------------------------------------------------
+// CUserInteractionsEventHandler::TestLaunchPdAppL
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::TestLaunchPdAppL( RHttpDownload& aDownload )
+    {
+    CLOG_ENTERFN("CUserInteractionsEventHandler::TestLaunchPdAppL");
+
+    const TUid KTestPdPlayerUid = { 0x01FFDAAC };
+
+    // Pack download ID into EGenericParamDownloadId
+    TInt32 downloadID( 0 );
+    User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrId, downloadID ) );
+
+    CAiwGenericParamList* genParList = CAiwGenericParamList::NewLC();
+    TAiwVariant downloadIdVariant( downloadID );
+    TAiwGenericParam downloadIdParam( EGenericParamDownloadId, downloadIdVariant );
+    genParList->AppendL( downloadIdParam );
+
+    // Pack fileName into EGenericParamFile
+    HBufC* fileName = HBufC::NewLC( KMaxPath );
+    TPtr fileNamePtr = fileName->Des();
+    User::LeaveIfError( aDownload.GetStringAttribute( EDlAttrDestFilename, fileNamePtr ) );
+
+    TAiwVariant fileNameVariant( fileNamePtr );
+    TAiwGenericParam fileNameParam( EGenericParamFile, fileNameVariant );
+    genParList->AppendL( fileNameParam );	
+
+    HBufC8* param8 = HBufC8::NewLC( KMinLength );
+    TPtr8 paramPtr8 = param8->Des();
+    RDesWriteStream writeStream( paramPtr8 );
+
+    genParList->ExternalizeL( writeStream );
+
+    writeStream.CommitL();
+    writeStream.Close();
+
+	TApaTaskList taskList( CEikonEnv::Static()->WsSession() );
+    TApaTask task = taskList.FindApp( KTestPdPlayerUid );
+    TInt result = aDownload.SetBoolAttribute( EDlAttrProgressive, ETrue );
+
+    if ( task.Exists() )
+        {
+        // 8-bit buffer is required. 
+        task.SendMessage( TUid::Uid( 0 ), *param8 ); // Uid is not used
+        task.BringToForeground();
+        }
+    else 
+        {
+        HBufC* param = HBufC::NewLC( param8->Length() );
+        param->Des().Copy( *param8 );
+        
+        RApaLsSession appArcSession;
+        User::LeaveIfError( appArcSession.Connect() );
+        CleanupClosePushL( appArcSession );
+        TThreadId id;
+
+        User::LeaveIfError(appArcSession.StartDocument( *param, KTestPdPlayerUid, id ));
+	
+        CleanupStack::PopAndDestroy( &appArcSession );
+        CleanupStack::PopAndDestroy( param );
+        }
+
+    CleanupStack::PopAndDestroy( param8 );
+    CleanupStack::PopAndDestroy( fileName );
+    CleanupStack::PopAndDestroy( genParList );
+    
+    CLOG_LEAVEFN("CUserInteractionsEventHandler::TestLaunchPdAppL");
+    }
+    
+#endif // __DMGR_PD_TESTHARNESS
+
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::HandleServerAppExit
+// -----------------------------------------------------------------------------
+//
+void CUserInteractionsUtils::HandleServerAppExit( TInt aReason )
+    {
+    CLOG_ENTERFN("CUserInteractionsUtils::HandleServerAppExit");
+    CLOG_WRITE_FORMAT(" aReason: %d", aReason);
+
+    // DocHandler has finished its task. 
+    iDocHandlerUsesTheUi = EFalse;
+    // Schedule the next download:
+#ifdef _DEBUG
+    TRAPD( scheduleErr, iRegistryModel.UserInteractions().SchedulePostponedDownloadL() );
+    CLOG_WRITE_FORMAT(" scheduleErr: %d", scheduleErr);
+#else
+    TRAP_IGNORE( iRegistryModel.UserInteractions().SchedulePostponedDownloadL() );
+#endif // _DEBUG
+    
+    if ( iHandlerObserver )
+        {
+        iHandlerObserver->NotifyHandlerExit( iHandledDownload, aReason );
+        }
+        
+    CLOG_LEAVEFN("CUserInteractionsUtils::HandleServerAppExit");
+    }
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::IsNetworkPdCompatibleL()
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::IsNetworkPdCompatibleL() const
+    {
+    CLOG_ENTERFN("CUserInteractionsEventHandler::IsNetworkPdCompatibleL");
+    // This method must not be called if 2G/3G distinction is not supported;
+    // the RMobilePhone-related classes are not open in that case.
+
+    TBool isNetworkPdCompatible( EFalse );
+
+#if !defined( __WINS__ )
+	// this initialization needed for identifying 3G networks
+    RTelServer  telServer;
+    RMobilePhone    mobilePhone;
+
+    RMobilePhone::TMobilePhoneNetworkMode networkMode;	
+    User::LeaveIfError( telServer.Connect() );
+    User::LeaveIfError( telServer.LoadPhoneModule( KMmTsyModuleName ) );
+
+    TInt numPhones;
+    User::LeaveIfError( telServer.EnumeratePhones( numPhones ) );
+    if( numPhones <= 0 )
+        {
+        User::Leave( KErrCorrupt );
+        }
+
+    RTelServer::TPhoneInfo phoneInfo;
+    User::LeaveIfError( telServer.GetPhoneInfo( 0, phoneInfo ) );
+    User::LeaveIfError( mobilePhone.Open( telServer, phoneInfo.iName ) );
+    User::LeaveIfError( mobilePhone.Initialise() );
+
+    User::LeaveIfError( mobilePhone.GetCurrentMode( networkMode ) );
+
+    TBool isWlan = GetWlanAvailabilityL();
+    if( (networkMode != RMobilePhone::ENetworkModeGsm) || (networkMode == RMobilePhone::ENetworkModeGsm && isWlan))
+        {
+        isNetworkPdCompatible = ETrue;
+        }
+
+    mobilePhone.Close();
+    telServer.Close();
+
+	isNetworkPdCompatible = ETrue;
+#else
+	isNetworkPdCompatible = ETrue;
+#endif
+    CLOG_LEAVEFN("CUserInteractionsEventHandler::IsNetworkPdCompatibleL");
+	return isNetworkPdCompatible;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::SendMsgTerminateToPdAppsL
+// -----------------------------------------------------------------------------
+//
+
+void CUserInteractionsUtils::SendMsgTerminateToPdAppsL()
+    {
+        CLOG_ENTERFN("CUserInteractionsEventHandler::SendMsgTerminateToPdAppsL");
+        // Pack EGenericParamTerminate.
+        TInt32 browserTerminate( 1 );
+        CAiwGenericParamList* genParList = CAiwGenericParamList::NewLC();
+        TAiwVariant terminateVariant( browserTerminate );
+        TAiwGenericParam genericParamTerm( EGenericParamTerminate, terminateVariant );
+        genParList->AppendL( genericParamTerm );
+        
+        HBufC8* param8 = HBufC8::NewLC( KMinLength ); // Must be large enough!!
+        TPtr8 paramPtr8 = param8->Des();
+        RDesWriteStream writeStream( paramPtr8 );
+
+        genParList->ExternalizeL( writeStream );
+
+        writeStream.CommitL();
+        writeStream.Close();
+        
+		TApaTaskList taskList( CEikonEnv::Static()->WsSession() );
+	    
+	    TBool isProgressive (EFalse);
+ 	    TInt downloadCnt = iRegistryModel.DownloadCount();
+ 	    const CDownloadArray& downloads = iRegistryModel.DownloadMgr().CurrentDownloads();
+ 	    TInt j ;
+ 	    for( j = 0; j < downloadCnt; ++j )
+ 	        {
+ 	        RHttpDownload* dl = downloads.At(j); // current download
+ 	        dl->GetBoolAttribute( EDlAttrProgressive, isProgressive );
+ 	        if(isProgressive)
+ 	            {
+ 	            break;                
+ 	            }
+ 	        } 
+	    for( TInt i = 0; i < KDocPDAppUidCount; i++ )
+	    {
+			TUid KTestPdPlayerUid = {KDocPDAppUidList[ i ]};
+			TApaTask task = taskList.FindApp(KTestPdPlayerUid );		// task for MP app    
+			if ( task.Exists() && isProgressive  )
+				{
+				RHttpDownload* dl = downloads.At(j); // current download
+                //This Atribute will tell if MP called Delete  				
+				//on exit of Browser				
+ 	            dl->SetBoolAttribute( EDlAttrProgressive, EFalse );
+				// 8-bit buffer is required. 
+				task.SendMessage( TUid::Uid( 0 ), *param8 ); // Uid is not used
+				task.BringToForeground();
+				}
+		}
+        CleanupStack::PopAndDestroy( param8 );
+        CleanupStack::PopAndDestroy( genParList );
+    
+        CLOG_LEAVEFN("CUserInteractionsEventHandler::SendMsgTerminateToPdAppsL");    
+
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUserInteractionsUtils::GetWlanAvailabilityL
+// -----------------------------------------------------------------------------
+//
+TBool CUserInteractionsUtils::GetWlanAvailabilityL() const
+    {
+    TRequestStatus status( KRequestPending );
+
+    // Connection monitor
+    RConnectionMonitor connMon;
+    CleanupClosePushL( connMon );
+    User::LeaveIfError( connMon.ConnectL() );
+
+    TConnMonIapInfoBuf infoBuf; 
+    infoBuf().iCount = 0;      
+    
+    // Get WLAN IAPs to infoBuf
+    connMon.GetPckgAttribute( EBearerIdWLAN ,0 , KIapAvailability, infoBuf, status );
+    User::WaitForRequest( status );    
+
+    CleanupStack::PopAndDestroy( &connMon ); 
+
+    if ( !status.Int() && infoBuf().iCount )
+        {
+        return ETrue;
+        } 
+    
+    return EFalse;
+    }    
+
+// ------------------------------------------------------------
+// CUserInteractionsUtils::CanLaunchAsProgDownload()
+// Check if several conditions are met for Progressive Playback 
+// ------------------------------------------------------------
+// 
+TBool CUserInteractionsUtils::CanLaunchAsProgDownload(
+    RHttpDownload& aDownload,
+    CDownloadMgrUiDownloadsList& dlList,
+    TBool isOma2Dl )
+    {
+    CLOG_ENTERFN( "CUserInteractionsUtils::CanLaunchAsProgDownload" );
+    TBool progDlOk( !dlList.IsOneProgressive() && IsNetworkPdCompatibleL() );
+    // if OMA 2 download, no need to check for DRM rights on the phone, as license was already acquired.
+    if( progDlOk && !isOma2Dl  )
+        {
+        TBool isDrmDl = DrmDownloadL( aDownload );
+        CLOG_WRITE_FORMAT( " :isDrmDl=%d", isDrmDl );
+        if( isDrmDl )
+            {
+            TBool prevRights( EFalse );
+            progDlOk = DrmRightsOnThePhoneL( aDownload, prevRights );
+            CLOG_WRITE_FORMAT( " :prevRights=%d", prevRights );
+            }
+        }
+    TInt32 pdTrack(0);
+    aDownload.GetIntAttribute(EDlAttrActivePlayedDownload,pdTrack);
+    if( pdTrack )
+        {
+        //SomeTrack is already being played
+        progDlOk = EFalse;
+        }
+    CLOG_WRITE_FORMAT( " :progDlOk=%d", progDlOk );
+    CLOG_LEAVEFN( "CUserInteractionsUtils::CanLaunchAsProgDownload" );
+    return progDlOk;
+    }
+
+// ---------------------------------------------------------
+// CUserInteractionsUtils::UpdateDCFRepositoryL()
+// Update saved file to DCFRepository  
+// ---------------------------------------------------------
+// 
+void CUserInteractionsUtils::UpdateDCFRepositoryL(
+    const TDesC& aFileName )
+    {
+    CLOG_ENTERFN( "CUserInteractionsUtils::UpdateDCFRepositoryL" );
+    CLOG_WRITE_FORMAT( " :aFileName=%S", &aFileName );
+    CDcfEntry* dcfEntry = NULL;
+    dcfEntry = CDcfEntry::NewL();    
+    CleanupStack::PushL( dcfEntry );
+    
+    CDcfRep* dcfRep = NULL;
+    dcfRep = CDcfRep::NewL();
+    CleanupStack::PushL( dcfRep );
+
+    dcfEntry->SetLocationL( aFileName, 0 );    
+    CLOG_WRITE(" : SetLocationL OK");
+    dcfRep->UpdateL( dcfEntry );
+    CLOG_WRITE(" :UpdateL OK");
+    CleanupStack::PopAndDestroy(2); // dcfEntry, dcfRep
+    CLOG_LEAVEFN("CUserInteractionsUtils::UpdateDCFRepositoryL");
+    }              
+    
+// ---------------------------------------------------------
+// CUserInteractionsUtils::IsCodDownload()
+// return true if its a COD DL  
+// ---------------------------------------------------------
+// 
+TBool CUserInteractionsUtils::IsCodDownload()
+    {
+    return iCodDownload;
+    }                
+
+// End of file.