email/mail/EditorSrc/cmsgmailremotemailboxsetting.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/mail/EditorSrc/cmsgmailremotemailboxsetting.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,227 @@
+/*
+* Copyright (c) 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:  Remote mailbox setting item and setting page
+*
+*/
+
+
+#include "cmsgmailremotemailboxsetting.h"
+#include "MsgMailEditorDocument.h"
+#include "MailLog.h"
+#include <MsgMailEditor.rsg>
+#include <StringLoader.h>
+#include <ImumInternalApi.h>
+#include <ImumInHealthServices.h>
+#include <muiuflags.h>
+#include <cemailaccounts.h>				// CEmailAccounts
+
+inline void CMsgMailEditorRemoteMailboxSettingItem::ConstructL()
+    {
+    SetSettingValueL();
+    }
+
+CMsgMailEditorRemoteMailboxSettingItem* 
+    CMsgMailEditorRemoteMailboxSettingItem::NewL( 
+    TInt aIdentifier, CMsgMailEditorDocument& aDocument )
+    {
+        CMsgMailEditorRemoteMailboxSettingItem* self =
+            new( ELeave ) CMsgMailEditorRemoteMailboxSettingItem( 
+            aIdentifier,  aDocument );
+        CleanupStack::PushL( self );
+    	self->ConstructL();
+    	CleanupStack::Pop(self); // self
+        return self;
+    }
+
+
+CMsgMailEditorRemoteMailboxSettingItem::CMsgMailEditorRemoteMailboxSettingItem(
+    TInt aIdentifier,
+    CMsgMailEditorDocument& aDocument ): 
+    CAknTextSettingItem( aIdentifier, iSettingValue ),  
+    iDocument( aDocument )
+    {
+    // iSettingValue is set later
+    }        
+
+CMsgMailEditorRemoteMailboxSettingItem::~CMsgMailEditorRemoteMailboxSettingItem()
+    {
+    iSettingValue.Close();
+    delete iMailBoxIdArray;
+    delete iServiceArray;
+    }
+
+// ----------------------------------------------------------------------------
+//  // From CAknTextSettingItem
+// ----------------------------------------------------------------------------
+//        
+void CMsgMailEditorRemoteMailboxSettingItem::EditItemL( 
+    TBool /* aCalledFromMenu */ )
+    {
+    TPtrC settingName = SettingName();
+    TInt currentSelection( KErrNotFound );
+    NameArrayL( currentSelection );
+  
+    CAknSettingPage* dlg = new( ELeave )CAknRadioButtonSettingPage(        
+        &settingName, 
+        SettingNumber(), 
+        EEikCtTextButton,
+        SettingEditorResourceId(), 
+        SettingPageResourceId(), 
+        currentSelection, 
+        iMailBoxIdArray );
+    SetSettingPage( dlg );
+    SettingPage()->SetSettingPageObserver( this ); 
+    SettingPage()->ExecuteLD( CAknSettingPage::EUpdateWhenAccepted );
+   
+    SaveSettingValueL( currentSelection );
+    SetSettingValueL();
+    LoadL(); // update setting value to listbox
+    UpdateListBoxTextL();    
+    SetSettingPage( 0 ); // it is deleted now
+    }
+
+
+// ----------------------------------------------------------------------------
+//  Create name array
+// ----------------------------------------------------------------------------
+//    
+void CMsgMailEditorRemoteMailboxSettingItem::NameArrayL(
+    TInt& aSelected )
+    {
+    LOG("CMsgMailEditorRemoteMailboxSettingItem::NameArrayL");
+    
+    // TImumInMboxListRequest does not work so we need to do this hard way
+    // POP & IMAP service iRelatedId points to STMP service, so we use that
+    TInt64 flags = MImumInHealthServices::EFlagSetHealthyReceiving;
+    MImumInHealthServices::RMailboxIdArray mbox = 
+        iDocument.GetHealthyMailboxListL( flags );
+    TInt itemCount = mbox.Count();
+    
+    //+1 if itemCount=0
+    delete iMailBoxIdArray;
+    iMailBoxIdArray = NULL;
+    iMailBoxIdArray = new(ELeave)CDesCArrayFlat(itemCount+1);
+        
+    delete iServiceArray;
+    iServiceArray = NULL;
+    iServiceArray = new(ELeave) CMsvEntrySelection;
+          
+    TMsvId id;
+    TMsvEntry entry;
+    CMsvSession& session = iDocument.Session();   
+    for(TInt i=0; i<itemCount; i++)
+        {
+        session.GetEntry(mbox[i], id, entry);
+        iMailBoxIdArray->AppendL(entry.iDetails);
+        if ( entry.iDetails == SettingTextL() )
+            {
+            // set selection index
+            aSelected = iMailBoxIdArray->Count() - 1;
+            }
+        iServiceArray->AppendL( entry.iRelatedId );  
+        }
+    ASSERT( iServiceArray->Count() == iMailBoxIdArray->Count() ); 
+    }
+
+// ----------------------------------------------------------------------------
+//  Save selected mbox id to settings
+// ----------------------------------------------------------------------------
+//  
+void CMsgMailEditorRemoteMailboxSettingItem::SaveSettingValueL( 
+    TInt aSelected )
+    {
+    ASSERT( iServiceArray );
+    if( aSelected != KErrNotFound )
+        {
+        ASSERT( aSelected >= 0 && aSelected < iServiceArray->Count() );
+        iDocument.SendOptions().SetServiceId( (*iServiceArray)[aSelected] );
+        iDocument.SetChanged( ETrue );
+        
+        //Update header because mailbox is selected.
+        UpdateReplyToL(aSelected);
+        }
+    }
+    
+// ----------------------------------------------------------------------------
+//  Updates Reply-to value for mail header.
+// ----------------------------------------------------------------------------
+//  
+void CMsgMailEditorRemoteMailboxSettingItem::UpdateReplyToL( 
+    TInt aSelected )
+    {
+    //Get smtp account and load smtp settings
+	CEmailAccounts* smtpAccount = CEmailAccounts::NewLC();
+    CImSmtpSettings* smtpSet=new(ELeave)CImSmtpSettings();
+    CleanupStack::PushL(smtpSet);
+    
+    TInt tempArrayCount = iServiceArray->Count();
+    
+    
+    // Checks that a aSelected is in the leagal range.
+    if( !( aSelected >= 0 && aSelected < tempArrayCount ) )
+    	{
+    	return;
+    	}
+    
+    const TMsvId smtpSetId = (*iServiceArray)[aSelected];
+
+    TSmtpAccount accountParams;
+    smtpAccount->GetSmtpAccountL( smtpSetId, accountParams );
+	smtpAccount->LoadSmtpSettingsL(accountParams, *smtpSet);
+        
+    //Check that if reply to address is same as mailbox address
+    //do not add "reply to" field for header. Otherwise "reply to" field
+    //would always be visible.
+    if(smtpSet->ReplyToAddress().Compare(smtpSet->EmailAddress() ) != 0)
+        {
+        CImHeader& header = iDocument.HeaderL();
+        header.SetReplyToL( smtpSet->ReplyToAddress() );
+        }    
+    else
+    	{
+        CImHeader& header = iDocument.HeaderL();
+        header.SetReplyToL( KNullDesC16 );
+    	}
+    CleanupStack::PopAndDestroy(2, smtpAccount);		// CSI: 47,12 # smtpAccount, smtpSet   
+    
+    }
+
+// ----------------------------------------------------------------------------
+//  Set current mailbox name to setting list
+// ----------------------------------------------------------------------------
+//  
+void CMsgMailEditorRemoteMailboxSettingItem::SetSettingValueL()
+    {
+   	CMsgMailPreferences& prefs = iDocument.SendOptions();
+	// set current remote mailbox name to listbox
+	TMsvId service( prefs.ServiceId() );  //get current Service id
+	TMsvId parent(0);
+	TMsvEntry child;
+
+	TInt err( iDocument.Session().GetEntry(service, parent, child) );
+    
+    iSettingValue.Close();
+	if (!err)
+		{
+		iSettingValue.CreateL( child.iDetails );
+		}
+	else
+		{
+		HBufC* noRmBox = StringLoader::LoadLC(R_TEXT_NO_RMBOX);
+		iSettingValue.CreateL( *noRmBox );
+		CleanupStack::PopAndDestroy(noRmBox); //noRmBox
+		}
+    }
+
+// End of File