--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadMgrUiDownloadsList.cpp Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,2537 @@
+/*
+* 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 Download Menu and Downloads List
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CDownloadMgrUiDownloadsList.h"
+#include "CDownloadMgrUiLibRegistry.h"
+#include "CDownloadMgrUiDownloadMenu.h"
+#include "CDownloadsListArray.h"
+#include "CDownloadsListDlg.h"
+#include "AsyncEventHandlerArray.h"
+#include "DMgrUiLibPanic.h"
+#include "DownloadMgrUiLib.hrh"
+#include "CUserInteractionsUtils.h"
+#include "UiLibLogger.h"
+#include "MDownloadHandlerObserver.h"
+#include <e32std.h>
+#include <e32def.h>
+#include <DownloadMgrUiLib.rsg>
+#include <DownloadMgrUiLib.mbg>
+#include <coemain.h>
+#include <eikmenup.h>
+#include <gulicon.h>
+#include <uikon.hrh>
+#include <AknServerApp.h>
+#include <UriUtils.h>
+#include <MGXFileManagerFactory.h>
+#include <CMGXFileManager.h>
+#include <MediaGalleryUID.h> //Gallery UIDs
+#include <DocumentHandler.h>
+#include "bautils.h"
+#include <BrowserUiSDKCRKeys.h>
+#include <aknnotewrappers.h>
+#include <StringLoader.h>
+#include <apgtask.h>
+
+
+
+
+// CONSTANTS
+const TInt KUpdateProgressInfoInterval = 2*1000000; // 2 sec
+
+_LIT8(KSisxContentType, "x-epoc/x-sisx-app");
+
+// FORWARD DECLARATIONS
+class CDownloadsListExecuter;
+
+// LOCAL FUNCTION PROTOTYPES
+
+/**
+* Find the given download in the model and give back the ui data and the index.
+* It returns 0, if the given download is not found in aListModel and aIndex is set to KErrNotFound!
+*/
+inline TDownloadUiData* FindDlUiData( CDownloadsListArray& aListModel,
+ RHttpDownload& aDownload,
+ TInt& aIndex );
+
+#ifdef __WINS__
+TInt AskIapIdL( TUint32& aId );
+#endif
+
+/**
+* Extension class.
+*/
+NONSHARABLE_CLASS( CDownloadsListExtension ) : public CBase,
+ public MDownloadHandlerObserver
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CDownloadsListExtension* NewL
+ ( CDownloadMgrUiDownloadsList& aDownloadsList );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CDownloadsListExtension();
+
+ public: // New functions
+
+ #ifdef __WINS__
+ void EnsureIapIdIsSetL();
+ #endif
+
+ /**
+ * Display the list of downloads now.
+ * @since Series 60 2.8
+ * @return -
+ */
+ void DisplayDownloadsListL();
+
+ /**
+ * Display the list of downloads in an active object's RunL.
+ * @since Series 60 3.0
+ * @return -
+ */
+ void DisplayDownloadsListAsynchronouslyL();
+
+ /**
+ * Display the list of downloads in an active object's RunL.
+ * @since Series 60 3.0
+ * @return -
+ */
+ void DisplayDownloadsListAsynchronouslyL( RHttpDownload& aHighlightDl );
+
+ /**
+ * Cancel displaying the list of downloads.
+ * @since Series 60 2.8
+ * @return -
+ */
+ void CancelDisplayingDownloadsList();
+
+ /**
+ * Is the List of Downloads visible?
+ * @since Series 60 2.8
+ * @return ETrue/EFalse
+ */
+ TBool IsDialogVisible() const;
+
+ /**
+ * Get a reference. Panics if null!
+ */
+ CDownloadsListExecuter& DlExecuter() const;
+
+ /**
+ * Cancel a progress info timer update.
+ */
+ void CancelProgressTimer();
+
+ /**
+ * Start a progress info timer update.
+ */
+ void StartProgressTimer();
+
+ protected: // Constructors
+
+ /**
+ * C++ default constructor.
+ */
+ CDownloadsListExtension( CDownloadMgrUiDownloadsList& aDownloadsList );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ protected: // From MDownloadHandlerObserver
+
+ virtual void NotifyHandlerExit( RHttpDownload* aDownload, TInt aReason );
+
+ public: // Data
+
+ CDownloadMgrUiDownloadsList& iDownloadsList;
+ CDownloadsListExecuter* iDownloadsListExecuter; ///< Owned.
+ TBool* iDeleted; ///< Used because of the wait popup list
+ TUint32 iIapId;
+ TBool iIapIdGotAndSet;
+
+ TBool iIsUpdateInfoAllowed;
+
+ private: //Data
+ CPeriodic* iUpdateProgressInfoTimer;
+
+ /*
+ * callback function for the UpdateProgressInfo
+ */
+ static TInt UpdateProgressInfoCallback(TAny* aPtr);
+ };
+
+
+
+NONSHARABLE_CLASS( CDownloadsListExecuter ) : public CActive
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CDownloadsListExecuter* NewL( CDownloadMgrUiDownloadsList& aDownloadsList,
+ CDownloadsListExecuter** aReferer );
+
+ /**
+ * Two-phased constructor.
+ */
+ static CDownloadsListExecuter* NewL( CDownloadMgrUiDownloadsList& aDownloadsList,
+ CDownloadsListExecuter** aReferer,
+ RHttpDownload& aHighlightDl );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CDownloadsListExecuter();
+
+ public: // New
+
+ /**
+ * Invoke RunL.
+ */
+ void Start();
+
+ /**
+ * Check if the dialog already exists.
+ */
+ TBool DialogExists() const;
+
+ /**
+ * Get a reference. Panics if null!
+ */
+ CDownloadsListDlg& Dialog() const;
+
+ /**
+ * Execute the dialog now (wait dialog).
+ */
+ void ExecuteLD();
+
+ private: // Constructors
+
+ /**
+ * C++ default constructor.
+ */
+ CDownloadsListExecuter( CDownloadMgrUiDownloadsList& aDownloadsList,
+ CDownloadsListExecuter** aReferer, RHttpDownload* aHighlightDl );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ private: // From CActive
+
+ void DoCancel();
+ void RunL();
+ TInt RunError(TInt aError);
+
+ private: // Data
+
+ CDownloadMgrUiDownloadsList& iDownloadsList;
+ TBool* iDeleted; ///< Used because of the wait popup list
+ CDownloadsListDlg* iDialog; ///< Not owned - only reference.
+ CDownloadsListExecuter** iReferer;
+ RHttpDownload* iHighlightDl; ///< Not owned.
+ TBool iProgressiveDownload;
+ };
+
+
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExecuter::CDownloadsListExecuter
+// -----------------------------------------------------------------------------
+//
+CDownloadsListExecuter::CDownloadsListExecuter
+ ( CDownloadMgrUiDownloadsList& aDownloadsList,
+ CDownloadsListExecuter** aReferer,
+ RHttpDownload* aHighlightDl )
+: CActive( CActive::EPriorityHigh ), // EPriorityHigh to be visible ASAP.
+ iDownloadsList( aDownloadsList ),
+ iReferer( aReferer ),
+ iHighlightDl( aHighlightDl )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExecuter::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExecuter::ConstructL()
+ {
+ iProgressiveDownload = iDownloadsList.IsProgressiveDownloadEnabled();
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExecuter::NewL
+// -----------------------------------------------------------------------------
+//
+CDownloadsListExecuter* CDownloadsListExecuter::NewL
+ ( CDownloadMgrUiDownloadsList& aDownloadsList, CDownloadsListExecuter** aReferer )
+ {
+ CDownloadsListExecuter* self =
+ new (ELeave) CDownloadsListExecuter( aDownloadsList, aReferer, 0 );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExecuter::NewL
+// -----------------------------------------------------------------------------
+//
+CDownloadsListExecuter* CDownloadsListExecuter::NewL
+ ( CDownloadMgrUiDownloadsList& aDownloadsList,
+ CDownloadsListExecuter** aReferer,
+ RHttpDownload& aHighlightDl )
+ {
+ CDownloadsListExecuter* self =
+ new (ELeave) CDownloadsListExecuter
+ ( aDownloadsList, aReferer, &aHighlightDl );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// Destructor
+CDownloadsListExecuter::~CDownloadsListExecuter()
+ {
+ CLOG_ENTERFN("CDownloadsListExecuter::~CDownloadsListExecuter");
+ Cancel();
+ if ( iDeleted != 0 )
+ {
+ *iDeleted = ETrue;
+ }
+ CLOG_LEAVEFN("CDownloadsListExecuter::~CDownloadsListExecuter");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExecuter::Start
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExecuter::Start()
+ {
+ CLOG_ENTERFN("CDownloadsListExecuter::Start");
+ if ( !IsActive() )
+ {
+ CLOG_WRITE(" not active");
+ SetActive();
+ TRequestStatus* p = &iStatus;
+ User::RequestComplete( p, KErrNone );
+ }
+ CLOG_LEAVEFN("CDownloadsListExecuter::Start");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExecuter::DialogExists
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadsListExecuter::DialogExists() const
+ {
+ return ( iDialog != 0 );
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExecuter::Dialog
+// -----------------------------------------------------------------------------
+//
+CDownloadsListDlg& CDownloadsListExecuter::Dialog() const
+ {
+ CLOG_WRITE_FORMAT(" iDialog: %x",iDialog);
+ return *iDialog;
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExecuter::ExecuteLD
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExecuter::ExecuteLD()
+ {
+ CLOG_ENTERFN("CDownloadsListExecuter::ExecuteLD");
+
+ delete iDialog;
+ iDialog = NULL;
+ iDialog = CDownloadsListDlg::NewL( iDownloadsList, iProgressiveDownload );
+ // No leaving functions before ExecuteLD!
+
+ // If there is download that should be highlighted:
+ if ( iHighlightDl )
+ {
+ iDialog->HighlightDownload( *iHighlightDl );
+ }
+
+ // Execute wait dialog... While it is running, 'this' can be deleted:
+ TBool deleted( EFalse );
+ iDeleted = &deleted;
+ TRAP_IGNORE( iDialog->ExecuteLD() );
+ iDeleted = 0; // No more needed.
+ CLOG_WRITE_FORMAT(" deleted: %d",deleted);
+ if ( deleted )
+ {
+ // Do not use any member of this object
+ }
+ else
+ {
+ iDialog = NULL;
+ // Reset owner pointer to this object.
+ if ( iReferer )
+ {
+ *iReferer = 0;
+ CLOG_WRITE(" referer set was to 0");
+ }
+ // and delete this
+ delete this;
+ }
+
+ CLOG_LEAVEFN("CDownloadsListExecuter::ExecuteLD");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExecuter::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExecuter::DoCancel()
+ {
+ CLOG_ENTERFN("CDownloadsListExecuter::DoCancel");
+ delete iDialog;
+ iDialog = 0;
+ CLOG_LEAVEFN("CDownloadsListExecuter::DoCancel");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExecuter::RunL
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExecuter::RunL()
+ {
+ ExecuteLD();
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExecuter::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CDownloadsListExecuter::RunError(TInt /*aError*/)
+ {
+ CLOG_ENTERFN("CDownloadsListExecuter::RunError");
+
+ // Reset owner pointer to this object.
+ if ( iReferer )
+ {
+ *iReferer = 0;
+ }
+ delete this;
+
+ CLOG_LEAVEFN("CDownloadsListExecuter::RunError");
+ return 0;
+ }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::CDownloadsListExtension
+// -----------------------------------------------------------------------------
+//
+CDownloadsListExtension::CDownloadsListExtension
+ ( CDownloadMgrUiDownloadsList& aDownloadsList )
+: iDownloadsList( aDownloadsList ),
+ iIapId( 0 ),
+ iIapIdGotAndSet( ETrue )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExtension::ConstructL()
+ {
+ iUpdateProgressInfoTimer = CPeriodic::NewL(CActive::EPriorityStandard + 1 );
+ iIsUpdateInfoAllowed = EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::NewL
+// -----------------------------------------------------------------------------
+//
+CDownloadsListExtension* CDownloadsListExtension::NewL
+ ( CDownloadMgrUiDownloadsList& aDownloadsList )
+ {
+ CDownloadsListExtension* self =
+ new (ELeave) CDownloadsListExtension( aDownloadsList );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// Destructor
+CDownloadsListExtension::~CDownloadsListExtension()
+ {
+ CLOG_ENTERFN("CDownloadsListExtension::~CDownloadsListExtension");
+ CancelProgressTimer();
+ delete iUpdateProgressInfoTimer;
+ delete iDownloadsListExecuter;
+ iDownloadsListExecuter = 0;
+ if ( iDeleted != 0 )
+ {
+ *(iDeleted) = ETrue;
+ }
+ CLOG_LEAVEFN("CDownloadsListExtension::~CDownloadsListExtension");
+ }
+
+#ifdef __WINS__
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::EnsureIapIdIsSetL
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExtension::EnsureIapIdIsSetL()
+ {
+ // We chanck iIapIdGotAndSet, because only one IAP ID can be
+ // set to a DownloadMgr session.
+ if ( !iIapIdGotAndSet )
+ {
+ iIapIdGotAndSet = AskIapIdL( iIapId );
+ if ( iIapIdGotAndSet )
+ {
+ User::LeaveIfError
+ ( iDownloadsList.iRegistryModel.DownloadMgr().SetIntAttribute
+ ( EDlMgrIap, (TInt32)iIapId ) );
+ }
+ }
+ }
+#endif
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::NotifyHandlerExit
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExtension::NotifyHandlerExit
+ ( RHttpDownload* /*aDownload*/, TInt aReason )
+ {
+ CLOG_ENTERFN("CDownloadsListExtension::NotifyHandlerExit");
+
+ // Propagate the event to the registered observer, too
+ if ( iDownloadsList.iServerAppExitObserver != 0 )
+ {
+ CLOG_WRITE(" Propagating event...");
+ iDownloadsList.iServerAppExitObserver->HandleServerAppExit( aReason );
+ }
+
+ CLOG_LEAVEFN("CDownloadsListExtension::NotifyHandlerExit");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::DisplayDownloadsListL
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExtension::DisplayDownloadsListL()
+ {
+ CLOG_ENTERFN("CDownloadsListExtension::DisplayDownloadsListL");
+
+ if ( iDownloadsListExecuter )
+ {
+ // Do nothing if visible?
+ CLOG_WRITE(" already visible");
+ }
+ else
+ {
+ iDownloadsListExecuter =
+ CDownloadsListExecuter::NewL( iDownloadsList, &iDownloadsListExecuter );
+ iDownloadsListExecuter->ExecuteLD();
+ }
+
+ CLOG_LEAVEFN("CDownloadsListExtension::DisplayDownloadsListL");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::DisplayDownloadsListAsynchronouslyL
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExtension::DisplayDownloadsListAsynchronouslyL()
+ {
+ CLOG_ENTERFN("CDownloadsListExtension::DisplayDownloadsListAsynchronouslyL");
+
+ if ( iDownloadsListExecuter )
+ {
+ // Do nothing if visible?
+ CLOG_WRITE(" already visible");
+ }
+ else
+ {
+ iDownloadsListExecuter =
+ CDownloadsListExecuter::NewL( iDownloadsList, &iDownloadsListExecuter );
+ iDownloadsListExecuter->Start();
+ }
+
+ CLOG_LEAVEFN("CDownloadsListExtension::DisplayDownloadsListAsynchronouslyL");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::DisplayDownloadsListAsynchronouslyL
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExtension::DisplayDownloadsListAsynchronouslyL
+ ( RHttpDownload& aHighlightDl )
+ {
+ CLOG_ENTERFN("CDownloadsListExtension::DisplayDownloadsListAsynchronouslyL2");
+
+ if ( iDownloadsListExecuter )
+ {
+ // Do nothing if visible?
+ CLOG_WRITE(" already visible");
+ }
+ else
+ {
+ iDownloadsListExecuter = CDownloadsListExecuter::NewL
+ ( iDownloadsList, &iDownloadsListExecuter, aHighlightDl );
+ iDownloadsListExecuter->Start();
+ }
+
+ CLOG_LEAVEFN("CDownloadsListExtension::DisplayDownloadsListAsynchronouslyL2");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::CancelDisplayingDownloadsList
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExtension::CancelDisplayingDownloadsList()
+ {
+ CLOG_ENTERFN("CDownloadsListExtension::CancelDisplayingDownloadsList");
+
+ if ( !iDownloadsListExecuter )
+ {
+ // Do nothing if not visible
+ CLOG_WRITE(" Not visible");
+ }
+ else
+ {
+ iDownloadsListExecuter->Cancel();
+ // Cancel() sets iDownloadsListExecuter to 0.
+ }
+
+ CLOG_LEAVEFN("CDownloadsListExtension::CancelDisplayingDownloadsList");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::IsDialogVisible
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadsListExtension::IsDialogVisible() const
+ {
+ TBool isDialogVisible = EFalse;
+ if ( iDownloadsListExecuter != 0 )
+ {
+ isDialogVisible = iDownloadsListExecuter->DialogExists();
+ }
+ return isDialogVisible;
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::DlExecuter
+// -----------------------------------------------------------------------------
+//
+CDownloadsListExecuter& CDownloadsListExtension::DlExecuter() const
+ {
+ CLOG_WRITE_FORMAT(" iDownloadsListExecuter: %x",iDownloadsListExecuter);
+ return *iDownloadsListExecuter;
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::StartProgressTimer
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExtension::StartProgressTimer()
+{
+ iUpdateProgressInfoTimer->Start(
+ 0,
+ KUpdateProgressInfoInterval,
+ TCallBack( UpdateProgressInfoCallback, this ) );
+}
+
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::CancelProgressTimer
+// -----------------------------------------------------------------------------
+//
+void CDownloadsListExtension::CancelProgressTimer()
+{
+ iUpdateProgressInfoTimer->Cancel();
+ iIsUpdateInfoAllowed = EFalse;
+}
+
+// -----------------------------------------------------------------------------
+// CDownloadsListExtension::UpdateProgressInfoCallback
+// callback function for the TimerUpdateProgressInfo
+// -----------------------------------------------------------------------------
+//
+TInt CDownloadsListExtension::UpdateProgressInfoCallback(TAny* aAny )
+{
+ CDownloadsListExtension* instance = (CDownloadsListExtension*) aAny;
+ instance->iIsUpdateInfoAllowed = ETrue;
+ return EFalse;
+}
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::CDownloadMgrUiDownloadsList
+// -----------------------------------------------------------------------------
+//
+CDownloadMgrUiDownloadsList::CDownloadMgrUiDownloadsList
+ ( CDownloadMgrUiLibRegistry& aRegistryModel )
+: CDownloadMgrUiBase( aRegistryModel ),
+ iIsVisible( EFalse ),
+ iIsCancelInProgress( EFalse )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::ConstructL()
+ {
+ CLOG_ENTERFN("CDownloadMgrUiDownloadsList::ConstructL");
+
+ BaseConstructL();
+ CLOG_WRITE(" BaseConstructL");
+ iExtension = CDownloadsListExtension::NewL( *this );
+ CLOG_WRITE(" iExtension");
+ iDownloadMenu = CDownloadMgrUiDownloadMenu::NewL( iCoeEnv );
+ CLOG_WRITE(" iDownloadMenu");
+ iUiUtils = CUserInteractionsUtils::NewL( *this, iRegistryModel );
+ CLOG_WRITE(" iUiUtils");
+ iEventHandlerArray = new(ELeave)CAsyncEventHandlerArray();
+ CLOG_WRITE(" iEventHandlerArray");
+ iIsTimerStarted = EFalse;
+ iProgressiveDownload = EFalse;
+ iRegistryModel.DownloadMgr().GetBoolAttribute(EDlMgrProgressiveDownload, iProgressiveDownload);
+ CLOG_LEAVEFN("CDownloadMgrUiDownloadsList::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::NewL
+// -----------------------------------------------------------------------------
+//
+CDownloadMgrUiDownloadsList* CDownloadMgrUiDownloadsList::NewL
+( CDownloadMgrUiLibRegistry& aRegistryModel )
+ {
+ CDownloadMgrUiDownloadsList* self =
+ new ( ELeave ) CDownloadMgrUiDownloadsList( aRegistryModel );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// Destructor
+CDownloadMgrUiDownloadsList::~CDownloadMgrUiDownloadsList()
+ {
+ CLOG_ENTERFN("CDownloadMgrUiDownloadsList::~CDownloadMgrUiDownloadsList");
+
+ CancelDisplayingDownloadsList();
+ delete iDialog;
+ iDialog = 0;
+ CLOG_WRITE(" iDialog");
+ delete iEventHandlerArray;
+ iEventHandlerArray = 0;
+ CLOG_WRITE(" iEventHandlerArray");
+ delete iListModel;
+ iListModel = NULL;
+ CLOG_WRITE(" iListModel");
+ delete iUiUtils;
+ iUiUtils = NULL;
+ CLOG_WRITE(" iUiUtils");
+ delete iDownloadMenu;
+ iDownloadMenu = NULL;
+ CLOG_WRITE(" iDownloadMenu");
+ // iExtension should be the last deleted.
+ delete iExtension;
+ iExtension = 0;
+ CLOG_WRITE(" iExtension");
+ delete iAIWServiceHandler;
+ CLOG_LEAVEFN("CDownloadMgrUiDownloadsList::~CDownloadMgrUiDownloadsList");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::DownloadMenu
+// -----------------------------------------------------------------------------
+//
+EXPORT_C
+CDownloadMgrUiDownloadMenu& CDownloadMgrUiDownloadsList::DownloadMenu() const
+ {
+ __ASSERT_DEBUG( iDownloadMenu, Panic( EUiLibPanNull ) );
+ return(*iDownloadMenu);
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::DisplayDownloadsListL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C
+void CDownloadMgrUiDownloadsList::DisplayDownloadsListL()
+ {
+ CLOG_ENTERFN("CDownloadMgrUiDownloadsList::DisplayDownloadsListL");
+
+ long noMediaDls = 0;
+ iRegistryModel.DownloadMgr().GetIntAttribute( EDlMgrNoMediaDls, noMediaDls );
+ TInt dlCount = iRegistryModel.DownloadMgr().CurrentDownloads().Count();
+
+ if (dlCount > noMediaDls)
+ iExtension->DisplayDownloadsListAsynchronouslyL();
+
+ CLOG_LEAVEFN("CDownloadMgrUiDownloadsList::DisplayDownloadsListL");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::DisplayDownloadsListL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::DisplayDownloadsListL
+ ( RHttpDownload& aHighlightDl )
+ {
+ CLOG_ENTERFN("CDownloadMgrUiDownloadsList::DisplayDownloadsListL aHighlightDl");
+ iExtension->DisplayDownloadsListAsynchronouslyL( aHighlightDl );
+ CLOG_LEAVEFN("CDownloadMgrUiDownloadsList::DisplayDownloadsListL aHighlightDl");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::CancelDisplayingDownloadsList
+// -----------------------------------------------------------------------------
+//
+EXPORT_C
+void CDownloadMgrUiDownloadsList::CancelDisplayingDownloadsList()
+ {
+ CLOG_ENTERFN("CDownloadMgrUiDownloadsList::CancelDisplayingDownloadsList");
+ delete iDialog;
+ iDialog = 0;
+ CLOG_WRITE(" iDialog");
+ iExtension->CancelDisplayingDownloadsList();
+ CLOG_LEAVEFN("CDownloadMgrUiDownloadsList::CancelDisplayingDownloadsList");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::IsVisible
+// -----------------------------------------------------------------------------
+//
+EXPORT_C
+TBool CDownloadMgrUiDownloadsList::IsVisible() const
+ {
+ return iExtension->IsDialogVisible();
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::Count
+// -----------------------------------------------------------------------------
+//
+EXPORT_C
+TInt CDownloadMgrUiDownloadsList::Count() const
+ {
+ return ((iListModel!=NULL)?iListModel->Count():0);
+ }
+
+// Not yet supported functions
+EXPORT_C
+void CDownloadMgrUiDownloadsList::GetIntAttributeL( const TUint /*aAttribute*/, TInt32& /*aValue*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+EXPORT_C
+void CDownloadMgrUiDownloadsList::GetBoolAttributeL( const TUint /*aAttribute*/, TBool& /*aValue*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+EXPORT_C
+void CDownloadMgrUiDownloadsList::GetStringAttributeL( const TUint /*aAttribute*/, TDes16& /*aValue*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+EXPORT_C
+void CDownloadMgrUiDownloadsList::GetStringAttributeL( const TUint /*aAttribute*/, TDes8& /*aValue*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+EXPORT_C
+void CDownloadMgrUiDownloadsList::SetIntAttributeL( const TUint /*aAttribute*/, TInt32 /*aValue*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+EXPORT_C
+void CDownloadMgrUiDownloadsList::SetBoolAttributeL( const TUint /*aAttribute*/, TBool /*aValue*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+EXPORT_C
+void CDownloadMgrUiDownloadsList::SetStringAttributeL( const TUint /*aAttribute*/, const TDesC16& /*aValue*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+EXPORT_C
+void CDownloadMgrUiDownloadsList::SetStringAttributeL( const TUint /*aAttribute*/, const TDesC8& /*aValue*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::AddDownloadsToListModelL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::AddDownloadsToListModelL
+( CDownloadsListArray& aLBModel, RHttpDownloadMgr& aDownloadMgr )
+ {
+ TInt downloads = aDownloadMgr.CurrentDownloads().Count();
+ for ( TInt i = 0; i < downloads; ++i )
+ {
+ RHttpDownload* download =
+ (RHttpDownload*)(aDownloadMgr.CurrentDownloads().At(i));
+ // Extract the necessary information from 'download' and
+ // add a list box item.
+ (void)AddDownloadToListModelL( aLBModel, *download );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::AddDownloadToListModelL
+// This is a very expensive method, so when updating list box items,
+// call the less expensive 'update' methods!
+// -----------------------------------------------------------------------------
+//
+TInt CDownloadMgrUiDownloadsList::AddDownloadToListModelL
+ ( CDownloadsListArray& aLBModel, RHttpDownload& aDownload )
+ {
+ CLOG_ENTERFN("CDownloadMgrUiDownloadsList::AddDownloadToListModelL");
+ CLOG_WRITE_FORMAT(" aDownload: 0x%x",&aDownload);
+
+ TInt itemIndex( KErrNotFound );
+ if ( aLBModel.Find( aDownload, itemIndex ) == KErrNone )
+ {
+ // It is already on the list - do not add it again.
+ CLOG_WRITE_FORMAT(" aDownload already on list (%d)",itemIndex);
+ }
+ else
+ {
+ // Do not add the download to the list if the storage
+ // media is not in the device.
+ TBool noMedia( EFalse );
+ User::LeaveIfError( aDownload.GetBoolAttribute
+ ( EDlAttrNoMedia, noMedia ) );
+ CLOG_WRITE_FORMAT(" EDlAttrNoMedia: %d",noMedia);
+ // Do not add the download to the list if it is hidden
+ TBool isHidden( EFalse );
+ User::LeaveIfError( aDownload.GetBoolAttribute
+ ( EDlAttrHidden, isHidden ) );
+ CLOG_WRITE_FORMAT(" EDlAttrHidden: %d",isHidden);
+
+ if ( noMedia || isHidden )
+ {
+ // Do not add it to the list - hide it from the user.
+ }
+ else
+ {
+ // Create the holder for the info of the download.
+ // Quite big structure, allocate it on the heap!
+ TDownloadUiData* dlData = new (ELeave) TDownloadUiData;
+ CleanupStack::PushL( dlData );
+
+ TInt err(KErrNone);
+
+ // Get progress info
+ err = aDownload.GetIntAttribute
+ ( EDlAttrState, dlData->iDownloadState );
+ CLOG_WRITE_FORMAT(" EDlAttrState err: %d",err);
+ User::LeaveIfError( err );
+
+ //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(dlData->iDownloadState == EHttpDlCompleted )
+ {
+ dlData->iDownloadState = EHttpDlMultipleMOCompleted;
+ }
+ else if(dlData->iDownloadState == EHttpDlFailed )
+ {
+ dlData->iDownloadState = EHttpDlMultipleMOFailed;
+ }
+
+ err = aDownload.GetIntAttribute
+ ( EDlAttrProgressState, dlData->iProgressState );
+ CLOG_WRITE_FORMAT(" EDlAttrProgressState err: %d",err);
+ User::LeaveIfError( err );
+ err = aDownload.GetIntAttribute
+ ( EDlAttrLength, dlData->iFullSize );
+ CLOG_WRITE_FORMAT(" EDlAttrLength err: %d",err);
+ if ( err != KErrNone && err != KErrNotFound )
+ {
+ User::LeaveIfError( err );
+ }
+
+ // Number of media objects in download ( inalbum)?
+ err = aDownload.GetIntAttribute
+ ( EDlAttrNumMediaObjects, dlData->iNumMediaObjects );
+ CLOG_WRITE_FORMAT(" EDlAttrNumMediaObjects err: %d",err);
+ User::LeaveIfError( err );
+
+ // Get file name
+ // In case of album - if download is complete, query album name,
+ // otherwise query track name
+ if ((dlData->iNumMediaObjects > 1) &&
+ (EHttpDlMultipleMOCompleted == dlData->iDownloadState))
+ {
+ err = aDownload.GetStringAttribute
+ ( EDlAttrAlbumName, dlData->iName );
+ CLOG_WRITE_FORMAT(" EDlAttrAlbumName err: %d",err);
+ }
+ else
+ {
+ err = aDownload.GetStringAttribute
+ ( EDlAttrName, dlData->iName );
+ CLOG_WRITE_FORMAT(" EDlAttrName err: %d",err);
+ }
+
+ if ( err != KErrNone && err != KErrNotFound )
+ {
+ User::LeaveIfError( err );
+ }
+ CLOG_WRITE_FORMAT(" EDlAttrName: %S",&(dlData->iName));
+
+ // If download name is empty, use the file name got from URI
+ if ( dlData->iName.Length() == 0 )
+ {
+ HBufC* url = HBufC::NewLC( KMaxUrlLength );
+ TPtr urlPtr = url->Des();
+ err = aDownload.GetStringAttribute( EDlAttrCurrentUrl, urlPtr );
+ CLOG_WRITE_FORMAT(" EDlAttrCurrentUrl err: %d",err);
+ if ( err != KErrNone && err != KErrNotFound )
+ {
+ User::LeaveIfError( err );
+ }
+ CLOG_WRITE_FORMAT(" EDlAttrCurrentUrl: %S",url);
+ if ( url->Length() > 0 )
+ {
+ // Extract file name, if possible
+ CUri8* converted = UriUtils::CreateUriL( *url );
+ CleanupStack::PushL( converted );
+ HBufC* extracted = converted->Uri().GetFileNameL( EUriFileNameTail );
+ CleanupStack::PushL( extracted );
+ // Use this for download name
+ // (Left() is used to avoid overflow.)
+ dlData->iName = extracted->Left( dlData->iName.MaxLength() );
+ CleanupStack::PopAndDestroy( extracted );
+ CleanupStack::PopAndDestroy( converted );
+ }
+ CleanupStack::PopAndDestroy( url );
+ }
+
+ // Get content type
+ HBufC8* contentType;
+ if ((dlData->iNumMediaObjects > 1) &&
+ (EHttpDlMultipleMOCompleted == dlData->iDownloadState))
+ {
+ contentType = iUiUtils->ContentTypeL( aDownload, ETrue, KFirstMoIndex );
+ }
+ else
+ {
+ contentType = iUiUtils->ContentTypeL( aDownload, ETrue );
+ }
+ // Not pushed to cleanup stack - unnecessary.
+ // There is a limit for dlData.iContentType
+ if ( contentType->Length() > KMaxContentTypeLength )
+ {
+ // What can we do? Use an empty mime string.
+ CLOG_WRITE_FORMAT(" Length overflow: %d",contentType->Length());
+ delete contentType;
+ contentType = 0;
+ contentType = KNullDesC8().AllocL();
+ }
+ dlData->iContentType.Copy( *contentType );
+ delete contentType;
+ contentType = 0;
+
+ // Downloaded size is always known, so it can leave.
+ err = aDownload.GetIntAttribute
+ ( EDlAttrDownloadedSize, dlData->iDownloadedSize );
+ CLOG_WRITE_FORMAT(" EDlAttrDownloadedSize err: %d",err);
+ User::LeaveIfError( err );
+
+ // Is the download pausable?
+ User::LeaveIfError( aDownload.GetBoolAttribute
+ ( EDlAttrPausable, dlData->iPausable ) );
+ CLOG_WRITE_FORMAT(" EDlAttrPausable: %d",dlData->iPausable);
+
+ // Is the download on an external/removable memory (like MMC)?
+ err = aDownload.GetBoolAttribute
+ ( EDlAttrDestRemovable, dlData->iIsOnExternalMemory );
+ CLOG_WRITE_FORMAT(" EDlAttrDestRemovable err: %d",err);
+ // 'err' is ignored.
+ CLOG_WRITE_FORMAT(" EDlAttrDestRemovable: %d",dlData->iIsOnExternalMemory);
+
+ // Currently active media object's index (in album)?
+ err = aDownload.GetIntAttribute
+ ( EDlAttrActiveDownload, dlData->iActiveMoIndex );
+ CLOG_WRITE_FORMAT(" EDlAttrActiveDownload err: %d",err);
+ User::LeaveIfError( err );
+
+ // First add the handler app's icon to model, so that we then
+ // know the index of it that can then be set in the item text,
+ // which is then also added to the model.
+ dlData->iIconIndex =
+ iListModel->AddHandlerAppIconL( dlData->iContentType );
+ CLOG_WRITE(" AddHandlerAppIconL OK");
+
+ // Add now the structure to the model:
+ itemIndex = aLBModel.AppendL( *dlData, aDownload );
+ CleanupStack::PopAndDestroy( dlData ); // dlData
+ }
+ }
+
+ CLOG_LEAVEFN("CDownloadMgrUiDownloadsList::AddDownloadToListModelL");
+ return ( itemIndex );
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::DeleteDownloadL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::DeleteDownloadL( RHttpDownload& aDownload )
+ {
+ CLOG_ENTERFN("CDownloadMgrUiDownloadsList::DeleteDownloadL");
+
+ // Remove from the 'model' and update the 'view' (list) if visible.
+ if ( iListModel == NULL )
+ {
+ // Do nothing.
+ CLOG_WRITE(" iListModel == NULL");
+ }
+ else
+ {
+ TInt index( 0 );
+ TInt err = iListModel->Find( aDownload, index );
+ CLOG_WRITE_FORMAT(" err: %d",err);
+ CLOG_WRITE_FORMAT(" index: %d",index);
+ if ( !err )
+ {
+ if ( iListModel->Count() == 1 )
+ {
+ // Close the list before deleting the last item to avoid the visibility of 'No data' text.
+ if ( iExtension->IsDialogVisible() )
+ {
+ iExtension->DlExecuter().Dialog().CancelPopup();
+ CLOG_WRITE(" CancelPopup OK");
+ }
+ iListModel->Delete( index );
+ }
+ else
+ {
+ iListModel->Delete( index );
+
+ // Update view
+ if ( iExtension->IsDialogVisible() )
+ {
+ iExtension->DlExecuter().Dialog().HandleModelChangeL( EDownloadRemoved, index );
+ CLOG_WRITE(" HandleModelChangeL OK");
+ }
+ }
+ }
+ }
+
+ CLOG_LEAVEFN("CDownloadMgrUiDownloadsList::DeleteDownloadL");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::DeleteDownloadL
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadMgrUiDownloadsList::IsOneProgressive()
+ {
+ TBool anyOneProgress = EFalse;
+ if (iListModel == NULL)
+ {
+ return EFalse;
+ }
+ else
+ {
+ TInt count = Count();
+ for ( TInt i = 0; i < count; ++i )
+ {
+ RHttpDownload& download = iListModel->Download(i);
+ TInt err = download.GetBoolAttribute( EDlAttrProgressive, anyOneProgress );
+ // If there is a COD download and check if it is attached. Then set it as attached while resuming
+ TBool isCodDownload;
+ download.GetBoolAttribute(EDlAttrCodDownload,isCodDownload);
+ if(isCodDownload && anyOneProgress )
+ {
+ download.SetBoolAttribute( EDlAttrProgressive, ETrue );
+ }
+ THttpProgressState state;
+ if( anyOneProgress )
+ {
+ download.GetIntAttribute(EDlAttrProgressState, (TInt32&)state);
+ if(state == EHttpProgContentFileMoved || state == EHttpProgContentFileMovedAndDestFNChanged )
+ {
+ anyOneProgress = 0;//once the move() has happened the progressive Download is finished
+ } //and we can bring MP to foreground and start another PD
+ }
+ CLOG_WRITE_FORMAT(" EDlAttrProgressive err: %d",err);
+ if ( anyOneProgress )
+ return ETrue;
+ }
+ }
+ return anyOneProgress;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::NewDownloadCreatedL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::NewDownloadCreatedL( RHttpDownload& aDownload )
+ {
+ __ASSERT_DEBUG( iExtension->IsDialogVisible(), Panic( EUiLibPanCreatedNotVisible ) );
+ // This download does not exist in the model yet, so add this.
+ TInt indx = AddDownloadToListModelL( *iListModel, aDownload );
+ iExtension->DlExecuter().Dialog().HandleModelChangeL( EDownloadAdded, indx );
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::UpdateProgressInfoL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::UpdateProgressInfoL
+ ( RHttpDownload& aDownload, THttpDownloadEvent aEvent )
+ {
+ __ASSERT_DEBUG( iExtension->IsDialogVisible(), Panic( EUiLibPanProgressNotVisible ) );
+ // Update the download progress info at the current index.
+ // First find the current download in the model.
+ TInt index(0);
+ TDownloadUiData* dlDataPtr = FindDlUiData( *iListModel, aDownload, index );
+ if ( !dlDataPtr )
+ {
+ // do nothing
+ }
+ else
+ {
+ // Create a local copy
+ TDownloadUiData dlData = *dlDataPtr;
+
+ // Track changed? We need to change icon of new track
+ TInt32 moIndex(0);
+ User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrActiveDownload, moIndex ) );
+ TBool activeIndexChanged = (dlData.iActiveMoIndex != moIndex);
+
+ // Update download state - this must always be done!
+ dlData.iDownloadState = aEvent.iDownloadState;
+ dlData.iProgressState = aEvent.iProgressState;
+ dlData.iActiveMoIndex = moIndex;
+ aDownload.GetStringAttribute( EDlAttrName, dlData.iName );
+ // Permanent redirection changes the filename.
+ if ( aEvent.iProgressState == EHttpProgRedirectedPermanently ||
+ aEvent.iProgressState == EHttpProgRedirectedTemporarily )
+ {
+ CLOG_WRITE(" Redirection");
+ }
+ else if ( aEvent.iProgressState == EHttpProgResponseHeaderReceived )
+ {
+ // Is the download on an external/removable memory (like MMC)?
+ aDownload.GetBoolAttribute
+ ( EDlAttrDestRemovable, dlData.iIsOnExternalMemory );
+ // Return value is ignored.
+ CLOG_WRITE_FORMAT(" EDlAttrDestRemovable: %d",dlData.iIsOnExternalMemory);
+ }
+ else if ( aEvent.iProgressState == EHttpProgDlNameChanged )
+ {
+ CLOG_WRITE(" EHttpProgDlNameChanged");
+ }
+
+ if (( aEvent.iProgressState == EHttpProgContentTypeChanged ) || activeIndexChanged )
+ {
+ // Update handler application icon
+ // Also update the content type, because the handler application
+ // icon depends from this.
+ CLOG_WRITE_FORMAT(" EHttpProgContentTypeChanged: ActiveIndex - %d",dlData.iActiveMoIndex);
+ HBufC8* contentType = iUiUtils->ContentTypeL( aDownload, ETrue );
+ // Not pushed to cleanup stack - unnecessary.
+ // There is a limit for dlData.iContentType
+ if ( contentType->Length() > KMaxContentTypeLength )
+ {
+ // What can we do? Use an empty mime string.
+ CLOG_WRITE_FORMAT(" Length overflow: %d",contentType->Length());
+ delete contentType;
+ contentType = 0;
+ contentType = KNullDesC8().AllocL();
+ }
+ dlData.iContentType.Copy( *contentType );
+ delete contentType;
+ contentType = 0;
+ dlData.iIconIndex = iListModel->AddHandlerAppIconL( dlData.iContentType );
+ }
+ // Update the progress info.
+ User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrDownloadedSize,
+ dlData.iDownloadedSize ) );
+ User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrLength,
+ dlData.iFullSize ) );
+ // Update the download ui data in the 'model'.
+ iListModel->UpdateL( index, dlData );
+ // Update the 'view'
+ iExtension->DlExecuter().Dialog().HandleModelChangeL( EDownloadChanged, index );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::DownloadPausedL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::DownloadPausedL
+ ( RHttpDownload& aDownload, THttpDownloadEvent aEvent )
+ {
+ CLOG_ENTERFN("CDownloadMgrUiDownloadsList::DownloadPausedL");
+
+ __ASSERT_DEBUG( iExtension->IsDialogVisible(), Panic( EUiLibPanPausedNotVisible ) );
+ // First find the current download in the model.
+ TInt index(0);
+ TDownloadUiData* dlDataPtr = FindDlUiData( *iListModel, aDownload, index );
+ if ( !dlDataPtr )
+ {
+ // do nothing
+ }
+ else
+ {
+ // Create a local copy
+ TDownloadUiData dlData = *dlDataPtr;
+
+ // Update download state - this must always be done!
+ dlData.iDownloadState = aEvent.iDownloadState;
+ dlData.iProgressState = aEvent.iProgressState;
+ User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrActiveDownload, dlData.iActiveMoIndex ) );
+ aDownload.GetStringAttribute( EDlAttrName, dlData.iName );
+ // Here we have to initialize the full size, if the
+ // content-type header arrives!!
+ if ( aEvent.iProgressState == EHttpContentTypeReceived )
+ {
+ TInt err = aDownload.GetIntAttribute( EDlAttrLength, dlData.iFullSize );
+ if ( err != KErrNone && err != KErrNotFound )
+ {
+ User::LeaveIfError( err );
+ }
+
+ // Also update the content type, because the handler application
+ // icon depends from this.
+ HBufC8* contentType = iUiUtils->ContentTypeL( aDownload, ETrue );
+ // Not pushed to cleanup stack - unnecessary.
+ // There is a limit for dlData.iContentType
+ if ( contentType->Length() > KMaxContentTypeLength )
+ {
+ // What can we do? Use an empty mime string.
+ CLOG_WRITE_FORMAT(" Length overflow: %d",contentType->Length());
+ delete contentType;
+ contentType = 0;
+ contentType = KNullDesC8().AllocL();
+ }
+ dlData.iContentType.Copy( *contentType );
+ delete contentType;
+ contentType = 0;
+ dlData.iIconIndex = iListModel->AddHandlerAppIconL( dlData.iContentType );
+ }
+
+ // Update downloaded size (introduced, because for non-pausable downloads
+ // paused command sets downloaded size back to 0 kB).
+ User::LeaveIfError( aDownload.GetIntAttribute
+ ( EDlAttrDownloadedSize, dlData.iDownloadedSize ) );
+
+ // Update the download ui data in the 'model'.
+ iListModel->UpdateL( index, dlData );
+ // Update the 'view'
+ iExtension->DlExecuter().Dialog().HandleModelChangeL( EDownloadChanged, index );
+ // Also need to update the middle softkey
+ iExtension->DlExecuter().Dialog().HandleMiddleSoftKeyChangeL();
+ }
+
+ CLOG_LEAVEFN("CDownloadMgrUiDownloadsList::DownloadPausedL");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::DownloadCompletedL
+// This is very similar to UpdateProgressInfoL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::DownloadCompletedL
+ ( RHttpDownload& aDownload, THttpDownloadEvent aEvent )
+ {
+ __ASSERT_DEBUG( iExtension->IsDialogVisible(), Panic( EUiLibPanCompletedNotVisible ) );
+ // Update the download progress info at the current index.
+ // First find the current download in the model.
+ TInt index(0);
+ TDownloadUiData* dlDataPtr = FindDlUiData( *iListModel, aDownload, index );
+ if ( !dlDataPtr )
+ {
+ // do nothing
+ }
+ else
+ {
+ // Create a local copy
+ TDownloadUiData dlData = *dlDataPtr;
+ // Update download state - this must always be done!
+ dlData.iDownloadState = aEvent.iDownloadState;
+ dlData.iProgressState = aEvent.iProgressState;
+ User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrActiveDownload, dlData.iActiveMoIndex ) );
+
+ // In case of Album download, change the name to Album name
+ if (dlData.iNumMediaObjects > 1)
+ {
+ aDownload.GetStringAttribute( EDlAttrAlbumName, dlData.iName );
+ }
+ else if (dlData.iProgressState == EHttpProgContentFileMovedAndDestFNChanged)
+ // Filename changed, get the updated filename
+ {
+ CLOG_WRITE(" EHttpProgDlNameChanged");
+ aDownload.GetStringAttribute( EDlAttrName, dlData.iName );
+ }
+
+ __ASSERT_DEBUG( aEvent.iDownloadState == EHttpDlMultipleMOCompleted,
+ Panic( EUiLibPanDlStateNotCompleted ) );
+
+ if( dlData.iProgressState == EHttpProgContentFileMoved || dlData.iProgressState == EHttpProgContentFileMovedAndDestFNChanged )
+ {
+ HBufC8* contentType = iUiUtils->ContentTypeL( aDownload, ETrue, KFirstMoIndex );
+ if ( contentType->Length() > KMaxContentTypeLength )
+ {
+ // What can we do? Use an empty mime string.
+ CLOG_WRITE_FORMAT(" Length overflow: %d",contentType->Length());
+ delete contentType;
+ contentType = 0;
+ contentType = KNullDesC8().AllocL();
+ }
+ dlData.iContentType.Copy( *contentType );
+ delete contentType;
+ dlData.iIconIndex =
+ iListModel->AddHandlerAppIconL( dlData.iContentType );
+
+ }
+ // Unnecessary to update dlData.iDownloadedSize, as it is not displayed.
+ // Update the download ui data in the 'model'.
+ iListModel->UpdateL( index, dlData );
+ // Update the 'view'
+ iExtension->DlExecuter().Dialog().HandleModelChangeL( EDownloadChanged, index );
+ // Also need to update the middle softkey
+ iExtension->DlExecuter().Dialog().HandleMiddleSoftKeyChangeL();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::DownloadFailedL
+// This is very similar to UpdateProgressInfoL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::DownloadFailedL
+ ( RHttpDownload& aDownload, THttpDownloadEvent aEvent )
+ {
+ __ASSERT_DEBUG( iExtension->IsDialogVisible(), Panic( EUiLibPanFailedNotVisible ) );
+ // Update the download progress info at the current index.
+ // First find the current download in the model.
+ TInt index(0);
+ TDownloadUiData* dlDataPtr = FindDlUiData( *iListModel, aDownload, index );
+ if ( !dlDataPtr )
+ {
+ // do nothing
+ }
+ else
+ {
+ // Create a local copy
+ TDownloadUiData dlData = *dlDataPtr;
+ // Update download state - this must always be done!
+ dlData.iDownloadState = aEvent.iDownloadState;
+ dlData.iProgressState = aEvent.iProgressState;
+ User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrActiveDownload, dlData.iActiveMoIndex ) );
+
+ // By default, update the progress info. Only the downloaded size changes.
+ User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrDownloadedSize,
+ dlData.iDownloadedSize ) );
+ // Update the download ui data in the 'model'.
+ iListModel->UpdateL( index, dlData );
+ // Update the 'view'
+ iExtension->DlExecuter().Dialog().HandleModelChangeL( EDownloadChanged, index );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::PauseableStateChangedL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::PauseableStateChangedL( RHttpDownload& aDownload, TBool aPausable )
+ {
+ __ASSERT_DEBUG( iExtension->IsDialogVisible(), Panic( EUiLibPanFailedNotVisible ) );
+ // Update the download progress info at the current index.
+ // First find the current download in the model.
+ TInt index(0);
+ TDownloadUiData* dlDataPtr = FindDlUiData( *iListModel, aDownload, index );
+ if ( !dlDataPtr )
+ {
+ // do nothing
+ }
+ else
+ {
+ // Create a local copy
+ TDownloadUiData dlData = *dlDataPtr;
+ // Update download state
+ dlData.iPausable = aPausable;
+ // Update the download ui data in the 'model'.
+ iListModel->UpdateL( index, dlData );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::HideMenu
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::HideMenu()
+ {
+ if ( iExtension->DlExecuter().Dialog().MenuShowing() )
+ {
+ iExtension->DlExecuter().Dialog().HideMenu();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::HandleDMgrEventL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::HandleDMgrEventL
+ ( RHttpDownload& aDownload, THttpDownloadEvent aEvent )
+ {
+ // Implementation info: iEventHandlerArray is not used yet.
+
+ if ( iExtension->IsDialogVisible() == EFalse )
+ {
+ // Don't respond.
+ return;
+ }
+
+ CLOG_WRITE_EVENT("DlList",&aDownload,aEvent);
+
+ switch ( aEvent.iDownloadState )
+ {
+ case EHttpDlCreated:
+ {
+ // Add new download to the list
+ NewDownloadCreatedL( aDownload );
+ break;
+ }
+
+ case EHttpDlInprogress:
+ {
+ // Update progress info every KUpdateProgressInfoInterval
+ if (!iIsTimerStarted )
+ {
+ iIsTimerStarted = ETrue;
+ // start the timer.
+ iExtension->StartProgressTimer();
+ }
+
+ if (iExtension->iIsUpdateInfoAllowed)
+ {
+ UpdateProgressInfoL( aDownload, aEvent );
+ iExtension->iIsUpdateInfoAllowed = EFalse;
+ }
+ break;
+ }
+
+ case EHttpDlPaused:
+ {
+ DownloadPausedL( aDownload, aEvent );
+ break;
+ }
+
+ case EHttpDlMultipleMOCompleted:
+ {
+ DownloadCompletedL( aDownload, aEvent );
+ break;
+ }
+
+ case EHttpDlMultipleMOFailed:
+ {
+ DownloadFailedL( aDownload, aEvent );
+ break;
+ }
+
+ case EHttpDlMoved:
+ {
+ // Download moved to this session.
+ // Add it to the list
+ NewDownloadCreatedL( aDownload );
+ break;
+ }
+
+ case EHttpDlMediaRemoved:
+ {
+ // Remove the download from the list
+ DeleteDownloadL( aDownload );
+ break;
+ }
+
+ case EHttpDlMediaInserted:
+ {
+ // Add new download to the list
+ NewDownloadCreatedL( aDownload );
+ break;
+ }
+
+ case EHttpDlPausable:
+ case EHttpDlNonPausable:
+ {
+ // Update the download UI data
+ PauseableStateChangedL( aDownload, aEvent.iDownloadState==EHttpDlPausable );
+
+ // No need to reopen menu as we no more allow manually
+ // pausing a download - PHAN-6KVK5R
+ /*
+ // Update menu if opened
+ if ( iExtension->DlExecuter().Dialog().MenuShowing() )
+ {
+ // Hide & reopen: DynInitMenuPaneL is called
+ iExtension->DlExecuter().Dialog().HideMenu();
+ iExtension->DlExecuter().Dialog().DisplayMenuL();
+ }
+ */
+ break;
+ }
+
+ case EHttpDlDeleted:
+ {
+ // Download is deleted from another client instance.
+ DeleteDownloadL( aDownload );
+ CLOG_WRITE(" EHttpDlDeleted - DeleteDownloadL OK");
+ break;
+ }
+
+ case EHttpDlAlreadyRunning:
+ {
+ // Nothing to do.
+ CLOG_WRITE(" EHttpDlAlreadyRunning - do nothing");
+ break;
+ }
+
+ case EHttpDlDeleting:
+ {
+ // Download is going to be deleted.
+ iUiUtils->CancelCancelConfirmationDialog();
+ iUiUtils->CancelDeleteConfirmationDialog();
+ DeleteDownloadL( aDownload );
+ CLOG_WRITE(" EHttpDlDeleting - DeleteDownloadL OK");
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::PreLayoutDynInitL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::PreLayoutDynInitL( CDownloadsListDlg& aDialog )
+ {
+ CLOG_ENTERFN("CDownloadMgrUiDownloadsList::PreLayoutDynInitL");
+
+ __ASSERT_DEBUG( iExtension->IsDialogVisible(), Panic( EUiLibPanNull ) );
+
+ delete iListModel;
+ iListModel = NULL;
+ iListModel = CDownloadsListArray::NewL();
+ CLOG_WRITE(" NewL OK");
+
+ RHttpDownloadMgr& dMgr = iRegistryModel.DownloadMgr();
+ AddDownloadsToListModelL( *iListModel, dMgr );
+ CLOG_WRITE(" AddDownloadsToListModelL OK");
+ //
+ aDialog.SetModelL( *iListModel );
+
+ CLOG_LEAVEFN("CDownloadMgrUiDownloadsList::PreLayoutDynInitL");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::ProcessCommandL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::ProcessCommandL
+( CDownloadsListDlg& aDialog, TInt aCommandId )
+ {
+ __ASSERT_DEBUG( iExtension->IsDialogVisible(), Panic( EUiLibPanNull ) );
+ __ASSERT_DEBUG( iListModel, Panic( EUiLibPanNoDownloadsListModel ) );
+
+ RHttpDownload& currDownload = iListModel->Download( aDialog.CurrentItemIndex() );
+
+ if( !iAIWServiceHandler )
+ {
+ AttachAIWInterestL();
+ }
+
+ TInt aiwServiceId( iAIWServiceHandler->ServiceCmdByMenuCmd( aCommandId ) );
+ if ( aiwServiceId != KAiwCmdNone )
+ {
+ HandleAIWCommandL(aCommandId, currDownload);
+ return;
+ }
+
+ switch ( aCommandId )
+ {
+ case EAknSoftkeyOpen: // handle middlesoft key
+ {
+ // First close the downloads list.
+ CancelDisplayingDownloadsList();
+ CLOG_WRITE(" CancelDisplayingDownloadsList OK");
+
+ if(iProgressiveDownload)
+ {
+ // check if it's pd supported
+ TBool isPdSupported = EFalse;
+ // Get the PD player application's UID for the download
+ TUid pdPlayerUid = { 0 };
+ HBufC8* contentType = iUiUtils->ContentTypeL( currDownload, ETrue, KFirstMoIndex );
+ TDataType dataType( *contentType );
+ delete contentType;
+ contentType = NULL;
+ CDocumentHandler* docHandler = CDocumentHandler::NewLC();
+ isPdSupported = docHandler->CanHandleProgressivelyL( dataType, pdPlayerUid );
+ CleanupStack::PopAndDestroy( docHandler ); // docHandler
+
+ if ( isPdSupported && iUiUtils->IsNetworkPdCompatibleL() )
+ {
+ // Get the UI data for the current download
+ TDownloadUiData& dlData = iListModel->DlUiData( aDialog.CurrentItemIndex() );
+ TInt32 state( dlData.iProgressState );
+ TBool isProgressively = ETrue;
+ if ( state == EHttpProgContentFileMoved || state == EHttpProgContentFileMovedAndDestFNChanged )
+ {
+ // this will be used to tell multimedia app that content file
+ // has already been moved, and it does not need to attach
+ // to download - it can just read completed download from
+ // filesystem.
+ isProgressively = EFalse;
+ }
+ // First close the downloads list.
+ CancelDisplayingDownloadsList();
+ iUiUtils->LaunchPdAppL(currDownload, isProgressively);
+ }
+ else
+ {
+ iUiUtils->HandleContentL( currDownload, *iExtension );
+ CLOG_WRITE("HandleContentL OK");
+ }
+ }
+ else
+ {
+ iUiUtils->HandleContentL( currDownload, *iExtension );
+ CLOG_WRITE("HandleContentL OK");
+ }
+ break;
+ }
+
+
+ case EDownloadsListCmdOpen:
+ {
+ // First close the downloads list.
+ CancelDisplayingDownloadsList();
+ CLOG_WRITE(" CancelDisplayingDownloadsList OK");
+
+ iUiUtils->HandleContentL( currDownload, *iExtension );
+ CLOG_WRITE("HandleContentL OK");
+ // After the termination of the handler, download is removed
+ // from the list of downloads in NotifyHandlerExitL().
+ break;
+ }
+
+ case EDownloadsListCmdPlay:
+ {
+ #ifdef __DMGR_PD_TESTHARNESS
+ // First close the downloads list.
+ CancelDisplayingDownloadsList();
+ iUiUtils->TestLaunchPdAppL(currDownload);
+ #else
+ // Get the UI data for the current download
+ TDownloadUiData& dlData = iListModel->DlUiData( aDialog.CurrentItemIndex() );
+ TInt32 state( dlData.iProgressState );
+ TBool isProgressively = ETrue;
+ if ( state == EHttpProgContentFileMoved || state == EHttpProgContentFileMovedAndDestFNChanged )
+ {
+ // this will be used to tell multimedia app that content file
+ // has already been moved, and it does not need to attach
+ // to download - it can just read completed download from
+ // filesystem.
+ isProgressively = EFalse;
+ }
+ // First close the downloads list.
+ CancelDisplayingDownloadsList();
+ if (iUiUtils->IsNetworkPdCompatibleL() )
+ {
+ iUiUtils->LaunchPdAppL(currDownload, isProgressively);
+ }
+ #endif //__DMGR_PD_TESTHARNESS
+
+ break;
+ }
+
+ case EDownloadsListCmdSave:
+ {
+ TBool saved = iUiUtils->SaveContentL( currDownload );
+ if ( saved )
+ {
+ // Remove the download from the Downloads List to
+ // avoid confusion...
+ DeleteDownloadL( currDownload );
+ }
+ // The save (moving) procedure is asynchronous!
+ // CUserInteractionsEventHandler handles
+ // EHttpDlCompleted/EHttpProgMovingContentFile and
+ // EHttpDlCompleted/EHttpProgContentFileMoved.
+ break;
+ }
+
+ case EDownloadsListCmdDelete:
+ {
+ // Retrieve the full path to filename before deletion
+ // this way we check if the the actuall content file was deleted or not,
+ // if not, we will manually delete it
+ HBufC* fileName = HBufC::NewLC( KMaxPath );
+ TPtr fileNamePtr = fileName->Des();
+ User::LeaveIfError
+ ( currDownload.GetStringAttribute( EDlAttrDestFilename, fileNamePtr ) );
+ CLOG_WRITE_FORMAT(" EDlAttrDestFilename: %S", &fileNamePtr);
+
+ // Delete in DMgr
+ TBool deleted = iUiUtils->DeleteWithUserConfirmL( currDownload );
+ if ( deleted )
+ {
+
+ if(!iUiUtils->IsCodDownload())
+ {
+ HBufC* fileName1 = HBufC::NewLC(fileName->Length());
+ TPtr fileNamePtr1 = fileName1->Des();
+ fileNamePtr1.Copy(fileNamePtr);
+ RFs fs;
+ User::LeaveIfError(fs.Connect());
+ CleanupClosePushL(fs);
+ TFindFile file(fs);
+ TPtrC ptr(KNullDesC);
+ TInt found = file.FindByPath(fileNamePtr1,&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)
+ {
+ HBufC* infoPrompt = StringLoader::LoadLC( R_DMUL_ERROR_FILE_NOT_FOUND);
+ CAknInformationNote* note = new(ELeave) CAknInformationNote();
+ note->ExecuteLD(*infoPrompt);
+ CleanupStack::PopAndDestroy(infoPrompt);
+ }
+ CleanupStack::PopAndDestroy(&fs);
+ CleanupStack::PopAndDestroy(fileName1);
+ // Do not wait until the delete event is reported through the
+ // observer callback, but update the list right now,
+ // so the user will not be able to access and modify an already
+ // deleted download:
+ DeleteDownloadL( currDownload );
+ TBool result( EFalse );
+ RFs rfs;
+ User::LeaveIfError( rfs.Connect() );
+ CleanupClosePushL<RFs>( rfs );
+ result = BaflUtils::FileExists( rfs, fileNamePtr );
+ CLOG_WRITE_FORMAT(" BaflUtils::FileExists: %d", result);
+ if ( result )
+ { // if content file still exists on the device, delete it.
+ // don't care if it fails currently.
+ result = BaflUtils::DeleteFile( rfs, fileNamePtr );
+ }
+ CleanupStack::PopAndDestroy( &rfs );
+
+ // Notify Media Gallery about new media file
+ CMGXFileManager* mgFileManager = MGXFileManagerFactory::NewFileManagerL(
+ CEikonEnv::Static()->FsSession() );
+ if( fileNamePtr.Length() > 0 )
+ {
+ TRAP_IGNORE( mgFileManager->UpdateL( fileNamePtr ) );
+ TRAP_IGNORE( iUiUtils->UpdateDCFRepositoryL( fileNamePtr ) );
+ }
+ else
+ {
+ TRAP_IGNORE( mgFileManager->UpdateL() );
+ }
+
+ delete mgFileManager;
+ mgFileManager = NULL;
+
+ }
+ else
+ {
+ DeleteDownloadL( currDownload );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( fileName );
+ break;
+ }
+//PHAN-6KVK5R: Disallow Manually Pausing a Download
+/*
+ case EDownloadsListCmdPause:
+ {
+ User::LeaveIfError( currDownload.Pause() );
+ break;
+ }
+*/
+ case EDownloadsListCmdResume:
+ {
+ // Set the Internet access point ID on WINS* platforms
+ // to the DownloadMgr session if not set yet.
+ #ifdef __WINS__
+ iExtension->EnsureIapIdIsSetL();
+ #endif
+ // Resume = start
+ User::LeaveIfError( currDownload.Start() );
+ break;
+ }
+
+ case EDownloadsListCmdResumeAll:
+ {
+ // Set the Internet access point ID on WINS* platforms
+ // to the DownloadMgr session if not set yet.
+ #ifdef __WINS__
+ iExtension->EnsureIapIdIsSetL();
+ #endif
+ // Resume all paused or failed downloads.
+ TInt count = Count();
+ for ( TInt i = 0; i < count; ++i )
+ {
+ RHttpDownload& download = iListModel->Download(i);
+ TInt32 dlState(0);
+ TInt err = download.GetIntAttribute( EDlAttrState, dlState );
+
+ //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 && dlState == EHttpDlCompleted )
+ {
+ dlState = EHttpDlMultipleMOCompleted;
+ }
+ else if( !err && dlState == EHttpDlFailed )
+ {
+ dlState = EHttpDlMultipleMOFailed;
+ }
+
+ if ( !err && ( dlState == EHttpDlPaused || dlState == EHttpDlMultipleMOFailed ) )
+ {
+ download.Start(); // return value is ignored.
+ }
+ }
+ break;
+ }
+
+ case EDownloadsListCmdCancel:
+ {
+ if (!iIsCancelInProgress)
+ {
+ iIsCancelInProgress = ETrue;
+ TBool cancelled = EFalse;
+ TRAPD( err, cancelled = iUiUtils->CancelWithUserConfirmL( currDownload ) );
+ if (err != KErrNone)
+ {
+ iIsCancelInProgress = EFalse;
+ User::LeaveIfError(err);
+ }
+
+ if ( cancelled )
+ {
+ DeleteDownloadL( currDownload );
+ }
+ iIsCancelInProgress = EFalse;
+ }
+ break;
+ }
+
+ case EDownloadsListCmdCancelAll:
+ {
+ if (!iIsCancelInProgress)
+ {
+ iIsCancelInProgress = ETrue;
+ TBool cancelled = EFalse;
+ TRAPD( err, cancelled = iUiUtils->CancelAllWithUserConfirmL( currDownload ) );
+ if (err != KErrNone)
+ {
+ iIsCancelInProgress = EFalse;
+ User::LeaveIfError(err);
+ }
+ TInt count = Count();
+ for ( TInt i = 0; i < count; i++ )
+ {
+ RHttpDownload& download = iListModel->Download(i);
+ if ( cancelled )
+ {
+ DeleteDownloadL( download );
+ }
+ }
+ iIsCancelInProgress = EFalse;
+ }
+ break;
+ }
+
+ case EDownloadsListCmdGallery:
+ {
+ TVwsViewId id = TVwsViewId(
+ TUid::Uid( KMediaGalleryUID3 ),
+ TUid::Uid( KMediaGalleryListViewUID ) );
+
+ // By default, custom message is empty
+ TPtrC8 customMessage( KNullDesC8 );
+
+ CEikonEnv::Static()->EikAppUi()->ActivateViewL(
+ id,
+ TUid::Uid( KMediaGalleryCmdMoveFocusToAllFilesTab ),
+ customMessage );
+ break;
+ }
+
+ case EDownloadsListCmdFileManager:
+ {
+
+ TApaTaskList taskList( CEikonEnv::Static()->WsSession() );
+ CRepository *repository=CRepository::NewL(KCRUidBrowser);
+ TInt fileManagerId;
+ User::LeaveIfError(repository->Get(KFileManagerUid , fileManagerId ));
+ TUid id = TUid::Uid(fileManagerId);
+ TApaTask task = taskList.FindApp( id );
+ if ( task.Exists() )
+ {
+ task.BringToForeground();
+ }
+ else
+ {
+ RApaLsSession appArcSession;
+ User::LeaveIfError( appArcSession.Connect() );
+ CleanupClosePushL( appArcSession );
+ TThreadId id1;
+ User::LeaveIfError( appArcSession.StartDocument( KNullDesC, id, id1 ) );
+ CleanupStack::PopAndDestroy( &appArcSession );
+ }
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::DynInitMenuPaneL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::DynInitMenuPaneL( CDownloadsListDlg& aDialog,
+ TInt aResourceId,
+ CEikMenuPane* aMenuPane )
+ {
+ CLOG_ENTERFN("CDownloadMgrUiDownloadsList::DynInitMenuPaneL");
+
+ __ASSERT_DEBUG( iExtension->IsDialogVisible(), Panic( EUiLibPanNull ) );
+
+ if( !iAIWServiceHandler )
+ {
+ AttachAIWInterestL();
+ }
+
+ TInt currentItemIndex = aDialog.CurrentItemIndex();
+ __ASSERT_DEBUG( 0 <= currentItemIndex, Panic( EUiLibPanDLNegItemIndex ) );
+ RHttpDownload& currDownload = iListModel->Download( currentItemIndex );
+ CLOG_WRITE_FORMAT(" currDownload: 0x%x",&currDownload);
+
+ // Get the UI data for the current download
+ TDownloadUiData& dlData = iListModel->DlUiData( aDialog.CurrentItemIndex() );
+ TInt32 state( dlData.iDownloadState );
+ CLOG_WRITE_FORMAT(" state: %d",state);
+
+ // The moved state is only a temporary state - the server
+ // sets the download's original state back right after it,
+ // thus we query the state again:
+ if ( state == EHttpDlMoved )
+ {
+ User::LeaveIfError( currDownload.GetIntAttribute( EDlAttrState, 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;
+ }
+
+ CLOG_WRITE_FORMAT(" state re-query: %d",state);
+ }
+ __ASSERT_DEBUG( state != EHttpDlMoved, Panic( EUiLibPanStateIsStillMoved ) );
+
+ TBool wasCompleted = state == EHttpDlMultipleMOCompleted;
+
+ // Get if it's theme
+ TInt isThemeType = 0;
+ HBufC8* contentType = HBufC8::NewLC(KMaxContentTypeLength);
+ TPtr8 contentTypePtr = contentType->Des();
+ User::LeaveIfError
+ ( currDownload.GetStringAttribute( EDlAttrContentType, contentTypePtr ) );
+ isThemeType = !contentType->Compare(KSisxContentType);
+ CleanupStack::PopAndDestroy( contentType );
+
+ if ( aResourceId == R_DMUL_DOWNLOADSLIST_MENU )
+ {
+ __ASSERT_DEBUG( 0<iListModel->Count(), Panic( EUiLibPanOptionsShownWhileNoDownloads ) );
+
+ TBool isCreated = state == EHttpDlCreated;
+ // The fix of PHAN-6KVK5R makes this line no longer necessary
+ // TBool isInProgress = state == EHttpDlInprogress;
+ TBool isPaused = state == EHttpDlPaused;
+ TBool isCompleted = state == EHttpDlMultipleMOCompleted;
+ TBool isFailed = state == EHttpDlMultipleMOFailed;
+ TBool isDrmDownload = EFalse;
+ TBool isDrmRightsOnPhone = EFalse;
+ TBool isPreviewRights = EFalse;
+ // OMA DRM information is used only in case of completed downloads
+ if ( isCompleted )
+ {
+ isDrmDownload = iUiUtils->DrmDownloadL( currDownload );
+ if ( isDrmDownload )
+ {
+ isDrmRightsOnPhone = iUiUtils->DrmRightsOnThePhoneL
+ ( currDownload, isPreviewRights );
+ }
+ }
+ TBool s60Supported( EFalse );
+ TBool gallerySupported( EFalse );
+ s60Supported = iUiUtils->IsContentTypeSupportedL( dlData.iContentType );
+ gallerySupported = CDownloadUtils::IsGallerySupported(dlData.iContentType);
+ CLOG_WRITE_FORMAT(" s60Supported: %d",s60Supported);
+ CLOG_WRITE_FORMAT(" gallerySupported: %d",gallerySupported);
+
+ TBool isCodDownload( EFalse );
+ TInt err = currDownload.GetBoolAttribute( EDlAttrCodDownload, isCodDownload );
+ CLOG_WRITE_FORMAT(" EDlAttrCodDownload err: %d",err);
+
+ TBool isCodPdDownload( EFalse );
+ err = currDownload.GetBoolAttribute( EDlAttrCodPdAvailable, isCodPdDownload );
+ CLOG_WRITE_FORMAT(" EDlAttrCodPdAvailable err: %d",err);
+
+ // Get if it can be handled progressively
+ TBool canProgHandled = EFalse;
+ TUid pdPlayerUid = { 0 };
+ HBufC8* contentType = iUiUtils->ContentTypeL( currDownload, ETrue );
+ TDataType dataType( *contentType );
+ delete contentType;
+ contentType = NULL;
+ CDocumentHandler* docHandler = CDocumentHandler::NewLC();
+ canProgHandled = docHandler->CanHandleProgressivelyL( dataType, pdPlayerUid );
+ CleanupStack::PopAndDestroy( docHandler ); // docHandler
+
+ //delete open file manager when download is not complete
+ if( !(isCompleted))
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdFileManager );
+ }
+
+ // For any gallery supported download, "go to gallery" option should be displayed in the download list option when the download completes
+ if ( !( isCompleted && s60Supported && gallerySupported ) )
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdGallery );
+ }
+
+ if ( !( isCompleted && s60Supported && gallerySupported &&
+ ( !isDrmDownload || ( isDrmDownload && isDrmRightsOnPhone ) ) ) )
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdUseAs );
+ }
+
+ else
+ {
+ TInt32 numMediaObjects = 0;
+ User::LeaveIfError( currDownload.GetIntAttribute( EDlAttrNumMediaObjects, numMediaObjects ) );
+ if (numMediaObjects > KFirstMoIndex)
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdUseAs );
+ }
+ }
+
+ if( iProgressiveDownload || isCompleted )
+ {
+ if ( canProgHandled )
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdOpen );
+ if (isCodDownload && !isCompleted )
+ {
+ if ( !( gallerySupported && canProgHandled && isCodPdDownload &&
+ ( !isDrmDownload || ( isDrmDownload && isDrmRightsOnPhone ) ) ) || (isPaused || isFailed))
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdPlay );
+ }
+ else
+ {
+ if ( !( gallerySupported && canProgHandled &&
+ ( !isDrmDownload || ( isDrmDownload && isDrmRightsOnPhone ))) || (isPaused || isFailed))
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdPlay );
+ }
+ }
+ else
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdPlay );
+
+ if ( !( isCompleted && ( s60Supported ) &&
+ ( !isDrmDownload || ( isDrmDownload && isDrmRightsOnPhone ) ) ) )
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdOpen );
+ }
+
+ //there should not be open in menu when download is not complete and file is not supported by s60 or Gallery
+ /* else if( isCompleted && ( !s60Supported && !gallerySupported))
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdOpen );
+ }*/
+ }
+ }
+
+ else // if iProgressiveDownload == EFalse
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdPlay );
+
+ if ( !( isCompleted && s60Supported &&
+ ( !isDrmDownload || ( isDrmDownload && isDrmRightsOnPhone ) ) ) )
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdOpen );
+ }
+
+ else if( isCompleted && !s60Supported && gallerySupported)
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdOpen );
+ }
+ }
+
+ // ELFG-732DK3: There is no need to have save option since it's already saved
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdSave );
+
+ if ( !( isCompleted ) )
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdDelete );
+ }
+ else
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdCancel );
+ }
+//PHAN-6KVK5R: Disallow Manually Pausing a Download
+/*
+ if ( !isInProgress || !dlData.iPausable )
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdPause );
+ }
+*/
+ if ( !( isCreated || isPaused || isFailed ) )
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdResume );
+ }
+ // Count paused downloads. Note that Creates and Failed downloads
+ // are also considered as Paused, and they can be resumed.
+ TInt pausedCount = iListModel->DownloadsCount
+ ( MASKED_DL_STATE(EHttpDlCreated) |
+ MASKED_DL_STATE(EHttpDlPaused) |
+ MASKED_DL_STATE(EHttpDlMultipleMOFailed) );
+ CLOG_WRITE_FORMAT(" paused count: %d",pausedCount);
+ //
+ if ( !( 1 < pausedCount ) )
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdResumeAll );
+ }
+
+ TInt downloadCount = iListModel->DownloadsCount
+ ( MASKED_DL_STATE(EHttpDlCreated) |
+ MASKED_DL_STATE(EHttpDlInprogress)|
+ MASKED_DL_STATE(EHttpDlPaused) );
+ CLOG_WRITE_FORMAT(" download count: %d",downloadCount);
+
+ if ( !( 1 < downloadCount ) )
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdCancelAll );
+ }
+
+ if ( isCompleted && gallerySupported && s60Supported )
+ {
+ aMenuPane->DeleteMenuItem( EDownloadsListCmdFileManager );
+ }
+ }
+
+ if ( wasCompleted && !isThemeType )
+ {
+ InitializeAIWPlugInMenusL( aResourceId, aMenuPane, currDownload );
+ }
+ CLOG_LEAVEFN("CDownloadMgrUiDownloadsList::DynInitMenuPaneL");
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::OfferKeyEventL
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CDownloadMgrUiDownloadsList::OfferKeyEventL
+ ( CDownloadsListDlg& aDialog, const TKeyEvent& aKeyEvent, TEventCode aType )
+ {
+ TKeyResponse resp = EKeyWasNotConsumed;
+
+ if ( aType == EEventKey && aKeyEvent.iCode == EKeyOK )
+ {
+ CLOG_WRITE(" DisplayMenuL via Selection key");
+ aDialog.DisplayMenuL();
+ resp = EKeyWasConsumed;
+ }
+ else if ( aType == EEventKey && aKeyEvent.iCode == EKeyBackspace )
+ {
+ // Clear "C" key
+ CLOG_WRITE(" Clear \"C\" key");
+ // Delete or Cancel depending on state
+ TDownloadUiData dlData = iListModel->DlUiData( aDialog.CurrentItemIndex() );
+ if ( dlData.iDownloadState == EHttpDlMultipleMOCompleted )
+ {
+ ProcessCommandL( aDialog, EDownloadsListCmdDelete );
+ }
+ else
+ {
+ ProcessCommandL( aDialog, EDownloadsListCmdCancel );
+ }
+ resp = EKeyWasConsumed;
+ }
+
+ return resp;
+ }
+
+// -----------------------------------------------------------------------------
+// FindDlUiData
+// -----------------------------------------------------------------------------
+//
+inline TDownloadUiData* FindDlUiData( CDownloadsListArray& aListModel,
+ RHttpDownload& aDownload,
+ TInt& aIndex )
+ {
+ TInt err = aListModel.Find( aDownload, aIndex );
+ if ( err == KErrNotFound )
+ {
+ aIndex = KErrNotFound;
+ return 0;
+ }
+ else
+ {
+ return &( aListModel.DlUiData( aIndex ) );
+ }
+ };
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrDownloadsList::AttachAIWInterestL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::AttachAIWInterestL()
+ {
+ //creates the service handler object, this is called only in construction
+ iAIWServiceHandler = CAiwServiceHandler::NewL();
+
+ TResourceReader reader;
+ iCoeEnv.CreateResourceReaderLC( reader,
+ R_DMUL_AIW_INTEREST_MENUPANE_MAPPINGS );
+
+ TInt count( reader.ReadInt16() );
+ for ( TInt i( 0 ); i < count; i++ )
+ {
+ TInt interest( reader.ReadInt32() );
+ TInt menupane( reader.ReadInt32() );
+ iAIWServiceHandler->AttachMenuL( menupane, interest );
+ }
+
+ CleanupStack::PopAndDestroy(); // reader
+ }
+
+// ----------------------------------------------------
+// CDownloadMgrUiDownloadsList::HandleAIWCommandL(TInt aCommand, RHttpDownload& aDownload)
+// ----------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::HandleAIWCommandL(TInt aCommand, RHttpDownload& aDownload)
+ {
+ // The command is an AIW command
+ CAiwGenericParamList& params = iAIWServiceHandler->InParamListL();
+ TInt aiwOptions( 0 );
+
+ ProvideInputParametersL( params, aiwOptions, aDownload );
+ CAiwGenericParamList& output = iAIWServiceHandler->OutParamListL();
+ iAIWServiceHandler->ExecuteMenuCmdL( aCommand, params, output, aiwOptions, this );
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::ProvideInputParametersL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::ProvideInputParametersL( CAiwGenericParamList& aParams,
+ TInt& /*aCommandOptions*/,
+ RHttpDownload& aDownload )
+ {
+ HBufC* fileName = HBufC::NewLC( KMaxPath );
+ TPtr fileNamePtr = fileName->Des();
+ User::LeaveIfError
+ ( aDownload.GetStringAttribute( EDlAttrDestFilename, fileNamePtr ) );
+ TAiwVariant fileNameVariant( fileNamePtr );
+ TAiwGenericParam genericParamFileName( EGenericParamFile, fileNameVariant );
+ aParams.AppendL( genericParamFileName );
+
+ HBufC* contentType = HBufC::NewLC(KMaxContentTypeLength);
+ TPtr contentTypePtr = contentType->Des();
+ User::LeaveIfError
+ ( aDownload.GetStringAttribute( EDlAttrContentType, contentTypePtr ) );
+ fileNameVariant.Set(contentTypePtr);
+ TAiwGenericParam genericParamMimeType( EGenericParamMIMEType, fileNameVariant );
+ aParams.AppendL( genericParamMimeType );
+ CleanupStack::PopAndDestroy( contentType );
+ CleanupStack::PopAndDestroy( fileName );
+
+ }
+
+// -----------------------------------------------------------------------------
+// CDownloadMgrUiDownloadsList::InitializeAIWPlugInMenusL
+// -----------------------------------------------------------------------------
+//
+void CDownloadMgrUiDownloadsList::InitializeAIWPlugInMenusL( TInt aResourceId,
+ CEikMenuPane* aMenuPane,
+ RHttpDownload& aDownload )
+ {
+ // Checks whether it is aiw menu or not
+ if ( iAIWServiceHandler->IsAiwMenu( aResourceId ) )
+ {
+ CAiwGenericParamList* params = CAiwGenericParamList::NewLC();
+ TInt i = 0;
+ ProvideInputParametersL(*params, i, aDownload);
+
+ TInt baseId = EAIWPluginMenu;
+
+ if ( aMenuPane->IsCascadeMenuPane() )
+ {
+ baseId = EAIWPluginSubMenu;
+ }
+
+ // Adds the aiw plugin menus
+ iAIWServiceHandler->InitializeMenuPaneL( *aMenuPane, aResourceId,
+ baseId, *params );
+
+ CleanupStack::PopAndDestroy(); // params
+ }
+ }
+
+#ifdef __WINS__
+#include <commdb.h>
+#include <AknLists.h>
+// ----------------------------------------------------------------------------
+// AskIapId(TUint32& aId)
+// Ask IAP id from the user. Used due to efficiency only on WINS* platforms.
+// ----------------------------------------------------------------------------
+//
+TInt AskIapIdL( TUint32& aId )
+ {
+ RArray<TUint32> idArray;
+ CleanupClosePushL( idArray );
+
+ CDesCArrayFlat* nameArray = new (ELeave) CDesCArrayFlat(16);
+ CleanupStack::PushL( nameArray );
+
+ // Get IAP names and ids from the database
+ CCommsDatabase* TheDb = CCommsDatabase::NewL( EDatabaseTypeIAP );
+ CleanupStack::PushL( TheDb );
+
+ TheDb->ShowHiddenRecords();
+
+ CCommsDbTableView* view = TheDb->OpenTableLC( TPtrC(IAP) );
+
+ TBuf<40> name;
+ TUint32 id;
+ TInt res = view->GotoFirstRecord();
+ while( res == KErrNone )
+ {
+ view->ReadTextL( TPtrC(COMMDB_NAME), name );
+ view->ReadUintL( TPtrC(COMMDB_ID), id );
+
+ idArray.Insert( id, 0 );
+ nameArray->InsertL( 0, name );
+
+ res = view->GotoNextRecord();
+ RDebug::Print(_L("IAP name, id: %S, %d"), &name, id);
+ }
+
+ CleanupStack::PopAndDestroy( view ); // view
+ CleanupStack::PopAndDestroy( TheDb ); // TheDb
+
+ // Create listbox and PUSH it.
+ CEikTextListBox* list = new(ELeave) CAknSinglePopupMenuStyleListBox;
+ CleanupStack::PushL( list );
+
+ // Create popup list and PUSH it.
+ CAknPopupList* popupList = CAknPopupList::NewL(
+ list, R_AVKON_SOFTKEYS_OK_EMPTY__OK,
+ AknPopupLayouts::EMenuWindow);
+ CleanupStack::PushL( popupList );
+
+ // initialize listbox.
+ list->ConstructL( popupList, CEikListBox::ELeftDownInViewRect );
+ list->CreateScrollBarFrameL( ETrue );
+ list->ScrollBarFrame()->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOff,
+ CEikScrollBarFrame::EAuto );
+
+ // Set listitems.
+ CTextListBoxModel* model = list->Model();
+ model->SetItemTextArray( nameArray );
+ model->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+ // Set title
+ popupList->SetTitleL( _L("Select IAP:") );
+
+ // Show popup list.
+ TInt popupOk = popupList->ExecuteLD();
+ CleanupStack::Pop( popupList ); // popupList
+ if ( popupOk )
+ {
+ TInt index = list->CurrentItemIndex();
+ aId = idArray[index];
+ }
+
+ CleanupStack::PopAndDestroy( 3, &idArray ); // list, nameArray, idArray
+
+ return popupOk;
+ }
+#endif // #ifdef __WINS__
+
+/* End of file. */
+