diff -r ebe688cedc25 -r 7fdbb852d323 email/mail/EditorSrc/cmsgmailrestoreattaop.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/mail/EditorSrc/cmsgmailrestoreattaop.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -0,0 +1,269 @@ +/* +* Copyright (c) 2002-2007 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: State machine -based operation for restoring sinle attachment. +* +*/ + + + +// INCLUDE FILES +#include "cmsgmailrestoreattaop.h" +#include "MsgMailEditorDocument.h" +#include "MsgMailDRMHandler.h" +#include "MailUtils.h" +#include "MailLog.h" +#include // resource identifiers +#include +#include +#include +#include +#include + +//Content-Transfer-Encoding: types +_LIT8(KMimeApplicationOctet, " application/octet-stream"); +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttaOp::CMsgMailRestoreAttaOp +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CMsgMailRestoreAttaOp::CMsgMailRestoreAttaOp( + TInt aIndex, + CMsgMailEditorDocument& aDocument ) + : CMsgMailBaseOp( aDocument ), + iIndex( aIndex ) + { + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttaOp::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttaOp::ConstructL() + { + LOG( "CMsgMailRestoreAttaOp::ConstructL, creating DRM handler..." ); + iDrmHandler = MsgMailDRMHandler::NewL(); + LOG( "CMsgMailRestoreAttaOp::ConstructL, getting atta mgr..." ); + iManager = &( iDocument.GetAttachmentManagerL() ); + LOG( "CMsgMailRestoreAttaOp::ConstructL, getting atta handle..." ); + LOG( "CMsgMailRestoreAttaOp::ConstructL, ...finished" ); + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttaOp::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CMsgMailRestoreAttaOp* CMsgMailRestoreAttaOp::NewL( + TInt aIndex, + CMsgMailEditorDocument& aDocument ) + { + CMsgMailRestoreAttaOp* self = + new( ELeave ) CMsgMailRestoreAttaOp( aIndex, aDocument ); + CleanupStack::PushL( self ); + self->ConstructL(); + + CleanupStack::Pop(self); + return self; + } + +// Destructor +CMsgMailRestoreAttaOp::~CMsgMailRestoreAttaOp() + { + LOG( "CMsgMailRestoreAttaOp::~CMsgMailRestoreAttaOp" ); + Cancel(); + delete iDrmHandler; + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttaOp::HandleStateActionL +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttaOp::HandleStateActionL() + { + switch ( iState ) + { + case ECheckAttaMime: + { + CheckAttaMimeL(); + break; + } + case ECheckAttaDRM: + { + CheckAttaDRML(); + break; + } + case EFinalize: + { + Finalize(); + break; + } + default: + { + // should never come here + ASSERT( EFalse ); + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttaOp::SetNextState +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttaOp::SetNextState() + { + switch ( iState ) + { + case EIdleState: + { + iState = ECheckAttaMime; + break; + } + case ECheckAttaMime: + { + iState = ECheckAttaDRM; + break; + } + case ECheckAttaDRM: + { + iState = EFinalize; + break; + } + case EFinalize: + default: + { + iState = EIdleState; + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttaOp::HandleOperationCancel +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttaOp::HandleOperationCancel() + { + LOG( "CMsgMailRestoreAttaOp::HandleOperationCancel" ); + if ( iState == ECheckAttaMime ) + { + // cancel possibly ongoing ModifyAttachmentInfoL() request, doesn't do + // anything if request isn't outstanding + LOG( "HandleOperationCancel, cancel manager's request" ); + iManager->CancelRequest(); + } + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttaOp::CheckAttaMimeL +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttaOp::CheckAttaMimeL() + { + CMsvAttachment* info = iManager->GetAttachmentInfoL( iIndex ); + CleanupStack::PushL( info ); + const TDesC8& infoMime = info->MimeType(); + + if ( infoMime.Length() == 0 || + !( KMimeApplicationOctet().FindF( infoMime ) == KErrNotFound ) ) + { + // mime type missing. try to resolve it + RFile atta = iManager->GetAttachmentFileL( iIndex ); + TDataType mime = iDocument.ResolveMimeType( atta ); + atta.Close(); + //Check if recognizing failed + if( mime.Des().Length() > 0 ) + { + info->SetMimeTypeL( mime.Des8() ); + // takes ownership of info + iManager->ModifyAttachmentInfoL( info, iStatus ); + SetActive(); // asynchronous request made -> set active + CleanupStack::Pop( info ); + } + } + + // if atta info isn't modified then we must complete this step manually, + // and also take care of deleting info + if ( !IsActive() ) + { + CompleteStateAction(); + CleanupStack::PopAndDestroy( info ); + } + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttaOp::CheckAttaDRML +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttaOp::CheckAttaDRML() + { + CMsvAttachment* info = iManager->GetAttachmentInfoL( iIndex ); + CleanupStack::PushL( info ); + + RFile atta = iManager->GetAttachmentFileL( iIndex ); + CleanupClosePushL( atta ); + CMsgAttachmentInfo::TDRMDataType drmType = + iDrmHandler->GetDRMDataTypeL( atta ); + TBool isClosedFile( MailUtils::IsClosedFileL( atta ) ); + // atta + CleanupStack::PopAndDestroy(); // CSI: 12 # RFile + + if ( drmType == CMsgAttachmentInfo::EForwardLockedOrCombinedDelivery || + isClosedFile ) + { + // Context might be changed, so refresh manager reference + // This is some historical magic that could be made nicer + iManager = &( iDocument.GetAttachmentManagerL() ); + // Remove attachment + iManager->RemoveAttachmentL( info->Id(), iStatus ); + iIsFLAtta = ETrue; + SetActive(); // asynchronous request made -> set active + } + else + { + TDataType mime( info->MimeType() ); + iDocument.AttachmentModel().AddAttachmentL( info->AttachmentName(), + info->Size(), + info->Id(), + info->Complete(), + mime, + drmType ); + iIsFLAtta = EFalse; + CompleteStateAction(); // nothing async -> complete manually + } + CleanupStack::PopAndDestroy( info ); + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttaOp::Finalize +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttaOp::Finalize() + { + if ( iIsFLAtta ) + { // complete the operation with error code indicating that attachment + // was removed due to DRM reasons + CompleteStateAction( KErrCANoPermission ); + } + else + { // no problem + CompleteStateAction(); + } + } + +// End Of File