mobilemessaging/audiomsg/src/audiomessagesaveoperation.cpp
changeset 0 72b543305e3a
--- /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 <mmsclient.h>
+#include <MsgAddressControl.h>  
+#include <mmsgenutils.h> 		
+#include <StringLoader.h>        
+#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<TMmsMsvEntry>( iDocument.Entry() );
+
+    // Set details
+    TBuf<KMaxDetailsLength> 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();
+        }
+    }