harvesterplugins/messaging/smsmms/src/cmessageharvester.cpp
changeset 2 208a4ba3894c
child 26 367228f82b66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/harvesterplugins/messaging/smsmms/src/cmessageharvester.cpp	Mon May 03 12:32:15 2010 +0300
@@ -0,0 +1,288 @@
+/*
+* Copyright (c) 2010 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:  Harvester message plugin
+*
+*/
+
+
+//  INCLUDES 
+
+#include <e32base.h>
+#include <mtclreg.h>
+#include <mmsclient.h>
+#include <smsclnt.h>
+#include <smuthdr.h>
+#include <smsclnt.h>
+#include <smut.h>
+#include <gsmuelem.h>
+#include <msventry.h>
+#include <msvuids.h>
+#include <mmsconst.h>
+#include "cmessageharvester.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------------------------
+// CMessageHarvester::NewL
+// ---------------------------------------------------------------------------
+//
+CMessageHarvester* CMessageHarvester::NewL(  CMessagePlugin& aMessagePlugin, CMsvSession& aSession )
+	{
+	CMessageHarvester* self = new (ELeave) CMessageHarvester(  aMessagePlugin, aSession );
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CMessageHarvester::~CMessageHarvester
+// ---------------------------------------------------------------------------
+//
+CMessageHarvester::~CMessageHarvester()
+	{   
+	Cancel();  
+    delete iChildren;
+    iToBeSearchedFolders.Close();
+	}
+	  
+// ---------------------------------------------------------------------------
+// CMessageHarvester::CMessageHarvester
+// ---------------------------------------------------------------------------
+//
+CMessageHarvester::CMessageHarvester( CMessagePlugin& aMessagePlugin, CMsvSession& aSession  ) :
+	CActive(CActive::EPriorityIdle),
+	iMessagePlugin( aMessagePlugin ),
+	iMsvSession( aSession ),
+	iState(EStateIdle)
+	{
+	CActiveScheduler::Add( this );
+	}
+
+// ---------------------------------------------------------------------------
+// CMessageHarvester::StartHarvesting
+// ---------------------------------------------------------------------------
+//	
+void CMessageHarvester::StartHarvestingL()
+	{
+	// First, get message folders
+	GetMessageFoldersL();
+	
+	// Then, harvest them
+	iState = EStateNextFolder;
+	HandleNextRequest();
+	}
+
+// ---------------------------------------------------------------------------
+// CMessageHarvester::AddFolderWithSubFoldersL
+// ---------------------------------------------------------------------------
+//		
+void CMessageHarvester::AddFolderWithSubFoldersL( const TMsvId& aFolderId )
+	{
+	// Add a folder to the search list
+	User::LeaveIfError(iToBeSearchedFolders.Append(aFolderId));	
+	CMsvEntry* folderEntry = CMsvEntry::NewL(iMsvSession, aFolderId, TMsvSelectionOrdering(KMsvGroupByStandardFolders, EMsvSortByDetails, EFalse));
+	CleanupStack::PushL(folderEntry);	
+	ListSubFoldersL(*folderEntry);
+	CleanupStack::PopAndDestroy(folderEntry);
+	}
+
+// ---------------------------------------------------------------------------
+// CMessageHarvester::ListSubFoldersL
+// ---------------------------------------------------------------------------
+//	
+void CMessageHarvester::ListSubFoldersL(  const CMsvEntry& aFolderEntry ) 
+	{
+	// Only list "folder" children
+    CMsvEntrySelection* children = aFolderEntry.ChildrenL();
+	CleanupStack::PushL( children );
+
+	for ( TInt i=0; i < children->Count(); i++ )
+		{
+		TMsvId& childId = ( *children )[i];
+		const TMsvEntry& childEntry ( aFolderEntry.ChildDataL( childId ) );
+		if ( ( childEntry.iType == KUidMsvServiceEntry ) || 
+    		 ( childEntry.iType == KUidMsvFolderEntry ) )
+		    {
+		    // Add this folder to search list
+            AddFolderWithSubFoldersL( childId );		
+		    }
+		}
+	CleanupStack::PopAndDestroy();  // children
+	}
+	
+// ---------------------------------------------------------------------------
+// CMessageHarvester::GetMessageFoldersL
+// ---------------------------------------------------------------------------
+//
+void CMessageHarvester::GetMessageFoldersL()
+    {
+    // Get list of folders
+    CMsvEntry* rootEntry;
+    rootEntry = CMsvEntry::NewL( iMsvSession, KMsvRootIndexEntryIdValue,
+    TMsvSelectionOrdering( KMsvGroupByStandardFolders, EMsvSortByDetails, EFalse ) );
+    CleanupStack::PushL( rootEntry );
+	ListSubFoldersL( *rootEntry);
+	CleanupStack::PopAndDestroy( rootEntry );
+    }
+
+			
+// ---------------------------------------------------------------------------
+// CMessageHarvester::GetNextFolderL
+// ---------------------------------------------------------------------------
+//		
+void CMessageHarvester::GetNextFolderL()
+    {
+    if ( iToBeSearchedFolders.Count() > 0 )
+        
+    	{
+    	// Open the new folder
+        CMsvEntry* folder = CMsvEntry::NewL(
+	                            iMsvSession, 
+	                            iToBeSearchedFolders[0],
+	                            TMsvSelectionOrdering( KMsvGroupByStandardFolders, EMsvSortByDetails ));
+        
+        iCurrentFolder = iToBeSearchedFolders[0];
+        
+        // Get the message items from the folder
+        CleanupStack::PushL(folder);        
+        iChildren = folder->ChildrenWithTypeL( KUidMsvMessageEntry );
+        CleanupStack::PopAndDestroy( folder );
+        
+        // Remove current folder from the queue
+        iToBeSearchedFolders.Remove(0);
+        iState = EStateNextMessage;
+        HandleNextRequest();
+        }
+    else
+        {
+        // No more folders in the queue
+        iState = EStateIdle;
+        HandleNextRequest();      
+        }
+    }
+
+			
+// ---------------------------------------------------------------------------
+// CMessageHarvester::GetMessageId
+// ---------------------------------------------------------------------------
+//		    
+void CMessageHarvester::GetMessageIdL()
+    { 
+    if (iChildren && iChildren->Count() > 0)
+        {
+        // Take first item from list of message items, and give it for indexing
+        iMessagePlugin.MessageItemL((*iChildren)[0], ECPixAddAction, iCurrentFolder);
+        
+        // Delete the item from list
+        iChildren->Delete( 0 );   
+        if ( iChildren->Count() > 0 )
+            {
+            // Get the next message
+            iState = EStateNextMessage;
+            HandleNextRequest();      
+            }
+        else 
+            {
+            // No messages in this folder
+            iState = EStateNextFolder;
+            HandleNextRequest();      
+            }
+        }
+    else 
+        {
+        // Current folder dosen't contain any message items so change folder
+        iState = EStateNextFolder;
+        HandleNextRequest();      
+        }
+    }
+      
+// -----------------------------------------------------------------------------
+// CMessageHarvester::DoCancel
+// -----------------------------------------------------------------------------
+//   
+void CMessageHarvester::DoCancel()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CMessageHarvester::RunL
+// -----------------------------------------------------------------------------
+//   
+void CMessageHarvester::RunL()	
+	{
+	
+	 // Simple Round-Robin scheduling.
+    Deque();
+    CActiveScheduler::Add( this );
+    
+	switch (iState)
+		{
+	       case EStateIdle:
+	            {
+	            // Delete current folder items
+	            delete iChildren; 
+	            iChildren = NULL;
+	            
+	            // Started idling, close the folders
+	            iToBeSearchedFolders.Reset();
+
+	            // Update harvester status
+	            iMessagePlugin.HarvestingCompleted(KErrNone);	            
+	            break; 
+	    	    }    
+		    case EStateNextMessage:
+		        {
+		        // Get the next message
+		        GetMessageIdL();	
+		        break;	        
+		        }
+	        case EStateNextFolder:
+	            {
+	            // Delete current folder items
+	            delete iChildren; 
+	            iChildren = NULL;
+	            
+	            // Start harvesting folders. 
+	            GetNextFolderL();	         
+				break;
+	            }
+		}
+	}
+	         				
+// -----------------------------------------------------------------------------
+// CMessageHarvester::RunError
+// -----------------------------------------------------------------------------
+//   
+TInt CMessageHarvester::RunError( TInt aError )	
+	{
+	iState = EStateIdle;
+    iMessagePlugin.HarvestingCompleted(aError);
+	return KErrNone;
+	}
+	
+// ---------------------------------------------------------------------------
+// SetNextRequest
+// ---------------------------------------------------------------------------
+//
+void CMessageHarvester::HandleNextRequest()
+    {
+    if (!IsActive())
+        {
+        SetActive();
+        TRequestStatus* status = &iStatus;
+        User::RequestComplete( status, KErrNone );
+        }
+    }
+
+
+// End of File