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

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

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


////////////////////////////////////////////////////////////////////////////////
// program specific headers
#include "fx_core.h"


namespace fx_ns {

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

////////////////////////////////////////////////////////////////////////////////
// cfx_iface (public definitions)
int cfx_if::attach_core(cfx_core *const core) {
	_set_core(core);
	_core->set_iface(this);
	return OK_OK;
}


int cfx_if::detach_core() {
	_core->set_iface(NULL);
	_set_core(NULL);
	return OK_OK;
}


sfx_data cfx_if::cmd_to_core(const int cmd, const sfx_data ldata, const sfx_data rdata) {
	if (NULL != _core)
		return _core->execute_cmd(cmd, ldata, rdata);
	else
		return ERC_CORE_BADCMD;
}



////////////////////////////////////////////////////////////////////////////////
// cfx_core (public definitions)
cfx_core::cfx_core() {
	_last_error = ERC_NOERROR;
	_sitems = NULL;
	_citems = NULL;
	_mx_fn_sz = _def_mx_fn_sz;
	_iface = NULL;

	int res = WSAStartup(version_required(), &_wsa_data); 
	if (0 != res) _last_error = ERC_WSAFAILED;
}


cfx_core::~cfx_core() {
	// delete servers
	for (sfx_sitem *sitem = _sitems; NULL != sitem;) {
		cmd_to_iface(cfx_if::CMD_US_KILL, sitem, NULL);
		sfx_sitem *victim = sitem;
		sitem = sitem->next;
		victim->server->kill();
		_del_sitem(victim);
	}
	// delete clients
	for (sfx_citem *citem = _citems; NULL != citem;) {
		cmd_to_iface(cfx_if::CMD_UC_KILL, citem, NULL);
		sfx_citem *victim = citem;
		citem = citem->next;
		victim->client->kill();
		_del_citem(victim);
	}

	if (0 != WSACleanup()) {
		// some error
		// TODO: normal error handler
		// but wtf? no one will know about it, anyway ;)
	}
}


sfx_data cfx_core::execute_cmd(const int cmd, const sfx_data ldata, const sfx_data rdata) {
	switch (cmd) {
		case cfx_if::CCMD_NONE:
			return OK_OK;

		case cfx_if::CCMD_INVALID_CMD:
			return ERC_NO_CMDSUPPORT;
			
		case cfx_if::CCMD_CRSERV:
			return _on_cmd_crserv(ldata, rdata);

		case cfx_if::CCMD_RUNSERV:
			return _on_cmd_runserv(ldata, rdata);

		case cfx_if::CCMD_STOPSERV:
			return _on_cmd_stopserv(ldata, rdata);

		case cfx_if::CCMD_KILLSERV:
			return _on_cmd_killserv(ldata, rdata);

		case cfx_if::CCMD_SENDFILE:
			return _on_cmd_sendfile(ldata, rdata);

		default:
			return ERC_CORE_BADCMD;
	}
	return ERC_ERROR;	// dummy return
}


int cfx_core::create_server(cfx_if::sfx_serv_item **pitem, const char *const addr,
				const unsigned short port, const bool do_run)
{
	cfx_server *serv = new cfx_server;
	sfx_sitem *item = _new_sitem(serv);
	item->state = cfx_if::ST_SERV_CREATING;
	_iface->exec_cmd(cfx_if::CMD_US_NEW, item, NULL);

	int res = serv->create();
	if (OK_OK != res) goto error_label;

	item->state = cfx_if::ST_SERV_BINDING;
	_iface->exec_cmd(cfx_if::CMD_US_MODIFY, item, cfx_if::CMD_USMF_STATE);
	res = serv->bind(addr, port);
	if (OK_OK != res) goto error_label;

	item->state = cfx_if::ST_SERV_RESOLVING;
	_iface->exec_cmd(cfx_if::CMD_US_MODIFY, item, cfx_if::CMD_USMF_STATE);
	_set_addr_info(serv->saddr_in(), &item->addr);
	if (pitem != NULL) *pitem = item;

	item->state = cfx_if::ST_SERV_CREATING;
	_iface->exec_cmd(cfx_if::CMD_US_MODIFY, item, cfx_if::CMD_USMF_STATE|cfx_if::CMD_USMF_ADDR);
	serv->set_ext_id(item);
	serv->set_owner(this);
	serv->set_ev_handler((tfx_socket_event)_on_server_event);

	item->state = cfx_if::ST_SERV_STOPED;
	_iface->exec_cmd(cfx_if::CMD_US_MODIFY, item, cfx_if::CMD_USMF_STATE);

	if (do_run) return run_server(item);
	return OK_OK;

error_label:
	int ler = serv->last_error();
	ler = _error_msg(res, ler);
	item->state = cfx_if::ST_SERV_KILLING;
	_iface->exec_cmd(cfx_if::CMD_US_MODIFY, item, cfx_if::CMD_USMF_STATE);

	delete serv;
	item->state = cfx_if::ST_SERV_KILLED;
	_iface->exec_cmd(cfx_if::CMD_US_KILL, item, NULL);
	_del_sitem(item);
	return ler;

}


int cfx_core::stop_server(cfx_if::sfx_serv_item *const item) {
	if (cfx_if::ST_SERV_LISTENING != item->state)
		return _error_msg(ERC_CORE_SRVNRUNING2S);

	item->state = cfx_if::ST_SERV_STOPING;
	_iface->exec_cmd(cfx_if::CMD_US_MODIFY, item, cfx_if::CMD_USMF_STATE);

	sfx_sitem *sitem = (sfx_sitem *)item;
	int res = sitem->server->stop();
	if (OK_OK != res)
		return _error_msg(res, sitem->server->last_error());

	return OK_OK;
}


int cfx_core::run_server(cfx_if::sfx_serv_item *const item) {
	if (cfx_if::ST_SERV_STOPED != item->state)
		return _error_msg(ERC_CORE_SRVNSTOPED2R);

	item->state = cfx_if::ST_SERV_STARTLSTN;
	_iface->exec_cmd(cfx_if::CMD_US_MODIFY, item, cfx_if::CMD_USMF_STATE);

	sfx_sitem *sitem =  (sfx_sitem *)item;
	int res = sitem->server->run();
	if (OK_OK != res) {
		res = _error_msg(res, sitem->server->last_error());
		item->state = cfx_if::ST_SERV_STOPED;
		_iface->exec_cmd(cfx_if::CMD_US_MODIFY, item, cfx_if::CMD_USMF_STATE);
		return res;
	}

	return OK_OK;
}


int cfx_core::kill_server(cfx_if::sfx_serv_item *const item) {
	item->state = cfx_if::ST_SERV_KILLING;
	_iface->exec_cmd(cfx_if::CMD_US_MODIFY, item, cfx_if::CMD_USMF_STATE);

	//TODO: item->server->kill(true);
	sfx_sitem *sitem =  (sfx_sitem *)item;
	sitem->server->kill(true);
	item->state = cfx_if::ST_SERV_KILLED;
	_iface->exec_cmd(cfx_if::CMD_US_KILL, item, NULL);
	_del_sitem(sitem);
	
	return OK_OK;
}


int cfx_core::send_file(char *const fname, char *const addr, const unsigned short port) {
	cfx_client *client = new cfx_client(this, (tfx_socket_event)_on_client_event);
	sfx_citem *item = _new_citem(client);
	client->set_ext_id(item);
	client->set_owner(this);
	item->state = cfx_if::ST_SERV_CREATING;
	item->addr.addres = addr;
	item->addr.port = port;
	item->file_name = fname;
	_iface->exec_cmd(cfx_if::CMD_UC_NEW, item, NULL);
	item->addr.addres = NULL;

	int res = client->create();
	if (OK_OK != res) goto error_label;

	item->state = cfx_if::ST_CLNT_CONNECTING;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item, cfx_if::CMD_UCMF_STATE);
	res = client->connect(addr, port);
	if (OK_OK != res) goto error_label;

