sl@0: // Copyright (c) 2002-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: // System includes sl@0: #include sl@0: #include // For CResourceFile sl@0: #include // For RResourceReader sl@0: #include sl@0: sl@0: // User includes sl@0: #include sl@0: #include "logservcli.h" sl@0: #include "LogServShared.h" sl@0: #include "logpackage.h" sl@0: #include "logclipanic.h" sl@0: #include "logclientop.h" sl@0: #include "LogClientObserver.h" sl@0: sl@0: //********************************** sl@0: // TLogConfig sl@0: //********************************** sl@0: sl@0: /** Sets the: sl@0: sl@0: maximum age of events to zero sl@0: sl@0: maximum number of events to appear in the log to zero sl@0: sl@0: maximum number of events to appear in a recent event list to zero */ sl@0: EXPORT_C TLogConfig::TLogConfig() sl@0: : iMaxLogSize(0), iMaxRecentLogSize(0), iMaxEventAge(0) sl@0: { sl@0: } sl@0: sl@0: void TLogConfig::InternalizeL(RReadStream& aStream) sl@0: { sl@0: aStream >> iMaxLogSize; sl@0: aStream >> iMaxRecentLogSize; sl@0: aStream >> iMaxEventAge; sl@0: } sl@0: sl@0: void TLogConfig::ExternalizeL(RWriteStream& aStream) const sl@0: { sl@0: aStream << iMaxLogSize; sl@0: aStream << iMaxRecentLogSize; sl@0: aStream << iMaxEventAge; sl@0: } sl@0: sl@0: //********************************** sl@0: // CLogClient sl@0: //********************************** sl@0: sl@0: EXPORT_C CLogClient* CLogClient::NewL(RFs& aFs, TInt aPriority/* = CActive::EPriorityStandard*/) sl@0: { sl@0: CLogClient* self = new(ELeave)CLogClient(aFs, aPriority); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(); // self sl@0: return self; sl@0: } sl@0: sl@0: void CLogClient::ConstructL() sl@0: { sl@0: // Load resources sl@0: LoadResourcesL(iFs); sl@0: sl@0: iSession = new(ELeave)RLogSession; sl@0: User::LeaveIfError(iSession->Connect()); sl@0: iPackage = CLogPackage::NewL(); sl@0: sl@0: iAddEvent = new(ELeave)CLogAddEventClientOp(*iSession, *iPackage, Priority()); sl@0: iChangeEvent = new(ELeave)CLogChangeEventClientOp(*iSession, *iPackage, Priority()); sl@0: iGetEvent = new(ELeave)CLogGetEventClientOp(*iSession, *iPackage, Priority()); sl@0: iDeleteEvent = new(ELeave)CLogDeleteEventClientOp(*iSession, *iPackage, Priority()); sl@0: iAddType = new(ELeave)CLogAddTypeClientOp(*iSession, *iPackage, Priority()); sl@0: iChangeType = new(ELeave)CLogChangeTypeClientOp(*iSession, *iPackage, Priority()); sl@0: iGetType = new(ELeave)CLogGetTypeClientOp(*iSession, *iPackage, Priority()); sl@0: iDeleteType = new(ELeave)CLogDeleteTypeClientOp(*iSession, *iPackage, Priority()); sl@0: iGetConfig = new(ELeave)CLogGetConfigClientOp(*iSession, *iPackage, Priority()); sl@0: iChangeConfig = new(ELeave)CLogChangeConfigClientOp(*iSession, *iPackage, Priority()); sl@0: iClearLog = new(ELeave)CLogClearLogClientOp(*iSession, *iPackage, Priority()); sl@0: iClearRecent = new(ELeave)CLogClearRecentClientOp(*iSession, *iPackage, Priority()); sl@0: } sl@0: sl@0: /** Frees all resources owned by the Log Engine object prior to its destruction. sl@0: In particular, any outstanding asynchronous request is cancelled, the database, sl@0: the database session and the resource file are all closed. */ sl@0: EXPORT_C CLogClient::~CLogClient() sl@0: { sl@0: Cancel(); sl@0: sl@0: delete iChangeObserver; sl@0: if (iSession && iSession->Handle()) sl@0: { sl@0: // Complete change notification sl@0: NotifyChangeCancel(); sl@0: iSession->Close(); sl@0: } sl@0: sl@0: delete iSession; sl@0: delete iPackage; sl@0: delete iAddEvent; sl@0: delete iChangeEvent; sl@0: delete iGetEvent; sl@0: delete iDeleteEvent; sl@0: delete iAddType; sl@0: delete iChangeType; sl@0: delete iGetType; sl@0: delete iDeleteType; sl@0: delete iGetConfig; sl@0: delete iChangeConfig; sl@0: delete iClearLog; sl@0: delete iClearRecent; sl@0: } sl@0: sl@0: CLogClient::CLogClient(RFs& aFs, TInt aPriority) sl@0: : CLogBase(aPriority), iFs(aFs) sl@0: { sl@0: } sl@0: sl@0: /** Adds an event to the log database. This is an asynchronous request. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: @param aEvent A log event detail object containing the attributes of the event sl@0: to be added. The Log Engine sets the unique event ID, the UTC time and the event sl@0: description, replacing any supplied values. The caller must ensure that this sl@0: object remains in existence and valid until the request is complete. sl@0: @param aStatus The request status. On request completion,contains: KErrNone, sl@0: if the event has been successfully added to the log database; KErrNotFound, sl@0: if the event type is not registered with the Log Engine; KErrNotSupported, sl@0: if the logging of events of this type has been disabled; otherwise, one of sl@0: the other system wide error codes. sl@0: @capability Note For built-in event types, the required capability level is defined in sl@0: the event type's write access policy. sl@0: @see CLogEventType::SetLoggingEnabled() */ sl@0: EXPORT_C void CLogClient::AddEvent(CLogEvent& aEvent, TRequestStatus& aStatus) sl@0: { sl@0: Queue(aStatus); sl@0: iAddEvent->Start(aEvent, iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: /** Changes the details of an existing event. This is an asynchronous request. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: Note that it is not possible to change the event type using this function. sl@0: sl@0: @param aEvent The event detail object containing the attributes of the event sl@0: to be changed. Before calling the function, this object must contain the appropriate sl@0: unique event ID; if no unique event ID is set, the function raises a LogCli sl@0: 13 panic. The caller must ensure that this object remains in existence and sl@0: valid until the request is complete. sl@0: @param aStatus The request status. On request completion, contains:KErrNone, sl@0: if successful; otherwise, one of the other system wide error codes. sl@0: @capability Note For built-in event types, the required capability level is defined in sl@0: the event type's write access policy. sl@0: @see TLogId */ sl@0: EXPORT_C void CLogClient::ChangeEvent(const CLogEvent& aEvent, TRequestStatus& aStatus) sl@0: { sl@0: Queue(aStatus); sl@0: iChangeEvent->Start(aEvent, iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: /** Gets the details of the specified event. This is an asynchronous request. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: @param aEvent A reference to a log event detail object. Before calling the sl@0: function, this object must contain the appropriate unique event ID; if no sl@0: unique event ID is set, the function raises a LogServ 50 panic. The caller sl@0: must ensure that this object remains in existence and valid until the request sl@0: is complete. On successful completion of the request, it contains the appropriate sl@0: log event detail. sl@0: @param aStatus The request status. On request completion, contains:KErrNone, sl@0: if successful; otherwise, one of the other system wide error codes. sl@0: @capability Note For built-in event types, the required capability level is defined in sl@0: the event type's read access policy. sl@0: @see TLogId */ sl@0: EXPORT_C void CLogClient::GetEvent(CLogEvent& aEvent, TRequestStatus& aStatus) sl@0: { sl@0: Queue(aStatus); sl@0: iGetEvent->Start(aEvent, iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: /** Deletes the event with the specified unique event ID, from the main event log. sl@0: sl@0: @param aId The unique event ID of the event to be deleted. This must not be sl@0: the null unique event ID, KLogNullId, otherwise the function raises a LogCli sl@0: 13 panic. sl@0: @param aStatus The request status. On request completion, contains:KErrNone, sl@0: if successful; otherwise, one of the other system wide error codes. sl@0: @capability Note For built-in event types, the required capability level is defined in sl@0: the event type's write access policy. sl@0: */ sl@0: EXPORT_C void CLogClient::DeleteEvent(TLogId aId, TRequestStatus& aStatus) sl@0: { sl@0: Queue(aStatus); sl@0: iDeleteEvent->Start(aId, iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: /** Registers a new event type. This is an asynchronous request. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: @param aType The event type detail object containing the attributes of the sl@0: event type to be registered. The caller must ensure that this object remains sl@0: in existence and valid until the request is complete. sl@0: @param aStatus The request status. On request completion, contains:KErrNone, sl@0: if successful; otherwise, one of the other system wide error codes. sl@0: @capability WriteDeviceData sl@0: @see TUid */ sl@0: EXPORT_C void CLogClient::AddEventType(const CLogEventType& aType, TRequestStatus& aStatus) sl@0: { sl@0: Queue(aStatus); sl@0: iAddType->Start(aType, iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: /** Gets the details of an event type. This is an asynchronous request. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: @param aType A reference to an event type detail object. Before calling the sl@0: function, this object must contain the UID identifying the event type; if sl@0: no UID is set, the function raises a LogCli 13 panic. The caller must ensure sl@0: that this object remains in existence and valid until the request is complete. sl@0: On successful completion of the request, it contains the appropriate event sl@0: type detail. sl@0: @param aStatus The request status. On request completion, contains: KErrNone, sl@0: if successful; otherwise one of the other system wide error codes. sl@0: @capability Note None required. sl@0: @see TUid */ sl@0: EXPORT_C void CLogClient::GetEventType(CLogEventType& aType, TRequestStatus& aStatus) sl@0: { sl@0: Queue(aStatus); sl@0: iGetType->Start(aType, iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: /** Changes the details of an existing event type. This is an asynchronous request. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: @param aType The event type detail object containing the attributes of the sl@0: event type to be changed. Before calling the function, this object must contain sl@0: the UID identifying the event type; if no UID is set, the function raises sl@0: a LogCli 13 panic. The caller must ensure that this object remains in existence sl@0: and valid until the request is complete. sl@0: @param aStatus The request status. On request completion, contains: KErrNone, sl@0: if successful; otherwise, one of the other system wide error codes. sl@0: @capability WriteDeviceData sl@0: @see TUid */ sl@0: EXPORT_C void CLogClient::ChangeEventType(const CLogEventType& aType, TRequestStatus& aStatus) sl@0: { sl@0: Queue(aStatus); sl@0: iChangeType->Start(aType, iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: /** Removes an existing event type. This is an asynchronous request. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: Note that this function does not remove events from the event log, so it is sl@0: possible to have events in the log that are of an unknown type. This function sl@0: allows an event type associated with a component to be removed when that component sl@0: is uninstalled. sl@0: sl@0: @param aId The UID of the event type to be deleted. sl@0: @param aStatus The request status. On request completion, contains:KErrNone, sl@0: if successful; otherwise, one of the other system wide error codes. sl@0: @capability WriteDeviceData sl@0: */ sl@0: EXPORT_C void CLogClient::DeleteEventType(TUid aId, TRequestStatus& aStatus) sl@0: { sl@0: Queue(aStatus); sl@0: iDeleteType->Start(aId, iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: /** Gets the Log Engine configuration. This is an asynchronous request. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: @param aConfig A reference to a Log Engine configuration object. The caller sl@0: must ensure that this object remains in existence and valid until the request sl@0: is complete. On successful completion of the request, it contains the Log sl@0: Engine configuration data. sl@0: @param aStatus The request status. On request completion, contains:KErrNone, sl@0: if successful; otherwise, one of the other system wide error codes. sl@0: @capability Note None required. sl@0: */ sl@0: EXPORT_C void CLogClient::GetConfig(TLogConfig& aConfig, TRequestStatus& aStatus) sl@0: { sl@0: Queue(aStatus); sl@0: iGetConfig->Start(aConfig, iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: /** Changes the Log Engine configuration. This is an asynchronous request. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: @param aConfig The new configuration values for the Log Engine. sl@0: @param aStatus The request status. On request completion, contains:KErrNone, sl@0: if successful; otherwise, one of the other system wide error codes. sl@0: @capability WriteDeviceData */ sl@0: EXPORT_C void CLogClient::ChangeConfig(const TLogConfig& aConfig, TRequestStatus& aStatus) sl@0: { sl@0: Queue(aStatus); sl@0: iChangeConfig->Start(aConfig, iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: /** Clears all events from the main event log that occurred before the specified sl@0: date and time. This is an asynchronous request. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: @param aDate The UTC date and time. sl@0: @param aStatus The request status. On request completion, contains:KErrNone, sl@0: if successful; otherwise, one of the other system wide error codes. sl@0: @capability WriteDeviceData */ sl@0: EXPORT_C void CLogClient::ClearLog(const TTime& aDate, TRequestStatus& aStatus) sl@0: { sl@0: Queue(aStatus); sl@0: iClearLog->Start(aDate, iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: /** Clears the specified recent event list. This is an asynchronous request. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: @param aRecentList Identifies the recent event list to be cleared. The value sl@0: KlogNullRecentList indicates that all recent event lists are to be cleared. sl@0: @param aStatus The request status. On request completion, contains:KErrNone, sl@0: if successful; otherwise, one of the other system wide error codes. sl@0: @capability WriteDeviceData */ sl@0: EXPORT_C void CLogClient::ClearLog(TInt aRecentList, TRequestStatus& aStatus) sl@0: { sl@0: Queue(aStatus); sl@0: iClearRecent->Start((TLogRecentList)aRecentList, iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM sl@0: sl@0: /** sl@0: Clears all events from the main event log that occurred before the specified sl@0: date and time and logged with the supplied SIM short Id. This is an asynchronous request. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: Note: If KLogNullSimId is passed as value of aSimId parameter, then the method will produce the same result as the sl@0: ClearLog() method without SimId parameter - all events occured before the specified data will be deleted, sl@0: disregarding the SimId event property. sl@0: sl@0: @param aDate The UTC date and time. sl@0: @param aSimId SIM card short Id. sl@0: @param aStatus The request status. On request completion, contains:KErrNone, sl@0: if successful; otherwise, one of the other system wide error codes. sl@0: @capability WriteDeviceData sl@0: */ sl@0: EXPORT_C void CLogClient::ClearLog(const TTime& aDate, TSimId aSimId, TRequestStatus& aStatus) sl@0: {//Compiled when SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM is defined sl@0: Queue(aStatus); sl@0: iClearLog->Start(aDate, iStatus, aSimId); sl@0: SetActive(); sl@0: } sl@0: sl@0: /** sl@0: Clears the specified recent event list from events with the specified SIM short Id. sl@0: This is an asynchronous request. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: Note: If KLogNullSimId is passed as value of aSimId parameter, then the method will produce the same result as the sl@0: ClearLog() method without SimId parameter - all events from the specified event list will be cleared, sl@0: disregarding the SimId event property. sl@0: sl@0: @param aRecentList Identifies the recent event list to be cleared. The value sl@0: KlogNullRecentList indicates that all recent event lists are to be cleared. sl@0: @param aSimId SIM card short Id. sl@0: @param aStatus The request status. On request completion, contains:KErrNone, sl@0: if successful; otherwise, one of the other system wide error codes. sl@0: @capability WriteDeviceData sl@0: */ sl@0: EXPORT_C void CLogClient::ClearLog(TInt aRecentList, TSimId aSimId, TRequestStatus& aStatus) sl@0: {//Compiled when SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM is defined sl@0: Queue(aStatus); sl@0: iClearRecent->Start((TLogRecentList)aRecentList, iStatus, aSimId); sl@0: SetActive(); sl@0: } sl@0: sl@0: #else //SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM sl@0: sl@0: #pragma BullseyeCoverage off sl@0: sl@0: /** sl@0: Not supported. sl@0: */ sl@0: EXPORT_C void CLogClient::ClearLog(const TTime&, TSimId, TRequestStatus&) sl@0: {//Compiled when SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM is not defined sl@0: __ASSERT_ALWAYS(0, ::Panic(ELogDualSimNotSupported)); sl@0: } sl@0: sl@0: /** sl@0: Not supported. sl@0: */ sl@0: EXPORT_C void CLogClient::ClearLog(TInt, TSimId, TRequestStatus&) sl@0: {//Compiled when SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM is not defined sl@0: __ASSERT_ALWAYS(0, ::Panic(ELogDualSimNotSupported)); sl@0: } sl@0: sl@0: #pragma BullseyeCoverage on sl@0: sl@0: #endif//SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM sl@0: sl@0: /** Requests notification of changes to the Log Engine database. This is an asynchronous sl@0: request. sl@0: sl@0: The function requires the caller to specify a minimum time that must elapse sl@0: before this notification request can complete. The Log Engine buffers all sl@0: changes that occur during this time; the request, then completes after this sl@0: minimum time period has elapsed. If no changes occur within this time period, sl@0: then the request completes when the next change to the database occurs. sl@0: sl@0: There must be no asynchronous request outstanding when this function is called, sl@0: otherwise the function raises a LogCli 0 panic. sl@0: sl@0: Note that once a notification request has completed, this function must be sl@0: called again to get further change notifications. sl@0: sl@0: @param aDelay The minimum time, in microseconds, that elapses before the notification sl@0: request can complete. sl@0: @param aStatus The request status. On request completion, contains:KErrNone, sl@0: if successful;KErrCancel, if an outstanding notification request is cancelled; sl@0: otherwise, one of the other system wide error codes. sl@0: @capability Note None required. sl@0: */ sl@0: EXPORT_C void CLogClient::NotifyChange(TTimeIntervalMicroSeconds32 aDelay, TRequestStatus& aStatus) sl@0: { sl@0: aStatus = KRequestPending; sl@0: sl@0: iSession->Send(ELogNotify, TIpcArgs(aDelay.Int()), aStatus); sl@0: } sl@0: sl@0: /** Cancels any outstanding notification request for changes to Log Engine database. sl@0: sl@0: This function can be called even if there is no outstanding notification request. sl@0: @capability Note None required */ sl@0: EXPORT_C void CLogClient::NotifyChangeCancel() sl@0: { sl@0: iSession->Send(ELogNotifyCancel, TIpcArgs()); sl@0: } sl@0: sl@0: /** sl@0: @capability Note None required sl@0: */ sl@0: EXPORT_C void CLogClient::SetGlobalChangeObserverL(MLogClientChangeObserver* aObserver) sl@0: { sl@0: delete iChangeObserver; sl@0: iChangeObserver = NULL; sl@0: // sl@0: if (aObserver) sl@0: { sl@0: iChangeObserver = CLogClientObserver::NewL(*this, *aObserver, Priority()); sl@0: } sl@0: } sl@0: sl@0: /** Gets a standard string from the specified resource in logwrap.dll resource sl@0: file. sl@0: sl@0: The function can be used to populate some of the event fields in a CLogEvent sl@0: object before creating or changing an event. sl@0: sl@0: Note that TLogString is a modifiable buffer descriptor that is guaranteed sl@0: to be large enough to contain all standard strings used in the Log Engine; sl@0: pass an instance of this type to this function. sl@0: sl@0: @param aString A modifiable descriptor into which the string is copied. sl@0: @param aId The resource id. sl@0: @return KErrNone, if successful; otherwise, one of the other system wide error sl@0: codes. sl@0: @capability Note None required. sl@0: @see TLogString */ sl@0: EXPORT_C TInt CLogClient::GetString(TDes& aString, TInt aId) const sl@0: { sl@0: aString.Zero(); sl@0: TRAPD(err, DoGetStringL(aString, aId)); sl@0: return err; sl@0: } sl@0: sl@0: void CLogClient::DoGetStringL(TDes& aString, TInt aId) const sl@0: { sl@0: RResourceReader reader; sl@0: #ifdef _DEBUG sl@0: const CResourceFile* rcFile = ResourceFile(); sl@0: __ASSERT_DEBUG(rcFile != NULL, Panic(ELogNullRcFile)); sl@0: #endif sl@0: reader.OpenLC(ResourceFile(), aId); sl@0: aString.Copy(reader.ReadTPtrCL()); sl@0: CleanupStack::PopAndDestroy(); // reader sl@0: } sl@0: sl@0: void CLogClient::DoCancel() sl@0: { sl@0: LOGTEXT("CLogClient::DoCancel()"); sl@0: sl@0: iAddEvent->Cancel(); sl@0: iChangeEvent->Cancel(); sl@0: iGetEvent->Cancel(); sl@0: iDeleteEvent->Cancel(); sl@0: iAddType->Cancel(); sl@0: iChangeType->Cancel(); sl@0: iGetType->Cancel(); sl@0: iDeleteType->Cancel(); sl@0: iGetConfig->Cancel(); sl@0: iChangeConfig->Cancel(); sl@0: iClearLog->Cancel(); sl@0: iClearRecent->Cancel(); sl@0: sl@0: CLogBase::DoCancel(); sl@0: LOGTEXT("CLogClient::DoCancel() - end"); sl@0: } sl@0: sl@0: void CLogClient::DoRunL() sl@0: { sl@0: LOGTEXT2("CLogClient::DoRunL(%d)", iStatus.Int()); sl@0: User::LeaveIfError(iStatus.Int()); sl@0: LOGTEXT("CLogClient::DoRunL() - end"); sl@0: } sl@0: sl@0: RLogSession& CLogClient::Session() const sl@0: { sl@0: return *iSession; sl@0: } sl@0: sl@0: #pragma BullseyeCoverage off sl@0: sl@0: EXPORT_C void CLogClient::CLogBase_Reserved1() sl@0: { sl@0: } sl@0: sl@0: #pragma BullseyeCoverage on