diff -r 000000000000 -r dd21522fd290 browserutilities/downloadmgr/DownloadMgrClntSrv/src/DownloadMgrHandler.cpp --- /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(); + } + }