diff --git a/include/isamrpc.cpp b/include/isamrpc.cpp index db4920c20..1fb14cd54 100755 --- a/include/isamrpc.cpp +++ b/include/isamrpc.cpp @@ -23,7 +23,7 @@ bool rpc_Start() { delete _client; _client = NULL; - ok = error_box("Errore di inizializzazione del client."); + ok = error_box("Errore di inizializzazione del socket client"); } } return ok; @@ -287,3 +287,40 @@ bool rpc_UserLogout() return TRUE; } + +bool http_get(const char* server, + const char* remote_file, + const char* local_file) +{ + TSocketClient client; + if (!client.IsOk()) + return error_box("Impossibile inizializzare il client HTTP"); + + unsigned long connection = client.QueryConnection("80", server); + bool ok = connection != 0; + if (ok) + { + ok = client.HttpGetFile(remote_file, local_file) != 0; + client.RemoveConnection(connection); + } + + return ok; +} + +bool http_dir(const char* server, const char* remote_dir, TString_array& list) +{ + TSocketClient client; + if (!client.IsOk()) + return error_box("Impossibile inizializzare il client HTTP"); + + unsigned long connection = client.QueryConnection("80", server); + bool ok = connection != 0; + if (ok) + { + ok = client.HttpGetDir(remote_dir, list) != 0; + client.RemoveConnection(connection); + } + + return ok; +} + diff --git a/include/isamrpc.h b/include/isamrpc.h index 104b7b25d..e0582c0bd 100755 --- a/include/isamrpc.h +++ b/include/isamrpc.h @@ -21,8 +21,10 @@ bool rpc_UserLogin(const char* server, const char* user, const char* password, const char* application); bool rpc_UserLogout(); - bool rpc_Start(); bool rpc_Stop(); +bool http_get(const char* server, const char* remote_file, const char* local_file); +bool http_dir(const char* server, const char* remote_dir, TString_array& list); + #endif diff --git a/include/netsock.cpp b/include/netsock.cpp index d35b7d460..da60f27ec 100755 --- a/include/netsock.cpp +++ b/include/netsock.cpp @@ -1,5 +1,5 @@ #define XVT_INCL_NATIVE -#include +#include "progind.h" // skstream.h // Copyright (C) 1995, 1996 by John C. Wang. All Rights Reserved. @@ -18,9 +18,7 @@ // [JCW 95-Dec-20] comments added for distribution 95a // [JCW 96-Jan-01] removed UDP capabilities from skstream -#include -#include - +#include #include "winsock.h" // @@ -517,6 +515,8 @@ TConnection* TSocketClient::OnQueryConnection(const char* service, if (cur_socket == NULL) { TString strServer = server; + if (strServer.compare("http://", 7, TRUE) == 0) + strServer.ltrim(7); if (strServer.empty() || stricmp(strServer, "localhost") == 0) strServer = "127.0.0.1"; @@ -592,3 +592,121 @@ void TSocketClient::ReleaseBuffer() m_dwSize = 0; } } + +BOOL TSocketClient::HttpGetFile(const char* remote, const char* local) +{ + if (!cur_socket->is_open()) + return FALSE; + + BOOL ok = FALSE; + + TString buf(4096); + buf << "GET " << remote << " HTTP/1.0\r\n\r\n"; + + cur_socket->sync(); + cur_socket->write(buf, buf.len()); + cur_socket->flush(); + if (cur_socket->good()) + { + const clock_t start = clock(); + + long size = 0; + for (int r = 0; !cur_socket->eof(); r++) + { + cur_socket->getline(buf.get_buffer(), buf.size(), '\n'); + if (buf.blank()) + break; + if (r == 0 && buf.find("404") > 0) + return FALSE; // File not found + if (buf.compare("Content-length:", 15, TRUE) == 0) + { + const int colon = buf.find(':'); + size = atol(buf.mid(colon+1)); + } + } + + ofstream outfile(local, ios::out | ios::binary); + if (outfile.good()) + { + TString msg; + msg << remote << " - "; + if (size > 1024) + msg << (size / 1024) << " K"; + else + msg << size << ' '; + msg << "bytes.\nTempo residuo stimato: "; + TProgind pi(size, msg, TRUE, TRUE); + long total = 0; + + while (!cur_socket->eof()) + { + cur_socket->read(buf.get_buffer(), buf.size()); + const int count = cur_socket->gcount(); + if (count > 0) + { + outfile.write(buf, count); + + total += count; + bool tick = pi.setstatus(total); + if (pi.iscancelled()) + break; + + if (tick) + { + const double estimated_ticks = double(size - total) * double(clock() - start) / total; + long secs = long(estimated_ticks / CLOCKS_PER_SEC) + 1; + CHECK(secs >= 0, "Bad time estimation"); + const int hours = int(secs / 3600L); + secs %= 3600L; + const int mins = int(secs / 60L); + secs %= 60L; + const int append_pos = msg.find("o: ")+3; + msg.cut(append_pos); + TString16 tempo; + tempo.format("%02d:%02d:%02ld", hours, mins, secs); + msg << tempo; + pi.set_text(msg); + } + } + } + ok = pi.isfinished(); + } + else + error_box("Impossibile scrivere il file %s", local); + } + + return ok; +} + +BOOL TSocketClient::HttpGetDir(const char* remote, TString_array& list) +{ + TFilename local; local.temp(); + const BOOL ok = HttpGetFile(remote, local); + if (ok) + { + ifstream s(local); + TString riga(1024); + while (!s.eof()) + { + s.getline(riga.get_buffer(), riga.size()); + const int href = riga.find("HREF="); + if (href > 0) + { + const int start = riga.find('"', href) + 1; + if (start > href) + { + const int stop = riga.find('"', start); + if (stop > start) + { + const TString& name = riga.sub(start, stop); + list.add(name); + } + } + } + } + s.close(); + ::remove(local); + } + + return ok; +} diff --git a/include/netsock.h b/include/netsock.h index 12c1c8565..75ac7522f 100755 --- a/include/netsock.h +++ b/include/netsock.h @@ -53,6 +53,9 @@ public: virtual void ReleaseBuffer(); virtual BOOL IsOk() const { return TRUE; } + BOOL HttpGetFile(const char* remote, const char* local); + BOOL HttpGetDir(const char* remote, TString_array& list); + TSocketClient(); virtual ~TSocketClient(); };