networkio.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file   networkio.h
  3.  * @author Nat Goodspeed
  4.  * @date   2009-01-09
  5.  * @brief  
  6.  * 
  7.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2009-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #if ! defined(LL_NETWORKIO_H)
  35. #define LL_NETWORKIO_H
  36. #include "llmemory.h"               // LLSingleton
  37. #include "llapr.h"
  38. #include "llares.h"
  39. #include "llpumpio.h"
  40. #include "llhttpclient.h"
  41. /*****************************************************************************
  42. *   NetworkIO
  43. *****************************************************************************/
  44. // Doing this initialization in a class constructor makes sense. But we don't
  45. // want to redo it for each different test. Nor do we want to do it at static-
  46. // init time. Use the lazy, on-demand initialization we get from LLSingleton.
  47. class NetworkIO: public LLSingleton<NetworkIO>
  48. {
  49. public:
  50.     NetworkIO():
  51.         mServicePump(NULL),
  52.         mDone(false)
  53.     {
  54.         ll_init_apr();
  55.         if (! gAPRPoolp)
  56.         {
  57.             throw std::runtime_error("Can't initialize APR");
  58.         }
  59.         // Create IO Pump to use for HTTP Requests.
  60.         mServicePump = new LLPumpIO(gAPRPoolp);
  61.         LLHTTPClient::setPump(*mServicePump);
  62.         if (ll_init_ares() == NULL || !gAres->isInitialized())
  63.         {
  64.             throw std::runtime_error("Can't start DNS resolver");
  65.         }
  66.         // You can interrupt pump() without waiting the full timeout duration
  67.         // by posting an event to the LLEventPump named "done".
  68.         LLEventPumps::instance().obtain("done").listen("self",
  69.                                                        boost::bind(&NetworkIO::done, this, _1));
  70.     }
  71.     bool pump(F32 timeout=10)
  72.     {
  73.         // Reset the done flag so we don't pop out prematurely
  74.         mDone = false;
  75.         // Evidently the IO structures underlying LLHTTPClient need to be
  76.         // "pumped". Do some stuff normally performed in the viewer's main
  77.         // loop.
  78.         LLTimer timer;
  79.         while (timer.getElapsedTimeF32() < timeout)
  80.         {
  81.             if (mDone)
  82.             {
  83. //              std::cout << "NetworkIO::pump(" << timeout << "): breaking loop after "
  84. //                        << timer.getElapsedTimeF32() << " secondsn";
  85.                 return true;
  86.             }
  87.             pumpOnce();
  88.         }
  89.         return false;
  90.     }
  91.     void pumpOnce()
  92.     {
  93.         gAres->process();
  94.         mServicePump->pump();
  95.         mServicePump->callback();
  96.     }
  97.     bool done(const LLSD&)
  98.     {
  99.         mDone = true;
  100.         return false;
  101.     }
  102. private:
  103.     LLPumpIO* mServicePump;
  104.     bool mDone;
  105. };
  106. #endif /* ! defined(LL_NETWORKIO_H) */