upnpframework/upnpcommand/src/upnpfiletransferbasetask.cpp
changeset 0 7f85d04be362
child 38 5360b7ddc251
--- /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 <utf.h>                        // ConvertToUnicodeFromUtf8L
+
+// upnp stack api
+#include <upnpitem.h>                   // CUpnpItem
+#include <upnpobject.h>                 // 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