os/persistentdata/loggingservices/eventlogger/LogServ/src/LogServDatabaseChangeTracker.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include "LogServDatabaseChangeTracker.h"
sl@0
    17
#include "LogChangeDefinition.h"
sl@0
    18
#include "LogServDatabaseTransactionInterface.h"
sl@0
    19
#include "logservpanic.h"
sl@0
    20
#include "LogServBackupInterface.h"
sl@0
    21
sl@0
    22
// Constants
sl@0
    23
const TInt KLogArrayGranularityObservers = 3;
sl@0
    24
const TInt KLogArrayGranularityGlobalChanges = 2;
sl@0
    25
sl@0
    26
#define UNUSED_VAR(a) a = a
sl@0
    27
sl@0
    28
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
    29
// -----> CLogServDatabaseChangeTracker (source)
sl@0
    30
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
    31
sl@0
    32
CLogServDatabaseChangeTracker::CLogServDatabaseChangeTracker(MLogServDatabaseTransactionInterface& aDatabase, MLogServBackupInterface& aBackupInterface, TInt aPriority)
sl@0
    33
:	CActive(aPriority), iDatabase(aDatabase), iBackupInterface(aBackupInterface), iObservers(KLogArrayGranularityObservers), iGlobalChanges(KLogArrayGranularityGlobalChanges)
sl@0
    34
	{
sl@0
    35
	CActiveScheduler::Add(this);
sl@0
    36
	}
sl@0
    37
sl@0
    38
CLogServDatabaseChangeTracker::~CLogServDatabaseChangeTracker()
sl@0
    39
	{
sl@0
    40
	Cancel();
sl@0
    41
	//
sl@0
    42
	iBackupInterface.BIObserverRemove(*this);
sl@0
    43
	iNotifier.Close();
sl@0
    44
	iObservers.Close();
sl@0
    45
	iGlobalChanges.Close();
sl@0
    46
	//
sl@0
    47
	delete iIdler;
sl@0
    48
	delete iChanges;
sl@0
    49
	}
sl@0
    50
sl@0
    51
void CLogServDatabaseChangeTracker::ConstructL()
sl@0
    52
	{
sl@0
    53
	iBackupInterface.BIObserverAddL(*this, MLogServBackupInterface::EObjectChangeTracker);
sl@0
    54
	iChanges = CLogChangeDefinition::NewL();
sl@0
    55
	//
sl@0
    56
	const TInt error = iNotifier.Open(iDatabase.DTIDatabase());
sl@0
    57
	User::LeaveIfError(error);
sl@0
    58
	//
sl@0
    59
	Request();
sl@0
    60
	//
sl@0
    61
	iIdler = CIdle::NewL(CActive::EPriorityIdle);
sl@0
    62
	}
sl@0
    63
sl@0
    64
CLogServDatabaseChangeTracker* CLogServDatabaseChangeTracker::NewL(MLogServDatabaseTransactionInterface& aDatabase, MLogServBackupInterface& aBackupInterface, TInt aPriority)
sl@0
    65
	{
sl@0
    66
	CLogServDatabaseChangeTracker* self = new(ELeave) CLogServDatabaseChangeTracker(aDatabase, aBackupInterface, aPriority);
sl@0
    67
	CleanupStack::PushL(self);
sl@0
    68
	self->ConstructL();
sl@0
    69
	CleanupStack::Pop(self);
sl@0
    70
	return self;
sl@0
    71
	}
sl@0
    72
sl@0
    73
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
    74
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
    75
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
    76
sl@0
    77
void CLogServDatabaseChangeTracker::DCISubmitChangedEventContextL(TLogDatabaseChangeType aType, TLogId aEventId)
sl@0
    78
	{
sl@0
    79
	__ASSERT_DEBUG(aType != ELogChangeTypeUndefined, Panic(ELogUnrecognizedChangeType2));
sl@0
    80
	iChanges->AddL(aEventId, aType, KErrGeneral);
sl@0
    81
	}
sl@0
    82
sl@0
    83
void CLogServDatabaseChangeTracker::DCISubmitGlobalChangeContextL(TUid aChangeType, TInt aContextParam1, TInt aContextParam2, TInt aContextParam3)
sl@0
    84
	{
sl@0
    85
	const TLogServDatabaseChangeDefinition item(aChangeType, aContextParam1, aContextParam2, aContextParam3);
sl@0
    86
	User::LeaveIfError(iGlobalChanges.Append(item));
sl@0
    87
	//
sl@0
    88
	iIdler->Cancel();
sl@0
    89
	iIdler->Start(TCallBack(IdleNotifyGlobalChangeEvents, this));
sl@0
    90
	}
sl@0
    91
sl@0
    92
void CLogServDatabaseChangeTracker::DCIRequestChangeNotificationsL(MLogServDatabaseChangeObserver& aObserver)
sl@0
    93
	{
sl@0
    94
	const TInt error = iObservers.InsertInAddressOrder(&aObserver);
sl@0
    95
	User::LeaveIfError(error);
sl@0
    96
	}
sl@0
    97
sl@0
    98
void CLogServDatabaseChangeTracker::DCIRequestChangeNotificationsCancel(MLogServDatabaseChangeObserver& aObserver)
sl@0
    99
	{
sl@0
   100
	const TInt error = iObservers.FindInAddressOrder(&aObserver);
sl@0
   101
	if	(error >= KErrNone)
sl@0
   102
		iObservers.Remove(error);
sl@0
   103
	}
sl@0
   104
sl@0
   105
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
   106
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
   107
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
   108
