mobilemessaging/unieditor/utils/src/UniObjectsViewDialog.cpp
changeset 0 72b543305e3a
child 9 1d7827e39b52
--- /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 <gulicon.h>
+#include <eikenv.h>                         // Eikon Enviroment
+#include <eikdll.h>                         // Application start
+#include <eikmenup.h>                       // for CEikMenuPane
+#include <eikmenub.h>                       // for CEikMenuBar
+#include <bautils.h>                        // NearestLanguageFile
+#include <aknlists.h>
+#include <apgcli.h>                         // RApaLsSession
+#include <AknQueryDialog.h>
+#include <aknnotewrappers.h>
+#include <DocumentHandler.h>                // doc handler
+#include <StringLoader.h>                   // StringLoader
+#include <data_caging_path_literals.hrh> 
+#include <txtrich.h>                        // CRichText
+#include <avkon.hrh>
+
+#include <mmsvattachmentmanager.h>
+#include <msvstore.h>
+#include <msvstd.h>                         // TMsvId
+#include <biodb.h>                          // CBioDatabase
+#include <mtclbase.h>
+
+#include <NpdApi.h>
+
+#include <sendui.h>
+#include <SenduiMtmUids.h>
+#include <Sendnorm.rsg>
+#include <CMessageData.h>
+
+#include <msgtextutils.h>
+#include <MsgMediaInfo.h>
+
+#include <MsgEditorAppUi.rsg>               // atta dlg base resouce identifiers
+#include <UniUtils.rsg>                    // obj view resouce identifiers
+#include <AiwGenericParam.h>
+
+// Features
+#include <featmgr.h>    
+
+#include <fileprotectionresolver.h>
+
+// Help
+#include <csxhelp/unif.hlp.hrh>
+#include <csxhelp/mms.hlp.hrh>
+#include <hlplch.h>   // For HlpLauncher
+
+#include "UniUtils.h"
+
+#include <unimodelconst.h>
+#include <unidatamodel.h>
+#include <unidatautils.h>
+#include <uniobject.h>
+#include <unidrminfo.h>
+#include <unismilmodel.h>
+#include <uniobjectlist.h>
+#include <unimimeinfo.h>
+#include <uniobjectsinfo.h>
+#include <uniobjectsmodel.h>
+
+#include <MsgEditorCommon.h>
+#include <MsgMimeTypes.h>
+
+#include <MsgEditorAppUi.hrh>               // atta dlg base commands
+#include "UniObjectsViewDialog.hrh"         // obj view commands
+
+#include <UniUtils.rsg>
+
+#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<CUniObjectsModel&>( iAttachmentModel ) );
+    TInt countObjects = model.NumberOfItems( );
+    for ( TInt i = 0; i < countObjects; i++ )
+        {
+        CUniObject* obj = 
+            static_cast<CUniObjectsInfo&>
+                ( 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<CUniObjectsModel&>( iAttachmentModel ) );
+    TInt countObjects = model.NumberOfItems( );
+    for ( TInt i = 0; i < countObjects; i++ )
+        {
+        CUniObject* obj = 
+            static_cast<CUniObjectsInfo&>
+                ( 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<CGulIcon>( 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<CUniObjectsInfo&>
+                        ( iAttachmentModel.AttachmentInfoAt( CurrentListItemIndex() ) );   
+            TBool emptySlide = ( selectedObject.Flags() & CUniObjectsInfo::EMmsSlide );
+            if(emptySlide)
+                break;
+            ProcessCommandRemoveL( index );
+            }
+            break;
+
+        case EAknCmdHelp:
+            {
+            LaunchHelpL();
+            }
+            break;
+        
+        case EMmsObjectsSendVia:
+            {
+            CArrayFix<TUid>* uids = new ( ELeave ) CArrayFixFlat<TUid>( 1 );
+            CleanupStack::PushL( uids );
+            
+            CUniObjectsInfo& selectedObject = static_cast<CUniObjectsInfo&>
+                ( 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<CUniObjectsInfo&>( 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<CUniObjectsInfo&>
+        ( 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<CUniObjectsInfo&>
+                    ( 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<CUniObjectsModel&>( iAttachmentModel );
+
+                CUniObjectsInfo* info = objModel.AddEmptySlideL(
+                    iDataModel.DataUtils().EmptyPageString(),
+                    aIndex );
+                if ( aIndex )
+                    {
+                    info->SetSeparator( ETrue );
+                    }
+                ItemAddedL( aIndex );
+                }
+            else if ( setSeparatorToNext )
+                {
+                CUniObjectsInfo& object2 = static_cast<CUniObjectsInfo&>
+                    ( iAttachmentModel.AttachmentInfoAt( aIndex ) );
+                object2.SetSeparator( ETrue );
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CUniObjectsViewDialog::ProcessCommandSendL
+// ---------------------------------------------------------
+//
+void CUniObjectsViewDialog::ProcessCommandSendL( CMessageData&   aMsgData, 
+                                                 TInt aIndex, 
+                                                 TUid aServiceId,
+                                                 TUid aBioUid )
+    {
+    CUniObjectsInfo& selectedObject = static_cast<CUniObjectsInfo&>
+        ( 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<KMaxFileName> 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<CUniObjectsInfo&>
+            ( 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<CUniObjectsInfo&>
+                    ( 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<CUniObjectsInfo&>( iAttachmentModel.AttachmentInfoAt( currentIndex ) );
+    CUniObject* obj = selectedObject.Object();
+    
+    CMsgAttachmentInfo::TDRMDataType drmType = CMsgAttachmentInfo::ENoLimitations;
+    TRAPD( error, drmType = static_cast<CMsgAttachmentInfo::TDRMDataType>( 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<CUniObjectsInfo&>
+            ( 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<CUniObjectsModel&>( 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<CUniObjectsModel&>( iAttachmentModel );
+
+    TInt count = iAttachmentModel.NumberOfItems();
+    TInt currentSlide = 0;
+    TInt i = 0;
+
+    while ( i < count )
+        {
+        CUniObjectsInfo& firstObject = static_cast<CUniObjectsInfo&>
+            ( iAttachmentModel.AttachmentInfoAt( i ) );
+        i++;
+        if ( i < count )
+            {
+            if ( currentSlide == SlideNumber( i ) )
+                {
+                CUniObjectsInfo& secondObject = static_cast<CUniObjectsInfo&>
+                    ( 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<CCoeAppUi*>( ControlEnv()->AppUi() );
+
+        CArrayFix<TCoeHelpContext>* 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<CUniObjectsModel&>( iAttachmentModel ) );
+        TInt countObjects = model.NumberOfItems( );
+        for ( TInt i = 0; i < countObjects; i++ )
+            {
+            CUniObjectsInfo&  uniObjectInfo =
+                static_cast<CUniObjectsInfo&>( 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