diff -r 000000000000 -r 72b543305e3a mobilemessaging/audiomsg/src/audiomessageoperation.cpp --- /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 +#include + +#include +#include +#include +#include +#include +#include +#include +#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* array = new ( ELeave ) CArrayFixFlat( 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; aGetAttachmentInfoL( 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; + }