phoneclientserver/CallUI/Src/CaUiEngine/CaUiMessageSender.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:03 +0100
branchRCL_3
changeset 20 987c9837762f
parent 19 7d48bed6ce0c
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2004 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:  Launches Sendui Editor.
*
*/




//  INCLUDES
#include 	"CaUiMessageSender.h" 

#include    <coemain.h>     	// CCoeEnv
#include    <CallUI.rsg>  		// Resources.

#include    <msvids.h>    		// KUidMsvLocalServiceMtmValue

#include    <sendui.h>     		// CSendAppUi, CSendUi
#include    <CMessageData.h>    // Message data for CSendUi
#include    <featmgr.h>   		// Feature manager
#include 	"cauilogger.h"		// Call Ui Logger

// CONSTANTS
// The reconnect query options granularity.
#ifdef RD_UNIFIED_EDITOR
const TInt KCaUiReConQueryOptionsArrayGranularity = 3;
#else // RD_UNIFIED_EDITOR
const TInt KCaUiReConQueryOptionsArrayGranularity = 4;
#endif // RD_UNIFIED_EDITOR

const TInt KMtmPop3Uid = 0x10001029;
const TInt KMtmImap4Uid = 0x1000102a;
const TInt KUidEmail = 0x10001028;
const TInt KUidPostCard = 0x10207245; 

// -----------------------------------------------------------------------------
// CCaUiMessageSender::CCaUiMessageSender
// 
// C++ constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CCaUiMessageSender::CCaUiMessageSender()
    {
    }


// -----------------------------------------------------------------------------
// CCaUiMessageSender::~CCaUiMessageSender
// 
// Destructor.
// -----------------------------------------------------------------------------
//
CCaUiMessageSender::~CCaUiMessageSender()
    {
    
    CAUILOGSTRING("CALLUI: >>> CCaUiMessageSender::~CCaUiMessageSender()");
    
    if ( iMsgTypes )
        {
        iMsgTypes->Reset();
        delete iMsgTypes;
        }

    if( iSession ) 
        {
        iSession->Cancel();    
        }
    delete iSession;
        
    if( iSendUi ) 
        {    
    	delete iSendUi;   
        }
        
    CAUILOGSTRING("CALLUI: <<< CCaUiMessageSender::~CCaUiMessageSender()");    
    }


// -----------------------------------------------------------------------------
// CCaUiMessageSender::NewL
// 
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CCaUiMessageSender* CCaUiMessageSender::NewL()
    {
    
    CAUILOGSTRING("CALLUI: >>> CCaUiMessageSender::NewL()");
    
    CCaUiMessageSender* self = new( ELeave ) CCaUiMessageSender ();
	
	CAUILOGSTRING("CALLUI: <<< CCaUiMessageSender::NewL()");
	
    return self;
    }

// ---------------------------------------------------------
// CCaUiMessageSender::CreateNewMessageL
// Create a new message of the given type, in the given location
// ---------------------------------------------------------
//
void CCaUiMessageSender::CreateNewMessageL(
    TInt aMessageType,
    MDesC16Array* aRealAddress,
    MDesC16Array* aAliases,
    CRichText* aRichText )
    {
    
    CAUILOGSTRING("CALLUI: >>> CCaUiMessageSender::CreateNewMessageL()");
       
    TRAPD( err, CreateSendUiL());
    if ( err != KErrNone )
	    User::Leave( KErrGeneral );		
    
    //Launch message editor standalone
    TUid mtmUid = { aMessageType };
    
    CMessageData* messageData = CMessageData::NewL();
    CleanupStack::PushL( messageData );
    if ( aRichText )
        {
        messageData->SetBodyTextL( aRichText );
        }
    
    // Set real address and check if aliases exist
    if ( aRealAddress )
        {
        TBool aAliasesExist = EFalse;
        if ( aAliases &&
             aAliases->MdcaCount() == aRealAddress->MdcaCount() )
            {
            aAliasesExist = ETrue;
            }
        for ( TInt i=0; i < aRealAddress->MdcaCount(); i++ )
            {
            if ( aAliasesExist )
                {
                messageData->AppendToAddressL(
                    aRealAddress->MdcaPoint( i ),
                    aAliases->MdcaPoint( i ) );
                }
            else
                {
                messageData->AppendToAddressL(
                    aRealAddress->MdcaPoint( i ) );
                }
            }
        }
        
    iSendUi->CreateAndSendMessageL( mtmUid, messageData, KNullUid, EFalse );
    CleanupStack::PopAndDestroy(); // messageData
    
    CAUILOGSTRING("CALLUI: <<< CCaUiMessageSender::CreateNewMessageL()");
    }

// ---------------------------------------------------------
// CCaUiMessageSender::CreateSendUiL
// ---------------------------------------------------------
//
void CCaUiMessageSender::CreateSendUiL()
    {
    CAUILOGSTRING("CALLUI: >>> CCaUiMessageSender::CreateSendUiL()");
    
    // Create instance of send ui.
    if( !iSendUi )
        {
        iSendUi = CSendUi::NewL();
        }
        
    CAUILOGSTRING("CALLUI: <<< CCaUiMessageSender::CreateSendUiL()");    
    }

