--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/omadmadapters/email/src/nsmldmemailadapter.cpp Tue Jul 13 03:51:25 2010 +0530
@@ -0,0 +1,3364 @@
+/*
+* Copyright (c) 2004 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: DM Email Settings Adapter
+ *
+*/
+
+
+
+
+#include <implementationproxy.h> // For TImplementationProxy definition
+#include <utf.h>
+#include <iapprefs.h>
+#include <smtpset.h>
+#include <pop3set.h>
+#include <imapset.h>
+#include <sysutil.h>
+#include <etelmm.h>
+
+#include <cemailaccounts.h>
+
+#include "nsmldmimpluids.h"
+#include "nsmldmemailadapter.h"
+#include "nsmldebug.h"
+#include "nsmlconstants.h"
+#include "nsmldmconst.h"
+#include "nsmldmiapmatcher.h"
+
+#ifndef __WINS__
+// This lowers the unnecessary compiler warning (armv5) to remark.
+// "Warning: #174-D: expression has no effect..." is caused by
+// DBG_ARGS8 macro in no-debug builds.
+#pragma diag_remark 174
+#endif
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter* CNSmlDmEmailAdapter::NewL( )
+// -----------------------------------------------------------------------------
+CNSmlDmEmailAdapter* CNSmlDmEmailAdapter::NewL(MSmlDmCallback* aDmCallback )
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::NewL(): begin");
+ CNSmlDmEmailAdapter* self = new (ELeave) CNSmlDmEmailAdapter(aDmCallback);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ _DBG_FILE("CNSmlDmEmailAdapter::NewL(): end");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::CNSmlDmEmailAdapter()
+// -----------------------------------------------------------------------------
+
+CNSmlDmEmailAdapter::CNSmlDmEmailAdapter( MSmlDmCallback* aDmCallback )
+ : CSmlDmAdapter(aDmCallback)
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::CNSmlDmEmailAdapter(): begin");
+ iMsvSession = NULL;
+ _DBG_FILE("CNSmlDmEmailAdapter::CNSmlDmEmailAdapter(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::ConstructL()
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::ConstructL()
+ {
+ iBuffer = new (ELeave) CArrayFixFlat <TNSmlEmailSettingsElement>
+ (KNSmlDmEmailGranularity);
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::~CNSmlDmEmailAdapter()
+// -----------------------------------------------------------------------------
+CNSmlDmEmailAdapter::~CNSmlDmEmailAdapter()
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::~CNSmlDmEmailAdapter(): begin");
+ delete iMsvSession;
+ if(iBuffer)
+ {
+ for(TInt i=0;i<iBuffer->Count();i++)
+ {
+ delete iBuffer->At(i).iMappingName;
+ delete iBuffer->At(i).iName;
+ delete iBuffer->At(i).iSmtpSettings;
+ delete iBuffer->At(i).iPop3Settings;
+ delete iBuffer->At(i).iImap4Settings;
+ delete iBuffer->At(i).iIapPref;
+ delete iBuffer->At(i).iSmtpIapPref;
+
+ if(iBuffer->At(i).iNodeBuf)
+ {
+ for(TInt j=0;j<iBuffer->At(i).iNodeBuf->Count();j++)
+ {
+ delete iBuffer->At(i).iNodeBuf->At(j).iLastUriSeg;
+ delete iBuffer->At(i).iNodeBuf->At(j).iData;
+ }
+ iBuffer->At(i).iNodeBuf->Reset();
+ delete iBuffer->At(i).iNodeBuf;
+ }
+ }
+ iBuffer->Reset();
+ delete iBuffer;
+ }
+
+ _DBG_FILE("CNSmlDmEmailAdapter::~CNSmlDmEmailAdapter(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::DDFVersionL()
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::DDFVersionL(CBufBase& aDDFVersion)
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::DDFVersionL(TDes& aDDFVersion): begin");
+ aDDFVersion.InsertL(0,KNSmlDMEmailDDFVersion);
+ _DBG_FILE("CNSmlDmEmailAdapter::DDFVersionL(TDes& aDDFVersion): end");
+ }
+
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::DDFStructureL()
+//
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::DDFStructureL(MSmlDmDDFObject& aDDF)
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::DDFStructureL(): begin");
+
+ TSmlDmAccessTypes accessTypesNode;
+
+ accessTypesNode.SetGet();
+
+ // Email
+ MSmlDmDDFObject& email = aDDF.AddChildObjectL(KNSmlDMEmailNodeName);
+ FillNodeInfoL(email,accessTypesNode,MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EPermanent,
+ MSmlDmDDFObject::ENode,KNSmlDMEmailDescription);
+
+ accessTypesNode.SetAdd();
+ accessTypesNode.SetDelete();
+ accessTypesNode.SetReplace();
+ MSmlDmDDFObject& rtNode = email.AddChildObjectGroupL();
+
+
+ FillNodeInfoL(rtNode,accessTypesNode,MSmlDmDDFObject::EZeroOrMore,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::ENode,
+ KNSmlDMDynamicNodeDescription);
+
+ TSmlDmAccessTypes accessTypes;
+ accessTypes.SetGet();
+ accessTypes.SetAdd();
+ accessTypes.SetReplace();
+ //displayable account name
+ MSmlDmDDFObject& name = rtNode.AddChildObjectL(KNSmlDMEmailName);
+ FillNodeInfoL(name,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KNSmlDMNameDescription);
+
+ //user id for email account
+ MSmlDmDDFObject& uid = rtNode.AddChildObjectL(KNSmlDMEmailUID);
+ FillNodeInfoL(uid,accessTypes,MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KNSmlDMUIDDescription);
+
+ //password for email account
+ TSmlDmAccessTypes accessTypesPw;
+ accessTypesPw.SetAdd();
+ accessTypesPw.SetReplace();
+ MSmlDmDDFObject& pw = rtNode.AddChildObjectL(KNSmlDMEmailPW);
+ FillNodeInfoL(pw,accessTypesPw,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KNSmlDMPWDescription);
+
+ //user's email address
+ MSmlDmDDFObject& uaddr = rtNode.AddChildObjectL(KNSmlDMEmailUAddr);
+ FillNodeInfoL(uaddr,accessTypes,MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KNSmlDMUAddrDescription);
+
+ //Displayable name for the user
+ MSmlDmDDFObject& uname = rtNode.AddChildObjectL(KNSmlDMEmailUName);
+ FillNodeInfoL(uname,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KNSmlDMUNameDescription);
+
+ //Host name for the receiving server
+ MSmlDmDDFObject& mrcv = rtNode.AddChildObjectL(KNSmlDMEmailMrcv);
+ FillNodeInfoL(mrcv,accessTypes,MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KNSmlDMMrcvDescription);
+
+ //Host name for the sending server
+ MSmlDmDDFObject& msnd = rtNode.AddChildObjectL(KNSmlDMEmailMsnd);
+ FillNodeInfoL(msnd,accessTypes,MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KNSmlDMMsndDescription);
+
+ //Remote mailbox protocol
+ MSmlDmDDFObject& mpro = rtNode.AddChildObjectL(KNSmlDMEmailMpro);
+ FillNodeInfoL(mpro,accessTypes,MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KNSmlDMMproDescription);
+
+ //Use secure connection
+ MSmlDmDDFObject& useSecCon = rtNode.AddChildObjectL(KNSmlDMEmailUseSecCon);
+ FillNodeInfoL(useSecCon,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EBool,
+ KNSmlDMUseSecConDescription);
+
+ //Use APop
+ MSmlDmDDFObject& useAPOP = rtNode.AddChildObjectL(KNSmlDMEmailUseAPOP);
+ FillNodeInfoL(useAPOP, accessTypes, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EBool,
+ KNSmlDMUseAPOPDescription );
+
+ //Use smtp authentication
+ MSmlDmDDFObject& useSauth = rtNode.AddChildObjectL(KNSmlDMEmailUseSauth);
+ FillNodeInfoL(useSauth,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EBool,
+ KNSmlDMUseSauthDescription);
+
+ //smtp authentication user id
+ MSmlDmDDFObject& sauthUid = rtNode.AddChildObjectL(KNSmlDMEmailSauthUID);
+ FillNodeInfoL(sauthUid,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KNSmlDMSauthUIDDescription);
+
+ //Use smtp authentication
+ MSmlDmDDFObject& sauthPw = rtNode.AddChildObjectL(KNSmlDMEmailSauthPW);
+ FillNodeInfoL(sauthPw,accessTypesPw,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KNSmlDMSauthPWDescription);
+
+ //Use smtp authentication
+ MSmlDmDDFObject& ptxtSAuth = rtNode.AddChildObjectL(KNSmlDMEmailPtxtSAuth);
+ FillNodeInfoL(ptxtSAuth,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EBool,
+ KNSmlDMPtxtSAuthDescription);
+
+ //Link to IAP
+ MSmlDmDDFObject& toNapId = rtNode.AddChildObjectL(KNSmlDMEmailToNapID);
+ FillNodeInfoL(toNapId,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KNSmlDMToNapIDDescription);
+
+ //Link to IAP for SMTP
+ MSmlDmDDFObject& sToNapId = rtNode.AddChildObjectL(KNSmlDMEmailSToNapID);
+ FillNodeInfoL(sToNapId,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KNSmlDMSToNapIDDescription);
+
+ //SSL/TLS used in SMTP
+ MSmlDmDDFObject& sUseSecCon = rtNode.
+ AddChildObjectL(KNSmlDMEmailSUseSecCon);
+ FillNodeInfoL(sUseSecCon,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EBool,
+ KNSmlDMSUseSecConDescription);
+
+ //StartTLS used in IMAP/POP
+ MSmlDmDDFObject& useStartTls = rtNode.
+ AddChildObjectL(KNSmlDMEmailUseStartTLS);
+ FillNodeInfoL(useStartTls,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EBool,
+ KNSmlDMUseStartTLSDescription);
+
+ //StartTLS used in SMTP
+ MSmlDmDDFObject& sUseStartTls = rtNode.
+ AddChildObjectL(KNSmlDMEmailSUseStartTLS);
+ FillNodeInfoL(sUseStartTls,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EBool,
+ KNSmlDMSUseStartTLSDescription);
+
+ //port of IMAP/POP server
+ MSmlDmDDFObject& mrcvPort = rtNode.AddChildObjectL(KNSmlDMEmailMrcvPort);
+ FillNodeInfoL(mrcvPort,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EInt,
+ KNSmlDMMrcvPortDescription);
+
+ //port of SMTP server
+ MSmlDmDDFObject& msndPort = rtNode.AddChildObjectL(KNSmlDMEmailMsndPort);
+ FillNodeInfoL(msndPort,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EInt,
+ KNSmlDMMsndPortDescription);
+
+ //IMAP folder path
+ MSmlDmDDFObject& folderPath = rtNode.
+ AddChildObjectL(KNSmlDMEmailFolderPath);
+ FillNodeInfoL(folderPath,accessTypes,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KNSmlDMFolderPathDescription);
+
+ _DBG_FILE("CNSmlDmEmailAdapter::DDFStructureL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::UpdateLeafObjectL()
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::UpdateLeafObjectL( const TDesC8& aURI,
+ const TDesC8& aLUID,
+ const TDesC8& aObject,
+ const TDesC8& /*aType*/,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): begin");
+
+ TInt index = -1;
+ TBool firstAdd = EFalse;
+
+ for(TInt i = 0; i<iBuffer->Count(); i++)
+ {
+ TPtrC8 parentUri = RemoveLastURISeg(aURI);
+ //Check Node from buffer if match
+ if(iBuffer->At(i).iMappingName->Compare(parentUri) == 0 )
+ {
+ firstAdd = ETrue;
+ index = i;
+ break;
+ }
+ }
+
+ TInt luid = DesToInt(aLUID);
+
+ if(aLUID.Length()==0 && index<0)
+ {
+ luid = ConstructTreeL(aURI);
+ if(luid == -1)
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::ENotFound);
+ _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): end");
+ return;
+ }
+ }
+
+ if( OpenSessionL() != KErrNone )
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): end");
+ return;
+ }
+
+ if(!firstAdd)
+ {
+
+ if(LastURISeg(aURI).Compare(KNSmlDMEmailMpro)==0)
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): end");
+ return;
+ }
+ index = -1;
+ for(TInt i=0;i<iBuffer->Count();i++)
+ {
+ if(iBuffer->At(i).iLuid == luid)
+ {
+ index = i;
+ break;
+ }
+ }
+
+ if(index<0)
+ {
+ TNSmlEmailSettingsElement newNode;
+ newNode.iImap4Settings = NULL;
+ newNode.iPop3Settings = NULL;
+ newNode.iSmtpSettings = NULL;
+ newNode.iIapPref = NULL;
+ newNode.iSmtpIapPref = NULL;
+ newNode.iLuid = luid;
+ newNode.iMappingName = aURI.AllocLC();
+ newNode.iName = HBufC::NewLC(0);
+ newNode.iNodeBuf = new (ELeave) CArrayFixFlat
+ <TNSmlEmailCommandElement> (KNSmlDmEmailGranularity);
+ newNode.iExecuted = ETrue;
+ GetIdByLuid(newNode.iAccType, newNode.iAccId, luid);
+ iBuffer->AppendL(newNode);
+ index = iBuffer->Count() - 1;
+ TInt err = DoRestoreSettingsL(index);
+ if(err!=KErrNone)
+ {
+ CleanupStack::PopAndDestroy(2); //newNode.iMappingName,newNode.iName
+ newNode.iMappingName = NULL;
+ newNode.iName = NULL;
+ iBuffer->At(index).iNodeBuf->Reset();
+ delete iBuffer->At(index).iNodeBuf;
+ iBuffer->Delete(index);
+ }
+ if(err==KErrNotFound)
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::ENotFound);
+ _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): end");
+ return;
+ }
+ else if(err!=KErrNone)
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): end");
+ return;
+ }
+ CleanupStack::Pop(2); //newNode.iMappingName,newNode.iName
+ }
+ TNSmlEmailCommandElement newCommand;
+ newCommand.iLastUriSeg = LastURISeg(aURI).AllocLC();
+ newCommand.iData = NULL;
+ newCommand.iStatusRef = aStatusRef;
+ newCommand.iLeaf = ETrue;
+ newCommand.iStatus = CSmlDmAdapter::EOk;
+ iBuffer->At(index).iNodeBuf->AppendL(newCommand);
+ CleanupStack::Pop(); //newCommand.iLastUriSeg
+ iBuffer->At(index).iJustFetch=EFalse;
+ DoAddLeafObjectL(newCommand.iLastUriSeg->Des(),aObject,index,
+ iBuffer->At(index).iNodeBuf->Count()-1);
+ }
+ else
+ {
+ FirstAddLeafL(aURI,aObject,aStatusRef,index);
+ }
+
+ _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::DeleteObjectL( const TDesC8& aURI,
+// const TDesC8& aLUID,
+// const TInt aStatusRef )
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::DeleteObjectL( const TDesC8& aURI,
+ const TDesC8& aLUID,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::DeleteLeafObjectL( ): begin");
+ if(NumOfURISegs(aURI)==2)
+ {
+ if(aLUID.Length()==0)
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::ENotFound);
+ _DBG_FILE("CNSmlDmEmailAdapter::DeleteLeafObjectL( ): ENotFound end");
+ return;
+ }
+
+ TInt luid = DesToInt(aLUID);
+ TInt err = OpenSessionL();
+ if(err!=KErrNone)
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ _DBG_FILE("CNSmlDmEmailAdapter::DeleteLeafObjectL( ): EError end");
+ return;
+ }
+ CEmailAccounts* emailAccs = CEmailAccounts::NewLC();
+ TNSmlEmailAccountType accType;
+ TInt id;
+ GetIdByLuid(accType, id, luid );
+ if( AccountExistsL( emailAccs, accType, id, -1 ) )
+ {
+ switch ( accType )
+ {
+ case EImap:
+ {
+ RArray<TImapAccount> imap4Accs;
+ CleanupClosePushL( imap4Accs );
+ emailAccs->GetImapAccountsL( imap4Accs );
+
+ for (TInt i(0); i < imap4Accs.Count(); i++)
+ {
+ if ( imap4Accs[i].iImapAccountId == id )
+ {
+ // Delete also related Smtp account
+ TSmtpAccount relatedSmtp;
+ emailAccs->GetSmtpAccountL( imap4Accs[i].iSmtpService, relatedSmtp );
+ emailAccs->DeleteImapAccountL( imap4Accs[i] );
+ emailAccs->DeleteSmtpAccountL( relatedSmtp );
+ //The only email a/c in phone gettiong deleted , so delete the default sntp a/c
+ if( imap4Accs.Count() == 1 )
+ {
+ TInt deferr = KErrNone;
+ TRAP(deferr, emailAccs->DeleteDefaultSmtpAccountL());
+ DBG_ARGS(_S16("CNSmlDmEmailAdapter::DeleteLeafObjectL( ): Delete default smtp account Error code %d"),deferr);
+ }
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(&imap4Accs); //imap4Accs
+
+ // If the default account was just deleted,
+ // new one needs to be set.
+ //
+ TSmtpAccount defaultSmtp;
+ TInt retVal = emailAccs->DefaultSmtpAccountL( defaultSmtp );
+ if ( retVal != KErrNone )
+ {
+ RArray<TImapAccount> imapAccs;
+ CleanupClosePushL( imapAccs );
+ emailAccs->GetImapAccountsL( imapAccs );
+ if ( imapAccs.Count() > 0 )
+ {
+ TSmtpAccount relatedSmtp;
+ emailAccs->GetSmtpAccountL( imapAccs[0].iSmtpService, relatedSmtp );
+ emailAccs->SetDefaultSmtpAccountL( relatedSmtp );
+ }
+ CleanupStack::PopAndDestroy( &imapAccs );
+ RArray<TPopAccount> popAccounts;
+ CleanupClosePushL( popAccounts );
+ emailAccs->GetPopAccountsL( popAccounts );
+ if ( popAccounts.Count() > 0 )
+ {
+ TSmtpAccount relatedSmtp;
+ emailAccs->GetSmtpAccountL( popAccounts[0].iSmtpService, relatedSmtp );
+ emailAccs->SetDefaultSmtpAccountL( relatedSmtp );
+ }
+ CleanupStack::PopAndDestroy( &popAccounts );
+ }
+ break;
+ }
+
+ case EPop:
+ {
+ RArray<TPopAccount> popAccs;
+ CleanupClosePushL( popAccs );
+ emailAccs->GetPopAccountsL( popAccs );
+
+ for (TInt i(0); i < popAccs.Count(); i++)
+ {
+ if ( popAccs[i].iPopAccountId == id )
+ {
+ // Delete also related Smtp account
+ TSmtpAccount relatedSmtp;
+ emailAccs->GetSmtpAccountL( popAccs[i].iSmtpService, relatedSmtp );
+ emailAccs->DeletePopAccountL( popAccs[i] );
+ emailAccs->DeleteSmtpAccountL( relatedSmtp );
+ if( popAccs.Count() == 1 )
+ {
+ TInt deferr = KErrNone;
+ TRAP(deferr, emailAccs->DeleteDefaultSmtpAccountL());
+ DBG_ARGS(_S16("CNSmlDmEmailAdapter::DeleteLeafObjectL( ): Delete default smtp account Error code %d "),deferr);
+ }
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(); //popAccs
+
+ // If the default account was just deleted,
+ // new one needs to be set.
+ //
+ TSmtpAccount defSmtp;
+ TInt retVal = emailAccs->DefaultSmtpAccountL( defSmtp );
+ if ( retVal != KErrNone )
+ {
+ RArray<TPopAccount> popAccounts;
+ CleanupClosePushL( popAccounts );
+ emailAccs->GetPopAccountsL( popAccounts );
+ if ( popAccounts.Count() > 0 )
+ {
+ TSmtpAccount relatedSmtp;
+ emailAccs->GetSmtpAccountL( popAccounts[0].iSmtpService, relatedSmtp );
+ emailAccs->SetDefaultSmtpAccountL( relatedSmtp );
+ }
+ CleanupStack::PopAndDestroy( &popAccounts );
+ RArray<TImapAccount> imapAccs;
+ CleanupClosePushL( imapAccs );
+ emailAccs->GetImapAccountsL( imapAccs );
+ if ( imapAccs.Count() > 0 )
+ {
+ TSmtpAccount relatedSmtp;
+ emailAccs->GetSmtpAccountL( imapAccs[0].iSmtpService, relatedSmtp );
+ emailAccs->SetDefaultSmtpAccountL( relatedSmtp );
+ }
+ CleanupStack::PopAndDestroy( &imapAccs );
+ }
+ break;
+ }
+
+ default:
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::ENotFound);
+ break;
+ }
+
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EOk);
+ }
+ else
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::ENotFound);
+ }
+ CleanupStack::PopAndDestroy(); //emailAccs
+ }
+ else
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ }
+
+ _DBG_FILE("CNSmlDmEmailAdapter::DeleteLeafObjectL( ): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::FetchLeafObjectL( const TDesC8& aURI,
+// const TDesC8& aLUID,
+// const TDesC8& aType,
+// const TInt aResultsRef,
+// const TInt aStatusRef )
+//
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::FetchLeafObjectL( const TDesC8& aURI,
+ const TDesC8& aLUID,
+ const TDesC8& aType,
+ const TInt aResultsRef,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectL(): begin");
+
+ TInt luid = DesToInt(aLUID);
+
+ if(aLUID.Length()==0)
+ {
+ luid = ConstructTreeL(aURI);
+ if(luid == -1)
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::ENotFound);
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectL(): ENotFound end");
+ return;
+ }
+ }
+ if( OpenSessionL() != KErrNone )
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectL(): EError end");
+ return;
+ }
+
+ TInt index = -1;
+ for(TInt i=0;i<iBuffer->Count();i++)
+ {
+ if(iBuffer->At(i).iLuid == luid)
+ {
+ index = i;
+ break;
+ }
+ }
+
+ if(index<0)
+ {
+ TNSmlEmailSettingsElement newNode;
+ newNode.iImap4Settings = NULL;
+ newNode.iPop3Settings = NULL;
+ newNode.iSmtpSettings = NULL;
+ newNode.iIapPref = NULL;
+ newNode.iSmtpIapPref = NULL;
+ newNode.iLuid = luid;
+ newNode.iMappingName = aURI.AllocLC();
+ newNode.iName = HBufC::NewLC(0);
+ newNode.iNodeBuf = new (ELeave)
+ CArrayFixFlat <TNSmlEmailCommandElement> (KNSmlDmEmailGranularity);
+ newNode.iExecuted = ETrue;
+ newNode.iJustFetch = ETrue;
+ GetIdByLuid(newNode.iAccType, newNode.iAccId, luid);
+ iBuffer->AppendL(newNode);
+ index = iBuffer->Count() - 1;
+ if( DoRestoreSettingsL(index) != KErrNone )
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ CleanupStack::Pop(2); //newNode.iMappingName,newNode.iName
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectL(): EError end");
+ return;
+ }
+ CleanupStack::Pop(2); //newNode.iMappingName,newNode.iName
+ }
+
+ TPtrC8 lastUriSeg = LastURISeg(aURI);
+ CBufBase* object = CBufFlat::NewL(32);
+ CleanupStack::PushL(object);
+ CSmlDmAdapter::TError status = CSmlDmAdapter::EOk;
+
+ if(lastUriSeg.Compare(KNSmlDMEmailName)==0)
+ {
+ HBufC8 *data = HBufC8::NewLC(iBuffer->At(index).iName->Length());
+ TPtr8 dataPtr = data->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8(
+ dataPtr,iBuffer->At(index).iName->Des() );
+ object->InsertL(0,dataPtr);
+ CleanupStack::PopAndDestroy(); //data
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailUID)==0)
+ {
+ HBufC *data = NULL;
+ if(iBuffer->At(index).iPop3Settings!= NULL)
+ {
+ data = HBufC::NewLC(iBuffer->At(index).iPop3Settings->LoginName().Length());
+ data->Des().Copy(iBuffer->At(index).iPop3Settings->LoginName());
+ }
+ else if(iBuffer->At(index).iImap4Settings!= NULL)
+ {
+ data = HBufC::NewLC(iBuffer->At(index).iImap4Settings->LoginName().Length());
+ data->Des().Copy(iBuffer->At(index).iImap4Settings->LoginName());
+ }
+ if(data)
+ {
+ HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data);
+ CleanupStack::PushL(data8);
+ object->InsertL(0,*data8);
+ CleanupStack::PopAndDestroy(2);//data, data8
+ }
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailPW)==0)
+ {
+ HBufC *data = NULL;
+ if(iBuffer->At(index).iPop3Settings!= NULL)
+ {
+ data = HBufC::NewLC(iBuffer->At(index).iPop3Settings->Password().Length());
+ data->Des().Copy(iBuffer->At(index).iPop3Settings->Password());
+ }
+ else if(iBuffer->At(index).iImap4Settings!= NULL)
+ {
+ data = HBufC::NewLC(iBuffer->At(index).iImap4Settings->Password().Length());
+ data->Des().Copy(iBuffer->At(index).iImap4Settings->Password());
+ }
+ if(data)
+ {
+ HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data);
+ CleanupStack::PushL(data8);
+ object->InsertL(0,*data8);
+ CleanupStack::PopAndDestroy(2);//data, data8
+ }
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailUAddr)==0)
+ {
+ HBufC *data = NULL;
+ data = iBuffer->At(index).iSmtpSettings->EmailAddress().AllocLC();
+ HBufC8 *data8 = HBufC8::NewLC(data->Size());
+ TPtr8 dataPtr8 = data8->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() );
+
+ object->InsertL(0,dataPtr8);
+ CleanupStack::PopAndDestroy(2); //data, data8
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailUName)==0)
+ {
+
+ HBufC *data = NULL;
+ data = iBuffer->At(index).iSmtpSettings->EmailAlias().AllocLC();
+ HBufC8 *data8 = HBufC8::NewLC(data->Size());
+ TPtr8 dataPtr8 = data8->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() );
+
+ object->InsertL(0,dataPtr8);
+ CleanupStack::PopAndDestroy(2); //data, data8
+ }
+
+ else if(lastUriSeg.Compare( KNSmlDMEmailMrcv)==0)
+ {
+ HBufC *data = NULL;
+ if(iBuffer->At(index).iPop3Settings!= NULL)
+ {
+ data = iBuffer->At(index).iPop3Settings->ServerAddress().AllocLC();
+ }
+ else if(iBuffer->At(index).iImap4Settings!= NULL)
+ {
+ data = iBuffer->At(index).iImap4Settings->ServerAddress().AllocLC();
+ }
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ if(data)
+ {
+ HBufC8 *data8 = HBufC8::NewLC(data->Size());
+ TPtr8 dataPtr8 = data8->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() );
+
+ object->InsertL(0,dataPtr8);
+ CleanupStack::PopAndDestroy(2); //data, data8
+ }
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailMsnd)==0)
+ {
+ HBufC *data = NULL;
+ data = iBuffer->At(index).iSmtpSettings->ServerAddress().AllocLC();
+ HBufC8 *data8 = HBufC8::NewLC(data->Size());
+ TPtr8 dataPtr8 = data8->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() );
+
+ object->InsertL(0,dataPtr8);
+ CleanupStack::PopAndDestroy(2); //data, data8
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailMpro)==0)
+ {
+ if(iBuffer->At(index).iPop3Settings!= NULL)
+ {
+ object->InsertL(0,KNSmlDMEmailMproPOP);
+ }
+ else if(iBuffer->At(index).iImap4Settings!= NULL)
+ {
+ object->InsertL(0,KNSmlDMEmailMproIMAP);
+ }
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailUseSecCon)==0)
+ {
+ FetchSecurityValueL(*object, &iBuffer->At(index), EUseSecCon );
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailUseSauth)==0)
+ {
+ if(iBuffer->At(index).iSmtpSettings->SMTPAuth())
+ {
+ object->InsertL(0,KNSmlDMEmailTrue);
+ }
+ else
+ {
+ object->InsertL(0,KNSmlDMEmailFalse);
+ }
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailSauthUID)==0)
+ {
+ HBufC *data = HBufC::NewLC(iBuffer->At(index).iSmtpSettings->LoginName().Length());
+ data->Des().Copy(iBuffer->At(index).iSmtpSettings->LoginName());
+ HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data);
+ CleanupStack::PushL(data8);
+ object->InsertL(0,*data8);
+ CleanupStack::PopAndDestroy(2);//data, data8
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailSauthPW)==0)
+ {
+ HBufC *data = HBufC::NewLC(iBuffer->At(index).iSmtpSettings->Password().Length());
+ data->Des().Copy(iBuffer->At(index).iSmtpSettings->Password());
+ HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data);
+ CleanupStack::PushL(data8);
+ object->InsertL(0,*data8);
+ CleanupStack::PopAndDestroy(2);//data, data8
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailPtxtSAuth)==0)
+ {
+ if(iBuffer->At(index).iSmtpSettings->InboxLoginDetails())
+ {
+ object->InsertL(0,KNSmlDMEmailTrue);
+ }
+ else
+ {
+ object->InsertL(0,KNSmlDMEmailFalse);
+ }
+ }
+
+ else if (lastUriSeg.Compare(KNSmlDMEmailSUseSecCon)==0)
+ {
+ FetchSecurityValueL(*object, &iBuffer->At(index), ESuseSecCon );
+ }
+
+ else if (lastUriSeg.Compare(KNSmlDMEmailUseStartTLS)==0)
+ {
+ FetchSecurityValueL(*object, &iBuffer->At(index), EUseStartTls );
+ }
+
+ else if (lastUriSeg.Compare(KNSmlDMEmailSUseStartTLS)==0)
+ {
+ FetchSecurityValueL(*object, &iBuffer->At(index), ESuseStartTls );
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailMrcvPort)==0)
+ {
+ TUint port;
+ if(iBuffer->At(index).iPop3Settings!= NULL)
+ {
+ port = iBuffer->At(index).iPop3Settings->Port();
+ }
+ else
+ {
+ port = iBuffer->At(index).iImap4Settings->Port();
+ }
+ HBufC8 *data = IntToDes8LC(port);
+ object->InsertL(0,data->Des());
+ CleanupStack::PopAndDestroy(); //data
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailMsndPort)==0)
+ {
+ TUint port = iBuffer->At(index).iSmtpSettings->Port();
+ HBufC8 *data = IntToDes8LC(port);
+ object->InsertL(0,data->Des());
+ CleanupStack::PopAndDestroy(); //data
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailUseAPOP)==0)
+ {
+ if(iBuffer->At(index).iPop3Settings!= NULL)
+ {
+ if(iBuffer->At(index).iPop3Settings->Apop())
+ {
+ object->InsertL(0,KNSmlDMEmailTrue);
+ }
+ else
+ {
+ object->InsertL(0,KNSmlDMEmailFalse);
+ }
+ }
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ }
+
+ else if (lastUriSeg.Compare(KNSmlDMEmailFolderPath)==0)
+ {
+ if(iBuffer->At(index).iImap4Settings)
+ {
+ object->InsertL(0, iBuffer->At(index).iImap4Settings->FolderPath() );
+ }
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailToNapID)==0)
+ {
+
+ CNSmlDMIAPMatcher* iapmatch = CNSmlDMIAPMatcher::NewL( &Callback() );
+ CleanupStack::PushL(iapmatch);
+ HBufC8* uri8 = NULL;
+ TInt iapCount = iBuffer->At(index).iIapPref->NumberOfIAPs();
+ if ( iapCount )
+ {
+ TImIAPChoice localIAP = iBuffer->At(index).iIapPref->IAPPreference(0);
+ uri8 = iapmatch->URIFromIAPIdL( localIAP.iIAP );
+ }
+
+ if( uri8 )
+ {
+ CleanupStack::PushL(uri8);
+ object->InsertL(0,uri8->Des());
+ status = CSmlDmAdapter::EOk;
+ CleanupStack::PopAndDestroy(); // uri8
+ }
+
+ CleanupStack::PopAndDestroy(); // iapMatch
+ }
+ else if(lastUriSeg.Compare(KNSmlDMEmailSToNapID)==0)
+ {
+
+ // SToNapID exists only for SMTP
+ if (iBuffer->At(index).iSmtpSettings!= NULL)
+ {
+ CNSmlDMIAPMatcher* iapmatch = CNSmlDMIAPMatcher::NewL( &Callback() );
+ CleanupStack::PushL(iapmatch);
+ HBufC8* uri8 = NULL;
+ TInt iapCount = iBuffer->At(index).iIapPref->NumberOfIAPs();
+ if ( iapCount )
+ {
+ TImIAPChoice localIAP = iBuffer->At(index).iSmtpIapPref->IAPPreference(0);
+ uri8 = iapmatch->URIFromIAPIdL( localIAP.iIAP );
+ }
+
+ if( uri8 )
+ {
+ CleanupStack::PushL(uri8);
+ object->InsertL(0,uri8->Des());
+ status = CSmlDmAdapter::EOk;
+ CleanupStack::PopAndDestroy(); // uri8
+ }
+
+ CleanupStack::PopAndDestroy(); // iapMatch
+ }
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ }
+
+ if(status == CSmlDmAdapter::EOk)
+ {
+ Callback().SetResultsL(aResultsRef,*object,aType);
+ }
+ Callback().SetStatusL(aStatusRef, status);
+ CleanupStack::PopAndDestroy(object); //object
+
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::ChildURIListL( const TDesC8& aURI,
+// const TDesC8& aParentLUID,
+// const CArrayFix<TSmlDmMappingInfo>&
+// aPreviousURISegmentList,
+// const TInt aResultsRef,
+// const TInt aStatusRef )
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::ChildURIListL( const TDesC8& aURI,
+ const TDesC8& aParentLUID,
+ const CArrayFix<TSmlDmMappingInfo>&
+ aPreviousURISegmentList,
+ const TInt aResultsRef,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::ChildURIListL(): begin");
+
+ CSmlDmAdapter::TError ret = CSmlDmAdapter::EError;
+
+ if( OpenSessionL() != KErrNone )
+ {
+ Callback().SetStatusL(aStatusRef, ret);
+ _DBG_FILE("CNSmlDmEmailAdapter::ChildURIListL(): end");
+ return;
+ }
+ CBufBase *currentList = CBufFlat::NewL(128);
+ CleanupStack::PushL(currentList);
+
+ CEmailAccounts* emailAccs = CEmailAccounts::NewLC();
+
+ if(aURI.Compare(KNSmlDMEmailNodeName)==0)
+ {
+ RArray<TImapAccount> imap4Accounts;
+ CleanupClosePushL( imap4Accounts );
+ emailAccs->GetImapAccountsL(imap4Accounts);
+
+ // First, IMAP accounts
+ //
+ TInt luid;
+ TPtrC8 name;
+ // cycle through every found account
+ for(TInt count = 0; count < imap4Accounts.Count(); count++)
+ {
+ SetLuidById( EImap, imap4Accounts[count].iImapAccountId, luid );
+
+ TBool found = EFalse;
+ // cycle through every known account
+ for(TInt i = 0; i<aPreviousURISegmentList.Count();i++)
+ {
+ // compare if found is known
+ if( luid == DesToInt(aPreviousURISegmentList.At(i).iURISegLUID))
+ {
+ found = ETrue;
+ name.Set(aPreviousURISegmentList.At(i).iURISeg);
+ break;
+ }
+ }
+ // if found != known add mapping to it
+ if(!found)
+ {
+ HBufC8 *uri = HBufC8::NewLC(aURI.Length() +
+ KNSmlDMEmailMproIMAP().Length() + 6);
+
+ TPtr8 uriPtr = uri->Des();
+ uriPtr.Format(aURI);
+ uriPtr.Append(KNSmlDMEmailSeparator8);
+ uriPtr.Append(KNSmlDMEmailMproIMAP);
+ TUint16 crc;
+ Mem::Crc ( crc, &imap4Accounts[count],sizeof(TImapAccount) );
+ HBufC8 *crcBuf = IntToDes8LC(crc);
+ uriPtr.Append(*crcBuf);
+ HBufC8 *luidBuf = IntToDes8LC(luid);
+ Callback().SetMappingL(uriPtr,luidBuf->Des());
+ currentList->InsertL( currentList->Size(),LastURISeg(uriPtr));
+ CleanupStack::PopAndDestroy(3); //uri,luidBuf, crcBuf
+ }
+ else
+ {
+ currentList->InsertL( currentList->Size(),name );
+ }
+ // in all cases: add it to results.
+ if(count < imap4Accounts.Count()-1 )
+ {
+ currentList->InsertL(currentList->Size(),KNSmlDMEmailSeparator8);
+ }
+ }
+ CleanupStack::PopAndDestroy(); //imap4Accounts
+
+ // Then, POP accounts
+ //
+ RArray<TPopAccount> pop3Accounts;
+ CleanupClosePushL( pop3Accounts );
+ emailAccs->GetPopAccountsL( pop3Accounts );
+ if (pop3Accounts.Count()&¤tList->Size()>0)
+ {
+ // there is at least one account; insert separator
+ currentList->InsertL(currentList->Size(),KNSmlDMEmailSeparator8);
+ }
+ // cycle through every found account
+ for(TInt count = 0; count < pop3Accounts.Count(); count++)
+ {
+ SetLuidById( EPop, pop3Accounts[count].iPopAccountId, luid );
+
+ TBool found = EFalse;
+ // cycle through every known account
+ for(TInt i = 0; i<aPreviousURISegmentList.Count();i++)
+ {
+ // compare if found is known
+ if( luid == DesToInt(aPreviousURISegmentList.At(i).iURISegLUID))
+
+ {
+ found = ETrue;
+ name.Set(aPreviousURISegmentList.At(i).iURISeg);
+ break;
+ }
+ }
+ // if found != known add mapping to it
+ if(!found)
+ {
+
+ HBufC8 *uri = HBufC8::NewLC(aURI.Length() +
+ KNSmlDMEmailMproPOP().Length() + 5);
+ TPtr8 uriPtr = uri->Des();
+ uriPtr.Format(aURI);
+ uriPtr.Append(KNSmlDMEmailSeparator8);
+ uriPtr.Append(KNSmlDMEmailMproPOP);
+ TUint16 crc;
+ Mem::Crc ( crc, &pop3Accounts[count],sizeof(TPopAccount) );
+ HBufC8 *crcBuf = IntToDes8LC(crc);
+ uriPtr.Append(*crcBuf);
+ HBufC8 *luidBuf = IntToDes8LC(luid);
+ Callback().SetMappingL(uriPtr,luidBuf->Des());
+ currentList->InsertL( currentList->Size(),LastURISeg(uriPtr));
+ CleanupStack::PopAndDestroy(3); //uri,luidBuf,crcBuf
+ }
+ else
+ {
+ currentList->InsertL( currentList->Size(),name );
+ }
+ // in all cases: add it to results.
+ if(count < pop3Accounts.Count()-1)
+ {
+ currentList->InsertL(currentList->Size(),KNSmlDMEmailSeparator8);
+ }
+ }
+ CleanupStack::PopAndDestroy(); //pop3Accounts
+ ret = CSmlDmAdapter::EOk;
+ }
+ else
+ {
+ if(aParentLUID.Length() > 0)
+ {
+ TInt err = KErrNotFound;
+ TInt luid = DesToInt(aParentLUID);
+ TNSmlEmailAccountType accType;
+ TInt id;
+ GetIdByLuid( accType, id, luid );
+ switch ( accType )
+ {
+ case EImap:
+ {
+ RArray<TImapAccount> imap4Accounts;
+ CleanupClosePushL( imap4Accounts );
+ emailAccs->GetImapAccountsL( imap4Accounts );
+ for ( TInt i=0; i<imap4Accounts.Count(); i++ )
+ {
+ if ( imap4Accounts[i].iImapAccountId == id )
+ {
+ err = KErrNone;
+ break;
+ }
+ }
+ CleanupStack::PopAndDestroy(); //imap4Accounts
+ break;
+ }
+ case EPop:
+ {
+ RArray<TPopAccount> pop3Accounts;
+ CleanupClosePushL( pop3Accounts );
+ emailAccs->GetPopAccountsL(pop3Accounts);
+ for ( TInt i=0; i<pop3Accounts.Count(); i++ )
+ {
+ if ( pop3Accounts[i].iPopAccountId == id )
+ {
+ err = KErrNone;
+ break;
+ }
+ }
+ CleanupStack::PopAndDestroy(); //pop3Accounts
+ break;
+ }
+ default:
+ ret = CSmlDmAdapter::EError;
+ break;
+ }
+ if( err == KErrNotFound )
+ {
+ ret = CSmlDmAdapter::ENotFound;
+ }
+
+ if ( err == KErrNone )
+ {
+ ret = CSmlDmAdapter::EOk;
+ currentList->InsertL(0,KNSmlDMEmailListOfLeafs);
+ }
+ }
+ else
+ {
+ ret = CSmlDmAdapter::ENotFound;
+ }
+ }
+ // Common part
+ Callback().SetStatusL(aStatusRef, ret);
+ if( ret == CSmlDmAdapter::EOk )
+ {
+ Callback().SetResultsL(aResultsRef,*currentList,KNullDesC8);
+ }
+
+ CleanupStack::PopAndDestroy(emailAccs); //emailAccs
+ CleanupStack::PopAndDestroy(currentList); //currentList
+ _DBG_FILE("CNSmlDmEmailAdapter::ChildURIListL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::AddNodeObjectL( const TDesC8& aURI,
+// const TDesC8& aParentLUID, const TInt aStatusRef )
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::AddNodeObjectL( const TDesC8& aURI,
+ const TDesC8& aParentLUID,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): begin");
+
+ if(aParentLUID.Length()>0)
+ {
+ TInt luid = DesToInt(aParentLUID);
+ TInt accId;
+ TNSmlEmailAccountType accType;
+ GetIdByLuid( accType, accId, luid );
+ TInt err = OpenSessionL();
+ if(err!=KErrNone)
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): EError end");
+ return;
+ }
+ CEmailAccounts* emailAccs = CEmailAccounts::NewLC();
+ TBool accEx = AccountExistsL( emailAccs, accType, accId, -1 );
+ CleanupStack::PopAndDestroy( emailAccs );
+ if( accEx )
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EAlreadyExists);
+ _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): EAlreadyExists end");
+ return;
+ }
+ else
+ {
+ TInt ret = Callback().RemoveMappingL( KNSmlDMEmailAdapterImplUid,
+ GetDynamicEmailNodeUri(aURI), ETrue );
+ if(ret != KErrNone)
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): EError end");
+ return;
+ }
+ }
+ Callback().SetMappingL(aURI,KNullDesC8);
+ }
+
+ if( aURI.Find(KNSmlDMEmailNodeName)>=0 && NumOfURISegs(aURI)==2 )
+ {
+ if( OpenSessionL() != KErrNone )
+ {
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): EError end");
+ return;
+ }
+
+ RFs fs;
+ User::LeaveIfError( fs.Connect() );
+ CleanupClosePushL(fs);
+ //2files and 2 folders are needed for settings
+ if (SysUtil::FFSSpaceBelowCriticalLevelL(&fs,
+ KNSmlDmFatMinimumFileSize*4))
+ {
+ CleanupStack::PopAndDestroy(); //fs
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EDiskFull);
+ _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): EDiskFull end");
+ return;
+ // do not write
+ }
+ CleanupStack::PopAndDestroy(); //fs
+
+
+ TNSmlEmailSettingsElement newNode;
+ newNode.iMappingName = aURI.AllocLC();
+ newNode.iName = HBufC::NewLC(0);
+ newNode.iNodeBuf = new (ELeave)
+ CArrayFixFlat <TNSmlEmailCommandElement> (KNSmlDmEmailGranularity);
+ newNode.iExecuted = EFalse;
+ newNode.iImap4Settings = NULL;
+ newNode.iPop3Settings = NULL;
+ newNode.iSmtpSettings = NULL;
+ newNode.iIapPref = NULL;
+ newNode.iSmtpIapPref = NULL;
+ newNode.iLuid = 0;
+ newNode.iJustFetch=EFalse;
+ iBuffer->AppendL(newNode);
+ CleanupStack::Pop(2); //newNode.iMappingName,newNode.iName
+ TNSmlEmailCommandElement newCommand;
+ newCommand.iLastUriSeg = LastURISeg(aURI).AllocLC(); //aURI.AllocLC();
+ newCommand.iData = NULL;
+ newCommand.iStatusRef = aStatusRef;
+ newCommand.iLeaf = EFalse;
+ newCommand.iStatus = CSmlDmAdapter::EOk;
+ TInt index = iBuffer->Count() - 1;
+ iBuffer->At(index).iNodeBuf->AppendL(newCommand);
+ CleanupStack::Pop(); //newCommand.iLastUriSeg
+
+
+ }
+ _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): end");
+ }
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::UpdateLeafObjectL( const TDesC8& aURI,
+// const TDesC8& aLUID, RWriteStream*& aStream, const TDesC8& aType,
+// const TInt aStatusRef )
+// This should update a stream object, but in case of Email settings streaming
+// is not supported.
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::UpdateLeafObjectL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/,
+ RWriteStream*& /*aStream*/,
+ const TDesC8& /*aType*/,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(stream): begin");
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(stream): end");
+ }
+// -----------------------------------------------------------------------------
+// void CNSmlDmEmailAdapter::FetchLeafObjectSizeL( const TDesC8& aURI,
+// const TDesC8& aLUID, const TDesC8& aType, const TInt aResultsRef,
+// const TInt aStatusRef )
+// Fetches data object and returns its size.
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::FetchLeafObjectSizeL( const TDesC8& aURI,
+ const TDesC8& aLUID,
+ const TDesC8& aType,
+ const TInt aResultsRef,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectSizeL(): begin");
+
+ CBufBase *result = CBufFlat::NewL(32);
+ CleanupStack::PushL(result);
+ CSmlDmAdapter::TError status = FetchObjectL(aURI, aLUID, *result);
+ if( status == CSmlDmAdapter::EOk )
+ {
+ TInt objSizeInBytes = result->Size();
+ TBuf8<4> stringObjSizeInBytes;
+ stringObjSizeInBytes.Num( objSizeInBytes );
+ result->Reset();
+ result->InsertL( 0, stringObjSizeInBytes );
+ Callback().SetResultsL(aResultsRef, *result, aType);
+ }
+ Callback().SetStatusL(aStatusRef, status);
+ CleanupStack::PopAndDestroy(); //result
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectSizeL(): end");
+ }
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::ExecuteCommandL()
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::ExecuteCommandL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/,
+ const TDesC8& /*aArgument*/,
+ const TDesC8& /*aType*/,
+ const TInt aStatusRef )
+ {
+ //Not supported
+ _DBG_FILE("CNSmlDmEmailAdapter::ExecuteCommandL(): begin");
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ _DBG_FILE("CNSmlDmEmailAdapter::ExecuteCommandL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::ExecuteCommandL()
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::ExecuteCommandL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/,
+ RWriteStream*& /*aStream*/,
+ const TDesC8& /*aType*/,
+ const TInt aStatusRef )
+ {
+ //Not supported
+ _DBG_FILE("CNSmlDmEmailAdapter::ExecuteCommandL(): begin");
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ _DBG_FILE("CNSmlDmEmailAdapter::ExecuteCommandL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::CopyCommandL()
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::CopyCommandL( const TDesC8& /*aTargetURI*/,
+ const TDesC8& /*aTargetLUID*/,
+ const TDesC8& /*aSourceURI*/,
+ const TDesC8& /*aSourceLUID*/,
+ const TDesC8& /*aType*/,
+ TInt aStatusRef )
+ {
+ //Not supported
+ _DBG_FILE("CNSmlDmEmailAdapter::CopyCommandL(): begin");
+ Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ _DBG_FILE("CNSmlDmEmailAdapter::CopyCommandL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::StartAtomicL()
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::StartAtomicL()
+ {
+ //Not supported
+ _DBG_FILE("CNSmlDmEmailAdapter::StartAtomicL(): begin");
+ _DBG_FILE("CNSmlDmEmailAdapter::StartAtomicL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::CommitAtomicL()
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::CommitAtomicL()
+ {
+ //Not supported
+ _DBG_FILE("CNSmlDmEmailAdapter::CommitAtomicL(): begin");
+ _DBG_FILE("CNSmlDmEmailAdapter::CommitAtomicL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::RollbackAtomicL()
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::RollbackAtomicL()
+ {
+ //Not supported
+ _DBG_FILE("CNSmlDmEmailAdapter::RollbackAtomicL(): begin");
+ _DBG_FILE("CNSmlDmEmailAdapter::RollbackAtomicL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::StreamingSupport()
+// -----------------------------------------------------------------------------
+TBool CNSmlDmEmailAdapter::StreamingSupport( TInt& /*aItemSize*/ )
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::StreamingSupport(): begin");
+ _DBG_FILE("CNSmlDmEmailAdapter::StreamingSupport(): end");
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::StreamCommittedL()
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::StreamCommittedL()
+ {
+ //Not supported
+ _DBG_FILE("CNSmlDmEmailAdapter::StreamCommittedL(): begin");
+ _DBG_FILE("CNSmlDmEmailAdapter::StreamCommittedL(): end");
+ }
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::CompleteOutstandingCmdsL()
+// Indication of message ending. The buffered commands must be executed
+// before return of this function.
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::CompleteOutstandingCmdsL()
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::CompleteOutstandingCmdsL(): begin");
+
+ for(TInt i=0;i<iBuffer->Count();i++)
+ {
+
+ //Set buffered port values
+ for(TInt cmd=0;cmd<iBuffer->At(i).iNodeBuf->Count();cmd++)
+ {
+
+ TNSmlEmailSettingsElement& bufElem = iBuffer->At(i);
+ TNSmlEmailCommandElement& elem = bufElem.iNodeBuf->At(cmd);
+
+ if(elem.iLastUriSeg->Compare(KNSmlDMEmailMrcvPort)==0)
+ {
+ TUint port = DesToInt(*elem.iData);
+
+ if(port>0 && port <= KNSmlDMEmailMaxPortNbr)
+ {
+ if(bufElem.iPop3Settings!= NULL)
+ {
+ bufElem.iPop3Settings->SetPort(port);
+ }
+ else if(bufElem.iImap4Settings!= NULL)
+ {
+ bufElem.iImap4Settings->SetPort(port);
+ }
+ }
+ else
+ {
+ elem.iStatus = CSmlDmAdapter::EInvalidObject;
+ }
+ }
+ else if(elem.iLastUriSeg->Compare(KNSmlDMEmailMsndPort)==0)
+ {
+ TUint port = DesToInt(*elem.iData);
+
+ if(port>0 && port <= KNSmlDMEmailMaxPortNbr)
+ {
+ bufElem.iSmtpSettings->SetPort(port);
+ }
+ else
+ {
+ elem.iStatus = CSmlDmAdapter::EInvalidObject;
+ }
+ }
+ if((iBuffer->At(i).iSmtpSettings->LoginName()==KNullDesC8) && elem.iLastUriSeg->Compare(KNSmlDMEmailUID)==0)
+ {
+ elem.iStatus = CSmlDmAdapter::EError;
+ }
+ }
+
+
+ CSmlDmAdapter::TError stat = CSmlDmAdapter::EOk;
+ TInt luid=-1;
+
+ if(iBuffer->At(i).iExecuted)
+ {
+ TRAPD( leaveCode,luid = ValidateAndStoreSettingsL(i) );
+ if(leaveCode!=KErrNone)
+ {
+ stat = CSmlDmAdapter::EError;
+ }
+ }
+ else
+ {
+ stat = CSmlDmAdapter::EError;
+ }
+
+ for(TInt cmd=0;cmd<iBuffer->At(i).iNodeBuf->Count();cmd++)
+ {
+
+ if(iBuffer->At(i).iNodeBuf->At(cmd).iStatus==CSmlDmAdapter::EOk)
+ {
+ Callback().SetStatusL(iBuffer->At(i).iNodeBuf->At(cmd).iStatusRef,
+ stat);
+ if(!iBuffer->At(i).iNodeBuf->At(cmd).iLeaf)
+ {
+ if(stat==CSmlDmAdapter::EOk)
+ {
+ HBufC8* luidDes = IntToDes8LC(luid);
+ Callback().SetMappingL( iBuffer->At(i).iMappingName->Des(),
+ luidDes->Des() );
+ CleanupStack::PopAndDestroy(); //luidDes
+ }
+ }
+ }
+ else
+ {
+ Callback().SetStatusL(iBuffer->At(i).iNodeBuf->At(cmd).iStatusRef,
+ iBuffer->At(i).iNodeBuf->At(cmd).iStatus);
+ }
+
+ delete iBuffer->At(i).iNodeBuf->At(cmd).iLastUriSeg;
+ iBuffer->At(i).iNodeBuf->At(cmd).iLastUriSeg= NULL;
+ delete iBuffer->At(i).iNodeBuf->At(cmd).iData;
+ iBuffer->At(i).iNodeBuf->At(cmd).iData= NULL;
+
+ }
+ iBuffer->At(i).iNodeBuf->Reset();
+ delete iBuffer->At(i).iNodeBuf;
+ iBuffer->At(i).iNodeBuf = NULL;
+ delete iBuffer->At(i).iMappingName;
+ iBuffer->At(i).iMappingName= NULL;
+ delete iBuffer->At(i).iName;
+ iBuffer->At(i).iName= NULL;
+ delete iBuffer->At(i).iSmtpSettings;
+ iBuffer->At(i).iSmtpSettings= NULL;
+ delete iBuffer->At(i).iPop3Settings;
+ iBuffer->At(i).iPop3Settings= NULL;
+ delete iBuffer->At(i).iImap4Settings;
+ iBuffer->At(i).iImap4Settings= NULL;
+ delete iBuffer->At(i).iIapPref;
+ iBuffer->At(i).iIapPref= NULL;
+ delete iBuffer->At(i).iSmtpIapPref;
+ iBuffer->At(i).iSmtpIapPref= NULL;
+
+ } // end for
+ iBuffer->Reset();
+
+ _DBG_FILE("CNSmlDmEmailAdapter::CompleteOutstandingCmdsL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+
+#ifndef IMPLEMENTATION_PROXY_ENTRY
+#define IMPLEMENTATION_PROXY_ENTRY(aUid, aFuncPtr) {{aUid},(aFuncPtr)}
+#endif
+
+const TImplementationProxy ImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY(KNSmlDMEmailAdapterImplUid,
+ CNSmlDmEmailAdapter::NewL)
+ };
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+ {
+ _DBG_FILE("ImplementationGroupProxy() for CNSmlDmEmailAdapter: begin");
+ aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+ _DBG_FILE("ImplementationGroupProxy() for CNSmlDmEmailAdapter: end");
+ return ImplementationTable;
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// TPtrC8 CNSmlDmEmailAdapter::LastURISeg(const TDesC8& aURI)
+// Returns only the last uri segemnt
+// -----------------------------------------------------------------------------
+TPtrC8 CNSmlDmEmailAdapter::LastURISeg(const TDesC8& aURI) const
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::LastURISeg() : begin");
+ TInt i;
+ for(i=aURI.Length()-1;i>=0;i--)
+ {
+ if(aURI[i]=='/')
+ {
+ break;
+ }
+ }
+ _DBG_FILE("CNSmlDmEmailAdapter::LastURISeg() : end");
+ if(i==0)
+ {
+ return aURI;
+ }
+ else
+ {
+ return aURI.Mid(i+1);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// TPtrC8 CNSmlDmEmailAdapter::RemoveLastURISeg(const TDesC8& aURI)
+// returns parent uri, i.e. removes last uri segment
+// -----------------------------------------------------------------------------
+TPtrC8 CNSmlDmEmailAdapter::RemoveLastURISeg(const TDesC8& aURI) const
+ {
+ TInt i;
+ for(i=aURI.Length()-1;i>=0;i--)
+ {
+ if(aURI[i]=='/')
+ {
+ break;
+ }
+ }
+ return aURI.Left(i);
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// TInt CNSmlDmEmailAdapter::NumOfURISegs(const TDesC8& aURI)
+// Returns the num of uri segs
+// -----------------------------------------------------------------------------
+TInt CNSmlDmEmailAdapter::NumOfURISegs(const TDesC8& aURI) const
+ {
+ TInt numOfURISegs = 1;
+ for(TInt i=0;i<aURI.Length();i++)
+ {
+ if(aURI[i]=='/')
+ {
+ numOfURISegs++;
+ }
+ }
+ return numOfURISegs;
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// void CNSmlDmEmailAdapter::HandleSessionEventL( TMsvSessionEvent /*aEvent*/,
+// TAny* /*aArg1*/,
+// TAny* /*aArg2*/,
+// TAny* /*aArg3*/ )
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::HandleSessionEventL( TMsvSessionEvent /*aEvent*/,
+ TAny* /*aArg1*/,
+ TAny* /*aArg2*/,
+ TAny* /*aArg3*/ )
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::HandleSessionEventL(): begin");
+ _DBG_FILE("CNSmlDmEmailAdapter::HandleSessionEventL(): end");
+ }
+
+
+// -----------------------------------------------------------------------------
+// TInt CNSmlDmEmailAdapter::DesToInt(const TDesC& aLuid) const
+// Converts 16bit descriptor to int
+// -----------------------------------------------------------------------------
+TInt CNSmlDmEmailAdapter::DesToInt(const TDesC& aLuid) const
+ {
+ TLex16 lex(aLuid);
+ TInt value = 0;
+ lex.Val(value);
+ return value;
+ }
+
+// -----------------------------------------------------------------------------
+// TInt CNSmlDmEmailAdapter::DesToInt(const TDesC8& aLuid) const
+// Converts 8bit descriptor to int
+// -----------------------------------------------------------------------------
+TInt CNSmlDmEmailAdapter::DesToInt(const TDesC8& aLuid) const
+ {
+ TLex8 lex(aLuid);
+ TInt value = 0;
+ lex.Val(value);
+ return value;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::FirstAddLeafL()
+// -----------------------------------------------------------------------------
+TInt CNSmlDmEmailAdapter::FirstAddLeafL(const TDesC8& aURI,
+ const TDesC8& aObject,
+ TInt aStatusRef,
+ TInt aIndex)
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::FirstAddLeafL() :: begin");
+
+ TPtrC8 lastSeg = LastURISeg(aURI);
+
+ TNSmlEmailCommandElement newCommand;
+ newCommand.iLastUriSeg = lastSeg.AllocLC();
+ newCommand.iData = aObject.AllocLC();
+ newCommand.iStatusRef = aStatusRef;
+ newCommand.iLeaf = ETrue;
+ newCommand.iStatus = CSmlDmAdapter::EOk;
+ iBuffer->At(aIndex).iNodeBuf->AppendL(newCommand);
+ CleanupStack::Pop(2); //newCommand.iLastUriSeg, newCommand.iData
+ if(!iBuffer->At(aIndex).iExecuted)
+ {
+ if(lastSeg.Compare(KNSmlDMEmailMpro)==0)
+ {
+ TBool ok = EFalse;
+ HBufC8* object = aObject.AllocLC();
+ TPtr8 objectPtr = object->Des();
+ objectPtr.UpperCase();
+
+ if(objectPtr.Find(KNSmlDMEmailMproPOP) >= 0)
+ {
+ iBuffer->At(aIndex).iPop3Settings = new(ELeave) CImPop3Settings;
+ ok=ETrue;
+ }
+
+ else if(objectPtr.Find(KNSmlDMEmailMproIMAP) >= 0)
+ {
+ iBuffer->At(aIndex).iImap4Settings = new(ELeave) CImImap4Settings;
+ ok=ETrue;
+ }
+ if(ok)
+ {
+ iBuffer->At(aIndex).iSmtpSettings = new(ELeave) CImSmtpSettings;
+ iBuffer->At(aIndex).iIapPref = CImIAPPreferences::NewLC();
+ iBuffer->At(aIndex).iSmtpIapPref = CImIAPPreferences::NewLC();
+ CleanupStack::Pop(); //iBuffer->At(index).iIapPref
+ CleanupStack::Pop(); //iBuffer->At(index).iSmtpIapPref
+ SetDefaultSettingsL(aIndex);
+
+ for(TInt i = 0; i<iBuffer->At(aIndex).iNodeBuf->Count();i++)
+ {
+ if(iBuffer->At(aIndex).iNodeBuf->At(i).iLeaf)
+ {
+ DoAddLeafObjectL(iBuffer->At(aIndex).iNodeBuf->At(i).iLastUriSeg->Des(),
+ iBuffer->At(aIndex).iNodeBuf->At(i).iData->Des(),
+ aIndex, i);
+ }
+ }
+
+ iBuffer->At(aIndex).iExecuted = ETrue;
+ }
+ CleanupStack::PopAndDestroy(); //object
+ }
+ }
+ else
+ {
+ DoAddLeafObjectL(lastSeg,aObject,aIndex,
+ iBuffer->At(aIndex).iNodeBuf->Count()-1);
+ }
+
+ _DBG_FILE("CNSmlDmEmailAdapter::FirstAddLeafL() :: end");
+ return KErrNone;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::DoAddLeafObjectL
+// -----------------------------------------------------------------------------
+TInt CNSmlDmEmailAdapter::DoAddLeafObjectL(const TDesC8& aLastUriSeg,
+ const TDesC8& aObject,
+ TInt aIndex,
+ TInt aCommand)
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::DoAddLeafObjectL() :: begin");
+ if(aLastUriSeg.Compare(KNSmlDMEmailName)==0)
+ {
+ if ( aObject.Size() < KEmailAccountNameSize )
+ {
+ delete iBuffer->At(aIndex).iName;
+ iBuffer->At(aIndex).iName = NULL;
+ iBuffer->At(aIndex).iName = HBufC::NewL(aObject.Size());
+ TPtr namePtr = iBuffer->At(aIndex).iName->Des();
+ CnvUtfConverter::ConvertToUnicodeFromUtf8( namePtr, aObject );
+ }
+ else
+ {
+ iBuffer->At(aIndex).iNodeBuf->At(aCommand).iStatus =
+ CSmlDmAdapter::ETooLargeObject;
+ }
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailUID)==0)
+ {
+ if(iBuffer->At(aIndex).iPop3Settings!= NULL)
+ {
+ iBuffer->At(aIndex).iPop3Settings->SetLoginNameL(aObject);
+ }
+ else if(iBuffer->At(aIndex).iImap4Settings!= NULL)
+ {
+ iBuffer->At(aIndex).iImap4Settings->SetLoginNameL(aObject);
+ }
+ if(iBuffer->At(aIndex).iSmtpSettings->LoginName()==KNullDesC8)
+ {
+ iBuffer->At(aIndex).iSmtpSettings->SetLoginNameL(aObject);
+ }
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailPW)==0)
+ {
+ if(iBuffer->At(aIndex).iPop3Settings!= NULL)
+ {
+ iBuffer->At(aIndex).iPop3Settings->SetPasswordL(aObject);
+ }
+ else if(iBuffer->At(aIndex).iImap4Settings!= NULL)
+ {
+ iBuffer->At(aIndex).iImap4Settings->SetPasswordL(aObject);
+ }
+ if(iBuffer->At(aIndex).iSmtpSettings->Password()==KNullDesC8)
+ {
+ iBuffer->At(aIndex).iSmtpSettings->SetPasswordL(aObject);
+ }
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailUAddr)==0)
+ {
+ HBufC *object = HBufC::NewLC(aObject.Size());
+ TPtr objectPtr = object->Des();
+ CnvUtfConverter::ConvertToUnicodeFromUtf8( objectPtr, aObject );
+ if(iBuffer->At(aIndex).iSmtpSettings!= NULL)
+ {
+ iBuffer->At(aIndex).iSmtpSettings->SetEmailAddressL(objectPtr);
+ iBuffer->At(aIndex).iSmtpSettings->SetReplyToAddressL(objectPtr);
+ iBuffer->At(aIndex).iSmtpSettings->SetReceiptAddressL(objectPtr);
+ }
+
+ CleanupStack::PopAndDestroy(); //object
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailUName)==0)
+ {
+ HBufC *object = HBufC::NewLC(aObject.Size());
+ TPtr objectPtr = object->Des();
+ CnvUtfConverter::ConvertToUnicodeFromUtf8( objectPtr, aObject );
+ if(iBuffer->At(aIndex).iSmtpSettings!= NULL)
+ {
+ iBuffer->At(aIndex).iSmtpSettings->SetEmailAliasL(objectPtr);
+ }
+ CleanupStack::PopAndDestroy(); //object
+ }
+
+ else if(aLastUriSeg.Compare( KNSmlDMEmailMrcv)==0)
+ {
+ HBufC *object = HBufC::NewLC(aObject.Size());
+ TPtr objectPtr = object->Des();
+ CnvUtfConverter::ConvertToUnicodeFromUtf8( objectPtr, aObject );
+ if(iBuffer->At(aIndex).iPop3Settings!= NULL)
+ {
+ iBuffer->At(aIndex).iPop3Settings->SetServerAddressL(objectPtr);
+ }
+ else if(iBuffer->At(aIndex).iImap4Settings!= NULL)
+ {
+ iBuffer->At(aIndex).iImap4Settings->SetServerAddressL(objectPtr);
+ }
+ CleanupStack::PopAndDestroy(); //object
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailMsnd)==0)
+ {
+ HBufC *object = HBufC::NewLC(aObject.Size());
+ TPtr objectPtr = object->Des();
+ CnvUtfConverter::ConvertToUnicodeFromUtf8( objectPtr, aObject );
+ if(iBuffer->At(aIndex).iSmtpSettings!= NULL)
+ {
+ iBuffer->At(aIndex).iSmtpSettings->SetServerAddressL(objectPtr);
+ }
+ CleanupStack::PopAndDestroy(); //object
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailMpro)==0)
+ {
+ iBuffer->At(aIndex).iNodeBuf->At(aCommand).iStatus = CSmlDmAdapter::EOk;
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailUseSecCon)==0)
+ {
+ SetDefaultSecurityL(aObject, &iBuffer->At(aIndex), EUseSecCon );
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailUseSauth)==0)
+ {
+ HBufC8 *data = aObject.AllocLC();
+ TPtr8 dataPtr = data->Des();
+ dataPtr.Capitalize();
+ TBool object=EFalse;
+ if(dataPtr.Find(KNSmlDMEmailTrue)>=0)
+ {
+ object = ETrue;
+ }
+ if(iBuffer->At(aIndex).iSmtpSettings!= NULL)
+ {
+ iBuffer->At(aIndex).iSmtpSettings->SetSMTPAuth(object);
+ }
+ CleanupStack::PopAndDestroy(); //data
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailSauthUID)==0)
+ {
+ if( iBuffer->At(aIndex).iSmtpSettings )
+ {
+ iBuffer->At(aIndex).iSmtpSettings->SetLoginNameL(aObject);
+ }
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailSauthPW)==0)
+ {
+ if( iBuffer->At(aIndex).iSmtpSettings )
+ {
+ iBuffer->At(aIndex).iSmtpSettings->SetPasswordL( aObject );
+ }
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailPtxtSAuth)==0)
+ {
+ HBufC8 *data = aObject.AllocLC();
+ TPtr8 dataPtr = data->Des();
+ dataPtr.Capitalize();
+ TBool object=EFalse;
+ if(dataPtr.Find(KNSmlDMEmailTrue)>=0)
+ {
+ object = ETrue;
+ }
+ if(iBuffer->At(aIndex).iSmtpSettings!= NULL)
+ {
+ iBuffer->At(aIndex).iSmtpSettings->SetInboxLoginDetails(object);
+ }
+ CleanupStack::PopAndDestroy(); //data
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailSUseSecCon)==0)
+ {
+ SetDefaultSecurityL(aObject, &iBuffer->At(aIndex), ESuseSecCon );
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailUseStartTLS)==0)
+ {
+ SetDefaultSecurityL(aObject, &iBuffer->At(aIndex), EUseStartTls );
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailSUseStartTLS)==0)
+ {
+ SetDefaultSecurityL(aObject, &iBuffer->At(aIndex), ESuseStartTls );
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailMrcvPort)==0)
+ {
+ TNSmlEmailSettingsElement& bufElem = iBuffer->At(aIndex);
+ TNSmlEmailCommandElement& elem = bufElem.iNodeBuf->At(aCommand);
+ elem.iData = aObject.AllocL();
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailMsndPort)==0)
+ {
+ TNSmlEmailSettingsElement& bufElem = iBuffer->At(aIndex);
+ TNSmlEmailCommandElement& elem = bufElem.iNodeBuf->At(aCommand);
+ elem.iData = aObject.AllocL();
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailUseAPOP)==0)
+ {
+ TBool object=EFalse;
+ if(aObject.Find(_L8("True"))>=0 || aObject.Find(_L8("true"))>=0)
+ {
+ object = ETrue;
+ }
+ if(iBuffer->At(aIndex).iPop3Settings!= NULL)
+ {
+ iBuffer->At(aIndex).iPop3Settings->SetApop(object);
+ }
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailFolderPath)==0)
+ {
+ if(iBuffer->At(aIndex).iImap4Settings!= NULL)
+ {
+ iBuffer->At(aIndex).iImap4Settings->SetFolderPathL(aObject);
+ }
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailToNapID)==0)
+ {
+ CNSmlDMIAPMatcher* iapmatch = CNSmlDMIAPMatcher::NewL( &Callback() );
+ CleanupStack::PushL(iapmatch);
+
+ TInt iap = iapmatch->IAPIdFromURIL( aObject );
+
+ if ( iap != KErrNotFound )
+ {
+ TImIAPChoice localIAP;
+ localIAP.iIAP = iap;
+ DBG_ARGS(_S("IAP = %d"), localIAP.iIAP);
+ localIAP.iDialogPref = ECommDbDialogPrefDoNotPrompt;
+
+ if ( iBuffer->At(aIndex).iSmtpIapPref->NumberOfIAPs() )
+ {
+ iBuffer->At(aIndex).iIapPref->RemoveIAPL(0);
+ }
+ iBuffer->At(aIndex).iIapPref->AddIAPL(localIAP,0);
+ if (iBuffer->At(aIndex).iSmtpSettings!= NULL)
+ {
+ if ( iBuffer->At(aIndex).iSmtpIapPref->NumberOfIAPs() )
+ {
+ iBuffer->At(aIndex).iSmtpIapPref->RemoveIAPL(0);
+ }
+ iBuffer->At(aIndex).iSmtpIapPref->AddIAPL(localIAP,0);
+ }
+ }
+ else
+ {
+ iBuffer->At(aIndex).iNodeBuf->At(aCommand).iStatus = CSmlDmAdapter::ENotFound;
+ }
+
+ CleanupStack::PopAndDestroy(); // iapmatch
+ }
+
+ else if(aLastUriSeg.Compare(KNSmlDMEmailSToNapID)==0)
+ {
+ CNSmlDMIAPMatcher* iapmatch = CNSmlDMIAPMatcher::NewL( &Callback() );
+ CleanupStack::PushL(iapmatch);
+
+ TInt iap = iapmatch->IAPIdFromURIL( aObject );
+
+ if ( iap != KErrNotFound )
+ {
+ TImIAPChoice localIAP;
+ localIAP.iIAP = iap;
+ DBG_ARGS(_S("SMTP IAP = %d"), localIAP.iIAP);
+ localIAP.iDialogPref = ECommDbDialogPrefDoNotPrompt;
+ if ( iBuffer->At(aIndex).iSmtpSettings!= NULL )
+ {
+ if ( iBuffer->At(aIndex).iSmtpIapPref->NumberOfIAPs() )
+ {
+ iBuffer->At(aIndex).iSmtpIapPref->RemoveIAPL(0);
+ }
+ iBuffer->At(aIndex).iSmtpIapPref->AddIAPL(localIAP,0);
+ }
+ else
+ {
+ iBuffer->At(aIndex).iNodeBuf->At(aCommand).iStatus =
+ CSmlDmAdapter::ENotFound;
+ }
+ }
+ else
+ {
+ iBuffer->At(aIndex).iNodeBuf->At(aCommand).iStatus =
+ CSmlDmAdapter::ENotFound;
+ }
+
+ CleanupStack::PopAndDestroy(); // iapmatch
+ }
+ _DBG_FILE("CNSmlDmEmailAdapter::DoAddLeafObjectL() :: end");
+ return KErrNone;
+ }
+
+
+// -----------------------------------------------------------------------------
+// void CNSmlDmEmailAdapter::SetDefaultSettingsL(TInt aIndex)
+// Set defaults for used protocol
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::SetDefaultSettingsL(TInt aIndex)
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::SetDefaultSettingsL() :: begin");
+ TNSmlEmailSettingsElement& thisElem = iBuffer->At(aIndex);
+ CEmailAccounts* emailAccs = CEmailAccounts::NewLC();
+ if( thisElem.iPop3Settings )
+ {
+
+ emailAccs->PopulateDefaultPopSettingsL(*thisElem.iPop3Settings,
+ *thisElem.iIapPref
+ );
+ emailAccs->PopulateDefaultSmtpSettingsL(*thisElem.iSmtpSettings,
+ *thisElem.iSmtpIapPref
+ );
+
+ thisElem.iPop3Settings->SetDeleteEmailsWhenDisconnecting( EFalse );
+ thisElem.iPop3Settings->SetInboxSynchronisationLimit( KNSmlDMEmailDefaultHeaderCount );
+ thisElem.iPop3Settings->SetSecureSockets( EFalse );
+ thisElem.iPop3Settings->SetAutoSendOnConnect( ETrue );
+ thisElem.iPop3Settings->SetDisconnectedUserMode( ETrue );
+ thisElem.iPop3Settings->SetAcknowledgeReceipts( EFalse );
+ }
+ else if( thisElem.iImap4Settings )
+ {
+
+ emailAccs->PopulateDefaultImapSettingsL(*thisElem.iImap4Settings,
+ *thisElem.iIapPref
+ );
+
+ emailAccs->PopulateDefaultSmtpSettingsL(*thisElem.iSmtpSettings,
+ *thisElem.iSmtpIapPref
+ );
+
+ thisElem.iImap4Settings->SetDeleteEmailsWhenDisconnecting( EFalse );
+ thisElem.iImap4Settings->SetInboxSynchronisationLimit( KNSmlDMEmailDefaultHeaderCount );
+ thisElem.iImap4Settings->SetMailboxSynchronisationLimit( KNSmlDMEmailDefaultHeaderCount );
+ thisElem.iImap4Settings->SetSecureSockets( EFalse );
+ thisElem.iImap4Settings->SetAutoSendOnConnect( ETrue );
+ thisElem.iImap4Settings->SetDisconnectedUserMode( ETrue );
+ thisElem.iImap4Settings->SetImapIdle( ETrue );
+ thisElem.iImap4Settings->SetUpdatingSeenFlags( ETrue );
+ }
+ thisElem.iSmtpSettings->SetLoginNameL(KNullDesC8);
+ thisElem.iSmtpSettings->SetPasswordL(KNullDesC8);
+ // Set IAP id to 0 and ask from user if ToNapID/SToNapID not sent
+ TImIAPChoice tmpIap;
+ tmpIap.iIAP = KNSmlDmEmailAlwaysAskIap;
+ tmpIap.iDialogPref = ECommDbDialogPrefPrompt;
+ thisElem.iIapPref->AddIAPL( tmpIap, 0 );
+ thisElem.iSmtpIapPref->AddIAPL( tmpIap, 0 );
+ CleanupStack::PopAndDestroy(); //emailAccs
+ _DBG_FILE("CNSmlDmEmailAdapter::SetDefaultSettingsL() :: end");
+ }
+
+// -----------------------------------------------------------------------------
+// HBufC* CNSmlDmEmailAdapter::IntToDesLC(const TInt aLuid) const
+// Converts integer to 16bit descriptor
+// -----------------------------------------------------------------------------
+HBufC* CNSmlDmEmailAdapter::IntToDesLC(const TInt aLuid) const
+ {
+ HBufC* buf = HBufC::NewLC(10); //10 = max length of 32bit integer
+ TPtr ptrBuf = buf->Des();
+ ptrBuf.Num(aLuid);
+ return buf;
+ }
+
+// -----------------------------------------------------------------------------
+// HBufC8* CNSmlDmEmailAdapter::IntToDes8LC(const TInt aLuid) const
+// Converts integer to 8bit descriptor
+// -----------------------------------------------------------------------------
+HBufC8* CNSmlDmEmailAdapter::IntToDes8LC(const TInt aLuid) const
+ {
+ HBufC8* buf = HBufC8::NewLC(10); //10 = max length of 32bit integer
+ TPtr8 ptrBuf = buf->Des();
+ ptrBuf.Num(aLuid);
+ return buf;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::ConvertTo8LC()
+// Converts string value to 8-bit
+//
+// -----------------------------------------------------------------------------
+HBufC8* CNSmlDmEmailAdapter::ConvertTo8LC( const TDesC& aSource ) const
+ {
+ HBufC8* buf = HBufC8::NewLC( aSource.Length()*2);
+ TPtr8 bufPtr = buf->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( bufPtr, aSource );
+
+ return buf;
+ }
+
+// -----------------------------------------------------------------------------
+// TInt CNSmlDmEmailAdapter::ValidateAndStoreSettingsL(TInt aIndex
+// Transfers the email settings from memory to phones permanent data store
+// -----------------------------------------------------------------------------
+TInt CNSmlDmEmailAdapter::ValidateAndStoreSettingsL(TInt aIndex)
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::ValidateAndStoreSettingsL() : begin");
+ TInt luid = 0;
+
+ TNSmlEmailSettingsElement& thisElem = iBuffer->At(aIndex);
+
+ if( iBuffer->At( aIndex ).iJustFetch )
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::ValidateAndStoreSettingsL() : end");
+ return luid;
+ }
+ CEmailAccounts* emailAccs = CEmailAccounts::NewLC();
+ if( iBuffer->At( aIndex ).iLuid != 0 )
+ {
+ switch ( thisElem.iAccType )
+ {
+ case EPop:
+ {
+ TPopAccount accId;
+ emailAccs->GetPopAccountL( thisElem.iServiceId, accId );
+ //Copy name field
+ accId.iPopAccountName.Copy(thisElem.iName->Des());
+ emailAccs->SavePopSettingsL( accId, *thisElem.iPop3Settings );
+ emailAccs->SavePopIapSettingsL( accId, *thisElem.iIapPref );
+ TSmtpAccount smtpAcc;
+ emailAccs->GetSmtpAccountL( accId.iSmtpService, smtpAcc );
+ //Copy name field
+ smtpAcc.iSmtpAccountName.Copy(thisElem.iName->Des());
+ emailAccs->SaveSmtpSettingsL( smtpAcc, *thisElem.iSmtpSettings );
+ emailAccs->SaveSmtpIapSettingsL( smtpAcc, *thisElem.iSmtpIapPref );
+ break;
+ }
+ case EImap:
+ {
+ TImapAccount accId2;
+ emailAccs->GetImapAccountL( thisElem.iServiceId, accId2 );
+ //Copy name field
+ accId2.iImapAccountName.Copy(thisElem.iName->Des());
+ emailAccs->SaveImapSettingsL( accId2, *thisElem.iImap4Settings );
+ emailAccs->SaveImapIapSettingsL( accId2, *thisElem.iIapPref );
+ TSmtpAccount smtpAccForImap;
+ emailAccs->GetSmtpAccountL( accId2.iSmtpService, smtpAccForImap );
+ //Copy name field
+ smtpAccForImap.iSmtpAccountName.Copy(thisElem.iName->Des());
+ emailAccs->SaveSmtpSettingsL( smtpAccForImap, *thisElem.iSmtpSettings );
+ emailAccs->SaveSmtpIapSettingsL( smtpAccForImap, *thisElem.iSmtpIapPref );
+ break;
+ }
+ default:
+
+ break;
+ }
+ }
+ else // if(iBuffer->At(aIndex).iLuid != 0)
+ {
+ RTelServer telServer;
+ User::LeaveIfError( telServer.Connect() );
+ CleanupClosePushL(telServer);
+
+ TInt numPhones = 0;
+ User::LeaveIfError( telServer.EnumeratePhones( numPhones ) );
+ if ( numPhones < 1 )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ RTelServer::TPhoneInfo info;
+ User::LeaveIfError( telServer.GetPhoneInfo( 0, info ) );
+ RMobilePhone mobilePhone;
+ User::LeaveIfError( mobilePhone.Open( telServer, info.iName ) );
+ CleanupClosePushL( mobilePhone );
+ TRequestStatus status;
+ RMobilePhone::TMobilePhoneIdentityV1 mobilePhoneIdentity;
+ mobilePhone.GetPhoneId( status, mobilePhoneIdentity );
+ User::WaitForRequest( status );
+ User::LeaveIfError( status.Int() );
+ TBuf<50> imei;
+ imei.Copy( mobilePhoneIdentity.iSerialNumber );
+
+ CleanupStack::PopAndDestroy(&mobilePhone);
+ CleanupStack::PopAndDestroy(&telServer);
+ if ( thisElem.iPop3Settings )
+ {
+ TPopAccount accId;
+ accId = emailAccs->CreatePopAccountL( *thisElem.iName,
+ *thisElem.iPop3Settings,
+ *thisElem.iIapPref,
+ EFalse );
+
+ TSmtpAccount smtpAcc = emailAccs->CreateSmtpAccountL( accId,
+ *thisElem.iSmtpSettings,
+ *thisElem.iSmtpIapPref,
+ EFalse );
+ TMsvEntry smtpEntry;
+ TMsvEntry popEntry;
+ CMsvEntry* entry = iMsvSession->GetEntryL(smtpAcc.iSmtpService);
+ CleanupStack::PushL(entry);
+ smtpEntry = entry->Entry();
+ smtpEntry.iMtmData2 = smtpAcc.iSmtpAccountId;
+ smtpEntry.iDescription.Set( imei );
+ entry->ChangeL(smtpEntry);
+ CleanupStack::PopAndDestroy(entry);
+
+ entry = iMsvSession->GetEntryL(smtpAcc.iRelatedService);
+ CleanupStack::PushL(entry);
+ popEntry = entry->Entry();
+ popEntry.iMtmData2 = accId.iPopAccountId;
+ popEntry.iDescription.Set( imei );
+ entry->ChangeL(popEntry);
+ CleanupStack::PopAndDestroy(entry);
+
+ if ( accId.iSmtpService != smtpAcc.iSmtpService || smtpAcc.iRelatedService != accId.iPopService )
+ {
+ DBG_ARGS8(_S8("ERROR!!! PopAccount creation: iSmtpService=%d, smtpAcc.iSmtpService=%d, iRelatedService=%d, iPopService=%d"),
+ accId.iSmtpService, smtpAcc.iSmtpService, smtpAcc.iRelatedService, accId.iPopService );
+ }
+
+ thisElem.iAccType = EPop;
+ thisElem.iAccId = accId.iPopAccountId;
+ SetLuidById( thisElem.iAccType, thisElem.iAccId, thisElem.iLuid );
+
+ RArray<TPopAccount> popAccs;
+ CleanupClosePushL( popAccs );
+ emailAccs->GetPopAccountsL( popAccs );
+
+ RArray<TImapAccount> imapAccs;
+ CleanupClosePushL( imapAccs );
+ emailAccs->GetImapAccountsL( imapAccs );
+
+ if ( popAccs.Count() == 1 && !imapAccs.Count())
+ {
+ emailAccs->SetDefaultSmtpAccountL( smtpAcc );
+ }
+
+ CleanupStack::PopAndDestroy( &imapAccs );
+ CleanupStack::PopAndDestroy( &popAccs );
+ // Check and set the default account
+ TSmtpAccount defSmtp;
+ TInt retVal = emailAccs->DefaultSmtpAccountL( defSmtp );
+ if ( retVal != KErrNone )
+ {
+ RArray<TPopAccount> popAccounts;
+ CleanupClosePushL( popAccounts );
+ emailAccs->GetPopAccountsL( popAccounts );
+ if ( popAccounts.Count() > 0 )
+ {
+ TSmtpAccount relatedSmtp;
+ emailAccs->GetSmtpAccountL( popAccounts[0].iSmtpService, relatedSmtp );
+ emailAccs->SetDefaultSmtpAccountL( relatedSmtp );
+ }
+ CleanupStack::PopAndDestroy( &popAccounts );
+ }
+ }
+ else if ( thisElem.iImap4Settings )
+ {
+ TImapAccount accId2;
+ accId2 = emailAccs->CreateImapAccountL(*thisElem.iName,
+ *thisElem.iImap4Settings,
+ *thisElem.iIapPref,
+ EFalse);
+
+ TSmtpAccount smtpAcc = emailAccs->CreateSmtpAccountL( accId2,
+ *thisElem.iSmtpSettings,
+ *thisElem.iSmtpIapPref,
+ EFalse );
+
+ TMsvEntry smtpEntry;
+ TMsvEntry imapEntry;
+ CMsvEntry* entry = iMsvSession->GetEntryL(smtpAcc.iSmtpService);
+ CleanupStack::PushL(entry);
+ smtpEntry = entry->Entry();
+ smtpEntry.iMtmData2 = smtpAcc.iSmtpAccountId;
+ smtpEntry.iDescription.Set( imei );
+ entry->ChangeL(smtpEntry);
+ CleanupStack::PopAndDestroy(entry);
+
+ entry = iMsvSession->GetEntryL(smtpAcc.iRelatedService);
+ CleanupStack::PushL(entry);
+ imapEntry = entry->Entry();
+ imapEntry.iMtmData2 = accId2.iImapAccountId;
+ imapEntry.iDescription.Set( imei );
+ entry->ChangeL(imapEntry);
+ CleanupStack::PopAndDestroy(entry);
+
+ if ( accId2.iSmtpService != smtpAcc.iSmtpService || smtpAcc.iRelatedService != accId2.iImapService )
+ {
+ DBG_ARGS8(_S8("ERROR!!! ImapAccount creation: iSmtpService=%d, smtpAcc.iSmtpService=%d, iRelatedService=%d, iImapService=%d"),
+ accId2.iSmtpService, smtpAcc.iSmtpService, smtpAcc.iRelatedService, accId2.iImapService );
+ }
+
+
+ thisElem.iAccType = EImap;
+ thisElem.iAccId = accId2.iImapAccountId;
+ SetLuidById( thisElem.iAccType, thisElem.iAccId, thisElem.iLuid );
+
+ // Check and set the default account
+ RArray<TPopAccount> popAccs;
+ CleanupClosePushL( popAccs );
+ emailAccs->GetPopAccountsL( popAccs );
+
+ RArray<TImapAccount> imapAccs;
+ CleanupClosePushL( imapAccs );
+ emailAccs->GetImapAccountsL( imapAccs );
+
+ if ( imapAccs.Count() == 1 && !popAccs.Count())
+ {
+ emailAccs->SetDefaultSmtpAccountL( smtpAcc );
+ }
+
+ CleanupStack::PopAndDestroy( &imapAccs );
+ CleanupStack::PopAndDestroy( &popAccs );
+ TSmtpAccount defaultSmtp;
+ TInt retVal = emailAccs->DefaultSmtpAccountL( defaultSmtp );
+ if ( retVal != KErrNone )
+ {
+ RArray<TImapAccount> imapAccs;
+ CleanupClosePushL( imapAccs );
+ emailAccs->GetImapAccountsL( imapAccs );
+ if ( imapAccs.Count() > 0 )
+ {
+ TSmtpAccount relatedSmtp;
+ emailAccs->GetSmtpAccountL( imapAccs[0].iSmtpService, relatedSmtp );
+ emailAccs->SetDefaultSmtpAccountL( relatedSmtp );
+ }
+ CleanupStack::PopAndDestroy( &imapAccs );
+ }
+ }
+
+ }
+ luid = thisElem.iLuid;
+ CleanupStack::PopAndDestroy(); //emailAccs
+ _DBG_FILE("CNSmlDmEmailAdapter::ValidateAndStoreSettingsL() : end");
+ return luid;
+ }
+// -----------------------------------------------------------------------------
+// void CNSmlDmEmailAdapter::GetIdByLuid( TNSmlEmailAccountType& aAccType,
+// TInt& aAccId,
+// const TInt aLuid ) const
+// Calculates the account type and id on basis of luid
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::GetIdByLuid( TNSmlEmailAccountType& aAccType,
+ TInt& aAccId,
+ const TInt aLuid ) const
+ {
+ if ( ( aLuid > KNSmlDmEmailImapLuidLow ) &&
+ ( aLuid < KNSmlDmEmailImapLuidHigh ) )
+ {
+ aAccType = EImap;
+ aAccId = aLuid - KNSmlDmEmailImapLuidLow;
+ }
+ else if (( aLuid > KNSmlDmEmailImapLuidHigh ) &&
+ ( aLuid < KNSmlDmEmailPopLuidHigh ))
+ {
+ aAccType = EPop;
+ aAccId = aLuid - KNSmlDmEmailImapLuidHigh;
+ }
+ else
+ {
+ aAccType = EUnknown;
+ }
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// void CNSmlDmEmailAdapter::SetLuidById( const TNSmlEmailAccountType& aAccType,
+// const TInt& aAccId, TInt& aLuid ) const
+// Sets the luid on basis of account type and id
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::SetLuidById( const TNSmlEmailAccountType& aAccType,
+ const TInt& aAccId, TInt& aLuid ) const
+ {
+ switch (aAccType)
+ {
+ case EImap :
+ aLuid = KNSmlDmEmailImapLuidLow + aAccId;
+ break;
+
+ case EPop :
+ aLuid = KNSmlDmEmailImapLuidHigh + aAccId;
+ break;
+
+ default :
+ aLuid = -1;
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// TBool CNSmlDmEmailAdapter::AccountExistsL( const CEmailAccounts* aAccs,
+// const TNSmlEmailAccountType aAccType,
+// const TInt aId,
+// TInt aIndex )
+// Checks if the accout matching the given parameters is found.
+// returns True if found.
+// -----------------------------------------------------------------------------
+TBool CNSmlDmEmailAdapter::AccountExistsL( CEmailAccounts* aAccs,
+ const TNSmlEmailAccountType aAccType,
+ const TInt aId,
+ TInt aIndex )
+ {
+ RArray<TImapAccount> imap4Accs;
+ CleanupClosePushL( imap4Accs );
+ RArray<TPopAccount> pop3Accs;
+ CleanupClosePushL( pop3Accs );
+ switch ( aAccType )
+ {
+ case EImap:
+ aAccs->GetImapAccountsL(imap4Accs);
+ for(TInt i=0;i<imap4Accs.Count();i++)
+ {
+ if ( imap4Accs[i].iImapAccountId == aId )
+ {
+
+ if ( aIndex >= 0 )
+ {
+ iBuffer->At(aIndex).iServiceId = imap4Accs[i].iImapService;
+ delete iBuffer->At(aIndex).iName;
+ iBuffer->At(aIndex).iName = NULL;
+ iBuffer->At(aIndex).iName = HBufC::NewL(imap4Accs[i].iImapAccountName.Size());
+ *iBuffer->At(aIndex).iName = imap4Accs[i].iImapAccountName;
+ }
+ CleanupStack::PopAndDestroy(2); //imap4Accs, pop3Accs
+ return ETrue;
+ }
+ }
+ break;
+
+ case EPop:
+ aAccs->GetPopAccountsL(pop3Accs);
+ for(TInt i=0;i<pop3Accs.Count();i++)
+ {
+ if ( pop3Accs[i].iPopAccountId == aId )
+ {
+ if ( aIndex >= 0 )
+ {
+ iBuffer->At(aIndex).iServiceId = pop3Accs[i].iPopService;
+ delete iBuffer->At(aIndex).iName;
+ iBuffer->At(aIndex).iName = NULL;
+ iBuffer->At(aIndex).iName = HBufC::NewL(pop3Accs[i].iPopAccountName.Size());
+ *iBuffer->At(aIndex).iName = pop3Accs[i].iPopAccountName;
+ }
+ CleanupStack::PopAndDestroy(2); //imap4Accs, pop3Accs
+ return ETrue;
+ }
+ }
+ break;
+ default:
+ // Returns EFalse in this case.
+ break;
+ }
+ CleanupStack::PopAndDestroy(2); //imap4Accs, pop3Accs
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// TInt CNSmlDmEmailAdapter::DoRestoreSettingsL(TInt aIndex)
+// Restores the settings to the adapter from settings store
+// -----------------------------------------------------------------------------
+TInt CNSmlDmEmailAdapter::DoRestoreSettingsL(TInt aIndex)
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::DoRestoreSettingsL() : begin");
+ TNSmlEmailSettingsElement& thisElem = iBuffer->At(aIndex);
+
+ CEmailAccounts* emailAccs = CEmailAccounts::NewLC();
+ TInt err = KErrNone;
+
+ // These are destroyed latest at destructor
+ thisElem.iSmtpSettings = new (ELeave) CImSmtpSettings;
+ thisElem.iIapPref = CImIAPPreferences::NewLC();
+ thisElem.iSmtpIapPref = CImIAPPreferences::NewLC();
+
+ switch( thisElem.iAccType )
+ {
+ case EImap:
+ if (AccountExistsL(emailAccs, thisElem.iAccType, thisElem.iAccId, aIndex ))
+ {
+ TImapAccount imapAccId;
+
+ thisElem.iImap4Settings = new(ELeave) CImImap4Settings;
+
+ //Get IMAP account by iAccId id
+ emailAccs->GetImapAccountL(thisElem.iServiceId, imapAccId);
+ //Get IMAP settings by account id
+ emailAccs->LoadImapSettingsL( imapAccId, *thisElem.iImap4Settings );
+ //Get IMAP settings IAP prefs
+ emailAccs->LoadImapIapSettingsL( imapAccId, *thisElem.iIapPref );
+
+ TSmtpAccount smtpAccount;
+ //Get smtp account by related IMAP id
+ emailAccs->GetSmtpAccountL( imapAccId.iSmtpService, smtpAccount );
+ //Get smtp settings by IMAP id
+ emailAccs->LoadSmtpSettingsL( smtpAccount, *thisElem.iSmtpSettings );
+ //Get Smtp settings IAP prefs
+ emailAccs->LoadSmtpIapSettingsL( smtpAccount, *thisElem.iSmtpIapPref );
+ }
+ else
+ {
+ err = KErrNotFound;
+ }
+ break;
+
+ case EPop:
+ if (AccountExistsL(emailAccs, thisElem.iAccType, thisElem.iAccId, aIndex ))
+ {
+ TPopAccount popAccId;
+
+ thisElem.iPop3Settings = new(ELeave) CImPop3Settings;
+
+ //Get POP3 account by iAccId id
+ emailAccs->GetPopAccountL( thisElem.iServiceId, popAccId );
+ //Get POP3 settings by account id
+ emailAccs->LoadPopSettingsL( popAccId, *thisElem.iPop3Settings );
+ //Get POP3 setting IAP prefs
+ emailAccs->LoadPopIapSettingsL( popAccId, *thisElem.iIapPref );
+
+ TSmtpAccount smtpAccount;
+ //Get smtp account by related POP id
+ emailAccs->GetSmtpAccountL( popAccId.iSmtpService, smtpAccount );
+ //Get smtp settings
+ emailAccs->LoadSmtpSettingsL( smtpAccount, *thisElem.iSmtpSettings );
+ //Get Smtp setting IAP prefs
+ emailAccs->LoadSmtpIapSettingsL( smtpAccount, *thisElem.iSmtpIapPref );
+ }
+ else
+ {
+ err = KErrNotFound;
+ }
+ break;
+
+ default:
+ err = KErrNotFound;
+ break;
+ }
+
+ if ( err )
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::DoRestoreSettingsL() : \
+ KErrNotFound end");
+ CleanupStack::PopAndDestroy(2); // iIapPref, iSmtpIapPref
+ CleanupStack::PopAndDestroy(emailAccs); //emailAccs
+ return KErrNotFound;
+ }
+
+ CleanupStack::Pop(2); // iIapPref, iSmtpIapPref
+ CleanupStack::PopAndDestroy(emailAccs); //emailAccs
+ _DBG_FILE("CNSmlDmEmailAdapter::DoRestoreSettingsL() : end");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::OpenSessionL()
+// Opens the CMsvSession if it is not open already
+// -----------------------------------------------------------------------------
+TInt CNSmlDmEmailAdapter::OpenSessionL()
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::OpenSessionL() : begin");
+ if(!iMsvSession)
+ {
+ TRAPD(err, iMsvSession = CMsvSession::OpenSyncL(*this));
+ _DBG_FILE("CNSmlDmEmailAdapter::OpenSessionL() : end");
+ return err;
+ }
+
+ _DBG_FILE("CNSmlDmEmailAdapter::OpenSessionL() : end");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmEmailAdapter::FillNodeInfoL()
+// Fills the node info in ddf structure
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::FillNodeInfoL( MSmlDmDDFObject& aNode,
+ const TSmlDmAccessTypes& aAccTypes,
+ MSmlDmDDFObject::TOccurence aOccurrence,
+ MSmlDmDDFObject::TScope aScope,
+ MSmlDmDDFObject::TDFFormat aFormat,
+ const TDesC8& aDescription) const
+ {
+ aNode.SetAccessTypesL(aAccTypes);
+ aNode.SetOccurenceL(aOccurrence);
+ aNode.SetScopeL(aScope);
+ aNode.SetDFFormatL(aFormat);
+ if(aFormat!=MSmlDmDDFObject::ENode)
+ {
+ aNode.AddDFTypeMimeTypeL(KNSmlDMEmailTextPlain);
+ }
+ aNode.SetDescriptionL(aDescription);
+
+ }
+
+// -----------------------------------------------------------------------------
+// TPtrC8 CNSmlDmEmailAdapter::RemoveDotSlash(const TDesC8& aURI)
+// return uri without dot and slash in start
+// -----------------------------------------------------------------------------
+TPtrC8 CNSmlDmEmailAdapter::RemoveDotSlash(const TDesC8& aURI) const
+ {
+ if(aURI.Find(KNSmlEmailUriDotSlash)==0)
+ {
+ return aURI.Right(aURI.Length()-KNSmlEmailUriDotSlash().Length());
+ }
+ else
+ {
+ return aURI;
+ }
+ }
+// -----------------------------------------------------------------------------
+// CSmlDmAdapter::TError CNSmlDmEmailAdapter::FetchObjectL(const TDesC8& aURI,
+// const TDesC8& aLUID, CBufBase& aObject)
+// Fetches object acording to URI & LUID. Retur codes acording to
+// CSmlDmAdapter::TError.
+// -----------------------------------------------------------------------------
+CSmlDmAdapter::TError CNSmlDmEmailAdapter::FetchObjectL(const TDesC8& aURI,
+ const TDesC8& aLUID,
+ CBufBase& aObject)
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchObjectL() : begin");
+ CSmlDmAdapter::TError status = EOk;
+ if(aLUID.Length()==0)
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchObjectL() : ENotFound end");
+ return CSmlDmAdapter::ENotFound;
+ }
+ if( OpenSessionL() != KErrNone )
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchObjectL() : EError end");
+ return CSmlDmAdapter::EError;
+ }
+ TInt luid = DesToInt(aLUID);
+ TInt index = -1;
+ for(TInt i=0;i<iBuffer->Count();i++)
+ {
+ if(iBuffer->At(i).iLuid == luid)
+ {
+ index = i;
+ break;
+ }
+ }
+
+ if(index<0)
+ {
+ TNSmlEmailSettingsElement newNode;
+ newNode.iImap4Settings = NULL;
+ newNode.iPop3Settings = NULL;
+ newNode.iSmtpSettings = NULL;
+ newNode.iIapPref = NULL;
+ newNode.iLuid = luid;
+ newNode.iMappingName = aURI.AllocLC();
+ newNode.iName = HBufC::NewLC(0);
+ newNode.iNodeBuf = new (ELeave)
+ CArrayFixFlat <TNSmlEmailCommandElement> (KNSmlDmEmailGranularity);
+ newNode.iExecuted = ETrue;
+ newNode.iJustFetch = ETrue;
+ GetIdByLuid(newNode.iAccType, newNode.iAccId, luid);
+ iBuffer->AppendL(newNode);
+ index = iBuffer->Count() - 1;
+ if(DoRestoreSettingsL(index)!=KErrNone)
+ {
+ CleanupStack::Pop(2); //newNode.iMappingName,newNode.iName
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchObjectL() : EError end");
+ return CSmlDmAdapter::EError;
+ }
+ CleanupStack::Pop(2); //newNode.iMappingName,newNode.iName
+ }
+
+ TPtrC8 lastUriSeg = LastURISeg(aURI);
+
+ if(lastUriSeg.Compare(KNSmlDMEmailName)==0)
+ {
+ HBufC8 *data = HBufC8::NewLC(iBuffer->At(index).iName->Length());
+ TPtr8 dataPtr = data->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr, iBuffer->At(index).iName->Des() );
+ aObject.InsertL(0,dataPtr);
+ CleanupStack::PopAndDestroy(); //data
+ }
+ else if(lastUriSeg.Compare(KNSmlDMEmailUID)==0)
+ {
+ HBufC *data = NULL;
+ if(iBuffer->At(index).iPop3Settings!= NULL)
+ {
+ data = HBufC::NewLC(iBuffer->At(index).iPop3Settings->LoginName().Length());
+ data->Des().Copy(iBuffer->At(index).iPop3Settings->LoginName());
+ }
+ else if(iBuffer->At(index).iImap4Settings!= NULL)
+ {
+ data = HBufC::NewLC(iBuffer->At(index).iImap4Settings->LoginName().Length());
+ data->Des().Copy(iBuffer->At(index).iImap4Settings->LoginName());
+ }
+ if(data)
+ {
+ HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data);
+ CleanupStack::PushL(data8);
+ aObject.InsertL(0,*data8);
+ CleanupStack::PopAndDestroy(2);//data, data8
+ }
+ }
+ else if(lastUriSeg.Compare(KNSmlDMEmailPW)==0)
+ {
+ HBufC *data = NULL;
+ if(iBuffer->At(index).iPop3Settings!= NULL)
+ {
+ data = HBufC::NewLC(iBuffer->At(index).iPop3Settings->Password().Length());
+ data->Des().Copy(iBuffer->At(index).iPop3Settings->Password());
+ }
+ else if(iBuffer->At(index).iImap4Settings!= NULL)
+ {
+ data = HBufC::NewLC(iBuffer->At(index).iImap4Settings->Password().Length());
+ data->Des().Copy(iBuffer->At(index).iImap4Settings->Password());
+ }
+ if(data)
+ {
+ HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data);
+ CleanupStack::PushL(data8);
+ aObject.InsertL(0,*data8);
+ CleanupStack::PopAndDestroy(2);//data, data8
+ }
+ }
+ else if(lastUriSeg.Compare(KNSmlDMEmailUAddr)==0)
+ {
+ HBufC *data = NULL;
+ data = iBuffer->At(index).iSmtpSettings->EmailAddress().AllocLC();
+ HBufC8 *data8 = HBufC8::NewLC(data->Size());
+ TPtr8 dataPtr8 = data8->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() );
+
+ aObject.InsertL(0,dataPtr8);
+ CleanupStack::PopAndDestroy(2); //data, data8
+ }
+ else if(lastUriSeg.Compare(KNSmlDMEmailUName)==0)
+ {
+
+ HBufC *data = NULL;
+ data = iBuffer->At(index).iSmtpSettings->EmailAlias().AllocLC();
+ HBufC8 *data8 = HBufC8::NewLC(data->Size());
+ TPtr8 dataPtr8 = data8->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() );
+
+ aObject.InsertL(0,dataPtr8);
+ CleanupStack::PopAndDestroy(2); //data, data8
+ }
+
+ else if(lastUriSeg.Compare( KNSmlDMEmailMrcv)==0)
+ {
+ HBufC *data = NULL;
+ if(iBuffer->At(index).iPop3Settings!= NULL)
+ {
+ data = iBuffer->At(index).iPop3Settings->ServerAddress().AllocLC();
+ }
+ else if(iBuffer->At(index).iImap4Settings!= NULL)
+ {
+ data = iBuffer->At(index).iImap4Settings->ServerAddress().AllocLC();
+ }
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ return status;
+ }
+ HBufC8 *data8 = HBufC8::NewLC(data->Size());
+ TPtr8 dataPtr8 = data8->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() );
+
+ aObject.InsertL(0,dataPtr8);
+ CleanupStack::PopAndDestroy(2); //data, data8
+ }
+ else if(lastUriSeg.Compare(KNSmlDMEmailMsnd)==0)
+ {
+ HBufC *data = NULL;
+ data = iBuffer->At(index).iSmtpSettings->ServerAddress().AllocLC();
+ HBufC8 *data8 = HBufC8::NewLC(data->Size());
+ TPtr8 dataPtr8 = data8->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() );
+
+ aObject.InsertL(0,dataPtr8);
+ CleanupStack::PopAndDestroy(2); //data, data8
+ }
+ else if(lastUriSeg.Compare(KNSmlDMEmailMpro)==0)
+ {
+ if(iBuffer->At(index).iPop3Settings!= NULL)
+ {
+ aObject.InsertL(0,KNSmlDMEmailMproPOP);
+ }
+ else if(iBuffer->At(index).iImap4Settings!= NULL)
+ {
+ aObject.InsertL(0,KNSmlDMEmailMproIMAP);
+ }
+ }
+ else if(lastUriSeg.Compare(KNSmlDMEmailUseSecCon)==0)
+ {
+ FetchSecurityValueL(aObject, &iBuffer->At(index), EUseSecCon );
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailUseSauth)==0)
+ {
+ if(iBuffer->At(index).iSmtpSettings->SMTPAuth())
+ {
+ aObject.InsertL(0,KNSmlDMEmailTrue);
+ }
+ else
+ {
+ aObject.InsertL(0,KNSmlDMEmailFalse);
+ }
+ }
+ else if(lastUriSeg.Compare(KNSmlDMEmailSauthUID)==0)
+ {
+ HBufC *data = HBufC::NewLC(iBuffer->At(index).iSmtpSettings->LoginName().Length());
+ data->Des().Copy(iBuffer->At(index).iSmtpSettings->LoginName());
+ HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data);
+ CleanupStack::PushL(data8);
+ aObject.InsertL(0,*data8);
+ CleanupStack::PopAndDestroy(2);//data, data8
+ }
+ else if(lastUriSeg.Compare(KNSmlDMEmailSauthPW)==0)
+ {
+ HBufC *data = HBufC::NewLC(iBuffer->At(index).iSmtpSettings->Password().Length());
+ data->Des().Copy(iBuffer->At(index).iSmtpSettings->Password());
+ HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data);
+ CleanupStack::PushL(data8);
+ aObject.InsertL(0,*data8);
+ CleanupStack::PopAndDestroy(2);//data, data8
+ }
+ else if(lastUriSeg.Compare(KNSmlDMEmailPtxtSAuth)==0)
+ {
+ if(iBuffer->At(index).iSmtpSettings->InboxLoginDetails())
+ {
+ aObject.InsertL(0,KNSmlDMEmailTrue);
+ }
+ else
+ {
+ aObject.InsertL(0,KNSmlDMEmailFalse);
+ }
+ }
+
+ else if (lastUriSeg.Compare(KNSmlDMEmailSUseSecCon)==0)
+ {
+ FetchSecurityValueL(aObject, &iBuffer->At(index), ESuseSecCon );
+ }
+
+ else if (lastUriSeg.Compare(KNSmlDMEmailUseStartTLS)==0)
+ {
+ FetchSecurityValueL(aObject, &iBuffer->At(index), EUseStartTls );
+ }
+
+ else if (lastUriSeg.Compare(KNSmlDMEmailSUseStartTLS)==0)
+ {
+ FetchSecurityValueL(aObject, &iBuffer->At(index), ESuseStartTls );
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailMrcvPort)==0)
+ {
+ TUint port;
+ if(iBuffer->At(index).iPop3Settings!= NULL)
+ {
+ port = iBuffer->At(index).iPop3Settings->Port();
+ }
+ else
+ {
+ port = iBuffer->At(index).iImap4Settings->Port();
+ }
+ HBufC8 *data = IntToDes8LC(port);
+ aObject.InsertL(0,data->Des());
+ CleanupStack::PopAndDestroy(); //data
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailMsndPort)==0)
+ {
+ TUint port = iBuffer->At(index).iSmtpSettings->Port();
+ HBufC8 *data = IntToDes8LC(port);
+ aObject.InsertL(0,data->Des());
+ CleanupStack::PopAndDestroy(); //data
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailUseAPOP)==0)
+ {
+ if(iBuffer->At(index).iPop3Settings!= NULL)
+ {
+ if(iBuffer->At(index).iPop3Settings->Apop())
+ {
+ aObject.InsertL(0,KNSmlDMEmailTrue);
+ }
+ else
+ {
+ aObject.InsertL(0,KNSmlDMEmailFalse);
+ }
+ }
+ else if(iBuffer->At(index).iImap4Settings!= NULL)
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ }
+
+ else if (lastUriSeg.Compare(KNSmlDMEmailFolderPath)==0)
+ {
+ if( iBuffer->At(index).iImap4Settings )
+ {
+ aObject.InsertL(0, iBuffer->At(index).iImap4Settings->FolderPath() );
+ }
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ }
+
+ else if(lastUriSeg.Compare(KNSmlDMEmailToNapID)==0)
+ {
+ CNSmlDMIAPMatcher* iapmatch=CNSmlDMIAPMatcher::NewL( &Callback() );
+ CleanupStack::PushL(iapmatch);
+ HBufC8* uri8 = NULL;
+ TInt iapCount = iBuffer->At(index).iIapPref->NumberOfIAPs();
+ if ( iapCount )
+ {
+ TImIAPChoice localIAP = iBuffer->At(index).iIapPref->IAPPreference(0);
+ uri8 = iapmatch->URIFromIAPIdL( localIAP.iIAP );
+ }
+
+ if( uri8 )
+ {
+ CleanupStack::PushL(uri8);
+ aObject.InsertL(0,uri8->Des());
+ status = CSmlDmAdapter::EOk;
+ CleanupStack::PopAndDestroy(); // uri8
+ }
+
+ CleanupStack::PopAndDestroy(); // iapMatch
+ }
+ else if(lastUriSeg.Compare(KNSmlDMEmailSToNapID)==0)
+ {
+ // SToNapID exists only for SMTP
+ if (iBuffer->At(index).iSmtpSettings!= NULL)
+ {
+ CNSmlDMIAPMatcher* iapmatch=CNSmlDMIAPMatcher::NewL( &Callback() );
+ CleanupStack::PushL(iapmatch);
+ HBufC8* uri8 = NULL;
+ TInt iapCount = iBuffer->At(index).iIapPref->NumberOfIAPs();
+ if ( iapCount )
+ {
+ TImIAPChoice localIAP = iBuffer->At(index).iSmtpIapPref->IAPPreference(0);
+ uri8 = iapmatch->URIFromIAPIdL( localIAP.iIAP );
+ }
+
+ if( uri8 )
+ {
+ CleanupStack::PushL(uri8);
+ aObject.InsertL(0,uri8->Des());
+ status = CSmlDmAdapter::EOk;
+ CleanupStack::PopAndDestroy(); // uri8
+ }
+
+ CleanupStack::PopAndDestroy(); // iapMatch
+ }
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ }
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchObjectL() : end");
+ return status;
+ }
+
+// -----------------------------------------------------------------------------
+// void CNSmlDmEmailAdapter::SetDefaultSecurityL(const TDesC8& aObject,
+// const TNSmlEmailSettingsElement* thisElem,
+// const TNSmlEmailSecuritySetting aSetting )
+// Sets (on/off) the security modes: SSL/TLS, StartTLS
+// -----------------------------------------------------------------------------
+void CNSmlDmEmailAdapter::SetDefaultSecurityL(const TDesC8& aObject,
+ const TNSmlEmailSettingsElement* aThisElem,
+ const TNSmlEmailSecuritySetting aSetting
+ ) const
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::SetDefaultSecurityL(): begin");
+ HBufC8 *data = aObject.AllocLC();
+ TPtr8 dataPtr = data->Des();
+ dataPtr.Capitalize();
+ TBool object=EFalse;
+ if(dataPtr.Find(KNSmlDMEmailTrue)>=0)
+ {
+ object = ETrue;
+ }
+ switch ( aSetting )
+ {
+ case EUseSecCon :
+ if ( object )
+ {
+ if ( aThisElem->iImap4Settings )
+ {
+ aThisElem->iImap4Settings->SetSecureSockets(EFalse);
+ aThisElem->iImap4Settings->SetSSLWrapper(ETrue);
+ aThisElem->iImap4Settings->SetPort( KNSmlDMEmailSslWrappedImap4Port );
+ }
+ else if ( aThisElem->iPop3Settings )
+ {
+ aThisElem->iPop3Settings->SetSecureSockets(EFalse);
+ aThisElem->iPop3Settings->SetSSLWrapper(ETrue);
+ aThisElem->iPop3Settings->SetPort( KNSmlDMEmailSslWrappedPop3Port );
+ }
+ }
+ else
+ {
+ if ( aThisElem->iImap4Settings )
+ {
+ aThisElem->iImap4Settings->SetPort( KNSmlDMEmailNormalImap4Port );
+ aThisElem->iImap4Settings->SetSSLWrapper(EFalse);
+ }
+ else if ( aThisElem->iPop3Settings )
+ {
+ aThisElem->iPop3Settings->SetPort( KNSmlDMEmailNormalPop3Port );
+ aThisElem->iPop3Settings->SetSSLWrapper(EFalse);
+ }
+ }
+ break;
+ case EUseStartTls :
+ if ( object )
+ {
+ if ( aThisElem->iImap4Settings )
+ {
+ aThisElem->iImap4Settings->SetSecureSockets(ETrue);
+ aThisElem->iImap4Settings->SetSSLWrapper(EFalse);
+ aThisElem->iImap4Settings->SetPort( KNSmlDMEmailNormalImap4Port );
+ }
+ else if ( aThisElem->iPop3Settings )
+ {
+ aThisElem->iPop3Settings->SetSecureSockets(ETrue);
+ aThisElem->iPop3Settings->SetSSLWrapper(EFalse);
+ aThisElem->iPop3Settings->SetPort( KNSmlDMEmailNormalPop3Port );
+ }
+ }
+ else
+ {
+ if ( aThisElem->iImap4Settings )
+ {
+ aThisElem->iImap4Settings->SetSecureSockets(EFalse);
+ }
+ else if ( aThisElem->iPop3Settings )
+ {
+ aThisElem->iPop3Settings->SetSecureSockets(EFalse);
+ }
+ }
+ break;
+ case ESuseSecCon :
+ if ( object )
+ {
+ // The port is same in all cases
+ aThisElem->iSmtpSettings->SetSecureSockets(EFalse);
+ aThisElem->iSmtpSettings->SetSSLWrapper(ETrue);
+ aThisElem->iSmtpSettings->SetPort( KNSmlDMEmailSslSmtpPort );
+ }
+ else
+ {
+ aThisElem->iSmtpSettings->SetPort( KNSmlDMEmailNormalSmtpPort );
+ aThisElem->iSmtpSettings->SetSSLWrapper( EFalse );
+ }
+ break;
+ case ESuseStartTls :
+ if ( object )
+ {
+ // The port is same in all cases
+ aThisElem->iSmtpSettings->SetSecureSockets(ETrue);
+ aThisElem->iSmtpSettings->SetSSLWrapper(EFalse);
+ aThisElem->iSmtpSettings->SetPort( KNSmlDMEmailNormalSmtpPort );
+ }
+ else
+ {
+ aThisElem->iSmtpSettings->SetSecureSockets( EFalse );
+ }
+
+ break;
+ default :
+ break;
+ }
+ CleanupStack::PopAndDestroy(); // object
+ _DBG_FILE("CNSmlDmEmailAdapter::SetDefaultSecurityL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CSmlDmAdapter::TError CNSmlDmEmailAdapter::FetchSecurityValueL(
+// CBufBase& aObject,
+// const TNSmlEmailSettingsElement* aElem,
+// const TNSmlEmailSecuritySetting aSetting )
+// Gets the status(on/off) of security modes SSL/TLS or StartTLS
+// -----------------------------------------------------------------------------
+
+CSmlDmAdapter::TError CNSmlDmEmailAdapter::FetchSecurityValueL(
+ CBufBase& aObject,
+ const TNSmlEmailSettingsElement* aElem,
+ const TNSmlEmailSecuritySetting aSetting ) const
+ {
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchSecurityValueL(): start");
+ TBool result=EFalse;
+ CSmlDmAdapter::TError status = CSmlDmAdapter::EOk;
+ switch ( aSetting )
+ {
+
+ case EUseStartTls :
+ if ( aElem->iImap4Settings)
+ {
+ result = aElem->iImap4Settings->SecureSockets();
+ }
+ else if(aElem->iPop3Settings)
+ {
+ result = aElem->iPop3Settings->SecureSockets();
+ }
+ else
+ {
+ status = CSmlDmAdapter::EError;
+ }
+ break;
+ case EUseSecCon :
+ if ( aElem->iImap4Settings)
+ {
+ result = aElem->iImap4Settings->SSLWrapper();
+ }
+ else if(aElem->iPop3Settings)
+ {
+ result = aElem->iPop3Settings->SSLWrapper();
+ }
+ else
+ {
+ status = CSmlDmAdapter::EError;
+ }
+ break;
+ case ESuseStartTls :
+ if(aElem->iSmtpSettings)
+ {
+ result = aElem->iSmtpSettings->SecureSockets();
+ }
+ else
+ {
+ status = CSmlDmAdapter::EError;
+ }
+ break;
+ case ESuseSecCon :
+ if(aElem->iSmtpSettings)
+ {
+ result = aElem->iSmtpSettings->SSLWrapper();
+ }
+ else
+ {
+ status = CSmlDmAdapter::EError;
+ }
+ break;
+ default:
+ status = CSmlDmAdapter::EError;
+ break;
+ }
+
+ if ( result )
+ {
+ aObject.InsertL(0,KNSmlDMEmailTrue);
+ }
+ else
+ {
+ aObject.InsertL(0,KNSmlDMEmailFalse);
+ }
+ _DBG_FILE("CNSmlDmEmailAdapter::FetchSecurityValueL(): end");
+ return status;
+ }
+
+//--------------------------------------------------------------------
+//TInt CNSmlDmEmailAdapter::ConstructTreeL(const TDesC8& aURI)
+//
+//-------------------------------------------------------------------
+
+TInt CNSmlDmEmailAdapter::ConstructTreeL(const TDesC8& aURI)
+{
+ TInt ret = KErrNotFound;
+ CEmailAccounts* emailAccs = CEmailAccounts::NewLC();
+
+ if(aURI.Find(KNSmlDMEmailNodeName)!= KErrNotFound)
+ {
+ RArray<TImapAccount> imap4Accounts;
+ CleanupClosePushL( imap4Accounts );
+ emailAccs->GetImapAccountsL(imap4Accounts);
+
+ // First, IMAP accounts
+ //
+ TInt luid;
+ TPtrC8 name;
+ // cycle through every found account
+ for(TInt count = 0; count < imap4Accounts.Count(); count++)
+ {
+
+ SetLuidById( EImap, imap4Accounts[count].iImapAccountId, luid );
+ HBufC8 *uri = HBufC8::NewLC(KNSmlDMEmailNodeName().Length() +
+ KNSmlDMEmailMproIMAP().Length() + 6);
+
+ TPtr8 uriPtr = uri->Des();
+ uriPtr.Append(KNSmlDMEmailNodeName);
+ uriPtr.Append(KNSmlDMEmailSeparator8);
+ uriPtr.Append(KNSmlDMEmailMproIMAP);
+ uriPtr.AppendNumFixedWidth(count,EDecimal,3);
+ HBufC8 *luidBuf = IntToDes8LC(luid);
+ HBufC8* mapInfo = Callback().GetLuidAllocL(uriPtr);
+ if (mapInfo->Length() == 0)
+ {
+ Callback().SetMappingL(uriPtr, luidBuf->Des());
+ if( aURI.Find(uriPtr) >= 0 )
+ {
+ ret = luid;
+ }
+ }
+ else
+ {
+ delete mapInfo;
+ }
+
+ CleanupStack::PopAndDestroy(2); //uri,luidBuf
+ }
+ CleanupStack::PopAndDestroy(); //imap4Accounts
+
+ // Then, POP accounts
+ //
+ RArray<TPopAccount> pop3Accounts;
+ CleanupClosePushL( pop3Accounts );
+ emailAccs->GetPopAccountsL( pop3Accounts );
+ // cycle through every found account
+ for(TInt count = 0; count < pop3Accounts.Count(); count++)
+ {
+ SetLuidById( EPop, pop3Accounts[count].iPopAccountId, luid );
+
+ HBufC8 *uri = HBufC8::NewLC(KNSmlDMEmailNodeName().Length() +
+ KNSmlDMEmailMproPOP().Length() + 5);
+ TPtr8 uriPtr = uri->Des();
+ uriPtr.Append(KNSmlDMEmailNodeName);
+ uriPtr.Append(KNSmlDMEmailSeparator8);
+ uriPtr.Append(KNSmlDMEmailMproPOP);
+ uriPtr.AppendNumFixedWidth(count,EDecimal,3);
+ HBufC8 *luidBuf = IntToDes8LC(luid);
+ HBufC8* mapInfo = Callback().GetLuidAllocL(uriPtr);
+ if (mapInfo->Length() == 0)
+ {
+ Callback().SetMappingL(uriPtr,luidBuf->Des());
+ if( aURI.Find(uriPtr) >= 0 )
+ {
+ ret = luid;
+ }
+ }
+ else
+ {
+ delete mapInfo;
+ }
+
+ CleanupStack::PopAndDestroy(2); //uri,luidBuf
+ }
+ CleanupStack::PopAndDestroy(); //pop3Accounts
+ }
+ CleanupStack::PopAndDestroy(); //emailAccs
+ return ret;
+}
+
+//------------------------------------------------------------------------------
+// TPtrC8 CNSmlDmEmailAdapter::GetDynamicEmailNodeUri( const TDesC8& aURI )
+// returns Email/xxx URI
+//------------------------------------------------------------------------------
+TPtrC8 CNSmlDmEmailAdapter::GetDynamicEmailNodeUri( const TDesC8& aURI )
+ {
+ DBG_ARGS8(_S8("CNSmlDmEmailAdapter::GetDynamicEmailNodeUri() - <%S> "), &aURI);
+ TInt i= 0;
+ TBuf8<50> EmailAccRoot(KNSmlDMEmailNodeName);
+ for ( i = aURI.Find( KNSmlDMEmailNodeName ) + EmailAccRoot.Length() + 1;
+ i < aURI.Length(); i++ )
+ {
+ if( aURI[i] == '/' )
+ {
+ break;
+ }
+ }
+ _DBG_FILE("CNSmlDmEmailAdapter::GetDynamicEmailNodeUri(): end");
+ return aURI.Left( i );
+ }
+
+
+// End of File