diff -r 4697dfb2d7ad -r 238255e8b033 messagingapp/msgui/appengine/src/conversationmsgstorehandler.cpp --- /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 +#include +#include +#include + +// 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& 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& 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