	res = _set_addr_info(client->saddr_in(), &item->addr);
	if (OK_OK != res) goto error_label;

	int len = (int)strlen(fname) + 1;
	char *filename = new char[len];
	memcpy(filename, fname, len);
	item->file_name = filename;

	item->state = cfx_if::ST_CLNT_CONNECTED;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item,
		cfx_if::CMD_UCMF_STATE|cfx_if::CMD_UCMF_ADDR|cfx_if::CMD_UCMF_FNAME);

	res = client->send_file(filename);

	return OK_OK;

error_label:
	int ler = client->last_error();
	ler = _error_msg(res, ler);
	item->state = cfx_if::ST_CLNT_KILLING;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item, cfx_if::CMD_UCMF_STATE);

	delete client;
	item->state = cfx_if::ST_CLNT_KILLED;
	_iface->exec_cmd(cfx_if::CMD_UC_KILL, item, NULL);
	item->file_name = NULL;
	_del_citem(item);
	return ler;

}


int cfx_core::exit() {
	return OK_OK;
}


////////////////////////////////////////////////////////////////////////////////
// cfx_core (protected definitions)
cfx_core::sfx_sitem *cfx_core::_new_sitem(cfx_server *const server) {
	sfx_sitem *item = new sfx_sitem;
	// add to _sitems
	if (NULL != _sitems) _sitems->prev = item;
	item->next = _sitems;
	item->prev = NULL;
	_sitems = item;
	// init
	item->core = this;
	item->server = server;
	item->state = cfx_if::ST_SERV_NONE;
	item->addr.addres = NULL;
	item->addr.host = NULL;
	item->addr.port = 0;
	item->addr.family = AF_INET;

	return item;
}


