phonebookengines/contactsmodel/tsrc/CContactViewEventQueue.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/CContactViewEventQueue.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,141 @@
+// Copyright (c) 2001-2009 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:
+//
+
+
+// INCLUDES
+#include "CContactViewEventQueue.h"
+
+namespace {
+
+// LOCAL CONSTANTS
+enum TPanicCode
+    {
+    EPanicPreCond_HandleContactViewEvent = 1,
+    EPanicEventQueueFull
+    };
+
+// LOCAL FUNCTIONS
+void Panic(TPanicCode aReason)
+    {
+    _LIT(KPanicText, "CContactViewEventQueue");
+    User::Panic(KPanicText,aReason);
+    }
+
+void ResetEvent(TContactViewEvent& aEvent)
+    {
+    aEvent.iEventType = TContactViewEvent::TEventType(-1);
+    aEvent.iInt = -1;
+    aEvent.iContactId = KNullContactId;
+    }
+
+}
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+CContactViewEventQueue* CContactViewEventQueue::NewL
+        (CContactViewBase* aView, TInt aMaxQueueSize)
+    {
+    CContactViewEventQueue* self = new(ELeave) CContactViewEventQueue;
+    CleanupStack::PushL(self);
+    self->ConstructL(aView,aMaxQueueSize);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CContactViewEventQueue::~CContactViewEventQueue()
+	{
+	CTimer::Cancel();
+	if (iView)
+		{
+		iView->Close(*this);
+		}
+	}
+
+TBool CContactViewEventQueue::ListenForEvent(TTimeIntervalSeconds aTimeOut, TContactViewEvent& aEvent)
+	{
+	ResetEvent(aEvent);
+	CTimer::Cancel();
+
+	if (iQueue.IsEmpty())
+		{
+		CTimer::After(aTimeOut.Int() * 1000000);
+		// wait for event or for the timer to expire
+		CActiveScheduler::Start();
+		}
+
+	if (!iQueue.IsEmpty())
+		{
+		aEvent = iQueue.Head();
+		iQueue.PopHead();
+		return ETrue;
+		}
+	else
+		{
+		return EFalse;
+		}
+	}
+
+void CContactViewEventQueue::RunL()
+    {
+    // Timer expired
+    CActiveScheduler::Stop();
+    }
+
+void CContactViewEventQueue::HandleContactViewEvent
+        (const CContactViewBase& aView, const TContactViewEvent& aEvent)
+    {
+    __ASSERT_ALWAYS(!iView || iView == &aView, Panic(EPanicPreCond_HandleContactViewEvent));
+
+	TBool eventPushed = iQueue.Push(aEvent);
+    __ASSERT_ALWAYS(eventPushed,Panic(EPanicEventQueueFull));
+
+    // If we receive item removed event, it is a signal for the this
+    // view observer to stop observing.
+    // The observer could have been for example a memory entry representation 
+    // and the memory entry has now been deleted -> the observer must close and exit.
+	if(iCloseOnItemRemoved && (aEvent.iEventType == TContactViewEvent::EItemRemoved))
+        {
+        iView->Close(*this);
+        }
+
+    if (IsActive())
+    	{
+    	CTimer::Cancel();
+	    CActiveScheduler::Stop();
+    	}
+    }
+
+CContactViewEventQueue::CContactViewEventQueue()
+    : CTimer(CActive::EPriorityStandard)
+    {
+    }
+
+void CContactViewEventQueue::ConstructL
+        (CContactViewBase* aView, TInt aMaxQueueSize)
+    {
+	iCloseOnItemRemoved = EFalse;
+    CTimer::ConstructL();
+    iQueue.ConstructL(aMaxQueueSize);
+    CActiveScheduler::Add(this);
+    if (aView)
+        {
+        aView->OpenL(*this);
+        iView = aView;
+        }
+    }
+
+
+// End of File