messagingfw/biomsgfw/IACPSRC/IMP.CPP
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/biomsgfw/IACPSRC/IMP.CPP	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,489 @@
+// Copyright (c) 1998-2009 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:
+// Internet Mail Settings Parser
+// 
+//
+
+#include <msvids.h>   // KMsvRootIndexEntryId
+#include <msventry.h>
+#include <msvruids.h>
+#include <smtpset.h>
+#include <pop3set.h>
+#include <imapset.h>
+#include <cemailaccounts.h>
+//
+#include "BSP.H"
+#include "IACP.H"
+#include "IMP.H"
+#include "IACPDEF.H"
+#include "IACPERR.H"
+#include <iapprefs.h>
+
+_LIT(KIacpOldImapName, "-Old-IMAP");
+_LIT(KIacpOldPop3Name, "-Old-POP");
+
+#include <commdb.h>
+#include <ipaddr.h>
+
+//
+// Constructor
+//
+CMailParser::CMailParser()
+	{
+	}
+
+//
+// Factory fns
+//
+CMailParser* CMailParser::NewLC()
+	{
+	CMailParser* self=new (ELeave) CMailParser();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+CMailParser* CMailParser::NewL()
+	{
+	CMailParser* self=CMailParser::NewLC();
+	CleanupStack::Pop();
+	return self;
+	}
+
+//
+// 2nd stage of construction
+//
+void CMailParser::ConstructL()
+	{
+	// --- Create the blank settings objects ---
+	iSmtpSettings=new(ELeave) CImSmtpSettings();
+	iPop3Settings=new(ELeave) CImPop3Settings();
+	iImap4Settings=new(ELeave) CImImap4Settings();
+	
+	// email account creator
+	iEmailAccounts = CEmailAccounts::NewL();
+	
+	// IAP preferences
+	iEmailPreferences = CImIAPPreferences::NewLC();
+	CleanupStack::Pop(iEmailPreferences);
+	iSmtpPreferences = CImIAPPreferences::NewLC();
+	CleanupStack::Pop(iSmtpPreferences);
+
+	// set defaults	
+	iEmailAccounts->PopulateDefaultPopSettingsL(*iPop3Settings, *iEmailPreferences);
+	iEmailAccounts->PopulateDefaultSmtpSettingsL(*iSmtpSettings, *iSmtpPreferences); 											
+	iEmailAccounts->PopulateDefaultImapSettingsL(*iImap4Settings, *iEmailPreferences);
+	}
+
+//
+// Destruction
+//
+CMailParser::~CMailParser()
+	{
+	delete iSmtpSettings;
+	delete iPop3Settings;
+	delete iImap4Settings;
+	delete iEmailAccounts;
+	delete iEmailPreferences;
+	delete iSmtpPreferences;
+	}
+
+void CMailParser::CheckMandatoryFieldsL(CParsedFieldCollection& aIacpFields)
+	{
+	//Defect fix for Def021855- IACP - Not all fields should be mandatory 
+	
+	//according to the Smart Messaging Spec v3.0.0 (18/12/00) the only mandatory field is the mail-iap-name
+	//all other parameters are optional and so this function will leave only if the mail-iap-name is empty.
+	//However this may change and so the spec needs to be watched just in case.
+	if(aIacpFields.GetFieldValue(SMS_ISP_M_NAME).Length()==0)		
+			User::Leave(KIacpMandatoryDataNotSet);
+	}
+
+//
+// Parse/Set data members of CImSmtpSettings, CImPop3Settings, CImImap4Settings
+//
+void CMailParser::ParseL(CParsedFieldCollection& aIacpFields)
+	{
+	TPtrC aFieldValueBuf;
+	TBuf8<KMaxSettingStringLength>	tempBuf; //LoginName, Password, FolderPath
+
+	SetMailProtocolL(aIacpFields);
+
+	//set service name
+	if (aIacpFields.GetFieldValueAndLength(SMS_ISP_M_NAME, aFieldValueBuf) != 0)
+		iIspName= aFieldValueBuf;
+
+	//smtp settings
+	if (aIacpFields.GetFieldValueAndLength(SMS_SENDING_HOST, aFieldValueBuf) != 0)
+		iSmtpSettings->SetServerAddressL(aFieldValueBuf);
+	
+	if (aIacpFields.GetFieldValueAndLength(SMS_USER_EMAIL_ADDR, aFieldValueBuf) != 0)
+		iSmtpSettings->SetEmailAddressL(aFieldValueBuf);
+	
+	if(iProtocolName == EPop3)
+		{
+		//pop3 settings
+		if (aIacpFields.GetFieldValueAndLength(SMS_MAILBOX_NAME, aFieldValueBuf) != 0)
+			{
+			tempBuf.Copy(aFieldValueBuf); //copy from 16 to 8 bit buffer
+			iPop3Settings->SetLoginNameL(tempBuf);
+			}
+
+		if (aIacpFields.GetFieldValueAndLength(SMS_MAILBOX_PASS, aFieldValueBuf) != 0)
+			{
+			tempBuf.Copy(aFieldValueBuf); //copy from 16 to 8 bit buffer
+			iPop3Settings->SetPasswordL(tempBuf);
+			}
+			
+
+		if (aIacpFields.GetFieldValueAndLength(SMS_RECEIVING_HOST, aFieldValueBuf) != 0)
+			iPop3Settings->SetServerAddressL(aFieldValueBuf);
+
+		// Set DisconnectedUserMode flag so that messages are not made invisible
+		iPop3Settings->SetDisconnectedUserMode(ETrue);	
+		}
+	else if(iProtocolName == EImap4)
+		{
+		//imap4 settings
+		if (aIacpFields.GetFieldValueAndLength(SMS_MAILBOX_NAME, aFieldValueBuf) != 0)
+			{
+			tempBuf.Copy(aFieldValueBuf); //copy from 16 to 8 bit buffer
+			iImap4Settings->SetLoginNameL(tempBuf);
+			}
+
+		if (aIacpFields.GetFieldValueAndLength(SMS_MAILBOX_PASS, aFieldValueBuf) != 0)
+			{
+			tempBuf.Copy(aFieldValueBuf); //copy from 16 to 8 bit buffer
+			iImap4Settings->SetPasswordL(tempBuf);
+			}
+		
+		
+		if (aIacpFields.GetFieldValueAndLength(SMS_RECEIVING_HOST, aFieldValueBuf) != 0)
+			iImap4Settings->SetServerAddressL(aFieldValueBuf);
+
+		if (aIacpFields.GetFieldValueAndLength(SMS_FOLDER_PATH, aFieldValueBuf) != 0)
+			{
+			tempBuf.Copy(aFieldValueBuf); //copy from 16 to 8 bit buffer
+			iImap4Settings->SetFolderPathL(tempBuf);
+			}
+
+		// Set DisconnectedUserMode flag so that messages are not made invisible
+		iImap4Settings->SetDisconnectedUserMode(ETrue);
+		}
+	}
+
+//
+// Create smtp, pop3, imap4 services
+//
+void CMailParser::ProcessL(CMSVENTRY& aEntry)
+	{
+	
+	// check for existing services with the same name
+	GetServiceIdsL(iPop3AccountId, iImap4AccountId);
+
+	// check if this account has switched from IMAP to POP or vise-versa
+	TBool protChanged = EFalse;
+	TBuf<KMaxSettingStringLength> oldIspName;
+	oldIspName.Copy(iIspName);
+	if (iProtocolName == EPop3 && iImap4AccountId.iImapAccountId != KErrNotFound && 
+								  iPop3AccountId.iPopAccountId == KErrNotFound)
+		{
+		protChanged = ETrue;
+		oldIspName.Append(KIacpOldImapName);
+		}
+	else if (iProtocolName == EImap4 && iPop3AccountId.iPopAccountId != KErrNotFound && 
+										iImap4AccountId.iImapAccountId == KErrNotFound)
+		{
+		protChanged = ETrue;
+		oldIspName.Append(KIacpOldPop3Name);
+		}
+
+	// create a new account if there is no existing account or the account has been
+	// switched from POP to IMAP or IMAP to POP
+	if (protChanged || iPop3AccountId.iPopAccountId == KErrNotFound && 
+					   iImap4AccountId.iImapAccountId == KErrNotFound)
+		{
+		// if service swapped rename old service
+		if (protChanged)
+			{
+			CImSmtpSettings* smtpSettings = new(ELeave) CImSmtpSettings;
+			CleanupStack::PushL(smtpSettings);
+			
+			if (iProtocolName == EPop3)
+				{
+				CImPop3Settings* popSettings = new(ELeave) CImPop3Settings;
+				CleanupStack::PushL(popSettings);
+				
+				// load settings
+				iEmailAccounts->LoadPopSettingsL(iPop3AccountId, *popSettings);
+				TSmtpAccount smtpAccountId;
+				iEmailAccounts->GetSmtpAccountL(iPop3AccountId.iSmtpService, smtpAccountId);
+				iEmailAccounts->LoadSmtpSettingsL(smtpAccountId, *smtpSettings);
+				
+				// rename old service
+				iPop3AccountId.iPopAccountName = oldIspName;
+				
+				// save settings
+				iEmailAccounts->SavePopSettingsL(iPop3AccountId, *popSettings); 
+				iEmailAccounts->SaveSmtpSettingsL(smtpAccountId, *smtpSettings);
+				CleanupStack::PopAndDestroy(popSettings);
+				}
+			else if (iProtocolName == EImap4)
+				{
+				CImImap4Settings* imapSettings = new(ELeave) CImImap4Settings;
+				CleanupStack::PushL(imapSettings);
+				
+				// load settings
+				iEmailAccounts->LoadImapSettingsL(iImap4AccountId, *imapSettings);
+				TSmtpAccount smtpAccountId;
+				iEmailAccounts->GetSmtpAccountL(iImap4AccountId.iSmtpService, smtpAccountId);				
+				iEmailAccounts->LoadSmtpSettingsL(smtpAccountId, *smtpSettings);
+
+				// rename old service
+				iImap4AccountId.iImapAccountName = oldIspName;
+				
+				// save settings
+				iEmailAccounts->SaveImapSettingsL(iImap4AccountId, *imapSettings);
+				iEmailAccounts->SaveSmtpSettingsL(smtpAccountId, *smtpSettings);
+				CleanupStack::PopAndDestroy(imapSettings);
+				}
+			CleanupStack::PopAndDestroy(smtpSettings);
+			}
+
+		// create new services
+		if (iProtocolName == EPop3)
+			{
+			iPop3AccountId = iEmailAccounts->CreatePopAccountL(iIspName, *iPop3Settings, *iEmailPreferences, EFalse);
+			TSmtpAccount smtpAccountId = iEmailAccounts->CreateSmtpAccountL(iPop3AccountId, *iSmtpSettings, *iSmtpPreferences, EFalse);
+
+			aEntry.SetEntryL(iPop3AccountId.iPopService);
+			iEmailAccounts->SetDefaultSmtpAccountL(smtpAccountId);
+			iImap4AccountId.iImapAccountId = KErrNotFound;
+			}
+		else if (iProtocolName == EImap4)
+			{
+			iImap4AccountId = iEmailAccounts->CreateImapAccountL(iIspName, *iImap4Settings, *iEmailPreferences, EFalse);
+			TSmtpAccount smtpAccountId = iEmailAccounts->CreateSmtpAccountL(iImap4AccountId, *iSmtpSettings, *iSmtpPreferences, EFalse);
+			
+			aEntry.SetEntryL(iImap4AccountId.iImapService);
+			iEmailAccounts->SetDefaultSmtpAccountL(smtpAccountId);
+			iPop3AccountId.iPopAccountId = KErrNotFound;
+			}
+		}
+	else
+		{
+		// overwrite existing account settings
+		if (iProtocolName == EPop3)
+			{
+			iEmailAccounts->SavePopSettingsL(iPop3AccountId, *iPop3Settings);
+			iEmailAccounts->SavePopIapSettingsL(iPop3AccountId, *iEmailPreferences);
+			TSmtpAccount smtpAccountId;
+			iEmailAccounts->GetSmtpAccountL(iPop3AccountId.iSmtpService, smtpAccountId);							
+			iEmailAccounts->SaveSmtpSettingsL(smtpAccountId, *iSmtpSettings);
+			iEmailAccounts->SaveSmtpIapSettingsL(smtpAccountId, *iSmtpPreferences);
+
+			aEntry.SetEntryL(iPop3AccountId.iPopService);
+			iEmailAccounts->SetDefaultSmtpAccountL(smtpAccountId);
+			}
+		else if (iProtocolName == EImap4)
+			{
+			iEmailAccounts->SaveImapSettingsL(iImap4AccountId, *iImap4Settings);
+			iEmailAccounts->SaveImapIapSettingsL(iImap4AccountId, *iEmailPreferences);
+			TSmtpAccount smtpAccountId;
+			iEmailAccounts->GetSmtpAccountL(iImap4AccountId.iSmtpService, smtpAccountId);			
+			iEmailAccounts->SaveSmtpSettingsL(smtpAccountId, *iSmtpSettings);
+			iEmailAccounts->SaveSmtpIapSettingsL(smtpAccountId, *iSmtpPreferences);
+
+			aEntry.SetEntryL(iImap4AccountId.iImapService);
+			iEmailAccounts->SetDefaultSmtpAccountL(smtpAccountId);
+			}
+		}
+	}
+	
+//
+// Get the email account ids for any matching POP/IMAP accounts
+//
+void CMailParser::GetServiceIdsL(TPopAccount& aPop3AccountId, TImapAccount& aImap4AccountId)
+	{
+	aPop3AccountId.iPopAccountId = KErrNotFound;
+	aImap4AccountId.iImapAccountId = KErrNotFound;
+	
+	// get list of pop3 accounts
+	RArray<TPopAccount> pop3Accounts;
+	CleanupClosePushL(pop3Accounts);
+	iEmailAccounts->GetPopAccountsL(pop3Accounts);
+	for (TInt i=0; i<pop3Accounts.Count(); ++i)
+		{
+		if (pop3Accounts[i].iPopAccountName.Length() == iIspName.Length())
+			{
+			if (pop3Accounts[i].iPopAccountName.CompareF(iIspName) == 0)
+				{
+				aPop3AccountId = pop3Accounts[i];
+				break;
+				}
+			}
+		}
+
+	// get list of imap4 accounts	
+	RArray<TImapAccount> imap4Accounts;
+	CleanupClosePushL(imap4Accounts);
+	iEmailAccounts->GetImapAccountsL(imap4Accounts);
+	for (TInt j=0; j<imap4Accounts.Count(); ++j)
+		{
+		if (imap4Accounts[j].iImapAccountName.Length() == iIspName.Length())
+			{
+			if (imap4Accounts[j].iImapAccountName.CompareF(iIspName) == 0)
+				{
+				aImap4AccountId = imap4Accounts[j];
+				break;
+				}
+			}
+		}
+
+	CleanupStack::PopAndDestroy(2, &pop3Accounts); // imap4Accounts, pop3Accounts
+	}
+
+	
+	
+//
+// Gets Types of folder list sync
+//
+void CMailParser::GetFolderSyncTypeL(const TDesC& aDes,TFolderSyncType& aFolderSyncType) const
+	{
+	__ASSERT_DEBUG(aDes.Length() > 0 ,User::Panic(KIACP,EIacpEmptyBuffer));
+	TInt8 extractInt=0;
+
+	TLex lex(aDes);
+    if (lex.Val(extractInt) == KErrNone)
+		{
+		if(extractInt==0)
+			aFolderSyncType = EUseCombination;
+		else if(extractInt==1)
+			aFolderSyncType = EUseLocal;
+		else if(extractInt==2)
+			aFolderSyncType = EUseRemote;
+		else
+			User::Leave(KIacpErrRightToken);
+		}
+	else
+		User::Leave(KIacpErrRightToken);
+
+	}
+//
+//  Subscription data
+//
+void CMailParser::GetFolderSubscribeTypeL(const TDesC& aDes,TFolderSubscribeType& aFolderSubscribeType) const
+	{
+	__ASSERT_DEBUG(aDes.Length() > 0 ,User::Panic(KIACP,EIacpEmptyBuffer));
+	TInt8 extractInt=0;
+
+	TLex lex(aDes);
+    if (lex.Val(extractInt) == KErrNone)
+		{
+		if(extractInt==0)
+			aFolderSubscribeType = EUpdateNeither;
+		else if(extractInt==1)
+			aFolderSubscribeType = EUpdateLocal;
+		else if(extractInt==2)
+			aFolderSubscribeType = EUpdateRemote;
+		else if(extractInt==3)
+			aFolderSubscribeType = EUpdateBoth;
+		else
+			User::Leave(KIacpErrRightToken);
+		}
+	else
+		User::Leave(KIacpErrRightToken);
+	}
+
+//
+// set iMailProtocolName to Pop3 or Imap4
+//
+void CMailParser::SetMailProtocolL(CParsedFieldCollection& aIacpFields)
+	{
+	iProtocolName =0;
+	TInt count = aIacpFields.Count();
+
+	for ( TInt i=0; i < count; i++ )
+		{
+		CParsedField& field = *(aIacpFields[i]);
+		if(field.FieldName().CompareF(SMS_MAIL_PROTOCOL)==0)
+			{	
+			if(field.FieldValue().CompareF(SMS_POP)==0)
+				{
+				iProtocolName = EPop3;
+				return;
+				}
+			else if (field.FieldValue().CompareF(SMS_IMAP)==0)
+				{
+				iProtocolName = EImap4;
+				return;
+				}
+			}
+		}
+	User::Leave(KIacpUnknownMailProtocol);
+	}
+
+void CMailParser::AssociateIAPWithMailL(CMSVENTRY& /*aEntry*/, TUint32 aId)
+	{
+	// load settings
+	TSmtpAccount smtpAccountId;
+	if (iPop3AccountId.iPopAccountId != KErrNotFound)
+		{
+		iEmailAccounts->LoadPopSettingsL(iPop3AccountId, *iPop3Settings);
+		iEmailAccounts->LoadPopIapSettingsL(iPop3AccountId, *iEmailPreferences);
+
+		iEmailAccounts->GetSmtpAccountL(iPop3AccountId.iSmtpService, smtpAccountId);
+		iEmailAccounts->LoadSmtpSettingsL(smtpAccountId, *iSmtpSettings);
+		iEmailAccounts->LoadSmtpIapSettingsL(smtpAccountId, *iSmtpPreferences);
+		}
+	else if (iImap4AccountId.iImapAccountId != KErrNotFound)
+		{
+		iEmailAccounts->LoadImapSettingsL(iImap4AccountId, *iImap4Settings);
+		iEmailAccounts->LoadImapIapSettingsL(iImap4AccountId, *iEmailPreferences);
+
+		iEmailAccounts->GetSmtpAccountL(iImap4AccountId.iSmtpService, smtpAccountId);			
+		iEmailAccounts->LoadSmtpSettingsL(smtpAccountId, *iSmtpSettings);
+		iEmailAccounts->LoadSmtpIapSettingsL(smtpAccountId, *iSmtpPreferences);
+		}
+
+	// update IAP preferences
+	TBool updated(EFalse);
+	TImIAPChoice iap;
+	iap.iIAP = aId;
+	iap.iDialogPref = ECommDbDialogPrefDoNotPrompt;
+	TInt location;
+	if (iEmailPreferences->FindIAPL(iap.iIAP, location) == KErrNotFound)
+		{
+		iEmailPreferences->AddIAPL(iap);
+		updated = ETrue;
+		}
+	if (iSmtpPreferences->FindIAPL(iap.iIAP, location) == KErrNotFound)
+		{
+		iSmtpPreferences->AddIAPL(iap);
+		updated = ETrue;
+		}
+
+	// save settings
+	if (updated && iPop3AccountId.iPopAccountId != KErrNotFound)
+		{
+		iEmailAccounts->SavePopIapSettingsL(iPop3AccountId, *iEmailPreferences);
+		iEmailAccounts->SaveSmtpIapSettingsL(smtpAccountId, *iSmtpPreferences);
+		}
+	else if (updated && iImap4AccountId.iImapAccountId != KErrNotFound)
+		{
+		iEmailAccounts->SaveImapIapSettingsL(iImap4AccountId, *iEmailPreferences);
+		iEmailAccounts->SaveSmtpIapSettingsL(smtpAccountId, *iSmtpPreferences);
+		}
+	}
+