void cfx_core::_del_sitem(sfx_sitem *const item) {
	if (NULL != item->prev) {
		item->prev->next = item->next;
	} else _sitems = item->next;
	if (NULL != item->next) {
		item->next->prev = item->prev;
	}

	_free_addr_info(&item->addr);
	delete item;
}


cfx_core::sfx_citem *cfx_core::_new_citem(cfx_client *const client)
{
	sfx_citem *item = new sfx_citem;
	// add to _clients
	if (NULL != _citems) _citems->prev = item;
	item->next = _citems;
	item->prev = NULL;
	_citems = item;
	// init
	item->core = this;
	item->client = client;
	item->state = cfx_if::ST_CLNT_NONE;
	item->addr.addres = NULL;
	item->addr.host = NULL;
	item->addr.port = 0;
	item->addr.family = AF_INET;
	item->file_name = NULL;
	item->total_sz = 0;
	item->done_sz = 0;

	return item;
}


void cfx_core::_del_citem(sfx_citem *const item) {
	if (NULL != item->prev) {
		item->prev->next = item->next;
	} else _citems = item->next;
	if (NULL != item->next) {
		item->next->prev = item->prev;
	}

	if (NULL != item->file_name)
		delete item->file_name;

	_free_addr_info(&item->addr);
	delete item;
}


int cfx_core::_set_addr_info(const sockaddr_in *const addrin, cfx_if::sfx_addr_info *const ainfo) {
	// port and protocol family
	ainfo->family = addrin->sin_family;
	ainfo->port = ntohs(addrin->sin_port);

	// ip address
	char *ip = inet_ntoa(addrin->sin_addr);
	if (NULL == ip) {
		ainfo->addres = NULL;
		_wsa_error(ERC_ERROR);
	} else {
		int len = (int)strlen(ip) + 1;
		ainfo->addres = new char[len];
		memcpy(ainfo->addres, ip, len);
	}

	// try to resolve host
	hostent *host = gethostbyaddr((char *)&addrin->sin_addr,
				sizeof(addrin->sin_addr), addrin->sin_family);
	if (NULL == host) {
		ainfo->host = NULL;
		_wsa_error(ERC_ERROR);
	} else {
		int len = (int)strlen(host->h_name) + 1;
		ainfo->host = new char[len];
		memcpy(ainfo->host, host->h_name, len);
	}

	return OK_OK;
}


