diff -r 000000000000 -r e686773b3f54 logsui/EngineSrc/CLogsEventData.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/EngineSrc/CLogsEventData.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,540 @@ +/* +* Copyright (c) 2005 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: +* Implements interface for Logs event +* +*/ + +// INCLUDE FILES +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif +#include "CLogsEventData.h" +#include "LogsApiConsts.h" +#include //epocnooptypeid for idatatype + +_LIT8( KLogsDoubleDataFldNameDelimiter, "\t\t" ); +const TInt KOneChar = 1; +const TInt KTwoChars = 2; + + +// ---------------------------------------------------------------------------- +// CLogsEventData::NewL +// ---------------------------------------------------------------------------- +// +CLogsEventData* CLogsEventData::NewL( const TDesC8 &aData, TBool aReadMessageParts ) + { + CLogsEventData* self = new (ELeave) CLogsEventData( aData ); + CleanupStack::PushL( self ); + self->ConstructL( aReadMessageParts ); + CleanupStack::Pop( self ); + return self; + } + + +// ---------------------------------------------------------------------------- +// CLogsEventData::CLogsEventData +// ---------------------------------------------------------------------------- +// +CLogsEventData::CLogsEventData( const TDesC8 &aData ) : + iTempDataFieldPtr( aData ) + { + //NOTE It is NOT guaranteed that the TDesC8& got in as parameter is alive longer than + //during the call to this ConstructL. Therefore the same applies to iTempDataFieldPtr we're using to point to it. + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::~CLogsEventData +// ---------------------------------------------------------------------------- +// +CLogsEventData::~CLogsEventData() + { + delete iURL8; + delete iProfile; + delete iId; + delete iMyAddress8; + delete iDataField; + delete iContactLink; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::ConstructL +// ---------------------------------------------------------------------------- +// +void CLogsEventData::ConstructL( TBool aReadMessageParts ) + { + //All default values must already be set in case there is no data in the event's data field. + iALS = EFalse; + iCNAP = EFalse; + iVT = EFalse; + iPoC = EFalse; + iVoIP = EFalse; + iEmerg = EFalse; + iDataSent = MAKE_TINT64(0,0); + iDataReceived = MAKE_TINT64(0,0); + iDataType = KErrNotFound; //Provide EPoCNoOpTypeId if type is absent or non numeric + iMsgPartsNumber = 0; //Meaningful only for sms + iServiceId = 0; + iContactLink = 0; + iDataField = iTempDataFieldPtr.AllocL(); + iURL8 = HBufC8::NewL( 0 ); //We must have a valid HBufC object even if we would not put any data to it. + iProfile = HBufC8::NewL( 0 ); + iId = HBufC8::NewL( 0 ); + iMyAddress8 = HBufC8::NewL( 0 ); + + //1. Msg parts are written in different format in data field. + if( aReadMessageParts ) + { + SetMsgPartsNumber(); + } + //2. else check if the sent & received data is in old format (this can be removed when creating + // log data field entries is similar to format of other data field entries (i.e is tagged)) + else if( CheckNonTaggedData( iTempDataFieldPtr ) ) + { + return; //Found and processed legacy data. + } + //3. Otherwise check if tagged data is available. + else + { + CheckTaggedDataL(); + } + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::SetMsgPartsNumber +// +// Read msg parts. They are written in format of TLogSmsPduData in Data field +// ---------------------------------------------------------------------------- +// +void CLogsEventData::SetMsgPartsNumber() + { + TPckgBuf packedData; + packedData.Copy( iTempDataFieldPtr.Ptr(), sizeof( TLogSmsPduData ) ); + iMsgPartsNumber = packedData().iTotal; + return; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::CheckNonTaggedData +// ---------------------------------------------------------------------------- +// +TBool CLogsEventData::CheckNonTaggedData( TPtrC8 aDataPtr ) + { + TLex8 lex; + TPtrC8 ptr; + _LIT8(KDataSeparator,","); //Separator for gprs data (old legacy non-tagged format for sent and received grps data) + + //Here were are interested only in data that begins with number (e.g. 123445,23445) + if( aDataPtr.Length() < 1 ) + { + return EFalse; //No data + } + else + { //At least 1 byte of data available. Check does it begin with number. + TInt v; + ptr.Set( aDataPtr.Left(1) ); + lex = ptr; + if( lex.Val( v ) != KErrNone ) + { + return EFalse; //First byte does not contain number + } + } + + //Ok, data begins with number. Try to read a pair of comma separated numbers + TInt separatorOffset = aDataPtr.Find( KDataSeparator ); + + if( separatorOffset + 1 > aDataPtr.Length() || separatorOffset < 0 ) + { + return EFalse; //No separator found. + } + + //Set iDataSent + ptr.Set( aDataPtr.Left( separatorOffset ) ); //Let's inspect on the left side of field delimiter token + lex = ptr; + lex.Val( iDataSent ); + + //Then reeceived data + if( (separatorOffset + 1) >= aDataPtr.Length() ) + { + return ETrue; //Was no data after separator + } + + //Set iDataReceived + ptr.Set( aDataPtr.Mid(separatorOffset + 1, aDataPtr.Length() - separatorOffset - 1) ); + lex = ptr; + lex.Val( iDataReceived ); + + return ETrue; + } + + +// ---------------------------------------------------------------------------- +// CLogsEventData::CheckTaggedDataL +// ---------------------------------------------------------------------------- +// +void CLogsEventData::CheckTaggedDataL() + { + TInt dataLeft = iTempDataFieldPtr.Length(); + + while( dataLeft > 0 ) + { + TInt nextTokenStart = iTempDataFieldPtr.Find( KLogsDataFldNameDelimiter ); + TPtrC8 delim( iTempDataFieldPtr ); + + // Check if there are double delimeter \t\t marks. + // If \t in the end of the string, dont' try to check the next one! + if ( ( (nextTokenStart + KOneChar) < iTempDataFieldPtr.Length() ) && + ( iTempDataFieldPtr[ nextTokenStart + KOneChar ] == KLogsDataFldNameDelimiter()[ 0 ] ) ) + { + // Contact link needs to be decoded. Each delimiter has been duplicated to logs data. + TInt tokenStretch = 0; + // Delimiter pairs are skipped here and correct token place or end of data is set. + do + { + delim.Set( iTempDataFieldPtr.Mid( nextTokenStart + KTwoChars ) ); + tokenStretch = delim.Find( KLogsDataFldNameDelimiter ); + if ( KErrNotFound == tokenStretch ) + { + // No more double delimiters of different data fields remaining, so take rest of data + tokenStretch = delim.Length(); + } + nextTokenStart += ( tokenStretch + KTwoChars ); + }while( iTempDataFieldPtr.Length() > nextTokenStart + KOneChar && + iTempDataFieldPtr[ nextTokenStart + KOneChar ] == KLogsDataFldNameDelimiter()[ 0 ] ); + } + + if( nextTokenStart > iTempDataFieldPtr.Length() || nextTokenStart < 0 ) + { + nextTokenStart = iTempDataFieldPtr.Length(); + } + + TPtrC8 nameValue = iTempDataFieldPtr.Left( nextTokenStart ); //Let's inspect on the left side of field delimiter token + TPtrC8 name; + TPtrC8 value; + + TInt delimiterStart = nameValue.Find( KLogsDataFldValueDelimiter ); + if( delimiterStart > iTempDataFieldPtr.Length() || delimiterStart < 0 ) + { + name.Set( nameValue ); + //No value. Initialised to null in above (TPtrC8 value) + } + else + { + name.Set( iTempDataFieldPtr.Left( delimiterStart ) ); + TInt length = nameValue.Length() - delimiterStart - 1; + value.Set( iTempDataFieldPtr.Mid( delimiterStart + 1, length) );//Mid(TInt aPos, TInt aLength) + } + + //Below a minor attempt to slightly speed up the string comparisons: If value already found, no need to compare same name anymore. + //Most likely there is VT, VOIP or POC tag in the beginning of data field if any tags. + if( !iVT && name.Compare( KLogsDataFldTag_VT ) == 0 ) + { + iVT = ETrue; + } + else if( !iCNAP && name.Compare( KLogsDataFldTag_CNAP ) == 0 ) + { + iCNAP = ETrue; + } + else if( !iEmerg && name.Compare( KLogsDataFldTag_Emergency ) == 0 ) + { + iEmerg = ETrue; + } + else if( !iPoC && name.Compare( KLogsDataFldTag_POC ) == 0 ) + { + iPoC = ETrue; + } + else if( !iVoIP && name.Compare( KLogsDataFldTag_IP ) == 0 ) + { + iVoIP = ETrue; + } + //iDataType: internal PoC data (the value relates to the TPoCOperationTypeId enumeration) + else if( iDataType == KErrNotFound && name.Compare( KLogsDataFldTag_Type ) == 0 ) //No negative numbers in value so + { //this should not execute more than once + TLex8 lex; + lex = value; + lex.Val( iDataType ); //TLex: if parsing error, iDataType remains in it's original value + } + //Consider optimising these (below) in case there's tag but no value (in those cases these comparisons + //are executed more than just once + else if( !iURL8->Size() && name.Compare( KLogsDataFldTag_URL ) == 0 ) + { + delete iURL8; //Exist for sure + iURL8 = 0; + iURL8 = HBufC8::NewL( value.Length() ); + TPtr8 ptr = iURL8->Des(); + ptr.Copy( value ); //Copy the data to our own instance of HBufC* that is alive as long as *this exist + } + else if( !iMyAddress8->Size() && name.Compare( KLogsDataFldTag_MA ) == 0 ) + { + delete iMyAddress8; //Exist for sure + iMyAddress8 = 0; + iMyAddress8 = HBufC8::NewL( value.Length() ); + TPtr8 ptr = iMyAddress8->Des(); + ptr.Copy( value ); //Copy the data to our own instance of HBufC* that is alive as long as *this exist + } + +// Sawfish VoIP changes >>>> + else if( !iServiceId && name.Compare( KLogsDataFldTag_ServiceId ) == 0 ) + { + // get the 'iServiceId' from the value + TLex8 lex( value ); + TUint32 temp( iServiceId ); + TInt err = lex.Val( iServiceId , EDecimal ); + if( KErrNone != err ) + { + //if an error occurred we leave the service id unchanged + iServiceId = temp; + } + } + else if ( !iContactLink + && name.Compare( KLogsDataFldTag_ContactLink ) == 0 ) + { + iContactLink = value.AllocL(); + TPtr8 linkPtr( iContactLink->Des() ); + + TInt doubleDelim = linkPtr.Find( KLogsDoubleDataFldNameDelimiter ); + // Remove duplicated delimiter(s) + while( KErrNotFound != doubleDelim ) + { + linkPtr.Delete( doubleDelim, KOneChar ); + doubleDelim = linkPtr.Find( KLogsDoubleDataFldNameDelimiter ); + } + } +// <<<< Sawfish VoIP changes + + /***************************************************************************** + + else if( !iDataSent && name.Compare( KLogsDataFldTag_DataSent ) == 0 ) + { + TLex8 lex; + lex = value; + lex.Val( iDataSent ); //TLex: if parsing error, iDataSent remains in it's original value + } + else if( !iDataReceived && name.Compare( KLogsDataFldTag_DataReceived ) == 0 ) + { + TLex8 lex; + lex = value; + lex.Val( iDataReceived ); //TLex: if parsing error, iDataReceived remains in it's original value + } + else if( !iProfile->Size() && name.Compare( KLogsDataFldTag_Profile ) == 0 ) + { + delete iProfile; + iProfile = 0; + iProfile = HBufC8::NewL( value.Length() ); + TPtr8 ptr = iProfile->Des(); + ptr.Copy( value ); //Copy the data to our own instance of HBufC* that is alive as long as *this exist + } + else if( !iId->Size() && name.Compare( KLogsDataFldTag_ID ) == 0 ) + { + delete iId; + iId = 0; + iId = HBufC8::NewL( value.Length() ); + TPtr8 ptr = iId->Des(); + ptr.Copy( value ); //Copy the data to our own instance of HBufC* that is alive as long as *this exist + } + *****************************************************************************/ + + + //Process remaining data + dataLeft = iTempDataFieldPtr.Length() - nextTokenStart -1; //Remaining data on the right side of token + + if( dataLeft > 0 ) + { + nameValue.Set( iTempDataFieldPtr.Right( dataLeft )); //Continue with remaining data on the right side of token + iTempDataFieldPtr.Set( nameValue ); + } + } + } + + + +// ---------------------------------------------------------------------------- +// CLogsEventData::ALS +// ---------------------------------------------------------------------------- +// +TBool CLogsEventData::ALS() const + { + return iALS; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::CNAP +// ---------------------------------------------------------------------------- +// +TBool CLogsEventData::CNAP() const + { + return iCNAP; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::VT +// ---------------------------------------------------------------------------- +// +TBool CLogsEventData::VT() const + { + return iVT; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::PoC +// ---------------------------------------------------------------------------- +// +TBool CLogsEventData::PoC() const + { + return iPoC; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::VoIP +// ---------------------------------------------------------------------------- +// +TBool CLogsEventData::VoIP() const + { + return iVoIP; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::Url +// ---------------------------------------------------------------------------- +// +TDesC8& CLogsEventData::Url() const + { + return *iURL8; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::Profile +// ---------------------------------------------------------------------------- +// +TDesC8& CLogsEventData::Profile() const + { + return *iProfile; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::Id +// ---------------------------------------------------------------------------- +// +TDesC8& CLogsEventData::Id() const + { + return *iId; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::DataReceived +// ---------------------------------------------------------------------------- +// +TInt64 CLogsEventData::DataReceived() const + { + return iDataReceived; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::DataSent +// ---------------------------------------------------------------------------- +// +TInt64 CLogsEventData::DataSent() const + { + return iDataSent; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::Type +// ---------------------------------------------------------------------------- +// +TInt CLogsEventData::Type() const + { + if( iDataType == KErrNotFound ) + { + return EPoCNoOpTypeId; //Provide EPoCNoOpTypeId if type is absent or non numeric + } + else + { + return iDataType; + } + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::MyAddress +// ---------------------------------------------------------------------------- +// +TDesC8& CLogsEventData::MyAddress() + { + return *iMyAddress8; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::Emerg +// ---------------------------------------------------------------------------- +// +TBool CLogsEventData::Emerg() const + { + return iEmerg; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::MsgPartsNumber +// +// Msg parts. This info is meaningful only for sms events +// ---------------------------------------------------------------------------- +// +TInt CLogsEventData::MsgPartsNumber() const + { + return iMsgPartsNumber; + } + + +// Sawfish VoIP changes >>>> +// ---------------------------------------------------------------------------- +// CLogsEventData::ServiceId +// +// Returns the Service ID of the log event. +// ---------------------------------------------------------------------------- +// +TUint32 CLogsEventData::ServiceId() const + { + return iServiceId; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::GetContactLink +// +// Getter for contactlink +// ---------------------------------------------------------------------------- +// +TInt CLogsEventData::GetContactLink( TPtrC8& aContactLink ) + { + aContactLink.Set( KNullDesC8 ); + TInt result = KErrNotFound; + + if ( iContactLink ) + { + aContactLink.Set( iContactLink->Des() ); + result = KErrNone; + } + + return result; + } + +// ---------------------------------------------------------------------------- +// CLogsEventData::DataField +// +// Returns the unparsed data field information. +// ---------------------------------------------------------------------------- +// +TDesC8& CLogsEventData::DataField() const + { + return *iDataField; + } +// <<<< Sawfish VoIP changes