mobilemessaging/audiomsg/src/audiomessageoperation.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/audiomsg/src/audiomessageoperation.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,295 @@
+/*
+* 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:   Active object to handle asynchronious.
+*                A base class for AudiomessageLaunchOperation-,
+*                AudiomessageInsertOperation-,AudiomessageSaveOperation- and
+*                AudiomessageSendOperation -classes
+*
+*/
+
+
+
+#include <basched.h>
+#include <StringLoader.h>
+
+#include <mmsvattachmentmanager.h>
+#include <mmsvattachmentmanagersync.h>
+#include <mmsclient.h>
+#include <MsgMimeTypes.h>
+#include <MsgEditorCommon.h>
+#include <cmsvmimeheaders.h>
+#include <audiomessage.rsg>
+#include "audiomessageoperation.h"
+
+const TInt KSecondAsMilliSeconds( 1000 );
+_LIT( KSmilFile,"pres.smil");
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------
+// CAudioMessageOperation::Constructor
+// ---------------------------------------------------------
+//
+CAudioMessageOperation::CAudioMessageOperation(
+        MAmsOperationObserver& aObserver,
+        CAudioMessageDocument& aDocument ) : CActive( EPriorityStandard ),
+    	iObserver( aObserver ),
+    	iDocument( aDocument ),
+   	    iError( 0 )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+
+// ---------------------------------------------------------
+// CAudioMessageOperation::Destructor
+// ---------------------------------------------------------
+//
+CAudioMessageOperation::~CAudioMessageOperation()
+    {
+    delete iStore;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageOperation::CompleteSelf
+// ---------------------------------------------------------
+//
+void CAudioMessageOperation::CompleteSelf( TInt aError )
+    {
+    iStatus = KRequestPending;
+    TRequestStatus* pStatus = &iStatus;
+    SetActive();
+    User::RequestComplete( pStatus, aError );
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageOperation::DoEditInitL
+// ---------------------------------------------------------
+//
+void CAudioMessageOperation::DoEditInitL( )
+    {
+	iStore = iDocument.Mtm( ).Entry( ).EditStoreL( );
+    iManager = &( iStore->AttachmentManagerL( ) );
+    iManagerSync = &( iStore->AttachmentManagerExtensionsL( ) );
+    }
+    
+// ---------------------------------------------------------
+// CAudioMessageOperation::DoReadInitL
+// ---------------------------------------------------------
+//
+void CAudioMessageOperation::DoReadInitL( )
+    {
+   	iStore = iDocument.Mtm( ).Entry( ).ReadStoreL( );
+    iManager = &( iStore->AttachmentManagerL( ) );
+    iManagerSync = &( iStore->AttachmentManagerExtensionsL( ) );
+    }
+  
+// ---------------------------------------------------------
+// CAudioMessageOperation::MakeCommitL
+// ---------------------------------------------------------
+//
+void  CAudioMessageOperation::MakeCommitL( )
+   	{
+   	iStore->CommitL( );
+   	}
+   
+// ---------------------------------------------------------
+// CAudioMessageOperation::UnInit
+// ---------------------------------------------------------
+//
+void CAudioMessageOperation::UnInit( )
+    {
+    delete iStore;
+    iStore = NULL;
+    }   
+
+// ---------------------------------------------------------------------------
+// CAudioMessageOperation::CheckAttasL
+// Check how many voice and smil attas there are
+// Save atta id and smil id
+// ---------------------------------------------------------------------------
+//    
+TInt CAudioMessageOperation::CheckAttasL( )
+    {
+    TInt count = iManager->AttachmentCount();
+    CMsvAttachment* atta = NULL;
+    TInt numOfSmils( 0 );
+    TInt numOfAudios( 0 );
+    for( TInt a = 0; a < count; a++ )
+        {
+        atta = iManager->GetAttachmentInfoL( a );
+        CleanupStack::PushL( atta );
+        TDataType  k = atta->MimeType();
+
+   		if ( k.Des8().CompareF( KMsgMimeAudioAmr ) == 0 )
+   			{
+			numOfAudios++;
+   		    iDocument.iAudio = atta->Id( );
+   			}
+
+   		if ( k.Des8().CompareF( KMsgMimeSmil ) == 0 )
+   			{
+			numOfSmils++;
+   		    iDocument.iSmil = atta->Id( );
+   			}
+        CleanupStack::PopAndDestroy( atta );
+        }
+        
+	if( numOfAudios > 1 || numOfSmils > 1 )
+        {
+        // This case seems to be impossible in real life
+        SetError( EAmsMultipleFiles );
+        CompleteSelf( -1 );
+        return EAmsMultipleFiles;
+        }
+
+ 	return KErrNone;
+    }
+
+
+// ---------------------------------------------------------
+// CAudioMessageOperation::AddSmilL
+// ---------------------------------------------------------
+//
+void CAudioMessageOperation::AddSmilL()
+	{
+ 	TFileName file( KSmilFile );
+    CMsvAttachment* attachment = CMsvAttachment::NewL( CMsvAttachment::EMsvFile );
+    CleanupStack::PushL( attachment );
+    
+    if( iDocument.iSmil )
+		{ // Remove the old smil
+		TInt oldSmil = TMsvIdToIndexL( iDocument.iSmil );
+		if ( oldSmil != KErrNotFound )
+		    {
+		    iStore->AttachmentManagerExtensionsL( ).RemoveAttachmentL( oldSmil );
+		    }
+		}
+    
+    RFile *editFile = new ( ELeave ) RFile;
+   	iManager->CreateAttachmentL( file, *editFile, attachment, iStatus );
+   	CleanupStack::Pop( attachment );
+    delete iHeaders;
+    iHeaders = NULL;
+ 	iHeaders = CMsvMimeHeaders::NewL( );
+    iHeaders->SetContentLocationL( KSmilFile );
+    TInt slash = KMsgMimeSmil().Locate( '/' );
+    iHeaders->SetContentTypeL( KMsgMimeSmil().Left( slash ) );
+    iHeaders->SetContentSubTypeL( KMsgMimeSmil().Mid( slash + 1 ) );
+	attachment->SetMimeTypeL( KMsgMimeSmil );
+    iDocument.iSmil = attachment->Id( );
+
+ 	TInt dur = I64INT( iDocument.GetDuration().Int64() ) / KSecondAsMilliSeconds;
+	
+    CArrayFixFlat<TInt>* array = new ( ELeave ) CArrayFixFlat<TInt>( 3 );
+    CleanupStack::PushL( array );
+    array->AppendL( MsgEditorCommons::ScreenWidth() );
+    array->AppendL( MsgEditorCommons::ScreenHeigth() );
+    array->AppendL( dur );
+	TInt resId = R_AUDIOMESSAGE_SMIL;
+    
+    CDesCArrayFlat* arrayForFileName = new ( ELeave ) CDesCArrayFlat( 1 );
+    CleanupStack::PushL( arrayForFileName );
+    //дце replaced earlier in iFileName
+    arrayForFileName->AppendL( iContentLocationFileName );  
+    HBufC* smil = StringLoader::LoadLC( resId, *arrayForFileName, *array );
+    
+    // convert the smil to 8-bit
+    HBufC8* smil8 = HBufC8::NewLC( smil->Des( ).Length( ) );
+    smil8->Des().Copy( smil->Des( ) );
+
+    RFileWriteStream smilStream( *editFile );
+    smilStream.PushL( );    
+    delete editFile; 
+    editFile = NULL;
+ 	smilStream.WriteL( *smil8 );
+    smilStream.Close( );
+    smilStream.Pop( );
+    CleanupStack::PopAndDestroy( 4, array ); // smil, array, arrayForFileName
+ 
+  	iHeaders->StoreL( *attachment );
+   	if ( iHeaders )
+	    {
+	   	delete iHeaders;
+	    iHeaders=NULL;
+	    }
+	MakeCommitL( );
+	}
+
+
+// ---------------------------------------------------------
+// CAudioMessageOperation::TMsvIdToIndexL
+// ---------------------------------------------------------
+//
+TInt CAudioMessageOperation::TMsvIdToIndexL( TMsvAttachmentId& aId )
+	{
+    TInt count = iManager->AttachmentCount( );
+    CMsvAttachment* atta = NULL;
+    for(TInt a = 0; a<count; a++)
+        {
+        atta = iManager->GetAttachmentInfoL( a );
+        if ( atta->Id( ) == aId )
+        	{
+        	delete atta;
+        	return a;
+        	}
+        delete atta;
+        }
+	return KErrNotFound;
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageOperation::RunError
+// ---------------------------------------------------------
+//
+TInt CAudioMessageOperation::RunError( TInt aError )
+    {
+ 	if ( aError == KLeaveExit )
+        {
+        return KLeaveExit;
+        }
+    else
+        {
+        SetError( aError );
+        CompleteSelf( aError );
+        return KErrNone;
+        }
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageOperation::GetError
+// ---------------------------------------------------------
+//
+TInt CAudioMessageOperation::GetError( )
+    {
+    return iError;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageOperation::SetError
+// ---------------------------------------------------------
+//
+void CAudioMessageOperation::SetError( TInt aError )
+    {
+    iError = aError;
+    }
+    
+// ---------------------------------------------------------
+// CAudioMessageOperation::ResetError
+// ---------------------------------------------------------
+//
+void CAudioMessageOperation::ResetError( )
+    {
+    iError = 0;
+    }