Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы / 2 / lab.67.by mice / tube / src / tb_mail

.h
Скачиваний:
9
Добавлен:
17.04.2013
Размер:
6.38 Кб
Скачать
/*******************************************************************************
* file:         tb_mail.h                                                      *
* version:      0.0.1                                                          *
* author:       d-evil [tmd] (mailto:d-evil.tmd@mail.ru)                       *
* description:  not available                                                  *
*******************************************************************************/

#ifndef TB_MAIL_INCLUDED
#define TB_MAIL_INCLUDED

#include <afx.h>	// i hate this stuff
#include <winsock2.h>

#include <stdio.h>
#include <string.h>
#include <vector>
#include <string>

#include "win_errors.h"
#include "cdm_addr_info.h"
#include "tb_classes.h"


////////////////////////////////////////////////////////////////////////////////
// ctb_link declaration
class ctb_link {
public:
	////////////////////////////////////////////////////////////////////////////
	// ctb_link public constants
	static const int LLOPS_TIMEOUT	= 200;		// low-level ops timeout
	static const int HLOPS_TIMEOUT	= 10000;	// hi-level ops timeout

	ctb_link();
	~ctb_link();

	int connect(const char *const host, const unsigned short port);
	int disconnect();

	int send_str(const char *const str, const bool ap_crlf = true);
	int write_str(char *const str = NULL, const unsigned int to_ms = HLOPS_TIMEOUT);
	int recv_str(char *const str, const int mx = _MX_STR_LEN);
	int read_str(char *const str, const int mx = _MX_STR_LEN,
				 const unsigned int to_ms = HLOPS_TIMEOUT);
	int clean_buf();

	int can_read_nb() { return _can_read_nb(); }
	int can_read(const unsigned int to_ms = LLOPS_TIMEOUT) { return _can_read(to_ms); }
	int can_write(const unsigned int to_ms = LLOPS_TIMEOUT) { return _can_write(to_ms); }

	int open_log(const char *const fn, const bool erase = false);
	int close_log();

protected:
	////////////////////////////////////////////////////////////////////////////
	// ctb_link protected constants
	static const unsigned short _MX_STR_LEN = 1024;
	static const unsigned short _BUF_SZ = 0xFFF;

	static const char _CRLF[];
	static const char *_CRLF_STR;


	////////////////////////////////////////////////////////////////////////////
	// ctb_link protected functions
	bool _sock_invalid() { return INVALID_SOCKET == _sock; }
	int _can_read_nb();
	int _can_read(const unsigned int to_ms = 200);
	int _can_write(const unsigned int to_ms = 200);

	static int _escape_str(const char *const from, const int len,
						   char *const to, const int mx);
	static char *_set_str(char *const to, const char *const from = NULL);
	static char *_time_str(char *const time_str = NULL);

private:
	SOCKET _sock;
	cdm_addr_info _ai;

	char _buf[_BUF_SZ];
	char _recv_buf[_MX_STR_LEN];
	char _send_buf[_MX_STR_LEN];
	int _buf_top;

	FILE *_logf;
};



////////////////////////////////////////////////////////////////////////////////
// ctb_sender declaration
class ctb_sender: public ctb_link {
public:
	////////////////////////////////////////////////////////////////////////////
	// ctb_sender public constants
	static const unsigned short DEF_SMTP_PORT = 25;

	ctb_sender();
	~ctb_sender();

	char *set_from(const char *const str) { return (_from = _set_str(_from, str)); }
	char *set_to(const char *const str) { return (_to = _set_str(_to, str)); }
	char *set_copy(const char *const str) { return (_copy = _set_str(_copy, str)); }
	char *set_subj(const char *const str) { return (_subj = _set_str(_subj, str)); }
	char *set_text(const char *const str) { return (_text = _set_str(_text, str)); }

	char *last_reply() { return _last_reply; }

	int connect(const char *const host, const unsigned short port = DEF_SMTP_PORT);
	int open(const char *const as = NULL);
	int close();
	int send_mail();

protected:
	////////////////////////////////////////////////////////////////////////////
	// ctb_sender protected constants
	static const unsigned int _SMTP_REPLY_READY		= 220;
	static const unsigned int _SMTP_REPLY_CLOSE		= 221;
	static const unsigned int _SMTP_REPLY_OK		= 250;
	static const unsigned int _SMTP_REPLY_UNL		= 251;	// user not local
	static const unsigned int _SMTP_REPLY_STDAT		= 354;

	static int _get_smtp_code(const char *const str);
	int _get_smtp_reply(int *const code);
	int _get_smtp_reply();

	int _write_mail(const char *const text);

	int _cmd_mail(const char *const from);
	int _cmd_rcpt(const char *const to);
	int _cmd_data();

private:
	char _str_buf[_MX_STR_LEN];
	char _last_reply[_MX_STR_LEN];

	char *_from;
	char *_to;
	char *_copy;
	char *_subj;
	char *_text;
};



////////////////////////////////////////////////////////////////////////////////
// ctb_recver declaration
class ctb_recver: public ctb_link {
public:
	////////////////////////////////////////////////////////////////////////////
	// ctb_recver public tpyes
	typedef std::vector<std::string> ctb_list;

	ctb_recver();
	~ctb_recver();

	char *set_user(const char *const str) { return (_user = _set_str(_user, str)); }
	char *set_pass(const char *const str) { return (_pass = _set_str(_pass, str)); }

	int open();
	int close();

	int auth(const char *const user = NULL, const char *const pass = NULL);
	int stat(int *const total = NULL, int *const sz = NULL) { return _cmd_stat(total, sz); }
	int list(ctb_list *const list) { return _cmd_list(list); }
	int retr(const int num, char **text) { return _cmd_retr(num, text); }
	int retr_free(char *const text) { return _cmd_retr_free(text); }
	int retr2(const int num, std::string &text) { return _cmd_retr2(num, text); }
	int dele(const int num) { return _cmd_dele(num); }

protected:
	static int _get_pop3_code(const char *const _str_buf);
	int _get_pop3_reply(int *const code);
	int _get_pop3_reply();

	int _cmd_user(const char *const user);
	int _cmd_pass(const char *const pass);
	int _cmd_stat(int *const total = NULL, int *const sz = NULL);
	int _cmd_list(ctb_list *const lst);
	int _cmd_retr(const int num, char **text);
	int _cmd_retr_free(char *const text);
	int _cmd_retr2(const int num, std::string &text);
	int _cmd_dele(const int num);

private:
	char _str_buf[_MX_STR_LEN];
	char _last_reply[_MX_STR_LEN];

	char *_user;
	char *_pass;
};



#endif
Соседние файлы в папке src