diff -r 000000000000 -r 72b543305e3a mobilemessaging/audiomsg/src/audiomessageinsertoperation.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#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 ); + } + + }