uifw/AknGlobalUI/AknDynamicSoftNote/eventmanagersrc/akndynamicsoftnoteeventmanager.cpp
--- /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