void cfx_core::_free_addr_info(cfx_if::sfx_addr_info *const ainfo) {
	if (NULL != ainfo->host) {
		delete[] ainfo->host;
		ainfo->host = NULL;
	}
	if (NULL != ainfo->addres) {
		delete[] ainfo->addres;
		ainfo->addres = NULL;
	}
}


int cfx_core::_error_msg(const int er_id, const int er_code, void *const rdata) {
	_iface->exec_cmd(cfx_if::CMD_ERROR_REPORT, er_id, er_code);

	return (_last_error = er_code);
}


int cfx_core::_on_server_event(const int event, cfx_server *const caller, void *const data) {
	cfx_core *core = (cfx_core *)caller->owner();

	switch (event) {
		case cfx_server::EV_ERROR:
			core->_error_msg(TO_INT(data), caller->last_error());
			return OK_OK;

		case cfx_server::EV_LISTENING:
			return core->_on_ev_listening(caller, data);

		case cfx_server::EV_ACCEPTING:
			return core->_on_ev_accepting(caller, data);

		case cfx_server::EV_ACCEPTED:
			return core->_on_ev_accepted(caller, data);

		case cfx_server::EV_STOPPING:
			return core->_on_ev_stoppings(caller, data);

		case cfx_server::EV_STOPED:
			return core->_on_ev_stopeds(caller, data);

		default:
			return ERC_NOTHANDLED;
	}

	return ERC_ERROR;	// dummy return
}


int cfx_core::_on_client_event(const int event, cfx_client *const caller, void *const data) {
	cfx_core *core = (cfx_core *)caller->owner();

	switch (event) {
		case cfx_client::EV_ERROR:
			core->_error_msg(TO_INT(data), caller->last_error());
			return OK_OK;

		case cfx_client::EV_SENDING_INFO:
			return core->_on_ev_sending_info(caller, data);

		case cfx_client::EV_SENT_INFO:
			return core->_on_ev_sent_info(caller, data);

		case cfx_client::EV_SENDING_DATA:
			return core->_on_ev_sending_data(caller, data);

		case cfx_client::EV_SENT_DATA:
			return core->_on_ev_sent_data(caller, data);

		case cfx_client::EV_SEND_END:
			return core->_on_ev_send_end(caller, data);

		case cfx_client::EV_SEND_DONE:
			return core->_on_ev_send_done(caller, data);

		case cfx_client::EV_WAITING4DATA:
			return core->_on_ev_waiting4data(caller, data);

		case cfx_client::EV_RECVING_INFO:
			return core->_on_ev_recving_info(caller, data);

		case cfx_client::EV_RECVED_INFO:
			return core->_on_ev_recved_info(caller, data);

		case cfx_client::EV_RECVING_DATA:
			return core->_on_ev_recving_data(caller, data);

		case cfx_client::EV_RECVED_DATA:
			return core->_on_ev_recved_data(caller, data);

		case cfx_client::EV_RECV_END:
			return core->_on_ev_recv_end(caller, data);

		case cfx_client::EV_RECV_DONE:
			return core->_on_ev_recv_done(caller, data);

		case cfx_client::EV_KILLING:
			return core->_on_ev_killingc(caller, data);

		case cfx_client::EV_KILLED:
			return core->_on_ev_killedc(caller, data);

		case cfx_client::EV_NEED_FILE2W:
			return core->_on_ev_need_file2w(caller, data);

		default:
			return ERC_NOTHANDLED;
	}

	return ERC_ERROR;	// dummy return
}


int cfx_core::_on_ev_listening(cfx_server *const caller, void *const data) {
	sfx_sitem *item = (sfx_sitem *)caller->ext_id();
	item->state = cfx_if::ST_SERV_LISTENING;
	_iface->exec_cmd(cfx_if::CMD_US_MODIFY, item, cfx_if::CMD_USMF_STATE);
	return OK_OK;
}


