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

Лабы / 2 / lab.01.by mice / fexchange / fx_gui

.cpp
Скачиваний:
10
Добавлен:
17.04.2013
Размер:
20.77 Кб
Скачать
/*******************************************************************************
* file:         fx_gui.cpp                                                     *
* version:	    0.0.1                                                          *
* author:       inba (mailto:inba@mail.ru)                                     *
* description:  not available                                                  *
*******************************************************************************/


////////////////////////////////////////////////////////////////////////////////
// program specific headers
#include "fx_gui.h"
#include "resource.h"


namespace fx_ns {

/*******************************************************************************
*  definitions                                                                 *
*******************************************************************************/

////////////////////////////////////////////////////////////////////////////////
// CfxListCtr (private definitions)
BEGIN_MESSAGE_MAP(CfxListCtr, CListCtrl)
	// ON_
END_MESSAGE_MAP()



////////////////////////////////////////////////////////////////////////////////
// cfx_dialog (public definitions)
cfx_dialog::cfx_dialog(): CDialog(IDD_MAIN_DLG) {
	_sbtns_state = -1;

	// find servers columns indexes
	_scp_host = _get_scol_pos(COLUMN_HOST);
	_scp_addr = _get_scol_pos(COLUMN_ADDRES);
	_scp_port = _get_scol_pos(COLUMN_PORT);
	_scp_state = _get_scol_pos(COLUMN_STATE);

	// find clients columns indexes
	_ccp_done = _get_ccol_pos(COLUMN_DONE);
	_ccp_host = _get_ccol_pos(COLUMN_HOST);
	_ccp_addr = _get_ccol_pos(COLUMN_ADDRES);
	_ccp_port = _get_ccol_pos(COLUMN_PORT);
	_ccp_state = _get_ccol_pos(COLUMN_STATE);
	_ccp_fname = _get_ccol_pos(COLUMN_FNAME);
	_ccp_fsize = _get_ccol_pos(COLUMN_FSIZE);
	_ccp_time = _get_ccol_pos(COLUMN_TIME);
}


cfx_dialog::~cfx_dialog() {
	// dummy
}


////////////////////////////////////////////////////////////////////////////////
// cfx_dialog (protected definitions)
const cfx_dialog::sfx_column cfx_dialog::_s_columns[] = {
	{COLUMN_HOST,	100},
	{COLUMN_ADDRES,	85},
	{COLUMN_PORT,	45},
	{COLUMN_STATE,	100}
};

const cfx_dialog::sfx_column cfx_dialog::_c_columns[] = {
	{COLUMN_DONE,	40},
	{COLUMN_HOST,	75},
	{COLUMN_ADDRES,	75},
	{COLUMN_PORT,	45},
	{COLUMN_STATE,	100},
	{COLUMN_FNAME,	100},
	{COLUMN_FSIZE,	75},
	{COLUMN_TIME,	60},
};

int cfx_dialog::_scol_num() const {
	return sizeof(_s_columns)/sizeof(_s_columns[0]);
}


int cfx_dialog::_ccol_num() const {
	return sizeof(_c_columns)/sizeof(_c_columns[0]);
}


int cfx_dialog::_get_scol_pos(const unsigned int id) const {
	for (int i = _scol_num() - 1; 0 <= i; --i) {
		if (id == _s_columns[i].n_id) return i;
	}

	return -1;
}


int cfx_dialog::_get_ccol_pos(const unsigned int id) const {
	for (int i = _ccol_num() - 1; 0 <= i; --i) {
		if (id == _c_columns[i].n_id) return i;
	}

	return -1;
}


BEGIN_MESSAGE_MAP(cfx_dialog, CDialog)
	ON_COMMAND(IDC_NEW_SERV, _on_btn_new_serv)
	ON_COMMAND(IDC_BROWSE, _on_btn_browse)
	ON_COMMAND(IDC_SEND_FILE, _on_btn_send_file)
	ON_COMMAND(IDC_STOP_SERV, _on_btn_stop_serv)
	ON_COMMAND(IDC_KILL_SERV, _on_btn_kill_serv)
	ON_COMMAND(IDC_PAUSE, _on_btn_pause)
	ON_COMMAND(IDC_KILL, _on_btn_kill)
	ON_COMMAND(IDC_EXIT, _on_btn_exit)
	ON_NOTIFY(NM_CLICK, IDC_LIST_SERV, _on_serv_click)
	ON_NOTIFY(LVN_KEYDOWN, IDC_LIST_SERV, _on_serv_click)
	ON_NOTIFY(LVN_ITEMACTIVATE, IDC_LIST_SERV, _on_serv_click)
	ON_NOTIFY(NM_CLICK, IDC_LIST_CON, _on_con_click)
	ON_NOTIFY(LVN_KEYDOWN, IDC_LIST_CON, _on_con_click)
	ON_NOTIFY(LVN_ITEMACTIVATE, IDC_LIST_CON, _on_con_click)
	ON_WM_TIMER()
END_MESSAGE_MAP()


void cfx_dialog::OnTimer(UINT nIDEvent) {
	sfx_time_hlp *thelper = sfx_data(nIDEvent);
	CTimeSpan tmp = CTime::GetCurrentTime() - *thelper->st_time;
	CString str = tmp.Format("%H:%M:%S");
	list_con->SetItemText(thelper->item->if_data, ccp_time(), str);
}


void cfx_dialog::_on_btn_new_serv() {
	int port = _get_port();
	if (ERC_ERROR == port) return;
	CString saddr;
	edit_addr->GetWindowText(saddr);

	cfx_if::sfx_crserv_info info;
	info.port = (int)port;
	info.address = saddr.GetBuffer();
	_iface->cmd_to_core(cfx_if::CCMD_CRSERV, &info, NULL);
}


void cfx_dialog::_on_btn_browse() {
	CString filter;
	filter.LoadString(RS_DLG_FILTER);
	CString fname;
	edit_file->GetWindowText(fname);
	CFileDialog fdlg(TRUE, NULL, fname,
		OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_NOCHANGEDIR|/*OFN_FILEMUSTEXIST|
		OFN_PATHMUSTEXIST|*/OFN_HIDEREADONLY, filter, this);
	if (IDOK == fdlg.DoModal())	{
		edit_file->SetWindowText(fdlg.GetPathName());
	}
}


void cfx_dialog::_on_btn_send_file() {
	int port = _get_port();
	if (ERC_ERROR == port) return;
	CString saddr, sfile;
	edit_addr->GetWindowText(saddr);
	edit_file->GetWindowText(sfile);
	cfx_if::sfx_sndfile_info info;
	info.address = saddr.GetBuffer();
	info.file_name = sfile.GetBuffer();
	info.port = (unsigned short)port;
	_iface->cmd_to_core(cfx_if::CCMD_SENDFILE, &info, 0);
}


void cfx_dialog::_on_btn_stop_serv() {
	int i = list_serv->GetSelectionMark();
	if (0 > i) return;

	cfx_if::sfx_serv_item *item = (cfx_if::sfx_serv_item *)list_serv->GetItemData(i);
	if (cfx_if::ST_SERV_LISTENING == _sbtns_state) {
		_iface->cmd_to_core(cfx_if::CCMD_STOPSERV, item, NULL);
	} else if (cfx_if::ST_SERV_STOPED == _sbtns_state) {
		_iface->cmd_to_core(cfx_if::CCMD_RUNSERV, item, NULL);
	}
}


void cfx_dialog::_on_btn_kill_serv() {
	int i = list_serv->GetSelectionMark();
	if (0 > i) return;

	cfx_if::sfx_serv_item *item = (cfx_if::sfx_serv_item *)list_serv->GetItemData(i);
	_iface->cmd_to_core(cfx_if::CCMD_KILLSERV, item, NULL);
}


void cfx_dialog::_on_btn_pause() {
}


void cfx_dialog::_on_btn_kill() {
}


void cfx_dialog::_on_serv_click(NMHDR *phdr, LRESULT *pinfo) {
	_serv_sel_item(list_serv->GetSelectionMark());
}


void cfx_dialog::_on_con_click(NMHDR *phdr, LRESULT *pinfo) {
	_con_sel_item(list_con->GetSelectionMark());
}


void cfx_dialog::_on_btn_exit() {
	//if (OK_OK == _core->exit()) {
		// close dialog
	EndDialog(OK_OK);
	//}
}


BOOL cfx_dialog::OnInitDialog() {
	edit_addr = (CEdit *)GetDlgItem(IDC_EDIT_ADDR);
	char hostname[0xFF];
	if (0 == gethostname(hostname, 0xFF)) {
		edit_addr->SetWindowText(hostname);
	} else {
		edit_addr->SetWindowText("127.0.0.1");
	}
	edit_port = (CEdit *)GetDlgItem(IDC_EDIT_PORT);
	edit_port->SetWindowText("57005");
	edit_file = (CEdit *)GetDlgItem(IDC_EDIT_FILE);
	btn_stop_serv = (CButton *)GetDlgItem(IDC_STOP_SERV);
	btn_kill_serv = (CButton *)GetDlgItem(IDC_KILL_SERV);
	btn_pause = (CButton *)GetDlgItem(IDC_PAUSE);
	btn_kill = (CButton *)GetDlgItem(IDC_KILL);
	list_serv = (CListCtrl *)GetDlgItem(IDC_LIST_SERV);
	list_con = (CListCtrl *)GetDlgItem(IDC_LIST_CON);

	SetWindowLong(list_serv->m_hWnd, GWL_STYLE, _list_style);
	list_serv->SetExtendedStyle(LVS_EX_FULLROWSELECT);
	SetWindowLong(list_con->m_hWnd, GWL_STYLE, _list_style);
	list_con->SetExtendedStyle(LVS_EX_FULLROWSELECT);

	CString str;

	// insert servers columns
	for (int i = 0; i < _scol_num(); ++i) {
		str.LoadString(_s_columns[i].n_id);
		list_serv->InsertColumn(i, str, LVCFMT_LEFT, _s_columns[i].width, i);
	}

	// insert clients columns
	for (int i = 0; i < _ccol_num(); ++i) {
		str.LoadString(_c_columns[i].n_id);
		list_con->InsertColumn(i, str, LVCFMT_LEFT, _c_columns[i].width, i);
	}

	set_sbtns_state(cfx_if::ST_SERV_NONE);

	return TRUE;
}


int cfx_dialog::_get_port() {
	CString sport;
	edit_port->GetWindowText(sport);
	for (int x = (int)strlen(sport) - 1; 0 <= x; --x) {
		if ('0' > sport[x] || '9' < sport[x]) {
			//TODO: load from resources
			MessageBox("Incorrect port value", "fexchange: input error", MB_APPLMODAL|MB_OK|MB_ICONERROR);
			return ERC_ERROR;
		}
	}
	return atoi(sport);
}


void cfx_dialog::_serv_sel_item(const int id) {
	if (0 > id) return;
	cfx_if::sfx_serv_item *info = (cfx_if::sfx_serv_item *)list_serv->GetItemData(id);
	set_sbtns_state(info->state);
}


void cfx_dialog::set_sbtns_state(const int state) {
	if (_sbtns_state == state) return;
	_sbtns_state = state;

	CString str;
	if (cfx_if::ST_SERV_LISTENING == state) {
		btn_stop_serv->EnableWindow(TRUE);
		str.LoadString(STR_BTN_STOP);
	} else if (cfx_if::ST_SERV_STOPED == state) {
		btn_stop_serv->EnableWindow(TRUE);
		str.LoadString(STR_BTN_RUN);
	} else {
		btn_stop_serv->EnableWindow(FALSE);
		str.LoadString(STR_BTN_NA);
	}
	btn_stop_serv->SetWindowText(str);

	switch (state) {
		case cfx_if::ST_SERV_STOPED:
		case cfx_if::ST_SERV_STOPING:
		case cfx_if::ST_SERV_LISTENING:
			btn_kill_serv->EnableWindow(TRUE);
			str.LoadString(STR_BTN_KILL);
			break;
		default:
			btn_kill_serv->EnableWindow(FALSE);
			str.LoadString(STR_BTN_NA);
			break;
	}
	btn_kill_serv->SetWindowText(str);
}


void cfx_dialog::_con_sel_item(const int id) {
}



////////////////////////////////////////////////////////////////////////////////
// cfx_gui (public definition)
cfx_gui::cfx_gui(): cfx_if() {
	_dlg = new cfx_dialog;
	_dlg->set_iface(this);
	_serv_count = 0;
	_clnt_count = 0;
	_kill_mutex = CreateMutex(NULL, FALSE, NULL);
}


cfx_gui::~cfx_gui() {
	ReleaseMutex(_kill_mutex);
	delete _dlg;
}


int cfx_gui::run() {
	_dlg->DoModal();
	return OK_OK;
}


sfx_data cfx_gui::exec_cmd(const int cmd, const sfx_data ldata, const sfx_data rdata) {
	CString str;
	switch (cmd) {
		case cfx_if::CMD_ERROR_REPORT:
			return _on_error_report(ldata, rdata);

		case cfx_if::CMD_US_NEW:
			return _on_us_new(ldata, rdata);

		case cfx_if::CMD_US_MODIFY:
			return _on_us_modify(ldata, rdata);

		case cfx_if::CMD_US_KILL:
			return _on_us_kill(ldata, rdata);

		case cfx_if::CMD_UC_NEW:
			return _on_uc_new(ldata, rdata);

		case cfx_if::CMD_UC_MODIFY:
			return _on_uc_modify(ldata, rdata);

		case cfx_if::CMD_UC_KILL:
			return _on_uc_kill(ldata, rdata);
		
		case cfx_if::CMD_ASK_ACCEPTIC:
			return _on_ask_acceptic(ldata, rdata);

		case cfx_if::CMD_ASK_FILENAME:
			return _on_ask_filename(ldata, rdata);

		default:
			//str.FormatMessage(MSG_UNKNOWNCMD, cmd);
			//MessageBox(str, MB_OK|MB_APPLMODAL|MB_ICONERROR, NULL);
			return ERC_NOTHANDLED;
	}
	return ERC_ERROR;	// dummy return;)
}


int cfx_gui::error_report(const char *const msg, int int_id, int win_id) {
	MessageBox(_dlg->m_hWnd, msg, "fexchange: error", MB_OK|MB_APPLMODAL|MB_ICONERROR);
	return OK_OK;
}


////////////////////////////////////////////////////////////////////////////////
// cfx_gui (protected definitions)
BOOL cfx_gui::_load_string(CString &str, const UINT id) {
	if (TRUE == str.LoadString(id)) return TRUE;

	str.Format("code: %u", id);

	return FALSE;
}


sfx_data cfx_gui::_on_error_report(const sfx_data ldata, const sfx_data rdata) {
	CString er_msg;
	_load_string(er_msg, (0 <= ldata.i)? ldata.i: -ldata.i );

	char *win_msg;
	if (0 != rdata.i) {
		FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|
					  FORMAT_MESSAGE_ALLOCATE_BUFFER|
					  FORMAT_MESSAGE_ARGUMENT_ARRAY,
					  NULL, rdata.i, 0, (LPSTR)&win_msg, 0, NULL);
		CString tmp;
		tmp.FormatMessage(RS_MSG_WINERRORA, win_msg, rdata.i);
		er_msg.Append(tmp);
		LocalFree(win_msg);
	}

