// // aegis - project change supervisor // Copyright (C) 2003, 2005, 2006, 2008 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // 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. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #ifndef LIBAEGIS_INPUT_CURL_H #define LIBAEGIS_INPUT_CURL_H #include #include /** * The input_curl class is used to represent an input obtained via * libcurl. */ class input_curl: public input_ty { public: /** * The destructor. */ virtual ~input_curl(); /** * The constructor. */ input_curl(const nstring &url); /** * The looks_likely class method is used to examine a filename and * see if it starts with a prototype name (e.g. http: or ftp:) * making it a likely candidate for the input_curl class. */ static bool looks_likely(const nstring &fn); // This is only public so that the CURL progress callback can access it. void progress_callback(double down_total, double down_current); // This is only public so that the CURL write callback can access it. size_t write_callback(char *data, size_t nbytes); // This is only public so that the CURL write callback can access it. void read_error(); // See base class for documentation. nstring name(); // See base class for documentation. long length(); // See base class for documentation. long read_inner(void *data, size_t nbytes); // See base class for documentation. long ftell_inner(); // See base class for documentation. bool is_remote() const; bool verify_handle(CURL *x) const { return (x == handle); } void eof_notify() { eof = true; } private: CURL *handle; nstring fn; long pos; // buffer to store cached data char *curl_buffer; // currently allocated buffers length size_t curl_buffer_maximum; // start of data in buffer size_t curl_buffer_position; // end of data in buffer size_t curl_buffer_length; // end of file has been reached bool eof; char errbuf[CURL_ERROR_SIZE]; time_t progress_start; char *progress_buffer; int progress_buflen; int progress_cleanup; #if (LIBCURL_VERSION_NUM < 0x070b01) nstring proxy; nstring userpass; #endif long read_data(void *data, size_t len); /** * The default constructor. Do not use. */ input_curl(); /** * The copy constructor. Do not use. */ input_curl(const input_curl &arg); /** * The assignment operator. Do not use. */ input_curl &operator=(const input_curl &arg); }; /** * The input_curl_open function is used to open an input stream which * reads from a Uniform Resource Locator (URL), typically an HTTP or * FTP site somewhere on the Internet. */ inline input_ty * input_curl_open(struct string_ty *fn) { return new input_curl(nstring(fn)); } /** * The input_curl_looks_likely function is used to examine a filename * and see if it starts with a prototype name (e.g. http: or ftp:) * making it a likely bcandidate for the input_curl_open function. */ inline bool input_curl_looks_likely(struct string_ty *fn) { return input_curl::looks_likely(nstring(fn)); } #endif // LIBAEGIS_INPUT_CURL_H