// ---------------------------------------------------------
// CCaUiMessageSender::MessageTypesArray
// ---------------------------------------------------------
const CUidNameArray& CCaUiMessageSender::
    MessageTypesArrayL()
    {
    
    CAUILOGSTRING("CALLUI: >>> CCaUiMessageSender::MessageTypesArrayL()");
    
    delete iMsgTypes;
    iMsgTypes = NULL;

    CUidNameArray* msgTypes = new ( ELeave ) 
        CUidNameArray( KCaUiReConQueryOptionsArrayGranularity ); 
    CleanupStack::PushL( msgTypes );
    UpdateMessageTypesArrayL( msgTypes );
    CleanupStack::Pop();
    iMsgTypes = msgTypes;

	CAUILOGSTRING("CALLUI: <<< CCaUiMessageSender::MessageTypesArrayL()");

    return *iMsgTypes;
    }

// ---------------------------------------------------------
// CCaUiMessageSender::UpdateMessageTypesArrayL
// Updates the array of UIDs which defines the MTM types for which the user
// can create new messages.
// ---------------------------------------------------------
void CCaUiMessageSender::UpdateMessageTypesArrayL(
    CUidNameArray* aMsgTypes )
    {
    
    CAUILOGSTRING("CALLUI:>>> CCaUiMessageSender::UpdateMessageTypesArrayL()");
    
    aMsgTypes->Reset();

    FeatureManager::InitializeLibL();
    //Read MTM types from resource file
    TResourceReader resReader;
    CCoeEnv::Static()->CreateResourceReaderLC( resReader, 
        NEW_MESSAGE_TYPES_ARRAY );
    
    TInt count = resReader.ReadInt16();

    for ( TInt i = 0; i < count; i++ )
        {
        TInt32 id = resReader.ReadInt32();
        HBufC* name = resReader.ReadHBufCL();
        CleanupStack::PushL( name );

        switch( id )
            {
            case KUidEmail:
                {
                if ( IsMailboxDefinedL() )
                    {
                    aMsgTypes->AppendL( TUidNameInfo( TUid::Uid( id ), *name ) );
                    }
                break;
                }
            case KUidPostCard:
                {
                if ( FeatureManager::FeatureSupported( KFeatureIdMmsPostcard ) )
                    {
                    aMsgTypes->AppendL( TUidNameInfo( TUid::Uid( id ), *name ) );
                    }
                break;
                }
            default:
                {
                aMsgTypes->AppendL( TUidNameInfo( TUid::Uid( id ), *name ) );
                break;  
                }
            }
            
        CleanupStack::PopAndDestroy( name ); 
        }
    
    CleanupStack::PopAndDestroy();//resReader 
    FeatureManager::UnInitializeLib();
    
    CAUILOGSTRING("CALLUI:<<< CCaUiMessageSender::UpdateMessageTypesArrayL() end");
    }

// ---------------------------------------------------------
// CCaUiMessageSender::CreateMessageServiceConnectionL
// ---------------------------------------------------------
//
void CCaUiMessageSender::CreateMessageServiceConnectionL()
    {
    CAUILOGSTRING("CALLUI:>>> CCaUiMessageSender::CreateMessageServiceConnectionL()");
    
    if ( !iSession )
        {
        iSession = CMsvSession::OpenSyncL( *this );
        }
    CAUILOGSTRING("CALLUI:<<< CCaUiMessageSender::CreateMessageServiceConnectionL()");    
    }

// ---------------------------------------------------------
// CCaUiMessageSender::IsMailboxDefinedL
// ---------------------------------------------------------
//
TBool CCaUiMessageSender::IsMailboxDefinedL()
    {
    CAUILOGSTRING("CALLUI:>>> CCaUiMessageSender::IsMailboxDefinedL()");
    
    CreateMessageServiceConnectionL();
    
    TBool isDefined = EFalse;
    CMsvEntry* root = iSession->GetEntryL( KMsvRootIndexEntryId );

    TInt count = root->Count();
    for ( TInt i = 0; i < count; i++ )
        {
        const TMsvEntry& tentry = (*root)[i];
        if ( tentry.iMtm.iUid == KMtmPop3Uid || 
            tentry.iMtm.iUid == KMtmImap4Uid )
            {
            isDefined = ETrue;
            break;
            }
        }
    delete root;
    
    CAUILOGSTRING("CALLUI:<<< CCaUiMessageSender::IsMailboxDefinedL()");
    return isDefined;
    }


// ---------------------------------------------------------
// CCaUiMessageSender::HandleSessionEventL
// ---------------------------------------------------------
void CCaUiMessageSender::HandleSessionEventL(TMsvSessionEvent aEvent, 
        TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/)
    {
    CAUILOGSTRING("CALLUI:>>> CCaUiMessageSender::HandleSessionEventL()");
    
    CreateMessageServiceConnectionL();

    switch ( aEvent )
        {
        case EMsvCloseSession:
            //Server close.
            delete iSession;
            iSession = NULL;
            CAUILOGSTRING("CALLUI:<<< CCaUiMessageSender::HandleSessionEventL(): case: EMsvCloseSession");
            break;
        default:
        	CAUILOGSTRING("CALLUI:<<< CCaUiMessageSender::HandleSessionEventL(): case: default");
            break;
        }
        
    }


// End of File