	error_report(er_msg, ldata, rdata);

	return OK_OK;
}


sfx_data cfx_gui::_on_us_new(const sfx_data ldata, const sfx_data rdata) {
	cfx_if::sfx_serv_item *item = ldata;
	CString str;

	_dlg->list_serv->InsertItem(_serv_count, NULL);

	_dlg->list_serv->SetItemText(_serv_count, _dlg->scp_host(), item->addr.host);
	_dlg->list_serv->SetItemText(_serv_count, _dlg->scp_addr(), item->addr.addres);
	str.Format("%d", item->addr.port);
	_dlg->list_serv->SetItemText(_serv_count, _dlg->scp_port(), str);
	str.LoadString(item->state);
	_dlg->list_serv->SetItemText(_serv_count, _dlg->scp_state(), str);

	item->if_data = _serv_count;
	_dlg->list_serv->SetItemData(_serv_count, (DWORD_PTR)item);
	++_serv_count;

	if (_dlg->list_serv->GetSelectionMark() == item->if_data.i) {
		_dlg->set_sbtns_state(item->state);
	#ifdef REDRAW_LIST
		_dlg->btn_stop_serv->RedrawWindow();
		_dlg->btn_kill_serv->RedrawWindow();
	#endif
	}

#ifdef REDRAW_LIST
	_dlg->list_serv->RedrawWindow();
#endif
#ifdef USE_SLOW_MODE
	Sleep(SLOW_MODE_DELAY);
#endif


	return OK_OK;
}


