diff -r 000000000000 -r 8466d47a6819 emailservices/emailserver/cmailhandlerplugin/src/fsmailmessagequeryhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailserver/cmailhandlerplugin/src/fsmailmessagequeryhandler.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,243 @@ +/* +* 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: This file implements class CFSMailMessageQueryHandler. +* +*/ + + +// +#include "emailtrace.h" +#include "CFSMailClient.h" +// + +#include "fsmailmessagequeryhandler.h" + + +CFSMailMessageQueryHandler* CFSMailMessageQueryHandler::NewL( + MFSNotificationHandlerMgr& aOwner ) + { + FUNC_LOG; + CFSMailMessageQueryHandler* self = + new (ELeave) CFSMailMessageQueryHandler( aOwner ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +CFSMailMessageQueryHandler::CFSMailMessageQueryHandler( + MFSNotificationHandlerMgr& aOwner ) : + CFSNotificationHandlerBase( aOwner ) + { + FUNC_LOG; + } + +void CFSMailMessageQueryHandler::ConstructL() + { + FUNC_LOG; + CFSNotificationHandlerBase::ConstructL(); + + // We are now ready to observe mail events + SetObserving( ETrue ); + } + +CFSMailMessageQueryHandler::~CFSMailMessageQueryHandler() + { + FUNC_LOG; + iNotifierInitiators.ResetAndDestroy(); + } + +void CFSMailMessageQueryHandler::NotifierInitiatorDoneL( + CFSNotificationHandlerNotifierInitiator* aInitiator ) + { + FUNC_LOG; + + TInt initiatorIndexer( FindInitiator( aInitiator ) ); + + if ( initiatorIndexer == KErrNotFound ) + { + User::Leave( KErrNotFound ); + } + + iNotifierInitiators.Remove( initiatorIndexer ); + CleanupStack::PushL( aInitiator ); + + MFSMailExceptionEventCallback* callback = aInitiator->Callback(); + if( callback ) + { + TFSMailMsgId mailboxId = aInitiator->MailBoxId(); + TFsEmailNotifierSystemMessageType msgType = aInitiator->MessageType(); + TBool response = aInitiator->GetLastResponse(); + callback->ExceptionEventCallbackL( mailboxId, msgType, response ); + } + + CleanupStack::PopAndDestroy( aInitiator ); + } + +TBool CFSMailMessageQueryHandler::CapabilitiesToContinueL( + TFSMailEvent /*aEvent*/, + TFSMailMsgId /*aMailbox*/, + TAny* /*aParam1*/, + TAny* /*aParam2*/, + TAny* /*aParam3*/ ) const + { + FUNC_LOG; + // Authentication query is always shown by instance of this class + // if necessary. + return ETrue; + } + +/* +static const TInt KTestCountMin( 0 ); +static const TInt KTestCountMax( 3 ); +_LIT( KTestText, "Very fancy test text." ); +*/ + +void CFSMailMessageQueryHandler::HandleEventL( + TFSMailEvent aEvent, + TFSMailMsgId aMailbox, + TAny* aParam1, + TAny* aParam2, + TAny* aParam3 ) + { + FUNC_LOG; + switch ( aEvent ) + { + case TFSEventException: + { + TFsEmailNotifierSystemMessageType& msgType = *static_cast( aParam1 ); + TDesC& msgText = *static_cast( aParam2 ); + MFSMailExceptionEventCallback* callback = static_cast( aParam3 ); + + + ShowMessageQueryL( aMailbox, msgType, msgText, callback ); + + break; + } + /* + case TFSEventMailboxOnline: + { + // ONLY FOR TESTING + static TInt testCounter( KTestCountMin ); + + testCounter++; + if( testCounter > KTestCountMax ) + { + testCounter = KTestCountMin; + } + + TFsEmailNotifierSystemMessageType msgType = static_cast( testCounter ); + + ShowMessageQueryL( aMailbox, msgType, KTestText(), NULL ); + + break; + } + */ + default: + { + break; + } + } + } + + +void CFSMailMessageQueryHandler::ShowMessageQueryL( + TFSMailMsgId aMailbox, + TFsEmailNotifierSystemMessageType aMessageType, + const TDesC& aCustomMessageText, + MFSMailExceptionEventCallback* aCallback ) + { + FUNC_LOG; + + TInt index( FindInitiator( aMailbox, aMessageType ) ); + + // Only one message query is permitted for one mailbox-message type + // combination. So one mailbox can have several message query dialogs + // open, if they are not of the same type. On the other hand, two + // or more mailboxes can show the same message. + if ( index == KErrNotFound ) + { + + CFSMailBox* mailBox( + MailClient().GetMailBoxByUidL( aMailbox ) ); + User::LeaveIfNull( mailBox ); + CleanupStack::PushL( mailBox ); + TDesC& mailboxName( mailBox->GetName() ); + + CFSNotificationHandlerNotifierInitiator* newNotifierInitiator = + CFSNotificationHandlerNotifierInitiator::NewL( *this, iOwner ); + CleanupStack::PushL( newNotifierInitiator ); + + newNotifierInitiator->SetMailBoxId( aMailbox ); + newNotifierInitiator->SetMessageType( aMessageType ); + newNotifierInitiator->SetCallback( aCallback ); + + newNotifierInitiator->RequestMessageQueryL( + mailboxName, + aMessageType, + aCustomMessageText ); + + iNotifierInitiators.AppendL( newNotifierInitiator ); + CleanupStack::Pop( newNotifierInitiator ); + CleanupStack::PopAndDestroy( mailBox ); + } + else + { + // notifierInitiator exists so we are already showing + // this message query for this mailbox. Let's not + // show/queue a new one. + } + } + + +TInt CFSMailMessageQueryHandler::FindInitiator( + CFSNotificationHandlerNotifierInitiator* aInitiator ) const + { + FUNC_LOG; + return iNotifierInitiators.Find( aInitiator ); + } + +TInt CFSMailMessageQueryHandler::FindInitiator( + TFSMailMsgId aMailBoxId, + TFsEmailNotifierSystemMessageType aMessageType ) const + { + FUNC_LOG; + TInt initiatorCount( iNotifierInitiators.Count() ); + TInt initiatorIndexer( 0 ); + + while ( initiatorIndexer < initiatorCount ) + { + if( iNotifierInitiators[initiatorIndexer]->MailBoxId() == aMailBoxId && + iNotifierInitiators[initiatorIndexer]->MessageType() == aMessageType ) + { + return initiatorIndexer; + } + + ++initiatorIndexer; + } + + return KErrNotFound; + } + + +void CFSMailMessageQueryHandler::TurnNotificationOn() + { + FUNC_LOG; + } + +void CFSMailMessageQueryHandler::TurnNotificationOff() + { + FUNC_LOG; + } +