loggingservices/eventlogger/LogWrap/src/LOGEVENT.CPP
changeset 0 08ec8eefde2f
child 55 44f437012c90
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loggingservices/eventlogger/LogWrap/src/LOGEVENT.CPP	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,319 @@
+// 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 <logwrap.h>
+#include <logwraplimits.h>
+#include "logcntdef.h"
+#include "s32strm.h"
+#include "LOGPANIC.H"
+
+#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
+
+/**
+This is the current version number of the event data, after the introduction of the "dual SIM support". 
+New event properties in this version:
+ - TInt    iVersion;
+ - TSimId	iSimId;
+ 
+The data versioning was introduced together with the "dual SIM support" changes where a new data member was
+added to the CLogEvent class. 
+The idea is to keep InternalizeL()/ExternalizeL() functionality binary compatibly in case of the unlikely event
+CLogEvent data gets persisted to a file for example.
+
+The old format of the externalized event data is:
+ <id><type>.....<data length>[<optional: data>]
+ 
+The new format of the externalized event data is:
+ <id><type>.....<uint: data version><data length>[<optional: data>]<simId>
+ 
+In case if CLogEvent::InternalizeL() reads from a stream with old event data, then:
+1) The data vesrion is read first as an integer. 
+2) If the data version is negative then this is an event data with "dual SIM support",
+   because the version number of that is positive integer above the KMaxTInt constant
+   (interpreted as negative one if read as an integer from the stream)
+3) If the data version is positive then this is an event data without "dual SIM support".   
+ 
+@internalComponent 
+*/
+const TUint KLogEventDataVersion = 0x80000002U;
+
+#endif//SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
+
+EXPORT_C CLogEvent* CLogEvent::NewL()
+/** Creates a new log event detail object.
+
+@return Pointer to the new log event detail object. */
+	{
+	CLogEvent* self = new(ELeave)CLogEvent;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(); // self
+	return self;
+	}
+
+CLogEvent::CLogEvent() :
+	iId(KLogNullId), 
+	iEventType(KNullUid), 
+	iDurationType(KLogNullDurationType), 
+	iDuration(KLogNullDuration), 
+	iContact(KLogNullContactId), 
+	iLink(KLogNullLink), 
+	iFlags(KLogNullFlags)
+	{
+	}
+
+void CLogEvent::ConstructL()
+	{
+	iDescription = HBufC::NewL(KLogMaxDescriptionLength);
+	iRemoteParty = HBufC::NewL(KLogMaxRemotePartyLength);
+	iDirection = HBufC::NewL(KLogMaxDirectionLength);
+	iStatus = HBufC::NewL(KLogMaxStatusLength);
+	iSubject = HBufC::NewL(KLogMaxSubjectLength);
+	iNumber = HBufC::NewL(KLogMaxNumberLength);
+	}
+
+EXPORT_C CLogEvent::~CLogEvent()
+/** Frees all resources owned by the log event detail object. */
+	{
+	delete iDescription;
+	delete iRemoteParty;
+	delete iDirection;
+	delete iStatus;
+	delete iSubject;
+	delete iNumber;
+	delete iData;
+	}
+
+EXPORT_C void CLogEvent::SetDataL(const TDesC8& aData)
+/** Sets event specific data.
+
+The data can be used for any purpose. The data is copied into a heap descriptor 
+allocated by this function; the amount of data is only limited by the available 
+memory.
+
+@param aData The event specific data. */
+	{
+	if (iData)
+		{
+		if (iData->Des().MaxLength() < aData.Length())
+			iData = iData->ReAllocL(aData.Length());
+		}
+	else
+		{
+		if (aData.Length() > 0)
+			iData = HBufC8::NewL(aData.Length());
+		else
+			return;
+		}
+
+	iData->Des().Copy(aData);
+	}
+
+EXPORT_C void CLogEvent::SetDataL(RReadStream& aStream, TInt aLen)
+/** Sets event specific data from the specified stream.
+
+The data can be used for any purpose. The data is copied into a heap descriptor 
+allocated by this function; the amount of data is only limited by the available 
+memory.
+
+@param aStream The stream containing the event specific data.
+@param aLen The length of data to be read from the stream. */
+	{
+	HBufC8* buf = NULL;
+
+	if (aLen > 0)
+		{
+		buf = HBufC8::NewLC(aLen);
+		buf->Des().SetLength(aLen);
+
+		TPtr8 ptr(buf->Des());
+		aStream.ReadL(ptr, aLen);
+
+		CleanupStack::Pop(); // buf
+		}
+
+	delete iData;
+	iData = buf;
+	}
+
+EXPORT_C void CLogEvent::CopyL(const CLogEvent& aEvent)
+/** Makes a copy of the specified log event.
+
+@param aEvent The log event to be copied. */
+	{
+	// Set data first as this is the only function that can leave
+	// If this function fails nothing will be changed
+	SetDataL(aEvent.Data());
+
+	SetId(aEvent.Id());
+	SetEventType(aEvent.EventType());
+	SetTime(aEvent.Time());
+	SetDurationType(aEvent.DurationType());
+	SetDuration(aEvent.Duration());
+	SetContact(aEvent.Contact());
+	SetLink(aEvent.Link());
+	SetDescription(aEvent.Description());
+	SetRemoteParty(aEvent.RemoteParty());
+	SetDirection(aEvent.Direction());
+	SetStatus(aEvent.Status());
+	SetSubject(aEvent.Subject());
+	SetNumber(aEvent.Number());
+
+	ClearFlags(KLogFlagsMask);
+	SetFlags(aEvent.Flags());
+#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
+	SetSimId(aEvent.SimId());
+#endif
+	}
+
+EXPORT_C void CLogEvent::InternalizeL(RReadStream& aStream)
+	{
+	iId = (TLogId) aStream.ReadInt32L();
+	iEventType.iUid = aStream.ReadInt32L();
+
+	TInt64 time; 
+	aStream >> time;
+	iTime = time;
+
+	iDurationType = (TLogDurationType) aStream.ReadInt8L();
+	iDuration = (TLogDuration) aStream.ReadUint32L();
+	iContact = (TLogContactItemId ) aStream.ReadInt32L();
+	iLink = (TLogLink) aStream.ReadUint32L();
+	iFlags = (TLogFlags) aStream.ReadUint8L();
+
+	InternalizeBufL(aStream, iDescription);
+	InternalizeBufL(aStream, iRemoteParty);
+	InternalizeBufL(aStream, iDirection);
+	InternalizeBufL(aStream, iStatus);
+	InternalizeBufL(aStream, iSubject);
+	InternalizeBufL(aStream, iNumber);
+
+	TInt dataLen = aStream.ReadInt32L();
+#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
+	TUint dataVersion = 0;
+	if(dataLen < 0)
+		{
+		//This is CLogEvent data version with dual SIM support.
+		//The next property is the data length.
+		dataVersion = (TUint)dataLen;
+		dataLen = aStream.ReadInt32L();
+		}
+#endif
+	HBufC8* temp = NULL;
+	if(dataLen != 0)
+		{
+		temp = HBufC8::NewL(aStream, dataLen);
+		}
+	delete iData;
+	iData = temp;
+	
+#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
+	if(dataVersion >= KLogEventDataVersion)
+		{
+		aStream >> iSimId;
+		}
+#endif
+	}
+
+void CLogEvent::InternalizeBufL(RReadStream& aStream, HBufC*& aDes)
+	{
+	TPtr ptr(aDes->Des());
+	HBufC* temp = HBufC::NewL(aStream, ptr.MaxLength());
+	ptr.Copy(*temp);
+	delete temp;
+	}
+
+EXPORT_C void CLogEvent::ExternalizeL(RWriteStream& aStream) const
+	{
+	aStream.WriteInt32L(iId);
+	aStream.WriteInt32L(iEventType.iUid);
+	aStream << iTime.Int64();
+	aStream.WriteInt8L(iDurationType);
+	aStream.WriteUint32L(iDuration);
+	aStream.WriteInt32L(iContact);
+	aStream.WriteUint32L(iLink);
+	aStream.WriteInt8L(iFlags);
+	aStream << *iDescription;
+	aStream << *iRemoteParty;
+	aStream << *iDirection;
+	aStream << *iStatus;
+	aStream << *iSubject; 
+	aStream << *iNumber;
+
+#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
+	aStream.WriteUint32L(KLogEventDataVersion);
+#endif
+	
+	TInt dataLength = 0;
+	if(iData)
+		{
+		dataLength = iData->Length();
+		}
+	aStream.WriteInt32L(dataLength);
+	if	(iData && dataLength)
+		{
+		aStream << *iData;
+		}
+#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
+	aStream << iSimId;
+#endif
+	}
+
+#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
+
+/**
+Sets the short Id of the SIM card being used.
+
+@param aSimId SIM card short Id;  
+*/
+EXPORT_C void CLogEvent::SetSimId(TSimId aSimId)
+	{//Compiled when SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM is defined
+	iSimId = aSimId;
+	}
+
+/**
+Returns the short Id of the SIM card that was used.
+
+@return SIM card short Id;  
+*/
+EXPORT_C TSimId CLogEvent::SimId() const
+	{//Compiled when SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM is defined
+	return iSimId;
+	}
+
+#else//SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
+
+#pragma BullseyeCoverage off
+
+/**
+Not supported.
+*/
+EXPORT_C void CLogEvent::SetSimId(TSimId)
+	{//Compiled when SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM is not defined
+	__ASSERT_ALWAYS(0, ::Panic(ELogDualSimNotSupported));
+	}
+
+/**
+Not supported.
+*/
+EXPORT_C TSimId CLogEvent::SimId() const
+	{//Compiled when SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM is not defined
+	__ASSERT_ALWAYS(0, ::Panic(ELogDualSimNotSupported));
+	return 0;
+	}
+
+#pragma BullseyeCoverage on
+
+#endif//SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM