mmappcomponents/harvester/utility/src/mpxharvesterutilityimp.cpp
changeset 0 a2952bb97e68
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmappcomponents/harvester/utility/src/mpxharvesterutilityimp.cpp	Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,786 @@
+/*
+* Copyright (c) 2006 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:  Harvester utility implementation
+*
+*/
+
+
+#include <e32base.h>
+#include <f32file.h>
+#include <mpxharvesterserverdefs.h>
+#include <mpxcmn.h>
+
+#include <mpxmedia.h>
+#include <mpxmediageneraldefs.h>
+#include <mpxcollectionpath.h>
+#include <mpxlog.h>
+#include "mpxharvesterutilityobserver.h"
+#include "mpxharvesterutilityimp.h"
+
+
+const TInt KMaxPlaylistExtensionLength = 10;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Private Constructor
+// ---------------------------------------------------------------------------
+//
+CMPXHarvesterUtilityImp::CMPXHarvesterUtilityImp() : CActive( EPriorityNormal ),
+                                               iCurAsyncOp( EHvsServerOpCount )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+
+// ---------------------------------------------------------------------------
+// 2nd-Phased Constructor
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::ConstructL()
+    {
+    TInt err = iSession.Connect(KMPXHarvesterServerName,
+                                KMPXHarvesterServerImg,
+                                TVersion(KMPXHarvesterServerMajorVersionNumber,
+                                         KMPXHarvesterServerMinorVersionNumber,
+                                         KMPXHarvesterServerBuildVersionNumber));
+    User::LeaveIfError( err );
+    }
+
+// ---------------------------------------------------------------------------
+// Two-Phased Constructor
+// ---------------------------------------------------------------------------
+//
+CMPXHarvesterUtilityImp* CMPXHarvesterUtilityImp::NewL()
+    {
+    CMPXHarvesterUtilityImp* self = new( ELeave ) CMPXHarvesterUtilityImp();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Virtual Destructor
+// ---------------------------------------------------------------------------
+//
+CMPXHarvesterUtilityImp::~CMPXHarvesterUtilityImp()
+    {
+    Cancel();
+
+    delete iBuffer;
+    iSession.Close();
+    delete iCurTask;
+	delete iFile;
+    }
+
+// ---------------------------------------------------------------------------
+// Scan Function
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::ScanL()
+    {
+    iSession.SendReceiveL( EHvsServerScan );
+    }
+
+// ---------------------------------------------------------------------------
+// Cancel Scan Function
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::CancelScanL()
+    {
+    iSession.SendReceiveL( EHvsServerCancelScan );
+    }
+
+// ---------------------------------------------------------------------------
+// Shut down the server function
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::ShutdownL()
+    {
+    iSession.SendReceiveL( EHvsServerShutdown );
+    }
+
+// ---------------------------------------------------------------------------
+// Add a song to the harvester
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::AddFileL( const TDesC& aFilePath,
+                                        MMPXHarvesterUtilityObserver* aObs )
+    {
+    ASSERT( !iCurTask );
+    HBufC* path = aFilePath.AllocLC();
+    iCurTask = new(ELeave) CHvsUtilityTask( NULL, path,
+                                            NULL, NULL );
+    CleanupStack::Pop( path );
+    iSession.SendReceive( EHvsServerAddFile, TIpcArgs( &iCurTask->Arg2() ), iStatus );
+
+    // Set Async op
+    iCurAsyncOp = EHvsServerAddFile;
+    iObserver = aObs;
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+// Add a song to the harvester
+// ---------------------------------------------------------------------------
+//
+TInt CMPXHarvesterUtilityImp::AddFileL( CMPXMedia*& aProperty )
+    {
+    CBufBase* buf( NULL );
+    CreateBufferL<CMPXMedia>( *aProperty, buf );
+    CleanupStack::PushL( buf );
+    TPtr8 p = buf->Ptr(0);
+    TInt r = iSession.SendReceiveL( EHvsServerAddFileMedia, TIpcArgs( &p ) );
+    CleanupStack::PopAndDestroy( buf );
+    return r;
+    }
+
+// ---------------------------------------------------------------------------
+// Remove a song from the harvester
+// ---------------------------------------------------------------------------
+//
+TInt CMPXHarvesterUtilityImp::RemoveFileL( const TDesC& aFilePath )
+    {
+    TPckgBuf<TInt> del(EFalse);
+    return iSession.SendReceiveL( EHvsServerRemoveFile, TIpcArgs( &aFilePath,
+                                                                  &del ) );
+    }
+
+// ---------------------------------------------------------------------------
+// Remove multiple songs from the harvester
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::RemoveFilesL( const MDesCArray& aArray )
+    {
+    CBufBase* buf( NULL );
+    MPXUser::CreateBufferL( &aArray, buf );
+    CleanupStack::PushL( buf );
+    // IPC args
+    TPtr8 p=buf->Ptr(0);
+    TPckgBuf<TInt> del(EFalse);
+    iSession.SendReceiveL( EHvsServerRemoveFiles,
+                           TIpcArgs( &p, &del ) );
+    CleanupStack::PopAndDestroy( buf );
+    }
+
+// ---------------------------------------------------------------------------
+// Remove all songs from the harvester
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::RemoveAllFilesL()
+    {
+    iSession.SendReceiveL( EHvsServerRemoveAllFiles );
+    }
+
+// ---------------------------------------------------------------------------
+// Recreate the harvester database
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::RecreateDatabasesL()
+    {
+    iSession.SendReceiveL( EHvsServerReCreateDB );
+    }
+
+// ---------------------------------------------------------------------------
+// Remove a song and delete it from the file system
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::DeleteFileL( const TDesC& aFilePath,
+                                        MMPXHarvesterUtilityObserver* aObs  )
+    {
+    ASSERT( !iCurTask );
+
+    HBufC* path = aFilePath.AllocLC();
+    iCurTask = new(ELeave) CHvsUtilityTask( NULL, path,
+                                            NULL, ETrue );
+    CleanupStack::Pop( path );
+
+    iSession.SendReceive( EHvsServerRemoveFile, TIpcArgs( &iCurTask->Arg2(),
+                          &iCurTask->Arg4() ), iStatus );
+
+    // Set Async op
+    iCurAsyncOp = EHvsServerRemoveFile;
+    iObserver = aObs;
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+// Remove and delete a list of files from the file system
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::DeleteFilesL( const MDesCArray& aArray,
+                                         MMPXHarvesterUtilityObserver* aObs  )
+    {
+    ASSERT( !iCurTask );
+
+    CBufBase* buf( NULL );
+    MPXUser::CreateBufferL( &aArray, buf );
+    CleanupStack::PushL( buf );
+    iCurTask = new(ELeave) CHvsUtilityTask( buf, NULL,
+                                            NULL, ETrue );
+    CleanupStack::Pop( buf );
+
+    iSession.SendReceive( EHvsServerRemoveFiles,
+                          TIpcArgs( &iCurTask->Arg1(), &iCurTask->Arg4() ), iStatus );
+    // Set Async op
+    iCurAsyncOp = EHvsServerRemoveFiles;
+    iObserver = aObs;
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+// Remove and delete a list of files from the file system
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::DeleteFilesL( const MDesCArray& aArray )
+    {
+    DeleteFilesL( aArray, ETrue );
+    }
+
+// ---------------------------------------------------------------------------
+// Remove and delete a list of files from the file system
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::DeleteFilesL( const MDesCArray& aArray, TBool aEndTransaction )
+    {
+    CBufBase* buf( NULL );
+    MPXUser::CreateBufferL( &aArray, buf );
+    CleanupStack::PushL( buf );
+    // IPC args
+    TPtr8 p=buf->Ptr(0);
+    TPckgBuf<TInt> del(ETrue);
+    TPckgBuf<TInt> transaction(aEndTransaction);
+    iSession.SendReceiveL( EHvsServerRemoveFiles,
+                           TIpcArgs( &p, &del , &transaction ) );
+    CleanupStack::PopAndDestroy( buf );
+    }
+
+// ---------------------------------------------------------------------------
+// Close the database transaction
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::CloseTransactionL()
+    {
+    iSession.SendReceiveL( EHvsServerCloseTransaction );
+    }
+
+// ---------------------------------------------------------------------------
+// Remove and delete a file from the file system
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::UpdateFileL( CMPXMedia*& aProperty )
+    {
+    TMPXAttribute att( KMPXMediaIdGeneral, EMPXMediaGeneralUri );
+    const TDesC& filepath = aProperty->ValueText( att );
+
+    att = TMPXAttribute( KMPXMediaIdGeneral, EMPXMediaGeneralCollectionId );
+    const TUid& collection = aProperty->ValueTObjectL<TUid>( att );
+
+    TPckgBuf<TInt>  arg2( collection.iUid );
+    iSession.SendReceiveL( EHvsServerUpdateFile, TIpcArgs(&filepath, &arg2) );
+    }
+
+// ---------------------------------------------------------------------------
+// Rename file for the media
+// ---------------------------------------------------------------------------
+//
+HBufC* CMPXHarvesterUtilityImp::RenameFileLC( const CMPXMedia& aMedia )
+    {
+    TMPXGeneralCategory category =
+         aMedia.ValueTObjectL<TMPXGeneralCategory>(
+            TMPXAttribute(KMPXMediaIdGeneral,EMPXMediaGeneralCategory));
+    if ( category != EMPXPlaylist )
+        {
+        User::Leave( KErrNotSupported );
+        }
+
+    const TDesC& title =
+        aMedia.ValueText(
+            TMPXAttribute( KMPXMediaIdGeneral, EMPXMediaGeneralTitle ) );
+
+    const TDesC& oldPath =
+        aMedia.ValueText(
+            TMPXAttribute( KMPXMediaIdGeneral, EMPXMediaGeneralUri ) );
+
+    // determine the new file path from the existing file path and the given title
+    TParsePtrC parser( oldPath );
+    HBufC* newPath = HBufC::NewLC( parser.DriveAndPath().Length() +
+                                   title.Length() + parser.Ext().Length() );
+    TPtr ptr = newPath->Des();
+    ptr.Append( parser.DriveAndPath() );
+    ptr.Append( title );
+    ptr.Append( parser.Ext() );
+
+    // get collection Id
+    const TUid& collection =
+         aMedia.ValueTObjectL<TUid>(TMPXAttribute(KMPXMediaIdGeneral,EMPXMediaGeneralCollectionId));
+
+    RenameFileL(oldPath, *newPath, collection.iUid);
+
+    return newPath;
+    }
+
+// ---------------------------------------------------------------------------
+// Rename file
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::RenameFileL( const TDesC& aOldUri,
+                                        const TDesC& aNewUri,
+                                        TInt aCollection )
+    {
+    TPckgBuf<TInt> collectionId( aCollection );
+
+    iSession.SendReceiveL( EHvsServerRenameFile, TIpcArgs(&aOldUri, &aNewUri, &collectionId) );
+    }
+
+// ---------------------------------------------------------------------------
+// Find the collection ID for a file
+// ---------------------------------------------------------------------------
+//
+TInt CMPXHarvesterUtilityImp::FindCollectionIdL( const TDesC& aFile )
+    {
+    return iSession.SendReceiveL( EHvsServerFindColID, TIpcArgs(&aFile) );
+    }
+
+// ---------------------------------------------------------------------------
+// Query the required attributes for tracks for the specified playlist type
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::RequiredAttributesL(TInt aPlaylistType,
+                                               RArray<TMPXAttribute>& aRequiredAttributes)
+    {
+    TPckgBuf<TInt> playlistType( aPlaylistType );
+
+    TInt size = iSession.SendReceiveL( EHvsServerReqAttr, TIpcArgs( &playlistType) );
+
+    // Transfer results from server
+    // lint doesn't understand the template ::CreateBuffer
+    //
+    ::TransferBufferFromServerL( iSession, EHvsServerGetBuffer, size, iBuffer );
+    ::CreateFromBufferL<TMPXAttribute>( *iBuffer, aRequiredAttributes ); //lint !e1024 !e1703 !e1514 !e64
+    }
+
+// ---------------------------------------------------------------------------
+// Query the optional attributes for tracks for the specified playlist type
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::OptionalAttributesL(TInt aPlaylistType,
+                                               RArray<TMPXAttribute>& aOptionalAttributes)
+    {
+    TPckgBuf<TInt> playlistType( aPlaylistType );
+
+    TInt size = iSession.SendReceiveL( EHvsServerOptAttr, TIpcArgs( &playlistType) );
+
+    // Transfer results from server
+    //
+    ::TransferBufferFromServerL( iSession, EHvsServerGetBuffer, size, iBuffer );
+    ::CreateFromBufferL<TMPXAttribute>( *iBuffer, aOptionalAttributes ); //lint !e1024 !e1703 !e1514 !e64
+    }
+
+// ---------------------------------------------------------------------------
+// Queries about the playlist file extension of the currently selected playlist
+// plugin
+// ---------------------------------------------------------------------------
+HBufC* CMPXHarvesterUtilityImp::PlaylistFileExtensionLC(TInt aPlaylistType)
+    {
+    TPckgBuf<TInt> playlistType( aPlaylistType );
+
+    HBufC* fileExtension = HBufC::NewLC(KMaxPlaylistExtensionLength);
+    TPtr extension = fileExtension->Des();
+
+    User::LeaveIfError(
+        iSession.SendReceiveL( EHvsServerPlaylistFileExt, TIpcArgs(&playlistType, &extension)));
+
+    return fileExtension;
+    }
+
+// ---------------------------------------------------------------------------
+// Determines if the given file is a playlist
+// ---------------------------------------------------------------------------
+//
+TBool CMPXHarvesterUtilityImp::IsPlaylistL( const TDesC& aUri )
+    {
+    return iSession.SendReceiveL( EHvsServerIsPlaylist, TIpcArgs(&aUri) );
+    }
+
+// ---------------------------------------------------------------------------
+// Tells the harvester to poll for system events
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::CheckForSystemEventsL()
+    {
+    User::LeaveIfError( iSession.SendReceiveL( EHvsServerCheckSystemEvent ) );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Closes the harvester utility
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::Close()
+    {
+    delete this;
+    }
+
+// ---------------------------------------------------------------------------
+// Get a media object for the file
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::GetMediaForFileL( const TDesC& aFilePath,
+                                        MMPXHarvesterUtilityObserver* aObs )
+    {
+    ASSERT( !iCurTask );
+    HBufC* path = aFilePath.AllocLC();
+    iCurTask = new(ELeave) CHvsUtilityTask( NULL, path,
+                                            NULL, NULL );
+    CleanupStack::Pop( path );
+    iSession.SendReceive( EHvsServerGetMedia, TIpcArgs( &iCurTask->Arg2() ), iStatus );
+
+    // Set Async op
+    iCurAsyncOp = EHvsServerGetMedia;
+    iObserver = aObs;
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+// Get a collection ID for the file
+// ---------------------------------------------------------------------------
+//
+TInt CMPXHarvesterUtilityImp::GetColUidForFileL( const TDesC& aFilePath )
+    {
+    return iSession.SendReceiveL( EHvsServerGetColUid, TIpcArgs(&aFilePath) );
+    }
+
+// ---------------------------------------------------------------------------
+// Export a playlist to a file
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::ExportPlaylistL( const CMPXMedia& aProp,
+                                            const TDesC& aPath,
+                                            TInt aPlaylistType,
+                                            MMPXHarvesterUtilityObserver* aObs )
+    {
+    if( iCurAsyncOp != EHvsServerOpCount )
+        {
+        User::Leave( KErrNotReady );
+        }
+
+    // Construct the IPC Args
+    CBufBase* buf( NULL );
+    CreateBufferL<CMPXMedia>( aProp, buf );
+    CleanupStack::PushL( buf );
+    HBufC* path = aPath.AllocLC();
+    CMPXMedia* copy = CMPXMedia::NewL( aProp );
+    CleanupStack::PushL( copy );
+    iCurTask = new(ELeave) CHvsUtilityTask( buf, path,
+                                            NULL, aPlaylistType, copy );  // ownership xfer
+    CleanupStack::Pop( 3, buf );
+
+    // Send the IPC
+    //
+    iSession.SendReceive( EHvsServerExportPlaylist,
+                          TIpcArgs( &iCurTask->Arg1(), &iCurTask->Arg2(),
+                                    &iCurTask->Arg4() ),
+                          iStatus );
+
+    iCurAsyncOp = EHvsServerExportPlaylist;
+    iObserver = aObs;
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+// Import a playlist from a file
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::ImportPlaylistL( const TDesC& aFilename,
+                                            MMPXHarvesterUtilityObserver* aObs )
+    {
+    if( iCurAsyncOp != EHvsServerOpCount )
+        {
+        User::Leave( KErrNotReady );
+        }
+
+    HBufC* file = aFilename.AllocL();
+    iCurTask = new(ELeave) CHvsUtilityTask( NULL, file );
+    iSession.SendReceive( EHvsServerImportPlaylist,
+                          TIpcArgs( &iCurTask->Arg2() ),
+                          iStatus );
+
+    iCurAsyncOp = EHvsServerImportPlaylist;
+    iObserver = aObs;
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+// Import a file, async
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::ImportFileL( const TDesC& aFilename,
+                                        MMPXHarvesterUtilityObserver* aObs )
+    {
+    if( iCurAsyncOp != EHvsServerOpCount )
+        {
+        User::Leave( KErrNotReady );
+        }
+    if( iFile != NULL )
+    	{
+    	delete iFile;
+    	iFile = NULL;
+    	}
+    iFile = aFilename.AllocL();
+    HBufC* file = aFilename.AllocL();
+    iCurTask = new(ELeave) CHvsUtilityTask( NULL, file );
+    iSession.SendReceive( EHvsServerImportFile,
+                          TIpcArgs( iFile ),
+                          iStatus );
+
+    iCurAsyncOp = EHvsServerImportFile;
+    iObserver = aObs;
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+// RunL() from CActive
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::RunL()
+    {
+    // Try again in case server is down for IAD
+    if (iStatus == KErrDied || iStatus == KErrServerTerminated)
+        {
+        MPX_DEBUG1("-->CMPXHarvesterUtilityImp::RunL Reconnecting session for IAD");
+        
+        // attempt to bring the server back up
+        if (iSession.Reconnect() != KErrNone)
+            {
+            MPX_DEBUG1("-->CMPXHarvesterUtilityImp::RunL Reconnect Failed");
+            }
+        }
+    
+    // Clear status needs to be here because user can launch a second
+    // async op within the callback!
+    //
+    delete iCurTask;
+    iCurTask = NULL;
+
+    // Cache these variables as locals because they need to be used
+    //
+    MMPXHarvesterUtilityObserver*  curObserver = iObserver;
+    iObserver = NULL;
+    TInt curTask = iCurAsyncOp;
+    iCurAsyncOp = EHvsServerOpCount;
+
+
+    switch( curTask )
+        {
+        case EHvsServerAddFile:
+            {
+            TInt size = iStatus.Int();
+            CMPXMedia* prop( NULL );
+            if( size > 0 )
+                {
+                ::TransferBufferFromServerL(iSession, EHvsServerGetBuffer,
+                                            size, iBuffer);
+                ::NewFromBufferL<CMPXMedia>( *iBuffer, prop );
+                delete iBuffer;
+                iBuffer = NULL;
+                }
+            curObserver->HandleFileAddCompletedL( prop, size<0?size:KErrNone ) ;
+            break;
+            }
+        case EHvsServerRemoveFile:
+        case EHvsServerRemoveFiles:  // deliberate fall through
+            {
+            TInt err( iStatus.Int() );
+            curObserver->HandleDeleteCompletedL( err>0?KErrNone:err );
+            break;
+            }
+        case EHvsServerExportPlaylist:
+            {
+            TInt size = iStatus.Int();
+            CMPXMedia* prop( NULL );
+            if( size > 0 )
+                {
+                ::TransferBufferFromServerL(iSession, EHvsServerGetBuffer,
+                                            size, iBuffer);
+                ::NewFromBufferL<CMPXMedia>( *iBuffer, prop );
+                delete iBuffer;
+                iBuffer = NULL;
+                }
+            // observer takes ownership of prop
+            curObserver->HandlePlaylistExportCompletedL( prop, size<0?size:KErrNone );
+            break;
+            }
+        case EHvsServerImportPlaylist:
+            {
+            TInt size = iStatus.Int();
+            CMPXMedia* prop(NULL);
+            if( size > 0 )
+                {
+                ::TransferBufferFromServerL(iSession, EHvsServerGetBuffer,
+                                            size, iBuffer);
+                ::NewFromBufferL<CMPXMedia>( *iBuffer, prop );
+                delete iBuffer;
+                iBuffer = NULL;
+                }
+            curObserver->HandlePlaylistImportCompletedL( prop,
+                                                       size<0?size:KErrNone );
+            break;
+            }
+        case EHvsServerImportFile:
+            {
+            TInt size = iStatus.Int();
+            CMPXMedia* prop(NULL);
+            if( size > 0 )
+                {
+                ::TransferBufferFromServerL(iSession, EHvsServerGetBuffer,
+                                            size, iBuffer);
+                ::NewFromBufferL<CMPXMedia>( *iBuffer, prop );
+                delete iBuffer;
+                iBuffer = NULL;
+                }
+            curObserver->HandleFileImportCompletedL( prop, size<0?size:KErrNone );
+            break;
+            }
+        case EHvsServerGetMedia:
+            {
+            TInt size = iStatus.Int();
+            CMPXMedia* prop( NULL );
+            if( size > 0 )
+                {
+                ::TransferBufferFromServerL(iSession, EHvsServerGetBuffer,
+                                            size, iBuffer);
+                ::NewFromBufferL<CMPXMedia>( *iBuffer, prop );
+                delete iBuffer;
+                iBuffer = NULL;
+                }
+            curObserver->HandleFileGetMediaCompletedL( prop, size<0?size:KErrNone ) ;
+            break;
+            }
+        default:
+            {
+            ASSERT(0);
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Cancels the current async op
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterUtilityImp::DoCancel()
+    {
+    // Do Nothing
+    }
+
+// ----------------------------------------------------------------------------
+// Handles a leave occurring in the request completion event handler RunL()
+// ----------------------------------------------------------------------------
+//
+TInt CMPXHarvesterUtilityImp::RunError(TInt aError)
+    {
+    MPX_DEBUG2("CMPXHarvesterUtilityImp::RunError(%d)", aError );
+    (void) aError;
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// Utility class to cache async requests
+// ---------------------------------------------------------------------------
+//
+CMPXHarvesterUtilityImp::CHvsUtilityTask::CHvsUtilityTask( CBufBase* arg1,
+                                                        HBufC* arg2,
+                                                        HBufC* arg3,
+                                                        TInt arg4,
+                                                        CMPXMedia* arg5 )
+    {
+    iArg1 = arg1;
+    iArg2 = arg2;
+    iArg3 = arg3;
+    iArg4 = TPckgBuf<TInt>(arg4);
+    iArg5 = arg5;
+
+    if( iArg1 )
+        {
+        iPtr1.Set(iArg1->Ptr(0));
+        }
+    if( iArg2 )
+        {
+        iPtr2.Set(iArg2->Des());
+        }
+    if( iArg3 )
+        {
+        iPtr3.Set(iArg3->Des());
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Default destructor
+// ---------------------------------------------------------------------------
+//
+CMPXHarvesterUtilityImp::CHvsUtilityTask::~CHvsUtilityTask()
+    {
+    delete iArg1;
+    delete iArg2;
+    delete iArg3;
+    delete iArg5;
+    }
+
+// ---------------------------------------------------------------------------
+// Access each argument
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CMPXHarvesterUtilityImp::CHvsUtilityTask::Arg1()
+    {
+    return iPtr1;
+    }
+
+// ---------------------------------------------------------------------------
+// Access each argument
+// ---------------------------------------------------------------------------
+//
+const TDesC&  CMPXHarvesterUtilityImp::CHvsUtilityTask::Arg2()
+    {
+    return iPtr2;
+    }
+
+// ---------------------------------------------------------------------------
+// Access each argument
+// ---------------------------------------------------------------------------
+//
+const TDesC&  CMPXHarvesterUtilityImp::CHvsUtilityTask::Arg3()
+    {
+    return iPtr3;
+    }
+
+// ---------------------------------------------------------------------------
+// Access each argument
+// ---------------------------------------------------------------------------
+//
+const TDesC8&  CMPXHarvesterUtilityImp::CHvsUtilityTask::Arg4()
+    {
+    return iArg4;
+    }
+
+// ---------------------------------------------------------------------------
+// Access each argument
+// ---------------------------------------------------------------------------
+//
+const CMPXMedia& CMPXHarvesterUtilityImp::CHvsUtilityTask::Arg5()
+    {
+    return *iArg5;
+    }
+
+// END OF FILE