logsui/EngineSrc/CLogsSMSEventUpdater.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/logsui/EngineSrc/CLogsSMSEventUpdater.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,261 @@
+/*
+* 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: 
+*     Updates SMS events contact name to match one in contact model
+*
+*/
+
+
+// INCLUDE FILES
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <logengevents.h>
+#endif
+#include <logview.h>
+#include <logcli.h>
+#include "CLogsSMSEventUpdater.h"
+#include "MLogsObserver.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES  
+
+// CONSTANTS 
+const TInt KFieldId = 5;
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// ==================== LOCAL FUNCTIONS ====================
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+// ----------------------------------------------------------------------------
+// CLogsSMSEventUpdater::
+// ----------------------------------------------------------------------------
+//
+CLogsSMSEventUpdater::CLogsSMSEventUpdater(
+    RFs& aFsSession,
+    MLogsObserver* aObserver ) :
+        CLogsBaseUpdater( aFsSession, aObserver )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsSMSEventUpdater::
+// ----------------------------------------------------------------------------
+//
+CLogsSMSEventUpdater* CLogsSMSEventUpdater::NewL(
+    RFs& aFsSession,
+    MLogsObserver* aObserver,
+    CVPbkPhoneNumberMatchStrategy::TVPbkPhoneNumberMatchFlags aMatchFlags )
+    {
+    CLogsSMSEventUpdater* self = new ( ELeave ) CLogsSMSEventUpdater( aFsSession, aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL( aMatchFlags );
+    CleanupStack::Pop();
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsSMSEventUpdater::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CLogsSMSEventUpdater::ConstructL( CVPbkPhoneNumberMatchStrategy::TVPbkPhoneNumberMatchFlags aMatchFlags )
+    {
+    BaseConstructL( aMatchFlags );
+    iLogViewEvent = CLogViewEvent::NewL( *iLogClient, *this );
+    iFilter->SetEventType( KLogShortMessageEventTypeUid );
+    iFilter->SetFlags( KLogEventContactSearched );
+    iFilter->SetNullFields( ELogFlagsField );
+    CActiveScheduler::Add( this );
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsSMSEventUpdater::~CLogsSMSEventUpdater
+// ----------------------------------------------------------------------------
+//
+CLogsSMSEventUpdater::~CLogsSMSEventUpdater()
+    {
+    }
+
+
+// ----------------------------------------------------------------------------
+// CLogsSMSEventUpdater::StartRunningL
+// ----------------------------------------------------------------------------
+//
+void CLogsSMSEventUpdater::StartRunningL()
+    {
+    Cancel();
+    
+    if( iLogViewEvent->SetFilterL( *iFilter, iStatus ) )  //returns true, if found log events
+        {
+        iState = EStateActive;
+        iPhase = EFilter;
+        SetActive();
+        }
+    else if( iObserver )
+        {  
+        iState = EStateSMSUpdaterFinished;
+        iObserver->StateChangedL( this );
+        }
+    }
+    
+// ----------------------------------------------------------------------------
+// CLogsSMSEventUpdater::ContinueRunningL
+// ----------------------------------------------------------------------------
+//
+void CLogsSMSEventUpdater::ContinueRunningL( TInt aFieldId )
+    {
+    if( aFieldId != KErrNotFound )    //Set remote party etc only if a contact was found
+        {
+        TBuf<KFieldId> fieldText;
+        fieldText.Append( aFieldId );
+    	iEvent->SetRemoteParty( *iName );  //iName set in the base class
+    	
+        // iEvent->SetSubject( fieldText );
+        }
+    
+    //We set ContactSearched flag on, so next time we'll skip this entry and do not 
+    //attempt again update remote party (even if we did not find remote party for it).
+    //Also, KLogEventContactSearched events only are accepted to 
+    //EventListView (CLogsMainReader::SetOneFilterLC).
+    iEvent->SetFlags( KLogEventContactSearched ); 
+    iLogClient->ChangeEvent( *iEvent, iStatus );
+    SetActive();
+    }
+
+
+// ----------------------------------------------------------------------------
+// CLogsSMSEventUpdater::RunL
+// ----------------------------------------------------------------------------
+//
+void CLogsSMSEventUpdater::RunL()
+    {
+    if( iStatus == KErrNone )
+        {
+            switch( iPhase )
+            {
+			case EFilter:
+				if( iLogViewEvent->FirstL( iStatus ) )  //If there's at least one entry in view, let's process it
+					{
+                    iState = EStateActive;
+					iPhase = ERead;
+                    SetActive();
+					}
+                else
+                    {
+                    iState = EStateFinished;
+                    }
+				break;
+
+            case ERead:
+                {
+
+				iEvent->CopyL( iLogViewEvent->Event() );
+                iPhase = EUpdate;
+
+                // SAT sms events are not updated since they do not have number    
+                SearchRemotePartyL( iEvent->Number() );
+
+                //SetActive() is called when base class has got the contact and calls ContinueRunningL
+                }
+                break;
+
+			case EUpdate:
+                if( iLogViewEvent->FirstL( iStatus ) )  //If there's still at least one entry in view, let's continue 
+                    {                                   //processing it (this assumes that the event updated above has
+					iPhase = ERead;                     //has already disappeared from view and the "next" shows now as "first"
+                    SetActive();                        //in view).
+                    }
+                else
+                    {
+                    iState = EStateFinished;
+                    }
+         		break;
+
+			default:
+				break;
+            }
+        }
+    
+    if( iObserver ) //( <--not waiting here iState = EStateFinished!)
+        {
+        iObserver->StateChangedL( this );               //Inform for each change the observer that there's change in db (Maybe it's
+        }                                               //worthwhile to do it immediately (as here) instead of waiting iState to reach EStateFinished.  
+                                                        //This way more rereads are started but we get speedier update of list too. 
+                                                        //Note that change of db (above) also invokes call of HandleLogViewChangeEventAddedL (below) too.
+    }                                                   
+    
+
+// ----------------------------------------------------------------------------
+// CLogsSMSEventUpdater::HandleLogViewChangeEventAddedL
+//
+// When new event added to db, we need to start checking it in case the new event 
+// is messaging event (it is not shown before we update it by KLogEventContactSearched)
+// ----------------------------------------------------------------------------
+//
+void CLogsSMSEventUpdater::HandleLogViewChangeEventAddedL(
+    TLogId /*aId*/,
+    TInt /*aViewIndex*/,
+    TInt /*aChangeIndex*/,
+    TInt aTotalChangeCount )
+    {
+    if( aTotalChangeCount > 0 )
+        {
+        StartL();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsSMSEventUpdater::HandleLogViewChangeEventChangedL
+//
+// is this needed (as we don't know for sure if a messaging event is eventually 
+// constructed by changing the db, we cannot only trust to HandleLogViewChangeEventAddedL 
+// to take care of it, so let's keep the below too just in case...
+// ----------------------------------------------------------------------------
+//
+void CLogsSMSEventUpdater::HandleLogViewChangeEventChangedL(
+    TLogId /*aId*/,
+    TInt /*aViewIndex*/,
+    TInt /*aChangeIndex*/,
+    TInt aTotalChangeCount )
+    {
+    if( aTotalChangeCount > 0 )
+        {
+        StartL();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsSMSEventUpdater::HandleLogViewChangeEventDeletedL
+//
+// No need to do anything when delete notification received.
+// ----------------------------------------------------------------------------
+//
+void CLogsSMSEventUpdater::HandleLogViewChangeEventDeletedL(
+    TLogId /*aId*/,
+    TInt /*aViewIndex*/,
+    TInt /*aChangeIndex*/,
+    TInt /*aTotalChangeCount*/ )
+    {
+    }
+
+
+// End of File