File:  [parser3project] / parser3 / src / lib / smtp / smtp.h
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Tue Feb 24 10:36:16 2004 UTC (22 years, 4 months ago) by paf
Branches: MAIN
CVS tags: HEAD
started porting smtp to unix [testing on solaris]

/** @file
	Parser: SMTP sender decl.

	Copyright (c) 2001-2004 ArtLebedev Group (http://www.artlebedev.com)
	Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
*/

static const char * const IDENT_SMTP_H="$Date: 2004/02/24 10:36:16 $";


#include "pa_string.h"

#ifdef CYGWIN
#define _GNU_H_WINDOWS32_SOCKETS
// for PASCAL
#include <windows.h>
// SOCKET
typedef u_int	SOCKET;
int PASCAL closesocket(SOCKET);
#else
#	if defined(WIN32)
#		include <windows.h>
#	else
		typedef char    CHAR;
		typedef u_int	SOCKET;
#		define closesocket close
		inline int WSAGetLastError() { return errno; }
#		define WSAEPROTONOSUPPORT EPROTONOSUPPORT
#		define WSAESOCKTNOSUPPORT ESOCKTNOSUPPORT
#		define WSAENOTCONN ENOTCONN
#		define WSAENETDOWN ESHUTDOWN
#		define WSAENETUNREACH EHOSTUNREACH
#		define WSAENETRESET ENETRESET
#		define WSAECONNABORTED ECONNABORTED
#		define WSAECONNRESET ECONNRESET
#		define WSAEWOULDBLOCK EWOULDBLOCK
#		define WSAECONNREFUSED ECONNREFUSED

#		define WSAHOST_NOT_FOUND (2)
#		ifndef INADDR_NONE
#			define INADDR_NONE ((unsigned long) -1)
#		endif
#		ifndef INVALID_SOCKET
#			define INVALID_SOCKET  (SOCKET)(~0)
#		endif
#	endif
#endif

//////////////////////////////////////////////////////////////////////////////

#define SOCKET_BUFFER_SIZE	512

#define ERR_SENDING_DATA		4002
#define ERR_NOT_A_SOCKET		4010
#define ERR_CLOSING			4012
#define WAIT_A_BIT			4013

#define MAXOUTLINE 255

//////////////////////////////////////////////////////////////////////////////

/// SIMPLE MAIL TRANSPORT PROTOCOL Win32 realization
class SMTP: public PA_Object {
    char            *in_buffer;
    char            *out_buffer;
    unsigned int	in_index;
    unsigned int	out_index;
    unsigned int	in_buffer_total;
    unsigned int	out_buffer_total;
    unsigned int	last_winsock_error;
    fd_set	        fds;
    struct timeval	timeout;

    SOCKET	the_socket;

	char	my_hostname[1024];

    CHAR    ServerProtocol[100];
    CHAR    RemoteAddress[100];
    CHAR    RemoteHost[100];
    CHAR    RemoteUser[100];
    CHAR    HttpAccept[100];
    CHAR    HttpUserAgent[256];

    CHAR    FirstName[100];
    CHAR    LastName[100];
    CHAR    WebUse[100];
    CHAR    EMail[100];
    CHAR    HomePage[100];
    CHAR    text[500];

public:
	SMTP();
	override ~SMTP();

    // smtp.C
	void	Send(const char* , const char* , const char* ,  char *, char *);
	bool	MakeSmtpHeader(char *, char *, char *, char *);
	void	prepare_message(char *, char *,  const char* , const char* );
	void	open_socket(const char* , const char* );
	int		get_line(void);
	void	SendSmtpError(const char* );
	void	transform_and_send_edit_data(const char* );
	void	send_data(const char* );
	void	ConnectToHost(const char* , const char* );
	int		GetBuffer(int);
	int		GetChar(int, char *);
	void	SendLine(const char* , unsigned long);
	void	SendBuffer(const char* , unsigned long);
	void	FlushBuffer();
	bool	CloseConnect();

    // comms.C
    int      IsAddressARawIpaddress(const char* );
    int      ResolveService(const char* , u_short *);
    int      ResolveHostname(const char* , struct sockaddr_in *);
    int      GetAndSetTheSocket(SOCKET *);
    int      GetConnection(SOCKET, struct sockaddr_in *);
    void     MiscSocketSetup(SOCKET, fd_set *, struct timeval *);
};

E-mail: