homesync/contentmanager/cmserver/cmstoremanager/src/cmsmtransferengine.cpp
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homesync/contentmanager/cmserver/cmstoremanager/src/cmsmtransferengine.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,753 @@
+/*
+* Copyright (c) 2008 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:  AV Controller UPnP actions handler
+*  Version     : %version: tr1ido#1.1.10 % << Don't touch!
+*
+*/
+
+#include <utf.h>
+#include "upnpavdevice.h"
+#include "upnpavcontroller.h"
+#include "upnpfileuploadsession.h"
+
+#include "cmsmtransferobserver.h"
+#include "cmdmmain.h"
+#include "cmstorelistitem.h"
+#include "cmsqlmainfactory.h"
+#include "mcmsqlmain.h"
+#include "cmsmtransferengine.h"
+#include "msdebug.h"
+
+// CONSTANTS
+const TInt KGranularity = 10;
+//If once total size bigger than 30MB may cause timeout when uploading
+const TInt KCopySizePerTime = 30 * KMega;
+//If once total count more than 20 files may cause timeout when uploading
+const TInt KCopyCountPerTime = 20;
+    
+#ifdef _DEBUG
+_LIT( KCmStoreManager, "CmStoreManager" ); 
+#endif // _DEBUG
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::NewL
+// ---------------------------------------------------------------------------
+// 
+CCmSmTransferEngine* CCmSmTransferEngine::NewL( 
+    MCmSmTransferObserver* aObserver, CCmDmMain* aDBMngr, 
+    RPointerArray<CCmStoreListItem>& aItems, RArray<TInt>& aItemIds )
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::NewL() start"));    
+    CCmSmTransferEngine* self = CCmSmTransferEngine::NewLC( aObserver, 
+        aDBMngr, aItems, aItemIds );
+    CleanupStack::Pop( self );
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::NewL() end"));
+    return self;
+    }
+ 
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::NewLC
+// ---------------------------------------------------------------------------
+//    
+CCmSmTransferEngine* CCmSmTransferEngine::NewLC( 
+    MCmSmTransferObserver* aObserver, CCmDmMain* aDBMngr,
+    RPointerArray<CCmStoreListItem>& aItems, RArray<TInt>& aItemIds )
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::NewLC() start"));    
+    CCmSmTransferEngine* self = new ( ELeave ) CCmSmTransferEngine( aObserver,
+        aDBMngr, aItems, aItemIds );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::NewLC() end"));
+    return self;  
+    }    
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::~CCmSmTransferEngine
+// ---------------------------------------------------------------------------
+// 
+CCmSmTransferEngine::~CCmSmTransferEngine()
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::~CCmSmTransferEngine()"));
+    CancelCopy();
+    if( iFilesToBeRemoved )
+        {
+        iFilesToBeRemoved->Reset();
+        delete iFilesToBeRemoved;
+        }
+    if( iFilesToBeShrinked )
+        {
+        iFilesToBeShrinked->Reset();
+        delete iFilesToBeShrinked;
+        }
+    iToBeDeleted.Close();        
+    iObserver = NULL;
+    iDBManager = NULL;   
+    iDbWrapper->Close();
+    iFSession.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::CCmSmTransferEngine
+// ---------------------------------------------------------------------------
+//         
+CCmSmTransferEngine::CCmSmTransferEngine( MCmSmTransferObserver* aObserver, 
+    CCmDmMain* aDBMngr, RPointerArray<CCmStoreListItem>& aItems, 
+    RArray<TInt>& aItemIds )
+    : iObserver( aObserver ), iDBManager( aDBMngr ), iDevice( NULL ), 
+    iItems( aItems ), iItemIds(aItemIds)
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::CCmSmTransferEngine"));    
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::ConstructL
+// ---------------------------------------------------------------------------
+//  
+void CCmSmTransferEngine::ConstructL()
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::ConstructL"));    
+    
+    User::LeaveIfError( iFSession.Connect() );
+    iFilesToBeRemoved = new ( ELeave ) CDesCArrayFlat( KGranularity );
+    iFilesToBeShrinked = new ( ELeave ) CDesCArrayFlat( KGranularity );
+    iDbWrapper = CCmSqlMainFactory::NewCmSqlMainL( iFSession );
+    }    
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::SetAvController
+// ---------------------------------------------------------------------------
+// 
+void CCmSmTransferEngine::SetAvController( MUPnPAVController* aAVController )
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::SetAvController"));    
+    
+    iAVController = aAVController;
+    iUploadSession = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::GetMediaServersL
+// ---------------------------------------------------------------------------
+//     
+void CCmSmTransferEngine::GetMediaServersL( 
+    CUpnpAVDeviceList*& aDevices )
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::GetMediaServersL()"));
+    
+    aDevices = iAVController->GetMediaServersL();    
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::ResetFileArrays
+// ---------------------------------------------------------------------------
+// 
+void CCmSmTransferEngine::ResetFileArrays()
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::ResetFileArrays"));
+    
+    if( iFilesToBeRemoved )
+        {
+        iFilesToBeRemoved->Reset();
+        }
+    if( iFilesToBeShrinked )
+        {
+        iFilesToBeShrinked->Reset();
+        }    
+    iToBeDeleted.Reset();
+    iToBeDeleted.Close();      
+    }
+    
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::CancelCopy
+// ---------------------------------------------------------------------------
+//        
+void CCmSmTransferEngine::CancelCopy()
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::CancelCopy()"));
+    
+    if ( iAVController )
+        {
+        iAVController->StopUploadSession( *iUploadSession );
+        iUploadSession = NULL;
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::CopyFilesL
+// ---------------------------------------------------------------------------
+//
+void CCmSmTransferEngine::CopyFilesL( TUint8 aDevId, 
+    CUpnpAVDevice* aDevice )
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::CopyFilesL"));
+    
+    if( iAVController )
+        {
+        iAVController->StopUploadSession( *iUploadSession );
+        iUploadSession = NULL;
+        }
+    iDevId = aDevId;    
+    iIndex = iItemIds.Count() - 1;    
+    iDevice = aDevice;
+    ResetFileArrays();   
+    iTransferredData = KErrNone; 
+	iTotalTransferredData = KErrNone;
+	
+    if( aDevice )
+        {
+        ConnectedToDeviceL( *aDevice );
+        CopySingleFileL();        
+        }
+    else
+        {
+        LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::CopyFilesL \
+        aDevice == NULL"));
+        FinishCopy();
+        }        
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::DataAmount
+// ---------------------------------------------------------------------------
+//
+TInt CCmSmTransferEngine::DataAmount() const
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::DataAmount"));
+    
+    return iTotalTransferredData;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::FilesToBeRemoved
+// ---------------------------------------------------------------------------
+//
+CDesCArray& CCmSmTransferEngine::FilesToBeRemoved()
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::FilesToBeRemoved"));
+    
+    /** Files to be removed */
+    return *iFilesToBeRemoved;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::DeleteToBeRemoved
+// ---------------------------------------------------------------------------
+//    
+void CCmSmTransferEngine::DeleteToBeRemoved()
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::DeleteToBeRemoved"));
+    
+    iFilesToBeRemoved->Reset();    
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::FilesToBeShrinked
+// ---------------------------------------------------------------------------
+//        
+CDesCArray& CCmSmTransferEngine::FilesToBeShrinked()
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::FilesToBeShrinked"));
+    
+    /** Files to be shrinked */
+    return *iFilesToBeShrinked;        
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::DeleteToBeShrinked
+// ---------------------------------------------------------------------------
+//
+void CCmSmTransferEngine::DeleteToBeShrinked()
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::DeleteToBeShrinked"));
+    
+    iFilesToBeShrinked->Reset();    
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::ToBeDeleted
+// ---------------------------------------------------------------------------
+//
+RArray<TInt>& CCmSmTransferEngine::ToBeDeleted()
+    {
+    TRACE(Print(_L("[STORE MNGR] CCmSmTransferEngine::DeleteToBeShrinked \
+    To be deleted count = %d"), 
+        iToBeDeleted.Count() ));
+    return iToBeDeleted;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::TransferStarted
+// ---------------------------------------------------------------------------
+//
+#ifdef _DEBUG
+void CCmSmTransferEngine::TransferStarted( TInt aKey, TInt aStatus )
+    {
+#else
+void CCmSmTransferEngine::TransferStarted( TInt /*aKey*/, TInt /*aStatus*/ )
+    {
+#endif        
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::TransferStarted()"));
+    TRACE(Print( _L("[STORE MNGR] Started transferin file aKey = %D"),aKey));
+    TRACE(Print( _L("[STORE MNGR] Started transferin file aStatus = %D"),
+        aStatus ));
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::TransferCompleted
+// ---------------------------------------------------------------------------
+//
+void CCmSmTransferEngine::TransferCompleted( TInt aKey, TInt aStatus,
+        const TDesC& /*aFilePath*/ )
+    {
+    TRACE(Print(_L("[STORE MNGR]\t CCmSmTransferEngine::TransferCompleted() \
+     aStatus %d"), aStatus ));     
+    TRACE(Print( _L("[STORE MNGR] Transfered file = %d"), aKey ));    
+    
+    iObserver->TransferStatus( ECmSmFileTransferred );
+    TInt err( KErrNone );
+    if( !aStatus )
+        {
+        TTime time;
+        time.HomeTime();
+        if( iItems[ iItemIds[ aKey ] ] )
+            {
+            TRAP( err, AddStoredL( iItems[iItemIds[aKey]]->Path(), 
+                iDevice->Uuid(), time ) ); 
+            TRACE(Print( _L("[STORE MNGR] AddStoredL err = %d"), err ));                            
+            }
+        TRAP( err, HandleItemStatusL( aKey ) );
+        TRACE(Print( _L("[STORE MNGR] HandleItemStatusL err = %d"), err )); 
+        }    
+    TInt index( iTransferQueue.FindInOrder( aKey ) );
+    if( KErrNotFound != index )
+        {
+        iTransferQueue.Remove( index );
+        if( !iTransferQueue.Count() )
+            {
+            LOG( _L("[STORE MNGR] Transfer successfully completed"));
+            LOG( _L("[STORE MNGR] Queue empty!"));
+            iObserver->TransferStatus( ECmSmTransferCompleted );             
+            iTransferQueue.Reset();          
+            }        
+        }
+    else
+        {
+        LOG( _L("[STORE MNGR] Transfer successfully completed"));
+        iObserver->TransferStatus( ECmSmTransferCompleted );             
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::TransferProgress
+// ---------------------------------------------------------------------------
+//
+void CCmSmTransferEngine::TransferProgress( TInt /*aKey*/, TInt aBytes,
+        TInt aTotalBytes )
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::TransferProgress"));
+    
+    iTransferredData = ( aBytes / KKilo ); // Convert to kilobytes
+    
+    // Check if file has been transferred completely
+    if ( aBytes == aTotalBytes )
+    	{
+    	iTotalTransferredData += ( aTotalBytes / KKilo );
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::MediaServerDisappeared
+// ---------------------------------------------------------------------------
+//
+void CCmSmTransferEngine::MediaServerDisappeared( 
+    TUPnPDeviceDisconnectedReason /*aReason*/ )
+    {
+    TRACE(Print( _L("[STORE MNGR] CCmSmTransferEngine::\
+    MediaServerDisappeared WLANLost") ));
+    CancelCopy();        
+    iObserver->TransferStatus( ECmSmWlanLost );        
+    DeleteToBeRemoved();
+    DeleteToBeShrinked();
+    iToBeDeleted.Reset();
+    iToBeDeleted.Close();  
+    }
+               
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::CancelOperation
+// ---------------------------------------------------------------------------
+//    
+void CCmSmTransferEngine::CancelOperation()
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::CancelOperation"));
+    
+    CancelCopy();
+    DeleteToBeRemoved();
+    DeleteToBeShrinked();
+    iToBeDeleted.Reset();
+    iToBeDeleted.Close();    
+    iObserver->TransferStatus(ECmSmTransferCanceled);
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::CopySingleFileL
+// ---------------------------------------------------------------------------
+//
+void CCmSmTransferEngine::CopySingleFileL()
+    {
+    LOG( _L("[STORE MNGR] COTSTransferEngine::CopySingleFileL"));
+    
+    /** File transfer started */
+    iTransferStarted.HomeTime();    
+    // Files left in queue
+    iTransferQueue.Reset();
+    iCopyStatus = ECmSmCopyNever;
+    //start uploading
+    CopyFilesOnceL();
+
+    if( iItems.Count() == KErrNone )
+        {
+        iCopyStatus = ECmSmCopySuccess;
+        LOG( _L("[STORE MNGR] Transfer successfully completed"));
+        __ASSERT_DEBUG(( iIndex + 1 == 0 ),\
+            User::Panic( KCmStoreManager, ECmSmTransferQueueMessedUp ));
+        FinishCopy();
+        }
+    if( ECmSmCopyNever == iCopyStatus )
+        {
+        FinishCopy();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::ContinueCopyFilesL
+// ---------------------------------------------------------------------------
+//  
+void CCmSmTransferEngine::ContinueCopyFilesL()
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::ContinueCopyFilesL"));
+    
+    CopyFilesOnceL();
+
+    if ( iIndex == KErrNotFound && ECmSmCopyContinued == iCopyStatus )
+        {
+        iCopyStatus = ECmSmCopyNever; 
+        }
+    if( ECmSmCopyNever == iCopyStatus )
+        {
+        FinishCopy();    
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::CopyFilesOnceL
+// ---------------------------------------------------------------------------
+//  
+void CCmSmTransferEngine::CopyFilesOnceL()
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::CopyFilesOnceL"));
+    
+    TInt copySize( 0 );
+    TInt copyCt( 0 );
+    if( iItemIds.Count() )
+        {
+        while( 0 <= iIndex && 
+               copySize < KCopySizePerTime &&
+               copyCt < KCopyCountPerTime )
+            {
+            if( iItemIds[iIndex] < iItems.Count() )
+                {
+                TFileName tempFileName;
+                tempFileName.Copy( iItems[iItemIds[iIndex]]->Path() );
+                TRACE(Print( _L("[STORE MNGR] Filename S.L 16-bit = %S,%d"), 
+                    &tempFileName, iUploadSession ));
+                if( !IsDuplicateL( iIndex ) )
+                    {
+                    TRAPD( err, iUploadSession->StartUploadL( 
+                        tempFileName, iIndex ) );
+                        
+                    if( !err )
+                        {
+                        iCopyStatus = ECmSmCopySuccess;
+                        }
+                    
+                    TRAP( err, 
+                        iUploadSession->StartTrackingProgressL( iIndex ) );                
+                    tempFileName.Zero();
+                    if( !err )
+                        {
+                        iTransferQueue.InsertInOrder( iIndex );
+                        }
+                    copySize += iItems[iItemIds[iIndex]]->Size();
+                    copyCt++;
+                    }
+                else
+                    {
+                    LOG( _L("[STORE MNGR] File already \
+                    on server!Skip file!"));
+
+                    TTime time;
+                    time.HomeTime();
+                    AddStoredL( iItems[iItemIds[iIndex]]->Path(), 
+                                    iDevice->Uuid(), time ); 
+                    HandleItemStatusL( iIndex );                      
+                    }
+                }
+            iIndex--;
+            if( ( copySize >= KCopySizePerTime ||
+                  copyCt >= KCopyCountPerTime ) &&
+                  iIndex != KErrNotFound )
+                {
+                if( ECmSmCopySuccess != iCopyStatus )
+                    {
+                    iCopyStatus = ECmSmCopyContinued;
+                    }
+                iObserver->TransferStatus( ECmSmTransferContinued );
+                }
+            }        
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::FinishCopy
+// ---------------------------------------------------------------------------
+//  
+void CCmSmTransferEngine::FinishCopy()
+    {
+    LOG( _L("[STORE MNGR] CCmSmTransferEngine::FinishCopy \
+    No files to be transfered!"));
+    iObserver->TransferStatus( ECmSmTransferCompleted );             
+    CancelCopy();
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::ConnectedToDeviceL
+// ---------------------------------------------------------------------------
+//    
+void CCmSmTransferEngine::ConnectedToDeviceL( const CUpnpAVDevice& aDevice )
+    {
+    LOG( _L("[STORE MNGR] CCmSmTransferEngine::ConnectedToDeviceL"));
+    
+    CancelCopy();
+    iUploadSession = &iAVController->StartUploadSessionL( aDevice );
+    iUploadSession->SetObserver( *this );
+#ifdef _DEBUG
+    CUpnpAVDevice& device = const_cast< CUpnpAVDevice& >( aDevice );                    
+    HBufC* data16bitBuf = HBufC::NewLC( device.FriendlyName().Length() );
+    TPtr data16bitPtr = data16bitBuf->Des();
+    TInt conversionError = 
+        CnvUtfConverter::ConvertToUnicodeFromUtf8( data16bitPtr, 
+            device.FriendlyName() );
+            
+    TRACE(Print( _L("[STORE MNGR] conversionError = %d"), conversionError ));            
+    TRACE(Print( _L("[STORE MNGR] Target device name: %S"), 
+        &data16bitPtr ));
+    
+    CleanupStack::PopAndDestroy( data16bitBuf );
+    
+    data16bitBuf = HBufC::NewLC( device.FriendlyName().Length() );
+    
+    data16bitPtr = data16bitBuf->Des();
+    conversionError = 
+        CnvUtfConverter::ConvertToUnicodeFromUtf8( data16bitPtr, 
+            device.FriendlyName() );
+    TRACE(Print( _L("[STORE MNGR] conversionError = %d"), conversionError ));             
+    TRACE(Print( _L("[STORE MNGR] Targer device id: %S"), 
+        &data16bitPtr ));                
+                                                
+    CleanupStack::PopAndDestroy( data16bitBuf );    
+#endif
+
+    LOG( _L("[STORE MNGR] ****** Connected to target device ******"));
+    LOG( _L("[STORE MNGR] CCmSmTransferEngine::ConnectedToDeviceL end"));
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::AddStoredL
+// ---------------------------------------------------------------------------
+// 
+void CCmSmTransferEngine::AddStoredL( const TDesC& aFileName, 
+    const TDesC8& aUDN, TTime aTimeStamp )
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::AddStoredL"));
+    
+    iDBManager->AddStoredL( aFileName, aUDN, aTimeStamp );    
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::HandleItemStatusL
+// ---------------------------------------------------------------------------
+//
+void CCmSmTransferEngine::HandleItemStatusL( const TInt aKey )
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::HandleItemStatusL"));
+    
+    RArray<TCmListItemStatus> statusValues; // ownership transferred  
+    RArray<TInt> devIds; // ownership transferred
+
+    TInt index( KErrNotFound );
+    TCmListItemStatus status( ECmStored );    
+    
+    if( iItemIds[aKey] < iItems.Count() )
+        {
+        devIds = iItems[iItemIds[aKey]]->DevIds();    
+        statusValues = iItems[iItemIds[aKey]]->StatusValues();
+        index = devIds.Find( iDevId );
+        }
+    
+    if( KErrNotFound != index )
+        {
+        status = statusValues[index];
+        }
+    TInt countOfStatusVal( KErrNone );
+    TRACE(Print( _L("[STORE MNGR] Status = %d"), 
+        (TInt)status ));    
+    TRACE(Print( _L("[STORE MNGR] statusValues.Count() = %d"), 
+        statusValues.Count() ));    
+    for( TInt i = 0 ; i < statusValues.Count(); i++ )
+        {
+        if( statusValues[i] == status )
+            {
+            countOfStatusVal++;
+            }
+        }
+     
+    TRACE(Print( _L("[STORE MNGR] countOfStatusVal = %d"), 
+        countOfStatusVal ));
+    if( iItemIds[aKey] < iItems.Count() )
+        {
+        switch( status )
+            {
+            case ECmToBeRemoved:
+                {
+                LOG(_L("[STORE MNGR]\t To be removed"));
+                if (  2 > countOfStatusVal )
+                    {
+                    iItems[iItemIds[aKey]]->
+                        UpdateFileStatusL( iDevId, ECmStored );
+                    // Let's mark item to be deleted from the db
+                    iToBeDeleted.InsertInOrder( iItemIds[aKey] );
+                    iFilesToBeRemoved->AppendL( 
+                        iItems[iItemIds[aKey]]->Path() );
+                    }
+                else
+                    {
+                    iItems[iItemIds[aKey]]->
+                        UpdateFileStatusL( iDevId, ECmStored );
+                    }    
+                break;
+                }
+            case ECmToBeShrinked:
+                {
+                LOG(_L("[STORE MNGR]\t To be shrinked"));
+                if ( 2 > countOfStatusVal)
+                    {            
+                    iItems[iItemIds[aKey]]->
+                        UpdateFileStatusL( iDevId, ECmStored );
+                    // Let's mark item to be deleted from the db
+                    iToBeDeleted.InsertInOrder( iItemIds[aKey] );
+                    iFilesToBeShrinked->AppendL( 
+                        iItems[iItemIds[aKey]]->Path() );
+                    }
+                else
+                    {
+                    iItems[iItemIds[aKey]]->
+                        UpdateFileStatusL( iDevId, ECmStored );
+                    }                
+                break;
+                }        
+            case ECmKeepOnDevice:
+                {
+                LOG(_L("[STORE MNGR]\t Keep On Device"));
+                if( 2 > countOfStatusVal )
+                    {
+                    iItems[iItemIds[aKey]]->
+                        UpdateFileStatusL( iDevId, ECmStored );
+                    // Let's mark item to be deleted from the db
+                    iToBeDeleted.InsertInOrder( iItemIds[aKey] );
+                    }
+                else
+                    {
+                    // If no action needed just change status
+                    iItems[iItemIds[aKey]]->
+                        UpdateFileStatusL( iDevId, ECmStored );
+                    }    
+                break;
+                }
+            case ECmStored:
+                {
+                LOG(_L("[STORE MNGR]\t already stored"));
+                break;
+                }
+            default:
+                {
+                LOG(_L("[STORE MNGR]\t Wrong status!!!"));
+                TRACE(Print( _L("[STORE MNGR] Status = %d"), (TInt)status ));
+                User::Invariant();
+                break;
+                }
+            } 
+        UpdateStoreTransferStatus( ECmStored,
+                                   iItems[iItemIds[aKey]]->DbId(),
+                                   iDevId );
+        }       
+    }    
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::UpdateStoreTransferStatus
+// ---------------------------------------------------------------------------
+//
+void CCmSmTransferEngine::UpdateStoreTransferStatus( TUint aStatus, 
+    TInt64 aFid, TInt64 aMsId )
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::UpdateStoreTransferStatus"));
+    
+    iDBManager->UpdateStoreTransferStatus( aStatus, aFid, aMsId );
+    }
+    
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::GetArrayIndex
+// ---------------------------------------------------------------------------
+//
+TInt CCmSmTransferEngine::GetArrayIndex( TInt aKey )
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::GetArrayIndex"));
+    
+    TInt index( 0 );
+    for( TInt i = 0; i < iItemIds.Count(); i++ )
+        {
+        if( iItems[iItemIds[i]]->DbId() == aKey )
+            {
+            index = i;
+            // End loop
+            i = iItemIds.Count();
+            }
+        }
+    return index;    
+    }
+
+// ---------------------------------------------------------------------------
+// CCmSmTransferEngine::IsDuplicateL
+// ---------------------------------------------------------------------------
+// 
+TBool CCmSmTransferEngine::IsDuplicateL( const TInt aIndex )
+    {
+    LOG(_L("[STORE MNGR]\t CCmSmTransferEngine::IsDuplicateL"));
+    
+    return iDbWrapper->ExistsL( *iItems[iItemIds[aIndex]], iDevId );
+    }
+    
+// End of file
+
+