harvesterplugins/messaging/email/qtemailfetcher/qtemailfetcher.cpp
changeset 12 993ab30e92fc
parent 11 773be20e0a25
child 20 68cdadcf169e
--- a/harvesterplugins/messaging/email/qtemailfetcher/qtemailfetcher.cpp	Wed Jun 23 18:13:49 2010 +0300
+++ b/harvesterplugins/messaging/email/qtemailfetcher/qtemailfetcher.cpp	Tue Jul 06 14:17:22 2010 +0300
@@ -17,30 +17,30 @@
 
 #include "qtemailfetcher.h"
 #include <csearchdocument.h>
-#include <cpixmaindefs.h>
 #include <nmapiemailaddress.h>
 #include <nmapimessagebody.h>
 #include <nmapimailbox.h>
 #include <QTimer>
 #include <QDebug>
-//#include <QThread> //If we happen to use QThread::yieldCurrentThread()
+#include <qdatetime.h>
 
 //Symbian specific details; picked up from cemailplugin.cpp. 
 //Refactor it to cpixmaindefs.h
 _LIT(KMsgBaseAppClassGeneric, "root msg email");
 
 _LIT(KMsgSubject, "Subject");
+_LIT(KMsgSender, "Sender");
 _LIT(KMsgRecipients, "Recipients");
 _LIT(KMsgBody, "Body");
 _LIT(KMailBoxId, "MailBoxId");
 _LIT(KFolderId, "FolderId");
 _LIT(KHasAttachment, "HasAttachment");
 _LIT(KMailBoxName, "MailBoxName");
-_LIT(KFolderName, "FolderName");
+//_LIT(KFolderName, "FolderName");
 _LIT(KMimeTypeField, CPIX_MIMETYPE_FIELD);
 _LIT(KMimeTypeMsg, "Messages");
-
-
+_LIT(KAttachment, "Attachment");
+_LIT(KSentTime, "SentTime");
 
 //------------------------------------------------------------------------------
 QEmailFetcher::QEmailFetcher( MEmailItemObserver& aObserver )
@@ -59,11 +59,15 @@
 //------------------------------------------------------------------------------
 QEmailFetcher::~QEmailFetcher()
     {
-    iEmailEventNotifier->cancel();
+    if ( iEmailEventNotifier )
+       iEmailEventNotifier->cancel();
+    iMailBoxes.clear();
+    iFolders.clear();
     delete iEmailEventNotifier;
     delete iEmailService;
-    delete iMailBoxListings;
+    delete iEnvelopeListing;
     delete iMailFolderList;
+    delete iMailBoxListings;    
     }
 
 //------------------------------------------------------------------------------
@@ -76,7 +80,7 @@
         emailFetcher->iEmailService = new NmApiEmailService( emailFetcher );
         emailFetcher->iEmailEventNotifier =  new NmApiEventNotifier( emailFetcher );
         emailFetcher->iMailBoxListings = new NmApiMailboxListing( emailFetcher );
-        initialize( emailFetcher ); //Do the rest of the init.
+        emailFetcher->initialize( ); //Do the rest of the init.
     }catch(...){ //cleanup.
     qDebug() << "QEmailFetcher::newInstance ( Catch Block)";
         delete emailFetcher; 
@@ -93,24 +97,19 @@
 }
 
 //------------------------------------------------------------------------------