sfx_data cfx_gui::_on_us_modify(const sfx_data ldata, const sfx_data rdata) {
	cfx_if::sfx_serv_item *item = ldata;
	CString str;

	if (0 != (rdata.i & cfx_if::CMD_USMF_STATE)) {
		_load_string(str, item->state);
		_dlg->list_serv->SetItemText(item->if_data, _dlg->scp_state(), str);
		if (_dlg->list_serv->GetSelectionMark() == item->if_data.i) {
			_dlg->set_sbtns_state(item->state);
		#ifdef REDRAW_LIST
			_dlg->btn_stop_serv->RedrawWindow();
			_dlg->btn_kill_serv->RedrawWindow();
		#endif
		}
	}

	if (0 != (rdata.i & cfx_if::CMD_USMF_ADDR)) {
		_dlg->list_serv->SetItemText(item->if_data, _dlg->scp_host(), item->addr.host);
		_dlg->list_serv->SetItemText(item->if_data, _dlg->scp_addr(), item->addr.addres);
		str.Format("%d", item->addr.port);
		_dlg->list_serv->SetItemText(item->if_data, _dlg->scp_port(), str);
	}

#ifdef REDRAW_LIST
	_dlg->list_serv->RedrawWindow();
#endif
#ifdef USE_SLOW_MODE
	Sleep(SLOW_MODE_DELAY);
#endif

	return OK_OK;
}


