Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы / 2 / lab.05.by mice / spice / src / csp_list
.cpp/*******************************************************************************
* 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