--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/downloadmgr/DownloadMgrClntSrv/src/DownloadMgrHandler.cpp Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,295 @@
+/*
+* Copyright (c) 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:
+* This file contains the declaration of the receive handler of Download Mgr Server.
+*
+*/
+
+
+// INCLUDE FILES
+#include "DownloadMgrLogger.h"
+#include "DownloadMgrHandler.h"
+#include "DownloadMgrClient.h"
+#include "DownloadMgrDefAttrib.h"
+
+// CONSTANTS
+
+
+// GLOBAL FUNCTIONS
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CDownloadMgrHandler::CDownloadMgrHandler
+// ---------------------------------------------------------
+//
+CDownloadMgrHandler::CDownloadMgrHandler( MHttpDownloadMgrObserver* aHandler,
+ RHttpDownload* aSubSession )
+:CActive( EPriorityStandard + 2 ) /* EPriorityStandard + 2 is used until EHttpProgResponseBodyReceived
+ event is received, then it must be set to EPriorityLow
+ until an other event arrives. Then it is set back to
+ EPriorityStandard + 2. */
+,iPtr(0,0)
+ {
+ CLOG_CREATE;
+
+ CLOG_ENTERFN( "CDownloadMgrHandler::CDownloadMgrHandler" )
+ iHandler = aHandler;
+ iDownloadSubSession = aSubSession;
+ iDownloadSession = NULL;
+ CActiveScheduler::Add( this );
+ iClosed = NULL;
+ iHandlerType = EHttpDownload;
+ iPrevDlEvent.iDownloadState = THttpDownloadState(0); // None
+ iPrevDlEvent.iProgressState = EHttpProgNone;
+ //iPrevDlEvent.iMoIndex = 0;
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrHandler::CDownloadMgrHandler
+// ---------------------------------------------------------
+//
+CDownloadMgrHandler::CDownloadMgrHandler( RHttpDownloadMgr* aSession )
+:CActive( EPriorityStandard ) /* Session-level event handler: priority remains
+ EPriorityStandard! */
+,iPtr(0,0)
+ {
+ CLOG_CREATE;
+
+ CLOG_ENTERFN( "CDownloadMgrHandler::CDownloadMgrHandler" )
+ iHandler = NULL;
+ iDownloadSubSession = NULL;
+ iDownloadSession = aSession;
+ CActiveScheduler::Add( this );
+ iClosed = NULL;
+ iHandlerType = EHttpDownloadMgr;
+ iPrevDlEvent.iDownloadState = THttpDownloadState(0); // None
+ iPrevDlEvent.iProgressState = EHttpProgNone;
+ //iPrevDlEvent.iMoIndex = 0;
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrHandler::CDownloadMgrHandler
+// ---------------------------------------------------------
+//
+CDownloadMgrHandler::~CDownloadMgrHandler()
+ {
+ CLOG_WRITE( "CDownloadMgrHandler::~CDownloadMgrHandler" )
+ Cancel();
+ CLOG_WRITE_FORMAT( "this: 0x%x", this );
+
+
+ CLOG_WRITE_FORMAT( "~iClosed: 0x%x", iClosed );
+ if( iClosed )
+ {
+ CLOG_WRITE( "*iClosed = ETrue;" );
+ *iClosed = ETrue;
+ }
+
+
+ if( iPackedEventAttribs )
+ {
+ delete iPackedEventAttribs;
+ }
+
+ CLOG_CLOSE;
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrHandler::AdjustPriority
+// ---------------------------------------------------------
+//
+void CDownloadMgrHandler::AdjustPriority( THttpDownloadEvent& aCurrentDlEvent )
+ {
+ if( !iDownloadSubSession->EventPriorityFlag() )
+ //The flag is zero if there is no cod AND client side download
+ {
+ if ( aCurrentDlEvent.iProgressState == EHttpProgCodDescriptorDownloaded )
+ {
+ // Cod download to be started in client side
+ // Set priority to the original (EPriorityStandard + 2) value.
+ CLOG_WRITE( "Setting EPriorityStandard + 2" );
+ }
+ else if( aCurrentDlEvent.iProgressState == EHttpProgResponseBodyReceived &&
+ iPrevDlEvent.iProgressState != EHttpProgResponseBodyReceived )
+ { // Progress changes to EHttpProgResponseBodyReceived
+ // Set priority to a low value.
+ CLOG_WRITE( "Setting EPriorityStandard + 1" );
+ SetPriority( EPriorityStandard + 1 );
+ }
+ else if ( aCurrentDlEvent.iProgressState != EHttpProgResponseBodyReceived &&
+ iPrevDlEvent.iProgressState == EHttpProgResponseBodyReceived )
+ { // Progress changes from EHttpProgResponseBodyReceived
+ // Set priority to the original (EPriorityStandard + 2) value.
+ CLOG_WRITE( "Setting EPriorityStandard + 2" );
+ SetPriority( EPriorityStandard + 2 );
+ }
+
+ // Otherwise no changes in priority!
+
+ iPrevDlEvent = aCurrentDlEvent; // Remember for the event
+ }
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrHandler::RunL
+// ---------------------------------------------------------
+//
+void CDownloadMgrHandler::RunL()
+ {
+ CLOG_WRITE_FORMAT( " CDownloadMgrHandler::RunL DH-iStat: %d", iStatus.Int() );
+ if ( iStatus.Int() == KErrNone )
+ {
+ THttpDownloadEvent event;
+ event.iDownloadState = (THttpDownloadState)iDownloadState();
+ event.iProgressState = (THttpProgressState)iProgressState();
+ CLOG_WRITE_FORMAT( "DS: %d", event.iDownloadState );
+ CLOG_WRITE_FORMAT( "PS: %d", event.iProgressState );
+ CLOG_WRITE_FORMAT( "Handler Type: %d", iHandlerType );
+ CLOG_WRITE_FORMAT( "this: 0x%x", this );
+ switch( iHandlerType )
+ {
+ case EHttpDownload:
+ {
+ TBool closed( EFalse );
+ iClosed = &closed;
+ CLOG_WRITE_FORMAT( "iClosed before: %d", *iClosed );
+
+ // *** Do active object priority adjustments here ***
+ AdjustPriority( event );
+ TPtr8 ptr = iPackedEventAttribs->Des();
+ iDownloadSubSession->UnpackEventAttribL( ptr );
+
+ // Media object index
+ //event.iMoIndex = iDownloadSubSession->ActiveMoIndex();
+
+ if( EHttpDlDeleting == event.iDownloadState )
+ {
+ iDownloadSubSession->Delete();
+ iClosed = NULL;
+ }
+ else
+ {
+ iHandler->HandleDMgrEventL( *iDownloadSubSession, event );
+ }
+ // Check if the download subsession has been closed by the client
+ CLOG_WRITE_FORMAT( "closed: %d", closed );
+ iClosed = NULL;
+ if( !closed )
+ {
+ StartL();
+ }
+ break;
+ }
+ case EHttpDownloadMgr:
+ {
+ // Unmask iHandle into 'handle' and 'media index'
+ TInt handle = (iHandle() & 0x0000FFFF);
+ //event.iMoIndex = (iHandle() >> 16);
+ TBool closed( EFalse );
+ iClosed = &closed;
+ iDownloadSession->HandleSessionEventL( handle, event );
+ CLOG_WRITE_FORMAT( "closed: %d", closed );
+ iClosed = NULL;
+ if( !closed )
+ {
+ StartL();
+ }
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ //Should be got here!
+ }
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrHandler::DoCancel
+// ---------------------------------------------------------
+//
+void CDownloadMgrHandler::DoCancel()
+ {
+ CLOG_ENTERFN( "CDownloadMgrHandler::DoCancel" )
+ switch( iHandlerType )
+ {
+ case EHttpDownload:
+ {
+ iDownloadSubSession->CancelEventNotification();
+ break;
+ }
+ case EHttpDownloadMgr:
+ {
+ iDownloadSession->CancelSessionEventNotification();
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrHandler::StartL
+// ---------------------------------------------------------
+//
+void CDownloadMgrHandler::StartL()
+ {
+ CLOG_ENTERFN( "CDownloadMgrHandler::StartL" )
+ if( !IsActive() )
+ {
+ iStatus = KRequestPending;
+ switch( iHandlerType )
+ {
+ case EHttpDownload:
+ {
+ //Use packer to alloc buffer
+ HBufC8* temp_packer = TDMgrUtils::PackEventAttribL();
+ if( iPackedEventAttribs )
+ {
+ delete iPackedEventAttribs;
+ }
+ iPackedEventAttribs = temp_packer;
+ CLOG_WRITE( "EHttpDownload" );
+ TInt length = iPackedEventAttribs->Des().Length();
+ iPtr.Set( iPackedEventAttribs->Des() );
+ iDownloadSubSession->StartEventNotification( iDownloadState,
+ iProgressState,
+ iPtr,
+ iStatus );
+ break;
+ }
+ case EHttpDownloadMgr:
+ {
+ CLOG_WRITE( "EHttpDownloadMgr" );
+ iDownloadSession->StartSessionEventNotification( iDownloadState,
+ iProgressState,
+ iHandle,
+ iStatus );
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ SetActive();
+ }
+ }