-void QEmailFetcher::initialize( QEmailFetcher* aThis ){
-    //The use of 'aThis' is because the current function is static.
+void QEmailFetcher::initialize( ){    
     qDebug() << "QEmailFetcher::initialize :START";
-    connect( aThis->iEmailService, SIGNAL(initialized(bool)), 
-             aThis, SLOT(emailServiceIntialized(bool)) );
-    aThis->iEmailService->initialise();
+    connect( iEmailService, SIGNAL(initialized(bool)), 
+             this, SLOT(emailServiceIntialized(bool)) );
+    iEmailService->initialise();
     //Monitor for Message changes
-    aThis->connect( aThis->iEmailEventNotifier, 
-                    SIGNAL(messageEvent(MessageEvent, quint64, quint64, QList<quint64>)),
-                    aThis, 
-                    SLOT(handleMessageEvent(MessageEvent, quint64, quint64, QList<quint64>)) );
-    //Monitor for Mailbox changes
-    aThis->connect( aThis->iEmailEventNotifier, 
-                    SIGNAL(mailboxEvent(MailboxEvent, QList<quint64>)),
-                    aThis, 
-                    SLOT(handlemailboxEvent(MailboxEvent, QList<quint64>)));
+    connect( iEmailEventNotifier, 
+             SIGNAL(messageEvent(EmailClientApi::NmApiMessageEvent, quint64, quint64, QList<quint64>)),
+             this, 
+             SLOT(handleMessageEvent(EmailClientApi::NmApiMessageEvent, quint64, quint64, QList<quint64>)) );
     //Start the monitoring
-    aThis->iEmailEventNotifier->start();
+    iEmailEventNotifier->start();
+    qDebug() << "QEmailFetcher::Started monitoring for Email message event";
     qDebug() << "QEmailFetcher::initialize :END";
 }
 
@@ -144,28 +143,12 @@
 }
 
 //------------------------------------------------------------------------------
