diff -r 000000000000 -r 7f85d04be362 upnpframework/upnpcommand/src/upnpfiletransferbasetask.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnpframework/upnpcommand/src/upnpfiletransferbasetask.cpp Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,257 @@ +/* +* Copyright (c) 2007 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: Source file for CUpnpFileTransferBaseTask class. +* +*/ + + +// INCLUDE FILES +// system +#include // ConvertToUnicodeFromUtf8L + +// upnp stack api +#include // CUpnpItem +#include // CUpnpObject (cast) + +// upnp framework / avcontroller api +#include "upnpavcontrollerfactory.h" // UPnPAVControllerFactory +#include "upnpavcontroller.h" // MUPnPAVController +#include "upnpavbrowsingsession.h" // MUPnPAVBrowsingSession +#include "upnpavsessionobserverbase.h" // MUPnPAVSessionObserverBase +#include "upnpavdevice.h" // CUpnpAVDevice + +// upnp framework / common utils api +#include "upnpcommonutils.h" // TUPnPItemType +#include "upnpmetadatafetcher.h" // UPnPMetadataFetcher + +// upnp framework / fte +#include "upnpfiletransferengine.h" // CUpnpFileTransferEngine +// upnp framework / common ui +#include "upnpcommonui.h" // CUpnpCommonUI + +// upnpcommand internal +#include "upnpfilepipe.h" // CUpnpFilePipe +#include "upnpcommandparameters.h" // CUpnpCommandParameters +#include "upnptaskhandler.h" // MUpnpTaskHandler +#include "upnpnotehandler.h" // CUpnpNoteHandler +#include "upnpcommand.h" // CUpnpCommand +#include "upnptaskresourceallocator.h" // CUpnpTaskResourceAllocator +#include "upnpfiletransferbasetask.h" // CUpnpFileTransferBaseTask + + +_LIT( KComponentLogfile, "upnpcommand.log"); +#include "upnplog.h" + + +// -------------------------------------------------------------------------- +// CUpnpFileTransferBaseTask::CUpnpFileTransferBaseTask +// First phase construction. +// -------------------------------------------------------------------------- +// +CUpnpFileTransferBaseTask::CUpnpFileTransferBaseTask() + { + __LOG( "[UpnpCommand]\t CUpnpFileTransferBaseTask::Constructor" ); + } + +// -------------------------------------------------------------------------- +// Destructor. +// -------------------------------------------------------------------------- +// +CUpnpFileTransferBaseTask::~CUpnpFileTransferBaseTask() + { + __LOG( "[UpnpCommand]\t CUpnpFileTransferBaseTask::Destructor" ); + + // delete the resource allocator + // Local mediaserver and AVController resources will be freed. + delete iResourceAllocator; + delete iCommonUI; + } + + +// -------------------------------------------------------------------------- +// CUpnpFileTransferBaseTask::AllocateFileTransferResourcesL +// Allocates the Upnp Fw resources. +// -------------------------------------------------------------------------- +// +void CUpnpFileTransferBaseTask::AllocateFileTransferResourcesL( TInt aMode) + { + __LOG( "[UpnpCommand]\t CUpnpFileTransferBaseTask::AllocateResourcesL" ); + + // create common UI + iCommonUI = CUPnPCommonUI::NewL(); + + // create the resource allocator + iResourceAllocator = CUpnpTaskResourceAllocator::NewL( + *iCommonUI, aMode); + + iState = EStateConnected; + + iResourceAllocator->SetNoteHandlerL( NoteHandler() ); + + // now allocate! + iResourceAllocator->AllocateL(); + + // start a browsing session + iBrowsingSession = + &iResourceAllocator->AVController().StartBrowsingSessionL( + iResourceAllocator->SelectedDevice() ); + + iBrowsingSession->SetObserver( *this ); + } + +// -------------------------------------------------------------------------- +// CUpnpFileTransferBaseTask::ResourceAllocator +// Executes the task. +// -------------------------------------------------------------------------- +// +CUpnpTaskResourceAllocator* CUpnpFileTransferBaseTask::ResourceAllocator() + { + __LOG( "[UpnpCommand]\t CUpnpFileTransferBaseTask::ResourceAllocator" ); + + return iResourceAllocator; + } + + +// -------------------------------------------------------------------------- +// CUpnpFileTransferBaseTask::ExecuteFileTransferL +// Executes the task. +// -------------------------------------------------------------------------- +// +void CUpnpFileTransferBaseTask::ExecuteFileTransferL( TBool aRemoveFiles, + TInt& aTransferredFiles) + { + __LOG( "[UpnpCommand]\t CUpnpFileTransferBaseTask::ExecuteL" ); + + + // Leave if command has not been allocated yet + if( !FilePipe() || + !CommandParameters() || + !NoteHandler() || + !iBrowsingSession || + !iResourceAllocator ) + { + __LOG( "[UpnpCommand]\t CUpnpFileTransferBaseTask::\ +ExecuteFileTransferL resources not allocated, leave" ); + User::Leave( KErrNotReady ); + } + + // reset drm-note calculator ( note is shown once per operation ) + NoteHandler()->ResetDrmNoteCount(); + + TInt status = KErrNone; + TInt origFileCount = FilePipe()->Count();; + TInt failedFileCount = 0; + + // Initialise and execute the UpnpFileTransferEngine + CUpnpFileTransferEngine* ftEngine = NULL; + ftEngine = CUpnpFileTransferEngine::NewL( iBrowsingSession ); + if( status == KErrNone && + ftEngine ) + { + CleanupStack::PushL( ftEngine ); + + // move operation + if( aRemoveFiles ) + { + __LOG( "[UpnpCommand]\t CUpnpFileTransferBaseTask, move files" ); + ftEngine->MoveLocalFilesToRemoteServerL( + &FilePipe()->AsArray() ); + } + // copy operation + else + { + // Read the collection name (if any) + const TDesC& collectionName = + CommandParameters()->Get( UpnpCommand::EParamCollectionName ); + + // If collection name is not set, the operation is file copy + if( collectionName != KNullDesC ) + { + __LOG( "[UpnpCommand]\t CUpnpFileTransferBaseTask,\ + copy playlist" ); + ftEngine->CopyLocalPlaylistToRemoteServerL( + collectionName, &FilePipe()->AsArray() ); + } + // If collection name is set, the operation is playlist copy + else + { + __LOG( "[UpnpCommand]\t CUpnpFileTransferBaseTask,\ + copy files" ); + ftEngine->CopyLocalFilesToRemoteServerL( + &FilePipe()->AsArray() ); + } + } + + // Clean up + CleanupStack::PopAndDestroy( ftEngine ); + ftEngine = NULL; + } + + // calculate number of transferred files based on original file count and + // items remaining in filepipe (those were NOT transferred) + failedFileCount = FilePipe()->Count(); + aTransferredFiles = origFileCount - failedFileCount; + + // check if connection was lost during transfer + if( iState != EStateConnected ) + { + status = KErrDisconnected; + } + + __LOG1( "[UpnpCommand]\t CUpnpFileTransferBaseTask::\ +ExecuteL done status %d", status ); + + // If there was an error, leave + if( status != KErrNone ) + { + User::Leave( status ); + } + } + +// -------------------------------------------------------------------------- +// CUpnpFileTransferBaseTask::MediaServerDisappeared +// Notifies that the Media Renderer we have a session with has disappeared. +// -------------------------------------------------------------------------- +// +void CUpnpFileTransferBaseTask::MediaServerDisappeared( + TUPnPDeviceDisconnectedReason aReason ) + { + __LOG1( "[UpnpCommand]\t CUpnpFileTransferBaseTask::\ +MediaServerDisappeared aReason %d", aReason ); + + // need to know if wlan or server was lost + if( aReason == MUPnPAVSessionObserverBase::EWLANLost ) + { + iState = EStateWLANLost; + } + else + { + iState = EStateMSLost; + } + + } + +// -------------------------------------------------------------------------- +// CUpnpFileTransferBaseTask::IsWlanActive +// Returns connection state +// -------------------------------------------------------------------------- +// +TBool CUpnpFileTransferBaseTask::IsWlanActive() + { + __LOG( "[UpnpCommand]\t CUpnpFileTransferBaseTask::IsWlanActive" ); + + return (iState != EStateWLANLost); + } + +// End of File