mobilemessaging/mmsui/viewersrc/MmsViewerHeader.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/mmsui/viewersrc/MmsViewerHeader.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,447 @@
+/*
+* Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*       MMS viewer header
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <eikrted.h>
+
+#include <commonphoneparser.h>
+
+#include <mmsgenutils.h>
+#include <mmsmsventry.h>
+
+#include <messagingvariant.hrh>
+
+#include <MsgExpandableControl.h>
+#include <MsgAddressControl.h>
+
+#include <MmsViewer.rsg>
+#include "MmsViewer.hrh"
+#include "MmsViewerHeader.h"
+
+#include <mmsclient.h>
+#include <MsgMediaInfo.h>
+#include <MsgAttachmentControl.h>
+#include <uniaddresshandler.h>
+#include <uniobjectlist.h>
+#include "UniMmsViewerDocument.h"
+
+
+// ==========================================================
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+GLREF_C void Panic( TMmsViewerExceptions aPanic ); 
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CMmsViewerHeader::CMmsViewerHeader
+//
+// Constructor.
+// ---------------------------------------------------------
+//
+CMmsViewerHeader::CMmsViewerHeader( CMmsClientMtm& aMtm,
+                                    CUniObjectList& aAttachmentList,
+                                    CMsgEditorView& aView,
+                                    RFs& aFs )
+    : CUniBaseHeader( aMtm, aView, aFs ),
+    iAttachmentList( aAttachmentList )
+    {
+    }
+
+
+// ---------------------------------------------------------
+// CMmsViewerHeader::ConstructL
+//
+//
+// ---------------------------------------------------------
+//
+void CMmsViewerHeader::ConstructL( )
+    {
+    
+    AddHeadersVariationL( EFalse );
+    AddHeadersConfigL( );
+             
+        // subject is shown, if configured or contains data
+        // (even if variated off )     
+    const TPtrC subject = iMtm.SubjectL();
+    if (    iAddHeadersConfig & EUniFeatureSubject
+        ||  subject.Length() )
+        {
+        iAddDelayed |= EUniFeatureSubject;
+        }
+    iAddDelayed |= EUniFeatureAttachment;
+    TBool mobileTerminated( ETrue );
+    TInt addressesInStore = MtmAddressTypes();
+    
+    TMmsMsvEntry mmsEntry =
+        static_cast<TMmsMsvEntry>( iMtm.Entry().Entry() );
+    mobileTerminated = mmsEntry.IsMobileTerminated();
+    if ( mobileTerminated )
+        {
+        iAddDelayed |= EUniFeatureFrom;
+        }
+    else
+        {
+        // see also below necessity of the To: field   
+        if ( addressesInStore & EUniFeatureTo )
+            {
+            iAddDelayed |= EUniFeatureTo;
+            }
+               
+        if (    iAddHeadersVariation & EUniFeatureCc
+            &&  addressesInStore & EUniFeatureCc )
+            {
+                // variated on and contains data
+            iAddDelayed |= EUniFeatureCc;
+            }
+            // show in the other field if variated off
+        else if (   ! ( iAddHeadersVariation & EUniFeatureCc ) 
+                &&  addressesInStore & EUniFeatureCc )
+            {
+            // Cc: data exists, add it into To:
+            iAddDelayed |= EUniFeatureTo;
+            iAddIntoOtherCc |= EUniFeatureTo;
+            }
+        
+        if (    iAddHeadersVariation & EUniFeatureBcc
+            &&  addressesInStore & EUniFeatureBcc )
+            {
+            // variated on and contains data
+            iAddDelayed |= EUniFeatureBcc;
+            }
+            // show in the other field if variated off
+        else if (   ! ( iAddHeadersVariation & EUniFeatureBcc ) 
+                &&  addressesInStore & EUniFeatureBcc )
+            {
+            if ( iAddHeadersVariation & EUniFeatureCc )
+                {
+                // Bcc: data exists, add it into Cc:
+                iAddDelayed |= EUniFeatureCc;
+                iAddIntoOtherBcc |= EUniFeatureCc;
+                }
+            else
+                {
+                // No Cc:, must be added into To:
+                iAddDelayed |= EUniFeatureTo;
+                iAddIntoOtherBcc |= EUniFeatureTo;
+                }
+            }
+            
+        }        
+    DoAddToViewL( ETrue );          
+    }
+
+// ---------------------------------------------------------
+// CMmsViewerHeader::NewL
+//
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+CMmsViewerHeader* CMmsViewerHeader::NewL( CMmsClientMtm& aMtm,
+                                          CUniObjectList& aAttachmentList,
+                                          CMsgEditorView& aView,
+                                          RFs& aFs )
+    {
+    CMmsViewerHeader* self = new ( ELeave ) CMmsViewerHeader(
+        aMtm, aAttachmentList, aView, aFs );
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------
+// CMmsViewerHeader::~CMmsViewerHeader
+// ---------------------------------------------------------
+CMmsViewerHeader::~CMmsViewerHeader()
+    {
+    delete iAlias;
+    }
+
+// ---------------------------------------------------------
+// InsertRecipientL
+// ---------------------------------------------------------
+void CMmsViewerHeader::InsertRecipientL(TAddressData&   aData,
+                                        THeaderFields   aRecipientType,
+                                        TBool           aReadContent)
+    {
+    TInt res( R_MMSVIEWER_TO );
+    TInt flag( EUniFeatureTo );
+    
+    if ( aRecipientType == EHeaderAddressCc )
+        {
+        res = R_MMSVIEWER_CC;
+        flag = EUniFeatureCc;
+        }
+    else if ( aRecipientType == EHeaderAddressBcc )
+        {
+        res = R_MMSVIEWER_BCC;
+        flag = EUniFeatureBcc;
+        }
+    else if ( aRecipientType != EHeaderAddressTo )
+        {
+        return;
+        }
+
+    DoInsertRecipientL( aData,
+                        res,
+                        aReadContent,
+                        flag );          // read from MTM
+    }
+
+// ---------------------------------------------------------
+// DoInsertRecipientL
+// ---------------------------------------------------------
+void CMmsViewerHeader::DoInsertRecipientL(  TAddressData&   aData,
+                                            TInt            aResource,
+                                            TBool           /*aReadContent*/,
+                                            TInt            aAddHeadersRecipientType )
+    {    
+            // cannot add existing control
+    __ASSERT_DEBUG( !aData.iControl, Panic( EMmsViewerNullPointer ) );
+    
+    const CMsvRecipientList& addresses = iMtm.AddresseeList();
+    iView.AddControlFromResourceL(  aResource, 
+                                    EMsgAddressControl, 
+                                    EMsgAppendControl, 
+                                    EMsgHeader );
+    aData.iControl = static_cast<CMsgAddressControl*>
+        ( iView.ControlById( aData.iControlType ) );
+    aData.iOwned = EFalse;
+
+    CMsgRecipientList* recipientList = CMsgRecipientList::NewL();
+    CleanupStack::PushL( recipientList );
+
+    TInt count = addresses.Count();
+    TMsvRecipientTypeValues msvRecipientType( aData.iRecipientTypeValue );
+    for (TInt k = aData.iRecipientTypeValue; k <= EMsvRecipientBcc ; k++ )
+        {
+        // on the first round copy 'native' addresses then additional headers
+        if (    k == 1 
+            && iAddIntoOtherCc & aAddHeadersRecipientType )
+            {
+            msvRecipientType = EMsvRecipientCc;
+            }      
+        else if (   k == 2
+                &&  iAddIntoOtherBcc & aAddHeadersRecipientType )
+            {
+            msvRecipientType = EMsvRecipientBcc;
+            }      
+        if (    k > aData.iRecipientTypeValue 
+            &&  msvRecipientType == aData.iRecipientTypeValue )
+            {
+            // no update in  the initial value
+            continue;
+            }
+
+        for ( TInt i = 0; i < count; i++)
+            {
+            if ( addresses.Type(i) == msvRecipientType )
+                {            
+                CMsgRecipientItem* recipient = CMsgRecipientItem::NewLC(
+                    TMmsGenUtils::Alias( addresses[i] ),
+                    TMmsGenUtils::PureAddress( addresses[i] ) );
+                recipient->SetVerified( ETrue );
+                recipientList->AppendL( recipient );
+                CleanupStack::Pop( recipient );
+                recipient = NULL;
+                }
+            }
+        }
+    static_cast<CMsgAddressControl*>( aData.iControl )->AddRecipientsL( *recipientList );
+    aData.iControl->Editor().SetCursorPosL( 0, EFalse );
+
+    CleanupStack::PopAndDestroy( recipientList );
+    }
+        
+// ---------------------------------------------------------
+// InsertFromL
+// ---------------------------------------------------------
+void CMmsViewerHeader::InsertFromL( TBool /*aReadContent*/ )
+    {
+    iView.AddControlFromResourceL( R_MMSVIEWER_FROM, EMsgAddressControl, EMsgAppendControl, EMsgHeader );
+    iHeaders[EHeaderAddressFrom].iControl = static_cast<CMsgAddressControl*>
+        ( iView.ControlById( EMsgComponentIdFrom ) );
+    iHeaders[EHeaderAddressFrom].iOwned = EFalse;
+
+    const TPtrC sender = static_cast<CMmsClientMtm&>(iMtm).Sender();
+    const TPtrC details = iMtm.Entry().Entry().iDetails;
+    
+    if ( sender.Length() )
+        {
+        iSenderType = MsvUiServiceUtilitiesInternal::ResolveAddressTypeL(    
+            TMmsGenUtils::PureAddress( sender ),
+                        CommonPhoneParser::ESMSNumber );
+        
+        if ( iSenderType != EMuiuAddressTypePhoneNumber )
+            {
+            //We trust on that there won't be illegal addresses
+            //in received messages
+            iSenderType = EMuiuAddressTypeEmail;
+            }
+        
+        //Check if MMS engine has put an alias into iDetails field
+        if ( sender.Compare( details ) != 0 )
+            {
+            TPtrC alias = KNullDesC();
+            if ( details.Length() && !iAlias )
+                {
+                iAlias = details.AllocL( );
+                alias.Set( *iAlias );
+                }
+
+            // Resolve whether this is remote alias. Local alias takes precedence
+            TPtrC tempAlias( TMmsGenUtils::Alias( sender ) );
+            if (    iAlias
+                &&  tempAlias.Length()
+                &&  !tempAlias.CompareF( *iAlias ) )
+                
+                {
+                iRemoteAlias = ETrue;
+                }
+
+            MVPbkContactLink* link = NULL;
+            static_cast<CMsgAddressControl*>( iHeaders[EHeaderAddressFrom].iControl )
+                ->AddRecipientL( alias,
+                TMmsGenUtils::PureAddress( sender ),
+                ETrue,
+                link );
+            }
+        else
+            {
+            MVPbkContactLink* link = NULL;
+            static_cast<CMsgAddressControl*>( iHeaders[EHeaderAddressFrom].iControl )
+                ->AddRecipientL( TMmsGenUtils::Alias( sender ),
+                TMmsGenUtils::PureAddress( sender ),
+                ETrue,
+                link );
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// RemoveSubjectContentL
+// ---------------------------------------------------------
+//
+void CMmsViewerHeader::RemoveSubjectContentL( )
+    {
+    if (    iHeaders[EHeaderSubject].iControl 
+        &&  iHeaders[EHeaderSubject].iControl->Editor().TextLength() )
+        {
+        // without this change Japanese pictographs in subject field 
+        // appear on slides 2,...
+        iHeaders[EHeaderSubject].iControl->Editor().SetCursorPosL( 0, EFalse );
+        TPtrC nullPtrC( KNullDesC() );
+        iHeaders[EHeaderSubject].iControl->Editor().SetTextL( &nullPtrC );
+        }
+    }
+
+
+// ---------------------------------------------------------
+// RestoreSubjectContentL
+// ---------------------------------------------------------
+//
+void CMmsViewerHeader::RestoreSubjectContentL()
+    {
+    InsertSubjectL( ETrue );
+    }
+
+// ---------------------------------------------------------
+// InsertSubjectL
+// ---------------------------------------------------------
+//
+void CMmsViewerHeader::InsertSubjectL( TBool /*aReadContent*/ )
+    {
+    HBufC* subject = iMtm.SubjectL().AllocLC();
+    TPtr subjectPtr = subject->Des();
+    subjectPtr.Trim();
+    if (    subjectPtr.Length() 
+        &&  !iHeaders[EHeaderSubject].iControl )
+        {
+        iView.AddControlFromResourceL( R_MMSVIEWER_SUBJECT, EMsgExpandableControl, EMsgAppendControl, EMsgHeader );
+        iHeaders[EHeaderSubject].iControl = static_cast<CMsgExpandableControl*>
+            ( iView.ControlById( EMsgComponentIdSubject ) );
+        iHeaders[EHeaderSubject].iOwned = EFalse;
+
+        iHeaders[EHeaderSubject].iControl->Editor().SetTextL( subject );
+        }
+    else if (   subjectPtr.Length() 
+            &&  iHeaders[EHeaderSubject].iControl
+            &&  !iHeaders[EHeaderSubject].iControl->Editor().TextLength() )
+        {
+        iHeaders[EHeaderSubject].iControl->Editor().SetTextL( subject );
+        }
+    CleanupStack::PopAndDestroy(); //subject
+    }
+
+// ---------------------------------------------------------
+// CUniEditorHeader::InsertAttachmentL
+// ---------------------------------------------------------
+//
+void CMmsViewerHeader::InsertAttachmentL( TBool /*aReadContent*/)
+    {
+    if ( iAttachmentList.Count() )
+        {        
+        CMsgAttachmentControl* attachmentControl = CMsgAttachmentControl::NewL( iView, iView );
+        CleanupStack::PushL( attachmentControl );
+        iView.AddControlL( attachmentControl,    
+                           EMsgComponentIdAttachment,    
+                           EMsgAppendControl, 
+                           EMsgHeader );
+        CleanupStack::Pop( attachmentControl );
+    
+        iHeaders[EHeaderAttachment].iControl = 
+            static_cast<CMsgAttachmentControl*>( iView.ControlById( EMsgComponentIdAttachment ) );
+        
+        iHeaders[EHeaderAttachment].iOwned = EFalse;
+
+        for( TInt index = 0; index < iAttachmentList.Count(); index++ )
+            {
+            TParsePtrC fileParser( iAttachmentList.GetByIndex( index )->MediaInfo()->FullFilePath() );                          
+            attachmentControl->AppendAttachmentL( fileParser.NameAndExt() );
+            }
+        }
+            
+    }
+
+
+// ---------------------------------------------------------
+// RemoveAttachmentL
+// ---------------------------------------------------------
+//
+void CMmsViewerHeader::RemoveAttachmentL( )
+    {
+    RemoveFromViewL( EUniFeatureAttachment );
+    }
+
+//  End of File