diff -r 000000000000 -r 72b543305e3a mobilemessaging/audiomsg/src/audiomessagesaveoperation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/audiomsg/src/audiomessagesaveoperation.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,294 @@ +/* +* Copyright (c) 2005-2006 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: Sets resipients, finalize message entry. +* +*/ + + + +#include +#include +#include +#include +#include "audiomessagesaveoperation.h" + +_LIT( KAddressSeparator, ";" ); +const TInt KMaxDetailsLength = 64; // Copy max this many chars to TMsvEntry iDetails + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------- +// CAudioMessageSaveOperation::NewL +// --------------------------------------------------------- +// +CAudioMessageSaveOperation* CAudioMessageSaveOperation::NewL( + CMsgAddressControl& aAddressCtrl, + MAmsOperationObserver& aObserver, + CAudioMessageDocument& aDocument, + CMsgEditorView& aView ) + { + CAudioMessageSaveOperation* self = + new ( ELeave ) CAudioMessageSaveOperation( aAddressCtrl,aObserver, aDocument, aView); + return self; + } + +// --------------------------------------------------------- +// CAudioMessageSaveOperation::Constructor +// --------------------------------------------------------- +// +CAudioMessageSaveOperation::CAudioMessageSaveOperation( + CMsgAddressControl& aAddressCtrl, + MAmsOperationObserver& aObserver, + CAudioMessageDocument& aDocument, + CMsgEditorView& aView ) : + CAudioMessageOperation( aObserver, aDocument ), + iView( aView ), iAddressCtrl( aAddressCtrl ) + { + } + +// --------------------------------------------------------- +// CAudioMessageSaveOperation::Destructor +// --------------------------------------------------------- +// +CAudioMessageSaveOperation::~CAudioMessageSaveOperation() + { + Cancel(); + } + +// --------------------------------------------------------- +// CAudioMessageSaveOperation::Save +// --------------------------------------------------------- +// +void CAudioMessageSaveOperation::Save() + { + ResetError(); + iSaveState = EAmsSaveCheck; + CompleteSelf( KErrNone ); + } + + +// --------------------------------------------------------- +// CAudioMessageSaveOperation::DoSaveStepL +// --------------------------------------------------------- +// +void CAudioMessageSaveOperation::DoSaveStepL() + { + switch ( iSaveState ) + { + case EAmsSaveCheck: + DoSaveChecksL(); + break; + case EAmsSaveFinalize: + DoFinalizeSaveL(); + break; + case EAmsSaveEnd: + iObserver.EditorOperationEvent( + EAmsOperationSave, + EAmsOperationComplete ); + break; + default: + iObserver.EditorOperationEvent( + EAmsOperationSave, + EAmsOperationError ); + break; + } + } + +// --------------------------------------------------------- +// CAudioMessageSaveOperation::DoSaveChecksL +// --------------------------------------------------------- +// +void CAudioMessageSaveOperation::DoSaveChecksL() + { + iSaveState = EAmsSaveFinalize; + CMmsClientMtm& mtm = iDocument.Mtm(); + + mtm.SetSubjectL( KNullDesC() ); + for ( TInt i = mtm.AddresseeList().Count(); --i >= 0; ) + { + mtm.RemoveAddressee( i ); + } + const CMsgRecipientArray* recipients = iAddressCtrl.GetRecipientsL(); + + // inserts addresses from address control to clientMtm + TInt addrCnt = recipients->Count(); + for ( TInt ii = 0; ii < addrCnt ; ii++ ) + { + CMsgRecipientItem* addrItem = recipients->At(ii); + TPtr realAddress = addrItem->Address()->Des(); + TPtr alias = addrItem->Name()->Des(); + // Check that neither string contains illegal characters. + // If they does strip illegal chars away and save + RemoveIllegalAddrChars( realAddress ); + if ( alias.Length() > 0) + { + RemoveIllegalAddrChars( alias ); + } + mtm.AddAddresseeL( EMsvRecipientTo, realAddress, alias ); + } + mtm.SaveMessageL(); + CompleteSelf( KErrNone ); + } + +// --------------------------------------------------------- +// CAudioMessageSaveOperation::RemoveIllegalAddrChars +// --------------------------------------------------------- +// +TBool CAudioMessageSaveOperation::RemoveIllegalAddrChars( TDes& aString ) + { + TBool ret( EFalse ); + for ( TInt i = 0; i < aString.Length(); i++ ) + { + if ( !IsValidAddrChar( (TChar) aString[ i ] ) ) + { + aString.Delete( i, 1 ); + i--; + ret = ETrue; + } + } + return ret; + } + +// --------------------------------------------------------- +// CAudioMessageSaveOperation::IsValidAddrChar +// --------------------------------------------------------- +// +TBool CAudioMessageSaveOperation::IsValidAddrChar( const TChar& aChar ) + { + return ( aChar != '<' && aChar != '>' ); + } + +// --------------------------------------------------------- +// CAudioMessageSaveOperation::DoFinalizeSaveL +// --------------------------------------------------------- +// +void CAudioMessageSaveOperation::DoFinalizeSaveL() + { + iSaveState = EAmsSaveEnd; + CMmsClientMtm& mtm = iDocument.Mtm(); + + TMmsMsvEntry tEntry = static_cast( iDocument.Entry() ); + + // Set details + TBuf aDetails; + const CMsvRecipientList& addresses = mtm.AddresseeList(); + TInt addrCnt = addresses.Count(); + + TPtrC stringToAdd; + for ( TInt i = 0; i < addrCnt; i++) + { + TPtrC alias = TMmsGenUtils::Alias( addresses[i] ); + TPtrC address = TMmsGenUtils::PureAddress( addresses[i] ); + + if ( alias.Length() != 0 ) + { + stringToAdd.Set( alias ); + } + else + { + stringToAdd.Set( address ); + } + + if ( ( aDetails.Length() != 0 ) && // Not a first address + ( aDetails.Length() + KAddressSeparator().Length() < KMaxDetailsLength ) ) + { + // Add separator + aDetails.Append( KAddressSeparator() ); + } + + if ( aDetails.Length() + stringToAdd.Length() < KMaxDetailsLength ) + { + // whole string fits. Add it. + aDetails.Append( stringToAdd ); + } + else + { + // Only part of the string fits + TInt charsToAdd = KMaxDetailsLength - aDetails.Length(); + + if ( charsToAdd <= 0 ) + { + // Cannot add any more chars + break; + } + + if ( charsToAdd >= stringToAdd.Length() ) + { + // Guarantee that charsToAdd is not larger that stringToAdd lenght + charsToAdd = stringToAdd.Length(); + } + + aDetails.Append( stringToAdd.Left( charsToAdd ) ); + break; + } + } + AknTextUtils::ConvertDigitsTo( aDetails, EDigitTypeWestern ); + tEntry.iDetails.Set( aDetails ); + + if ( iDocument.IsForward() ) + { + tEntry.SetForwardedMessage( EFalse ); + } + + if ( !tEntry.EditorOriented() ) + { + tEntry.SetEditorOriented( ETrue ); + tEntry.iMtmData1 &= ~KMmsMessageMobileTerminated; + tEntry.iMtmData1 |= KMmsMessageEditorOriented; + } + + // Update timestamp + tEntry.iDate.UniversalTime(); + + if ( !tEntry.Visible() ) + { + // Save from close or exit save. + // Message should be visible after save + tEntry.SetVisible( ETrue ); + tEntry.SetInPreparation( EFalse ); + tEntry.iBioType = KUidMsgSubTypeMmsAudioMsg.iUid; + } + + iDocument.CurrentEntry().ChangeL( tEntry ); + iDocument.SetHeaderModified( EFalse ); + iDocument.SetBodyModified( EFalse ); + CompleteSelf( KErrNone ); + } + +// --------------------------------------------------------- +// CAudioMessageSaveOperation::DoCancel +// --------------------------------------------------------- +// +void CAudioMessageSaveOperation::DoCancel() + { + } + +// --------------------------------------------------------- +// CAudioMessageSaveOperation::RunL +// --------------------------------------------------------- +// +void CAudioMessageSaveOperation::RunL() + { + if ( iStatus.Int() != KErrNone ) + { + SetError( iStatus.Int() ); + iObserver.EditorOperationEvent( + EAmsOperationSave, + EAmsOperationError ); + } + else + { + DoSaveStepL(); + } + }