diff -r 000000000000 -r 72b543305e3a mobilemessaging/unieditor/mtm/src/UniMtmUi.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/unieditor/mtm/src/UniMtmUi.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,1000 @@ +/* +* Copyright (c) 2005-2007 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: +* Provides Uni MTM UI methods. +* +*/ + + + +// INCLUDE FILES + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include //CErrorUI + +#include +#include +#include +#include +#include +#include +#include + +#include // link against centralrepository.lib +#include // for Central Repository keys +#include // additional headers variation flags. + // Currently MMS variation, no variataion for unieditor available. + +#include + +#include +#include +#include +#include + +#include + +#include + +#include + +#include "UniMtmUi.h" +#include "UniMtmPanic.h" +#include "UniMtmConst.h" +#include "UniClientMtm.h" + + +#include "UniEditorUids.hrh" + +// EXTERNAL FUNCTION PROTOTYPES + +extern void Panic( TUniMtmPanic aPanic ); + +// CONSTANTS + + +_LIT( KCharLeftAddressIterator, "<" ); +_LIT( KCharRightAddressIterator, ">" ); +_LIT( KMmsCharCommaAndSpace, ", " ); + +const TInt KMessageSize = 20; +const TInt KZero = 0; //constant for memory check +const TInt KMmsAdditionalCharsStringLength = 6; +const TUint KMmsLRMarker = 0x200E; + + +// MACROS + +// LOCAL CONSTANTS AND MACROS + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// ==================== LOCAL FUNCTIONS ==================== + +// --------------------------------------------------------- +// NewUniMtmUiL +// Factory function +// --------------------------------------------------------- +// +EXPORT_C CBaseMtmUi* NewUniMtmUiL( CBaseMtm& aMtm, CRegisteredMtmDll& aRegisteredDll ) + { + return CUniMtmUi::NewL( aMtm, aRegisteredDll ); + } + + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CUniMtmUi::CUniMtmUi +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CUniMtmUi::CUniMtmUi( CBaseMtm& aBaseMtm, CRegisteredMtmDll& aRegisteredMtmDll ) + : CBaseMtmUi( aBaseMtm, aRegisteredMtmDll ) + { + } + +// --------------------------------------------------------- +// CUniMtmUi::ConstructL +// Symbian OS default constructor can leave. +// --------------------------------------------------------- +// +void CUniMtmUi::ConstructL() + { + CBaseMtmUi::ConstructL(); + } + +// --------------------------------------------------------- +// CUniMtmUi::NewL +// Two-phased constructor. +// --------------------------------------------------------- +// +CUniMtmUi* CUniMtmUi::NewL( CBaseMtm& aBaseMtm, CRegisteredMtmDll& aRegisteredMtmDll ) + { + CUniMtmUi* self = new ( ELeave ) CUniMtmUi( aBaseMtm, aRegisteredMtmDll ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------- +// CUniMtmUi::~CUniMtmUi +// Destructor +// --------------------------------------------------------- +// +CUniMtmUi::~CUniMtmUi() + { + + } + + +// --------------------------------------------------------- +// CUniMtmUi::QueryCapability +// Capability check for UI mtm specific functionality. These should +// be minimal, as the default capability checking places are UI data MTM +// (UI) and client MTM (engine). +// --------------------------------------------------------- +TInt CUniMtmUi::QueryCapability( TUid aCapability, TInt& aResponse ) + { + return CBaseMtmUi::QueryCapability( aCapability, aResponse ); + } + +// --------------------------------------------------------- +// CUniMtmUi::CreateL +// Launches Uni editor for creating a new message. +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::CreateL( const TMsvEntry& aEntry, + CMsvEntry& aParent, + TRequestStatus& aStatus ) + { + __ASSERT_DEBUG( aEntry.iMtm == Type(), Panic( EUniWrongMtm ) ); + __ASSERT_DEBUG( aEntry.iType == KUidMsvMessageEntry, Panic( EUniNotAMessage ) ); + + if( MsvUiServiceUtilities::DiskSpaceBelowCriticalLevelL( + Session(), + KZero ) ) + { + User::Leave( KErrDiskFull ); + } + + return LaunchEditorApplicationL( aStatus, aParent.Session(), ECreateNewMessage ); + } + +// --------------------------------------------------------- +// CUniMtmUi::DeleteServiceL +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::DeleteServiceL( const TMsvEntry& /*aService*/, + TRequestStatus& /*aStatus*/ ) + { + User::Leave( KErrNotSupported ); + return NULL; + } + +// --------------------------------------------------------- +// CUniMtmUi::DeleteFromL +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::DeleteFromL( const CMsvEntrySelection& /*aSelection*/, + TRequestStatus& /*aStatus*/ ) + { + User::Leave( KErrNotSupported ); + return NULL; + } + +// --------------------------------------------------------- +// CUniMtmUi::CopyToL +// Copy local outbox entry to remote server = called when sending the entry from MCE outbox +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::CopyToL( const CMsvEntrySelection& aSelection, + TRequestStatus& aStatus ) + { + return CopyMoveToL( aSelection, aStatus, ETrue ); + } + +// --------------------------------------------------------- +// CUniMtmUi::MoveToL +// Move local outbox entry to remote server. +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::MoveToL( const CMsvEntrySelection& aSelection, + TRequestStatus& aStatus ) + { + return CopyMoveToL( aSelection, aStatus, EFalse ); + } + +// --------------------------------------------------------- +// CUniMtmUi::CopyMoveToL +// Performs either CopyToL or MoveToL operation. +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::CopyMoveToL( const CMsvEntrySelection& aSelection, + TRequestStatus& aStatus, TBool aCopyOnly ) + { + __ASSERT_DEBUG( iBaseMtm.Entry().Entry().iMtm==Type(), Panic( EUniWrongMtm ) ); + __ASSERT_DEBUG( iBaseMtm.Entry().Entry().iType==KUidMsvServiceEntry, Panic( EUniNotAService ) ); + + // --- Carry out the operation --- + TMsvEntry service ( BaseMtm().Entry().Entry() ); + // Get CMsvEntry of parent of messages to be sent + CMsvEntry* parentEntry = Session().GetEntryL( aSelection[0] ); + + CleanupStack::PushL( parentEntry ); + parentEntry->SetEntryL( parentEntry->Entry().Parent() ); + + // Do the copy/move + CMsvOperation* op = aCopyOnly ? + parentEntry->CopyL( aSelection, service.Id(), aStatus ) : + parentEntry->MoveL( aSelection, service.Id(), aStatus ); + + CleanupStack::PopAndDestroy( parentEntry ); + return op; + } + +// --------------------------------------------------------- +// CUniMtmUi::CopyFromL +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::CopyFromL(const CMsvEntrySelection& /*aSelection*/, + TMsvId /*aTargetId*/, + TRequestStatus& /*aStatus*/) + { + User::Leave( KErrNotSupported ); + return NULL; + } + +// --------------------------------------------------------- +// CUniMtmUi::MoveFromL +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::MoveFromL(const CMsvEntrySelection& /*aSelection*/, + TMsvId /*aTargetId*/, + TRequestStatus& /*aStatus*/) + { + User::Leave( KErrNotSupported ); + return NULL; + } + +// --------------------------------------------------------- +// CUniMtmUi::OpenL +// Handles request to open existing message server entry (message/service) +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::OpenL( TRequestStatus& aStatus ) + { + __ASSERT_DEBUG( iBaseMtm.Entry().Entry().iMtm==Type(), Panic( EUniWrongMtm ) ); + const TMsvEntry& entry = BaseMtm().Entry().Entry(); + __ASSERT_DEBUG( !entry.ReadOnly(), Panic( EUniWrongParameters )); + return EditL( aStatus ); + } + +// --------------------------------------------------------- +// CUniMtmUi::OpenL +// Opens the first entry in a selection +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::OpenL( TRequestStatus& aStatus, + const CMsvEntrySelection& aSelection ) + { + __ASSERT_DEBUG( iBaseMtm.Entry().Entry().iMtm==Type(), Panic( EUniWrongMtm ) ); + + BaseMtm().SwitchCurrentEntryL( aSelection[0] ); + return OpenL( aStatus ); + } + +// --------------------------------------------------------- +// CUniMtmUi::CloseL +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::CloseL( TRequestStatus& /*aStatus*/ ) + { + User::Leave( KErrNotSupported ); + return NULL; + } + +// --------------------------------------------------------- +// CUniMtmUi::CloseL +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::CloseL( TRequestStatus& /*aStatus*/, + const CMsvEntrySelection& /*aSelection*/ ) + { + User::Leave( KErrNotSupported ); + return NULL; + } + +// --------------------------------------------------------- +// CUniMtmUi::EditL +// Opens a message (editor) for editing. +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::EditL( TRequestStatus& aStatus ) + { + __ASSERT_DEBUG( iBaseMtm.Entry().Entry().iMtm==Type(), Panic( EUniWrongMtm ) ); + + CMsvOperation* msvoperation = NULL; + + switch ( iBaseMtm.Entry().Entry().iType.iUid ) + { + case KUidMsvMessageEntryValue: + { + if ( iBaseMtm.Entry().Entry().Connected() ) + { + User::Leave( KErrLocked ); + } + msvoperation = LaunchEditorApplicationL( aStatus, iBaseMtm.Entry().Session() ); + } + break; + + case KUidMsvServiceEntryValue: + case KUidMsvAttachmentEntryValue: // flow through + case KUidMsvFolderEntryValue: // flow through + default: + User::Leave( KErrNotSupported ); + break; + } + + return msvoperation; + } + +// --------------------------------------------------------- +// CUniMtmUi::EditL +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::EditL( TRequestStatus& aStatus, + const CMsvEntrySelection& aSelection ) + { + BaseMtm().SwitchCurrentEntryL( aSelection[0] ); + return EditL( aStatus ); + } + +// --------------------------------------------------------- +// CUniMtmUi::ViewL +// Opens the message for reading in Viewer. +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::ViewL( TRequestStatus& /*aStatus*/ ) + { + User::Leave( KErrNotSupported ); + return NULL; + } + +// --------------------------------------------------------- +// CUniMtmUi::ViewL +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::ViewL( TRequestStatus& /*aStatus*/, + const CMsvEntrySelection& /*aSelection*/ ) + { + User::Leave( KErrNotSupported ); + return NULL; + } + +// ----------------------------------------------------------------------------- +// CUniMtmUi::LaunchEditorApplicationL() +// Does the actual opening. +// ----------------------------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::LaunchEditorApplicationL( TRequestStatus& aStatus, + CMsvSession& aSession, + TEditorType aEditorType ) + { + TEditorParameters temp; + + if ( iBaseMtm.HasContext() ) + { + temp.iId = iBaseMtm.Entry().EntryId(); + } + + switch( aEditorType ) + { + case EReadOnly: + case ESpecialEditor: + User::Leave( KErrNotSupported ); + break; + case ECreateNewMessage: + temp.iFlags|=EMsgCreateNewMessage ; + temp.iId=KMsvDraftEntryIdValue; + break; + case EEditExisting: //fall through + default: + break; + }; + + temp.iFlags &= ~( EMtmUiFlagEditorPreferEmbedded|EMtmUiFlagEditorNoWaitForExit ); + temp.iFlags |= ( Preferences() & EMtmUiFlagEditorPreferEmbedded?EMsgLaunchEditorEmbedded:EMsgLaunchEditorStandAlone ); + + TPckgC paramPack( temp ); + + return MsgEditorLauncher::LaunchEditorApplicationL( + aSession, + Type(), + aStatus, + temp, + KNullDesC(), + paramPack ); + } + +// --------------------------------------------------------- +// CUniMtmUi::ForwardL +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::ForwardL( TMsvId /*aDestination*/, + TMsvPartList /*aPartList*/, + TRequestStatus& /*aCompletionStatus*/ ) + { + User::Leave( KErrNotSupported ); + return NULL; + } + + +// --------------------------------------------------------- +// CUniMtmUi::ReplyL +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::ReplyL( TMsvId /*aDestination*/, + TMsvPartList /*aPartList*/, + TRequestStatus& /*aCompletionStatus*/ ) + { + User::Leave( KErrNotSupported ); + return NULL; + } + +// --------------------------------------------------------- +// CUniMtmUi::CancelL +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::CancelL( TRequestStatus& /*aStatus*/, + const CMsvEntrySelection& /*aSelection*/ ) + { + User::Leave( KErrNotSupported ); + return NULL; + } + +// --------------------------------------------------------- +// CUniMtmUi::InvokeSyncFunctionL +// --------------------------------------------------------- +// +void CUniMtmUi::InvokeSyncFunctionL( TInt aFunctionId, + const CMsvEntrySelection& aSelection, + TDes8& aParameter ) + { + CBaseMtmUi::InvokeSyncFunctionL( aFunctionId, aSelection, aParameter ); + } + +// --------------------------------------------------------- +// CUniMtmUi::InvokeAsyncFunctionL +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::InvokeAsyncFunctionL( TInt aFunctionId, + const CMsvEntrySelection& aSelection, + TRequestStatus& aCompletionStatus, + TDes8& aParameter ) + { + CMsvOperation* msvoperation = NULL; + + switch ( aFunctionId ) + { + case KMtmUiFunctionMessageInfo: + msvoperation = OpenMessageInfoL( aCompletionStatus, aParameter ); + break; + default: + msvoperation = CBaseMtmUi::InvokeAsyncFunctionL( aFunctionId, + aSelection, + aCompletionStatus, + aParameter); + break; + } + return msvoperation; + } + +// --------------------------------------------------------- +// CUniMtmUi::DisplayProgressSummary +// --------------------------------------------------------- +// +TInt CUniMtmUi::DisplayProgressSummary( const TDesC8& /*aProgress*/ ) const + { + // Not in use. + return KErrNone; + } + +// --------------------------------------------------------- +// CUniMtmUi::GetResourceFileName +// --------------------------------------------------------- +// +void CUniMtmUi::GetResourceFileName( TFileName& aFileName ) const + { + aFileName = KUniMtmResourceFile; + } + + +// --------------------------------------------------------- +// CUniMtmUi::OpenMessageInfoL(TRequestStatus& aCompletionStatus, TDes8& aParameter) +// Opens the Message Info popup. +// --------------------------------------------------------- +// +CMsvOperation* CUniMtmUi::OpenMessageInfoL( TRequestStatus& aCompletionStatus, + TDes8& aParameter ) + { + TInt popCount( 0 ); + + // get additional headers variation info + TInt addHeadersBitmask = 0; + + CRepository* repository = CRepository::NewL( KCRUidMuiuVariation ); + repository->Get( KMuiuMmsFeatures, addHeadersBitmask ); + delete repository; + repository = NULL; + + TBool priorityFeatureSupported = EFalse; + + // MMS Priority feature is enabled + if ( addHeadersBitmask & KMmsFeatureIdPrioritySupport ) + { + priorityFeatureSupported = ETrue; + } + + // The items for Info are read from the message entry. + // Note: Most of the stuff is in TMsvEntry, but not all -> MMS entry used all the way. + TMsvEntry entry = BaseMtm().Entry().Entry(); + __ASSERT_DEBUG( entry.iType == KUidMsvMessageEntry, Panic( EUniNotAMessage ) ); + __ASSERT_DEBUG( entry.iMtm==Type(), Panic( EUniWrongMtm ) ); + + static_cast( iBaseMtm ).LoadMessageL(); + + TUniMessageCurrentType currType = TUniMsvEntry::CurrentMessageType( entry ); + CMsgInfoMessageInfoDialog::TMessageInfoType infoType = + CMsgInfoMessageInfoDialog::ESmsEditor; + + TMsgInfoMessageInfoData infoData; + + // Subject + // TODO: When should we show subject? + // - MMS: yes + // - ordinary SMS: no? + // - SMS with header field + // - Email over SMS: yes? + infoData.iSubject.Set( static_cast( iBaseMtm ).SubjectL() ); + + // Get correct time stamps + infoData.iDateTime = entry.iDate; + HBufC* msgType( NULL ); + switch ( currType ) + { + case EUniMessageCurrentTypeMms: + { + infoType = CMsgInfoMessageInfoDialog::EMmsEditor; + msgType = StringLoader::LoadLC( R_MSGTYPE_TEXT_MMS, iCoeEnv ); + popCount++; + infoData.iType.Set( *msgType ); + break; + } + case EUniMessageCurrentTypeSms: + default: + { + //infoType already set + msgType = StringLoader::LoadLC( R_MSGTYPE_TEXT_SMS, iCoeEnv ); + popCount++; + infoData.iType.Set( *msgType ); + break; + } + } + + // Size of message. + if ( currType == EUniMessageCurrentTypeMms ) + { + TInt sizeOfMessage = 0; + if ( aParameter.Length() ) + { // We are called from editor. + TPckgBuf paramPack; + const TInt paramSize = sizeof( TInt ); + + paramPack.Copy( aParameter.Ptr(), paramSize ); + sizeOfMessage = KKilo * paramPack(); + } + else + { + // Cannot get empty message size ok from client MTM, as it always contains something. + if ( !IsMessageEmptyL() ) + { + sizeOfMessage = static_cast( iBaseMtm ).MessageSize(); + } + } + // Finally make the UI string + TBuf sizeString; + MessageSizeToStringL( sizeString, sizeOfMessage ); + infoData.iSize.Set( sizeString ); + + if ( priorityFeatureSupported ) + { + HBufC* priority = NULL; + switch ( entry.Priority() ) + { + case EMsvHighPriority: + { + priority = StringLoader::LoadLC( R_UNI_MMS_MESSAGE_PRIORITY_HIGH, iCoeEnv ); + popCount++; + break; + } + case EMsvLowPriority: + { + priority = StringLoader::LoadLC( R_UNI_MMS_MESSAGE_PRIORITY_LOW, iCoeEnv ); + popCount++; + break; + } + case EMsvMediumPriority: + default: + { + priority = StringLoader::LoadLC( R_UNI_MMS_MESSAGE_PRIORITY_NORMAL, iCoeEnv ); + popCount++; + break; + } + } + + infoData.iPriority.Set( *priority ); + } + } + + // To + const CMsvRecipientList& recipients = static_cast( iBaseMtm ).AddresseeList(); + HBufC* toList( NULL ); + HBufC* ccList( NULL ); + HBufC* bccList( NULL ); + + TurnRecipientsArrayIntoStringsLC( + recipients, + toList, + ccList, + bccList, + addHeadersBitmask ); + if ( toList ) + { + infoData.iTo.Set( *toList ); + popCount++; + } + if ( ccList ) + { + infoData.iCC.Set( *ccList ); + popCount++; + } + if ( bccList ) + { + infoData.iBCC.Set( *bccList ); + popCount++; + } + + CMsgInfoMessageInfoDialog* infoDialog = CMsgInfoMessageInfoDialog::NewL(); + + infoDialog->ExecuteLD( infoData, infoType ); + + CleanupStack::PopAndDestroy( popCount ); + + return CMsvCompletedOperation::NewL( Session(), + KUidMsvLocalServiceMtm, + KNullDesC8, + KMsvLocalServiceIndexEntryId, + aCompletionStatus ); + } + + +// --------------------------------------------------------- +// CUniMtmUi::TurnRecipientsArrayIntoStringsLC +// Every created recipient buffer object increases pushed object count by one +// --------------------------------------------------------- +// +void CUniMtmUi::TurnRecipientsArrayIntoStringsLC( + const CMsvRecipientList& aRecip, + HBufC*& aTo, + HBufC*& aCc, + HBufC*& aBcc, + TInt aAddHeadersVariation ) const + { + TInt count = aRecip.Count(); + if ( count == 0 ) + { + return; + } + + TMsvEntry entry = BaseMtm().Entry().Entry(); + + // indeces refers To, Cc, Bcc + TInt recipTypesIndex = 0; + const TInt KRecipTypesCount = 3; + + TMsvRecipientTypeValues recipType ( EMsvRecipientTo ); + + // needs first round to check what is there + TInt index = 0; + TInt stringLengthTo = 0; + TInt stringLengthCc = 0; + TInt stringLengthBcc = 0; + TInt* stringLength = &stringLengthTo; + for ( recipTypesIndex = 0; recipTypesIndex < KRecipTypesCount; recipTypesIndex++ ) + { + if ( recipTypesIndex == 1 ) + { + stringLength = &stringLengthCc; + recipType = EMsvRecipientCc; + } + else if ( recipTypesIndex == 2 ) + { + stringLength = &stringLengthBcc; + recipType = EMsvRecipientBcc; + } + + for ( index = 0; index < count; index++ ) + { + if ( aRecip.Type( index ) == recipType ) + { + ( *stringLength ) += TMmsGenUtils::Alias( aRecip[index] ).Length(); + ( *stringLength ) += TMmsGenUtils::PureAddress( aRecip[index] ).Length(); + // Additional space for chars: '<' '>' ',' + 2 x KMmsLRMarker + ( *stringLength ) += KMmsAdditionalCharsStringLength; + } + } + } + + if ( stringLengthTo + || stringLengthCc + || stringLengthBcc ) + { + // needs second round to copy strigs: + // if CC not variated On, append CC recipients to To: field + // if BCC not variated On but CC variated On, append BCC recipients to Cc: field + // if BCC not variated On and also CC variated Off, append BCC recipients to To: field + HBufC** recipients = NULL; + recipType = EMsvRecipientTo; + TInt bufLength( stringLengthTo ); + for ( recipTypesIndex = 0; recipTypesIndex < KRecipTypesCount; recipTypesIndex++ ) + { + recipients = NULL; + if ( recipTypesIndex == 0 ) + { + if ( ! ( aAddHeadersVariation & KMmsFeatureIdEditorCcField ) ) + { + // CC not supported on the UI + bufLength += stringLengthCc; + if ( ! ( aAddHeadersVariation & KMmsFeatureIdEditorBccField ) ) + { + // BCC not supported on the UI + bufLength += stringLengthBcc; + } + } + if ( bufLength ) + { + aTo = HBufC::NewLC( bufLength ); + recipients = &aTo; + } + else + { + continue; + } + } + else if ( recipTypesIndex == 1 ) + { + recipType = EMsvRecipientCc; + if ( aAddHeadersVariation & KMmsFeatureIdEditorCcField ) + { + // Cc supported on the UI + bufLength = stringLengthCc; + if ( ! ( aAddHeadersVariation & KMmsFeatureIdEditorBccField ) ) + { + // BCC not supported on the UI + bufLength += stringLengthBcc; + } + if ( bufLength ) + { + aCc = HBufC::NewLC( bufLength ); + recipients = &aCc; + } + else + { + continue; + } + } + else + { + // Cc not supported on the UI + recipients = &aTo; + } + } + else if ( recipTypesIndex == 2 ) + { + + recipType = EMsvRecipientBcc; + if ( aAddHeadersVariation & KMmsFeatureIdEditorBccField ) + { + // BCC supported on the UI + bufLength = stringLengthBcc; + if ( bufLength ) + { + aBcc = HBufC::NewLC( bufLength ); + recipients = &aBcc; + } + else + { + continue; + } + } + else if ( aAddHeadersVariation & KMmsFeatureIdEditorCcField ) + { + // CC supported on the UI + recipients = &aCc; + } + else + { + // BCC not supported on the UI + recipients = &aTo; + } + + } + + if ( recipients + && *recipients ) + { + TPtr listPtr = (*recipients)->Des(); + for ( index=0; index < count; index++ ) + { + if ( aRecip.Type( index ) == recipType ) + { + TPtrC name = TMmsGenUtils::Alias( aRecip[index] ); + TPtrC number = TMmsGenUtils::PureAddress( aRecip[index] ); + if ( name.Length() ) + { + listPtr.Append( name ); + listPtr.Append( KMmsLRMarker ); + listPtr.Append( KCharLeftAddressIterator ); + listPtr.Append( number ); + listPtr.Append( KCharRightAddressIterator ); + listPtr.Append( KMmsLRMarker ); + } + else + { + listPtr.Append( number ); + } + + //append always and remove last one in the very end + listPtr.Append( KMmsCharCommaAndSpace ); + } + } + } + } + + // third round to strip the ", " off + for ( recipTypesIndex = 0; recipTypesIndex < KRecipTypesCount; recipTypesIndex++ ) + { + recipients = NULL; + if ( recipTypesIndex == 0 + && aTo ) + { + recipients = &aTo; + } + else if ( recipTypesIndex == 1 + && aCc ) + { + recipients = &aCc; + } + else if ( recipTypesIndex == 2 + && aBcc ) + { + recipients = &aBcc; + } + if ( recipients + && *recipients ) + { + TPtr listPtr = (*recipients)->Des(); + if ( listPtr.Length() > KMmsCharCommaAndSpace().Length() ) + { + listPtr.SetLength( listPtr.Length() - KMmsCharCommaAndSpace().Length() ); + } + } + } + } + } + + +// --------------------------------------------------------- +// CUniMtmUi::MessageSizeToStringL(TDes& aTarget, TInt aFileSize) +// Converts message size in bytes to a kilobyte string. Rounds the bytes up to the +// next full kilo. I.e: +// 0 -> 0KB +// 1 -> 1KB +// 1024 -> 1KB +// 1025 -> 2KB +// --------------------------------------------------------- +// +void CUniMtmUi::MessageSizeToStringL( TDes& aTarget, TInt aFileSize ) const + { + TInt fileSize = aFileSize / KKilo; + if ( aFileSize % KKilo ) + { + fileSize++; + } + + HBufC* buf = StringLoader::LoadLC( R_MSG_SIZE_KB, fileSize, iEikonEnv ); + TPtr ptr = buf->Des(); + ptr.Trim(); // remove possible white space from beginning + aTarget.Append( ptr ); + CleanupStack::PopAndDestroy( buf ); + } + +// --------------------------------------------------------- +// CUniMtmUi::IsMessageEmptyL() +// Checks if the message is effectively empty or not +// --------------------------------------------------------- +// +TBool CUniMtmUi::IsMessageEmptyL() const + { + TBool empty = EFalse; + + CMsvStore* store = static_cast( iBaseMtm ).Entry().ReadStoreL(); + CleanupStack::PushL( store ); + MMsvAttachmentManager& attaManager = store->AttachmentManagerL(); + TInt attaCount = attaManager.AttachmentCount(); + CleanupStack::PopAndDestroy( store ); + + // Only attachments and subject are calculated + // in message size. + if ( attaCount == 0 && + static_cast( iBaseMtm ).SubjectL().Length() == 0 ) + { + // No attachments nor subject + empty = ETrue; + } + + return empty; + } + +// --------------------------------------------------------- +// CUniMtmUi::ConvertUtcToLocalTime +// +// --------------------------------------------------------- +// +void CUniMtmUi::ConvertUtcToLocalTime( TTime& aTime ) + { + TLocale locale; + // Add time difference + aTime += locale.UniversalTimeOffset(); + if (locale.QueryHomeHasDaylightSavingOn()) + { // and possible daylight saving time + TTimeIntervalHours daylightSaving(1); + aTime += daylightSaving; + } + } + +// End of File