sl@0
   109
void CLogServDatabaseChangeTracker::BOHandleEventL(TLogServBackupEvent aEvent)
sl@0
   110
	{
sl@0
   111
	switch(aEvent)
sl@0
   112
		{
sl@0
   113
	case EBackupStarting:
sl@0
   114
		{
sl@0
   115
		Cancel();
sl@0
   116
		iNotifier.Close();
sl@0
   117
		break;
sl@0
   118
		}
sl@0
   119
	case EBackupEnded:
sl@0
   120
		{
sl@0
   121
		const TInt error = iNotifier.Open(iDatabase.DTIDatabase());
sl@0
   122
		User::LeaveIfError(error);
sl@0
   123
		Request();
sl@0
   124
		break;
sl@0
   125
		}
sl@0
   126
	default:
sl@0
   127
		__ASSERT_DEBUG(EFalse, User::Invariant());
sl@0
   128
		break;
sl@0
   129
		}
sl@0
   130
	}
sl@0
   131
sl@0
   132
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
   133
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
   134
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
   135
sl@0
   136
void CLogServDatabaseChangeTracker::RunL()
sl@0
   137
	{
sl@0
   138
	// We are only interested if a commit has occurred
sl@0
   139
	const TInt completionCode = iStatus.Int();
sl@0
   140
	if	(completionCode == RDbNotifier::ECommit)
sl@0
   141
		{
sl@0
   142
		LOGTEXT("CLogServDatabaseChangeTracker::RunL() - database commit");
sl@0
   143
sl@0
   144
		// Notify all observers
sl@0
   145
		NotifyObserversL();
sl@0
   146
sl@0
   147
		// Reset changes
sl@0
   148
		iChanges->Reset();
sl@0
   149
		}
sl@0
   150
	Request();
sl@0
   151
	}
sl@0
   152
sl@0
   153
void CLogServDatabaseChangeTracker::DoCancel()
sl@0
   154
	{
sl@0
   155
	iNotifier.Cancel();
sl@0
   156
	}
sl@0
   157
sl@0
   158
TInt CLogServDatabaseChangeTracker::RunError(TInt /*aError*/)
sl@0
   159
	{
sl@0
   160
	// Ignore errors such as leaves from notifying observers
sl@0
   161
	Request();
sl@0
   162
	return KErrNone;
sl@0
   163
	}
sl@0
   164
sl@0
   165
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
   166
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
   167
/////////////////////////////////////////////////////////////////////////////////////////
sl@0
   168
sl@0
   169
void CLogServDatabaseChangeTracker::Request()
sl@0
   170
	{
sl@0
   171
	iNotifier.NotifyChange(iStatus);
sl@0
   172
	SetActive();
sl@0
   173
	}
sl@0
   174
sl@0
   175
void CLogServDatabaseChangeTracker::NotifyObserversL()
sl@0
   176
	{
sl@0
   177
	LOGTEXT("CLogServDatabaseChangeTracker::NotifyObserversL()");
sl@0
   178
	//
sl@0
   179
	const TInt count = iObservers.Count();
sl@0
   180
	for(TInt i=0; i<count; i++)
sl@0
   181
		{
sl@0
   182
		MLogServDatabaseChangeObserver* observer = iObservers[i];
sl@0
   183
		observer->DCOHandleChangeEventsL(*iChanges);
sl@0
   184
		}
sl@0
   185
sl@0
   186
	// Reduce memory usage
sl@0
   187
	iChanges->Reset();
sl@0
   188
	//
sl@0
   189
	LOGTEXT("CLogServDatabaseChangeTracker::NotifyObserversL() - end");
sl@0
   190
	}
sl@0
   191
sl@0
   192
void CLogServDatabaseChangeTracker::NotifyGlobalChangeEventsL()
sl@0
   193
	{
sl@0
   194
	LOGTEXT("CLogServDatabaseChangeTracker::NotifyGlobalChangeEventsL()");
sl@0
   195
	//
sl@0
   196
	const TInt count = iGlobalChanges.Count();
sl@0
   197
	for(TInt i=0; i<count; i++)
sl@0
   198
		{
sl@0
   199
		const TLogServDatabaseChangeDefinition& change = iGlobalChanges[i];
sl@0
   200
		//
sl@0
   201
		const TInt observerCount = iObservers.Count();
sl@0
   202
		for(TInt j=0; j<observerCount; j++)
sl@0
   203
			{
sl@0
   204
			MLogServDatabaseChangeObserver* observer = iObservers[j];
sl@0
   205
			observer->DCOHandleGlobalChangeEventL(change);
sl@0
   206
			}
sl@0
   207
		}
sl@0
   208
sl@0
   209
	// Reduce memory usage
sl@0
   210
	iGlobalChanges.Reset();
sl@0
   211
	iGlobalChanges.GranularCompress();
sl@0
   212
	//
sl@0
   213
	LOGTEXT("CLogServDatabaseChangeTracker::NotifyGlobalChangeEventsL() - end");
sl@0
   214
	}
sl@0
   215
sl@0
   216
TBool CLogServDatabaseChangeTracker::IdleNotifyGlobalChangeEvents(TAny* aSelf)
sl@0
   217
	{
sl@0
   218
	CLogServDatabaseChangeTracker* self = reinterpret_cast<CLogServDatabaseChangeTracker*>(aSelf);
sl@0
   219
	TRAPD(err, self->NotifyGlobalChangeEventsL());
sl@0
   220
    UNUSED_VAR(err);
sl@0
   221
	return EFalse;
sl@0
   222
	}