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

Лабы / 2 / lab.05.by mice / spice / src / csp_list

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

////////////////////////////////////////////////////////////////////////////////
// headers
#include "csp_list.h"


////////////////////////////////////////////////////////////////////////////////
// csp_list public definitions
csp_list::csp_list() {
	_last_arch_num = 0;
	_last_item_num = 0;
	_last_tree_item = NULL;
	_tmp_file = NULL;
	_icon = NULL;
	_last_redraw = 0;
}


csp_list::~csp_list() {
	if (NULL != _tmp_file) {
		CloseHandle(_tmp_file);
		DeleteFile(_tmp_file_name);
	}
}


int csp_list::create(CWnd *const parent) {
	if (FALSE == Create(IDD_DLG_LIST, parent)) return -1;

	int n = 0;
	do {
		_tmp_file_name.Format("%s%s.%03i.html", _app_path, _DEF_TMP_FILE_BASE, n);
		_tmp_file = CreateFile(_tmp_file_name, GENERIC_WRITE|GENERIC_READ,
						FILE_SHARE_READ, NULL, CREATE_NEW,
						FILE_ATTRIBUTE_NORMAL, NULL);
		if (INVALID_HANDLE_VALUE == _tmp_file) {
			_tmp_file = NULL;
			++n;
		}
	} while (NULL == _tmp_file && n < 999);

	if (NULL == _tmp_file) {
		DestroyWindow();
		return -1;
	}

	return 0;
}


BOOL csp_list::OnInitDialog() {
	_btn_view = (CButton *)GetDlgItem(IDC_BTN_LST_VIEW);
	_btn_close = (CButton *)GetDlgItem(IDC_BTN_LST_CLOSE);
	_btn_send_vseh_nahuj = (CButton *)GetDlgItem(IDC_BTN_SEND_VSEH_NAHUJ);
	_btn_resolve = (CButton *)GetDlgItem(IDC_BTN_RESOLVE);
	_tree = (CTreeCtrl *)GetDlgItem(IDC_TREE_LIST);

	// Based on a true story! :^)
	SetIcon(_icon, TRUE);

	return TRUE;
}


void csp_list::OnClose() {
	_btn_view->EnableWindow(FALSE);
	_btn_close->EnableWindow(FALSE);
	_btn_resolve->EnableWindow(FALSE);
	GetParent()->PostMessage(SPM_LST_CLOSE_ME);
}


int csp_list::use_csp_file(const HANDLE hfile) {
	_csp_file.use_handle(hfile, true);	// she turns into a tiger when she's ready to eat

	return 0;
}


int csp_list::update() {
	return _update_tree();
}


////////////////////////////////////////////////////////////////////////////////
// csp_list protected definitions
const char *csp_list::_DEF_TMP_FILE_BASE = "files/spice_list_tmp";
const char *csp_list::_HTML_INTRO = "<html><head>"
		"<link rel=\"StyleSheet\" href=\"style.css\" type=\"text/css\">"
		"<title>Spice generated html file</title>"
		"</head><body>";
const char *csp_list::_HTML_OUTRO = "</body></html>";


BEGIN_MESSAGE_MAP(csp_list, CDialog)
	ON_WM_CLOSE()
	ON_COMMAND(IDC_BTN_LST_VIEW, _on_btn_view)
	ON_COMMAND(IDC_BTN_LST_CLOSE, _on_btn_close)
	ON_COMMAND(IDC_BTN_SEND_VSEH_NAHUJ, _on_btn_send_vseh_nahuj)
	// no listening: 3 Doors Down - Kryptonite
	ON_MESSAGE(csp_list::SPM_LST_UPDATE, _on_list_update)
END_MESSAGE_MAP()


void csp_list::_on_btn_view() {
	// 06:09 is a good time. Dawn breaks...
	HTREEITEM item = _tree->GetSelectedItem();
	if (NULL == item) return;

	// cut file
	SetFilePointer(_tmp_file, 0, NULL, FILE_BEGIN);
	SetEndOfFile(_tmp_file);
	DWORD wr;
	WriteFile(_tmp_file, _HTML_INTRO, (int)strlen(_HTML_INTRO), &wr, NULL);
	if (strlen(_HTML_INTRO) != wr) {
		show_error_msg("Can't write in temp file", 0, this);
		return;
	}

	int rev ;
	HTREEITEM parent = _tree->GetParentItem(item);
	if (NULL != parent) {	// show single datagram
		int an = (int)_tree->GetItemData(parent);
		int n =  (int)_tree->GetItemData(item);
		rev = _write_dtgm(an, n);
	} else {	// show all arch
		int an = (int)_tree->GetItemData(item);
		rev = _write_arch(an);
	}
	if (0 != rev) {
		show_error_msg("Error occurred while writing temp file", 0, this);
	}

	WriteFile(_tmp_file, _HTML_OUTRO, (int)strlen(_HTML_OUTRO), &wr, NULL);
	if (strlen(_HTML_OUTRO) != wr) {
		show_error_msg("Can't finalize temp file", 0, this);
	}

	rev = (sfx_data)ShellExecute(GetSafeHwnd(), NULL, _tmp_file_name, NULL, NULL, SW_SHOWNORMAL);
	if (32 > rev) {
		show_error_msg("Can't open this file (if it is a file at all)", rev, this);
	}
}