int cfx_core::_on_ev_accepting(cfx_server *const caller, void *const data) {
	sfx_sitem *item = (sfx_sitem *)caller->ext_id();
	cfx_server::sfx_accept_struct *acst = (cfx_server::sfx_accept_struct *)data;

    item->state = cfx_if::ST_SERV_ACCEPTING;
	_iface->exec_cmd(cfx_if::CMD_US_MODIFY,
				item, cfx_if::CMD_USMF_STATE);

	cfx_if::sfx_addr_info info;
	_set_addr_info(&acst->addr, &info);
	int res = _iface->exec_cmd(cfx_if::CMD_ASK_ACCEPTIC, &info, NULL);
	_free_addr_info(&info);

	return res;
}


int cfx_core::_on_ev_accepted(cfx_server *const caller, void *const data) {
	cfx_client *client = (cfx_client *)data;
	sfx_citem *item = _new_citem(client);
	item->state = cfx_if::ST_CLNT_CREATING;
	_iface->exec_cmd(cfx_if::CMD_UC_NEW, item, NULL);

	_set_addr_info(client->saddr_in(), &item->addr);
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item, cfx_if::CMD_UCMF_ADDR);

	client->set_ext_id(item);
	client->set_owner(this);
	client->set_ev_handler((tfx_socket_event)_on_client_event);
	int res = client->recv_file();
	if (OK_OK != res) {
		_free_addr_info(&item->addr);
		_del_citem(item);
		return _error_msg(res, client->last_error());
	}

	return OK_OK;
}


int cfx_core::_on_ev_stoppings(cfx_server *const caller, void *const data) {
	// int erc = TO_INT(data);
	// if (cfx_server::EV_STR_USER != erc && cfx_server::EV_STR_NORM != erc) {
		// _error_msg(erc, caller->last_error());
	// }
	sfx_sitem *item = (sfx_sitem *)caller->ext_id();
	if (cfx_if::ST_SERV_STOPING != item->state && cfx_if::ST_SERV_KILLING != item->state) {
		item->state = cfx_if::ST_SERV_STOPING;
		_iface->exec_cmd(cfx_if::CMD_US_MODIFY, item, cfx_if::CMD_USMF_STATE);
	}

	return OK_OK;
}


int cfx_core::_on_ev_stopeds(cfx_server *const caller, void *const data) {
	sfx_sitem *item = (sfx_sitem *)caller->ext_id();
	if (cfx_if::ST_SERV_KILLING != item->state) {
		item->state = cfx_if::ST_SERV_STOPED;
		_iface->exec_cmd(cfx_if::CMD_US_MODIFY, item, cfx_if::CMD_USMF_STATE);
	}

	return OK_OK;
}


int cfx_core::_on_ev_need_file2w(cfx_client *const caller, void *const data) {
	cfx_client::sfx_file_info *finfo = (cfx_client::sfx_file_info *)data;
	cfx_if::cfx_askfile_struct afs;
	afs.init_fname = NULL;
	afs.flags = cfx_if::CMD_ASKFN_OVWRITE;
	afs.buf_sz = _def_mx_fn_sz;
	for(;;) {
		afs.buf = new char[afs.buf_sz];
		int len;
		int res = cmd_to_iface(cfx_if::CMD_ASK_FILENAME, &afs, &len);
		if (OK_REPEAT != res) break;

		afs.buf_sz *= 2;
		if (afs.buf_sz < len) afs.buf_sz += len;
		delete[] afs.buf;
		afs.buf = new char[afs.buf_sz];
	}
	finfo->filename = afs.buf;

	return OK_OK;
}


int cfx_core::_on_ev_sending_info(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();
	item->state = cfx_if::ST_CLNT_SENDINGH;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item, cfx_if::CMD_UCMF_STATE);

	return OK_OK;
}


int cfx_core::_on_ev_sent_info(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();
	cfx_client::sfx_file_info *info = (cfx_client::sfx_file_info *)data;

	item->done_sz = info->done_sz;
	item->total_sz = info->total_sz;

	item->state = cfx_if::ST_CLNT_SENDINGH;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item,
		cfx_if::CMD_UCMF_STATE|cfx_if::CMD_UCMF_TOTSZ|cfx_if::CMD_UCMF_DONSZ);

	return OK_OK;
}


