uifw/AknGlobalUI/AknDynamicSoftNote/eventmanagersrc/akndynamicsoftnoteeventmanager.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AknGlobalUI/AknDynamicSoftNote/eventmanagersrc/akndynamicsoftnoteeventmanager.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,321 @@
+/*
+* 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:  Handles dynamic soft notification events.
+*
+*/
+
+#include "akndynamicsoftnoteeventmanager.h"
+
+/// Observer array granularity
+const TInt KAknEventManagerGranularity = 3;
+
+/// Non-delivered event array reserved extra space.
+const TInt KAknEventManagerExtraSpace = 5;
+
+// ---------------------------------------------------------------------------
+// CAknDynamicSoftNoteEventManager::CreateUniqueInstanceL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknDynamicSoftNoteEventManager* CAknDynamicSoftNoteEventManager::CreateUniqueInstanceL()
+    {
+    if (Dll::Tls())
+        {
+        User::Panic(KAknPanicCategory, EAknEventMgrPanicEventManagerAlreadyExists);                
+        }        
+        
+    CAknDynamicSoftNoteEventManager* self = new(ELeave) CAknDynamicSoftNoteEventManager;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    
+    Dll::SetTls(self);
+    
+    return self;
+    }
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNoteEventManager::CAknDynamicSoftNoteEventManager
+//-----------------------------------------------------------------------------
+//
+CAknDynamicSoftNoteEventManager::CAknDynamicSoftNoteEventManager()
+    : iObservers(KAknEventManagerGranularity),
+      iNonDeliveredEvents(KAknEventManagerGranularity)
+    {
+    }
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNoteEventManager::ConstructL
+//-----------------------------------------------------------------------------
+//
+void CAknDynamicSoftNoteEventManager::ConstructL()
+    {
+    iNonDeliveredEvents.ReserveL(KAknEventManagerExtraSpace);
+    }
+  
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNoteEventManager::~CAknDynamicSoftNoteEventManager
+//-----------------------------------------------------------------------------
+//    
+CAknDynamicSoftNoteEventManager::~CAknDynamicSoftNoteEventManager()
+    {
+    for (TInt i = iObservers.Count() - 1; i >= 0; i--)
+        {
+        if (!iObservers[i].iMessage.IsNull())
+            {
+            iObservers[i].iMessage.Complete(KErrCancel);
+            }
+        }
+    iObservers.Close();
+    iNonDeliveredEvents.Close();
+    
+    Dll::SetTls(NULL);
+    }
+    
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNoteEventManager::UniqueInstance
+//-----------------------------------------------------------------------------
+//    
+EXPORT_C CAknDynamicSoftNoteEventManager* CAknDynamicSoftNoteEventManager::UniqueInstance()
+    {
+    if (Dll::Tls())
+        {        
+        CAknDynamicSoftNoteEventManager* eventManager = 
+            static_cast<CAknDynamicSoftNoteEventManager*>(Dll::Tls());
+            
+        return eventManager;
+        }
+    else
+        {
+        return NULL;
+        }        
+    }    
+  
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNoteEventManager::ClientExit
+//-----------------------------------------------------------------------------
+//    
+EXPORT_C void CAknDynamicSoftNoteEventManager::ClientExit(TAny* aClient)
+    {
+    const TInt count = iObservers.Count();       
+    for (TInt i = 0; i < count; i++)
+        {
+        if (iObservers[i].iClient == aClient)
+            {
+            if (!iObservers[i].iMessage.IsNull())
+                {
+                iObservers[i].iMessage.Complete(KErrCancel);                    
+                }
+            iObservers.Remove(i);
+            break;       
+            }
+        }
+    }
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNoteEventManager::RegisterEventL
+//-----------------------------------------------------------------------------
+//    
+EXPORT_C void CAknDynamicSoftNoteEventManager::RegisterEventL(TAny* aClient, 
+    const RMessage2& aMessage)
+    {
+    TInt pos = FindByClientFromObservers(aClient);
+    if (pos != KErrNotFound)
+        {
+        aMessage.Panic(KAknPanicCategory, EAknEventMgrPanicAlreadyRegistered);
+        return;        
+        }
+    
+    TInt reserveCount = Max(
+        iNonDeliveredEvents.Count(), 
+        iObservers.Count() + KAknEventManagerExtraSpace);
+    
+    iNonDeliveredEvents.ReserveL(reserveCount);
+    
+    TObserverItem item;
+    item.iClient = aClient;
+    item.iNoteId = aMessage.Int0();
+    
+    iObservers.AppendL(item);
+    aMessage.Complete(KErrNone);
+    }
+  
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNoteEventManager::NotifyEvent
+//-----------------------------------------------------------------------------
+//    
+EXPORT_C void CAknDynamicSoftNoteEventManager::NotifyEvent(TAny* aClient, 
+    const RMessage2& aMessage)
+    {
+    TInt pos = FindByClientFromObservers(aClient);
+    if (pos == KErrNotFound)
+        {
+        aMessage.Panic(KAknPanicCategory, EAknEventMgrPanicNotRegistered);
+        return;
+        }
+
+    const TObserverItem& item = iObservers[pos];      
+    if (!iObservers[pos].iMessage.IsNull())
+        {
+        aMessage.Panic(KAknPanicCategory, EAknEventMgrPanicDuplicateNotify);
+        return;
+        }
+    
+    TInt nonDeliveredPos = FindByNoteIdFromNonDeliveredEvents(item.iNoteId);
+    
+    if (nonDeliveredPos != KErrNotFound)
+        {
+        TPckgBuf<TInt> actionId(iNonDeliveredEvents[nonDeliveredPos].iActionId);
+        if (aMessage.Write(0, actionId) != KErrNone)
+            {
+            aMessage.Panic(KAknPanicCategory, EAknEventMgrPanicBadMessage);
+            return;
+            }
+        aMessage.Complete(KErrNone);
+        iNonDeliveredEvents.Remove(nonDeliveredPos);
+        }
+    
+    if (!aMessage.IsNull())
+        {
+        iObservers[pos].iMessage = aMessage;
+        }
+    }
+  
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNoteEventManager::CancelEvent
+//-----------------------------------------------------------------------------
+//    
+EXPORT_C void CAknDynamicSoftNoteEventManager::CancelEvent(TAny* aClient, 
+    const RMessage2& aMessage)
+    {
+    TInt pos = FindByClientFromObservers(aClient);
+   
+    if (pos != KErrNotFound)
+        {
+        if (!iObservers[pos].iMessage.IsNull())
+            {
+            iObservers[pos].iMessage.Complete(KErrCancel);
+            }
+        }
+        
+    aMessage.Complete(KErrNone);
+    }
+  
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNoteEventManager::IssueEvent
+//-----------------------------------------------------------------------------
+//    
+EXPORT_C void CAknDynamicSoftNoteEventManager::IssueEvent(TInt aNoteId, 
+    TInt aActionId, TBool aMustDeliver)
+    {
+    TInt pos = FindByNoteIdFromObservers(aNoteId);    
+    TBool completed = EFalse;
+    
+    if (pos != KErrNotFound)
+        {
+        if (!iObservers[pos].iMessage.IsNull())
+            {
+            completed = ETrue;
+            TPckgBuf<TInt> actionId(aActionId);
+            if (iObservers[pos].iMessage.Write(0, actionId) != KErrNone)
+                {
+                iObservers[pos].iMessage.Panic(
+                    KAknPanicCategory, EAknEventMgrPanicBadMessage);
+                return;
+                }
+            iObservers[pos].iMessage.Complete(KErrNone);            
+            }
+        }
+   
+    if (!completed)
+        {
+        TInt nonDeliveredPos = FindByNoteIdFromNonDeliveredEvents(aNoteId);
+        
+        if (nonDeliveredPos != KErrNotFound)
+            {
+            iNonDeliveredEvents[nonDeliveredPos].iActionId = aActionId;
+            }
+        else if (aMustDeliver)
+            {
+            TNonDeliveredEvent event;
+            event.iNoteId = aNoteId;
+            event.iActionId = aActionId;
+            iNonDeliveredEvents.Append(event);
+            }
+        }
+    }
+  
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNoteEventManager::FindByNoteIdFromObservers
+//-----------------------------------------------------------------------------
+//    
+TInt CAknDynamicSoftNoteEventManager::FindByNoteIdFromObservers(TInt aNoteId) const
+    {
+    TInt result = KErrNotFound;
+    
+    const TInt count = iObservers.Count();
+    for (TInt i = 0; i < count; i++)
+        {
+        if (iObservers[i].iNoteId == aNoteId)
+            {
+            result = i;
+            break;
+            }
+        }
+
+    return result;        
+    }
+  
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNoteEventManager::FindByClientFromObservers
+//-----------------------------------------------------------------------------
+//    
+TInt CAknDynamicSoftNoteEventManager::FindByClientFromObservers(TAny* aClient) const
+    {
+    TInt result = KErrNotFound;
+    
+    const TInt count = iObservers.Count();
+    for (TInt i = 0; i < count; i++)
+        {
+        if (iObservers[i].iClient == aClient)
+            {
+            result = i;
+            break;
+            }
+        }
+
+    return result;        
+    }    
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNoteEventManager::FindByNoteIdFromNonDeliveredEvents
+//-----------------------------------------------------------------------------
+//
+TInt CAknDynamicSoftNoteEventManager::FindByNoteIdFromNonDeliveredEvents(TInt aNoteId) const
+    {
+    TInt result = KErrNotFound;
+    
+    const TInt count = iNonDeliveredEvents.Count();
+    for (TInt i = 0; i < count; i++)
+        {
+        if (iNonDeliveredEvents[i].iNoteId == aNoteId)
+            {
+            result = i;
+            break;
+            }
+        }
+
+    return result;    
+    }
+
+// End of file