sfx_data cfx_gui::_on_us_kill(const sfx_data ldata, const sfx_data rdata) {
	WaitForSingleObject(_kill_mutex, INFINITE);

	cfx_if::sfx_serv_item *item = ldata;
	// fix other indexes
	for (int i = _dlg->list_serv->GetItemCount()-1; item->if_data.i < i; --i) {
		cfx_if::sfx_serv_item *si;
		si = (cfx_if::sfx_serv_item *)_dlg->list_serv->GetItemData(i);
		--(si->if_data.i);
	}
	// delete it
	_dlg->list_serv->DeleteItem(item->if_data);
	--_serv_count;

	int x = _dlg->list_serv->GetSelectionMark();
	if (0 <= x) {
		item = (cfx_if::sfx_serv_item *)_dlg->list_serv->GetItemData(x);
		_dlg->set_sbtns_state(item->state);
	#ifdef REDRAW_LIST
		_dlg->btn_stop_serv->RedrawWindow();
		_dlg->btn_kill_serv->RedrawWindow();
	#endif
	}

#ifdef REDRAW_LIST
	_dlg->list_serv->RedrawWindow();
#endif
#ifdef USE_SLOW_MODE
	Sleep(SLOW_MODE_DELAY);
#endif
	ReleaseMutex(_kill_mutex);

	return OK_OK;
}