void csp_list::_on_btn_close() {
	PostMessage(WM_CLOSE);
}


void csp_list::_on_btn_send_vseh_nahuj() {
	show_error_msg("They are already there", 0, this);
}


LRESULT csp_list::_on_list_update(WPARAM pch, LPARAM hz) {
	// now listening: Linkin Park - By Myself
	// i wander, why i don't want to write on russian here...
	// i like russian, but maybe... no, i really don't know :^)
	return _update_tree();
}


int csp_list::_update_tree() {
	csp_file::ssp_arch *arch;

	if (0 == _last_arch_num) arch = _csp_file.load_first_arch();
	else arch = _csp_file.load_arch(_last_arch_num);
	if (NULL == arch) return -1;

	int num;
	bool first = (NULL == _last_tree_item);
	while (NULL != arch) {
		CString str;
		if (first) {
			str.Format("Arch #%04u", arch->num);
			_last_tree_item = _tree->InsertItem(str);
			_tree->SetItemData(_last_tree_item, (DWORD_PTR)arch->num);
		} else first = true;

		num = _csp_file.arch_used(arch);
		for (int i = _last_item_num; i < num; ++i) {
			char dtgm[_MX_DTGM_SIZE];
			_csp_file.load_dtgm(arch, i, dtgm);
			header_ip *header = (header_ip *)dtgm;
			CString from, to;
			from = inet_ntoa(*(in_addr *)&header->sourceIP);
			to = inet_ntoa(*(in_addr *)&header->destIP);

			str.Format("dtgm #%03i on [%s] from [%s] to [%s]", i,
					   csp_parser::proto_str(header->proto), from, to);
			HTREEITEM item = _tree->InsertItem(str, _last_tree_item);
			_tree->SetItemData(item, (DWORD_PTR)i);
		}

		_last_arch_num = arch->num;
		_last_item_num = 0;
		arch = _csp_file.load_next_arch(arch, true);
	}

	_last_item_num = num;

	clock_t delay = _REDRAW_DELAY_MS*CLOCKS_PER_SEC/1000;
	if (clock() - _last_redraw > delay) {
		_tree->RedrawWindow();
		_last_redraw = clock();
	}

	return 0;
}


int csp_list::_write_arch(const int arch_num) {
	bool resolve;
	if (BST_CHECKED == _btn_resolve->GetCheck()) {
		// 08:10 Almost done. Bad way, but it will work.
		int sb = MessageBox("This feature is experimental and very slow.\n"
			"Keeping it on may hang up Spice application for several minutes.\n\n"
			"Continue with this feature anyway?",
			"Spice [Warining]", MB_YESNO|MB_APPLMODAL|MB_ICONWARNING);
		if (IDYES == sb) resolve = true;
		else resolve = false;
	} else resolve = false;

	csp_file::ssp_arch *const arch = _csp_file.load_arch(arch_num);
	if (NULL == arch) return -1;

	int rev = 0;
	int num = _csp_file.arch_used(arch);
	char dtgm[_MX_DTGM_SIZE];
	for (int i = 0; i < num; ++i) {
		if (0 != _csp_file.load_dtgm(arch, i, dtgm)) {
			rev = -1;
			break;
		}

		_csp_parser.parse(dtgm, arch->items[i].length, resolve);

		DWORD wr;
		WriteFile(_tmp_file, _csp_parser.html(), _csp_parser.html_len(), &wr, NULL);
		if (_csp_parser.html_len() != wr) {
			rev = -1;
			break;
		}
	}

	_csp_file.free_arch(arch);

	return rev;
}


int csp_list::_write_dtgm(const int arch_num, const int num) {
	bool resolve;
	if (BST_CHECKED == _btn_resolve->GetCheck()) resolve = true;
	else resolve = false;

	csp_file::ssp_arch *const arch = _csp_file.load_arch(arch_num);
	if (NULL == arch) return -1;

	const int sz = arch->items[num].length;
	char dtgm[_MX_DTGM_SIZE];
	const int rev =_csp_file.load_dtgm(arch, num, dtgm);
	_csp_file.free_arch(arch);
	if	(0 != rev) return -1;

	_csp_parser.parse(dtgm, sz, resolve);
	DWORD wr;
	WriteFile(_tmp_file, _csp_parser.html(), _csp_parser.html_len(), &wr, NULL);
	if (_csp_parser.html_len() != wr) return -1;

	return 0;
}


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