/* WebDownloader for X-Window * Copyright (C) 1999-2002 Koshelev Maxim * This Program is free but not GPL!!! You can't modify it * without agreement with author. You can't distribute modified * program but you can distribute unmodified program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #include "socket.h" #include "liststr.h" #include "client.h" #include "socks.h" #include "var.h" #include "savedvar.h" #include "ntlocale.h" #include #include #include using namespace d4x; tWriterLoger::tWriterLoger(){}; fsize_t tWriterLoger::shift(fsize_t len){ return(shift(len,SEEK_SET)); }; tWriterLoger::~tWriterLoger(){}; int tWriterLoger::is_overlaped(){ return(0); }; void tWriterLoger::log_printf(int type,const char *fmt,...){ DBC_RETURN_IF_FAIL(fmt!=NULL); char str[MAX_LEN+1]; char *cur=str; va_list ap; va_start(ap,fmt); *cur=0; while (*fmt && cur-strhttp_recursing; change_links=src->change_links; speed=src->speed; ftp_recurse_depth=src->ftp_recurse_depth; http_recurse_depth=src->http_recurse_depth; timeout = src->timeout; time_for_sleep = src->time_for_sleep; number_of_attempts = src->number_of_attempts; passive = src->passive; dont_send_quit = src->dont_send_quit; permisions = src->permisions; get_date = src->get_date; retry = src->retry; full_server_loading=src->full_server_loading; dont_leave_dir=src->dont_leave_dir; ftp_dirontop=src->ftp_dirontop; quest_sign_replace=src->quest_sign_replace; rollback = src->rollback; follow_link = src->follow_link; leave_server = src->leave_server; sleep_before_complete = src->sleep_before_complete; check_time = src->check_time; ihate_etag = src->ihate_etag; con_limit = src->con_limit; }; d4xProxyCfg::d4xProxyCfg(){ no_cache=type=0; }; void d4xProxyCfg::copy(d4xProxyCfg *src){ type = src->type; no_cache = src->no_cache; http_port = src->http_port; http_host.set(src->http_host.get()); http_user.set(src->http_user.get()); http_pass.set(src->http_pass.get()); ftp_port = src->ftp_port; ftp_host.set(src->ftp_host.get()); ftp_user.set(src->ftp_user.get()); ftp_pass.set(src->ftp_pass.get()); }; void d4xProxyCfg::reset(){ http_user.set(NULL); http_pass.set(NULL); http_host.set(NULL); ftp_user.set(NULL); ftp_pass.set(NULL); ftp_host.set(NULL); }; /* ---------------------------------------- */ tCfg::tCfg() { speed=0; follow_link=leave_server=0; dont_leave_dir=0; sleep_before_complete=0; socks_port=0; ftp_dirontop=0; isdefault=1; con_limit=0; quest_sign_replace=0; }; int tCfg::get_flags(){ int rvalue=0; if (full_server_loading) rvalue|=1; if (retry) rvalue|=2; if (get_date) rvalue|=4; if (passive) rvalue|=8; if (permisions) rvalue|=16; return rvalue; }; void tCfg::set_flags(int what){ full_server_loading = ((what & 1)!=0); retry = ((what & 2) != 0); get_date = ((what & 4)!=0); passive = ((what & 8)!=0); permisions = ((what & 16)!=0); }; void tCfg::copy_proxy(tCfg *src){ socks_port = src->socks_port; socks_host.set(src->socks_host.get()); socks_user.set(src->socks_user.get()); socks_pass.set(src->socks_pass.get()); proxy.copy(&(src->proxy)); }; void tCfg::copy(tCfg *src) { copy_ints(src); copy_proxy(src); user_agent.set(src->user_agent.get()); cookie.set(src->cookie.get()); Filter.set(src->Filter.get()); isdefault=src->isdefault; }; void tCfg::reset_proxy() { socks_host.set(NULL); proxy.reset(); }; void tCfg::save_to_config(int fd){ f_wstr_lf(fd,"Cfg:"); if (proxy.http_host.get()){ write_named_string(fd,"Hproxy:",proxy.http_host.get()); write_named_integer(fd,"Hproxy_port:",proxy.http_port); if(proxy.http_pass.get()!=NULL && proxy.http_user.get()!=NULL){ write_named_string(fd,"Hproxy_pass:",proxy.http_pass.get()); write_named_string(fd,"Hproxy_user:",proxy.http_user.get()); }; }; if (proxy.ftp_host.get()){ write_named_string(fd,"Fproxy:",proxy.ftp_host.get()); write_named_integer(fd,"Fproxy_port:",proxy.ftp_port); if(proxy.ftp_pass.get()!=NULL && proxy.ftp_user.get()!=NULL){ write_named_string(fd,"Fproxy_pass:",proxy.ftp_pass.get()); write_named_string(fd,"Fproxy_user:",proxy.ftp_user.get()); }; write_named_integer(fd,"proxy_type:",proxy.type); }; if (socks_host.get()){ write_named_string(fd,"socks:",socks_host.get()); write_named_integer(fd,"socks_port:",socks_port); if (socks_user.get() && socks_pass.get()){ write_named_string(fd,"socks_user:",socks_user.get()); write_named_string(fd,"socks_pass:",socks_pass.get()); }; }; write_named_integer(fd,"proxy_no_cache:",proxy.no_cache); if (user_agent.get() && *(user_agent.get())) write_named_string(fd,"User_agent:",user_agent.get()); write_named_integer(fd,"Timeout:",timeout); write_named_integer(fd,"time_for_sleep:",time_for_sleep); write_named_integer(fd,"number_of_attempts:",number_of_attempts); write_named_integer(fd,"sleep_before_complete:",sleep_before_complete); write_named_integer(fd,"ftp_recurse_depth:",ftp_recurse_depth); write_named_integer(fd,"http_recurse_depth:",http_recurse_depth); write_named_integer(fd,"rollback:",rollback); write_named_integer(fd,"speed:",speed); write_named_integer(fd,"passive:",passive); write_named_integer(fd,"dont_send_quit:",dont_send_quit); write_named_integer(fd,"retry:",retry); write_named_integer(fd,"permisions:",permisions); write_named_integer(fd,"get_date:",get_date); write_named_integer(fd,"http_recursing:",http_recursing); write_named_integer(fd,"follow_link:",follow_link); write_named_integer(fd,"leave_server:",leave_server); write_named_integer(fd,"dont_leave_dir:",dont_leave_dir); write_named_integer(fd,"check_time:",check_time); write_named_integer(fd,"change_links:",change_links); write_named_integer(fd,"ftp_dirontop:",ftp_dirontop); write_named_integer(fd,"ihate_etag:",ihate_etag); write_named_integer(fd,"quest_sign_replace:",quest_sign_replace); if (con_limit) write_named_integer(fd,"con_limit:",con_limit); if (save_path.get() && *(save_path.get())) write_named_string(fd,"save_path:",save_path.get()); if (referer.get()) write_named_string(fd,"referer:",referer.get()); if (cookie.get()) write_named_string(fd,"cookie:",cookie.get()); if (log_save_path.get()) write_named_string(fd,"log_save_path:",log_save_path.get()); if (Filter.get()) write_named_string(fd,"Filter:",Filter.get()); f_wstr_lf(fd,"EndCfg:"); }; int tCfg::load_from_config(int fd){ tSavedVar table_of_fields[]={ {"User_agent:", SV_TYPE_PSTR, &user_agent}, {"Hproxy:", SV_TYPE_PSTR, &proxy.http_host}, {"Hproxy_pass:", SV_TYPE_PSTR, &proxy.http_pass}, {"Hproxy_user:", SV_TYPE_PSTR, &proxy.http_user}, {"Hproxy_port:", SV_TYPE_INT, &proxy.http_port}, {"proxy_type:", SV_TYPE_INT, &proxy.type}, {"Fproxy:", SV_TYPE_PSTR, &proxy.ftp_host}, {"Fproxy_pass:", SV_TYPE_PSTR, &proxy.ftp_pass}, {"Fproxy_user:", SV_TYPE_PSTR, &proxy.ftp_user}, {"Fproxy_port:", SV_TYPE_INT, &proxy.ftp_port}, {"socks:", SV_TYPE_PSTR, &socks_host}, {"socks_pass:", SV_TYPE_PSTR, &socks_pass}, {"socks_user:", SV_TYPE_PSTR, &socks_user}, {"socks_port:", SV_TYPE_INT, &socks_port}, {"timeout:", SV_TYPE_INT, &timeout}, {"time_for_sleep:",SV_TYPE_INT, &time_for_sleep}, {"sleep_before_complete:",SV_TYPE_INT, &sleep_before_complete}, {"number_of_attempts:",SV_TYPE_INT,&number_of_attempts}, {"ftp_recurse_depth:",SV_TYPE_INT,&ftp_recurse_depth}, {"http_recurse_depth:",SV_TYPE_INT,&http_recurse_depth}, {"rollback:", SV_TYPE_LINT, &rollback}, {"speed:", SV_TYPE_INT, &speed}, {"passive:", SV_TYPE_INT, &passive}, {"dont_send_quit:", SV_TYPE_INT, &dont_send_quit}, {"retry:", SV_TYPE_INT, &retry}, {"permisions:", SV_TYPE_INT, &permisions}, {"get_date:", SV_TYPE_INT, &get_date}, {"http_recursing:",SV_TYPE_INT, &http_recursing}, {"follow_link:",SV_TYPE_INT, &follow_link}, {"leave_server:",SV_TYPE_INT, &leave_server}, {"ihate_etag:", SV_TYPE_INT, &ihate_etag}, {"quest_sign_replace:", SV_TYPE_INT, &quest_sign_replace}, {"save_path:", SV_TYPE_PSTR, &save_path}, {"dont_leave_dir:",SV_TYPE_INT, &dont_leave_dir}, {"referer:", SV_TYPE_PSTR, &referer}, {"cookie:", SV_TYPE_PSTR, &cookie}, {"proxy_no_cache:",SV_TYPE_INT, &proxy.no_cache}, {"EndCfg:", SV_TYPE_END, NULL}, {"check_time:", SV_TYPE_INT, &check_time}, {"change_links:",SV_TYPE_INT, &change_links}, {"con_limit:", SV_TYPE_INT, &con_limit}, {"ftp_dirontop:",SV_TYPE_INT,&ftp_dirontop}, {"log_save_path:",SV_TYPE_PSTR, &log_save_path}, {"Filter:", SV_TYPE_PSTR, &(Filter)} }; char buf[MAX_LEN]; while(f_rstr(fd,buf,MAX_LEN)>0){ unsigned int i; for (i=0;isocks_host.get() && cfg->socks_port){ CtrlSocket.reset(new tSocksSocket(cfg->socks_host.get(), cfg->socks_port, cfg->socks_user.get(), cfg->socks_pass.get()) ); }else CtrlSocket.reset(new tSocket); }; }; tClient::~tClient(){ if (buffer) delete[] buffer; }; void tClient::init(const std::string &host,tWriterLoger *log,int prt,int time_out) { DBC_RETURN_IF_FAIL(log!=NULL); Status=0; LOG=log; port=prt; hostname=host; FileLoaded=0; timeout=time_out; }; fsize_t tClient::read_data(fsize_t len) { FillSize=read_data(buffer,len); if (FillSize<0) return RVALUE_TIMEOUT; DSize+=FillSize; return FillSize; }; int tClient::test_reget() { return ReGet; }; fsize_t tClient::get_readed() { return FileLoaded; }; int tClient::read_string(SocketPtr sock,tStringList *list,fsize_t maxlen) { DBC_RETVAL_IF_FAIL(list!=NULL,0); int rvalue; char temp[maxlen+1]; char *cur=temp; do { *cur=0; int err=sock->rec_string(cur,1,timeout); if ((rvalue=socket_err_handler(err))) return(rvalue); if (err==0 && temp==cur) return RVALUE_COMPLETED; } while(cur-tempadd(temp); return RVALUE_OK; }; char *tClient::read_string(SocketPtr sock,fsize_t maxlen) { char temp[maxlen+1]; char *cur=temp; do { *cur=0; int err=sock->rec_string(cur,1,timeout); if (socket_err_handler(err)) return(NULL); if (err==0 && temp==cur) return NULL; } while(cur-templog(LOG_ERROR,_("Timeout while reading from socket!")); return RVALUE_TIMEOUT; }; if (err<0) { Status=STATUS_TRIVIAL; LOG->log(LOG_ERROR,_("Error while reading from socket!")); return RVALUE_TIMEOUT; }; return RVALUE_OK; }; int tClient::reinit() { Status=0; int err=-1; LOG->log_printf(LOG_OK,_("Trying to connect to %s:%i..."),hostname.c_str(),port); if ((err=CtrlSocket->open_port(hostname.c_str(),port))==0) { LOG->log(LOG_WARNING,_("Socket was opened!")); return RVALUE_OK; }; switch (err) { case SOCKET_UNKNOWN_HOST:{ LOG->log(LOG_ERROR,_("Host not found!")); Status=STATUS_FATAL; break; }; case SOCKET_CANT_ALLOCATE:{ LOG->log(LOG_ERROR,_("Can't allocate socket")); Status=STATUS_FATAL; break; }; case SOCKET_CANT_CONNECT:{ LOG->log(LOG_ERROR,_("Can't connect")); Status=STATUS_TRIVIAL; break; }; }; return RVALUE_TIMEOUT; }; int tClient::write_buffer() { return (FillSize-LOG->write(buffer,FillSize)); }; int tClient::get_status() { return Status; }; SocketPtr tClient::export_ctrl_socket(){ SocketPtr tmp=CtrlSocket; CtrlSocket.reset(); return(tmp); }; void tClient::import_ctrl_socket(SocketPtr s){ CtrlSocket=s; }; //**************************************************/