upnpharvester/cdssync/cdssynclib/src/cdssyncsqlao.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:52:00 +0200
changeset 0 7f85d04be362
permissions -rw-r--r--
Revision: 200947 Kit: 200951

/*
* 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:      Cds Sync Active Object
*
*/






#include "mcmsqlmain.h"
#include "cmsqlbaseitem.h"
#include "cmsqlgenericitem.h"
#include "cdssyncsqlao.h"
#include "cdssyncimplsql.h"
#include "msdebug.h"

// CONSTANTS
const TInt KCdsSyncMaxImageItemCount = 15000;
const TInt KCdsSyncMaxVideoItemCount = 5000;
const TInt KCdsSyncMaxItemCount      = 40000;

// --------------------------------------------------------------------------
// CCdsSyncSqlAo::NewL
// --------------------------------------------------------------------------
//
CCdsSyncSqlAo* CCdsSyncSqlAo::NewL( 
    MCmSqlMain& aSqlDb,
    CCdsSyncImpl& aSync,
    RPointerArray<CCmSqlGenericItem>& aItemsToAdd,
    RPointerArray<CCmSqlBaseItem>& aItemsToDelete,
    TInt aAddGranularity )
    {    
    CCdsSyncSqlAo* self = CCdsSyncSqlAo::NewLC(
        aSqlDb,
        aSync,
        aItemsToAdd,
        aItemsToDelete,
        aAddGranularity );
    CleanupStack::Pop( self );
    return self;
    }
 
// --------------------------------------------------------------------------
// CCdsSyncSqlAo::NewLC
// --------------------------------------------------------------------------
//    
CCdsSyncSqlAo* CCdsSyncSqlAo::NewLC( 
    MCmSqlMain& aSqlDb,
    CCdsSyncImpl& aSync,
    RPointerArray<CCmSqlGenericItem>& aItemsToAdd,
    RPointerArray<CCmSqlBaseItem>& aItemsToDelete,
    TInt aAddGranularity )
    {    
    LOG(_L("[Cds Sync]\t CCdsSyncSqlAo::NewLC"));    
    CCdsSyncSqlAo* self = new (ELeave) CCdsSyncSqlAo( 
        aSqlDb, aSync, aItemsToAdd, aItemsToDelete, aAddGranularity  
        ); 
    CleanupStack::PushL( self );
    self->ConstructL(); 
    return self;
    }    

// --------------------------------------------------------------------------
// CCdsSyncSqlAo::~CCdsSyncSqlAo
// --------------------------------------------------------------------------
CCdsSyncSqlAo::~CCdsSyncSqlAo()
    {
    LOG(_L("[Cds Sync]\t CCdsSyncSqlAo::~CCdsSyncSqlAo"));    
    
    if ( IsActive() )
        {
        Cancel();
        }
    }

// --------------------------------------------------------------------------
// CCdsSyncSqlAo::CCdsSyncSqlAo
// --------------------------------------------------------------------------
CCdsSyncSqlAo::CCdsSyncSqlAo( MCmSqlMain& aSqlDb,
                              CCdsSyncImpl& aSync,
                              RPointerArray<CCmSqlGenericItem>& aItemsToAdd,
                              RPointerArray<CCmSqlBaseItem>& aItemsToDelete,
                              TInt aAddGranularity ) :
    CActive( CActive::EPriorityIdle ),
    iState( ECdsSyncSqlAoIdle ),
    iSqlDb( aSqlDb ),
    iSync( aSync ),
    iItemsToAdd( aItemsToAdd ),
    iItemsToDelete( aItemsToDelete ),
    iAddGranularity( aAddGranularity ),    
    iSourceDataComplete( EFalse )
    {
    }

// --------------------------------------------------------------------------
// CCdsSyncSqlAo::ConstructL
// --------------------------------------------------------------------------
void CCdsSyncSqlAo::ConstructL() 
    {
    LOG(_L("[Cds Sync]\t CCdsSyncSqlAo::ConstructL"));    
    CActiveScheduler::Add( this );
    }

// --------------------------------------------------------------------------
// CCdsSyncSqlAo::NotifyItemsAddedL
// --------------------------------------------------------------------------
void CCdsSyncSqlAo::NotifyItemsAddedL( TBool aSourceDataComplete )
    {
    LOG(_L("[Cds Sync]\t CCdsSyncSqlAo::NotifyItemsAddedL"));

    // Source data is complete
    if ( aSourceDataComplete )
        {
        iSourceDataComplete = ETrue;
        }

    TRACE( Print( _L("[Cds Sync]\t addarray has %d items, srccomplete %d"), 
        iItemsToAdd.Count(), iSourceDataComplete ));
    
    if ( iState == ECdsSyncSqlAoIdle )
        {
        if ( iItemsToAdd.Count() >= iAddGranularity || 
           ( iSourceDataComplete && iItemsToAdd.Count() ) )
        
            {
            // add more items
            iStatus = KRequestPending;
            iItemsInAddition = iItemsToAdd.Count();

        #ifdef _DEBUG
            iOperationTime.HomeTime();
        #endif

            TRACE( Print( _L("[Cds Sync]\t starting to add %d items"),
                 iItemsInAddition ));
            iSqlDb.AsyncBatchAdd( iItemsToAdd, iStatus );
            SetActive();    
            iState = ECdsSyncSqlAoAdding;
            }
        else if ( iSourceDataComplete )
            {
            // all done, start deleting
       #ifdef _DEBUG
            iOperationTime.HomeTime();
       #endif
            iSqlDb.AsyncBatchDelete( iItemsToDelete, iStatus );
            SetActive();
            iState = ECdsSyncSqlAoDeleting;
           }
        }
    }

