omads/omadsextensions/adapters/mediads/src/mediadsstore.cpp
branchRCL_3
changeset 25 4f0867e42d62
parent 24 8e7494275d3a
child 26 3e6957da2ff8
--- a/omads/omadsextensions/adapters/mediads/src/mediadsstore.cpp	Tue Aug 31 15:05:37 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1210 +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 "mediadsstore.h"
-#include <mpxmessagegeneraldefs.h>
-#include <mpxcollectionmessage.h>
-
-#include "mediadsproviderdefs.h"
-#include "mediamanager.h"
-#include "cmdemanager.h"
-#include "playlistitem.h"
-#include "omadsfolderobject.h"
-#include "snapshotitem.h"
-#include "logger.h"
-
-_LIT8( KFolderMimeType, "application/vnd.omads-folder+xml" );
-_LIT8( KFolderMimeVersion, "1.2" );
-
-_LIT8( KPlaylistMimeType, "audio/x-mpegurl");
-_LIT8( KPlaylistMimeVersion, "1.0");
-
-_LIT8( KSongMimeType, "application/x-song");
-_LIT8( KSongMimeVersion, "1.0");
-
-
-const TInt KDataBufferSize = 1024;
-
-const TInt KAlbumsOffSet = 0x0000f000;
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::CMediaDsDataStore
-// C++ default constructor can NOT contain any code, that might leave.
-// -----------------------------------------------------------------------------
-CMediaDsDataStore::CMediaDsDataStore( RFs& aFs):
-    iKey(TKeyArrayFix(_FOFF(TSnapshotItem, ItemId()), ECmpTInt)),
-    iFs( aFs )
-    { 
-    TRACE_FUNC;
-    }
-  
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::ConstructL
-// Symbian 2nd phase constructor, can leave.
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::ConstructL()
-    {
-    TRACE_FUNC_ENTRY;
-    
-    // Item UID sets, used to transfer change info
-    iNewItems = new (ELeave) CNSmlDataItemUidSet;
-    iDeletedItems = new (ELeave) CNSmlDataItemUidSet;
-    iUpdatedItems = new (ELeave) CNSmlDataItemUidSet;
-    iMovedItems = new (ELeave) CNSmlDataItemUidSet;
-    iSoftDeletedItems = new (ELeave) CNSmlDataItemUidSet;
-    
-    iHasher = CMD5::NewL();
-    
-    iMediaManager = CMediaManager::NewL( iFs, this, iKey, *iHasher );
-    
-    iMdEManager = CMdEManager::NewL( *this );
-    
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::NewLC
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-CMediaDsDataStore* CMediaDsDataStore::NewLC( RFs& aFs)
-    {
-    TRACE_FUNC_ENTRY;
-    CMediaDsDataStore* self = new (ELeave) CMediaDsDataStore( aFs );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    TRACE_FUNC_EXIT;
-    return self;    
-    }
-
-    
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::~CMediaDsDataStore
-// Destructor
-// -----------------------------------------------------------------------------
-CMediaDsDataStore::~CMediaDsDataStore()
-    {
-    TRACE_FUNC_ENTRY;
-    
-    delete iDataBuffer;
-    
-    delete iChangeFinder;
-    
-    delete iNewItems;
-    delete iDeletedItems;
-    delete iUpdatedItems;
-    delete iMovedItems;
-    delete iSoftDeletedItems;
-    
-    delete iMediaManager;
-    LOGGER_WRITE("iMediaManager deleted");
-    
-    delete iMdEManager;
-    LOGGER_WRITE("iMdEManager deleted");
-    
-    delete iHasher;
-    LOGGER_WRITE("iHasher deleted");
-    // normally iSnapshot is NULL, but if error has occured we need to delete it.
-    delete iSnapshot;
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoOpenL
-// Opens database. This operation is performed SYNCHRONOUSLY
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoOpenL( const TDesC& aStoreName,
-    MSmlSyncRelationship& aContext, TRequestStatus& aStatus )
-    {
-    TRACE_FUNC_ENTRY;
-    
-    iCallerStatus = &aStatus;
-    *iCallerStatus = KRequestPending;
-    
-    if ( iCurrentState != EClosed )
-        {
-        User::RequestComplete( iCallerStatus, KErrInUse );
-        LOGGER_WRITE("CMmsDataStore::DoOpenL failed with KErrInUse.");
-        return;
-        }
-    
-    // Create ChangeFinder object
-    if ( iChangeFinder )
-        {
-        delete iChangeFinder;
-        iChangeFinder = NULL;
-        }
-    iChangeFinder = CChangeFinder::NewL( aContext, iKey, iHasHistory, KMediaDataProviderImplUid );
-    
-    if ( aStoreName.CompareF( KMediaDsRefreshDbName ) == 0 )
-        {
-        LOGGER_WRITE("Refresh library and open database");
-        // just kick off scanner, don't wait ready status
-        // Async. func. HandleCollectionMessage is called when ready
-        iMediaManager->ScanL();
-        
-        }
-    else if ( aStoreName.CompareF( KMediaDsDbName ) == 0 )
-        {
-        LOGGER_WRITE("Open database");
-        
-        if ( !iHasHistory )
-            {
-            LOGGER_WRITE("No history, scan library");
-            // just kick off scanner, don't wait ready status
-            // Async. func. HandleCollectionMessage is called when ready
-            iMediaManager->ScanL();
-            }
-        
-        }
-    else
-        {
-        LOGGER_WRITE("Unknown database");
-        User::Leave( KErrNotSupported );
-        }
-    
-    // Set current snapshot, this will be compared against the old one   
-    RegisterSnapshotL();
-    
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoCancelRequest
-// Not supported, does nothing.
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoCancelRequest()
-    {
-    TRACE_FUNC_ENTRY;
-    if ( iCurrentState == EOpening )
-        {
-        LOGGER_WRITE("Cancel Open command");
-        iMediaManager->Cancel();
-        iMdEManager->Cancel();
-        }
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoStoreName
-// Returns the name of the DataStore
-// -----------------------------------------------------------------------------
-const TDesC& CMediaDsDataStore::DoStoreName() const
-    {
-    TRACE_FUNC;
-    return KNullDesC;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoBeginTransactionL
-// Transactions are not supported.
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoBeginTransactionL()
-    {
-    TRACE_FUNC;
-    User::Leave( KErrNotSupported );
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoCommitTransactionL
-// Transactions are not supported.
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoCommitTransactionL( TRequestStatus& /*aStatus*/ )
-    {
-    TRACE_FUNC;
-    User::Leave( KErrNotSupported );
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoRevertTransaction
-// Transactions are not supported.
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoRevertTransaction( TRequestStatus& aStatus )
-    {
-    TRACE_FUNC;
-    iCallerStatus = &aStatus;
-    User::RequestComplete( iCallerStatus, KErrNotSupported );
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoBeginBatchL
-// Batching is not supported.
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoBeginBatchL()
-    {
-    TRACE_FUNC;
-    User::Leave( KErrNotSupported );
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoCommitBatchL
-// Batching is not supported
-// -----------------------------------------------------------------------------
-//
-void CMediaDsDataStore::DoCommitBatchL( RArray<TInt>& /*aResultArray*/, TRequestStatus& /*aStatus*/ )
-    {
-    TRACE_FUNC;
-    User::Leave( KErrNotSupported );
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoCancelBatch
-// Batching is not supported
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoCancelBatch()
-    {
-    TRACE_FUNC;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoSetRemoteStoreFormatL
-// Not supported
-// -----------------------------------------------------------------------------
-//
-void CMediaDsDataStore::DoSetRemoteStoreFormatL( const CSmlDataStoreFormat& /*aServerDataStoreFormat*/ )
-    {
-    TRACE_FUNC;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoSetRemoteMaxObjectSize
-// Not supported
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoSetRemoteMaxObjectSize( TInt /*aServerMaxObjectSize*/ )
-    {
-    TRACE_FUNC;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoMaxObjectSize
-// Reads the maximum MMS Message size from the central repository
-// -----------------------------------------------------------------------------
-TInt CMediaDsDataStore::DoMaxObjectSize() const
-    {
-    TRACE_FUNC;
-    return 0;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoOpenItemL
-// Opens item in the DataStore, reads it (either completely or partially) 
-// to the temporary buffer where it can be later read to the remote database.
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoOpenItemL( TSmlDbItemUid aUid, TBool& /*aFieldChange*/, 
-    TInt& aSize, TSmlDbItemUid& aParent, TDes8& aMimeType, 
-    TDes8& aMimeVer, TRequestStatus& aStatus )
-    {
-    TRACE_FUNC_ENTRY;
-
-    LOGGER_WRITE_1( "Opening item %d.", aUid );
-    
-    // Store these for later use
-    iCallerStatus = &aStatus;
-    *iCallerStatus = KRequestPending;
-    
-    iReadPosition=0;
-    
-    // Check that we're in a proper state
-    if ( iCurrentState != EOpenAndWaiting )
-        {
-        LOGGER_WRITE_1( "CMediaDsDataStore::DoOpenItemL, invalid state %d.", iCurrentState );
-        User::RequestComplete( iCallerStatus, KErrNotReady );
-        return;
-        }
-    
-    if ( !iDataBuffer )
-        {
-        iDataBuffer = CBufFlat::NewL( KDataBufferSize );
-        }
-    iDataBuffer->Reset();
-
-    
-    if ( aUid <= KLastFolderId )
-        {
-        COMADSFolderObject* folderObject = COMADSFolderObject::NewLC();
-        
-        switch ( aUid )
-            {
-            case KAllSongsFolderId:
-                folderObject->SetName( KAllSongs );
-                break;
-            case KPlaylistsFolderId:
-                folderObject->SetName( KPlaylists );
-                break;
-            case KAlbumsFolderId:
-                folderObject->SetName( KAlbums );
-                break;
-            default:
-                User::Leave( KErrNotFound );
-                break;
-            }
-        folderObject->ExportFolderXmlL( *iDataBuffer );
-        CleanupStack::PopAndDestroy( folderObject );
-        aMimeType.Copy( KFolderMimeType );
-        aMimeVer.Copy( KFolderMimeVersion );
-        aParent = KErrNotFound;
-        }
-    else
-        {
-        CSongItem* song = CSongItem::NewLC();
-        LOGGER_WRITE("Try to read song");
-        TRAPD( err, iMediaManager->GetSongL( aUid, *song ));
-        if ( !err )
-            {
-            RBufWriteStream stream( *iDataBuffer );
-            CleanupClosePushL( stream );
-            song->ExportL( stream );
-            CleanupStack::PopAndDestroy( &stream );
-            CleanupStack::PopAndDestroy( song );
-            
-            aMimeType.Copy( KSongMimeType );
-            aMimeVer.Copy( KSongMimeVersion );
-            aParent = KAllSongsFolderId;
-            }
-        else // could not read song, maybe it is playlist
-            {
-            CleanupStack::PopAndDestroy( song );
-            CPlaylistItem* playList = CPlaylistItem::NewLC();
-            LOGGER_WRITE("Try to read playlist");
-            TRAP(err, iMediaManager->GetPlayListL( aUid, *playList ));
-            if ( !err )
-                {
-                RBufWriteStream stream( *iDataBuffer );
-                CleanupClosePushL( stream );
-                
-                playList->ExportL( stream );
-                CleanupStack::PopAndDestroy( &stream );
-                CleanupStack::PopAndDestroy( playList );
-                
-                aMimeType.Copy( KPlaylistMimeType );
-                aMimeVer.Copy( KPlaylistMimeVersion );
-                aParent = KPlaylistsFolderId;
-                }
-            else
-                {
-                CleanupStack::PopAndDestroy( playList );
-                LOGGER_WRITE("Try to read album");
-                // Could not read song, maybe it's a Album
-                const CPlaylistItem& album = iMdEManager->AlbumL( MapSyncIdToAlbumId(aUid) );
-                RBufWriteStream stream( *iDataBuffer );
-                CleanupClosePushL( stream );
-                
-                album.ExportL( stream );
-                CleanupStack::PopAndDestroy( &stream );
-                
-                aMimeType.Copy( KPlaylistMimeType );
-                aMimeVer.Copy( KPlaylistMimeVersion );
-                aParent = KAlbumsFolderId;
-                }
-            }
-        
-        }
-    
-    aSize = iDataBuffer->Size();
-    
-    LOGGER_WRITE_1("aSize: %d", aSize);
-    
-    // Signal we're complete
-    User::RequestComplete( iCallerStatus, KErrNone ); 
-
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoCreateItemL
-// Create new item to the message store.
-// Return the id number of the newly created item
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoCreateItemL( TSmlDbItemUid& aUid, TInt aSize, TSmlDbItemUid aParent, 
-    const TDesC8& aMimeType, const TDesC8& /*aMimeVer*/, TRequestStatus& aStatus )
-    {
-    TRACE_FUNC_ENTRY;
-    LOGGER_WRITE_1( "Parent folder: %d.", aParent );
-    
-    // Store some variables for further use
-    iCallerStatus = &aStatus;
-    *iCallerStatus = KRequestPending;
-    
-    // Ensure that we're in proper state
-    if ( iCurrentState != EOpenAndWaiting )
-        {
-        LOGGER_WRITE_1( "Invalid state %d.", iCurrentState );
-        }
-    
-    iWrittenDataLength = 0;
-    iCreatedUid = &aUid;
-    LOGGER_WRITE8_1( "aMimeType: %S", &aMimeType );
-    
-    if ( aMimeType.Compare( KPlaylistMimeType() ) == 0 )
-        {
-        LOGGER_WRITE("Add Playlist");
-        iCurrentState = ECreatePlaylist;
-        }
-    else if ( aMimeType.Compare( KSongMimeType() ) == 0 )
-        {
-        LOGGER_WRITE("Add Song not supported");
-        User::Leave( KErrNotSupported );
-        }
-    else
-        {
-        User::RequestComplete( iCallerStatus, KErrNotSupported );
-        LOGGER_WRITE("Bad MIME type");
-        return;
-        }
-    
-    if ( iDataBuffer )
-        {
-        iDataBuffer->ResizeL( aSize );
-        }
-    else
-        {
-        iDataBuffer = CBufFlat::NewL( KDataBufferSize );
-        iDataBuffer->ResizeL( aSize );
-        }
-    LOGGER_WRITE_1("iDataBuffer->Size: %d", iDataBuffer->Size());
-    
-    LOGGER_WRITE_1("aSize: %d", aSize);
-    iParentId = aParent;
-    
-    // Signal we're complete
-    User::RequestComplete( iCallerStatus, KErrNone );
-    
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoReplaceItemL
-// Begin the replace operation, ensure that the item really exists
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoReplaceItemL( TSmlDbItemUid aUid, TInt aSize, TSmlDbItemUid aParent, 
-    TBool /*aFieldChange*/, TRequestStatus& aStatus )
-    {
-    TRACE_FUNC_ENTRY;
-    LOGGER_WRITE_1("Replacing item %d.", aUid);
-    LOGGER_WRITE_1("Parent folder: %d.", aParent);
-    
-    // Store some variables for further use
-    iCallerStatus = &aStatus;
-    *iCallerStatus = KRequestPending;
-    
-    // Ensure proper state
-    if ( iCurrentState != EOpenAndWaiting )
-        {
-        LOGGER_WRITE_1("Invalid state %d.", iCurrentState);
-        }
-    
-    iCurrentState = EReplace;
-    
-    iParentId = aParent;
-    iCurrentId = aUid;
-    
-    if ( iDataBuffer )
-        {
-        iDataBuffer->ResizeL( aSize );
-        }
-    else
-        {
-        iDataBuffer = CBufFlat::NewL( KDataBufferSize );
-        iDataBuffer->ResizeL( aSize );
-        }
-    
-    // Signal we're complete
-    User::RequestComplete( iCallerStatus, KErrNone );
-    
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoReadItemL
-// Read specified amount of data from the temporary buffer
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoReadItemL( TDes8& aBuffer )
-    {
-    TRACE_FUNC_ENTRY;
-    // Thiw is how much data there is left in the buffer    
-    TInt left = iDataBuffer->Size() - iReadPosition;
-    
-    if ( left > 0 )
-        {
-        // This is how much there's space in the destination buffer
-        TInt destSize = aBuffer.MaxSize();
-        
-        // This is how much we can read
-        TInt toRead = destSize < left ? destSize : left;
-        
-        // Read the data from the buffer, then update the position      
-        iDataBuffer->Read( iReadPosition, aBuffer, toRead );
-        iReadPosition += toRead;
-        }
-    else
-        {
-        LOGGER_WRITE( "No data to read" );
-        User::Leave( KErrEof );
-        }   
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoWriteItemL
-// Write specified amount of data to the temporary buffer
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoWriteItemL( const TDesC8& aData )
-    {
-    TRACE_FUNC_ENTRY;
-    
-    iDataBuffer->Write( iWrittenDataLength, aData );
-    iWrittenDataLength += aData.Size();
-    
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoCommitItemL
-// Commits item from temporary buffer to the message store
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoCommitItemL( TRequestStatus& aStatus )
-    {
-    TRACE_FUNC_ENTRY;
-    
-    // Store some variables
-    iCallerStatus = &aStatus;
-    *iCallerStatus = KRequestPending;
-    
-    iDataBuffer->Compress();
-    
-    // Read the playlist item
-    CPlaylistItem* newItem = CPlaylistItem::NewLC();
-    
-    const TUint8* ptr8 = iDataBuffer->Ptr(0).Ptr();
-    const TUint16* ptr16 = reinterpret_cast<const TUint16*>( ptr8 );
-    TPtrC dataPtr;
-    dataPtr.Set( ptr16, iDataBuffer->Size()/2 );
-    newItem->ImportL( dataPtr );
-    
-    iDataBuffer->Reset();
-    
-#ifdef _DEBUG
-    LOGGER_WRITE_1("Name: %S", &newItem->Title());
-    LOGGER_WRITE_1("Items count: %d", newItem->ItemCount());
-    for ( TInt i=0; i<newItem->ItemCount(); i++ )
-        {
-        TPtrC16 ptr = newItem->ItemAt(i);
-        LOGGER_WRITE_1("item: %S", &ptr);
-        }
-#endif
-    
-    
-    TInt error(KErrNone);
-    if ( iCurrentState == ECreatePlaylist )
-        {
-        if ( iParentId == KPlaylistsFolderId )
-            {
-            iMediaManager->CreateNewPlaylistL( *iCreatedUid, *newItem );
-            }
-        else if ( iParentId == KAlbumsFolderId )
-            {
-            iMdEManager->CreateAlbumL( *newItem );
-            *iCreatedUid = MapAlbumIdToSyncId( newItem->Id() );
-            }
-        else
-            {
-            LOGGER_WRITE("Not supported");
-            User::Leave( KErrNotSupported);
-            }
-        
-        // Inform ChangeFinder of the added item
-        TSnapshotItem snapshotItem( *iCreatedUid );
-        snapshotItem.SetParentId( iParentId );
-        snapshotItem.SetItemHash( *newItem, *iHasher );
-        iChangeFinder->ItemAddedL( snapshotItem );
-        
-        }
-    else if ( iCurrentState == EReplace )
-        {
-        if ( iParentId == KPlaylistsFolderId )
-            {
-            iMediaManager->ReplacePlaylistL( iCurrentId, *newItem );
-            }
-        else if ( iParentId == KAlbumsFolderId )
-            {
-            iItemInReplacement.SetItemId( iCurrentId );
-            iItemInReplacement.SetParentId( iParentId );
-            iItemInReplacement.SetItemHash( *newItem, *iHasher );
-            // Async function, calls AlbumReplaced when completed
-            iMdEManager->ReplaceAlbumL( MapSyncIdToAlbumId(iCurrentId), *newItem );
-            
-            CleanupStack::PopAndDestroy( newItem );
-            return;
-            }
-        else
-            {
-            LOGGER_WRITE("Not supported");
-            User::Leave( KErrNotSupported);
-            }
-        
-        // Inform ChangeFinder of the replaced item
-        TSnapshotItem snapshotItem( iCurrentId );
-        snapshotItem.SetParentId( iParentId );
-        snapshotItem.SetItemHash( *newItem, *iHasher );
-        iChangeFinder->ItemUpdatedL( snapshotItem );
-        }
-    else
-        {
-        LOGGER_WRITE_1("Wrong state: %d", iCurrentState);
-        User::Leave( KErrNotSupported );
-        }
-    CleanupStack::PopAndDestroy( newItem );
-    
-    
-    
-    LOGGER_WRITE_1("error: %d", error);
-    // We'll be waiting for next event, signal we're done
-    iCurrentState = EOpenAndWaiting;
-    User::RequestComplete( iCallerStatus, error );
-    
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoCloseItem
-// Closes open item in the data store
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoCloseItem()
-    {
-    TRACE_FUNC_ENTRY;
-    if ( iDataBuffer )
-        {
-        iDataBuffer->Reset();
-        }
-    iCurrentState = EOpenAndWaiting;
-    iReadPosition = 0;
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoMoveItemL
-// Moves item from one folder to another in the message store
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoMoveItemL( TSmlDbItemUid /*aUid*/,
-    TSmlDbItemUid /*aNewParent*/, TRequestStatus& /*aStatus*/ )
-    {
-    TRACE_FUNC;
-    User::Leave( KErrNotSupported );
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoDeleteItemL
-// Removes item from the message store
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoDeleteItemL( TSmlDbItemUid aUid, TRequestStatus& aStatus  )
-    {
-    TRACE_FUNC_ENTRY;
-    LOGGER_WRITE_1("Deleting item %d.", aUid);
-    
-    // Store some variables for further use
-    iCallerStatus = &aStatus;
-    *iCallerStatus = KRequestPending;
-    
-    TInt error(KErrNone);
-    
-    // Check that we're in proper state
-    if ( iCurrentState != EOpenAndWaiting ) 
-        {
-        LOGGER_WRITE_1("CMmsDataStore::DoDeleteItemL, invalid state %d.", iCurrentState);        
-        }
-    
-    TRAP( error,  iMediaManager->DeletePlaylistL( aUid ) );
-    if ( error )
-        {
-        error = KErrNone;
-        iMdEManager->DeleteAlbumL( MapSyncIdToAlbumId( aUid ) );
-        }
-    
-    if ( !error )
-        {
-        // Inform ChangeFinder of the deleted item
-        TSnapshotItem snapshotItem( aUid );
-        iChangeFinder->ItemDeletedL( snapshotItem );
-        }
-    
-    LOGGER_WRITE_1("complete error: %d", error);
-    // Signal we're done
-    User::RequestComplete( iCallerStatus, error );
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoSoftDeleteItemL
-// Soft delete isn't supported.
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoSoftDeleteItemL( TSmlDbItemUid /*aUid*/, TRequestStatus& aStatus )
-    {
-    TRACE_FUNC_ENTRY;
-    
-    // Store some variables for further use
-    iCallerStatus = &aStatus;
-    *iCallerStatus = KRequestPending;
-
-    // Signal we're done
-    User::RequestComplete( iCallerStatus, KErrNotSupported );
-    
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoDeleteAllItemsL
-// Deletes all items in the standard folders of message store
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoDeleteAllItemsL( TRequestStatus& aStatus )
-    {
-    TRACE_FUNC_ENTRY;
-    
-    // Store some variables for further use 
-    iCallerStatus = &aStatus;
-    *iCallerStatus = KRequestPending;
-    
-    User::RequestComplete( iCallerStatus, KErrNotSupported );
-    
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoHasSyncHistory
-// This method returns ETrue if Data Store has history information. 
-// Slow-sync will be used if Data Store does not have history information.
-// -----------------------------------------------------------------------------
-TBool CMediaDsDataStore::DoHasSyncHistory() const
-    {
-    TRACE_FUNC_RET( (TInt)iHasHistory );      
-    
-    // iHasHistory is initialized in DoOpenL method
-    return iHasHistory;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoAddedItems
-// This method returns UIDs of added items. Those items are added after previous
-// synchronization with current synchronization relationship. 
-// -----------------------------------------------------------------------------
-const MSmlDataItemUidSet& CMediaDsDataStore::DoAddedItems() const
-    {
-    TRACE_FUNC;
-    
-    // Ensure that we're in a proper state
-    if ( iCurrentState != EOpenAndWaiting )
-        {
-        LOGGER_WRITE_1("CMmsDataStore::DoAddedItems, invalid state %d.", iCurrentState);
-        }
-    
-    TInt error(KErrNone);
-
-    // Clear new-items array
-    iNewItems->Reset();
-
-    // Set current snapshot, this will be compared against the old one      
-    // Search for new items
-    TRAP( error, iChangeFinder->FindNewItemsL(*iNewItems) )
-    if ( error != KErrNone )
-        {
-        LOGGER_WRITE_1("CMmsDataStore::DoAddedItems, iChangeFinder->FindNewItemsL leaved with %d.", error);
-        }
-    
-    LOGGER_WRITE_1("New item count: %d.", iNewItems->ItemCount());
-    
-    return *iNewItems;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoDeletedItems
-//
-// -----------------------------------------------------------------------------
-const MSmlDataItemUidSet& CMediaDsDataStore::DoDeletedItems() const
-    {
-    TRACE_FUNC;
-    
-    // Ensure that we're in a proper state
-    if ( iCurrentState != EOpenAndWaiting )
-        {
-        LOGGER_WRITE_1("CMmsDataStore::DoDeletedItems, invalid state %d.", iCurrentState);
-        }
-    
-    TInt error(KErrNone);
-    
-    // Clear deleted-items array
-    iDeletedItems->Reset();
-    
-    // Search for deleted items
-    TRAP( error, iChangeFinder->FindDeletedItemsL( *iDeletedItems ) );
-    if ( error != KErrNone )
-        {
-        LOGGER_WRITE_1("CMmsDataStore::DoDeletedItems, iChangeFinder->FindDeletedItemsL leaved with %d.", error);
-        }           
-    
-    LOGGER_WRITE_1("Deleted item count: %d.", iDeletedItems->ItemCount());
-    return *iDeletedItems;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoSoftDeletedItems
-// Not directly supported, equals to "hard" delete
-// -----------------------------------------------------------------------------
-const MSmlDataItemUidSet& CMediaDsDataStore::DoSoftDeletedItems() const
-    {
-    TRACE_FUNC;
-
-    iSoftDeletedItems->Reset();
-    return *iSoftDeletedItems;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoModifiedItems
-// Finds all modified items in the data store
-// -----------------------------------------------------------------------------
-const MSmlDataItemUidSet& CMediaDsDataStore::DoModifiedItems() const
-    {
-    TRACE_FUNC;
-    
-    // Ensure that we're in a proper state
-    if ( iCurrentState != EOpenAndWaiting )
-        {
-        LOGGER_WRITE_1("CMmsDataStore::DoModifiedItems, invalid state %d.", iCurrentState);
-        }
-    
-    TInt error(KErrNone);
-    
-    // Clear updated-items array
-    iUpdatedItems->Reset();
-    
-    // Search for updated items
-    TRAP( error, iChangeFinder->FindChangedItemsL( *iUpdatedItems ) )
-    if ( error != KErrNone )
-        {
-        LOGGER_WRITE_1("CMmsDataStore::DoModifiedItems, iChangeFinder->FindChangedItemsL leaved with %d.", error);
-        }
-    
-    LOGGER_WRITE_1("Modified item count: %d.", iUpdatedItems->ItemCount()); 
-    return *iUpdatedItems;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoMovedItems
-// Finds all moved items in the data store
-// -----------------------------------------------------------------------------
-const MSmlDataItemUidSet& CMediaDsDataStore::DoMovedItems() const
-    {
-    TRACE_FUNC;
-    // return empty array
-    return *iMovedItems;    
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoResetChangeInfoL
-// Resets change history in the data store. All content is considered
-// new in the data store point of view.
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoResetChangeInfoL( TRequestStatus& aStatus )
-    {
-    TRACE_FUNC_ENTRY;
-    
-    iCallerStatus = &aStatus;
-    *iCallerStatus = KRequestPending;
-    
-    // Check that we're in proper state
-    if ( iCurrentState != EOpenAndWaiting ) 
-        {
-        LOGGER_WRITE_1("CMmsDataStore::DoResetChangeInfoL, invalid state %d.", iCurrentState);
-        }   
-            
-    // Reset change info in ChangeFinder
-    iChangeFinder->ResetL();
-    iHasHistory = EFalse;
-    
-    // Signal we're done
-    User::RequestComplete( iCallerStatus, KErrNone ); 
-    
-    TRACE_FUNC_EXIT;
-    }
-        
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoCommitChangeInfoL
-// Commits change info. These items are no longer reported, when change
-// information is being queried.
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus, const MSmlDataItemUidSet& aItems )
-    {
-    TRACE_FUNC_ENTRY;
-    
-    iCallerStatus = &aStatus;
-    *iCallerStatus = KRequestPending;
-    
-    // Ensure that we're in a proper state
-    if ( iCurrentState != EOpenAndWaiting ) 
-        {
-        LOGGER_WRITE_1("CMmsDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState);
-        }
-
-    // Notify ChangeFinder
-    iChangeFinder->CommitChangesL(aItems);
-    iHasHistory = ETrue;
-        
-    // Signal we're done
-    User::RequestComplete(iCallerStatus, KErrNone);
-        
-    TRACE_FUNC_EXIT;
-    }
-        
-    
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::DoCommitChangeInfoL
-// Commits change info. There is no more nothing to report when change
-// information is being queried. 
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::DoCommitChangeInfoL(TRequestStatus& aStatus)
-    {
-    TRACE_FUNC_ENTRY;
-    
-    iCallerStatus = &aStatus;
-    *iCallerStatus = KRequestPending;
-    
-    // Ensure that we're in a proper state
-    if ( iCurrentState != EOpenAndWaiting ) 
-        {
-        LOGGER_WRITE_1("CMmsDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState);
-        }
-    
-    // Notify ChangeFinder
-    iChangeFinder->CommitChangesL();
-    iHasHistory = ETrue;
-        
-    // Signal we're done
-    User::RequestComplete( iCallerStatus, KErrNone );
-    
-    TRACE_FUNC_EXIT;
-    }
-
-
-void CMediaDsDataStore::HandleCollectionMessage(CMPXMessage* /*aMsg*/, TInt /*aErr*/) 
-    {
-    TRACE_FUNC;
-    }
-
-void CMediaDsDataStore::HandleOpenL(const CMPXMedia& /*aEntries*/,
-        TInt /*aIndex*/,TBool /*aComplete*/,TInt /*aError*/)
-    {
-    TRACE_FUNC;
-    }
-
-void CMediaDsDataStore::HandleOpenL(const CMPXCollectionPlaylist& /*aPlaylist*/,
-        TInt /*aError*/)
-    {
-    TRACE_FUNC;
-    }
-    
-void CMediaDsDataStore::HandleCommandComplete(CMPXCommand* /*aCommandResult*/, 
-         TInt /*aError*/)
-    {
-    TRACE_FUNC;
-    }
-
-void CMediaDsDataStore::HandleCollectionMediaL(const CMPXMedia& /*aMedia*/, 
-        TInt /*aError*/)
-    {
-    TRACE_FUNC;
-    }
-
-void CMediaDsDataStore::AlbumsReaded( TInt aError )
-    {
-    TRACE_FUNC_ENTRY;
-    iMdEManagerReady = ETrue;
-    LOGGER_WRITE_1("aError: %d", aError );
-    
-    if ( aError )
-        {
-        iError = aError;
-        }
-    
-    FinalizeOpenStore();
-    
-    TRACE_FUNC_EXIT;
-    }
-
-void CMediaDsDataStore::AlbumReplaced( TInt aError )
-    {
-    TRACE_FUNC_ENTRY;
-    LOGGER_WRITE_1("aError: %d", aError);
-    if ( !aError )
-        {
-        // Inform ChangeFinder of the replaced item
-        iChangeFinder->ItemUpdatedL( iItemInReplacement );
-        }
-    
-    iCurrentState = EOpenAndWaiting;
-    User::RequestComplete( iCallerStatus, aError );
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::RegisterSnapshotL
-// Sets Changefinder to compare against current message store content
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::RegisterSnapshotL()
-    {
-    TRACE_FUNC_ENTRY;
-    if ( iSnapshot )
-        {
-        delete iSnapshot;
-        iSnapshot = NULL;
-        }
-    iSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity );
-    RegisterFoldersL( *iSnapshot );
-    iMediaManager->SetSnapshot( iSnapshot );
-    
-    iCurrentState = EOpening;
-    TInt err = iMediaManager->RegisterAllPlayLists();
-    if ( err )
-        {
-        LOGGER_WRITE_1("Could not start, err: %d", err);
-        iCurrentState = EClosed;
-        User::RequestComplete( iCallerStatus, err );
-        }
-    else
-        {
-        iMdEManager->GetAlbumsL();
-        }
-
-    
-    TRACE_FUNC_EXIT;
-    }
-
-void CMediaDsDataStore::RegisterAllPlayListsCompleted( TInt aError )
-    {
-    TRACE_FUNC_ENTRY;
-    if ( !aError )
-        {
-        TInt err = iMediaManager->RegisterAllSongs();
-        if ( err )
-            {
-            LOGGER_WRITE_1("Could not start, err: %d", err);
-            iMediaManagerReady = ETrue;
-            iError = err;
-            }
-        }
-    else
-        {
-        // Error happened or cancelled.
-        iMediaManagerReady = ETrue;
-        iError = aError;
-        }
-    
-    FinalizeOpenStore();
-    TRACE_FUNC_EXIT;
-    }
-
-void CMediaDsDataStore::RegisterAllSongsCompleted( TInt aError )
-    {
-    TRACE_FUNC_ENTRY;
-    iMediaManagerReady = ETrue;
-    if ( aError )
-        {
-        // Error happened or cancelled, save error code
-        iError = aError;
-        }
-    
-    FinalizeOpenStore();
-    
-    TRACE_FUNC_EXIT;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDsDataStore::RegisterFoldersL
-// 
-// -----------------------------------------------------------------------------
-void CMediaDsDataStore::RegisterFoldersL( CSnapshotArray& aItemArray )
-    {
-    TRACE_FUNC_ENTRY;
-    
-    TKeyArrayFix key( iKey );
-    TSnapshotItem folder;
-    folder.SetItemId( KAllSongsFolderId );
-    folder.SetItemHash( KAllSongs, *iHasher );
-    aItemArray.InsertIsqL( folder, key );
-    
-    folder.SetItemId( KPlaylistsFolderId );
-    folder.SetItemHash( KPlaylists, *iHasher );
-    aItemArray.InsertIsqL( folder, key );
-    
-    folder.SetItemId( KAlbumsFolderId );
-    folder.SetItemHash( KAlbums, *iHasher );
-    aItemArray.InsertIsqL( folder, key );
-    TRACE_FUNC_EXIT;
-    }
-
-void CMediaDsDataStore::FinalizeOpenStore()
-    {
-    TRACE_FUNC_ENTRY;
-    // Signal client if all ready
-    if ( iMediaManagerReady && iMdEManagerReady )
-        {
-        if ( !iError )
-            {
-            RPointerArray<CPlaylistItem> albums = iMdEManager->AlbumsArray();
-            TKeyArrayFix key( iKey );
-            LOGGER_WRITE("Album snapshots:")
-            for (TInt i=0; i<albums.Count(); i++)
-                {
-                TSnapshotItem playlistItem( MapAlbumIdToSyncId( albums[i]->Id() ) );
-                playlistItem.SetItemHash( *albums[i], *iHasher );
-                playlistItem.SetParentId( KAlbumsFolderId );
-                TRAP(iError, iSnapshot->InsertIsqL( playlistItem, key ));
-                if ( iError )
-                    {
-                    LOGGER_WRITE_1("iSnapshot->InsertIsqL err: %d", iError);
-                    iError = KErrGeneral;
-                    }
-                }
-            
-            if ( !iError )
-                {
-                // Set new snapshot to compare against
-                iChangeFinder->SetNewSnapshot(iSnapshot);
-                
-                // Changefinder takes ownership of the snapshot
-                iSnapshot = NULL;
-                iCurrentState = EOpenAndWaiting;
-                }
-            }
-        
-        if ( iError )
-            {
-            iCurrentState = EClosed;
-            }
-        
-        LOGGER_WRITE_1("Signal client with %d", iError);
-        User::RequestComplete( iCallerStatus, iError );
-        }
-    TRACE_FUNC_EXIT;
-    }
-
-inline TInt CMediaDsDataStore::MapSyncIdToAlbumId( TSmlDbItemUid aSyncId )
-    {
-    return aSyncId - KAlbumsOffSet;
-    }
-
-inline TSmlDbItemUid CMediaDsDataStore::MapAlbumIdToSyncId( TInt aAlbumId )
-    {
-    return KAlbumsOffSet + aAlbumId;
-    }