mobilemessaging/audiomsg/src/audiomessageinsertoperation.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/audiomsg/src/audiomessageinsertoperation.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,314 @@
+/*
+* 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:   Class that handles message attachment operations:
+*              : insert and delete.
+*
+*/
+
+
+
+#include <apmstd.h>
+#include <cmsvmimeheaders.h>
+#include <StringLoader.h>
+#include <mmsvattachmentmanager.h>
+#include <mmsvattachmentmanagersync.h>
+#include <MsgEditorCommon.h>
+#include <MsgMediaInfo.h>
+#include <MsgMimeTypes.h>
+#include <audiomessage.rsg>
+#include "audiomessageinsertoperation.h"
+#include "audiomessagedocument.h"
+#include "audiomessagerecorder.h"
+#include "AudioMessageLogging.h"
+#include "msgtextutils.h"
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------
+// CAudioMessageInsertOperation::NewL
+// ---------------------------------------------------------
+//
+CAudioMessageInsertOperation* CAudioMessageInsertOperation::NewL(
+				MAmsOperationObserver& aOperationObserver,
+				CAudioMessageDocument& aDocument,
+				CMsgEditorView& aView )
+		{
+		CAudioMessageInsertOperation* self = new ( ELeave ) CAudioMessageInsertOperation(
+			aOperationObserver,
+			aDocument,
+			aView );
+
+		return self;
+		}
+
+// ---------------------------------------------------------
+// CAudioMessageInsertOperation::Constructor
+// ---------------------------------------------------------
+//
+CAudioMessageInsertOperation::CAudioMessageInsertOperation(
+		 MAmsOperationObserver& aOperationObserver,
+		 CAudioMessageDocument& aDocument,
+		 CMsgEditorView& aView ) : CAudioMessageOperation( aOperationObserver, aDocument ),
+		 iView( aView ), iState( 0 ), iNew( ETrue )
+		{
+		}
+
+
+// ---------------------------------------------------------
+// CAudioMessageInsertOperation::Destructor
+// ---------------------------------------------------------
+//
+CAudioMessageInsertOperation::~CAudioMessageInsertOperation()
+		{
+		Cancel();
+		}
+
+// ---------------------------------------------------------
+// CAudioMessageInsertOperation::Insert
+// ---------------------------------------------------------
+//
+void CAudioMessageInsertOperation::Insert( CMsgMediaInfo* aInfo, TBool aVal, TBool aNew )
+		{
+		iRemove = aVal;
+		iNew = aNew;
+		ResetError();
+		iInfo = aInfo;
+		iState = EAmsInit;
+		CompleteSelf( KErrNone );
+		}
+			
+
+// ---------------------------------------------------------
+// CAudioMessageInsertOperation::RunL
+// ---------------------------------------------------------
+//
+void CAudioMessageInsertOperation::RunL()
+	{
+	if ( iStatus.Int() != KErrNone )
+        {
+        SetError( iStatus.Int() );
+        UnInit();
+        iObserver.EditorOperationEvent(
+            EAmsOperationInsert,
+            EAmsOperationError );
+        }
+    else
+        {
+        DoInsertStepL();
+        }    
+	}
+
+
+// ---------------------------------------------------------
+// CAudioMessageInsertOperation::DoInsertStepL
+// ---------------------------------------------------------
+//
+void CAudioMessageInsertOperation::DoInsertStepL()
+    {
+    switch ( iState )
+		{
+		case EAmsInit:
+			DoEditInitL();
+			iState = EAmsCheckAttas;
+			CompleteSelf( KErrNone );
+			break;
+		case EAmsCheckAttas:
+			CheckAttasL( );
+			
+			if ( iRemove == EFalse)
+				{
+				iState = EAmsSetAudio;
+				}
+			else
+				{
+				iState = EAmsRemoveAudio;
+				}
+			CompleteSelf( KErrNone );
+			break;
+		case EAmsRemoveAudio:
+			DoRemoveAudioL();
+			iState = EAmsRemoveSmil;
+			CompleteSelf( KErrNone );
+			break;
+		case EAmsRemoveSmil:
+			DoRemoveSmilL();
+			iState = EAmsCommit;
+			CompleteSelf( KErrNone );
+			break;
+		case EAmsSetAudio:	
+			DoCreateNewAudioAttaL( );
+			iState = EAmsSetDuration;
+			SetActive();
+			break;
+	   case EAmsSetDuration:
+			DoSetDurationL( );
+			iState = EAmsInsertSmil;
+			CompleteSelf( KErrNone );
+			break;	
+		case EAmsInsertSmil:
+			AddSmilL();
+			iState = EAmsCommit;
+			SetActive();
+			break;
+		case EAmsCommit:
+			MakeCommitL();
+			UnInit();
+			iState = EAmsInsertReady;
+			CompleteSelf( KErrNone );
+			break;
+		case EAmsInsertReady:
+			if ( iRemove == EFalse )
+				{
+				iObserver.EditorOperationEvent(
+					EAmsOperationInsert,
+					EAmsOperationComplete );
+				}
+			else
+				{
+				iObserver.EditorOperationEvent(
+					EAmsOperationRemove,
+					EAmsOperationComplete );
+				}
+			break;
+		default:
+			break;
+		}
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageInsertOperation::DoCreateNewAudioAttaL
+// ---------------------------------------------------------
+//
+void CAudioMessageInsertOperation::DoCreateNewAudioAttaL( )
+	{
+	CMsvAttachment* attachment = CMsvAttachment::NewL( CMsvAttachment::EMsvFile );
+	CleanupStack::PushL( attachment );
+	if ( iDocument.iAudio )
+		{ // Remove the old audio
+		TInt oldAudio = TMsvIdToIndexL( iDocument.iAudio );
+		if ( oldAudio != KErrNotFound )
+		    {
+		    iStore->AttachmentManagerExtensionsL( ).RemoveAttachmentL( oldAudio );
+		    }
+		}
+    TParsePtrC parse( iInfo->FullFilePath() );
+	attachment->SetAttachmentNameL( parse.NameAndExt() );
+	iManager->AddAttachmentL( iInfo->FullFilePath(), attachment, iStatus );
+	CleanupStack::Pop( attachment );
+	iHeaders = CMsvMimeHeaders::NewL( );
+	TDataType mime = iInfo->MimeType( );
+	
+	iContentLocationFileName = parse.NameAndExt();
+	CMsgTextUtils::TrimAndRemoveNonAlphaDigit( iContentLocationFileName );
+	iHeaders->SetContentLocationL( iContentLocationFileName );
+   
+    TInt slash = mime.Des8().Locate( '/' );
+    iHeaders->SetContentTypeL( mime.Des8().Left( slash ) );
+    iHeaders->SetContentSubTypeL( mime.Des8().Mid( slash + 1 ) );
+	attachment->SetMimeTypeL( mime.Des8() );
+	iDocument.iAudio = attachment->Id( );
+	
+	iHeaders->StoreL( *attachment );
+	if ( iHeaders )
+		{
+		delete iHeaders;
+		iHeaders=NULL;
+		}	
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageInsertOperation::DoCancel
+// ---------------------------------------------------------
+//
+void CAudioMessageInsertOperation::DoCancel()
+	{
+	if ( iManager )
+		{
+		iManager->CancelRequest();
+		}
+	}
+
+
+// ---------------------------------------------------------
+// CAudioMessageInsertOperation::CheckSizeForInsert
+// ---------------------------------------------------------
+//
+TBool CAudioMessageInsertOperation::CheckSizeForInsert()
+	{
+	if( iInfo )
+		{
+		if ( TUint( iInfo->FileSize() ) > iDocument.MaxMessageSize() )
+			{
+			SetError( EAmsInsertTooBig );
+			return EFalse;
+			}
+		else 
+			{
+			return ETrue;
+			}
+		}
+	 return ETrue;
+	}
+ 
+// ---------------------------------------------------------
+// CAudioMessageInsertOperation::DoRemoveAudioL
+// ---------------------------------------------------------
+//
+void CAudioMessageInsertOperation::DoRemoveAudioL( )
+	{
+	if ( iDocument.iAudio )
+		{ // Remove the old audio
+		TInt oldAudio = TMsvIdToIndexL( iDocument.iAudio );
+		iStore->AttachmentManagerExtensionsL( ).RemoveAttachmentL( oldAudio );
+		}
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageInsertOperation::DoRemoveSmilL
+// ---------------------------------------------------------
+//
+void CAudioMessageInsertOperation::DoRemoveSmilL( )
+	{
+	if ( iDocument.iSmil )
+		{ // Remove the old audiosmil
+		TInt oldSmil = TMsvIdToIndexL( iDocument.iSmil );
+		iStore->AttachmentManagerExtensionsL( ).RemoveAttachmentL( oldSmil );
+		}
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageInsertOperation::DoSetDurationL
+// ---------------------------------------------------------
+//
+void CAudioMessageInsertOperation::DoSetDurationL( )
+	{	
+    if ( iNew )
+        {
+        ; //Duration already set into document object
+        }
+    else
+        {
+        //We must get the duration for the SMIL
+	    RFile attaFile = iManager->GetAttachmentFileL( iDocument.iAudio );
+        CleanupClosePushL( attaFile ); // RFile must be closed
+        CAudioMessageRecorder *recorder = CAudioMessageRecorder::NewL( attaFile, EFalse );
+        iDocument.SetDuration( recorder->GetDuration() );
+        delete recorder;
+        recorder = NULL;
+	    CleanupStack::PopAndDestroy( &attaFile );
+        }    
+
+	}