sfx_data cfx_gui::_on_uc_new(const sfx_data ldata, const sfx_data rdata) {
	cfx_if::sfx_clnt_item *item = ldata;
	CString str;

	// insert new item
	_dlg->list_con->InsertItem(_clnt_count, NULL);

	// fill done percent
	double dval;
	if (0 < item->total_sz && 0 < item->done_sz)
		dval = double(1) / double(item->done_sz / item->total_sz);
	else
		dval = 0;
	str.Format("%.1f", dval);
	_dlg->list_con->SetItemText(_clnt_count, _dlg->ccp_done(), str);

	// fill host and address
	_dlg->list_con->SetItemText(_clnt_count, _dlg->ccp_host(), item->addr.host);
	_dlg->list_con->SetItemText(_clnt_count, _dlg->ccp_addr(), item->addr.addres);

	// fill port
	str.Format("%d", (int)item->addr.port);
	_dlg->list_con->SetItemText(_clnt_count, _dlg->ccp_port(), str);

	// fill state
	_load_string(str, item->state);
	_dlg->list_con->SetItemText(_clnt_count, _dlg->ccp_state(), str);

	// fill file name
	_dlg->list_con->SetItemText(_clnt_count, _dlg->ccp_fname(), item->file_name);

	// fill file size
	if (item->total_sz > 0xFFFFF) {
		dval = item->total_sz / (1024*1024);
		str.Format("%.2f mb", dval);
	} else {
		dval = item->total_sz / 1024;
		str.Format("%.2f kb", dval);
	}
	_dlg->list_con->SetItemText(_clnt_count, _dlg->ccp_fsize(), str);

	// fill time
	sfx_time_hlp *thelper = new sfx_time_hlp;
	thelper->st_time = new CTime;
	*(thelper->st_time) = CTime::GetCurrentTime();
	thelper->item = item;
	thelper->timer_id = _dlg->SetTimer(sfx_data(thelper), 500, 0);
	item->if_time = thelper;
	str = thelper->st_time->Format("%H:%M:%S");
	_dlg->list_con->SetItemText(_clnt_count, _dlg->ccp_time(), str);

	//if (_dlg->list_serv->GetSelectionMark() == item->iface_i)
	//	_dlg->set_serv_btn_state(item->state);
	_dlg->list_con->SetItemData(_clnt_count, (DWORD_PTR)item);
	item->if_data = _clnt_count;
	++_clnt_count;

#ifdef REDRAW_LIST
	_dlg->list_con->RedrawWindow();
#endif
#ifdef USE_SLOW_MODE
	Sleep(SLOW_MODE_DELAY);
#endif

	return OK_OK;
}


