messagingapp/msgui/appengine/src/conversationmsgstorehandler.cpp
changeset 23 238255e8b033
child 25 84d9eb65b26f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgui/appengine/src/conversationmsgstorehandler.cpp	Fri Apr 16 14:56:15 2010 +0300
@@ -0,0 +1,416 @@
+/*
+* Copyright (c) 2008 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:  
+*
+*/
+
+#include "conversationmsgstorehandler.h"
+#include "draftsmodel.h"
+// SYSTEM INCLUDES
+#include <StringLoader.h>
+#include <ccsdefs.h> 
+#include <mmsconst.h>
+#include <SendUiConsts.h>
+
+// CONSTANTS
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// Default constructor.
+// ---------------------------------------------------------
+//
+ConversationMsgStoreHandler::ConversationMsgStoreHandler():
+    iMsvSession(NULL),iDraftEntry(NULL),iDraftMessages(NULL),mDraftsModel(NULL)
+    {
+    TRAP_IGNORE(InitL());
+    }
+
+// ---------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------
+//
+ConversationMsgStoreHandler::~ConversationMsgStoreHandler()
+    {
+    if ( iDraftEntry )
+        {
+        delete iDraftEntry;
+        iDraftEntry = NULL;
+        }
+
+    if( iMsvSession )
+        {
+        delete iMsvSession;
+        iMsvSession = NULL;
+        }
+
+    if ( iDraftMessages )
+        {
+        iDraftMessages->Reset();
+        delete iDraftMessages;
+        iDraftMessages = NULL;
+        }
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+void ConversationMsgStoreHandler::InitL( )
+    {
+    iMsvSession = CMsvSession::OpenSyncL(*this);
+    }
+
+// ---------------------------------------------------------
+// ConversationMsgStoreHandler::HandleSessionEventL()
+// ---------------------------------------------------------
+//
+void ConversationMsgStoreHandler::HandleSessionEventL(TMsvSessionEvent aEvent,
+        TAny* aArg1, TAny* aArg2, TAny* aArg3)
+    {   
+    //args
+    if(aArg1 == NULL || aArg2 == NULL)
+        {   
+        return;
+        }
+
+    //start, processing the event
+    CMsvEntrySelection* selection=NULL;
+    TMsvId target = 0;
+    TMsvId source = 0;
+    selection= (CMsvEntrySelection*)aArg1;
+    target = *(TMsvId*)aArg2; // target (current) parent
+    if(aArg3 != NULL)
+        {
+        source = *(TMsvId*)aArg3; // source parent
+        }
+    //process for draft messages only
+    if ( target == KMsvDraftEntryIdValue)
+        {
+        switch( aEvent )
+            {
+            //case EMsvEntriesCreated:
+            case EMsvEntriesChanged:
+            case EMsvEntriesMoved:
+                {
+                TMsvEntry entry;
+                TMsvId service;
+                TInt error= KErrNone;
+
+                for( TInt i=0 ; i < selection->Count() ; ++i )
+                    {
+                    error = iMsvSession->GetEntry(selection->At(i),service,entry);
+                    if (KErrNone == error)
+                        {
+                        // process only visible entries
+                        if (entry.Visible() && IsMtmSupported(entry.iMtm.iUid))
+                            {
+                                if(mDraftsModel && mDraftsModel->isReady())
+                                {
+                                    mDraftsModel->addRow(entry);
+                                }
+                            }
+                        }
+                    }
+                }
+                break;
+
+            case EMsvEntriesDeleted:
+                {
+                for( TInt i=0 ; i < selection->Count() ; ++i )
+                    {
+                    TMsvId id = selection->At( i );
+                    if(mDraftsModel && mDraftsModel->isReady())
+                        {
+                        mDraftsModel->deleteRow(id);
+                        }
+                    }
+                }
+                break;
+            }//end switch 
+        }
+    else if(KMsvDraftEntryIdValue == source)
+        {
+        //if message is moved from drafts to other folder
+        // it needs to be removed.
+        if(aEvent == EMsvEntriesMoved)
+            {
+            for( TInt i=0 ; i < selection->Count() ; ++i )
+                {
+                TMsvId id = selection->At( i );
+                if(mDraftsModel && mDraftsModel->isReady())
+                    {
+                    mDraftsModel->deleteRow(id);
+                    }
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// ConversationMsgStoreHandler::MsgStatus
+// ---------------------------------------------------------
+//
+TCsMmsNotificationMsgState ConversationMsgStoreHandler::
+MmsNotificationStatus( TInt aMsvId )
+    {
+    TMsvId dummy = 0x0;
+    
+    TMsvEntry entry;
+    iMsvSession->GetEntry(aMsvId, dummy, entry);
+    
+    TCsMmsNotificationMsgState status = EMsgStatusNull;
+
+    // operationMask includes operation type. It is not bitmap but ordinal number. 
+    // It does not include operation status and result
+    TInt operationMask = (entry.iMtmData2 & KMmsOperationIdentifier) ;
+
+    // Note! Ongoing operation resets every bit of operation type, operation status
+    // and result. E.g. If message has been forwarded and then fetching starts, 
+    // information about forwarding is lost
+
+    if( ( entry.iMtmData1 & KMmsMessageTypeMask ) == KMmsMessageMNotificationInd )
+        {
+        if(     operationMask == KMmsOperationFetch 
+                &&  OperationOngoing( entry ) )
+            { 
+            // It's in retrieving state
+            status = EMsgStatusRetrieving;
+            }
+        else if(    operationMask == KMmsOperationForward
+                &&  OperationOngoing( entry ) )
+            { 
+            // It's in forwarding state
+            status = EMsgStatusForwarding;
+            }
+        else if(    operationMask == KMmsOperationForward
+                &&  OperationFinished( entry )
+                &&  !( entry.iMtmData2 & KMmsOperationResult ) )
+            { 
+            // It's been forwarded succesfully
+            status = EMsgStatusForwarded;
+            }
+        else if(    operationMask == KMmsOperationFetch 
+                &&  OperationFinished( entry )
+                &&   (  entry.iMtmData2 & KMmsOperationResult 
+                ||  entry.iError ) )
+            { 
+            // Fetch has been failed
+            status = EMsgStatusFailed;
+            }
+        else if(    operationMask == KMmsOperationDelete
+                &&  OperationFinished( entry )
+                &&  !( entry.iMtmData2 & KMmsOperationResult ) )
+            { 
+            // It's been deleted succesfully
+            status = EMsgStatusDeleted;
+            }
+        else 
+            {   // Normal waiting state
+            status = EMsgStatusReadyForFetching;
+            }
+        }
+
+    return status;
+    }
+
+// ---------------------------------------------------------
+// ConversationMsgStoreHandler::OperationOngoing
+// ---------------------------------------------------------
+//
+TBool ConversationMsgStoreHandler::OperationOngoing( const TMsvEntry& aEntry ) const
+    {
+    return (    aEntry.iMtmData2 & KMmsOperationOngoing 
+            &&  !( aEntry.iMtmData2 & KMmsOperationFinished ) );
+    }
+
+// ---------------------------------------------------------
+// ConversationMsgStoreHandler::OperationFinished
+// ---------------------------------------------------------
+//
+TBool ConversationMsgStoreHandler::OperationFinished( 
+    const TMsvEntry& aEntry ) const
+    {
+    return (    aEntry.iMtmData2 & KMmsOperationFinished
+            &&  !( aEntry.iMtmData2 & KMmsOperationOngoing ) );
+    }
+
+// ---------------------------------------------------------
+// ConversationMsgStoreHandler::MarkMessagesReadL
+// ---------------------------------------------------------
+//
+void ConversationMsgStoreHandler::MarkMessagesReadL(RArray<TInt>& aIdArray)
+    {    
+    for ( int index = 0; index < aIdArray.Count(); index++ )
+        {
+        TMsvId id = aIdArray[index];
+        CMsvEntry* cEntry = NULL;
+        TRAPD(err, cEntry = iMsvSession->GetEntryL(id));
+        if ( err == KErrNotFound )
+            continue; // Entry is already deleted.
+        TMsvEntry entry = cEntry->Entry();
+        if ( entry.Unread() ) 
+            {
+            // Mark the entry as read
+            entry.SetUnread( EFalse );
+            cEntry->ChangeL( entry );
+            }
+        delete cEntry;
+        }
+    }
+
+// ---------------------------------------------------------
+// ConversationMsgStoreHandler::DeleteMessages
+// ---------------------------------------------------------
+//
+void ConversationMsgStoreHandler::DeleteMessages(RArray<TInt>& aIdArray)
+{
+    for(int index=0;index < aIdArray.Count() ;++index)
+    {
+        TMsvId id = aIdArray[index];
+        iMsvSession->RemoveEntry(id);
+    }   
+}
+
+// ---------------------------------------------------------
+// ConversationMsgStoreHandler::DeleteMessagesL
+// ---------------------------------------------------------
+//
+CMsvSession& ConversationMsgStoreHandler::GetMsvSession()
+{
+    return *iMsvSession;
+}
+
+// ---------------------------------------------------------
+// ConversationMsgStoreHandler::FetchDraftsMessages
+// ---------------------------------------------------------
+//
+void ConversationMsgStoreHandler::FetchDraftMessages(DraftsModel* draftsModel)
+    {
+    mDraftsModel = draftsModel;
+    iState = EReadDrafts;
+    TCallBack callback = TCallBack(ProcessDraftMessages, (TAny*) this);
+    iIdle = CIdle::NewL(CActive::EPriorityStandard);
+    iIdle->Start(callback);
+    }
+
+// -----------------------------------------------------------------------------
+// ConversationMsgStoreHandler::ProcessDraftMessages
+// CIdle callback 
+// -----------------------------------------------------------------------------
+//
+TInt ConversationMsgStoreHandler::ProcessDraftMessages(TAny* aArg)
+    {
+    ConversationMsgStoreHandler* handler = (ConversationMsgStoreHandler*) aArg; 
+    TInt ok = 0;
+    TRAPD(err, ok = handler->ProcessDraftMessagesL());
+    return ((err == KErrNone) && ok);
+    }
+
+// ---------------------------------------------------------
+// ConversationMsgStoreHandler::ProcessDraftMessagesL
+// ---------------------------------------------------------
+//
+TInt ConversationMsgStoreHandler::ProcessDraftMessagesL()
+    {
+    switch(iState)
+        {
+        case EReadDrafts:
+            {
+            iDraftEntry = iMsvSession->GetEntryL(KMsvDraftEntryIdValue);
+           
+            iDraftMessages = iDraftEntry->ChildrenL();    
+            iDraftMessageCount = iDraftEntry->Count();
+
+            if ( iDraftMessageCount ) 
+                {
+                iState = EProcessDrafts;
+                }
+            else
+                {
+                iState = EComplete; // no draft messages
+                mDraftsModel->setReady(); //ready to handle dynamic events
+                CleanupL();
+                return 0; //DONE
+                }
+            return 1;
+            }
+        case EProcessDrafts:
+            {
+            if ( iDraftMessageCount ) 
+                {
+                iDraftMessageCount--;
+                TMsvEntry entry = iDraftEntry->ChildDataL(
+                        iDraftMessages->At(iDraftMessageCount));
+                
+                // process only visible entries
+                if (entry.Visible() && IsMtmSupported(entry.iMtm.iUid))
+                {
+                //add message to model
+                mDraftsModel->addRow(entry);
+                }
+                //continue to process other draft messages
+                iState = EProcessDrafts;
+                }
+            else
+                {
+                iState = EComplete;
+                mDraftsModel->setReady(); //ready to handle dynamic events
+                CleanupL();
+                return 0; // DONE
+                }
+            return 1; 
+            }
+        }
+
+    return 0;
+    }
+
+// -----------------------------------------------------------------------------
+// ConversationMsgStoreHandler::CleanupL()
+// Helper function for state machine cleanup
+// -----------------------------------------------------------------------------
+//
+void ConversationMsgStoreHandler::CleanupL()
+    {
+    if ( iDraftEntry )
+        {
+        delete iDraftEntry;
+        iDraftEntry = NULL;
+        }
+
+    if ( iDraftMessages )
+        {
+        iDraftMessages->Reset();
+        delete iDraftMessages;
+        iDraftMessages = NULL;
+        }
+
+    iDraftMessageCount = 0;
+    }
+
+// -----------------------------------------------------------------------------
+// ConversationMsgStoreHandler::IsMtmSupported()
+// 
+// -----------------------------------------------------------------------------
+//
+TBool ConversationMsgStoreHandler::IsMtmSupported(long uid)	
+    {
+    if ( KSenduiMtmSmsUidValue == uid || KSenduiMtmMmsUidValue == uid )
+        {
+        return ETrue;
+        }	
+    return EFalse;
+    }
+// End of file