--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/smtpservermtm/src/SMTSUTIL.CPP Thu Dec 17 08:44:11 2009 +0200
@@ -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<e32std.h>
+//Oyster includes
+#include<msvstd.h>
+//IMSK includes
+#include<imsk.h>
+//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;
+ }