sfx_data cfx_gui::_on_uc_modify(const sfx_data ldata, const sfx_data rdata) {
	cfx_if::sfx_clnt_item *item = ldata;
	CString str;

	if (0 != (rdata.i & cfx_if::CMD_UCMF_STATE)) {
		_load_string(str, item->state);
		_dlg->list_con->SetItemText(item->if_data, _dlg->ccp_state(), str);
		//if (_dlg->list_con->GetSelectionMark() == item->iface_i)
		//	_dlg->set_serv_btn_state(item->state);
	}

	if (0 != (rdata.i & cfx_if::CMD_UCMF_TOTSZ)) {
		if (item->total_sz > 0xFFFFF) {
			double dval = item->total_sz / (1024*1024);
			str.Format("%.2f mb", dval);
		} else {
			double dval = item->total_sz / 1024;
			str.Format("%.2f kb", dval);
		}
		_dlg->list_con->SetItemText(item->if_data, _dlg->ccp_fsize(), str);
	}

	if (0 != (rdata.i & cfx_if::CMD_UCMF_DONSZ)) {
		double dval;
		if (0 < item->total_sz && 0 < item->done_sz)
			dval = (double(item->done_sz) / double(item->total_sz)) * 100;
		else
			dval = 0;
		str.Format("%.2f", dval);
		_dlg->list_con->SetItemText(item->if_data, _dlg->ccp_done(), str);
	}

	if (0 != (rdata.i & cfx_if::CMD_UCMF_ADDR)) {
		// fill host and address
		_dlg->list_con->SetItemText(item->if_data, _dlg->ccp_host(), item->addr.host);
		_dlg->list_con->SetItemText(item->if_data, _dlg->ccp_addr(), item->addr.addres);

		// fill port
		str.Format("%d", (int)item->addr.port);
		_dlg->list_con->SetItemText(item->if_data, _dlg->ccp_port(), str);
	}

	if (0 != (rdata.i & cfx_if::CMD_UCMF_FNAME)) {
		_dlg->list_con->SetItemText(item->if_data, _dlg->ccp_fname(), item->file_name);
	}

#ifdef REDRAW_LIST
	_dlg->list_con->RedrawWindow();
#endif
#ifdef USE_SLOW_MODE
	Sleep(SLOW_MODE_DELAY);
#endif

	return OK_OK;
}