-// TODO Remove this code if qt_QString2TPtrC works.
-// TODO If this function is used, remember to release memory.
-// Ownership with caller.
-//HBufC* qt_QString2HBufC(const QString& aString)
-//{
-//    HBufC *buffer;
-//#ifdef QT_NO_UNICODE
-//    TPtrC8 ptr(reinterpret_cast<const TUint8*>(aString.toLocal8Bit().constData()));
-//#else
-//    TPtrC16 ptr(qt_QString2TPtrC(aString));
-//#endif
-//    buffer = q_check_ptr(HBufC::New(ptr.Length()));
-//    buffer->Des().Copy(ptr);
-//    return buffer;
-//}
-
-CSearchDocument* getPartialSearchDocument( const NmApiMessageEnvelope& aEnvelope ) {
+CSearchDocument* getPartialSearchDocument( quint64 aEnvelopeId ) {
     qDebug() << "getPartialSearchDocument :START";
     CSearchDocument* doc = 0;
     QT_TRAP_THROWING(
         //Use qt_Qstring2TPtrC since we are working with <b>const</b> EmailMessageEnvelope.
-        doc = CSearchDocument::NewL( qt_QString2TPtrC( QString().setNum( aEnvelope.id() ) ), 
+        doc = CSearchDocument::NewL( qt_QString2TPtrC( QString().setNum( aEnvelopeId ) ), 
                                      KMsgBaseAppClassGeneric );        
         );
     qDebug() << "getPartialSearchDocument :END";
@@ -174,56 +157,95 @@
 } //anonymous namespace
 //------------------------------------------------------------------------------
 
-CSearchDocument* QEmailFetcher::getSearchDocument( const NmApiMessageEnvelope& aEnvelope ,quint64 aMailboxId, quint64 aFolderId ){
+CSearchDocument* QEmailFetcher::getSearchDocumentL( const NmApiMessageEnvelope& aEnvelope ,quint64 aMailboxId, quint64 aFolderId ){
     QList<NmApiEmailAddress> toList;
-    qDebug() << "QEmailFetcher::getSearchDocument :START";
+    qDebug() << "QEmailFetcher::getSearchDocumentL :START";
+    //We need ALL the recipients in a SINGLE field.
+    
     //Need to cast away const-ness since the get method is unfortunately not const.
     const_cast<NmApiMessageEnvelope&>(aEnvelope).getToRecipients( toList );
-
-    //We need ALL the recipients in a SINGLE field.
     QString recipients = "";
     for( int i=0; i<toList.length(); i++ )
-        recipients += toList.at( i ).displayName() + " "; //or should we get address?
-
+        {
+        qDebug() << "QEmailFetcher::To receipient displayname :"<< toList.at( i ).displayName() << "Address : "<<toList.at( i ).address();
+        recipients += toList.at( i ).displayName() + " ";
+        recipients += toList.at( i ).address() + " ";
+        }
+    // Get CC receipents
+    const_cast<NmApiMessageEnvelope&>(aEnvelope).getCcRecipients( toList );
+    for( int i=0; i<toList.length(); i++ )
+        {
+        qDebug() << "QEmailFetcher::CC receipient displayname :"<< toList.at( i ).displayName() << "Address : "<<toList.at( i ).address();
+        recipients += toList.at( i ).displayName() + " ";
+        recipients += toList.at( i ).address() + " ";
+        }
+    
     NmApiMessageBody body;
     //Cast away const-ness since the get method is unfortunately not const.
     //Returns void. Cannot check for success/failure.
     const_cast<NmApiMessageEnvelope&>(aEnvelope).getPlainTextBody( body ); 
     QString msgBody = body.content();
-
+    qDebug() << "QEmailFetcher::Body of mail using paintextAPI:"<< aEnvelope.plainText() ;
     CSearchDocument* doc = 0;
     QT_TRAP_THROWING(
     //Use qt_Qstring2TPtrC since we are working with <b>const</b> EmailMessageEnvelope.
     doc = CSearchDocument::NewL( qt_QString2TPtrC( QString().setNum( aEnvelope.id() ) ), 
                                  KMsgBaseAppClassGeneric );
-    doc->AddFieldL( KMimeTypeField, KMimeTypeMsg, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized | CDocumentField::EAggregateNo);
-    doc->AddFieldL( KMsgSubject, qt_QString2TPtrC( aEnvelope.subject() ), CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
-    doc->AddFieldL( KMsgRecipients, qt_QString2TPtrC( recipients ), CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
-    doc->AddFieldL( KMsgBody, qt_QString2TPtrC( msgBody ), CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
-    doc->AddFieldL( KMailBoxId, qt_QString2TPtrC( QString().setNum( aMailboxId ) ), CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized | CDocumentField::EAggregateNo );
-    doc->AddFieldL( KFolderId, qt_QString2TPtrC( QString().setNum( aFolderId ) ), CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized | CDocumentField::EAggregateNo );
-    doc->AddFieldL( KHasAttachment, qt_QString2TPtrC( QString().setNum( aEnvelope.hasAttachments() ) ), CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized | CDocumentField::EAggregateNo);
-//    NmApiMailbox aMailBox;
-//    iEmailService->getMailbox( aMailboxId, aMailBox );
-//    doc->AddFieldL( KMailBoxName, qt_QString2TPtrC(aMailBox.name()) , CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized );
-    //TODO : Add folder name field
-    //_LIT(KFolderName, "FolderName");
+    //Add the sender details
+    doc->AddFieldL( KMsgSender, qt_QString2TPtrC( const_cast<NmApiMessageEnvelope&>(aEnvelope).sender() ), 
+                    CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+    //Add the Mimetype
+    doc->AddFieldL( KMimeTypeField, KMimeTypeMsg, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized );
+    //Add the Subject field
+    doc->AddFieldL( KMsgSubject, qt_QString2TPtrC( aEnvelope.subject() ), 
+                    CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
+    //Add the recipients list (Includes To and CC fields)
+    doc->AddFieldL( KMsgRecipients, qt_QString2TPtrC( recipients ), 
+                    CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText );
+    //Add the email body
+    doc->AddFieldL( KMsgBody, qt_QString2TPtrC( msgBody ), 
+                    CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
+    //Add the mailboxid
+    doc->AddFieldL( KMailBoxId, qt_QString2TPtrC( QString().setNum( aMailboxId ) ), 
+                    CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized | CDocumentField::EAggregateNo );
+    //Add the folder Id
+    doc->AddFieldL( KFolderId, qt_QString2TPtrC( QString().setNum( aFolderId ) ), 
+                    CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized | CDocumentField::EAggregateNo );
+    //Add the attachment field. This field will be added only if there is any attachment.Details of the attachment
+    //are not added due to lack of email application support.
+    if ( aEnvelope.hasAttachments() )
+       doc->AddFieldL( KHasAttachment, KAttachment, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized);
+    //Add mailbox name
+    NmApiMailbox aMailBox;
+    iEmailService->getMailbox( aMailboxId, aMailBox );
+    doc->AddFieldL( KMailBoxName, qt_QString2TPtrC(aMailBox.name()) , 
+                    CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText );
+    
+    // Sent date time  KSentTime
+    QDateTime time = aEnvelope.sentTime();    
+    doc->AddFieldL( KSentTime, qt_QString2TPtrC(time.toString ()) , 
+                        CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
+    //TODO : Foldername is not harvested as there is no API exposed from email application to get the foldername based on folderID.
+    //This feature will be implemented as soon as we get supporting API's from Email team
+    
     //Adding subject and body to the excerpt. 
     QString excerpt ;
     excerpt = aEnvelope.subject();
     excerpt += msgBody ;
     doc->AddExcerptL( qt_QString2TPtrC(excerpt) );
     );
-    qDebug() << "QEmailFetcher::getSearchDocument :END";
+    qDebug() << "QEmailFetcher::getSearchDocumentL :END";
     return doc;
 }
 
 
 //------------------------------------------------------------------------------
-//Just to avoid duplication of the following two lines.
 void QEmailFetcher::NotifyHarvestingComplete(){
     qDebug() << "QEmailFetcher::NotifyHarvestingComplete :START";
     iCurrentMailboxIndex = iCurrentFolderIndex = 0;
+    //Free the iMailBoxes and iFolders
+    iMailBoxes.clear();
+    iFolders.clear();
     QT_TRAP_THROWING( iEmailObserver.HarvestingCompleted() );
     qDebug() << "QEmailFetcher::NotifyHarvestingComplete :END";
     return;
@@ -272,13 +294,14 @@
         qDebug() << "QEmailFetcher::processNextMailbox :END (harvesting completed)";
         return;
     }
-    
     //More mailboxes available.
     delete iMailFolderList; iMailFolderList = NULL;
     iMailFolderList = new NmApiFolderListing( this, iMailBoxes.at( iCurrentMailboxIndex++ ).id() );
     connect( iMailFolderList, SIGNAL(foldersListed( qint32 )), this, SLOT(handleMailFoldersListed( qint32)) );
-    const int waitForSeconds = 30; //TODO Move this constant out of here if needed elsewhere
-    QTimer::singleShot( waitForSeconds, iMailFolderList, SLOT( start()) );
+    iMailFolderList->start();
+   
+//    const int waitForSeconds = 30; //TODO Move this constant out of here if needed elsewhere
+//    QTimer::singleShot( waitForSeconds, iMailFolderList, SLOT( start()) );
     qDebug() << "QEmailFetcher::processNextMailbox :END (goto next mailbox)";
 }
 
@@ -310,7 +333,6 @@
         processNextMailbox();
         return;//Don't proceed futher.
     }
-    
     //More folders to process.
     //Already set to NULL in constructor, so safe to call delete first time.
     delete iEnvelopeListing; iEnvelopeListing = NULL; 
@@ -337,15 +359,15 @@
         for( int i=0; i<envelopes.count(); i++ ) {
             const NmApiMessageEnvelope &envelope = envelopes.at( i );
             //Create document and call back observer.
-            QT_TRAP_THROWING( iEmailObserver.HandleDocumentL( getSearchDocument( envelope, iFolders.at( iCurrentFolderIndex -1 ).id(), iMailBoxes.at( iCurrentMailboxIndex-1 ).id() ), 
-                                                              ECPixAddAction ) );
+            QT_TRAP_THROWING( iEmailObserver.HandleDocumentL( getSearchDocumentL( envelope, iFolders.at( iCurrentFolderIndex -1 ).id(), 
+                                                                                 iMailBoxes.at( iCurrentMailboxIndex-1 ).id() ), ECPixAddAction ) );
         }
     }
     qDebug() << "QEmailFetcher::processMessages :END";
 }
 
 //------------------------------------------------------------------------------
-void QEmailFetcher::handleMessageEvent( NmApiMessageEvent aEvent, quint64 aMailboxId, quint64 aFolderId, QList<quint64> aMessageList){
+void QEmailFetcher::handleMessageEvent( EmailClientApi::NmApiMessageEvent aEvent, quint64 aMailboxId, quint64 aFolderId, QList<quint64> aMessageList){
     NmApiMessageEnvelope envelope;
     qDebug() << "QEmailFetcher::handleMessageEvent :START";
     const int messageCount = aMessageList.count();
@@ -356,7 +378,7 @@
             if( iEmailService->getEnvelope( aMailboxId, aFolderId, aMessageList.at( i ), envelope ) ){
                qDebug() << "QEmailFetcher::handleMessageEvent :HandleDocumentL";
                 QT_TRAP_THROWING( 
-                   iEmailObserver.HandleDocumentL( getSearchDocument( envelope, aMailboxId, aFolderId ), 
+                   iEmailObserver.HandleDocumentL( getSearchDocumentL( envelope, aMailboxId, aFolderId ), 
                            //Doing this simply avoids *duplicate* code for update action.
                            aEvent == MessageCreated ? ECPixAddAction : ECPixUpdateAction ) );
             }
@@ -364,56 +386,11 @@
     }
     else if( aEvent == MessageDeleted ) {
         qDebug() << "QEmailFetcher::handleMessageEvent :MessageDeleted";
-        //TODO We can do better. For delete, we dont have to create full document. Just the ID should be enough.
-        //We can have another function called getPartialSearchDocument so deletes will be faster.
         for( int i=0; i<messageCount; i++ ){
-            if( iEmailService->getEnvelope( aMailboxId, aFolderId, aMessageList.at( i ), envelope ) ){
                 qDebug() << "QEmailFetcher::handleMessageEvent :MessageDeleted : HandleDocumentL";
                 QT_TRAP_THROWING( 
-                iEmailObserver.HandleDocumentL( getPartialSearchDocument( envelope ), ECPixRemoveAction ) );
+                iEmailObserver.HandleDocumentL( getPartialSearchDocument( aMessageList.at( i ) ), ECPixRemoveAction ) );
             }
         }
     }
-    }
 }
-
-//--------------------------------------------------------------------------------------
-void QEmailFetcher::handlemailboxEvent( EmailClientApi::NmApiMailboxEvent event, QList<quint64> idlist ){
-    const int mailboxCount = idlist.count();    
-    if( event == MailboxCreated )
-        {
-        //New mailbox is created.Harvest the Mailbox name and all the folder names
-        }
-    else
-        {
-        //MailBox is deleted so delete the document related to all the mailbox and folders in the mailbox
-        }
-}
-
-CSearchDocument* QEmailFetcher::getMailboxorfolderSearchDocument( quint64 aMailboxId, quint64 aFolderId, TEmailDocType aDocType, QString aFoldername ){
-    
-    CSearchDocument* doc = 0;
-    QT_TRAP_THROWING(
-    //Use qt_Qstring2TPtrC since we are working with <b>const</b> EmailMessageEnvelope.
-            if ( aDocType == EEmailTypeFolder)
-                {
-                doc = CSearchDocument::NewL( qt_QString2TPtrC( QString().setNum( aFolderId ) ), 
-                                 KMsgBaseAppClassGeneric );
-                doc->AddFieldL( KFolderName, qt_QString2TPtrC(aFoldername) , CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized );
-                doc->AddFieldL( KFolderId, qt_QString2TPtrC( QString().setNum( aFolderId ) ), CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized );
-                }
-            else if ( aDocType == EEmailTypeMailBox )
-                {
-                doc = CSearchDocument::NewL( qt_QString2TPtrC( QString().setNum( aMailboxId ) ), 
-                                             KMsgBaseAppClassGeneric );
-                NmApiMailbox aMailBox;
-                iEmailService->getMailbox( aMailboxId, aMailBox );
-                doc->AddFieldL( KMailBoxName, qt_QString2TPtrC(aMailBox.name()) , CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized );
-                }
-            doc->AddFieldL( KMimeTypeField, KMimeTypeMsg, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
-            doc->AddFieldL( KMailBoxId, qt_QString2TPtrC( QString().setNum( aMailboxId ) ), CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized );
-
-    );
-    qDebug() << "QEmailFetcher::getSearchDocument :END";
-    return doc;
-}