int cfx_core::_on_ev_sending_data(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();
	cfx_client::sfx_file_info *info = (cfx_client::sfx_file_info *)data;

	item->done_sz = info->done_sz;
	item->total_sz = info->total_sz;

	item->state = cfx_if::ST_CLNT_SENDINGD;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item,
		cfx_if::CMD_UCMF_STATE|cfx_if::CMD_UCMF_TOTSZ|cfx_if::CMD_UCMF_DONSZ);

	return OK_OK;
}


int cfx_core::_on_ev_sent_data(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();
	cfx_client::sfx_file_info *info = (cfx_client::sfx_file_info *)data;

	item->done_sz = info->done_sz;
	item->total_sz = info->total_sz;

	item->state = cfx_if::ST_CLNT_SENDINGD;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item, cfx_if::CMD_UCMF_DONSZ);

	return OK_OK;
}


int cfx_core::_on_ev_send_end(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();
	cfx_client::sfx_file_info *info = (cfx_client::sfx_file_info *)data;

	item->done_sz = info->done_sz;
	item->total_sz = info->total_sz;

	item->state = cfx_if::ST_CLNT_SENDEND;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item,
		cfx_if::CMD_UCMF_STATE|cfx_if::CMD_UCMF_TOTSZ|cfx_if::CMD_UCMF_DONSZ);

	return OK_OK;
}


int cfx_core::_on_ev_send_done(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();
	cfx_client::sfx_file_info *info = (cfx_client::sfx_file_info *)data;

	item->done_sz = info->done_sz;
	item->total_sz = info->total_sz;

	item->state = cfx_if::ST_CLNT_SENDDONE;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item,
		cfx_if::CMD_UCMF_STATE|cfx_if::CMD_UCMF_TOTSZ|cfx_if::CMD_UCMF_DONSZ);

	return OK_OK;
}


int cfx_core::_on_ev_killingc(cfx_client *const caller, void *const data) {
	int code = TO_INT(data);
	if (OK_OK != code) _error_msg(code, caller->last_error());

	sfx_citem *item = (sfx_citem *)caller->ext_id();
	item->state = cfx_if::ST_CLNT_KILLING;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item, cfx_if::CMD_UCMF_STATE);

	return OK_OK;
}


int cfx_core::_on_ev_killedc(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();

	delete caller;
	item->state = cfx_if::ST_CLNT_KILLED;
	_iface->exec_cmd(cfx_if::CMD_UC_KILL, item, NULL);

	_del_citem(item);

	return OK_OK;
}


int cfx_core::_on_ev_waiting4data(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();
	item->state = cfx_if::ST_CLNT_WAIT4DATA;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item, cfx_if::CMD_UCMF_STATE);

	return OK_OK;
}


int cfx_core::_on_ev_recving_info(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();
	item->state = cfx_if::ST_CLNT_RECVINGH;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item, cfx_if::CMD_UCMF_STATE);
	return OK_OK;
}


int cfx_core::_on_ev_recved_info(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();
	cfx_client::sfx_file_info *info = (cfx_client::sfx_file_info *)data;

	item->done_sz = info->done_sz;
	item->total_sz = info->total_sz;
	item->file_name = info->filename;

	item->state = cfx_if::ST_CLNT_RECVINGH;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item,
		cfx_if::CMD_UCMF_STATE|cfx_if::CMD_UCMF_TOTSZ|cfx_if::CMD_UCMF_DONSZ|cfx_if::CMD_UCMF_FNAME);

	return OK_OK;
}


int cfx_core::_on_ev_recving_data(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();
	cfx_client::sfx_file_info *info = (cfx_client::sfx_file_info *)data;

	item->done_sz = info->done_sz;
	item->total_sz = info->total_sz;
	item->file_name = info->filename;

	item->state = cfx_if::ST_CLNT_RECVINGD;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item,
		cfx_if::CMD_UCMF_STATE|cfx_if::CMD_UCMF_TOTSZ|cfx_if::CMD_UCMF_DONSZ|cfx_if::CMD_UCMF_FNAME);

	return OK_OK;
}


