sl@0: // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include sl@0: #include "LogServDatabaseDriver.h" sl@0: #include "LOGMAIN.H" sl@0: #include "LOGADD.H" sl@0: #include "LOGCHNGE.H" sl@0: #include "LOGGET.H" sl@0: #include "LOGDEL.H" sl@0: #include "LOGQUERY.H" sl@0: #include "logservpanic.h" sl@0: #include "LogServCacheConfig.h" sl@0: #include "LogServCacheTypes.h" sl@0: #include "LogServBackupInterface.h" sl@0: #include "LogServViewWindowFetcher.h" sl@0: #include "LogServRecentListManager.h" sl@0: #include "LogServDatabaseTransactionInterface.h" sl@0: #include "LogServDatabaseChangeInterface.h" sl@0: #include "LogServSqlStrings.h" sl@0: sl@0: sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: // -----> CLogServDatabaseDriver (source) sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: CLogServDatabaseDriver::CLogServDatabaseDriver(MLogServBackupInterface& aBackupInterface, MLogServDatabaseTransactionInterface& aDatabase, CLogServResourceInterpreter& aResourceInterface, CLogServRecentListManager& aRecentListManager, TInt aHitterPriorities) sl@0: : iHitterPriorities(aHitterPriorities), iBackupInterface(aBackupInterface), iDatabase(aDatabase), iResourceInterface(aResourceInterface), iRecentListManager(aRecentListManager) sl@0: { sl@0: } sl@0: sl@0: CLogServDatabaseDriver::~CLogServDatabaseDriver() sl@0: { sl@0: iBackupInterface.BIObserverRemove(*this); sl@0: DestroyHitters(); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::ConstructL() sl@0: { sl@0: iBackupInterface.BIObserverAddL(*this, MLogServBackupInterface::EObjectDatabaseDriver); sl@0: // sl@0: CreateHittersL(); sl@0: } sl@0: sl@0: CLogServDatabaseDriver* CLogServDatabaseDriver::NewL(MLogServBackupInterface& aBackupInterface, MLogServDatabaseTransactionInterface& aDatabase, CLogServResourceInterpreter& aResourceInterface, CLogServRecentListManager& aRecentListManager, TInt aHitterPriorities) sl@0: { sl@0: CLogServDatabaseDriver* self = new(ELeave) CLogServDatabaseDriver(aBackupInterface, aDatabase, aResourceInterface, aRecentListManager, aHitterPriorities); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: void CLogServDatabaseDriver::BOHandleEventL(TLogServBackupEvent aEvent) sl@0: { sl@0: switch(aEvent) sl@0: { sl@0: case EBackupStarting: sl@0: LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - Backup STARTING"); sl@0: DestroyHitters(); sl@0: break; sl@0: case EBackupEnded: sl@0: LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - Backup ENDING"); sl@0: CreateHittersL(); sl@0: break; sl@0: default: sl@0: __ASSERT_DEBUG(EFalse, User::Invariant()); sl@0: break; sl@0: } sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - end"); sl@0: } sl@0: sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: void CLogServDatabaseDriver::TaskEventAddL(TRequestStatus& aStatus, CLogEvent& aEvent, const RMessage2& aMessage) sl@0: // sl@0: // Add an event to the database sl@0: // sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventAddL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: sl@0: // Get the recent list for this event sl@0: const CLogServRecentList* list = iRecentListManager.GetRecentList(aEvent); sl@0: sl@0: // Do the work sl@0: iAddEvent->StartL(aEvent, list, aStatus, aMessage); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventAddL() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::TaskEventChangeL(TRequestStatus& aStatus, const CLogEvent& aEvent, const RMessage2& aMessage) sl@0: // sl@0: // Change an event in the database sl@0: // sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventChangeL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: sl@0: // Get the recent list for this event sl@0: const CLogServRecentList* list = iRecentListManager.GetRecentList(aEvent); sl@0: sl@0: // sl@0: sl@0: // Do the work sl@0: iChangeEvent->StartL(aEvent, list, aStatus, aMessage); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventChangeL() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::TaskEventGetL(TRequestStatus& aStatus, CLogEvent& aEvent, const RMessage2& aMessage) sl@0: // sl@0: // Get an event from the database sl@0: // sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventGetL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: sl@0: // Do the work sl@0: iGetEvent->StartL(aEvent, aStatus, aMessage); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventGetL() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::TaskEventDeleteL(TRequestStatus& aStatus, TLogId aId, const RMessage2& aMessage) sl@0: // sl@0: // Delete an event from the database sl@0: // sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventDeleteL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: sl@0: iDeleteEvent->StartL(aId, aStatus, aMessage); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventDeleteL() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::TaskEventTypeAddL(TRequestStatus& aStatus, const CLogEventType& aEventType) sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventTypeAddL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: iDatabase.DTICacheTypes().AddTypeL(aEventType); sl@0: // sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventTypeAddL() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::TaskEventTypeGetL(TRequestStatus& aStatus, const CLogEventType*& aEventType, TUid aUid) sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventTypeGetL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: sl@0: const TLogServCacheTypeEntry& entry = iDatabase.DTICacheTypes().FindByUid(aUid); sl@0: aEventType = entry.iEventType; sl@0: if(entry.iEventTypeId == KLogNullTypeId) sl@0: { sl@0: User::Leave(KErrNotFound); sl@0: } sl@0: sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventTypeGetL() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::TaskEventTypeChangeL(TRequestStatus& aStatus, const CLogEventType& aEventType) sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventTypeChangeL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: const TInt error = iDatabase.DTICacheTypes().ChangeType(aEventType); sl@0: // sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, error); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventTypeChangeL() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::TaskEventTypeDeleteL(TRequestStatus& aStatus, TUid aType) sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventTypeDeleteL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: const TInt error = iDatabase.DTICacheTypes().DeleteType(aType); sl@0: // sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, error); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskEventTypeDeleteL() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::TaskConfigGetL(TRequestStatus& aStatus, TLogConfig& aConfig) sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskConfigGetL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: aConfig = iDatabase.DTICacheConfig().Config(); sl@0: // sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskConfigGetL() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::TaskConfigChangeL(TRequestStatus& aStatus, const TLogConfig& aConfig) sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskConfigChangeL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: sl@0: iChangeConfig->StartL(aConfig, aStatus); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskConfigChangeL() - end"); sl@0: } sl@0: sl@0: // aDate is expected to be UTC sl@0: void CLogServDatabaseDriver::TaskClearLogL(TRequestStatus& aStatus, const TTime& aDate sl@0: #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM sl@0: , TSimId aSimId sl@0: #endif sl@0: ) sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskClearLogL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: sl@0: // Format the date. sl@0: TBuf dateString; sl@0: aDate.FormatL(dateString, LogUtils::DateFormatForLocale()); sl@0: // Get list of events to purge sl@0: TheSql.Format(KLogSqlDeleteOldestString, &dateString); sl@0: #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM sl@0: if(aSimId != KLogNullSimId) sl@0: { sl@0: TheSql.Append(KLogAnd); sl@0: TheSql.AppendFormat(KLogUNumberPredicate, &KLogFieldEventSimId, aSimId); sl@0: } sl@0: #endif sl@0: iDatabase.DTIBeginWithRollBackProtectionLC(); sl@0: TInt rc = iDatabase.DTIExecuteSql(TheSql); sl@0: User::LeaveIfError(rc); sl@0: if(rc > 0) sl@0: { sl@0: // Add log cleared events. First is for the window code, which receives messages sl@0: // through the old API. The 2nd is for clients of the log engine sl@0: iDatabase.DTIChangeInterface().DCISubmitChangedEventContextL(ELogChangeTypeLogCleared, KLogNullId); sl@0: iDatabase.DTIChangeInterface().DCISubmitGlobalChangeContextL(KLogClientChangeEventLogCleared); sl@0: } sl@0: iDatabase.DTICommitAndCancelRollbackProtectionL(); sl@0: // Complete the request sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskClearLogL() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::TaskClearRecentL(TRequestStatus& aStatus, TInt aRecentList sl@0: #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM sl@0: , TSimId aSimId sl@0: #endif sl@0: ) sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskClearRecentL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: sl@0: TheSql.Copy(KLogSqlSelectAllRecent); sl@0: #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM sl@0: TBool whereAdded = EFalse; sl@0: #endif sl@0: // Get events to clear from recent lists sl@0: if(aRecentList != KLogNullRecentList) sl@0: { sl@0: TheSql.Append(KLogWhere); sl@0: #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM sl@0: whereAdded = ETrue; sl@0: #endif sl@0: TheSql.AppendFormat(KLogNumberPredicate, &KLogFieldEventRecentString, aRecentList); sl@0: } sl@0: #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM sl@0: //..and clear from recent lists with specific SimId sl@0: if(aSimId != KLogNullSimId) sl@0: { sl@0: if(whereAdded) sl@0: { sl@0: TheSql.Append(KLogAnd); sl@0: } sl@0: else sl@0: { sl@0: TheSql.Append(KLogWhere); sl@0: } sl@0: TheSql.AppendFormat(KLogUNumberPredicate, &KLogFieldEventSimId, aSimId); sl@0: } sl@0: #endif sl@0: sl@0: RLogDbView view; sl@0: view.PrepareLC(iDatabase.DTIDatabase(), TheSql); sl@0: sl@0: if(view.FirstL()) sl@0: { sl@0: static TDbColNo colId = 0; sl@0: static TDbColNo colRecent = 0; sl@0: static TDbColNo colDuplicate = 0; sl@0: if(colId == 0) sl@0: { sl@0: CDbColSet* cs = view.ColSetL(); sl@0: colId = cs->ColNo(KLogFieldIdString); sl@0: colRecent = cs->ColNo(KLogFieldEventRecentString); sl@0: colDuplicate = cs->ColNo(KLogFieldEventDuplicateString); sl@0: delete cs; sl@0: } sl@0: iDatabase.DTIBeginWithRollBackProtectionLC(); sl@0: // Iterate through the events sl@0: do sl@0: { sl@0: // Get current event id sl@0: view.GetL(); sl@0: const TLogId id = view.ColInt32(colId); sl@0: // Make the change sl@0: view.UpdateL(); sl@0: view.SetColNullL(colRecent); sl@0: view.SetColNullL(colDuplicate); sl@0: view.PutL(); sl@0: // This is a "hidden" change. It may affect the contents of a view, but the actual event hasn't changed sl@0: iDatabase.DTIChangeInterface().DCISubmitChangedEventContextL(ELogChangeTypeEventChangedHidden, id); sl@0: } sl@0: while(view.NextL()); sl@0: iDatabase.DTICommitAndCancelRollbackProtectionL(); sl@0: } sl@0: CleanupStack::PopAndDestroy(&view); sl@0: sl@0: // Complete the request sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskClearRecentL() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::TaskMaintenanceStartL(TRequestStatus& aStatus, TBool aPurge) sl@0: // sl@0: // Start database maintenance process sl@0: // sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskMaintenanceStartL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: sl@0: iMaintainer->Start(aPurge, aStatus); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskMaintenanceStartL() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::TaskBuildWindowL(TRequestStatus& aStatus, const CLogServViewBase& aView, const TLogTransferWindow& aWindow, const RMessage2& aMessage) sl@0: // sl@0: // Build a client window sl@0: // sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskBuildWindowL()"); sl@0: sl@0: // Handle when we're doing a backup sl@0: iBackupInterface.BIValidateStateForDatabaseOperationL(); sl@0: sl@0: iWindowFetcher->StartL(aStatus, aView, aWindow, aMessage); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskBuildWindowL() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::TaskCancelCurrent() sl@0: // sl@0: // Cancel all active tasks sl@0: // sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::TaskCancelCurrent()"); sl@0: sl@0: if (iAddEvent) sl@0: iAddEvent->Cancel(); sl@0: if (iChangeEvent) sl@0: iChangeEvent->Cancel(); sl@0: if (iGetEvent) sl@0: iGetEvent->Cancel(); sl@0: if (iDeleteEvent) sl@0: iDeleteEvent->Cancel(); sl@0: if (iChangeConfig) sl@0: iChangeConfig->Cancel(); sl@0: if (iWindowFetcher) sl@0: iWindowFetcher->Cancel(); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::TaskCancelCurrent() - end"); sl@0: } sl@0: sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: void CLogServDatabaseDriver::DestroyHitters() sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::DestroyHitters()"); sl@0: sl@0: TaskCancelCurrent(); sl@0: // sl@0: delete iMaintainer; sl@0: iMaintainer = NULL; sl@0: delete iAddEvent; sl@0: iAddEvent = NULL; sl@0: delete iChangeEvent; sl@0: iChangeEvent = NULL; sl@0: delete iGetEvent; sl@0: iGetEvent = NULL; sl@0: delete iDeleteEvent; sl@0: iDeleteEvent = NULL; sl@0: delete iChangeConfig; sl@0: iChangeConfig = NULL; sl@0: delete iWindowFetcher; sl@0: iWindowFetcher = NULL; sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::DestroyHitters() - end"); sl@0: } sl@0: sl@0: void CLogServDatabaseDriver::CreateHittersL() sl@0: { sl@0: LOGTEXT("CLogServDatabaseDriver::CreateHittersL()"); sl@0: sl@0: iMaintainer = CLogMaintenance::NewL(iDatabase, iHitterPriorities); sl@0: iAddEvent = CLogAddEvent::NewL(iDatabase, iHitterPriorities); sl@0: iChangeEvent = CLogChangeEvent::NewL(iDatabase, iHitterPriorities); sl@0: iGetEvent = CLogGetEvent::NewL(iDatabase, iHitterPriorities); sl@0: iDeleteEvent = CLogDeleteEvent::NewL(iDatabase, iHitterPriorities); sl@0: iChangeConfig = CLogChangeConfig::NewL(iDatabase, iRecentListManager, iHitterPriorities); sl@0: iWindowFetcher = CLogServViewWindowFetcher::NewL(iDatabase, iHitterPriorities); sl@0: sl@0: LOGTEXT("CLogServDatabaseDriver::CreateHittersL() - end"); sl@0: }