diff -r 000000000000 -r e686773b3f54 logsui/EngineSrc/CLogsEvent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/EngineSrc/CLogsEvent.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,584 @@ +/* +* Copyright (c) 2002 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 +#include +#include //EPoCAdhocDialoutGroupMO etc... +#include + +#include "CLogsEvent.h" +#include "CLogsEventData.h" +#include "LogsEngConsts.h" +#include "LogsApiConsts.h" //Additional event UIDs + +// CONSTANTS +const TInt KMaxDuplicates = 99; + +#ifdef _DEBUG +_LIT(KPanicMsg,"CLogsEvent"); +#endif + + +// ---------------------------------------------------------------------------- +// CLogsEvent::NewLC +// ---------------------------------------------------------------------------- +// +CLogsEvent* CLogsEvent::NewLC() + { + CLogsEvent* self = new (ELeave) CLogsEvent; + CleanupStack::PushL( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::CLogsEvent +// ---------------------------------------------------------------------------- +// +CLogsEvent::CLogsEvent() + { + iRemoteParty = 0; + iNumber = 0; + iLogsEventData = 0; + iRingDuration = 0; + iNumberFieldType = -1; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::~CLogsEvent +// ---------------------------------------------------------------------------- +// +CLogsEvent::~CLogsEvent() + { + delete iRemoteParty; + delete iNumber; + delete iLogsEventData; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::InitializeEventL +// ---------------------------------------------------------------------------- +// +void CLogsEvent::InitializeEventL( + const CLogEvent& aSource, + TLogsEventStrings aStrings, + TLogsModel aModel ) + { + delete iRemoteParty; + iRemoteParty = 0; + delete iNumber; + iNumber = 0; + + delete iLogsEventData; + iLogsEventData = 0; + + SetDuplicates( 0 ); + SetDirection( EDirUndefined ); + SetEventType( ETypeUsual ); + SetALS(EFalse); + SetNumberFieldType(-1); + + //For SMS'es part data is packed into data field (by sms stack), so in this case there is no + //need to try to parse S60 specific data from it). Later this parsing can be move here from + TBool readMessageParts = ( + aSource.EventType() == KLogShortMessageEventTypeUid || + aSource.EventType() == KLogsEngMmsEventTypeUid ); + + MLogsEventData* logsEventData = CLogsEventData::NewL( aSource.Data(), readMessageParts ) ; + SetLogsEventData( logsEventData ); //Ownership transferred to this object + + // TIME NOT needed in event list view (skip to optimise performance of event list view) + if( aModel != ELogsMainModel ) + { + TTime universal; + TTime home; + TTimeIntervalMinutes interval; + + universal.UniversalTime(); + home.HomeTime(); + TInt err = home.MinutesFrom( universal, interval ); + + if( err ) + { + SetTime( aSource.Time() ); + } + else + { + SetTime( aSource.Time() + interval ); + } + } + else + { + iTimeSet = EFalse; + } + + // LOG ID + SetLogId( aSource.Id() ); + + // DIRECTION + if( aSource.Direction() == aStrings.iInDirection || + aSource.Direction() == aStrings.iInDirectionAlt ) + { + SetDirection( EDirIn ); + } + else if( aSource.Direction() == aStrings.iOutDirection || + aSource.Direction() == aStrings.iOutDirectionAlt ) + { + SetDirection( EDirOut ); + } + else if( aSource.Direction() == aStrings.iMissedDirection ) + { + SetDirection( EDirMissed ); + } + + // UID + SetEventUid( aSource.EventType() ); + + // EVENT TYPE + TUid uid = aSource.EventType(); + + // Private, unknown or payphone call + if( aSource.RemoteParty().Length() > 0 ) + { + // if "Unknown" in remote party and no number/url, type of event is unknown + if( aSource.RemoteParty() == aStrings.iUnKnownNumber && + aSource.Number().Length() == 0 && + LogsEventData()->Url().Length() == 0 ) + { + SetEventType( ETypeUnknown ); + } + // if "Private" in remote party and no number/url, type of event is private + else if( aSource.RemoteParty() == KLogsPrivateText && + aSource.Number().Length() == 0 && + LogsEventData()->Url().Length() == 0 ) //"Private" LogsEngConsts.h + { + SetEventType( ETypePrivate ); + } + // if "Payphone" in remote party and no number/url, type of event is payphone + else if( aSource.RemoteParty() == KLogsPayphoneText && + aSource.Number().Length() == 0 && + LogsEventData()->Url().Length() == 0 ) //"Payphone" LogsEngConsts.h + { + SetEventType( ETypePayphone ); + } + } + // Poc group call + else if( LogsEventData()->PoC() && //EventData initialised already (above), so we can use dest here + ( TPoCOperationTypeId( LogsEventData()->Type() ) == EPoCAdhocDialoutGroupMO || //See TPoCOperationTypeId in + TPoCOperationTypeId( LogsEventData()->Type() ) == EPoCAdhocDialoutGroupMT || //AiwPoCParameters.h + TPoCOperationTypeId( LogsEventData()->Type() ) == EPoCPredefDialoutGroupMO || + TPoCOperationTypeId( LogsEventData()->Type() ) == EPoCPredefDialoutGroupMT ) ) + //Dialin groups (EPoCDialinGroupMO) are NOT group calls + { + SetEventType( ETypePoCGroupCall ); + } + // SAT event (SIM application toolkit) + else if( ( uid == KLogCallEventTypeUid || + uid == KLogDataEventTypeUid || + uid == KLogShortMessageEventTypeUid ) && + aSource.Number().Length() == 0 && + LogsEventData()->Url().Length() == 0 && //Url set above so we can use it here: If URL, + // then not SAT event but normal Voip or PoC call + ( aSource.Direction() == aStrings.iOutDirection || + aSource.Direction() == aStrings.iOutDirectionAlt ) ) + { + SetEventType( ETypeSAT ); + } + // Fallback in case entry wrongly written (is unknown but no "unknown" in remote party) + else if ( ( aSource.RemoteParty().Length() == 0 ) && + ( aSource.Number().Length() == 0 ) && + LogsEventData()->Url().Length() == 0 ) //Url set above so we can use it here + { + SetEventType( ETypeUnknown ); + } + + // Emergency call. + if( aSource.Number().Length() > 0 ) + { + if( IsEmergencyNumberL( aSource.Number()) ) // The new Emergency call API tells this is an emergency number + { + SetEventType( ETypeEmerg ); + } + } + + // NUMBER + if( EventType() == ETypeUsual || EventType() == ETypeEmerg ) + { + if( aSource.Number().Length() ) + { + SetNumber( aSource.Number().AllocL() ); + } + } + + // REMOTE PARTY + if( EventType() == ETypeUsual || EventType() == ETypePoCGroupCall ) + { + if( aSource.RemoteParty().Length() ) + { + SetRemoteParty( aSource.RemoteParty().AllocL() ); + } + } + + + //NUMBER FIELD TYEP + if( EventType() == ETypeUsual ) + { + if( aSource.Subject().Length() ) + { + TLex lex( aSource.Subject() ); + TInt tmp; + TInt err = lex.Val( tmp ); + if( KErrNone == err ) + { + SetNumberFieldType( tmp ); + } + } + } + + // Set ALS on/off. A logical AND of KLogEventALS and the event flags passed in. + SetALS( (aSource.Flags() & KLogEventALS ) ); + + // We set iIsRead on/off according to flags for indicate new missed calls feature. + // Used in missed calls view only. + if (aSource.Direction() == aStrings.iMissedDirection) + { + // A logical AND of KLogEventRead and the event flags passed in. + SetIsRead(aSource.Flags() & KLogEventRead); + } + else // Otherwise set to already read + { // so dialled and received views + SetIsRead(ETrue); // wont show the icon + } + + //For ring duation feature + if ( aSource.Direction() == aStrings.iMissedDirection ) + { + SetDirection( EDirMissed ); + SetRingDuration( aSource.Duration() ); + } + } + + +// ---------------------------------------------------------------------------- +// CLogsEvent::IsEmergencyNumber +// Checks wether the number is an emergency number +// ---------------------------------------------------------------------------- + +TBool CLogsEvent::IsEmergencyNumberL(const TDesC& aNumber) + { + TBool isEmergencyNumber(EFalse); + + + // Check first the hardcoded values "112" and "911" + // plus the possible tag Phone app might have set + if ( aNumber.Compare( KLogsEmergencyCall ) == 0 || //112 (however,not in e.g cdma (iStaticEmerg is false)) + aNumber.Compare( KLogsEmergencyCall911 ) == 0 || //911 + LogsEventData()->Emerg()) //Other emergency numbers that Phone app logs using data tag EMERG + { + isEmergencyNumber = ETrue; + } + + + // If the above does not prove the number to be an emergency number + // check number using phoneclient emergencycall API + else if (aNumber.Length() <= KPhCltEmergencyNumberSize) + { + CPhCltEmergencyCall* emergencyCallAPI = CPhCltEmergencyCall::NewL(NULL); + TPhCltEmergencyNumber emergNumber = aNumber; + + if (emergencyCallAPI) + { + TInt result = emergencyCallAPI->IsEmergencyPhoneNumber(emergNumber, + isEmergencyNumber ); + + delete emergencyCallAPI; + if ( result != KErrNone ) + { + return EFalse; + } + } + } + + return isEmergencyNumber; + } + + +// ---------------------------------------------------------------------------- +// CLogsEvent::SetALS() +// ---------------------------------------------------------------------------- +// +void CLogsEvent::SetALS( TBool aALS ) + { + iALS = aALS; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::SetLogId +// ---------------------------------------------------------------------------- +// +void CLogsEvent::SetLogId( const TLogId aLogId ) + { + iLogId = aLogId; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::SetNumber +// ---------------------------------------------------------------------------- +// +void CLogsEvent::SetNumber( HBufC* aNumber ) + { + delete iNumber; + iNumber = 0; + iNumber = aNumber; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::SetRemoteParty +// ---------------------------------------------------------------------------- +// +void CLogsEvent::SetRemoteParty( HBufC* aRemoteParty ) + { + delete iRemoteParty; + iRemoteParty = 0; + iRemoteParty = aRemoteParty; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::SetDirection +// ---------------------------------------------------------------------------- +// +void CLogsEvent::SetDirection( const TLogsDirection aDirection ) + { + iDirection = static_cast( aDirection ); + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::SetEventUid +// ---------------------------------------------------------------------------- +// +void CLogsEvent::SetEventUid( const TUid aUid ) + { + iUid = aUid; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::SetEventType +// ---------------------------------------------------------------------------- +// +void CLogsEvent::SetEventType( const TLogsEventType aEventType ) + { + iEventType = static_cast( aEventType ); + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::ALS() +// ---------------------------------------------------------------------------- +// +TBool CLogsEvent::ALS() const + { + return iALS; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::LogId +// ---------------------------------------------------------------------------- +// +TLogId CLogsEvent::LogId() const + { + return iLogId; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::SetIsRead +// ---------------------------------------------------------------------------- +void CLogsEvent::SetIsRead(const TBool aIsRead) + { + iIsRead = aIsRead; + } + + +// ---------------------------------------------------------------------------- +// CLogsEvent::Number +// ---------------------------------------------------------------------------- +// +HBufC* CLogsEvent::Number() + { + return iNumber; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::RemoteParty +// ---------------------------------------------------------------------------- +// +HBufC* CLogsEvent::RemoteParty() + { + return iRemoteParty; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::Direction +// ---------------------------------------------------------------------------- +// +TLogsDirection CLogsEvent::Direction() const + { + return static_cast( iDirection ); + } + + // ---------------------------------------------------------------------------- +// CLogsEvent::EventUid +// ---------------------------------------------------------------------------- +// +TUid CLogsEvent::EventUid() const + { + return iUid; + } + + // ---------------------------------------------------------------------------- +// CLogsEvent::EventType +// ---------------------------------------------------------------------------- +// +TLogsEventType CLogsEvent::EventType() const + { + return static_cast( iEventType ); + } + + +// ---------------------------------------------------------------------------- +// CLogsEvent::IsRead +// ---------------------------------------------------------------------------- + TBool CLogsEvent::IsRead() const + { + return iIsRead; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::RingDuration +// +// For ring duation feature +// ---------------------------------------------------------------------------- +// +TLogDuration CLogsEvent::RingDuration() const + { + return iRingDuration; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::SetRingDuration +// ---------------------------------------------------------------------------- +// +void CLogsEvent::SetRingDuration( TLogDuration aRingDuration ) + { + iRingDuration = aRingDuration; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::LogsEventData +// ---------------------------------------------------------------------------- +// +MLogsEventData* CLogsEvent::LogsEventData() const + { + return iLogsEventData; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::SetLogsEventData +// ---------------------------------------------------------------------------- +// +void CLogsEvent::SetLogsEventData( MLogsEventData* aLogsEventData ) + { + delete iLogsEventData; + iLogsEventData = 0; + iLogsEventData = aLogsEventData; + } + + + +/////////////////////////////////////////////////////////////////////////////// +// +// Additional data that is only needed in specific views +// +/////////////////////////////////////////////////////////////////////////////// + + +// ---------------------------------------------------------------------------- +// CLogsEvent::SetTime +// +// Time needed in recent views and in detail view (not needed in event view) +// ---------------------------------------------------------------------------- +// +void CLogsEvent::SetTime( const TTime aTime ) + { + iTime = aTime; + iTimeSet = ETrue; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::Time +// ---------------------------------------------------------------------------- +// +TTime CLogsEvent::Time() const + { + // Time not needed in event list view, so this should not be called in those circumstances + __ASSERT_DEBUG( iTimeSet, User::Panic(KPanicMsg, KErrNotSupported) ); + return iTime; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::SetDuplicates +// +// Duplicates needed only in missed calls view +// ---------------------------------------------------------------------------- +// +void CLogsEvent::SetDuplicates( const TInt8 aDuplicates ) + { + iDuplicates = aDuplicates; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::Duplicates +// ---------------------------------------------------------------------------- +// +TInt8 CLogsEvent::Duplicates() const + { + if( iDuplicates <= KMaxDuplicates ) + { + return iDuplicates; + } + return KMaxDuplicates; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::SetNumberFieldType +// ---------------------------------------------------------------------------- +// +void CLogsEvent::SetNumberFieldType( const TInt aNumberFieldType ) + { + iNumberFieldType = aNumberFieldType; + } + +// ---------------------------------------------------------------------------- +// CLogsEvent::NumberFieldType +// ---------------------------------------------------------------------------- +// +TInt CLogsEvent::NumberFieldType() const + { + return iNumberFieldType; + } + +// End of file +