http-reader.h
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:5k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. /* -*-c++-*- */
  2. /*  Asynchronous HTTP client
  3.  *  Copyright (C) 2006   Written by VCL
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  */
  19. #ifndef _HTTP_READER_H_
  20. #define _HTTP_READER_H_
  21. namespace OpenKore {
  22. /**
  23.  * Status codes for HttpReader.
  24.  */
  25. enum HttpReaderStatus {
  26. /**
  27.  * Connecting to the server. This is an initial state.
  28.  * The status can become: HTTP_READER_DOWNLOADING,
  29.  * HTTP_READER_DONE or HTTP_READER_ERROR.
  30.  */
  31. HTTP_READER_CONNECTING,
  32. /**
  33.  * Downloading data. The status can become:
  34.  * HTTP_READER_DONE or HTTP_READER_ERROR
  35.  */
  36. HTTP_READER_DOWNLOADING,
  37. /** Done downloading. This is a final state. */
  38. HTTP_READER_DONE,
  39. /** An error occured. This is a final state. */
  40. HTTP_READER_ERROR
  41. };
  42. /**
  43.  * HttpReader is an interface for a simple, non-blocking
  44.  * HTTP-client, capable of downloading data from a HTTP(S)
  45.  * server.
  46.  *
  47.  * HttpReader is multithreaded and runs in the background. It
  48.  * will automatically update its internal status. Users should
  49.  * periodically call getStatus() to retrieve its status.
  50.  * HttpReader is completely thread-safe. You can cancel a
  51.  * download at any time by destroying the HttpReader object.
  52.  *
  53.  * Once getStatus() returns HTTP_READER_DOWNLOADING, users can
  54.  * use pullData() to retrieve data from the download buffer.
  55.  *
  56.  * A HttpReader can only be used once. You must construct a new
  57.  * HttpReader if you want to download more than once.
  58.  */
  59. class HttpReader {
  60. public:
  61. /**
  62.  * The default useragent string.
  63.  */
  64. static const char *const DEFAULT_USER_AGENT;
  65. virtual ~HttpReader() = 0;
  66. /**
  67.  * Retrieve the current status of this HttpReader.
  68.  */
  69. virtual HttpReaderStatus getStatus() const = 0;
  70. /**
  71.  * Retrieve the error message if an error occured.
  72.  *
  73.  * @require getStatus() == HTTP_READER_ERROR
  74.  * @ensure result != NULL
  75.  */
  76. virtual const char *getError() const = 0;
  77. /**
  78.  * Pull data from the internal download buffer.
  79.  *
  80.  * When HttpReader is downloading, a background thread will
  81.  * continuously put downloaded data into its download buffer.
  82.  * This function pulls data from that buffer and truncates it.
  83.  *
  84.  * To download an entire file, you must keep calling pullData()
  85.  * until it returns 0.
  86.  *
  87.  * Alternatively, you can use getData(), which is easier to use.
  88.  * But you must not mix pullData() and getData().
  89.  *
  90.  * @param buf   A buffer in which to put the data.
  91.  * @param size  The size of buf, in bytes.
  92.  * @return The number of bytes put into buf, 0 on end-of-file,
  93.  *         or -1 if the internal download buffer is empty (you
  94.  *         should call this method again later), or -2 if an
  95.  *         error occured.
  96.  * @require
  97.  *     getStatus() != HTTP_READER_CONNECTING
  98.  *     buf != NULL
  99.  *     size > 0
  100.  * @ensure
  101.  *     if result > 0: result <= size
  102.  *     if result == -2: getStatus() == HTTP_READER_ERROR
  103.  */
  104. virtual int pullData(void *buf, unsigned int size) = 0;
  105. /**
  106.  * Returns the full content of the internal download buffer.
  107.  * In other words: return the contents of the downloaded file.
  108.  *
  109.  * This function may only be called if the download is finished.
  110.  * If you want to do incremental downloading, use pullData()
  111.  * instead. However, you must not mix this function with
  112.  * pullData(), or bad things will happen.
  113.  *
  114.  * @param len  The length of the downloaded file, in bytes, will
  115.  *             be put in this variable.
  116.  * @return A buffer containing the downloaded data (which must
  117.  *         not be freed or modified).
  118.  * @require getStatus() == HTTP_READER_DONE
  119.  * @ensure  result != NULL
  120.  */
  121. virtual const char *getData(unsigned int &len) const = 0;
  122. /**
  123.  * Returns the size of the requested HTTP file. Note that the file
  124.  * size is not always known, depending on whether the web server
  125.  * sends that information.
  126.  *
  127.  * @require getStatus() != HTTP_READER_CONNECTING
  128.  * @return  -1 if the size is unknown, -2 if an error occured,
  129.  *          or any other value if the size is known.
  130.  */
  131. virtual int getSize() const = 0;
  132. };
  133. }
  134. #endif /* _HTTP_READER_H_ */