// ---------------------------------------------------------------------------
// CCdsSyncSqlAo::Activate()
// ---------------------------------------------------------------------------
void CCdsSyncSqlAo::Activate()
    {
    SetActive();
    }

// --------------------------------------------------------------------------
// CCdsSyncSqlAo::IfOverLimitDeleteMediaItems() 
// --------------------------------------------------------------------------
void CCdsSyncSqlAo::IfOverLimitDeleteMediaItems() 
    {
    LOG(_L("[Cds Sync]\t CCdsSyncSqlAo::IfOverLimitDeleteMediaItems START"));
    TInt64 musicCount( KErrNone );
    TInt64 videoCount( KErrNone );
    TInt64 imageCount( KErrNone );
    TRAP_IGNORE( iSqlDb.GetMediaCountL( musicCount, ECmAudio ) );
    TRAP_IGNORE( iSqlDb.GetMediaCountL( videoCount, ECmVideo ) );
    TRAP_IGNORE( iSqlDb.GetMediaCountL( imageCount, ECmImage ) );
    TRACE( Print( _L("[Cds Sync]\t Amout of music items %ld"), musicCount ));
    TRACE( Print( _L("[Cds Sync]\t Amout of image items %ld"), imageCount ));
    TRACE( Print( _L("[Cds Sync]\t Amout of video items %ld"), videoCount ));
    if( KCdsSyncMaxImageItemCount < imageCount )
        {
        TRAP_IGNORE( iSqlDb.DeleteOldestMediaItemsL( ECmImage, 
            imageCount - KCdsSyncMaxImageItemCount ) );
        TRACE( Print( _L("[Cds Sync]\t deleted %ld image items"), 
            ( imageCount - KCdsSyncMaxImageItemCount )));           
        TRAP_IGNORE( iSqlDb.GetMediaCountL( imageCount, ECmImage ) );
        }
    if( KCdsSyncMaxVideoItemCount < videoCount )
        {
        TRAP_IGNORE( iSqlDb.DeleteOldestMediaItemsL( ECmVideo, 
            videoCount - KCdsSyncMaxVideoItemCount ) );
        TRACE( Print( _L("[Cds Sync]\t deleted %ld video items"), 
            ( videoCount - KCdsSyncMaxVideoItemCount )));              
        TRAP_IGNORE( iSqlDb.GetMediaCountL( videoCount, ECmVideo ) );
        }
    if( KCdsSyncMaxItemCount < ( imageCount + videoCount + musicCount ) )
        {
        TRAP_IGNORE( iSqlDb.DeleteOldestMediaItemsL( ECmAudio, 
            ( imageCount + videoCount + musicCount ) - 
            KCdsSyncMaxItemCount ) );
        TRACE( Print( _L("[Cds Sync]\t deleted %ld music items"), 
            ( ( imageCount + videoCount + musicCount ) - 
            KCdsSyncMaxItemCount )));                     
        }
    LOG(_L("[Cds Sync]\t CCdsSyncSqlAo::IfOverLimitDeleteMediaItems END"));
    }
    
// --------------------------------------------------------------------------
// CCdsSyncSqlAo::RunL() 
// --------------------------------------------------------------------------
void CCdsSyncSqlAo::RunL() 
    {
    TRACE( Print( _L("[Cds Sync]\t CCdsSyncSqlAo::RunL, iStatus %d"), 
        iStatus.Int() ));
    if ( iState == ECdsSyncSqlAoAdding )
        {
        iState = ECdsSyncSqlAoIdle;
        
    #ifdef _DEBUG
            
        TTime timeAfter;
        timeAfter.HomeTime();
        TRACE( Print( 
          _L("[Cds Sync]\t added %d, took %ld microsec, err %d"),
          iItemsToAdd.Count(), 
          timeAfter.MicroSecondsFrom( iOperationTime ).Int64(),
          iStatus.Int() ));
        TRACE( Print( _L("[Cds Sync]\t array has %d items"), 
           iItemsToAdd.Count() ));
        
    #endif
        
        TInt itemCount( iItemsToAdd.Count() );
        
        for ( TInt i = 0; i < itemCount; i++ )
            {
            delete iItemsToAdd[ 0 ];
            iItemsToAdd.Remove( 0 );
            }
        
        // check if there's more to add
        NotifyItemsAddedL();
        
        }
    else if ( iState == ECdsSyncSqlAoInitializing )
        {
        iSync.OperationsCompleteL( KErrNone );
        }
    else // ECdsSyncSqlAoDeleting
        {
    #ifdef _DEBUG
    
        TTime timeAfter;
        timeAfter.HomeTime();
        TRACE( Print( 
          _L("[Cds Sync]\t removed %d, took %ld microsec, err %d"),
          iItemsToDelete.Count(), 
          timeAfter.MicroSecondsFrom( iOperationTime ).Int64(),
          iStatus.Int() ));
    #endif
            
        iItemsToDelete.ResetAndDestroy();
        LOG(_L("[Cds Sync]\t Checking if too much media..."));
        IfOverLimitDeleteMediaItems();
        LOG(_L("[Cds Sync]\t Checked!"));
        LOG(_L("[Cds Sync]\t Deleting unused propertys"));
        iSqlDb.DeleteUnusedPropertys( );
        iState = ECdsSyncSqlAoIdle;
        iSync.OperationsCompleteL( KErrNone );
        }
    }

// --------------------------------------------------------------------------
// CCdsSyncSqlAo::DoCancel()
// --------------------------------------------------------------------------
void CCdsSyncSqlAo::DoCancel()
    {
    LOG(_L("[Cds Sync]\t CCdsSyncSqlAo::DoCancel"));    
    }