mmappcomponents/harvester/server/src/mpxharvestersession.cpp
changeset 0 a2952bb97e68
--- /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 <e32std.h>
+#include <e32svr.h>
+#include <bamdesca.h>
+#include <mpxlog.h>
+#include <mpxuser.h>
+#include <mpxcmn.h>
+#include <mpxmedia.h>
+#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<CMPXMedia>( *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<CMPXMedia>( *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<TInt> 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<TInt> playlistType;
+            aMessage.Read(0, playlistType );
+            TArray<TMPXAttribute> requiredAttributes=iEngine.RequiredAttributesL( playlistType() );
+            ::CreateBufferL<TMPXAttribute>( requiredAttributes, iBuffer ); //lint !e1024 !e1703 !e1514 !e64
+            aMessage.Complete( iBuffer->Size() );
+            break;
+            }
+        case EHvsServerOptAttr:
+            {
+            TPckgBuf<TInt> playlistType;
+            aMessage.Read(0, playlistType );
+            TArray<TMPXAttribute> optionalAttributes=iEngine.OptionalAttributesL( playlistType() );
+            ::CreateBufferL<TMPXAttribute>( optionalAttributes, iBuffer ); //lint !e1024 !e1703 !e1514 !e64
+            aMessage.Complete( iBuffer->Size() );
+            break;
+            }
+        case EHvsServerPlaylistFileExt:
+            {
+            TPckgBuf<TInt> 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<CMPXMedia>( 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<TInt> del;
+        aMessage.Read( 1, del );
+        TPckgBuf<TInt> 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<TInt> 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<TInt> 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; i<count; ++i )
+        {
+        if( aMessage == iMessages[i] )
+            {
+            // Ensures we complete the correct message!
+            iMessages[i]->Message().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
+