contentstorage/srvsrc/casrvsession.cpp
branchRCL_3
changeset 113 0efa10d348c0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentstorage/srvsrc/casrvsession.cpp	Tue Aug 31 15:30:51 2010 +0300
@@ -0,0 +1,421 @@
+/*
+ * Copyright (c) 2008 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:  ?Description
+ *
+ */
+
+#include <s32mem.h>
+#include "casrvsession.h"
+#include "caentriesarray.h"
+#include "caarraycleanup.inl"
+#include "castorageproxy.h"
+#include "caidsarray.h"
+#include "cainnerentry.h"
+#include "cainnerquery.h"
+#include "casrvnotifier.h"
+#include "casrvdef.h"
+#include "cautils.h"
+#include "cainnernotifierfilter.h"
+
+const TInt KParamIndNotif = 3;
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+CCaSrvSession::~CCaSrvSession()
+    {
+    RHashMap<TInt, CCaSrvNotifier*>::TIter iter( iNotifiers );
+    while( iter.NextValue() )
+        {
+        delete *iter.CurrentValue();
+        }
+    iNotifiers.Close();
+    iStorageProxy.RemoveSession( this );
+    iCaSrv.DecreaseSessionCount();
+    delete iSerializedGetEntriesResult;
+    delete iSerializedGetIdsResult;
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+CCaSrvSession* CCaSrvSession::NewL( CCaSrv& aCaSrv )
+    {
+    CCaSrvSession* self = new ( ELeave ) CCaSrvSession( aCaSrv );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+CCaSrvSession::CCaSrvSession( CCaSrv& aCaSrv ) :
+    iCaSrv( aCaSrv ), iNotifiers(), 
+    iStorageProxy( *iCaSrv.GetStorageProxy() )
+    {
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+void CCaSrvSession::ConstructL()
+    {
+    iCaSrv.IncreaseSessionCount();
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+void CCaSrvSession::ServiceL( const RMessage2& aMessage )
+    {
+    TInt err( KErrNone );
+    TBool panicedClient( EFalse );
+        TRAP( err , DispatchMessageL( aMessage, panicedClient ) );
+    if( !panicedClient && aMessage.Function()
+            != EContentArsenalNotifierNotify )
+        {
+        aMessage.Complete( err );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CCaSrvSession::DispatchMessageL( const RMessage2& aMessage,
+        TBool& aPanicedClient )
+    {
+    switch( aMessage.Function() )
+        {
+        case EContentArsenalGetList_GetSize:
+            GetListSizeL( aMessage, EFull );
+            break;
+        case EContentArsenalGetList_GetData:
+            GetListDataL( aMessage );
+            break;
+        case EContentArsenalGetIds_GetSize:
+            GetListSizeL( aMessage, EIds );
+            break;
+        case EContentArsenalGetIds_GetData:
+            GetIdsDataL( aMessage );
+            break;
+        case EContentArsenalAdd:
+            AddL( aMessage );
+            break;
+        case EContentArsenalRemove:
+            RemoveL( aMessage );
+            break;
+        case EContentArsenalOrganize:
+            OrganizeL( aMessage );
+            break;
+        case EContentArsenalTouch:
+            TouchL( aMessage );
+            break;
+        case EContentArsenalNotifierOpen:
+            NewNotifierL( aMessage );
+            break;
+        case EContentArsenalNotifierClose:
+            RemoveNotifierL( aMessage );
+            break;
+        case EContentArsenalNotifierNotify:
+            NotifierL( aMessage.Int3() )->NotifyL( aMessage );
+            break;
+        case EContentArsenalNotifierCancel:
+            NotifierL( aMessage.Int3() )->Cancel();
+            break;
+        case EContentArsenalGetChangeInfo:
+            GetChangeInfoL( aMessage );
+            break;
+        case EContentArsenalCustomSort:
+            CustomSortL( aMessage );
+            break;
+        default:
+            aMessage.Panic( KCaSrvName, KErrArgument );
+            aPanicedClient = ETrue;
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CCaSrvSession::GetListSizeL( const RMessage2& aMessage,
+        TGetListType aType )
+    {
+    CCaInnerQuery* query = CCaInnerQuery::NewLC();
+    MenuUtils::InternalizeObjectL( aMessage, *query );
+    TInt size( 0 );
+    if( aType == EIds )
+        {
+        size = GetIdsL( query );
+        }
+    else
+        {
+        size = GetEntriesL( query );
+        }
+    TPckg<TInt> sizeDes( size );
+    aMessage.WriteL( KOutputPosition, sizeDes );
+    CleanupStack::PopAndDestroy( query );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// --------------- --------------------------------------------------------------
+//
+TInt CCaSrvSession::GetEntriesL( const CCaInnerQuery* aQuery )
+    {
+    RCaEntriesArray resultContainer;
+    CleanupResetAndDestroyPushL( resultContainer );
+    iStorageProxy.GetEntriesL( aQuery, resultContainer );
+    delete iSerializedGetEntriesResult;
+    iSerializedGetEntriesResult = NULL;
+    iSerializedGetEntriesResult = 
+            MenuUtils::MarshalDataL( resultContainer, KDefaultExpandSize );
+    CleanupStack::PopAndDestroy( &resultContainer );
+    return iSerializedGetEntriesResult->Size();
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// --------------- --------------------------------------------------------------
+//
+TInt CCaSrvSession::GetIdsL( const CCaInnerQuery* aQuery )
+    {
+    RCaIdsArray resultContainer;
+    CleanupClosePushL( resultContainer );
+    iStorageProxy.GetEntriesIdsL( aQuery, resultContainer );
+    delete iSerializedGetIdsResult;
+    iSerializedGetIdsResult = NULL;
+    iSerializedGetIdsResult = 
+            MenuUtils::MarshalDataL( resultContainer, KDefaultExpandSize );
+    CleanupStack::PopAndDestroy( &resultContainer );
+    return iSerializedGetIdsResult->Size();
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CCaSrvSession::GetListDataL( const RMessage2& aMessage )
+    {
+    aMessage.WriteL( KOutputPosition, iSerializedGetEntriesResult->Des() );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CCaSrvSession::GetIdsDataL( const RMessage2& aMessage )
+    {
+    aMessage.WriteL( KOutputPosition, iSerializedGetIdsResult->Des() );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// --------------- --------------------------------------------------------------
+//
+void CCaSrvSession::AddL( const RMessage2& aMessage)
+    {
+    CCaInnerEntry* entry = CCaInnerEntry::NewLC();
+    MenuUtils::InternalizeObjectL( aMessage, *entry );
+    iStorageProxy.AddL( entry, entry->GetId() > 0 );
+    TPckg<TInt> resultId( entry->GetId() );
+    aMessage.WriteL( KOutputPosition, resultId );
+    CleanupStack::PopAndDestroy( entry );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// --------------- --------------------------------------------------------------
+//
+void CCaSrvSession::RemoveL( const RMessage2& aMessage )
+    {
+    RCaIdsArray entryIds;
+    CleanupClosePushL( entryIds );
+    MenuUtils::InternalizeObjectL( aMessage, entryIds );
+    iStorageProxy.RemoveL( entryIds );
+    CleanupStack::PopAndDestroy( &entryIds );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// --------------- --------------------------------------------------------------
+//
+void CCaSrvSession::OrganizeL( const RMessage2& aMessage )
+    {
+    RCaIdsArray entryIds;
+    CleanupClosePushL( entryIds );
+    MenuUtils::InternalizeObjectL( aMessage, entryIds );
+    TCaOperationParams operationParams;
+    TPckg<TCaOperationParams> data( operationParams );
+    aMessage.Read( KInputPosition2, data );
+    iStorageProxy.OrganizeL( entryIds, operationParams );
+    CleanupStack::PopAndDestroy( &entryIds );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// --------------- --------------------------------------------------------------
+//
+void CCaSrvSession::TouchL( const RMessage2& aMessage )
+    {
+    CCaInnerEntry* entry = CCaInnerEntry::NewLC();
+    MenuUtils::InternalizeObjectL( aMessage, *entry );
+    
+    iStorageProxy.TouchL( entry );
+    
+    CleanupStack::PopAndDestroy( entry );    
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+void CCaSrvSession::NewNotifierL( const RMessage2& aMessage )
+    {
+    CCaSrvNotifier* obj = CCaSrvNotifier::NewLC();
+    TInt handle = reinterpret_cast<TInt> ( obj );
+    //address pointer of obj is added as unique key in RHashMap
+    iNotifiers.InsertL( handle, obj );
+    CleanupStack::Pop( obj ); // Now we manage the notifier by handle.
+    TPckgC<TInt> handlePckg( handle );
+    TInt err = aMessage.Write( KParamIndNotif, handlePckg );
+    if( err )
+        {
+        delete obj;
+        iNotifiers.Remove( handle );
+        User::Leave( err );
+        }
+    if( iNotifiers.Count() == 1 )
+        {
+        iStorageProxy.AddSessionL( this );
+        }
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+CCaSrvNotifier* CCaSrvSession::NotifierL( TInt aHandle )
+    {
+    CCaSrvNotifier** obj = iNotifiers.Find( aHandle ); 
+    if( !obj )
+        {
+        User::Leave( KErrBadHandle );
+        }
+    return *obj;
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+void CCaSrvSession::RemoveNotifierL( const RMessage2& aMessage )
+    {
+    CCaSrvNotifier* notifier = NotifierL( aMessage.Int3() ); 
+    if( notifier )
+        {
+        delete notifier;
+        iNotifiers.Remove( aMessage.Int3() );
+        if( iNotifiers.Count() == 0 )
+            {
+            iStorageProxy.RemoveSession( this );
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+void CCaSrvSession::GetChangeInfoL( const RMessage2& aMessage )
+    {
+    CCaSrvNotifier* notifier = NotifierL( aMessage.Int3() ); 
+    if( !notifier )
+        {
+        User::Leave( KErrBadHandle );
+        }
+    notifier->GetChangeInfoL( aMessage );
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+void CCaSrvSession::CustomSortL( const RMessage2& aMessage )
+    {
+    RCaIdsArray entryIds;
+    CleanupClosePushL( entryIds );
+    MenuUtils::InternalizeObjectL( aMessage, entryIds );
+        
+    TInt gruopId;
+    TPckg<TInt> data( gruopId );
+    aMessage.Read( KInputPosition2, data );
+    
+    iStorageProxy.CustomSortL( entryIds, gruopId );
+    CleanupStack::PopAndDestroy( &entryIds );
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+void CCaSrvSession::EntryChanged( const CCaInnerEntry* aEntry,
+        TChangeType aChangeType, const RArray<TInt>& aParentIds )
+    {
+    RHashMap<TInt, CCaSrvNotifier*>::TIter iter( iNotifiers );
+    while( iter.NextValue() )
+        {
+        TRAP_IGNORE( ( *iter.CurrentValue() )->
+                EntryChangedL( aEntry, aChangeType, aParentIds ) );
+        }
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+void CCaSrvSession::EntryTouched( TInt aId )
+    {
+    RHashMap<TInt, CCaSrvNotifier*>::TIter iter( iNotifiers );
+    while( iter.NextValue() )
+        {
+        TRAP_IGNORE( ( *iter.CurrentValue() )->EntryTouchedL( aId ) );
+        }
+    }
+
+// ---------------------------------------------------------
+// CCaSrvSession::GroupContentChanged
+// ---------------------------------------------------------
+//
+void CCaSrvSession::GroupContentChanged( const RArray<TInt>& aParentIds )
+    {
+    RHashMap<TInt, CCaSrvNotifier*>::TIter iter( iNotifiers );
+    while( iter.NextValue() )
+        {
+        TRAP_IGNORE( ( *iter.CurrentValue() )->
+                GroupContentChangedL( aParentIds ) );
+        }
+    }
+
+//  End of File