1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/persistentdata/loggingservices/eventlogger/LogServ/src/LOGCHNGE.CPP Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,365 @@
1.4 +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +//
1.18 +
1.19 +#include "LOGCHNGE.H"
1.20 +#include <logwraplimits.h>
1.21 +#include <logcntdef.h>
1.22 +#include "LOGQUERY.H"
1.23 +#include "logservpanic.h"
1.24 +#include "LogServRecentList.h"
1.25 +#include "LogServCacheConfig.h"
1.26 +#include "LogServRecentListManager.h"
1.27 +#include "LogServDatabaseTransactionInterface.h"
1.28 +#include "LogServDatabaseChangeInterface.h"
1.29 +#include "LOGDUP.H"
1.30 +#include "LogServCacheStrings.h"
1.31 +#include "LogServSqlStrings.h"
1.32 +
1.33 +//**********************************
1.34 +// CLogChangeEvent
1.35 +//**********************************
1.36 +
1.37 +CLogChangeEvent::CLogChangeEvent(MLogServDatabaseTransactionInterface& aDatabase, TInt aPriority)
1.38 +: CLogActive(aPriority), iDatabase(aDatabase)
1.39 + {
1.40 + }
1.41 +
1.42 +CLogChangeEvent::~CLogChangeEvent()
1.43 + {
1.44 + Cancel();
1.45 + //
1.46 + delete iEvent;
1.47 + delete iDuplicate;
1.48 + delete iDuplicateFilter;
1.49 + }
1.50 +
1.51 +void CLogChangeEvent::ConstructL()
1.52 + {
1.53 + iEvent = CLogEvent::NewL();
1.54 + iDuplicate = CLogDuplicate::NewL(iDatabase, Priority());
1.55 + iDuplicateFilter = CLogFilter::NewL();
1.56 + }
1.57 +
1.58 +CLogChangeEvent* CLogChangeEvent::NewL(MLogServDatabaseTransactionInterface& aDatabase, TInt aPriority)
1.59 + {
1.60 + CLogChangeEvent* self = new(ELeave)CLogChangeEvent(aDatabase, aPriority);
1.61 + CleanupStack::PushL(self);
1.62 + self->ConstructL();
1.63 + CleanupStack::Pop();
1.64 + return self;
1.65 + }
1.66 +
1.67 +void CLogChangeEvent::StartL(const CLogEvent& aEvent, const CLogServRecentList* aRecentList, TRequestStatus& aStatus, const RMessage2& aMessage)
1.68 + {
1.69 + __ASSERT_ALWAYS(iState == ELogNone, Panic(ELogBadState2));
1.70 + __ASSERT_DEBUG(!IsActive(), Panic(ELogAlreadyActive3));
1.71 +
1.72 + iMessage = &aMessage;
1.73 + iEvent->CopyL(aEvent);
1.74 + iState = ELogChangeEvent;
1.75 + iRecentList = aRecentList; // Need to use this! (5yrs later - okay then :-)
1.76 + iOldRecentList = KLogNullRecentList;
1.77 +
1.78 + Queue(aStatus);
1.79 + TRequestStatus* status = &iStatus;
1.80 + User::RequestComplete(status, KErrNone);
1.81 + SetActive();
1.82 + }
1.83 +
1.84 +void CLogChangeEvent::DoRunL()
1.85 + {
1.86 + __ASSERT_DEBUG(iState != ELogNone, Panic(ELogBadState3));
1.87 +
1.88 + switch (iState)
1.89 + {
1.90 + case ELogChangeEvent:
1.91 + DoChangeEventL();
1.92 + ResetDuplicatesL();
1.93 + UpdateDuplicateEventsL();
1.94 + break;
1.95 + case ELogPurgeRecent:
1.96 + {
1.97 + RArray<TLogId> logIds;
1.98 + ::LogGetRecentEventsLC(iDatabase, iRecentList->Id(), iDatabase.DTICacheConfig().Config().iMaxRecentLogSize, logIds);
1.99 + ::LogPurgeRecentEventsL(iDatabase, logIds);
1.100 + CleanupStack::PopAndDestroy(&logIds);
1.101 + }
1.102 + break;
1.103 + default:
1.104 + __ASSERT_DEBUG(ETrue, Panic(ELogBadState4));
1.105 + break;
1.106 + }
1.107 + }
1.108 +
1.109 +void CLogChangeEvent::DoComplete(TInt& aStatus)
1.110 + {
1.111 + if (iDatabase.DTIInTransaction())
1.112 + {
1.113 + if (aStatus == KErrNone)
1.114 + aStatus = iDatabase.DTICommitAndEnd();
1.115 +
1.116 + if (aStatus < KErrNone)
1.117 + iDatabase.DTIRollBack();
1.118 + }
1.119 +
1.120 + iState = ELogNone;
1.121 + }
1.122 +
1.123 +void CLogChangeEvent::ResetDuplicatesL()
1.124 + {
1.125 + // Was it in a recent list? Is it now changing lists?
1.126 + if (iOldRecentList > 0 && (!iRecentList || iOldRecentList != iRecentList->Id()))
1.127 + {
1.128 + ::LogResetDuplicatesL(iDatabase, iEvent->Id());
1.129 + }
1.130 + }
1.131 +
1.132 +void CLogChangeEvent::UpdateDuplicateEventsL()
1.133 + {
1.134 + // Detect duplicate events if we've added an event to a recent list
1.135 + if (iOldRecentList > 0 && iRecentList && iOldRecentList != iRecentList->Id())
1.136 + {
1.137 + iRecentList->GetFilter(*iEvent, *iDuplicateFilter);
1.138 + // If we get here we have added an event to a recent list, which may need to be purged
1.139 + iState = ELogPurgeRecent;
1.140 + // Passing -1 into this will ensure that events are updated so the most recent duplicate is first
1.141 + if (!iDuplicate->StartL(-1, iRecentList->Id(), *iDuplicateFilter, iStatus))
1.142 + {
1.143 + // Complete ourselves
1.144 + TRequestStatus* status = &iStatus;
1.145 + User::RequestComplete(status, KErrNone);
1.146 + }
1.147 + SetActive();
1.148 + }
1.149 + }
1.150 +
1.151 +void CLogChangeEvent::DoChangeEventL()
1.152 + {
1.153 + RLogEventDbTable tbl;
1.154 + tbl.OpenLC(iDatabase.DTIDatabase());
1.155 + User::LeaveIfError(tbl.SetIndex(KLogNameEventIdx1));
1.156 + if(!tbl.SeekL(TDbSeekKey((TInt)iEvent->Id())))
1.157 + {
1.158 + User::Leave(KErrNotFound);
1.159 + }
1.160 + User::LeaveIfError(iDatabase.DTIBegin());
1.161 + tbl.GetL();
1.162 + iOldRecentList = tbl.ColInt8(RLogEventDbTable::iRecentColNo);
1.163 + DoChangeL(tbl, iDatabase.DTICacheStrings().GetIdL(iEvent->Direction()), iDatabase.DTICacheStrings().GetIdL(iEvent->Status()));
1.164 + CleanupStack::PopAndDestroy();//tbl
1.165 + }
1.166 +
1.167 +void CLogChangeEvent::DoChangeL(RLogEventDbTable& aTbl, TLogStringId aDirectionId, TLogStringId aStatusId)
1.168 + {
1.169 + if(!iDatabase.DTIIsAllowed(EWriteOp, *iMessage, iEvent->EventType()))
1.170 + {
1.171 + User::Leave(KErrPermissionDenied);
1.172 + }
1.173 +
1.174 + aTbl.UpdateL();
1.175 +
1.176 + if (iEvent->RemoteParty().Length() > 0)
1.177 + aTbl.SetColL(RLogEventDbTable::iRemotePartyColNo, iEvent->RemoteParty());
1.178 + else
1.179 + aTbl.SetColNullL(RLogEventDbTable::iRemotePartyColNo);
1.180 +
1.181 + if (iEvent->Direction().Length() > 0)
1.182 + aTbl.SetColL(RLogEventDbTable::iDirectionColNo, (TUint32)aDirectionId);
1.183 + else
1.184 + aTbl.SetColNullL(RLogEventDbTable::iDirectionColNo);
1.185 +
1.186 + aTbl.SetColL(RLogEventDbTable::iTimeColNo, iEvent->Time());
1.187 + aTbl.SetColL(RLogEventDbTable::iDurationTypeColNo, (TInt32)iEvent->DurationType());
1.188 +
1.189 + if (iEvent->DurationType() != KLogNullDurationType)
1.190 + aTbl.SetColL(RLogEventDbTable::iDurationColNo, iEvent->Duration());
1.191 + else
1.192 + aTbl.SetColNullL(RLogEventDbTable::iDurationColNo);
1.193 +
1.194 + if (iEvent->Status().Length() > 0)
1.195 + aTbl.SetColL(RLogEventDbTable::iStatusColNo, (TUint32)aStatusId);
1.196 + else
1.197 + aTbl.SetColNullL(RLogEventDbTable::iStatusColNo);
1.198 +
1.199 + if (iEvent->Subject().Length() > 0)
1.200 + aTbl.SetColL(RLogEventDbTable::iSubjectColNo, iEvent->Subject());
1.201 + else
1.202 + aTbl.SetColNullL(RLogEventDbTable::iSubjectColNo);
1.203 +
1.204 + if (iEvent->Number().Length() > 0)
1.205 + aTbl.SetColL(RLogEventDbTable::iNumberColNo, iEvent->Number());
1.206 + else
1.207 + aTbl.SetColNullL(RLogEventDbTable::iNumberColNo);
1.208 +
1.209 + if (iEvent->Contact() != KLogNullContactId)
1.210 + aTbl.SetColL(RLogEventDbTable::iContactColNo, iEvent->Contact());
1.211 + else
1.212 + aTbl.SetColNullL(RLogEventDbTable::iContactColNo);
1.213 +
1.214 + if (iEvent->Link() != KLogNullLink)
1.215 + aTbl.SetColL(RLogEventDbTable::iLinkColNo, iEvent->Link());
1.216 + else
1.217 + aTbl.SetColNullL(RLogEventDbTable::iLinkColNo);
1.218 +
1.219 + if (iEvent->Data().Length() > 0)
1.220 + aTbl.SetColL(RLogEventDbTable::iDataColNo, iEvent->Data());
1.221 + else
1.222 + aTbl.SetColNullL(RLogEventDbTable::iDataColNo);
1.223 +
1.224 + // Set the flags
1.225 + TInt bit = KLogFlagsCount;
1.226 + while(bit--)
1.227 + {
1.228 + aTbl.SetColL(RLogEventDbTable::iFlagColNo[bit], (TUint32)((iEvent->Flags() & 0x1 << bit) ? 1 : 0));
1.229 + }
1.230 +
1.231 + // Set the recent list
1.232 + if (iOldRecentList > 0)
1.233 + {
1.234 + // Removing an event from all recent lists?
1.235 + if (!iRecentList)
1.236 + {
1.237 + aTbl.SetColNullL(RLogEventDbTable::iRecentColNo);
1.238 + aTbl.SetColNullL(RLogEventDbTable::iDuplicateColNo);
1.239 + }
1.240 + // Changing list?
1.241 + else if (iOldRecentList != iRecentList->Id())
1.242 + {
1.243 + __ASSERT_DEBUG(iRecentList->Id() != KLogNullRecentList, Panic(ELogNullRecentList));
1.244 + aTbl.SetColL(RLogEventDbTable::iRecentColNo, (TInt32)iRecentList->Id());
1.245 +
1.246 + // This is set to -1 to prevent it temporarily appearing in a recent or duplicate view
1.247 + // It gets updated properly later when detecting duplicates
1.248 + aTbl.SetColL(RLogEventDbTable::iDuplicateColNo, -1);
1.249 + }
1.250 + }
1.251 +
1.252 +#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
1.253 + if(iEvent->SimId() != KLogNullSimId)
1.254 + aTbl.SetColL(RLogEventDbTable::iSimIdColNo, iEvent->SimId());
1.255 + else
1.256 + aTbl.SetColNullL(RLogEventDbTable::iSimIdColNo);
1.257 +#endif
1.258 +
1.259 + aTbl.PutL();
1.260 +
1.261 + iDatabase.DTIChangeInterface().DCISubmitChangedEventContextL(ELogChangeTypeEventChanged, iEvent->Id());
1.262 + }
1.263 +
1.264 +//**********************************
1.265 +// CLogChangeConfig
1.266 +//**********************************
1.267 +
1.268 +CLogChangeConfig::CLogChangeConfig(MLogServDatabaseTransactionInterface& aDatabase, const CLogServRecentListManager& aRecentSetup, TInt aPriority)
1.269 +: CLogActive(aPriority), iDatabase(aDatabase), iRecentSetup(aRecentSetup)
1.270 + {
1.271 + }
1.272 +
1.273 +CLogChangeConfig::~CLogChangeConfig()
1.274 + {
1.275 + Cancel();
1.276 + }
1.277 +
1.278 +CLogChangeConfig* CLogChangeConfig::NewL(MLogServDatabaseTransactionInterface& aDatabase, const CLogServRecentListManager& aRecentSetup, TInt aPriority)
1.279 + {
1.280 + CLogChangeConfig* self = new(ELeave) CLogChangeConfig(aDatabase, aRecentSetup, aPriority);
1.281 + return self;
1.282 + }
1.283 +
1.284 +void CLogChangeConfig::StartL(const TLogConfig& aConfig, TRequestStatus& aStatus)
1.285 + {
1.286 + __ASSERT_ALWAYS(iState == ELogNone, Panic(ELogBadState5));
1.287 + __ASSERT_DEBUG(!IsActive(), Panic(ELogAlreadyActive4));
1.288 +
1.289 + iState = ELogChange;
1.290 + iConfig = &aConfig;
1.291 +
1.292 + Queue(aStatus);
1.293 + TRequestStatus* status = &iStatus;
1.294 + User::RequestComplete(status, KErrNone);
1.295 + SetActive();
1.296 + }
1.297 +
1.298 +void CLogChangeConfig::DoRunL()
1.299 + {
1.300 + switch (iState)
1.301 + {
1.302 + case ELogChange:
1.303 + {
1.304 + // Start a transaction
1.305 + User::LeaveIfError(iDatabase.DTIBegin());
1.306 + // Change the config, using the existing transaction
1.307 + iDatabase.DTICacheConfig().UpdateL(*iConfig);
1.308 + //Purge old events
1.309 + RLogEventDbTable tbl;
1.310 + tbl.OpenLC(iDatabase.DTIDatabase());
1.311 + ::LogPurgeMainL(iDatabase, tbl, iConfig->iMaxLogSize, 0);
1.312 + CleanupStack::PopAndDestroy(&tbl);
1.313 + iRecent = 0;
1.314 + //
1.315 + iState = ELogPurgeRecent;
1.316 + TRequestStatus* status = &iStatus;
1.317 + User::RequestComplete(status, KErrNone);
1.318 + SetActive();
1.319 + break;
1.320 + }
1.321 + case ELogPurgeRecent:
1.322 + {
1.323 + // Are there any more recent lists to check
1.324 + if(iRecent >= iRecentSetup.Count())
1.325 + {
1.326 + break;
1.327 + }
1.328 + RArray<TLogId> logIds;
1.329 + ::LogGetRecentEventsLC(iDatabase, iRecentSetup.List(iRecent).Id(), iConfig->iMaxRecentLogSize, logIds);
1.330 + ::LogPurgeRecentEventsL(iDatabase, logIds);
1.331 + CleanupStack::PopAndDestroy(&logIds);
1.332 + // Purge next recent list?
1.333 + if (++iRecent < iRecentSetup.Count())
1.334 + {
1.335 + iState = ELogPurgeRecent;
1.336 + TRequestStatus* status = &iStatus;
1.337 + User::RequestComplete(status, KErrNone);
1.338 + SetActive();
1.339 + }
1.340 + break;
1.341 + }
1.342 + default:
1.343 + __ASSERT_DEBUG(ETrue, Panic(ELogBadState6));
1.344 + break;
1.345 + }
1.346 + }
1.347 +
1.348 +void CLogChangeConfig::DoComplete(TInt& aStatus)
1.349 + {
1.350 + // Try and commit the transaction
1.351 + if (iDatabase.DTIInTransaction())
1.352 + {
1.353 + if (aStatus == KErrNone)
1.354 + aStatus = iDatabase.DTICommitAndEnd();
1.355 +
1.356 + if (aStatus < KErrNone)
1.357 + {
1.358 + iDatabase.DTICacheConfig().Rollback();
1.359 + iDatabase.DTIRollBack();
1.360 + }
1.361 + else
1.362 + {
1.363 + iDatabase.DTICacheConfig().Commit();
1.364 + }
1.365 + }
1.366 + __ASSERT_DEBUG(!iDatabase.DTICacheConfig().InTransaction(), Panic(ELogChangeConfigLogicError));
1.367 + iState = ELogNone;
1.368 + }