diff -r 000000000000 -r 08ec8eefde2f loggingservices/eventlogger/LogServ/src/LogNotify.cpp --- /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"); + }