sfx_data cfx_gui::_on_uc_kill(const sfx_data ldata, const sfx_data rdata) {
	WaitForSingleObject(_kill_mutex, INFINITE);

	cfx_if::sfx_clnt_item *item = ldata;

	// fix other indexes
	for (int i = _dlg->list_con->GetItemCount()-1; item->if_data.i < i; --i) {
		cfx_if::sfx_clnt_item *si;
		si = (cfx_if::sfx_clnt_item *)_dlg->list_con->GetItemData(i);
		--(si->if_data.i);
	}

	// stop timer
	sfx_time_hlp *thelper = item->if_time;
	_dlg->KillTimer(thelper->timer_id);
	CTimeSpan tmp = CTime::GetCurrentTime() - *thelper->st_time;
	CString str = tmp.Format("%H:%M:%S");
	str = CString("Host: ") + item->addr.host + "\n" +
		  "ip: " + item->addr.addres + "\n" +
		  "file name: " + item->file_name + "\n\n" +
		  "Operation completed for " + str;
	MessageBox(_dlg->m_hWnd, str, "fexchange: done", MB_APPLMODAL|MB_OK|MB_ICONINFORMATION);
	delete (CTime *)thelper->st_time;
	delete thelper;

	// delete it
	_dlg->list_con->DeleteItem(item->if_data);
	// _dlg->set_serv_btn_state(cfx_if::ST_SERV_LISTENING);
	--_clnt_count;

#ifdef REDRAW_LIST
	_dlg->list_con->RedrawWindow();
#endif
#ifdef USE_SLOW_MODE
	Sleep(SLOW_MODE_DELAY);
#endif

	ReleaseMutex(_kill_mutex);

	return OK_OK;
}


sfx_data cfx_gui::_on_ask_acceptic(const sfx_data ldata, const sfx_data rdata) {
	sfx_addr_info *info = ldata;
	CString str;
	str.FormatMessage(MSG_ACCEPTCON, info->host, info->addres, info->port);
	if (IDYES == MessageBox(_dlg->m_hWnd, str, "fexchange: question", MB_YESNO|MB_APPLMODAL|MB_ICONQUESTION))
		return OK_OK;

	return OK_CANCEL;
}


sfx_data cfx_gui::_on_ask_filename(const sfx_data ldata, const sfx_data rdata) {
	cfx_askfile_struct *afs = ldata;
	int *len = rdata;


	BOOL is_open_dlg;
	if (0 != (afs->flags & cfx_if::CMD_ASKFN_OPEN))
		is_open_dlg = TRUE;
	else
		is_open_dlg = FALSE;

	CString str;
	str.LoadString(RS_DLG_FILTER);

	DWORD dlg_flags = OFN_DONTADDTORECENT|OFN_NOTESTFILECREATE|
		OFN_HIDEREADONLY|OFN_ENABLESIZING|OFN_EXPLORER|OFN_NOCHANGEDIR;
	if (0 != (afs->flags & cfx_if::CMD_ASKFN_MSTEX))
		dlg_flags |= OFN_FILEMUSTEXIST;
	if (0 != (afs->flags & cfx_if::CMD_ASKFN_OVWRITE))
		dlg_flags |= OFN_OVERWRITEPROMPT;

	CFileDialog opn_dlg(is_open_dlg, NULL, afs->init_fname, dlg_flags, str, _dlg);
	if (IDOK == opn_dlg.DoModal()) {
		str = opn_dlg.GetPathName();
		*len = str.GetLength();
		if (afs->buf_sz > *len) {
			strcpy(afs->buf, str);
			return OK_OK;
		} else {
			return OK_REPEAT;
		}
	}

	return OK_CANCEL;
}



}	// end of namespace fx_ns
Соседние файлы в папке fexchange