Patch level : 12.00 1402

Files correlati     : ve01.exe

Commento                :
Corretta abilitazione CIG CUP
This commit is contained in:
Alessandro Bonazzi 2026-01-15 00:11:47 +01:00
parent 326a4d3401
commit c83b9320ae
2 changed files with 582 additions and 115 deletions

View File

@ -1491,6 +1491,241 @@ void xvt_font_unmap(XVT_FNTID font_id)
font.SetWin(NULL_WIN);
}
///////////////////////////////////////////////////////////
// HTTP
///////////////////////////////////////////////////////////
static char * protocols[] = { "ftp", "http", "https", nullptr };
BOOLEAN xvt_is_network_protocol(const char *protocol)
{
if (protocol != nullptr)
for (int i = 0; protocols[i] != nullptr; i++)
if (strcmp(protocol, protocols[i]) == 0)
return true;
return false;
}
static int xvt_sys_timeout(const char* server)
{
wxString var = _T("Timeout[");
var += server;
var += "]";
int timeout = xvt_sys_get_profile_int(xvt_fsys_get_campo_ini(), var, "Timeout", -1);
if (timeout < 0)
timeout = xvt_sys_get_profile_int(xvt_fsys_get_campo_ini(), "Server", "Timeout", 120);
return timeout;
}
static void xvt_sys_proxy(wxString & proxy)
{
xvt_sys_get_profile_string(xvt_fsys_get_campo_ini(), "Server", "Proxy", "",
proxy.GetWriteBuf(MAX_PATH), MAX_PATH);
proxy.UngetWriteBuf();
}
static int decode_result(wxString & resfile, char * &result)
{
wxString strResult;
wxFileInputStream res(resfile);
while (!res.Eof())
strResult += res.GetC();
strResult = strResult.AfterFirst(_T(' '));
int rescode = atoi(strResult.Left(3));
int pos = strResult.Find("<html>");
strResult = strResult.Mid(pos + 7);
pos = strResult.Find("</html>");
if (pos >= 0)
strResult = strResult.Left(pos);
result = _strdup(strResult);
return rescode;
}
static BOOLEAN is_ftp(const char* file) // @parm ritorna se file è un direttorio di cui controllare l'esistenza
{
return file && *file && strncmp(file, "ftp:", 4) == 0;
}
static BOOLEAN is_http(const char* file) // @parm ritorna se file è un direttorio di cui controllare l'esistenza
{
return file && *file && (strncmp(file, "http:", 5) == 0 || strncmp(file, "https:", 6) == 0);
}
static BOOLEAN is_https(const char* file) // @parm ritorna se file è un direttorio di cui controllare l'esistenza
{
return file && *file && strncmp(file, "https:", 6) == 0;
}
static BOOLEAN is_remote(const char* file)
{
return is_ftp(file) || is_http(file);
}
static BOOLEAN is_local(const char* file)
{
return !is_remote(file);
}
int xvt_http_get(const char *remote, const char * local, const char * user, const char * password)
{
wxString tempresult = wxFileName::CreateTempFileName("res");
wxString command = _T("./curl -i ");
wxString proxy;
if (user != nullptr)
{
command += _T("-u ");
command += user;
command += _T(":");
if (password != nullptr)
command += password;
command += _T(" ");
}
xvt_sys_proxy(proxy);
if (!proxy.IsEmpty())
{
command += _T("-x ");
command += proxy;
command += _T(" ");
}
command += _T("-o ");
command += tempresult;
command += _T(" ");
command += remote;
wxArrayString r;
long retcode = wxExecute(command, r, wxEXEC_SYNC);
int rescode = -1;
if (retcode == 0)
{
char *result;
rescode = decode_result(tempresult, result);
wxFileOutputStream out(local);
out.Write(result, strlen(result));
delete result;
}
wxRemoveFile(tempresult);
return rescode;
}
int xvt_http_post(const char *remote, const char * result, const char * content_type,
const char * request, const char * user, const char * password)
{
wxString command = _T("./curl -i ");
wxString tempresult = wxFileName::CreateTempFileName("res");
wxArrayString res;
wxString proxy;
command += _T("-X POST ");
command += remote;
command += _T(" ");
if (user != nullptr)
{
command += _T("-u ");
command += user;
command += _T(":");
if (password != nullptr)
command += password;
command += _T(" ");
}
xvt_sys_proxy(proxy);
if (!proxy.IsEmpty())
{
command += _T("-x ");
command += proxy;
command += _T(" ");
}
command += _T("-H \"Content-Type: ");
command += content_type != nullptr ? content_type : "text/html ";
command += _T("\" ");
if (request != nullptr)
{
command += _T("--data \"");
command += request;
command += _T("\" ");
}
command += _T(" -o ");
command += tempresult;
wxArrayString r;
long retcode = wxExecute(command, r, wxEXEC_SYNC);
int rescode = -1;
if (retcode == 0)
{
char * strResult;
rescode = decode_result(tempresult, strResult);
wxFileOutputStream out(result);
out.Write(strResult, strlen(strResult));
delete strResult;
}
wxRemoveFile(tempresult);
return rescode;
}
int xvt_http_put(const char * local, const char *remote, const char * user, const char * password)
{
wxString command = _T("./curl -i ");
wxString tempresult = wxFileName::CreateTempFileName("res");
wxArrayString res;
int rescode = 0;
wxString proxy;
if (user != nullptr)
{
command += _T("-u ");
command += user;
command += _T(":");
if (password != nullptr)
command += password;
command += _T(" ");
}
xvt_sys_proxy(proxy);
if (!proxy.IsEmpty())
{
command += _T("-x ");
command += proxy;
command += _T(" ");
}
command += _T("-T ");
command += local;
command += _T(" ");
command += remote;
command += _T(" -o ");
command += tempresult;
long retcode = wxExecute(command, res);
if (retcode == 0)
{
wxFileInputStream res(tempresult);
long long size = wxFileName::GetSize(tempresult).GetValue();
wxString buffer;
res.Read(buffer.GetWriteBuf(size), size);
buffer.UngetWriteBuf();
buffer = buffer.SubString(0, size);
buffer = buffer.Mid(9);
rescode = atoi(buffer.Left(3));
}
wxRemoveFile(tempresult);
return rescode;
}
///////////////////////////////////////////////////////////
// File system
///////////////////////////////////////////////////////////
@ -1498,7 +1733,21 @@ void xvt_font_unmap(XVT_FNTID font_id)
BOOLEAN xvt_fsys_build_pathname(char* mbs, const char* volname, const char* dirname, const char* leafroot, const char* leafext, const char* /* leafvers */)
{
#ifdef __WXMSW__
_makepath(mbs, volname, dirname, leafroot, leafext);
if (xvt_is_network_protocol(volname))
{
char path[MAX_PATH];
_makepath(path, nullptr, dirname, leafroot, leafext);
sprintf(mbs, "%s:%s", volname, path);
const int len = strlen(mbs);
for (int i = 0; i < len; i++)
if (mbs[i] == '\\')
mbs[i] = '/';
}
else
_makepath(mbs, volname, dirname, leafroot, leafext);
#else
*mbs = '\0';
if (dirname && *dirname)
@ -1886,20 +2135,20 @@ void xvt_fsys_set_file_time(const char * file, struct tm * ctime, struct tm * at
static bool xvt_sys_ftp_passive_mode(const char* server)
{
static char pasv = ' ';
if (pasv <= ' ')
{
char str[16] = "";
xvt_sys_get_profile_string(xvt_fsys_get_campo_ini(), "Server", "ftp", "Passive", str, sizeof(str));
pasv = toupper(str[0]);
}
return pasv != 'A';
static char pasv = ' ';
if (pasv <= ' ')
{
char str[16] = "";
xvt_sys_get_profile_string(xvt_fsys_get_campo_ini(), "Server", "ftp", "Passive", str, sizeof(str));
pasv = toupper(str[0]);
}
return pasv != 'A';
}
SLIST xvt_fsys_list_files(const char *type, const char *pat, BOOLEAN dirs)
{
wxBusyCursor hourglass;
wxString ext;
SLIST list = xvt_slist_create();
int flags = wxFILE | wxDIR;
@ -1910,9 +2159,12 @@ SLIST xvt_fsys_list_files(const char *type, const char *pat, BOOLEAN dirs)
}
else
flags = wxFILE;
if (flags == wxFILE)
wxSplitPath(pat, NULL, NULL, &ext);
const wxURL url(pat);
if (url.GetScheme() == "ftp")
if (is_ftp(pat))
{
const wxString strHost = url.GetServer();
const wxString strUser = url.GetUser();
@ -1929,7 +2181,10 @@ SLIST xvt_fsys_list_files(const char *type, const char *pat, BOOLEAN dirs)
ftp.SetPassword(strPwd);
}
ftp.SetPassive(xvt_sys_ftp_passive_mode(strHost));
int timeout = xvt_sys_timeout(strHost);
ftp.SetTimeout(timeout);
const bool bConnected = ftp.Connect(strHost);
if (bConnected && ftp.ChDir(fnDir))
{
@ -1937,8 +2192,8 @@ SLIST xvt_fsys_list_files(const char *type, const char *pat, BOOLEAN dirs)
RemotePath = RemotePath.BeforeLast('/');
wxArrayString files;
ftp.GetList(files, fnName, true);
for (size_t i = 0; i < files.GetCount(); i++)
{
const int type = files[i][0] == 'd' ? wxDIR : wxFILE;
@ -1946,32 +2201,99 @@ SLIST xvt_fsys_list_files(const char *type, const char *pat, BOOLEAN dirs)
{
wxString f = RemotePath; f << '/' << files[i].AfterLast(' ');
wxString size = files[i].Mid(30);
xvt_slist_add_at_elt(list, NULL, f, type == wxFILE ? wxAtol(size) : -1L);
bool bGood = true;
if (flags == wxFILE && ext.Len() >= 3)
bGood = wxStricmp(ext, size.AfterLast('.')) == 0;
if (bGood)
xvt_slist_add_at_elt(list, NULL, f, type == wxFILE ? wxAtol(size) : -1L);
}
}
}
}
else //normale list_files
{
wxString ext;
if (flags == wxFILE)
wxSplitPath(pat, NULL, NULL, &ext);
else
if (is_http(pat))
{
const wxString strHost = url.GetServer();
const wxString strUser = url.GetUser();
const wxString strPwd = url.GetPassword();
const wxFileName fnPath = url.GetPath();
const wxString fnDir = fnPath.GetPath(wxPATH_GET_VOLUME, wxPATH_UNIX);
const wxString fnName = fnPath.GetFullName();
wxHTTP http;
wxString f = ::wxFindFirstFile(pat, flags);
while (!f.IsEmpty())
{
if (f.StartsWith(".\\") || f.StartsWith("./"))
f = f.Mid(2);
if (!strUser.IsEmpty())
{
http.SetUser(strUser);
http.SetPassword(strPwd);
}
bool bGood = true;
if (flags == wxFILE && ext.Len() >= 3)
bGood = wxStricmp(ext, f.AfterLast('.')) == 0;
if (bGood)
xvt_slist_add_at_elt(list, NULL, f, 0L);
f = ::wxFindNextFile();
}
}
int timeout = xvt_sys_timeout(strHost);
http.SetTimeout(timeout);
if (http.Connect(strHost))
{
wxString RemotePath = pat;
RemotePath = RemotePath.BeforeLast('/');
RemotePath += _T("/");
wxArrayString files;
wxString dir = wxFileName::CreateTempFileName("dir");
char * result = nullptr;
int rescode = xvt_http_get(RemotePath, dir, strUser.IsEmpty() ? nullptr : strUser.c_str(),
strPwd.IsEmpty() ? nullptr : strPwd.c_str());
wxTextFile fdir(dir);
wxString line;
fdir.Open();
for (line = fdir.GetFirstLine(); !fdir.Eof(); line = fdir.GetNextLine())
{
const int type = line[line.Len() - 1] == '/' ? wxDIR : wxFILE;
if (type & flags) // Entry type matches desired mask?
{
if (line.Find("<li><a href=\"") == 0)
{
line = line.Mid(13);
line = line.BeforeFirst('\"');
bool bGood = true;
if (flags == wxFILE && ext.Len() >= 3)
bGood = wxStricmp(ext, line.AfterLast('.')) == 0;
if (bGood)
{
wxString file = RemotePath;
file += line;
xvt_slist_add_at_elt(list, nullptr, file, type == wxFILE ? wxAtol(file) : -1L);
}
}
}
}
fdir.Close();
}
}
else //normale list_files
{
wxString f = ::wxFindFirstFile(pat, flags);
while (!f.IsEmpty())
{
if (f.StartsWith(".\\") || f.StartsWith("./"))
f = f.Mid(2);
bool bGood = true;
if (flags == wxFILE && ext.Len() >= 3)
bGood = wxStricmp(ext, f.AfterLast('.')) == 0;
if (bGood)
xvt_slist_add_at_elt(list, NULL, f, 0L);
f = ::wxFindNextFile();
}
}
return list;
}
@ -1996,140 +2318,272 @@ BOOLEAN xvt_fsys_set_dir(const DIRECTORY *dirp)
}
BOOLEAN xvt_fsys_fcopy(const char* orig, const char* dest)
{
{
wxURL orig_url(orig);
wxInputStream* input = nullptr;
const wxString ischeme = orig_url.GetScheme();
wxFTP iftp;
wxInputStream* input = nullptr;
wxURL dest_url(dest);
const wxString oscheme = dest_url.GetScheme();
wxFTP oftp;
wxOutputStream* output = nullptr;
wxHTTP ihttp;
if (ischeme == "ftp")
if (is_ftp(orig))
{
wxFTP& ftp = *wxStaticCast(&orig_url.GetProtocol(), wxFTP);
const wxString strHost = orig_url.GetServer();
const wxString strUser = orig_url.GetUser();
const wxString strPwd = orig_url.GetPassword();
const wxFileName fnPath = orig_url.GetPath();
const wxString fnDir = fnPath.GetPath(wxPATH_GET_VOLUME, wxPATH_UNIX);
const wxString fnName = fnPath.GetFullName();
int timeout = xvt_sys_timeout(strHost);
if (!strUser.IsEmpty())
{
ftp.SetUser(strUser);
ftp.SetPassword(strPwd);
iftp.SetUser(strUser);
iftp.SetPassword(strPwd);
}
ftp.SetPassive(xvt_sys_ftp_passive_mode(strHost));
if (ftp.Connect(strHost) && ftp.SetBinary() && ftp.ChDir(fnDir))
input = ftp.GetInputStream(fnName);
iftp.SetPassive(xvt_sys_ftp_passive_mode(strHost));
iftp.SetTimeout(timeout);
if (iftp.Connect(strHost) && iftp.SetBinary() && iftp.ChDir(fnDir))
input = iftp.GetInputStream(fnName);
}
else
if (ischeme == "http")
return false;
/*{
if (is_http(orig))
{
const wxString strHost = orig_url.GetServer();
const short intPort = atoi(dest_url.GetPort());
const wxString strUser = orig_url.GetUser();
const wxString strPwd = orig_url.GetPassword();
const wxFileName fnPath = orig_url.GetPath();
wxHTTP http;
int timeout = xvt_sys_timeout(strHost);
if (!strUser.IsEmpty())
{
http.SetUser(strUser);
http.SetPassword(strPwd);
ihttp.SetUser(strUser);
ihttp.SetPassword(strPwd);
}
http.SetHeader(_T("Content-type"), _T("application/x-www-form-urlencoded")); //remember to define “Content-type: application/x-www-form-urlencoded”, or remote server cant get your posted data.
wxString PostData("postdata=");
PostData << fnPath.GetFullPath();
http.SetPostBuffer(PostData); //its the data to be posted
if (http.Connect(strHost))
{
input = http.GetInputStream(_T("/getfile.php"));
if (input != nullptr && http.GetError() != wxPROTO_NOERR)
{
delete input;
input = nullptr;
}
}
}*/
wxString ContentType = _T("application");
wxString oext;
wxSplitPath(dest, nullptr, nullptr, &oext);
if (oext == "xml")
ContentType += _T("xml");
else
ContentType += _T("octet - stream");
ihttp.SetHeader(_T("Content-type"), ContentType); //remember to define “Content-type: application/x-www-form-urlencoded”, or remote server cant get your posted data.
ihttp.SetTimeout(timeout);
wxApp::IsMainLoopRunning();
if (ihttp.Connect(strHost, intPort))
input = ihttp.GetInputStream(fnPath.GetFullPath(wxPATH_UNIX));
}
else
input = new wxFileInputStream(orig);
if (input == nullptr)
return false;
wxURL dest_url(dest);
wxOutputStream* output = NULL;
const wxString scheme = dest_url.GetScheme();
if (scheme == "ftp")
input = new wxFileInputStream(orig);
if (input == nullptr)
return false;
if (is_ftp(dest))
{
wxFTP ftp;
const wxString strHost = dest_url.GetServer();
const wxString strUser = dest_url.GetUser();
const wxString strPwd = dest_url.GetPassword();
const wxFileName fnPath = dest_url.GetPath();
const wxString fnDir = fnPath.GetPath(wxPATH_GET_VOLUME, wxPATH_UNIX);
const wxString fnName = fnPath.GetFullName();
int timeout = xvt_sys_timeout(strHost);
if (!strUser.IsEmpty())
{
ftp.SetUser(strUser);
ftp.SetPassword(strPwd);
oftp.SetUser(strUser);
oftp.SetPassword(strPwd);
}
oftp.SetPassive(xvt_sys_ftp_passive_mode(strHost));
oftp.SetTimeout(timeout);
if (oftp.Connect(strHost) && oftp.SetBinary() && oftp.ChDir(fnDir))
{
xvt_fsys_remove_file(dest);
output = oftp.GetOutputStream(fnName);
}
ftp.SetPassive(xvt_sys_ftp_passive_mode(strHost));
if (ftp.Connect(strHost) && ftp.SetBinary() && ftp.ChDir(fnDir))
output = ftp.GetOutputStream(fnName);
}
else
if (scheme == "http")
return false;
/*{
if (is_http(dest))
{
const wxString strHost = dest_url.GetServer();
const short intPort = atoi(dest_url.GetPort());
const wxString strUser = dest_url.GetUser();
const wxString strPwd = dest_url.GetPassword();
const wxFileName fnPath = dest_url.GetPath();
wxHTTP http;
bool ok = false;
wxArrayString res;
wxString tempname = wxFileName::CreateTempFileName("htt");
wxString tempresult = wxFileName::CreateTempFileName("res");
wxFileOutputStream temp(tempname);
int size = input->GetSize();
input->Read(temp);
temp.Close();
int rescode = xvt_http_put(tempname, dest, strUser.IsEmpty() ? nullptr: strUser.c_str(),
strPwd.IsEmpty() ? nullptr : strPwd.c_str());
ok = (rescode > 199) && (rescode < 300);
if (is_local(orig) && input != nullptr)
delete input;
return ok;
/* provare sulla 3.3
int timeout = xvt_sys_timeout(strHost);
int size = input->GetSize();
wxSocketClient * socket = new wxSocketClient();
wxString header;
wxString buffer;
wxString data;
wxString oext;
wxSplitPath(dest, nullptr, nullptr, &oext);
input->Read(buffer, size);
buffer[size] = '\0';
data << buffer;
delete[]buffer;
//Set up header
//PUT
header += "PUT ";
header += dest;
header += " HTTP/1.1\n";
//Write user agent
header += "User-Agent: wxWidget 2.x\n";
//Write host website name
header += "Host: ";
header += strHost;
header += ":";
header += wxString::Format("%d", intPort);
header += "\n";
//Write content type
header += "Content-Type: application";
if (oext == "xml")
header += "/xml";
else
header += "/octet - stream";
header += "\n";
//Write POST content length
header += "Content-Length: ";
int dlen = data.Len();
int hlen = header.Len();
header += wxString::Format("%d", dlen);
header += "\n\n";
//Print on screen to make sure it looks right
wxMessageBox(header);
header += data;
wxMessageBox(header);
int alllen = header.Len();
//Connect to host
wxIPV4address * address = new wxIPV4address();
address->Hostname(strHost);
address->Service(intPort);
if (socket->Connect(*address))
{
//Write header
socket->Write(header.c_str(), header.Len());
wxMessageBox(wxString::Format("Wrote %d out of %d bytes", socket->LastCount(), header.Len()));
if (socket->Error())
wxMessageBox(wxString::Format("Errore %d", socket->LastError()));
//Write data
// socket->Write(data.c_str(), data.Len());
// wxMessageBox(wxString::Format("Wrote %d out of %d bytes", socket->LastCount(), data.Len()));
//Get Response
wxString buf;
socket->Read(buf.GetWriteBuf(1000), 1000);
buf.UngetWriteBuf();
//Trim response to what was read from stream
buf = buf.SubString(0, socket->LastCount() - 1);
buf = buf.Mid(9);
int rescode = atoi(buf.Left(3));
wxMessageBox(wxString::Format("Read %d bytes: %s", socket->LastCount(), buf));
ok = (rescode > 199) && (rescode < 300);
}
delete socket;
delete address;
*/
/* provare nella 3.3
wxHTTP ohttp;
if (!strUser.IsEmpty())
{
http.SetUser(strUser);
http.SetPassword(strPwd);
ohttp.SetUser(strUser);
ohttp.SetPassword(strPwd);
}
http.SetHeader(_T("Content-type"), _T("application/x-www-form-urlencoded")); //remember to define “Content-type: application/x-www-form-urlencoded”, or remote server cant get your posted data.
wxString PostData("postdata=");
PostData << fnPath.GetFullPath();
http.SetPostBuffer(PostData); //its the data to be posted
if (http.Connect(strHost))
if (ohttp.Connect(strHost, intPort))
{
output = http.GetResponse();
if (output != nullptr) && http.GetError() == wxPROTO_NOERR;
wxString PostData; // ("postdata=");
int size = input->GetSize();
char * buffer = new char[size + 1];
wxString ofile = fnPath.GetFullPath(wxPATH_UNIX);
ohttp.SetHeader(_T("POST "), ofile + _T(" HTTP/1.0"));
ohttp.SetHeader(_T("Host:"), strHost);
ohttp.SetHeader(_T("User - Agent:"), _T("HTTPTool / 1.0"));
ohttp.SetHeader(_T("Content-Length:"), wxString::Format("%d", size));
ohttp.SetHeader(_T("Content-type:"), _T("application/octet-stream"));
input->Read(buffer, size);
buffer[size] = '\0';
PostData << buffer;
delete[]buffer;
#if wxCHECK_VERSION(3,3,0)
ohttp.SetPostText("text/html;", PostData); //its the data to be posted
#else
ohttp.SetPostBuffer(PostData); //its the data to be posted
#endif
input = ohttp.GetInputStream(ofile);
wxProtocolError err = ohttp.GetError();
if (input != nullptr)
{
wxDELETE(output);
output = nullptr;
wxDELETE(input);
input = nullptr;
}
}
} */
else
if (ohttp.IsConnected())
ohttp.Close();*/
if (is_local(orig) && input != nullptr)
delete input;
return ok;
// return err == wxPROTO_NOERR;
// }
}
else
output = new wxFileOutputStream(dest);
// }
BOOLEAN ok = false;
if (input != nullptr && output != nullptr)
{
input->Read(*output);
if (is_ftp(dest))
{
int size = input->GetSize();
char * buffer = new char[size];
input->Read(buffer, size);
output->Write(buffer, size);
delete[]buffer;
}
else
input->Read(*output);
wxStreamError err = output->GetLastError();
ok = (err == wxSTREAM_NO_ERROR);
output->Close();
ok = output->IsOk();
output->Close();
if (iftp.IsConnected())
iftp.Close();
if (oftp.IsConnected())
oftp.Close();
}
if (input != nullptr)
delete input;
if (output != nullptr && scheme != "ftp")
if (is_local(orig) && input != nullptr)
delete input;
if (is_local(dest) && output != nullptr)
delete output;
return ok;
}
@ -3245,15 +3699,16 @@ void xvt_scr_set_focus_vobj(WINDOW win)
BOOLEAN xvt_slist_add_at_elt(SLIST list, SLIST_ELT e, const char *sx, long data)
{
const BOOLEAN ok = list != NULL;
const BOOLEAN ok = list != nullptr;
if (ok)
{
SLIST_ELT item = new SLIST_ITEM;
item->str = xvt_str_duplicate(sx);
item->data = data;
item->next = NULL;
item->next = nullptr;
SLIST_ELT last = NULL;
SLIST_ELT last = nullptr;
// if (e != NULL) // Add at head by default (else at tail)
// {
for (SLIST_ELT i = list->head; i; i = (SLIST_ELT)i->next)
@ -3263,7 +3718,7 @@ BOOLEAN xvt_slist_add_at_elt(SLIST list, SLIST_ELT e, const char *sx, long data)
break;
}
// }
if (last == NULL)
if (last == nullptr)
{
item->next = list->head;
list->head = item;
@ -4087,7 +4542,11 @@ int xvt_fsys_access(const char *pathname, int mode)
ftp.SetPassword(strPwd);
}
ftp.SetPassive(xvt_sys_ftp_passive_mode(strHost));
return ftp.Connect(strHost) && ftp.ChDir(fnDir) ? 0 : EACCES;
int timeout = xvt_sys_timeout(strHost);
ftp.SetTimeout(timeout);
return ftp.Connect(strHost) && ftp.ChDir(fnDir) ? 0 : EACCES;
}
}
SLIST files = xvt_fsys_list_files("", pathname, true);
@ -4146,8 +4605,12 @@ BOOLEAN xvt_fsys_remove_file(const char *pathname)
}
ftp.SetPassive(xvt_sys_ftp_passive_mode(strHost));
int timeout = xvt_sys_timeout(strHost);
ftp.SetTimeout(timeout);
if (ftp.Connect(strHost))
if (ftp.ChDir(fnDir))
if (ftp.FileExists(fnName))
return ftp.RmFile(fnName);
return false;
}
@ -5038,4 +5501,4 @@ int xvt_dongle_crypt(unsigned short* data)
data[2] ^= 0xDEAD;
data[3] ^= 0xBEEF;
return 0;
}
}

