diff -r 000000000000 -r a2952bb97e68 mmappcomponents/harvester/server/src/mpxharvestersession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmappcomponents/harvester/server/src/mpxharvestersession.cpp Thu Dec 17 08:55:47 2009 +0200 @@ -0,0 +1,590 @@ +/* +* 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 server session +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include "mpxharvestercommon.h" +#include "mpxharvestersession.h" +#include "mpxharvesterserver.h" +#include "mpxharvesterengine.h" + +// ============================ LOCAL FUNCTIONS ============================== + +// ---------------------------------------------------------------------------- +// Panic client +// ---------------------------------------------------------------------------- +// +LOCAL_C void PanicClient(const RMessage2 &aMessage,TInt aPanic) + { + _LIT(KTxtServer,"Harvester Server Session"); + aMessage.Panic(KTxtServer,aPanic); + } + +// ---------------------------------------------------------------------------- +// Two-phased constructor. +// ---------------------------------------------------------------------------- +// +CMPXHarvesterSession* CMPXHarvesterSession::NewL( + CMPXHarvesterServer& aServer, + CMPXHarvesterEngine& aEngine) + { + CMPXHarvesterSession* s = new(ELeave)CMPXHarvesterSession(aServer, aEngine); + CleanupStack::PushL(s); + s->ConstructL(); + CleanupStack::Pop(s); + return s; + } + +// ---------------------------------------------------------------------------- +// C++ constructor can NOT contain any code that might leave. +// ---------------------------------------------------------------------------- +// +CMPXHarvesterSession::CMPXHarvesterSession(CMPXHarvesterServer& aServer, + CMPXHarvesterEngine& aEngine) + : iServer(aServer), iEngine(aEngine) + { + iServer.AddClient(); + } + +// ---------------------------------------------------------------------------- +// Symbian 2nd phase constructor can leave. +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::ConstructL() + { + } + +// ---------------------------------------------------------------------------- +// Destructor +// ---------------------------------------------------------------------------- +// +CMPXHarvesterSession::~CMPXHarvesterSession() + { + iServer.RemoveClient(); + delete iDes; + delete iDes8; + delete iBuffer; + delete iMedia; + + iMessages.ResetAndDestroy(); + iMessages.Close(); + } + +// ---------------------------------------------------------------------------- +// Service request +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::ServiceL(const RMessage2& aMessage) + { + // Default ServiceErrorL() will complete the message if ServiceL() leaves + DispatchMessageL(aMessage); + } + +// ---------------------------------------------------------------------------- +// Handle Import Complete +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::HandleImportCompleteL( CMPXMedia* aMedia, + TInt aErr, + RHvsMsg* aMsg ) + { + TInt r(0); + if( aErr == KErrNone ) + { + // Keep media alive + delete iMedia; + iMedia = NULL; + iMedia = CMPXMedia::NewL( *aMedia ); + + // Serialize the media property to iBuffer + ::CreateBufferL( *aMedia, iBuffer ); + r = iBuffer->Size(); + } + CompleteMessage( aMsg, aErr < 0 ? aErr : r ); + } + +// ---------------------------------------------------------------------------- +// Handle Export Complete +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::HandleExportCompleteL( CMPXMedia* aMedia, + TInt aErr, + RHvsMsg* aMsg ) + { + TInt r(0); + if( aErr == KErrNone ) + { + // Keep media alive + delete iMedia; + iMedia = NULL; + + iMedia = CMPXMedia::NewL( *aMedia ); + + // Serialize the media property to iBuffer + ::CreateBufferL( *aMedia, iBuffer ); + r = iBuffer->Size(); + } + CompleteMessage( aMsg, aErr < 0 ? aErr : r ); + } + +// ---------------------------------------------------------------------------- +// Handles task completion with error +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::CompleteTask( RHvsMsg* aMsg, TInt aErr ) + { + CompleteMessage( aMsg, aErr ); + } + +// ---------------------------------------------------------------------------- +// Message dispatcher +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::DispatchMessageL(const RMessage2& aMessage) + { + MPX_DEBUG1(_L("CMPXHarvesterSession::DispatchMessageL <---")); + + TInt op(aMessage.Function()); + + switch(op) + { + case EHvsServerGetBuffer: + { + ASSERT( iBuffer ); + aMessage.WriteL(0,iBuffer->Ptr(0)); + delete iBuffer; + iBuffer = NULL; + aMessage.Complete( KErrNone ); + break; + } + case EHvsServerScan: + { + DoScanL(); + aMessage.Complete( KErrNone ); + break; + } + case EHvsServerCancelScan: + { + aMessage.Complete( KErrNone ); + DoCancelScan(); + break; + } + case EHvsServerShutdown: + { + DoShutdown(); + aMessage.Complete( KErrNone ); + break; + } + case EHvsServerAddFile: + { + ReadDesL( aMessage, 0 ); // file path + RHvsMsg* msg = SetAsyncL( aMessage, (TMPXHarvesterServerOp) op ); + DoAddFileL( msg ); + break; + } + case EHvsServerAddFileMedia: + { + TInt r = DoAddMediaPropL( aMessage ); + aMessage.Complete( r ); + break; + } + case EHvsServerGetMedia: + { + ReadDesL( aMessage, 0 ); // file path + RHvsMsg* msg = SetAsyncL( aMessage, (TMPXHarvesterServerOp) op ); + DoGetMediaL( msg ); + break; + } + case EHvsServerGetColUid: + { + TInt r = DoGetColUidL( aMessage ); + aMessage.Complete( r ); + break; + } + case EHvsServerRemoveFile: + { + ReadDesL( aMessage, 0 ); // file path + TPckgBuf del; + aMessage.Read( 1, del); + + TInt r = iEngine.RemoveFileL( *iDes, del() ); + aMessage.Complete( r ); + break; + } + case EHvsServerRemoveFiles: + { + DoRemoveMultipleFilesL( aMessage ); + aMessage.Complete( KErrNone ); + break; + } + + case EHvsServerRemoveAllFiles: + { + iEngine.RemoveAllFilesL(); + aMessage.Complete( KErrNone ); + break; + } + case EHvsServerUpdateFile: + { + DoUpdateFileL( aMessage ); + aMessage.Complete( KErrNone ); + break; + } + case EHvsServerRenameFile: + { + DoRenameFileL( aMessage ); + aMessage.Complete( KErrNone ); + break; + } + case EHvsServerExportPlaylist: + { + // Async, complete later + RHvsMsg* msg = SetAsyncL( aMessage, (TMPXHarvesterServerOp) op ); + TRAPD( err, iEngine.ExportPlaylistL( msg, this ) ); + if( err != KErrNone ) + { + CompleteMessage( msg, err ); + } + break; + } + case EHvsServerImportPlaylist: + { + RHvsMsg* msg = SetAsyncL( aMessage, (TMPXHarvesterServerOp) op ); + TRAPD( err, iEngine.ImportPlaylistL( msg, this ) ); + if( err != KErrNone ) + { + CompleteMessage( msg, err ); + } + break; + } + case EHvsServerFindColID: + { + ReadDesL( aMessage, 0 ); // file path + TInt r=iEngine.FindCollectionIdL( *iDes ); + aMessage.Complete( r ); + break; + } + case EHvsServerReqAttr: + { + TPckgBuf playlistType; + aMessage.Read(0, playlistType ); + TArray requiredAttributes=iEngine.RequiredAttributesL( playlistType() ); + ::CreateBufferL( requiredAttributes, iBuffer ); //lint !e1024 !e1703 !e1514 !e64 + aMessage.Complete( iBuffer->Size() ); + break; + } + case EHvsServerOptAttr: + { + TPckgBuf playlistType; + aMessage.Read(0, playlistType ); + TArray optionalAttributes=iEngine.OptionalAttributesL( playlistType() ); + ::CreateBufferL( optionalAttributes, iBuffer ); //lint !e1024 !e1703 !e1514 !e64 + aMessage.Complete( iBuffer->Size() ); + break; + } + case EHvsServerPlaylistFileExt: + { + TPckgBuf playlistType; + aMessage.Read(0, playlistType ); + const TDesC& fileExtension=iEngine.PlaylistFileExtensionL( playlistType() ); + aMessage.WriteL(1,fileExtension); + aMessage.Complete( KErrNone ); + break; + } + case EHvsServerIsPlaylist: + { + ReadDesL( aMessage, 0 ); // file path + TBool r=iEngine.IsPlaylistL( *iDes ); + aMessage.Complete( r ); + break; + } + case EHvsServerImportFile: + { + RHvsMsg* msg = SetAsyncL( aMessage, (TMPXHarvesterServerOp) op ); + TRAPD( err, iEngine.ImportFileL( msg, this ) ); + if( err != KErrNone ) + { + CompleteMessage( msg, err ); + } + break; + } + case EHvsServerReCreateDB: + { + iEngine.RecreateDatabases(); + aMessage.Complete( KErrNone ); + break; + } + case EHvsServerCheckSystemEvent: + { + iEngine.CheckForSystemEvents(); + aMessage.Complete( KErrNone ); + break; + } + case EHvsServerCloseTransaction: + { + TRAPD( err, iEngine.CloseTransactionL() ); + aMessage.Complete( err ); + break; + } + default: + PanicClient(aMessage, KErrNotFound); + break; + } + + MPX_DEBUG1(_L("CMPXHarvesterSession::DispatchMessageL --->")); + } + +// ---------------------------------------------------------------------------- +// Start scanning for new files +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::DoScanL() + { + MPX_DEBUG1(_L("CMPXHarvesterSession::DoScanL <---")); + iEngine.ScanL(); + MPX_DEBUG1(_L("CMPXHarvesterSession::DoScanL --->")); + } + +// ---------------------------------------------------------------------------- +// Cancel a scanning operation +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::DoCancelScan() + { + MPX_DEBUG1(_L("CMPXHarvesterSession::DoCancelScanL <---")); + iEngine.CancelScan(); + MPX_DEBUG1(_L("CMPXHarvesterSession::DoCancelScanL --->")); + } + +// ---------------------------------------------------------------------------- +// Shutdown the server, only used for memory leak testing +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::DoShutdown() + { + MPX_DEBUG1(_L("CMPXHarvesterSession::DoShutdown <---")); + CActiveScheduler::Stop(); + MPX_DEBUG1(_L("CMPXHarvesterSession::DoShutdown --->")); + } + +// ---------------------------------------------------------------------------- +// Handles adding a file +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::DoAddFileL( RHvsMsg* aMsg ) + { + MPX_DEBUG1(_L("CMPXHarvesterSession::DoAddFileL <---")); + iEngine.AddFileL( aMsg ,*iDes, this ); + MPX_DEBUG1(_L("CMPXHarvesterSession::DoAddFileL <---")); + } + +// ---------------------------------------------------------------------------- +// Handle adding a media property +// ---------------------------------------------------------------------------- +// +TInt CMPXHarvesterSession::DoAddMediaPropL( const RMessage2& aMessage ) + { + MPX_DEBUG1(_L("CMPXHarvesterSession::DoAddMediaPropL <---")); + CMPXMedia* prop( NULL ); + ::NewFromMessageL( aMessage, 0, prop ); + + CleanupStack::PushL( prop ); + TInt r = iEngine.AddFileL( prop ); + CleanupStack::PopAndDestroy( prop ); + + MPX_DEBUG1(_L("CMPXHarvesterSession::DoAddMediaPropL --->")); + return r; + } + +// ---------------------------------------------------------------------------- +// Handles media creation for a file +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::DoGetMediaL( RHvsMsg* aMsg ) + { + MPX_DEBUG1(_L("CMPXHarvesterSession::DoGetMediaL <---")); + iEngine.GetMediaL( aMsg ,*iDes, this ); + MPX_DEBUG1(_L("CMPXHarvesterSession::DoGetMediaL --->")); + } + +// ---------------------------------------------------------------------------- +// Handle getting collection id +// ---------------------------------------------------------------------------- +// +TInt CMPXHarvesterSession::DoGetColUidL( const RMessage2& aMessage ) + { + MPX_DEBUG1(_L("CMPXHarvesterSession::DoGetColUidL <---")); + + HBufC* buf = HBufC::NewLC(aMessage.GetDesLengthL(0)); + TPtr ptr = buf->Des(); + aMessage.Read(0,ptr); + + TInt r = iEngine.GetColUidL( *buf ); + CleanupStack::PopAndDestroy( buf ); + + MPX_DEBUG1(_L("CMPXHarvesterSession::DoGetColUidL --->")); + return r; + } + +// ---------------------------------------------------------------------------- +// Remove multiple songs from the harvester db +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::DoRemoveMultipleFilesL( const RMessage2& aMessage ) + { + MPX_DEBUG1(_L("CMPXHarvesterSession::DoRemoveMultipleSongsL <---")); + + // Buffer with the array + // + CDesCArray* array( NULL ); + CBufBase* buffer( NULL ); + MPXUser::RecreateBufferL(aMessage.GetDesLengthL(0), buffer); + CleanupStack::PushL( buffer ); + TPtr8 ptr = buffer->Ptr(0); + User::LeaveIfError( aMessage.Read( 0, ptr ) ); + MPXUser::CreateFromBufferL( *buffer, array ); + CleanupStack::PopAndDestroy( buffer ); + + if( array ) + { + CleanupStack::PushL( array ); + + // Check if we want to delete the files + // + TPckgBuf del; + aMessage.Read( 1, del ); + TPckgBuf endTransaction; + TInt error = aMessage.Read( 2, endTransaction ); + TInt endDbTransaction(1); // If endTranscation is not sent, assume True to commit the db. + if ( !error ) + { + endDbTransaction = endTransaction(); + } + // Engine to do the work + // + iEngine.RemoveMultipleFilesL(*array, del(), endDbTransaction ); + + CleanupStack::PopAndDestroy( array ); + } + else + { + // Array was NULL; + User::Leave( KErrArgument ); + } + + MPX_DEBUG1(_L("CMPXHarvesterSession::DoRemoveMultipleSongsL --->")); + } + +// ---------------------------------------------------------------------------- +// Unpacks an RMessage2 and calls update functions in the engine +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::DoUpdateFileL( const RMessage2& aMessage ) + { + // Path of the object + HBufC* buf = HBufC::NewLC(aMessage.GetDesLengthL(0)); + TPtr ptr = buf->Des(); + aMessage.Read(0,ptr); + + // New collection ID + TPckgBuf collection; + aMessage.Read(1, collection ); + + iEngine.UpdateFileL( *buf, collection() ); + CleanupStack::PopAndDestroy( buf ); + } + +// ---------------------------------------------------------------------------- +// Unpacks an RMessage2 and calls rename function in the engine +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::DoRenameFileL( const RMessage2& aMessage ) + { + // Path of the object + HBufC* oldPath = HBufC::NewLC(aMessage.GetDesLengthL(0)); + TPtr oldPathPtr = oldPath->Des(); + aMessage.Read(0,oldPathPtr); + + // Path of the object + HBufC* newPath = HBufC::NewLC(aMessage.GetDesLengthL(1)); + TPtr newPathPtr = newPath->Des(); + aMessage.Read(1,newPathPtr); + + // collection Id of the object + TPckgBuf collection; + aMessage.Read(2, collection ); + + iEngine.RenameFileL( *oldPath, *newPath, collection() ); + CleanupStack::PopAndDestroy( 2, oldPath ); // newPath, oldPath + } + +// ---------------------------------------------------------------------------- +// Sets this message as asynchronous and adds it to internal list +// ---------------------------------------------------------------------------- +// +RHvsMsg* CMPXHarvesterSession::SetAsyncL( const RMessage2& aMessage, + TMPXHarvesterServerOp aOp ) + { + RHvsMsg* msg = new(ELeave) RHvsMsg( aMessage, aOp ); + iMessages.Append( msg ); + return msg; + } + +// ---------------------------------------------------------------------------- +// Complete an async message +// ---------------------------------------------------------------------------- +// +void CMPXHarvesterSession::CompleteMessage( RHvsMsg*& aMessage, + TInt aErr ) + { + TInt count = iMessages.Count(); + for( TInt i=0; iMessage().Complete( aErr ); + delete iMessages[i]; + iMessages.Remove(i); + break; + } + } + } + +// ---------------------------------------------------------------------------- +// Reads a descriptor from the message, allocated into iDes +// ---------------------------------------------------------------------------- +// +const TDesC& CMPXHarvesterSession::ReadDesL(const RMessage2& aMessage, + TInt aMsgSlot) + { + TInt s=aMessage.GetDesLengthL(aMsgSlot); + delete iDes; + iDes=NULL; + iDes=HBufC::NewL(s); + TPtr p=iDes->Des(); + aMessage.ReadL(aMsgSlot,p); + return *iDes; + } + +// END OF FILE +