diff -r 8e7494275d3a -r 4f0867e42d62 omads/omadsextensions/adapters/mediads/src/changefinder.cpp --- a/omads/omadsextensions/adapters/mediads/src/changefinder.cpp Tue Aug 31 15:05:37 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,537 +0,0 @@ -/* -* Copyright (c) 2009 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: Part of SyncML Data Synchronization Plug In Adapter -* -*/ - - -#include "changefinder.h" -#include "logger.h" - -const TUint KSnapshotFormatVersion ( 0xf0000001 ); // format version - -// ----------------------------------------------------------------------------- -// CChangeFinder::NewL -// Static function to create CChangeFider object(s) -// ----------------------------------------------------------------------------- -CChangeFinder* CChangeFinder::NewL( MSmlSyncRelationship& aSyncRelationship, TKeyArrayFix aKey, - TBool& aHasHistory, TInt aStreamUid ) - { - CChangeFinder* self = new (ELeave) CChangeFinder( aSyncRelationship, aKey, aStreamUid ); - CleanupStack::PushL( self ); - self->ConstructL( aHasHistory ); - CleanupStack::Pop( self ); - return self; - } - -// ----------------------------------------------------------------------------- -// CChangeFinder::CChangeFinder -// Constructor for the class -// ----------------------------------------------------------------------------- -CChangeFinder::CChangeFinder( MSmlSyncRelationship& aSyncRelationship, TKeyArrayFix aKey, TInt aStreamUid ) : -iSyncRelationship( aSyncRelationship ), -iKey(aKey), -iStreamUid( aStreamUid ), -iDataStoreUid( KErrNotFound ) - { - - } - -// ----------------------------------------------------------------------------- -// CChangeFinder::~CChangeFinder -// Destructor for the class, closes the ChangeFinder and writes snapshot to stream -// ----------------------------------------------------------------------------- -CChangeFinder::~CChangeFinder() - { - TRACE_FUNC_ENTRY; - TInt error; - TRAP( error, CloseL() ); - if ( error != KErrNone ) - { - LOGGER_WRITE( "CChangeFinder::~CChangeFinder, CloseL failed." ); - } - - delete iCurrentSnapshot; - iCurrentSnapshot = NULL; - delete iOldSnapshot; - iOldSnapshot = NULL; - - TRACE_FUNC_EXIT; - } - -// ----------------------------------------------------------------------------- -// CChangeFinder::ConstructL -// 2nd phase constructor for the class, reads snapshot from stream -// ----------------------------------------------------------------------------- -void CChangeFinder::ConstructL( TBool& aHasHistory ) - { - TRACE_FUNC_ENTRY; - - TUid streamId; - streamId.iUid = iStreamUid; - - aHasHistory = iSyncRelationship.IsStreamPresentL(streamId); - - if ( aHasHistory ) - { - LOGGER_WRITE("CChangeFinder::ConstructL, history exists."); - RReadStream readStream; - iSyncRelationship.OpenReadStreamLC(readStream, streamId); - - // Read the index, first create snapshot array - iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); - - // Read used format version - TUint formatVer = readStream.ReadUint32L(); - if ( formatVer != KSnapshotFormatVersion ) - { - // Wrong version, do not try to import data - LOGGER_WRITE("CChangeFinder::ConstructL, Wrong format version -> no history"); - aHasHistory = EFalse; - CleanupStack::PopAndDestroy( &readStream ); - TRACE_FUNC_EXIT; - return; - } - - // Read item count - TInt count = readStream.ReadUint32L(); - // Read items - for ( TInt i=0; iInsertIsqL( item, iKey ); - } - - CleanupStack::PopAndDestroy( &readStream ); - } - else - { - LOGGER_WRITE("CChangeFinder::ConstructL, no sync history."); - } - - TRACE_FUNC_EXIT; - } - -// ----------------------------------------------------------------------------- -// CChangeFinder::CloseL -// Closes ChangeFinder object and writes snapshot to stream -// ----------------------------------------------------------------------------- -void CChangeFinder::CloseL() - { - TRACE_FUNC_ENTRY; - - // Write to stream - RWriteStream writeStream; - - TUid streamId; - streamId.iUid = iStreamUid; - - // Open write stream - iSyncRelationship.OpenWriteStreamLC( writeStream, streamId ); - - // Write used format version - writeStream.WriteUint32L( KSnapshotFormatVersion ); - - // Write item count - TInt count(0); - if ( iOldSnapshot ) - { - count = iOldSnapshot->Count(); - } - writeStream.WriteUint32L(count); - - // Write items - for (TInt i=0; iAt( i ); - item.ExternalizeL( writeStream ); - } - - writeStream.CommitL(); - CleanupStack::PopAndDestroy( &writeStream ); - - TRACE_FUNC_EXIT; - } - -// ----------------------------------------------------------------------------- -// CChangeFinder::ResetL -// Resets synchronization history, all contetn is considered new after this call -// ----------------------------------------------------------------------------- -void CChangeFinder::ResetL() - { - TRACE_FUNC_ENTRY; - - // Delete old change information - if ( iOldSnapshot ) - { - LOGGER_WRITE("iOldSnapshot->Reset()"); - iOldSnapshot->Reset(); - } - - // Write 'null' data to file, - // this removes change history from the file - CloseL(); - - TRACE_FUNC_EXIT; - } - -// ----------------------------------------------------------------------------- -// CChangeFinder::FindChangedItemsL -// Compares snapshots, finds changed items -// ----------------------------------------------------------------------------- -void CChangeFinder::FindChangedItemsL( CNSmlDataItemUidSet& aChangedUids ) - { - TRACE_FUNC_ENTRY; - - if ( !iCurrentSnapshot ) - { - LOGGER_WRITE( "CChangeFinder::FindChangedItemsL leaved, no current snapshot." ); - User::Leave( KErrNotFound ); - } - - if ( !iOldSnapshot ) - { - LOGGER_WRITE( "CChangeFinder::FindChangedItemsL leaved, no old snapshot." ); - User::Leave( KErrNotFound ); - } - - TInt index; - TInt count = iCurrentSnapshot->Count(); - LOGGER_WRITE_1( "CChangeFinder::FindChangedItemsL count: %d", count ); - for ( TInt i=0; i < count; i++ ) - { - const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); - // Find this entry from the old snapshot - if ( iOldSnapshot->FindIsq( currentItem, iKey, index ) == KErrNone) - { - // This is the old item - TSnapshotItem& oldItem = iOldSnapshot->At( index ); - // Compare hash to see whether this was changed - if ( oldItem.Hash().Compare( currentItem.Hash() ) != 0 - || oldItem.ParentId() != currentItem.ParentId() ) - { - aChangedUids.AddItem( currentItem.ItemId() ); - //LOGGER_WRITE_1( "Item %d was changed.", currentItem.ItemId() ); - } - } - } - - TRACE_FUNC_EXIT; - } - -// ----------------------------------------------------------------------------- -// CChangeFinder::FindDeletedItemsL -// Compares snapshots, finds deleted items -// ----------------------------------------------------------------------------- -void CChangeFinder::FindDeletedItemsL( CNSmlDataItemUidSet& aDeletedUids ) - { - TRACE_FUNC_ENTRY; - - if ( !iOldSnapshot ) - { - LOGGER_WRITE( "CChangeFinder::FindDeletedItemsL leaved, no old snapshot." ); - User::Leave( KErrNotFound ); - } - - TInt index; - TInt count = iOldSnapshot->Count(); - for ( TInt i=0; i < count; i++ ) - { - const TSnapshotItem& currentItem = iOldSnapshot->At( i ); - - // If there's no current snapshot, this definately is deleted item - if ( !iCurrentSnapshot ) - { - aDeletedUids.AddItem( currentItem.ItemId() ); - //LOGGER_WRITE_1( "Item %d was deleted.", currentItem.ItemId() ); - } - // It is also new if it doesn't exist int the current snapshot. - else if ( iCurrentSnapshot->FindIsq( currentItem, iKey, index ) != KErrNone ) - { - aDeletedUids.AddItem( currentItem.ItemId() ); - //LOGGER_WRITE_1( "Item %d was deleted.", currentItem.ItemId() ); - } - } - - TRACE_FUNC_EXIT; - } - -// ----------------------------------------------------------------------------- -// CChangeFinder::FindNewItemsL -// Compares snapshots, finds new items -// ----------------------------------------------------------------------------- -void CChangeFinder::FindNewItemsL( CNSmlDataItemUidSet& aNewUids ) - { - TRACE_FUNC_ENTRY; - - if ( !iCurrentSnapshot ) - { - LOGGER_WRITE( "CChangeFinder::FindNewItemsL leaved, no current snapshot." ); - User::Leave( KErrNotFound ); - } - - TInt index; - TInt count = iCurrentSnapshot->Count(); - for ( TInt i=0; i < count; i++ ) - { - const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); - - // If there's no old snapshot, all items are new - if ( !iOldSnapshot ) - { - aNewUids.AddItem( currentItem.ItemId() ); - //LOGGER_WRITE_1( "Item %d was new.", currentItem.ItemId() ); - } - // It is also new if it doesn't exist int the old snapshot. - else if ( iOldSnapshot->FindIsq( currentItem, iKey, index ) != KErrNone ) - { - aNewUids.AddItem( currentItem.ItemId() ); - //LOGGER_WRITE_1( "Item %d was new.", currentItem.ItemId() ); - } - } - - TRACE_FUNC_EXIT; - } - - -// ----------------------------------------------------------------------------- -// CChangeFinder::ItemAddedL -// Adds item to snapshot, this item is no longer considered new -// ----------------------------------------------------------------------------- -void CChangeFinder::ItemAddedL( const TSnapshotItem& aItem ) - { - TRACE_FUNC_ENTRY; - - // Add this to old snapshot, if there's no old snapshot it must be created - if ( !iOldSnapshot ) - { - iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); - } - - LOGGER_WRITE_1( "Adding item %d.", aItem.ItemId() ); - - TRAPD( error, iOldSnapshot->InsertIsqL( aItem, iKey ) ); - if ( error == KErrAlreadyExists ) - { - // It was already committed, no actions required - LOGGER_WRITE( "iOldSnapshot->InsertIsqL leaved with KErrAlreadyExists" ); - } - else if ( error != KErrNone ) - { - LOGGER_WRITE_1( "iOldSnapshot->InsertIsqL leaved with %d.", error ); - User::Leave( error ); - } - iOldSnapshot->Compress(); - - TRACE_FUNC_EXIT; - } - -// ----------------------------------------------------------------------------- -// CChangeFinder::ItemDeletedL -// Removes item to snapshot, this item is no longer considered deleted -// ----------------------------------------------------------------------------- -void CChangeFinder::ItemDeletedL( const TSnapshotItem& aItem ) - { - TRACE_FUNC_ENTRY; - - LOGGER_WRITE_1( "deleting item %d.", aItem.ItemId() ); - - if ( !iOldSnapshot ) - { - LOGGER_WRITE( "CChangeFinder::ItemDeleted leaved, no old snapshot." ); - User::Leave( KErrNotFound ); - } - - // Delete item from the old snapshot - TInt index; - if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) - { - iOldSnapshot->Delete( index ); - } - else // Skip, there wasn't such entry - { - LOGGER_WRITE( "iOldSnapshot->FindIsq, item was not found." ); - } - iOldSnapshot->Compress(); - - TRACE_FUNC_EXIT; - } - -// ----------------------------------------------------------------------------- -// CChangeFinder::ItemUpdatedL -// Updates item to snapshot, this item is no longer considered changed -// ----------------------------------------------------------------------------- -void CChangeFinder::ItemUpdatedL( const TSnapshotItem& aItem ) - { - TRACE_FUNC_ENTRY; - - LOGGER_WRITE_1( "Updating item %d.", aItem.ItemId() ); - - // There must be such entry in the snapshot after this - // If there isn't old snapshot, we'll create it and add the item - if ( !iOldSnapshot ) - { - iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); - ItemAddedL( aItem ); - } - else - { - // Update item in the old snapshot - TInt index; - if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) - { - TSnapshotItem& oldItem = iOldSnapshot->At( index ); - oldItem = aItem; - } - else - { - // There was old snapshot but no such item. Let's add it - ItemAddedL( aItem ); - } - - } - iOldSnapshot->Compress(); - TRACE_FUNC_EXIT; - } - - -// ----------------------------------------------------------------------------- -// CChangeFinder::CommitChangesL -// Commits current changes to snapshot -// ----------------------------------------------------------------------------- -void CChangeFinder::CommitChangesL() - { - TRACE_FUNC_ENTRY; - - if ( !iCurrentSnapshot ) - { - LOGGER_WRITE( "CChangeFinder::CommitChangesL leaved, current snapshot missing." ); - User::Leave( KErrNotFound ); - } - - if ( !iOldSnapshot ) - { - iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); - } - - // Delete everything from the old snapshot - iOldSnapshot->Reset(); - - // Loop through all the items in current snapshot - TInt count = iCurrentSnapshot->Count(); - - // Copy everything from current to old snapshot - for ( TInt i = 0; i < count; i++ ) - { - // Commit it to the old array. - iOldSnapshot->InsertIsqL( iCurrentSnapshot->At( i ), iKey ); - } - TRACE_FUNC_EXIT; - } - - -// ----------------------------------------------------------------------------- -// CChangeFinder::CommitChangesL -// Commits current changes to snapshot, affects only a specified group of items -// ----------------------------------------------------------------------------- -void CChangeFinder::CommitChangesL( const MSmlDataItemUidSet& aUids ) - { - TRACE_FUNC_ENTRY; - - - // This function commits changes from current snapshot to old snapshot - // But commits only the entries in the parameter array - if ( !iCurrentSnapshot ) - { - LOGGER_WRITE( "CChangeFinder::CommitChangesL leaved, current snapshot missing." ); - User::Leave( KErrNotFound ); - } - - if ( !iOldSnapshot ) - { - iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); - } - - for ( TInt i = 0; i < aUids.ItemCount(); i++ ) - { - TSmlDbItemUid itemId = aUids.ItemAt( i ); - TSnapshotItem temp( itemId ); - TInt indexOld( -1 ); - TInt indexNew( -1 ); - TInt err = iOldSnapshot->FindIsq( temp, iKey, indexOld); - if ( !err ) - { - // founded from old snapshot - if ( !iCurrentSnapshot->FindIsq(temp, iKey, indexNew) ) - { - // Replace - iOldSnapshot->At( indexOld ) = iCurrentSnapshot->At( indexNew ); - } - else - { - // not found from current snapshot, delete from old also. - iOldSnapshot->Delete( indexOld ); - } - } - else - { - // not found from old snapshot, add it. - if ( !iCurrentSnapshot->FindIsq( temp, iKey, indexNew ) ) - { - iOldSnapshot->InsertIsqL( iCurrentSnapshot->At( indexNew ), iKey ); - } - } - } - TRACE_FUNC_EXIT; - } - -// ----------------------------------------------------------------------------- -// CChangeFinder::SetNewSnapshot -// Sets new snapshot (to be compared against), ChangeFinder takes ownership -// ----------------------------------------------------------------------------- -void CChangeFinder::SetNewSnapshot( CSnapshotArray* aNewSnapshot ) - { - TRACE_FUNC_ENTRY; - - // Delete existing snapshot - delete iCurrentSnapshot; - - // Set submitted snapshot as active - iCurrentSnapshot = aNewSnapshot; - iCurrentSnapshot->Compress(); - - TRACE_FUNC_EXIT; - } - -// ----------------------------------------------------------------------------- -// CChangeFinder::DataStoreUid -// returns stored data store id number -// ----------------------------------------------------------------------------- -TInt64 CChangeFinder::DataStoreUid() const - { - TRACE_FUNC; - return iDataStoreUid; - } - -// ----------------------------------------------------------------------------- -// CChangeFinder::SetDataStoreUid -// Sets data store id number -// ----------------------------------------------------------------------------- -void CChangeFinder::SetDataStoreUid( TInt64 aUid ) - { - TRACE_FUNC; - iDataStoreUid = aUid; - } -