View File

@ -47,7 +47,6 @@ extern "C" {
#define XVT_INSTALL_DIR 3
#define XVT_TEMP_DIR 4
#define MAX_TASKS 1024
XVTDLL void xvt_app_allow_quit(void);
@ -192,6 +191,11 @@ XVTDLL void xvt_font_set_style(XVT_FNTID font_id, XVT_FONT_STYLE
XVTDLL long xvt_font_serialize(XVT_FNTID font_id, char *buf, long max_buf);
XVTDLL void xvt_font_unmap(XVT_FNTID font_id);
XVTDLL BOOLEAN xvt_is_network_protocol(const char *protocol);
XVTDLL int xvt_http_get(const char *remote, const char * local, const char * user, const char * password);
XVTDLL int xvt_http_post(const char *remote, const char * result, const char * content_type, const char * request, const char * user, const char * password);
XVTDLL int xvt_http_put(const char * local, const char *remote, const char * user, const char * password);
XVTDLL BOOLEAN xvt_fsys_build_pathname(char *mbs, const char *volname, const char *dirname, const char *leafroot, const char *leafext, const char *leafvers);
XVTDLL BOOLEAN xvt_fsys_convert_dir_to_str(DIRECTORY *dirp, char *path, int sz_path);
XVTDLL BOOLEAN xvt_fsys_convert_str_to_dir(const char *path, DIRECTORY *dirp);