28 #if defined (HAVE_CONFIG_H)
42 #if defined (HAVE_CURL)
43 # include <curl/curl.h>
44 # include <curl/curlver.h>
45 # include <curl/easy.h>
63 if (! fs || ! fs.
is_dir ())
71 errmsg =
"__ftp_mget__: can not create directory '"
72 + target + sep + directory +
"': " + msg;
101 std::ofstream
ofile (realfile.c_str (),
102 std::ios::out | std::ios::binary);
104 if (!
ofile.is_open ())
107 errmsg =
"__ftp_mget__: unable to open file";
162 if (file ==
"." || file ==
"..")
171 errmsg =
"__ftp__mput: file '" + realfile
172 +
"' does not exist";
186 std::ifstream ifile (realfile.c_str (), std::ios::in |
189 if (! ifile.is_open ())
192 errmsg =
"__ftp_mput__: unable to open file '"
204 file_list.
append (realfile);
211 errmsg =
"__ftp_mput__: can not read the directory '"
219 #if defined (HAVE_CURL)
224 std::ostream& stream = *(
static_cast<std::ostream*
> (streamp));
225 stream.write (static_cast<const char*> (buffer), size*nmemb);
226 return (stream.fail () ? 0 : size * nmemb);
232 std::istream& stream = *(
static_cast<std::istream*
> (streamp));
233 stream.read (static_cast<char*> (buffer), size*nmemb);
235 return stream.gcount ();
237 return (stream.fail () ? 0 : size * nmemb);
243 return static_cast<size_t>(size * nmemb);
249 #define SETOPT(option, parameter) \
252 CURLcode res = curl_easy_setopt (curl, option, parameter); \
253 if (res != CURLE_OK) \
256 errmsg = curl_easy_strerror (res); \
263 #define SETOPTR(option, parameter) \
266 CURLcode res = curl_easy_setopt (curl, option, parameter); \
267 if (res != CURLE_OK) \
270 errmsg = curl_easy_strerror (res); \
287 errmsg =
"can not create curl object";
299 errmsg =
"can not create curl object";
303 init (user_arg, passwd, std::cin, os);
305 url =
"ftp://" + host;
320 errmsg =
"can not create curl object";
324 init (
"",
"", std::cin, os);
326 SETOPT (CURLOPT_NOBODY, 0);
332 SETOPT (CURLOPT_HTTPGET, 1);
338 curl_easy_cleanup (
curl);
380 SETOPT (CURLOPT_TRANSFERTEXT, 1);
386 SETOPT (CURLOPT_TRANSFERTEXT, 0);
411 struct curl_slist *slist = 0;
414 frame.
add_fcn (curl_slist_free_all, slist);
417 slist = curl_slist_append (slist, cmd.c_str ());
418 cmd =
"rnto " + newname;
419 slist = curl_slist_append (slist, cmd.c_str ());
420 SETOPT (CURLOPT_POSTQUOTE, slist);
426 SETOPT (CURLOPT_POSTQUOTE, 0);
433 SETOPT (CURLOPT_UPLOAD, 1);
434 SETOPT (CURLOPT_NOBODY, 0);
442 SETOPT (CURLOPT_NOBODY, 1);
443 SETOPT (CURLOPT_UPLOAD, 0);
452 SETOPT (CURLOPT_NOBODY, 0);
460 SETOPT (CURLOPT_NOBODY, 1);
469 SETOPT (CURLOPT_NOBODY, 0);
475 SETOPT (CURLOPT_NOBODY, 1);
484 std::ostringstream buf;
486 SETOPTR (CURLOPT_WRITEDATA, static_cast<void*> (&buf));
488 SETOPTR (CURLOPT_DIRLISTONLY, 1);
498 SETOPTR (CURLOPT_DIRLISTONLY, 0);
507 pos = str.find_first_of (
'\n', pos);
508 if (pos == std::string::npos)
517 size_t newpos = str.find_first_of (
'\n', pos);
518 if (newpos == std::string::npos)
521 retval(
i) = str.substr(pos, newpos - pos);
529 time_t& filetime,
bool& fileisdir)
535 SETOPT (CURLOPT_FILETIME, 1);
556 curl_easy_getinfo (
curl, CURLINFO_FILETIME, &ft);
559 curl_easy_getinfo (
curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &fs);
563 SETOPT (CURLOPT_HEADERFUNCTION, 0);
564 SETOPT (CURLOPT_FILETIME, 0);
579 struct curl_slist *slist = 0;
582 frame.
add_fcn (curl_slist_free_all, slist);
584 slist = curl_slist_append (slist,
"pwd");
585 SETOPTR (CURLOPT_POSTQUOTE, slist);
588 std::ostringstream buf;
589 SETOPTR (CURLOPT_WRITEHEADER, static_cast<void *>(&buf));
598 size_t pos2 = retval.rfind (
'"');
599 size_t pos1 = retval.rfind (
'"', pos2 - 1);
600 retval = retval.substr (pos1 + 1, pos2 - pos1 - 1);
602 SETOPTR (CURLOPT_HEADERFUNCTION, 0);
603 SETOPTR (CURLOPT_WRITEHEADER, 0);
604 SETOPTR (CURLOPT_POSTQUOTE, 0);
615 if (! query_string.empty ())
616 url +=
"?" + query_string;
629 SETOPT (CURLOPT_POSTFIELDS, query_string.c_str ());
636 if (action.empty () || action ==
"get")
638 else if (action ==
"post")
643 errmsg =
"curl_transfer: unknown http action";
678 std::istream&
is, std::ostream& os)
681 SETOPT (CURLOPT_NOBODY, 1);
685 if (! passwd.empty ())
686 userpwd +=
":" + passwd;
687 if (! userpwd.empty ())
688 SETOPT (CURLOPT_USERPWD, userpwd.c_str ());
694 SETOPT (CURLOPT_WRITEDATA, static_cast<void*> (&os));
700 SETOPT (CURLOPT_READDATA, static_cast<void*> (&is));
703 SETOPT (CURLOPT_FOLLOWLOCATION,
true);
708 SETOPT (CURLOPT_FTP_USE_EPSV,
false);
710 SETOPT (CURLOPT_NOPROGRESS,
true);
711 SETOPT (CURLOPT_FAILONERROR,
true);
713 SETOPT (CURLOPT_POSTQUOTE, 0);
714 SETOPT (CURLOPT_QUOTE, 0);
719 std::ostringstream query;
721 for (
int i = 0;
i < param.
numel ();
i += 2)
727 char *enc_name = curl_easy_escape (curl, name.c_str (),
729 char *enc_text = curl_easy_escape (curl, text.c_str (),
732 query << enc_name <<
"=" << enc_text;
734 curl_free (enc_name);
735 curl_free (enc_text);
749 struct curl_slist *slist = 0;
753 frame.
add_fcn (curl_slist_free_all, slist);
757 slist = curl_slist_append (slist, cmd.c_str ());
759 SETOPT (CURLOPT_POSTQUOTE, slist);
766 SETOPT (CURLOPT_POSTQUOTE, 0);
774 #if defined (HAVE_CURL)
775 # define REP_CLASS curl_transfer
777 # define REP_CLASS base_url_transfer
785 : rep (new
REP_CLASS (host, user, passwd, os))
static std::string dir_sep_str(void)
void http_get(const Array< std::string > ¶m)
Octave interface to the compression and uncompression libraries.
For example cd octave end example noindent changes the current working directory to file
void ftp_file_or_dir_action(const std::string &file_or_dir, const std::string &action)
virtual void put(const std::string &, std::istream &)
int unlink(const std::string &name)
octave_idx_type numel(void) const
Number of elements in the array.
void del(const std::string &file)
std::ostream & set_ostream(std::ostream &os)
void get_fileinfo(const std::string &filename, double &filesize, time_t &filetime, bool &fileisdir)
std::istream & set_istream(std::istream &is)
void put(const std::string &file, std::istream &is)
static size_t throw_away(void *, size_t size, size_t nmemb, void *)
void http_post(const Array< std::string > ¶m)
std::string lasterror(void) const
void http_action(const Array< std::string > ¶m, const std::string &action)
virtual string_vector list(void)
#define SETOPTR(option, parameter)
void resize(octave_idx_type n, const std::string &rfv="")
void rmdir(const std::string &path)
curl_transfer & operator=(const curl_transfer &)
static int write_data(void *buffer, size_t size, size_t nmemb, void *streamp)
void add_fcn(void(*fcn)(void))
curl_transfer(const std::string &url_str, std::ostream &os)
#define SETOPT(option, parameter)
string_vector & append(const std::string &s)
virtual void get_fileinfo(const std::string &, double &, time_t &, bool &)
std::string form_query_string(const Array< std::string > ¶m)
curl_transfer(const std::string &host, const std::string &user_arg, const std::string &passwd, std::ostream &os)
Array< std::string > param
static void reset_path(base_url_transfer *curl_xfer)
void mget_directory(const std::string &directory, const std::string &target)
octave::unwind_protect frame
virtual void cwd(const std::string &)
int mkdir(const std::string &nm, mode_t md)
std::ofstream ofile(filename.c_str(), std::ios::out|std::ios::binary)
#define END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE
otherwise an error message is printed The permission mask is a UNIX concept used when creating new objects on a file system such as files
=val(i)}if ode{val(i)}occurs in table i
static void delete_file(const std::string &file)
virtual void mkdir(const std::string &)
octave::sys::file_stat fs(filename)
void mkdir(const std::string &path)
#define BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE
void init(const std::string &user, const std::string &passwd, std::istream &is, std::ostream &os)
string_vector mput_directory(const std::string &base, const std::string &directory)
write the output to stdout if nargout is
If this string is the system will ring the terminal sometimes it is useful to be able to print the original representation of the string
void cwd(const std::string &path)
void rename(const std::string &oldname, const std::string &newname)
std::ostream * curr_ostream
static int read_data(void *buffer, size_t size, size_t nmemb, void *streamp)
std::istream * curr_istream
OCTAVE_EXPORT octave_value_list directory