loggingservices/eventlogger/LogServ/src/LogNotify.cpp
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loggingservices/eventlogger/LogServ/src/LogNotify.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,222 @@
+// Copyright (c) 2002-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:
+//
+
+#include "LogNotify.h"
+#include "logservpanic.h"
+#include "LogServBackupInterface.h"
+#include "LogServDatabaseChangeInterface.h"
+
+
+CLogNotify::CLogNotify(MLogServBackupInterface& aBackupInterface, MLogServDatabaseChangeInterface& aChangeInterface, TInt aPriority)
+:	CTimer(aPriority), iBackupInterface(aBackupInterface), iChangeInterface(aChangeInterface), iCompleteClientMessage(ETrue)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CLogNotify::~CLogNotify()
+	{
+	LOGTEXT("CLogNotify::~CLogNotify()");
+
+	// This will only complete the client-side request if its not already
+	// been completed
+	Cancel();
+	//
+	iChangeInterface.DCIRequestChangeNotificationsCancel(*this);
+	iBackupInterface.BIObserverRemove(*this);
+
+	LOGTEXT("CLogNotify::~CLogNotify() - end");
+	}
+
+void CLogNotify::ConstructL()
+	{
+	LOGTEXT("CLogNotify::ConstructL()");
+
+	CTimer::ConstructL();
+
+	// Register for change events
+	iChangeInterface.DCIRequestChangeNotificationsL(*this);
+
+	// Register for backup events
+	iBackupInterface.BIObserverAddL(*this, MLogServBackupInterface::EObjectClientChangeNotifications);
+
+	LOGTEXT("CLogNotify::ConstructL() - end");
+	}
+
+CLogNotify* CLogNotify::NewL(MLogServBackupInterface& aBackupInterface, MLogServDatabaseChangeInterface& aChangeInterface, TInt aPriority)
+	{
+	CLogNotify* self = new(ELeave)CLogNotify(aBackupInterface, aChangeInterface, aPriority);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(); // self
+	return self;
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void CLogNotify::DCOHandleChangeEventsL(const CLogChangeDefinition& /*aChanges*/)
+//
+//	Handle changes within the log database
+//
+	{
+	LOGTEXT2("CLogNotify::DCOHandleChangeEventsL() - client thread is: %S", &iClientThreadName);
+
+	// Increment number of changes but only notify the client side request
+	// if the delay timer isn't running.
+	++iCommit;
+	//
+	if	(!IsActive())
+		CheckForChanges();
+
+	LOGTEXT("CLogNotify::DCOHandleChangeEventsL() - end");
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void CLogNotify::BOHandleEventL(TLogServBackupEvent aEvent)
+	{
+	switch(aEvent)
+		{
+	case EBackupStarting:
+		LOGTEXT("CLogNotify::BOHandleEventL(EBackupStarting)");
+
+		// A rather inelegant fix but gets rid of one whole class
+		iCompleteClientMessage = EFalse;
+		Cancel();
+		iCompleteClientMessage = ETrue;
+		break;
+
+	case EBackupEnded:
+		LOGTEXT("CLogNotify::BOHandleEventL(EBackupEnded)");
+		// Simulate a change
+		++iCommit;
+		if	(!IsActive())
+			CheckForChanges();
+		break;
+		}
+
+	LOGTEXT("CLogNotify::BOHandleEventL() - end");
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void CLogNotify::Notify(TTimeIntervalMicroSeconds32 aDelay, const RMessage2& aMessage)
+
+	{
+#ifdef LOGGING_ENABLED
+	RThread t;
+	aMessage.Client(t);
+	iClientThreadName = t.Name();
+	t.Close();
+	LOGTEXT3("CLogNotify::Notify(%d, %S)", aDelay.Int(), &iClientThreadName);
+#endif
+
+	__ASSERT_DEBUG(!IsActive(), Panic(ELogAlreadyActive18));
+	Cancel();
+
+	// Reset our change counter
+	if (iLastCommit == 0)
+		iLastCommit = iCommit;
+
+	// Save a message pointer to client request status
+	iMessagePtr = aMessage;
+
+	// Wait until the delay has passed before notifying clients of changes
+	After(aDelay);
+
+	LOGTEXT("CLogNotify::Notify() - end");
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void CLogNotify::Cancel()
+	{
+	LOGTEXT2("CLogNotify::Cancel() - client thread is: %S", &iClientThreadName);
+
+	CActive::Cancel();
+
+	// Reset
+	iLastCommit = 0;
+
+	// Complete the client-side observer
+	if	(iCompleteClientMessage)
+		CompleteClientRequest(KErrCancel);
+
+	LOGTEXT("CLogNotify::Cancel() - end");
+	}
+
+void CLogNotify::RunL()
+//
+//	RunL is called if the timer has expired
+//
+	{
+	LOGTEXT3("CLogNotify::RunL(%d) - client thread is: %S", iStatus.Int(), &iClientThreadName);
+
+	CheckForChanges();
+
+	LOGTEXT("CLogNotify::RunL() - end");
+	}
+
+void CLogNotify::DoCancel()
+	{
+	LOGTEXT2("CLogNotify::DoCancel() - client thread is: %S", &iClientThreadName);
+
+	// This is what really cancel's us
+	CTimer::DoCancel();
+
+	LOGTEXT("CLogNotify::DoCancel() - end");
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void CLogNotify::CheckForChanges()
+	{
+	LOGTEXT4("CLogNotify::CheckForChanges() - iLastCommit = %d, iCommit = %d, client thread name: %S", iLastCommit, iCommit, &iClientThreadName);
+
+	if	(iLastCommit != iCommit)
+		{
+		LOGTEXT("CLogNotify::CheckForChanges() - changes detected, attempting to notify client");
+		iLastCommit = iCommit;
+		CompleteClientRequest(RDbNotifier::ECommit);
+		}
+
+	LOGTEXT("CLogNotify::CheckForChanges() - end");
+	}
+
+void CLogNotify::CompleteClientRequest(TInt aCompletionCode)
+	{
+	LOGTEXT3("CLogNotify::CompleteClientRequest() - aCompletionCode = %d, thread: %S", aCompletionCode, &iClientThreadName);
+
+	if	(!iMessagePtr.IsNull())
+		{
+		LOGTEXT2("CLogNotify::CompleteClientRequest() - completing outstanding client request status for thread: %S", &iClientThreadName);
+		iMessagePtr.Complete(aCompletionCode);
+		}
+	else
+		{
+		LOGTEXT2("CLogNotify::CompleteClientRequest() - thread %S doesn't have an outstanding notification request", &iClientThreadName);
+		}
+
+	LOGTEXT("CLogNotify::CompleteClientRequest() - end");
+	}