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

外挂编程

开发平台:

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 _MIRROR_HTTP_READER_H_
  20. #define _MIRROR_HTTP_READER_H_
  21. #include "http-reader.h"
  22. #include <list>
  23. namespace OpenKore {
  24. class _MirrorHttpReaderPrivate;
  25. /**
  26.  * A HttpReader which accepts a list of mirrors. If
  27.  * it fails to download from the first server, it will
  28.  * try the next one, until there are no more mirrors to
  29.  * try.
  30.  */
  31. class MirrorHttpReader: public HttpReader {
  32. private:
  33. _MirrorHttpReaderPrivate *priv;
  34. std::list<char *> urls;
  35. unsigned int timeout;
  36. /** @invariant userAgent != NULL */
  37. char *userAgent;
  38. /**
  39.  * The current status. Only meaningful if http == NULL
  40.  *
  41.  * @invariant
  42.  *     status == HTTP_READER_CONNECTING || status == HTTP_READER_ERROR
  43.  */
  44. HttpReaderStatus status;
  45. /**
  46.  * The current error. Only meaningful if http == NULL
  47.  */
  48. const char *error;
  49. /**
  50.  * The HttpReader (with a specific mirror) to use for downloading.
  51.  *
  52.  * @invariant
  53.  *     No good mirror has been found (yet) == (http == NULL)
  54.  *     if http == NULL:
  55.  *         status == HTTP_READER_CONNECTING || status == HTTP_READER_ERROR
  56.  *     if getStatus() == HTTP_READER_DOWNLOADING || getStatus() == HTTP_READER_DONE:
  57.  *         http != NULL
  58.  */
  59. HttpReader *http;
  60. public:
  61. /**
  62.  * Create a new MirrorHttpReader object. It will immediately
  63.  * start connecting and downloading.
  64.  *
  65.  * Before creating a MirrorHttpReader, you must have called
  66.  * StdHttpReader::init().
  67.  *
  68.  * @param urls     A list of mirror URLs to try.
  69.  * @param timeout  The maximum amount of time (in miliseconds) that MirrorHttpReader
  70.  *                 is allowed to spend on connecting to one mirror.
  71.  *                 A value of 0 means that the default timeout will be used (which is
  72.  *                 undefined; it may be 30 seconds or forever, for example).
  73.  *                 This parameter does not affect the download time.
  74.  * @param userAgent  The useragent string to use.
  75.  * @require
  76.  *     !urls.empty()
  77.  *     StdHttpReader::init() must have been called.
  78.  */
  79. MirrorHttpReader(const std::list<const char *> &urls,
  80.  unsigned int timeout = 0,
  81.  const char *userAgent = HttpReader::DEFAULT_USER_AGENT);
  82. ~MirrorHttpReader();
  83. virtual HttpReaderStatus getStatus() const;
  84. virtual const char *getError() const;
  85. virtual int pullData(void *buf, unsigned int size);
  86. virtual const char *getData(unsigned int &len) const;
  87. virtual int getSize() const;
  88. friend class _MirrorHttpReaderPrivate;
  89. };
  90. }
  91. #endif