text: #undef DLIB__BROWSER_ABSTRACT_
  #ifdef DLIB__BROWSER_ABSTRACT_
  
  
  
  namespace dlib
  {
  
      // Function which is called when there is data available.
      //   Return false to stop the download process...
      typedef bool (*fnOnDownload)(long already_downloaded, long total_to_download, void * userInfo);
  
  
  // ----------------------------------------------------------------------------------------
  /*
  TODO:
  - Timed cookie support
  - POSTing files: check it!
  - Don't timeout when still downloading!
  */
  // ----------------------------------------------------------------------------------------
  
  
      class Browser
      {
          /*!
              WHAT THIS OBJECT REPRESENTS
                  This object represents a possibility for the end user to download webpages (HTTP/1.0)
                  from the internet like a normal webbrowser would do.
          !*/
  
      public:
  
          Browser(
          );
          /*!
              Constructor
          !*/
  
          void set_header(
              const std::string& header_name,
              const std::string& header_value
          );
          /*!
              Set a header to a certain value
              Example: set_header("User-Agent", "Internet Explorer")
          !*/
  
  
          void set_header(
              const std::string& header_name,
              long header_value
          );
          /*!
              Set a header to a certain number
              Example: set_header("Content-Length", 1234)
          !*/
  
          std::string get_header(
              const std::string& header_name
          ) const;
          /*!
              Get the value of the header or an empty string when it's not set.
              Example: get_header("Content-Length") would return "1234"
          !*/
  
          void remove_header(
              const std::string& header_name
          );
          /*!
              Removes a certain header
          !*/
  
          bool is_header_set(
              const std::string& header_name
          ) const;
          /*!
              Returns when a header is set and is not empty
          !*/
  
          void set_user_agent(
              const std::string& new_agent
          ) { set_header("User-Agent", new_agent); }
          /*!
              Convenience function for setting a user agent
          !*/
  
          void clear(
          );
          /*!
              Clear out all cookies & headers set until now
          !*/
  
          void prepare_for_next_url(
          );
          /*!
              Clear out any header and/or cookie which would obstruct getting a next page.
              At this moment this is cleared:
                  - the Content-Type header
          !*/
  
          void set_callback_function( 
              fnOnDownload od, 
              void * _user_info 
          );
          /*!
              Set a callback function for one of the following events:
              - OnDownload: this will tell you how much is downloaded and how much will need to be downloaded
          !*/
  
          void set_cookie(
              const std::string& cookie_name, 
              const std::string& cookie_value
          );
          /*!
              Set a cookie
          !*/
  
          void set_cookie(
              const std::string& cookie_name, 
              long cookie_value
          );
          /*!
              Set a cookie
          !*/
  
          void remove_cookie(
              const std::string& cookie_name
          );
          /*!
              Remove a cookie if it's set
          !*/
  
          void set_timeout( 
              unsigned int milliseconds  
          );
          /*!
              Set the maximum time how long a request can take. Setting this to 0 disables
              this behavior.
          !*/
  
          string_to_stringvector get_returned_headers(
          ) const; 
          /*!
              Returns all the headers which are returned in the download of the webpage.
          !*/
  
          short get_http_return (
          ) const;
          /*!
              Retrieves the HTTP return code.
          !*/
  
          const std::string& get_body (
          ) const; 
          /*!
              Retrieves the HTTP body.
          !*/
  
          const std::string& post_url (
              const std::string& url, 
              const string_to_stringmap& postvars,
              const string_to_stringmap& filenames = string_to_stringmap()
          );
          /*!
              POST an url to the internet.
              You can pass the post variables as well as a list of filenames
          !*/
  
          const std::string& post_url (
              const std::string& url, 
              const std::string& postbuffer
          );
          /*!
              POST an url to the internet.
              In this function you have constructed the POST string yourselves
          !*/
  
          const std::string& get_url (
              const std::string& url
          );
          /*!
              GET an url from the internet.
          !*/
  
          bool has_error( 
          ) const;
          /*!
              Has there happened an error?
          !*/
  
          const std::string& get_error( 
          ) const;
          /*!
              Get the error explanation
          !*/
  
          static std::string urlencode(
              const std::string& in, 
              bool post_encode = false
          );
          /*!
              Convenience function to URLencode a string
          !*/
  
          static std::string urldecode(
              const std::string& in
          );
          /*!
              Convenience function to URLdecode a string
          !*/
  
      };
  
  }
  
  #endif // DLIB__BROWSER_ABSTRACT_
  
  