logsui/EngineSrc/CLogsEvent.cpp
changeset 0 e686773b3f54
--- /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 <logwrap.hrh>
+#include <AiwPoCParameters.h>  //EPoCAdhocDialoutGroupMO etc...
+#include <CPhCltEmergencyCall.h>
+
+#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<TInt8>( aDirection );
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsEvent::SetEventUid
+// ----------------------------------------------------------------------------
+//
+void CLogsEvent::SetEventUid( const TUid aUid )
+    {
+    iUid = aUid;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsEvent::SetEventType
+// ----------------------------------------------------------------------------
+//
+void CLogsEvent::SetEventType( const TLogsEventType aEventType )
+    {
+    iEventType = static_cast<TInt8>( 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<TLogsDirection>( iDirection );
+    }
+
+ // ----------------------------------------------------------------------------
+// CLogsEvent::EventUid
+// ----------------------------------------------------------------------------
+//
+TUid CLogsEvent::EventUid() const
+    {
+    return iUid;
+    }
+
+ // ----------------------------------------------------------------------------
+// CLogsEvent::EventType
+// ----------------------------------------------------------------------------
+//
+TLogsEventType CLogsEvent::EventType() const
+    {
+    return static_cast<TLogsEventType>( 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
+