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