diff -r 000000000000 -r 72b543305e3a mobilemessaging/unieditor/utils/src/UniObjectsViewDialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/unieditor/utils/src/UniObjectsViewDialog.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,1464 @@ +/* +* Copyright (c) 2005-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: +* Defines implementation of CUniObjectsViewDialog class methods. +* +*/ + + + +// ========== INCLUDE FILES ================================ +#include "UniObjectsViewDialog.h" + +#include +#include // Eikon Enviroment +#include // Application start +#include // for CEikMenuPane +#include // for CEikMenuBar +#include // NearestLanguageFile +#include +#include // RApaLsSession +#include +#include +#include // doc handler +#include // StringLoader +#include +#include // CRichText +#include + +#include +#include +#include // TMsvId +#include // CBioDatabase +#include + +#include + +#include +#include +#include +#include + +#include +#include + +#include // atta dlg base resouce identifiers +#include // obj view resouce identifiers +#include + +// Features +#include + +#include + +// Help +#include +#include +#include // For HlpLauncher + +#include "UniUtils.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include // atta dlg base commands +#include "UniObjectsViewDialog.hrh" // obj view commands + +#include + +#include "UniEditorLogging.h" + +#include "UniObjectsListArray.h" + +// ========== EXTERNAL DATA STRUCTURES ===================== + +// ========== EXTERNAL FUNCTION PROTOTYPES ================= + +// ========== CONSTANTS ==================================== + +_LIT( KMmsFormatTwoDigits, "%x_%x\\" ); + +const TUid KNotepadUID3 = { 0x1000599d }; +const TUid KUidMmsViewer = { 0x100058DF }; +const TUid KUniEditorAppId = { 0x102072D8 }; + +// ========== MACROS ======================================= + +// ========== LOCAL CONSTANTS AND MACROS =================== + +// ========== MODULE DATA STRUCTURES ======================= + +// ========== LOCAL FUNCTION PROTOTYPES ==================== + +// ========== LOCAL FUNCTIONS ============================== + +// ========== MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------- +// CUniObjectsViewDialog::ObjectsViewL +// --------------------------------------------------------- +// +EXPORT_C TInt CUniObjectsViewDialog::ObjectsViewL( TUniObjectsDialogType aDialogType, + CUniObjectsModel& aAttachmentModel, + CEikonEnv* aEikonEnv, + TUniObjectsDialogExitCmd& aExitCmd, + CUniDataModel& aDataModel, + TInt aFocusedItemIndex ) + { + TFileName* fileName = new ( ELeave ) TFileName; + CleanupStack::PushL( fileName ); + + TParse parse; + User::LeaveIfError( parse.Set( KUniUtilsResourceFileName, &KDC_RESOURCE_FILES_DIR, NULL ) ); + *fileName = parse.FullName(); + + BaflUtils::NearestLanguageFile( aEikonEnv->FsSession(), *fileName ); + TInt offset = aEikonEnv->AddResourceFileL( *fileName ); + + CleanupStack::PopAndDestroy( fileName ); + + TInt menuId = R_UNUT_EDITOR_OBJECTS_MENU; + + switch ( aDialogType ) + { + case EViewer: + { + menuId = R_UNUT_VIEWER_OBJECTS_MENU; + break; + } + case EForward: + { + menuId = R_UNUT_FORWARD_OBJECTS_MENU; + break; + } + case EEditor: + { + menuId = R_UNUT_EDITOR_OBJECTS_MENU; + break; + } + default: + { + break; + } + } + + HBufC* title = aEikonEnv->AllocReadResourceLC( R_UNUT_OBJECTS_TITLE ); + TInt ret = 0; + + PopulateAttachmentModelL( aAttachmentModel, aDataModel ); + + CUniObjectsViewDialog* dlg = new ( ELeave ) CUniObjectsViewDialog ( + *title, + aDialogType, + menuId, + aAttachmentModel, + offset, + aExitCmd, + aDataModel, + aFocusedItemIndex ); + + CleanupStack::PushL( dlg ); + dlg->ConstructL( aDataModel.Mtm().Entry() ); + CleanupStack::Pop( dlg ); + + ret = dlg->ExecuteLD( R_MEB_VIEW_ATTACHMENT_DIALOG ); // wait dialog. + CleanupStack::PopAndDestroy( title ); // store, title + + return ret; + } + + +// --------------------------------------------------------- +// CUniObjectsViewDialog::CUniObjectsViewDialog +// --------------------------------------------------------- +// +CUniObjectsViewDialog::CUniObjectsViewDialog( TDesC& aTitle, + TUniObjectsDialogType aDialogType, + TInt aMenuId, + CUniObjectsModel& aAttachmentModel, + TInt aResourceOffset, + TUniObjectsDialogExitCmd& aExitCmd, + CUniDataModel& aDataModel, + TInt aFocusedItemIndex ) : + CMsgViewAttachmentsDialog( aTitle, aMenuId, aAttachmentModel ), + iDialogType( aDialogType ), + iResourceOffset( aResourceOffset ), + iDataModel( aDataModel ), + iSupportedFeatures( 0 ), + iExitCmd( aExitCmd ), + iFocusedItemIndex( aFocusedItemIndex ) + { + iExitCmd = EUniObjectsViewBack; + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::~CUniObjectsViewDialog +// --------------------------------------------------------- +// +CUniObjectsViewDialog::~CUniObjectsViewDialog() + { + if ( iResourceOffset != -1 ) + { + iEikonEnv->DeleteResourceFile( iResourceOffset ); + } + + // Remove drm info observer + CUniObjectsModel& model( static_cast( iAttachmentModel ) ); + TInt countObjects = model.NumberOfItems( ); + for ( TInt i = 0; i < countObjects; i++ ) + { + CUniObject* obj = + static_cast + ( model.AttachmentInfoAt( i ) ).Object(); + if ( obj ) + { + obj->RemoveObserver( this ); + } + } + + delete iSendUi; + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::ConstructL +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::ConstructL( CMsvEntry& aEntry ) + { + FeatureManager::InitializeLibL(); + + if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + iSupportedFeatures |= EUniFeatureHelp; + } + if ( FeatureManager::FeatureSupported( KFeatureIdDrmFull ) ) + { + iSupportedFeatures |= EUniFeatureDrmFull; + } + if ( FeatureManager::FeatureSupported( KFeatureIdJapanese ) ) + { + iSupportedFeatures |= EUniFeatureJapanese; + } + + FeatureManager::UnInitializeLib(); + + CMsgViewAttachmentsDialog::ConstructL( aEntry ); + + if ( iDialogType == EViewer ) + { + iSendUi = CSendUi::NewL(); + } + + // Add drm info observer + CUniObjectsModel& model( static_cast( iAttachmentModel ) ); + TInt countObjects = model.NumberOfItems( ); + for ( TInt i = 0; i < countObjects; i++ ) + { + CUniObject* obj = + static_cast + ( model.AttachmentInfoAt( i ) ).Object(); + if ( obj ) + { + // concept of 'DRM rights when loaded' is different + // current status applies; consumed status does not matter + obj->SetDrmRightsWhenLoadedObjects( IsRightsNow( *obj ) ); + obj->SetObserverL( this ); + } + + } + // Enable task swapper to options menu after launch has been completed. + } + +// --------------------------------------------------------- +// CMsgViewAttachmentsDialog::LoadFormDataL +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::LoadFormDataL() + { + // iconarray for two icons. + // index 0: application icon. + // index 1: indicator. + iIconArray = new ( ELeave ) CArrayPtrFlat( 2 ); + + iListBox->ItemDrawer()->FormattedCellData()->SetIconArrayL( iIconArray ); + + // list items is not actually an array but object that returns + // list item text for listbox in MdcaPoint method. + iListItems = CUniObjectListItemArray::NewL( iAttachmentModel, iIconArray, iDataModel.DataUtils() ); + iListBox->Model()->SetItemTextArray( iListItems ); + iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray ); + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::PreLayoutDynInitL +// +// Sets the intial focus if given. Also enables open middle softkey. +// Assumes that empty slides are not set initially focused. +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::PreLayoutDynInitL() + { + CMsgViewAttachmentsDialog::PreLayoutDynInitL(); + + if ( iFocusedItemIndex != -1) + { + iListBox->SetCurrentItemIndex( iFocusedItemIndex ); + if ( ButtonGroupContainer().ControlOrNull( EAknSoftkeyOpen ) ) + { + ButtonGroupContainer().MakeCommandVisible( EAknSoftkeyOpen, ETrue ); + } + } + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::ProcessCommandL +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::ProcessCommandL( TInt aCommandId ) + { + HideMenu(); + + TInt index = CurrentListItemIndex(); + + switch ( aCommandId ) + { + case EMmsObjectsTextFirst: + case EMmsObjectsTextSecond: + ChangeOrderL( aCommandId, 0 ); + break; + case EMsgViewAttachmentCmdOpen: + ProcessCommandOpenL( index ); + break; + case EMsgViewAttachmentCmdSave: + ProcessCommandSaveL( index ); + break; + case EMsgViewAttachmentCmdRemove: + { + CUniObjectsInfo& selectedObject = static_cast + ( iAttachmentModel.AttachmentInfoAt( CurrentListItemIndex() ) ); + TBool emptySlide = ( selectedObject.Flags() & CUniObjectsInfo::EMmsSlide ); + if(emptySlide) + break; + ProcessCommandRemoveL( index ); + } + break; + + case EAknCmdHelp: + { + LaunchHelpL(); + } + break; + + case EMmsObjectsSendVia: + { + CArrayFix* uids = new ( ELeave ) CArrayFixFlat( 1 ); + CleanupStack::PushL( uids ); + + CUniObjectsInfo& selectedObject = static_cast + ( iAttachmentModel.AttachmentInfoAt( index ) ); + CUniObject* obj = selectedObject.Object(); + + // TODO bio support + TSendingCapabilities requiredCapabilities = KCapabilitiesForAllServices; + requiredCapabilities.iFlags = TSendingCapabilities::ESupportsAttachments; + + if ( obj->MediaType() == EMsgMediaText ) + { + requiredCapabilities.iFlags |= TSendingCapabilities::ESupportsBodyText; + } + + if ( iDialogType != EViewer ) + { + uids->AppendL( KSenduiMtmMmsUid ); // MMS menu item, if already in editor + } + + CMessageData* msgData = CMessageData::NewLC(); + RFile fileHandle; + if ( obj->AttachmentId() == KMsvNullIndexEntryId ) + { + fileHandle = CUniDataUtils::GetAttachmentFileL( iDataModel.Mtm(), obj->AttachmentId() ); + } + else + { + // Always pass full file path to SendUi. Even + // in case of attachments. + CMsvStore* store = iMessageEntry->ReadStoreL(); + CleanupStack::PushL( store ); + MMsvAttachmentManager& manager = store->AttachmentManagerL(); + fileHandle = manager.GetAttachmentFileL( obj->AttachmentId() ); + CleanupStack::PopAndDestroy( store ); + } + CleanupClosePushL( fileHandle ); + + TUid bioUid; + bioUid.iUid = 0; + if ( fileHandle.SubSessionHandle() ) + { + msgData->AppendAttachmentHandleL( fileHandle ); + if ( obj->MediaInfo() ) + { + if ( BioMessageTypeL( obj->MediaInfo()->MimeType(), bioUid ) ) + { + requiredCapabilities.iFlags |= TSendingCapabilities::ESupportsBioSending; + } + } + } + + TUid serviceId = iSendUi->ShowSendQueryL( msgData, + requiredCapabilities, + uids ); + ProcessCommandSendL( *msgData, index, serviceId, bioUid ); + + CleanupStack::PopAndDestroy( 3, uids ); // + fileHandle, msgData + } + break; + + case EEikCmdExit: + case EAknCmdExit: + iExitCmd = EUniObjectsViewExit; + // Fallthrough + default: + // call parent class to process other commands. + CMsgViewAttachmentsDialog::ProcessCommandL( aCommandId ); + break; + } + + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::ProcessCommandOpenL +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::ProcessCommandOpenL( TInt aIndex ) + { + CUniObjectsInfo& selectedObject = + static_cast( iAttachmentModel.AttachmentInfoAt( aIndex ) ); + CUniObject* obj = selectedObject.Object(); + + if ( obj->MediaType() == EMsgMediaText ) + { + if ( !iBusy ) + { + iBusy = ETrue; + CleanupStack::PushL( TCleanupItem( CleanupPointer, &iBusy ) ); + + TUint mibCharset = obj->MimeInfo()->Charset(); + if ( !mibCharset ) + { + //assume US-ASCII - mandated by RFC 2046 + mibCharset = KCharacterSetMIBEnumUsAscii; + } + TUint charconvCharsetID = iDataModel.DataUtils().MibIdToCharconvIdL( mibCharset ); + + RFile file = CUniDataUtils::GetAttachmentFileL( iDataModel.Mtm(), obj->AttachmentId() ); + CleanupClosePushL( file ); + // Takes ownership of "file": + CNotepadApi::ExecFileViewerL( file, + NULL, + ETrue, + EFalse, + charconvCharsetID ); + CleanupStack::Pop( &file ); + + // sets iBusy to EFalse. + CleanupStack::PopAndDestroy(); // CleanupPointer + } + } + else + { + if ( iDialogType == EViewer ) + { + if ( selectedObject.IsSaved() ) + { + SetOpenParamList( NULL ); + } + else if ( !OpenParamList() ) + { + CAiwGenericParamList* paramList = CAiwGenericParamList::NewLC(); + //Applications that require Media Player to show the save + //option must set the EGenericParamAllowSave to ETrue. + //If they don't need the save option there is no need to set + //the parameter to EFalse. + TAiwVariant allowSaveVariant( ETrue ); + TAiwGenericParam genericParamAllowSave( EGenericParamAllowSave, + allowSaveVariant ); + paramList->AppendL( genericParamAllowSave ); + //paramList->AppendL( EGenericParamAllowSave ); + SetOpenParamList( paramList ); + CleanupStack::Pop( paramList ); + } + } + + CMsgViewAttachmentsDialog::ProcessCommandL( EMsgViewAttachmentCmdOpen ); + } + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::ProcessCommandSaveL +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::ProcessCommandSaveL( TInt aIndex ) + { + CUniObjectsInfo& selectedObject = static_cast + ( iAttachmentModel.AttachmentInfoAt( aIndex ) ); + CUniObject* obj = selectedObject.Object(); + if ( obj->MediaType() == EMsgMediaText ) + { + // Save text files directly to Notepad. + // This is needed because automatic character set recognation + // is not too reliable. + TUint mibCharset = obj->MimeInfo()->Charset(); + if ( !mibCharset ) + { + //assume US-ASCII - mandated by RFC 2046 + mibCharset = KCharacterSetMIBEnumUsAscii; + } + TUint charconvCharsetID = iDataModel.DataUtils().MibIdToCharconvIdL( mibCharset ); + + RFile file = CUniDataUtils::GetAttachmentFileL( iDataModel.Mtm(), obj->AttachmentId() ); + CleanupClosePushL( file ); + CNotepadApi::SaveFileAsMemoL( + file, + charconvCharsetID ); + CleanupStack::PopAndDestroy(); // file + + // Show confirmation note + RApaLsSession appList; + if ( appList.Connect() == KErrNone ) + { + TApaAppInfo appInfo; + if ( appList.GetAppInfo( appInfo, KNotepadUID3 ) == KErrNone ) + { + HBufC* text = StringLoader::LoadLC( R_UNUT_FILE_SAVED_TO, appInfo.iCaption ); + CAknConfirmationNote* note = new ( ELeave ) CAknConfirmationNote( ETrue ); + note->ExecuteLD( *text ); + CleanupStack::PopAndDestroy( text ); + } + appList.Close(); + } + + // Set saved information + selectedObject.SetSaved( ETrue ); + if ( obj ) + { + obj->SetSaved( ETrue ); + } + } + else + { + CMsgViewAttachmentsDialog::ProcessCommandL( EMsgViewAttachmentCmdSave ); + + // Set saved information + if ( selectedObject.IsSaved( ) + && obj ) + { + obj->SetSaved( ETrue ); + } + } + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::ProcessCommandRemoveL +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::ProcessCommandRemoveL( TInt aIndex ) + { + if ( ( aIndex != -1 ) && iAttachmentModel.NumberOfItems() ) + { + CMsgAttachmentInfo& attInfo = iAttachmentModel.AttachmentInfoAt( aIndex ); + + // Get the file name from atta info full path name. + TParsePtrC parser( attInfo.FileName() ); + TFileName fileName2( parser.NameAndExt() ); + + if ( fileName2.Length() == 0 ) + { + fileName2 = iDataModel.DataUtils().DefaultFileName(); + } + + HBufC* prompt = StringLoader::LoadLC( + R_UNUT_QUERY_COMMON_CONF_REMOVE, + fileName2, + iCoeEnv ); + + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + TInt ret = dlg->ExecuteLD( R_UNUT_REMOVE_OBJECT_QUERY, *prompt ); + + CleanupStack::PopAndDestroy( prompt ); + + if ( ret ) + { + TBool removingLastOfSlide = EFalse; + TBool setSeparatorToNext = EFalse; + if ( iDataModel.SmilModel().SlideObjectCount( SlideNumber( aIndex ) ) == 1 ) + { + removingLastOfSlide = ETrue; + } + else if ( ( ( aIndex + 1 ) < iAttachmentModel.NumberOfItems() ) && + ( SlideNumber( aIndex ) == SlideNumber( aIndex + 1 ) ) ) + { + CUniObjectsInfo& object = static_cast + ( iAttachmentModel.AttachmentInfoAt( aIndex ) ); + if ( object.IsSeparator() ) + { + setSeparatorToNext = ETrue; + } + } + + // updates listbox after calling RemoveAttachmentL. + CMsgViewAttachmentsDialog::ProcessCommandL( EMsgViewAttachmentCmdRemove ); + + if ( removingLastOfSlide ) + { + //removing the last object of the slide + CUniObjectsModel& objModel = + static_cast( iAttachmentModel ); + + CUniObjectsInfo* info = objModel.AddEmptySlideL( + iDataModel.DataUtils().EmptyPageString(), + aIndex ); + if ( aIndex ) + { + info->SetSeparator( ETrue ); + } + ItemAddedL( aIndex ); + } + else if ( setSeparatorToNext ) + { + CUniObjectsInfo& object2 = static_cast + ( iAttachmentModel.AttachmentInfoAt( aIndex ) ); + object2.SetSeparator( ETrue ); + } + } + } + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::ProcessCommandSendL +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::ProcessCommandSendL( CMessageData& aMsgData, + TInt aIndex, + TUid aServiceId, + TUid aBioUid ) + { + CUniObjectsInfo& selectedObject = static_cast + ( iAttachmentModel.AttachmentInfoAt( aIndex ) ); + CUniObject* obj = selectedObject.Object(); + + TFileName fileName; + CRichText* text = NULL; + CFileMan* fileManager = NULL; + TSendingCapabilities serviceCapabilities; + iSendUi->ServiceCapabilitiesL( aServiceId, + serviceCapabilities); + TInt supportsBodyText( serviceCapabilities.iFlags & TSendingCapabilities::ESupportsBodyText ); + + if ( // send as body text + ( obj->MediaType() == EMsgMediaText + && supportsBodyText ) + // send as atta + || ( obj->MediaType() == EMsgMediaText && + obj->MimeInfo()->Charset() != KCharacterSetMIBEnumUTF16BE && + obj->MimeInfo()->Charset() != KCharacterSetMIBEnumUTF16LE && + obj->MimeInfo()->Charset() != KCharacterSetMIBEnumUTF16 ) ) + { + aMsgData.ClearAttachmentArray(); + + fileManager = CFileMan::NewL( iEikonEnv->FsSession() ); + // CSa2 + CleanupStack::PushL( fileManager ); + CreateTempTextFileL( obj, fileName ); + if ( supportsBodyText ) + { + // send as body + text = CRichText::NewL( iEikonEnv->SystemParaFormatLayerL(), + iEikonEnv->SystemCharFormatLayerL(), + CEditableText::EFlatStorage ); + // CSa3 + CleanupStack::PushL(text); + text->ImportTextFileL(0,fileName,CPlainText::EOrganiseByParagraph); + + // does not take ownership + aMsgData.SetBodyTextL( text ); + } + else + { + aMsgData.AppendAttachmentL( fileName ); + } + } + // else - aMsgData has already the needed handle + + TRAPD( err, iSendUi->CreateAndSendMessageL( aServiceId, &aMsgData, aBioUid ) ); + if ( text ) + { + CleanupStack::PopAndDestroy( text ); + } + if ( fileManager ) + { + // Remove temp file & dir + fileManager->Delete( fileName ); + fileManager->RmDir( fileName ); // remove directory + CleanupStack::PopAndDestroy( fileManager ); + } + User::LeaveIfError( err ); + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::CreateTempTextFileL +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::CreateTempTextFileL( CUniObject* aObject, TFileName& aTempFileName ) + { + CreateTempPathL( aObject->MediaInfo()->FullFilePath(), aTempFileName ); + + TUint mibCharset = aObject->MimeInfo()->Charset(); + if ( !mibCharset ) + { + //assume US-ASCII - mandated by RFC 2046 + mibCharset = KCharacterSetMIBEnumUsAscii; + } + TUint charconvCharsetID = iDataModel.DataUtils().MibIdToCharconvIdL( mibCharset ); + + // Import text + CPlainText* text = CPlainText::NewL(); + CleanupStack::PushL( text ); + + RFile file = CUniDataUtils::GetAttachmentFileL( iDataModel.Mtm(), aObject->AttachmentId() ); + CleanupClosePushL( file ); + + RFileReadStream input_stream( file ); + CleanupClosePushL( input_stream ); + + CPlainText::TImportExportParam param; + param.iForeignEncoding = charconvCharsetID; + CPlainText::TImportExportResult result; + text->ImportTextL( 0, input_stream, param, result ); + + CleanupStack::PopAndDestroy( 2 ); // input_stream, file + + // Export text as UCS-2 + text->ExportAsTextL( aTempFileName, CPlainText::EOrganiseByParagraph, 0 ); + CleanupStack::PopAndDestroy(); //text + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::CreateTempPathL +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::CreateTempPathL( const TDesC& aFileName, TFileName& aTempFileName ) + { + // Create temp path + TParsePtrC parser( aFileName ); + MsgAttachmentUtils::GetMsgEditorTempPath( aTempFileName ); + aTempFileName.Append( KMmsFormatTwoDigits ); + TTime time; + time.UniversalTime(); + TBuf tempDir; + tempDir.Format( aTempFileName, I64HIGH( time.Int64() ), I64LOW( time.Int64() ) ); + iEikonEnv->FsSession().MkDir( tempDir ); + aTempFileName = tempDir; + aTempFileName.Append( parser.NameAndExt() ); + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::OfferKeyEventL +// +// Handles key events. +// --------------------------------------------------------- +// +TKeyResponse CUniObjectsViewDialog::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + if ( aType == EEventKey && !MenuShowing() ) + { + CUniObjectsInfo& selectedObject = static_cast + ( iAttachmentModel.AttachmentInfoAt( CurrentListItemIndex() ) ); + + TBool emptySlide = ( selectedObject.Flags() & CUniObjectsInfo::EMmsSlide ); + switch ( aKeyEvent.iCode ) + { + case EKeyEnter: + case EKeyOK: + if ( !emptySlide ) + { + ProcessCommandL(EMsgViewAttachmentCmdOpen); + } + return EKeyWasConsumed; + + default: + break; + } + + switch ( aKeyEvent.iScanCode ) + { + case EStdKeyBackspace: + case EStdKeyDelete: + { + if ( ( iDialogType == EEditor && + !emptySlide ) || + ( iDialogType == EForward && + iDataModel.AttachmentList().Count() != 0 && + SlideNumber( CurrentListItemIndex() == SlideNumber( iAttachmentModel.NumberOfItems() - 1 ) ) ) ) + { + // Delete object if in editor mode and something else that empty slide is focuse. + // On forward mode deleting is enabled when attachment is focused. + ProcessCommandL(EMsgViewAttachmentCmdRemove); + } + // else - No operation + return EKeyWasConsumed; + } + case EStdKeyYes: + case EStdKeyNo: + { + // No operation + return EKeyWasConsumed; + } + default: + { + // No operation by default + break; + } + } + } + + return CMsgViewAttachmentsDialog::OfferKeyEventL(aKeyEvent, aType); + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::DynInitMenuPaneL +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::DynInitMenuPaneL( TInt aMenuId, + CEikMenuPane* aMenuPane) + { + CMsgViewAttachmentsDialog::DynInitMenuPaneL( aMenuId, aMenuPane ); + + TInt index = CurrentListItemIndex(); + TInt currentSlide = SlideNumber( index ); + + if ( !(iSupportedFeatures & EUniFeatureHelp) ) + { + aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue ); + } + + switch ( aMenuId ) + { + case R_MEB_ATTACHMENTS_MENUPANE: + if ( index == -1 || ! iAttachmentModel.NumberOfItems() ) + { + // no selection or empty list. + + aMenuPane->SetItemDimmed( EMsgViewAttachmentCmdOpen, ETrue ); + + if ( iDialogType == EEditor ) + { + aMenuPane->SetItemDimmed( EMsgViewAttachmentCmdRemove, ETrue ); + } + else if ( iDialogType == EViewer ) + { + aMenuPane->SetItemDimmed( EMsgViewAttachmentCmdSave, ETrue ); + } + } + else + { + CUniObjectsInfo& selectedObject = static_cast + ( iAttachmentModel.AttachmentInfoAt( index ) ); + + if ( iDialogType == EEditor ) + { + if ( selectedObject.Flags() & CUniObjectsInfo::EMmsSlide ) + { + aMenuPane->SetItemDimmed( EMsgViewAttachmentCmdOpen, ETrue ); + aMenuPane->SetItemDimmed( EMsgViewAttachmentCmdRemove, ETrue ); + } + TUniLayout layout = iDataModel.SmilModel().Layout(); + if ( layout == EUniTextFirst ) + { + aMenuPane->SetItemDimmed( EMmsObjectsTextFirst, ETrue ); + } + else if ( layout == EUniImageFirst ) + { + aMenuPane->SetItemDimmed( EMmsObjectsTextSecond, ETrue ); + } + + // either image or text object present but no both: no order menus. + // Not shown on Japanese variant ever. + if ( !IsImageAndTextPresent() || + iSupportedFeatures & EUniFeatureJapanese ) + { + aMenuPane->SetItemDimmed( EMmsObjectsTextFirst, ETrue ); + aMenuPane->SetItemDimmed( EMmsObjectsTextSecond, ETrue ); + } + } + else if ( iDialogType == EViewer ) + { + CUniObject* obj = selectedObject.Object(); + TBool showSendMenu = ETrue; + + if ( selectedObject.Flags() & CUniObjectsInfo::EMmsSlide ) + { + aMenuPane->SetItemDimmed( EMsgViewAttachmentCmdOpen, ETrue ); + aMenuPane->SetItemDimmed( EMsgViewAttachmentCmdSave, ETrue ); + showSendMenu = EFalse; + } + if ( index != -1 ) + { + // Catch this leave. If something peculiar coming in msg headers + // and atta not natively handled by viewer CanSave might leave. + // ETC. application/x-epocinstall + TBool canSave = EFalse; + TRAPD( err, canSave = iDocHandler->CanSaveL( selectedObject.DataType() ) ); + if ( err ) + { + canSave = EFalse; + } + if ( !canSave ) + { + aMenuPane->SetItemDimmed( EMsgViewAttachmentCmdSave, ETrue ); + } + + // Send menu if full OMA DRM and mime type does not belong to CCL + if ( !obj || + ( ! ( iSupportedFeatures & EUniFeatureDrmFull ) && + obj->MediaInfo()->Protection() != EFileProtNoProtection ) + // SD closed content objects can be forwarded. + // UI spec allows FL items to be sent from objects view, + // however, Send UI blocks sending. + || ( iSupportedFeatures & EUniFeatureDrmFull && + obj->MediaInfo()->Protection() == EFileProtClosedContent ) ) + { + showSendMenu = EFalse; + } + } + + if ( iSendUi && showSendMenu ) + { + TInt pos = 0; + aMenuPane->ItemAndPos( EAknCmdExit, pos ); + + if ( iSupportedFeatures & EUniFeatureHelp ) + { + pos -= 1; + } + // TSendingCapabilities::ESupportsAttachments is enough + // although bio and body text are possible but they are + // subset of attachment support + iSendUi->AddSendMenuItemL( + *aMenuPane, + pos, + EMmsObjectsSendVia, + TSendingCapabilities( + 0, + 0, + TSendingCapabilities::ESupportsAttachments ) + ); + } + } + else if ( iDialogType == EForward ) + { + // show remove for attachments... + if ( !( iDataModel.AttachmentList().Count() && + currentSlide == SlideNumber( iAttachmentModel.NumberOfItems() - 1 ) ) ) + { + // the attachments are in the last "slide" + aMenuPane->SetItemDimmed( EMsgViewAttachmentCmdRemove, ETrue ); + } + } + } + break; + + default: + break; + } + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::HandleServerAppExit +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::HandleServerAppExit( TInt aReason ) + { + CMsgViewAttachmentsDialog::HandleServerAppExit( aReason ); + + TInt currentIndex( CurrentListItemIndex() ); + + CUniObjectsInfo& selectedObject = + static_cast( iAttachmentModel.AttachmentInfoAt( currentIndex ) ); + CUniObject* obj = selectedObject.Object(); + + CMsgAttachmentInfo::TDRMDataType drmType = CMsgAttachmentInfo::ENoLimitations; + TRAPD( error, drmType = static_cast( GetObjectsInfoDRMTypeL( *obj ) ) ); + + if ( error == KErrNone && + drmType != selectedObject.DRMDataType() ) + { + selectedObject.SetDRMDataType( drmType ); + UpdateIcon( currentIndex ); + } + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::SlideNumber +// --------------------------------------------------------- +// +TInt CUniObjectsViewDialog::SlideNumber( TInt aIndex ) + { + TInt currentSlide = 0; + for ( TInt i = 0; i <= aIndex; i++ ) + { + CUniObjectsInfo& object = static_cast + ( iAttachmentModel.AttachmentInfoAt( i ) ); + if ( object.IsSeparator() ) + { + currentSlide++; + } + } + return currentSlide; + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::IsImageAndTextPresent +// --------------------------------------------------------- +// +TBool CUniObjectsViewDialog::IsImageAndTextPresent() + { + TBool textFound = EFalse; + TBool imageFound = EFalse; + TInt slides = iDataModel.SmilModel().SlideCount(); + for ( TInt i = 0; i < slides && !( textFound && imageFound ); i++ ) + { + if ( !textFound && iDataModel.SmilModel().GetObject( i, EUniRegionText ) ) + { + textFound = ETrue; + } + if ( !imageFound && iDataModel.SmilModel().GetObject( i, EUniRegionImage ) ) + { + imageFound = ETrue; + } + } + return ( textFound && imageFound ); + } + + +// --------------------------------------------------------- +// CUniObjectsViewDialog::RemoveAttachmentL +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::RemoveAttachmentL( TInt aIndex ) + { + CUniObjectsModel& objModel = static_cast( iAttachmentModel ); + + // delete item from attachment model (notifies its observer about deletion). + objModel.DeleteObjectL( aIndex, ETrue ); + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::ChangeOrderL +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::ChangeOrderL( TInt aCommandId, + TInt /*aNewPosition*/ ) + { + CUniObjectsModel& objModel = static_cast( iAttachmentModel ); + + TInt count = iAttachmentModel.NumberOfItems(); + TInt currentSlide = 0; + TInt i = 0; + + while ( i < count ) + { + CUniObjectsInfo& firstObject = static_cast + ( iAttachmentModel.AttachmentInfoAt( i ) ); + i++; + if ( i < count ) + { + if ( currentSlide == SlideNumber( i ) ) + { + CUniObjectsInfo& secondObject = static_cast + ( iAttachmentModel.AttachmentInfoAt( i ) ); + if ( secondObject.Type() != MsgAttachmentUtils::EAudio ) + { + if ( firstObject.IsSeparator() ) + { + firstObject.SetSeparator( EFalse ); + secondObject.SetSeparator( ETrue ); + } + objModel.ChangeOrderL( i, i - 1 ); + iListBox->HandleItemAdditionL(); + i++; + if ( i < count ) + { + if ( currentSlide == SlideNumber( i ) ) + { + // there was 3rd object on the same slide + i++; + } + } + } + else + { + // second object was audio + // its always the last object of the slide + i++; + } + } + } + currentSlide++; + } + + TUniLayout layout( EUniTextFirst ); + if ( aCommandId == EMmsObjectsTextSecond ) + { + layout = EUniImageFirst; + } + objModel.NotifyChangeOrderL( layout ); + } + +// ---------------------------------------------------- +// CUniObjectsViewDialog::LaunchHelpL +// launch help using context +// ---------------------------------------------------- +// +void CUniObjectsViewDialog::LaunchHelpL() + { + if ( iSupportedFeatures & EUniFeatureHelp ) + { + CCoeAppUi* editorAppUi = static_cast( ControlEnv()->AppUi() ); + + CArrayFix* helpContext = editorAppUi->AppHelpContextL(); + HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), helpContext ); + } + } + +// ---------------------------------------------------- +// CUniObjectsViewDialog::GetHelpContext +// returns helpcontext as aContext +// ---------------------------------------------------- +// +void CUniObjectsViewDialog::GetHelpContext( TCoeHelpContext& aContext ) const + { + if ( iSupportedFeatures & EUniFeatureHelp ) + { + if ( iDialogType == EViewer ) + { + aContext.iContext = KMMS_HLP_OBJECTS_VIEW_VIEWER; + aContext.iMajor = KUidMmsViewer; + } + else + { + aContext.iContext = KUNIFIED_HLP_ED_OBJECTS; + aContext.iMajor = KUniEditorAppId; + } + } + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::BioMessageTypeL +// --------------------------------------------------------- +// +TBool CUniObjectsViewDialog::BioMessageTypeL( TPtrC8 aMimeType, + TUid& aBioUid ) + { + // Check bio message type + TBool isBio = EFalse; + HBufC* sample = HBufC::NewLC( aMimeType.Length() ); + TPtr samplePtr = sample->Des(); + samplePtr.Copy( aMimeType ); + + // need to create local RFs for BIO otherwise raises exception + RFs& fs( CCoeEnv::Static()->FsSession() ); + CBIODatabase* bioDB = CBIODatabase::NewLC( fs ); + + // IsBioMessageL returns KErrNone if found or KErrNotFound if not found + if ( bioDB->IsBioMessageL( EBioMsgIdIana, samplePtr, NULL, aBioUid ) == KErrNone) + { + isBio = ETrue; + } + CleanupStack::PopAndDestroy( 2, sample ); // + bioDb + + return isBio; + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::PopulateAttachmentModelL +// +// Creates new attachment model from smilmodel content for +// objectsview usage +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::PopulateAttachmentModelL( CUniObjectsModel& aObjectsViewModel, + CUniDataModel& aUniDataModel ) + { + TInt slideCount = 0; + TUniSmilType smilType( aUniDataModel.SmilType() ); + + if ( smilType == EMmsSmil || + smilType == ENoSmil || + smilType == EMultipleSmil ) + { + slideCount = aUniDataModel.SmilModel().SlideCount(); + // Populate attamodel from smilmodel + for ( TInt i = 0; i < slideCount; i++ ) + { + if ( !aUniDataModel.SmilModel().SlideObjectCount( i ) ) + { + CUniObjectsInfo* info = aObjectsViewModel.AddEmptySlideL( + aUniDataModel.DataUtils().EmptyPageString() ); + if ( i ) // no separator for first slide + { + info->SetSeparator(ETrue); + } + } + + for ( TInt ii = 0; ii < aUniDataModel.SmilModel().SlideObjectCount( i ); ii++ ) + { + CUniObjectsInfo* info = CreateObjectsInfoL( + aObjectsViewModel, + *aUniDataModel.SmilModel().GetObjectByIndex( i, ii ), + EFalse, + i ); + // Slide separators. Drawn on top of list item -> needs to be drawn for + // first item in slide. Don't draw for the first slide. + if ( info && i > 0 && ii == 0 ) + { + info->SetSeparator( ETrue ); + } + } + } + } + else + { + slideCount = Max( aUniDataModel.ObjectList().Count(), 1 ); + for ( TInt j = 0; j < aUniDataModel.ObjectList().Count(); j++ ) + { + CreateObjectsInfoL( aObjectsViewModel, + *aUniDataModel.ObjectList().GetByIndex( j ), + EFalse, + 0 ); + } + } + + //add attachments to the end + for ( TInt k = 0; k < aUniDataModel.AttachmentList().Count(); k++ ) + { + CUniObjectsInfo* info = CreateObjectsInfoL( aObjectsViewModel, + *aUniDataModel.AttachmentList().GetByIndex( k ), + ETrue, + -1 ); + info->SetSupported( EFalse ); + if ( k == 0 && slideCount ) + { + info->SetSeparator( ETrue ); + } + } + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::CreateObjectsInfoL +// +// Creates CUniObjectsInfo object ands it to objects view +// model. Objects view model has the ownership of the +// new CUniObjectsInfo object. +// --------------------------------------------------------- +// +CUniObjectsInfo* CUniObjectsViewDialog::CreateObjectsInfoL( CUniObjectsModel& aObjectsViewModel, + CUniObject& aObject, + TBool aAttachmentObject, + TInt aSlideNumber ) + { + CUniObjectsInfo* info = NULL; + TInt drmType = GetObjectsInfoDRMTypeL( aObject ); + info = aObjectsViewModel.AddObjectL( aObject, drmType, aAttachmentObject, aSlideNumber ); + + TBool supported = ETrue; + switch ( aObject.MediaType() ) + { + case EMsgMediaText: + info->SetType( MsgAttachmentUtils::ENote ); + break; + case EMsgMediaImage: + info->SetType( MsgAttachmentUtils::EImage ); + break; + case EMsgMediaVideo: + info->SetType( MsgAttachmentUtils::EVideo ); + break; + case EMsgMediaAudio: + info->SetType( MsgAttachmentUtils::EAudio ); + break; +#ifdef RD_SVGT_IN_MESSAGING + case EMsgMediaSvg: + { + info->SetType( MsgAttachmentUtils::ESVG ); + break; + } +#endif + default: + info->SetType( MsgAttachmentUtils::EUnknown ); + supported = EFalse; + break; + } + info->SetSupported( supported ); + return info; + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::GetObjectsInfoDRMTypeL +// --------------------------------------------------------- +// +TInt CUniObjectsViewDialog::GetObjectsInfoDRMTypeL( CUniObject& aObject ) + { + if ( aObject.DrmInfo() && + ( aObject.MediaInfo()->Protection() & + ( EFileProtForwardLocked | EFileProtSuperDistributable ) ) ) + { + // Changed EFalse->ETrue. + // Use case to motivate this: object has not no rights -> Objects view -> + // player launched -> rights are retrieved -> back to objects view -> + // back to viewer -> object view again: in this phase wrong icon + // would be shown unless rights are resolved again + if ( aObject.DrmInfo()->RightsValidL( ETrue ) ) + { + if ( aObject.MediaInfo()->Protection() & EFileProtForwardLocked ) + { + return CMsgAttachmentInfo::EForwardLockedOrCombinedDelivery; + } + else // EMmsSuperDistributable + { + return CMsgAttachmentInfo::ESeparateDeliveryValidRights; + } + } + else + { + if ( aObject.MediaInfo()->Protection() & EFileProtForwardLocked ) + { + return CMsgAttachmentInfo::ECombinedDeliveryInvalidRights; + } + else // EMmsSuperDistributable + { + return CMsgAttachmentInfo::ESeparateDeliveryInvalidRights; + } + } + } + return CMsgAttachmentInfo::ENoLimitations; + } + +// --------------------------------------------------------- +// CUniObjectsViewDialog::GetObjectsInfoDRMTypeL +// --------------------------------------------------------- +// +void CUniObjectsViewDialog::HandleUniObjectEvent( CUniObject& aUniObject, + TUniObjectEvent aUniEvent ) + { + UNILOGGER_ENTERFN( "CUniObjectsViewDialog::HandleUniObjectEvent" ); + if ( aUniEvent == EUniObjectEventDrmRightsChanged + && aUniObject.DrmInfo() + && ( ( IsDrmRightsWhenLoaded( aUniObject ) + && !IsRightsNow( aUniObject ) ) + || ( !IsDrmRightsWhenLoaded( aUniObject ) + && IsRightsNow( aUniObject ) ) + ) + ) + { + CMsgAttachmentInfo::TDRMDataType drmType = CMsgAttachmentInfo::ENoLimitations; + if ( IsRightsNow( aUniObject ) ) + { + if ( aUniObject.MediaInfo()->Protection() & EFileProtForwardLocked ) + { + drmType = CMsgAttachmentInfo::EForwardLockedOrCombinedDelivery; + } + else // EMmsSuperDistributable + { + drmType = CMsgAttachmentInfo::ESeparateDeliveryValidRights; + } + } + else + { + if ( aUniObject.MediaInfo()->Protection() & EFileProtForwardLocked ) + { + drmType = CMsgAttachmentInfo::ECombinedDeliveryInvalidRights; + } + else // EMmsSuperDistributable + { + drmType = CMsgAttachmentInfo::ESeparateDeliveryInvalidRights; + } + } + UNILOGGER_WRITEF( _L("CUniObjectsViewDialog::HandleUniObjectEvent: drmType = %d "), drmType ); + + // when 'DRM rights when loaded info' + aUniObject.SetDrmRightsWhenLoadedObjects( IsRightsNow( aUniObject ) ); + + // search for the CUniObjectsInfo + CUniObjectsModel& model( static_cast( iAttachmentModel ) ); + TInt countObjects = model.NumberOfItems( ); + for ( TInt i = 0; i < countObjects; i++ ) + { + CUniObjectsInfo& uniObjectInfo = + static_cast( model.AttachmentInfoAt( i ) ); + + CUniObject* obj = uniObjectInfo.Object(); + if ( obj == &aUniObject ) + { + if ( drmType != uniObjectInfo.DRMDataType() ) + { + UNILOGGER_WRITE( "CUniObjectsViewDialog::HandleUniObjectEvent setting new icon " ); + uniObjectInfo.SetDRMDataType( drmType ); + } + } + } + DrawNow( ); + } + } + +// --------------------------------------------------------- +// IsRightsNow +// --------------------------------------------------------- +// +TBool CUniObjectsViewDialog::IsRightsNow( CUniObject& aObject ) const + { + TBool rightsNow( EFalse ); + if ( aObject.DrmInfo( ) ) + { + TInt consumed( EFalse ); + // KErrNone: rights exist + rightsNow = !aObject.DrmInfo( )->EvaluateRights( consumed ); + } + UNILOGGER_WRITEF( _L("CUniObjectsViewDialog::IsRightsNow: rightsNow = %d "), rightsNow ); + return rightsNow; + } + +// --------------------------------------------------------- +// IsDrmRightsWhenLoaded +// --------------------------------------------------------- +// +TBool CUniObjectsViewDialog::IsDrmRightsWhenLoaded( CUniObject& aObject ) const + { + // Separate function just because of LOG traces + TBool rightsWhenLoaded = aObject.IsDrmRightsWhenLoadedObjects(); + UNILOGGER_WRITEF( _L("CUniObjectsViewDialog::IsDrmRightsWhenLoaded: rightsWhenLoaded = %d "), rightsWhenLoaded ); + return rightsWhenLoaded; + } + +// End of File