diff -r 6a20128ce557 -r ebfee66fde93 email/pop3andsmtpmtm/smtpservermtm/src/SMTSUTIL.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/pop3andsmtpmtm/smtpservermtm/src/SMTSUTIL.CPP Fri Jun 04 10:25:39 2010 +0100 @@ -0,0 +1,125 @@ +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Internet SMTP Transport Driver - utility functions +// +// + +#include +//Oyster includes +#include +//IMSK includes +#include +//SMTS includes +#include"SMTS.H" +#include"IMSM.H" +#include"SMTSUTIL.H" + +GLDEF_C void gPanic(TSmtsAssertError aReason) + { + User::Panic(_L("SMTS-DLL"),aReason); + } + + +GLDEF_C void RequestComplete(TRequestStatus& aStatus,TInt aCompletion) + { + // Untility function which sends completion signal to client active object + TRequestStatus* statusPtr=&aStatus; + User::RequestComplete(statusPtr,aCompletion); + } + + +GLDEF_C TBool LastSmtpCommandAccepted(TInt aSmtpCode,TInt aRequiredFirstDigit) + { + // Utility function: is 1st digit of 3-digit code returned by SMTP server + // the digit we expected? Returns true or False. + // Used as a simple test to determine whether last command sent to remote SMTP server + // was accepted or not. + // + // E.g. aSmtpCode=250 ; test for aRequiredFirstDigit=2 + // or aSmtpCode=354 ; test for aRequiredFirstDigit=3 + + return ((aSmtpCode/100)==aRequiredFirstDigit); + } + + +GLDEF_C TInt SmtpResponseCode(const TDesC8& aTextLine,TBool& aMultiLineResponse,TBool& aLastMultiLineResponse) + { + // This function examines the response from remote SMTP server to determine + // whether the most recent SMTP command sent to that server by this transport driver + // was accepted, or not. Also determines whether it is one of a multi-line response + // from the server (as sent by ESMTP servers) + // + // SMTP return codes are always 3 digit numbers, where: + // "2xx" is a positive response (ie command was accepted) + // "354" is a positive response to the "DATA" command + // "4xx" is a negative reply - temporary error in remote SMTP server + // "5xx" is a negative reply - error in commmand sent to remote SMPT server by this transport driver + + TLex8 parseResponse(aTextLine); + TInt SmtpCode; + if (!parseResponse.Val(SmtpCode)) + { + // remember state of iSmtpMultiLine flag; value is used by parseMultiLineResponse + aLastMultiLineResponse = aMultiLineResponse; + aMultiLineResponse = (parseResponse.Get().IsSpace()==EFalse); + aLastMultiLineResponse &= !aMultiLineResponse; + return (SmtpCode); + } + // If TLex failed, response from SMTP server was bogus - ie it contained no 3-digit return code. + // So generate a fake one to ensure that state machine is notified of this error + return (ESmtpNoReturnCode); + } + + +GLDEF_C TInt IdentifySmtpError(TInt aSmtpErrorCode) + { + // Error codes which may be returned in response to any SMTP command + switch (aSmtpErrorCode) + { + case 421: +// error=ESmtpServiceNotAvailable; // service not available + case 450: +// error=ESmtpMailboxUnavailable; + case 451: +// error=ESmtpActionAborted; // processing error on remote SMTP server + case 452: +// error=ESmtpActionNotTaken; // insufficient storage on remote SMTP server + case 500: +// error=ESmtpCommandUnrecognised; // Bug in IMSM.DLL? ; sending illegal command to remote SMTP server + case 501: +// error=ESmtpSyntaxError; // Bug in IMSM.DLL? ; incorrect syntax in command sent to remote SMTP server + case 502: +// error=ESmtpCommmandNotImplemented; // Command sent to SMTP server not recognised by that server. + case 503: +// error=ESmtpBadSequence; // Bug in IMSM's state machine? ; SMTP commands sent to server in wrong order + case 504: +// error=ESmtpParamNotImplemented; // Bug in IMSM.DLL? ; SMTP server didn't expect parameter with this command + case 550: +// error=ESmtpMailboxNoAccess; // Mailbox not found, or no access to mailbox on remote SMTP server + case 551: +// error=ESmtpUserNotLocal; // Remote SMTP server expects a forward path + case 552: +// error=ESmtpExceededStorage; // Insuffucient storage space on remote SMTP server for message + case 553: +// error=ESmtpMailboxName; // Bug in IMSM.DLL? ; Mailbox name not allowed + case 554: +// error=ESmtpTransactionFailed; // Transaction failed! + + // I recognised SMTP error code + return aSmtpErrorCode; + } + + // i.e. didn't recognise error code - so must be a socket/Epoc32 error + return 0; + }