int cfx_core::_on_ev_recved_data(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();
	cfx_client::sfx_file_info *info = (cfx_client::sfx_file_info *)data;

	item->done_sz = info->done_sz;

	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item, cfx_if::CMD_UCMF_DONSZ);

	return OK_OK;
}


int cfx_core::_on_ev_recv_end(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();
	cfx_client::sfx_file_info *info = (cfx_client::sfx_file_info *)data;

	item->done_sz = info->done_sz;
	item->total_sz = info->total_sz;

	item->state = cfx_if::ST_CLNT_RECVEND;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item,
		cfx_if::CMD_UCMF_STATE|cfx_if::CMD_UCMF_TOTSZ|cfx_if::CMD_UCMF_DONSZ);

	return OK_OK;
}


int cfx_core::_on_ev_recv_done(cfx_client *const caller, void *const data) {
	sfx_citem *item = (sfx_citem *)caller->ext_id();
	cfx_client::sfx_file_info *info = (cfx_client::sfx_file_info *)data;

	item->done_sz = info->done_sz;
	item->total_sz = info->total_sz;

	item->state = cfx_if::ST_CLNT_RECVDONE;
	_iface->exec_cmd(cfx_if::CMD_UC_MODIFY, item,
		cfx_if::CMD_UCMF_STATE|cfx_if::CMD_UCMF_TOTSZ|cfx_if::CMD_UCMF_DONSZ);

	return OK_OK;
}


sfx_data cfx_core::_on_cmd_crserv(const sfx_data ldata, const sfx_data rdata) {
	cfx_if::sfx_crserv_info *info = ldata;
	return create_server(NULL, info->address, info->port);
}


sfx_data cfx_core::_on_cmd_runserv(const sfx_data ldata, const sfx_data rdata) {
	cfx_if::sfx_serv_item *item = ldata;
	return run_server(item);
}


sfx_data cfx_core::_on_cmd_stopserv(const sfx_data ldata, const sfx_data rdata) {
	cfx_if::sfx_serv_item *item = ldata;
	return stop_server(item);
}


sfx_data cfx_core::_on_cmd_killserv(const sfx_data ldata, const sfx_data rdata) {
	cfx_if::sfx_serv_item *item = ldata;
	return kill_server(item);
}


sfx_data cfx_core::_on_cmd_sendfile(const sfx_data ldata, const sfx_data rdata) {
	cfx_if::sfx_sndfile_info *info = ldata;
	return send_file(info->file_name, info->address, info->port);
}

/*
int cfx_core::_on_continue_listen(sfx_serv_item *const cb_id, void *const data) {
	cb_id->serv_info.state = cfx_if::ST_SERV_LISTENING;
	cb_id->core->_iface->update_servers(cfx_if::EV_SERV_STATE, &cb_id->serv_info);
	return OK_OK;
}


int cfx_core::_on_accepting(sfx_serv_item *const cb_id, void *const data) {
	cfx_server::sfx_accept_struct *acs = (cfx_server::sfx_accept_struct *)data;
	cb_id->serv_info.state = cfx_if::ST_SERV_ACCEPTING;
	cb_id->core->_iface->update_servers(cfx_if::EV_SERV_STATE, &cb_id->serv_info);

	if (OK_OK != cb_id->core->_iface->ask_for_accept(acs)) return OK_CANCEL;
	cb_id->core->_iface->ask_file_name(NULL, 0);
	//FILE *f = fopen("c:/fx_out.txt", "wb");

	return OK_OK;
}


int cfx_core::_on_uploaded(sfx_serv_item *const cb_id, void *const data) {
	fclose((FILE *)data);
	return 0;
}


int cfx_core::_on_stoped(sfx_server_item *const cb_id, void *const data) {
	if ((void *)OK_OK != data) {
		cb_id->core->_serror(*((int *)&data));
	}
	cb_id->serv_info.state = cfx_if::ST_SERV_STOPED;
	cb_id->core->_iface->update_servers(cfx_if::EV_SERV_STATE, &cb_id->serv_info);
	return OK_OK;
}
*/



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