diff -r 000000000000 -r ba25891c3a9e ncdengine/provider/client/src/ncdfiledownloadoperationproxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/provider/client/src/ncdfiledownloadoperationproxy.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,413 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: Implements CNcdFileDownloadOperationProxy +* +*/ + + +#include +#include "ncdfiledownloadoperationproxy.h" +#include "ncdfiledownloadoperationobserver.h" +#include "catalogsdebug.h" +#include "ncddownloadoperationstates.h" +#include "ncdoperationproxyremovehandler.h" +#include "catalogsclientserver.h" +#include "catalogsutils.h" +#include "ncdnodeproxy.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +CNcdFileDownloadOperationProxy* CNcdFileDownloadOperationProxy::NewL( + MCatalogsClientServer& aSession, + TInt aHandle, + MNcdOperationProxyRemoveHandler* aRemoveHandler, + CNcdNodeProxy* aNode, + CNcdNodeManagerProxy* aNodeManager, + const TDesC& aTargetFilename, + MNcdFileDownloadOperationObserver* aObserver, + TNcdDownloadDataType aDataType ) + { + CNcdFileDownloadOperationProxy* self = + CNcdFileDownloadOperationProxy::NewLC( + aSession, + aHandle, + aRemoveHandler, + aNode, + aNodeManager, + aTargetFilename, + aObserver, + aDataType ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// NewLC +// --------------------------------------------------------------------------- +// +CNcdFileDownloadOperationProxy* CNcdFileDownloadOperationProxy::NewLC( + MCatalogsClientServer& aSession, + TInt aHandle, + MNcdOperationProxyRemoveHandler* aRemoveHandler, + CNcdNodeProxy* aNode, + CNcdNodeManagerProxy* aNodeManager, + const TDesC& aTargetFilename, + MNcdFileDownloadOperationObserver* aObserver, + TNcdDownloadDataType aDataType ) + { + CNcdFileDownloadOperationProxy* self = + new( ELeave ) CNcdFileDownloadOperationProxy( aDataType ); + + self->AddRef(); + CleanupReleasePushL( *self ); + self->ConstructL( aSession, aHandle, aRemoveHandler, + aNode, aNodeManager, aObserver, aTargetFilename ); + return self; + } + + +// --------------------------------------------------------------------------- +// From MNcdFileDownloadOperation +// +// --------------------------------------------------------------------------- +// +const TDesC& CNcdFileDownloadOperationProxy::TargetFileName() const + { + DASSERT( iTargetFilename ); + return *iTargetFilename; + } + + +// --------------------------------------------------------------------------- +// From MNcdFileDownloadOperation +// +// --------------------------------------------------------------------------- +// +void CNcdFileDownloadOperationProxy::PauseL() + { + DLTRACEIN( ( "" ) ); + HBufC8* data = NULL; + + TState state = OperationStateL(); + // Check that the operation is in a resumable state + if ( state == EStateCancelled ) + { + DLERROR(("Cannot resume! Operation has been cancelled. Leaving")); + User::Leave( KErrCancel ); + } + + // Operation must be running for pause to work + if ( state != EStateRunning || iIsPaused ) + { + DLTRACEOUT(("Operation complete or other unresumable state")); + return; + } + + ClientServerSession().SendSyncAlloc( ENCDOperationFunctionPause, + KNullDesC8(), + data, + Handle(), + 0 ); + + if ( data ) + { + DLTRACE(("Received progress information")); + + RDesReadStream stream( *data ); + CleanupStack::PushL( data ); + CleanupClosePushL( stream ); + + // Just read completionId from the stream + stream.ReadInt32L(); + + TNcdSendableProgress progress; + // Read progress info + progress.InternalizeL( stream ); + + // Update paused state + iIsPaused = ( progress.iState == ENcdDownloadPaused ); + + CleanupStack::PopAndDestroy( 2, data ); // stream, data + } + + SetState( EStateRunning ); + DLTRACEOUT( ( "IsPaused: %d", iIsPaused ) ); + } + + +// --------------------------------------------------------------------------- +// From MNcdFileDownloadOperation +// +// --------------------------------------------------------------------------- +// +void CNcdFileDownloadOperationProxy::ResumeL() + { + DLTRACEIN(( "" )); + HBufC8* data = NULL; + TState state = OperationStateL(); + + // Check that the operation is in a resumable state + if ( state == EStateCancelled ) + { + DLERROR(("Cannot resume! Operation has been cancelled. Leaving")); + User::Leave( KErrCancel ); + } + + if ( ( state != EStateStopped && state != EStateRunning ) || !iIsPaused ) + { + DLTRACEOUT(("Operation complete or other unresumable state")); + return; + } + + ClientServerSession().SendSyncAlloc( ENCDOperationFunctionResume, + KNullDesC8(), + data, + Handle(), + 0 ); + + if ( data ) + { + DLTRACE(("Received progress information")); + RDesReadStream stream( *data ); + CleanupStack::PushL( data ); + CleanupClosePushL( stream ); + + // Just read the completionId from the stream + stream.ReadInt32L(); + + TNcdSendableProgress progress; + // Read progress info + + progress.InternalizeL( stream ); + // Update paused-state + iIsPaused = ( progress.iState == ENcdDownloadPaused ); + + DLTRACE(("Sending continue message")); + if ( progress.iState == KNcdDownloadContinueMessageRequired ) + { + SendContinueMessageL(); + } + + CleanupStack::PopAndDestroy( 2, data ); // stream, data + } + + SetState( EStateRunning ); + DLTRACEOUT(( "" )); + + } + + +// --------------------------------------------------------------------------- +// From MNcdFileDownloadOperation +// +// --------------------------------------------------------------------------- +// +TBool CNcdFileDownloadOperationProxy::IsPaused() + { + return iIsPaused; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CNcdFileDownloadOperationProxy::IsPausableL() + { + DLTRACEIN(("")); + TInt data = KErrNone; + User::LeaveIfError( ClientServerSession().SendSync( + ENCDOperationFunctionGetData, + KNullDesC8(), + data, + Handle() ) ); + + DLTRACEOUT(("pausable: %d", data == KNcdDownloadIsPausable )); + return data == KNcdDownloadIsPausable; + } + + +// --------------------------------------------------------------------------- +// Download type getter +// --------------------------------------------------------------------------- +// +TNcdDownloadDataType CNcdFileDownloadOperationProxy::DownloadDataType() const + { + return iDataType; + } + + +// --------------------------------------------------------------------------- +// From MNcdOperation +// Operation type getter +// --------------------------------------------------------------------------- +// +TNcdInterfaceId CNcdFileDownloadOperationProxy::OperationType() const + { + return static_cast( + MNcdFileDownloadOperation::KInterfaceUid ); + } + + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CNcdFileDownloadOperationProxy::CNcdFileDownloadOperationProxy( + TNcdDownloadDataType aDataType ) + : CNcdOperation< MNcdFileDownloadOperation >( NULL ), iIsPaused( EFalse ), + iDataType( aDataType ) + { + } + + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CNcdFileDownloadOperationProxy::~CNcdFileDownloadOperationProxy() + { + DLTRACEIN( ( "" ) ); + delete iTargetFilename; + DASSERT( iRemoveHandler ); + if ( iRemoveHandler ) + { + DLTRACE(("Removing proxy from remove handler")); + iRemoveHandler->RemoveOperationProxy( *this ); + } + + DLTRACEOUT( ( "" ) ); + } + + +// --------------------------------------------------------------------------- +// ConstructL +// --------------------------------------------------------------------------- +// +void CNcdFileDownloadOperationProxy::ConstructL( MCatalogsClientServer& aSession, + TInt aHandle, + MNcdOperationProxyRemoveHandler* aRemoveHandler, + CNcdNodeProxy* aNode, + CNcdNodeManagerProxy* aNodeManager, + MNcdFileDownloadOperationObserver* aObserver, + const TDesC& aTargetFilename ) + { + DLTRACEIN( ( "" ) ); + CNcdBaseOperationProxy::ConstructL( aSession, aHandle, aRemoveHandler, + aNode, aNodeManager ); + iObserver = aObserver; + iTargetFilename = aTargetFilename.AllocL(); + + // Initialize the operation if necessary. Initialization mechanism is used + // here to transfer the targetfilename to serverside unless it is + // transferred in node id + if ( aNode ) + { + InitializeOperationL(); + } + DLTRACEOUT( ( "" ) ); + } + + +// --------------------------------------------------------------------------- +// Handle progress callback +// --------------------------------------------------------------------------- +// +void CNcdFileDownloadOperationProxy::ProgressCallback() + { + DLTRACEIN( ( "" ) ); + if ( iObserver ) + { + + TNcdSendableProgress& sendableProgress( SendableProgress() ); + TNcdProgress progress( sendableProgress.iProgress, + sendableProgress.iMaxProgress ); + + iObserver->FileDownloadProgress( *this, progress ); + } + DLTRACEOUT( ( "" ) ); + } + + +// --------------------------------------------------------------------------- +// Handle query received callback +// --------------------------------------------------------------------------- +// +void CNcdFileDownloadOperationProxy::QueryReceivedCallback( CNcdQuery* /*aQuery*/ ) + { + DLTRACEIN( ( "" ) ); + DLTRACEOUT( ( "" ) ); + } + + +// --------------------------------------------------------------------------- +// Handle operation complete +// --------------------------------------------------------------------------- +// +void CNcdFileDownloadOperationProxy::CompleteCallback( TInt aError ) + { + AddRef(); + DLTRACEIN( ( "Error: %d", aError ) ); + iIsPaused = EFalse; + + if ( iObserver ) + { + iObserver->OperationComplete( *this, aError ); + } + + Release(); + DLTRACEOUT( ( "" ) ); + } + + +// --------------------------------------------------------------------------- +// Create initialization data sent to the server-side +// --------------------------------------------------------------------------- +// +HBufC8* CNcdFileDownloadOperationProxy::CreateInitializationBufferL() + { + DLTRACEIN( ( "" ) ); + DASSERT( iTargetFilename ); + + HBufC8* buf = HBufC8::NewLC( 2 * KMaxPath ); + + TPtr8 ptr( buf->Des() ); + RDesWriteStream stream( ptr ); + CleanupClosePushL( stream ); + ExternalizeDesL( *iTargetFilename, stream ); + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::Pop( buf ); + return buf; + } + + +// --------------------------------------------------------------------------- +// Handle initialization callback +// --------------------------------------------------------------------------- +// +void CNcdFileDownloadOperationProxy::InitializationCallback( + RReadStream& /* aReadStream */, TInt /* aDataLength */ ) + { + DLTRACEIN( ( "" ) ); + } + + +