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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lllivefile.cpp
  3.  *
  4.  * $LicenseInfo:firstyear=2006&license=viewergpl$
  5.  * 
  6.  * Copyright (c) 2006-2010, Linden Research, Inc.
  7.  * 
  8.  * Second Life Viewer Source Code
  9.  * The source code in this file ("Source Code") is provided by Linden Lab
  10.  * to you under the terms of the GNU General Public License, version 2.0
  11.  * ("GPL"), unless you have obtained a separate licensing agreement
  12.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  13.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  14.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  15.  * 
  16.  * There are special exceptions to the terms and conditions of the GPL as
  17.  * it is applied to this Source Code. View the full text of the exception
  18.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  19.  * online at
  20.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  21.  * 
  22.  * By copying, modifying or distributing this software, you acknowledge
  23.  * that you have read and understood your obligations described above,
  24.  * and agree to abide by those obligations.
  25.  * 
  26.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  27.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  28.  * COMPLETENESS OR PERFORMANCE.
  29.  * $/LicenseInfo$
  30.  */
  31. #include "linden_common.h"
  32. #include "lllivefile.h"
  33. #include "llframetimer.h"
  34. #include "lleventtimer.h"
  35. const F32 DEFAULT_CONFIG_FILE_REFRESH = 5.0f;
  36. class LLLiveFile::Impl
  37. {
  38. public:
  39. Impl(const std::string& filename, const F32 refresh_period);
  40. ~Impl();
  41. bool check();
  42. void changed();
  43. bool mForceCheck;
  44. F32 mRefreshPeriod;
  45. LLFrameTimer mRefreshTimer;
  46. std::string mFilename;
  47. time_t mLastModTime;
  48. time_t mLastStatTime;
  49. bool mLastExists;
  50. LLEventTimer* mEventTimer;
  51. };
  52. LLLiveFile::Impl::Impl(const std::string& filename, const F32 refresh_period)
  53. :
  54. mForceCheck(true),
  55. mRefreshPeriod(refresh_period),
  56. mFilename(filename),
  57. mLastModTime(0),
  58. mLastStatTime(0),
  59. mLastExists(false),
  60. mEventTimer(NULL)
  61. {
  62. }
  63. LLLiveFile::Impl::~Impl()
  64. {
  65. delete mEventTimer;
  66. }
  67. LLLiveFile::LLLiveFile(const std::string& filename, const F32 refresh_period)
  68. : impl(* new Impl(filename, refresh_period))
  69. {
  70. }
  71. LLLiveFile::~LLLiveFile()
  72. {
  73. delete &impl;
  74. }
  75. bool LLLiveFile::Impl::check()
  76. {
  77. if (!mForceCheck && mRefreshTimer.getElapsedTimeF32() < mRefreshPeriod)
  78. {
  79. // Skip the check if not enough time has elapsed and we're not
  80. // forcing a check of the file
  81. return false;
  82. }
  83. mForceCheck = false;
  84. mRefreshTimer.reset();
  85. // Stat the file to see if it exists and when it was last modified.
  86. llstat stat_data;
  87. int res = LLFile::stat(mFilename, &stat_data);
  88. if (res)
  89. {
  90. // Couldn't stat the file, that means it doesn't exist or is
  91. // broken somehow.  Clear flags and return.
  92. if (mLastExists)
  93. {
  94. mLastExists = false;
  95. return true; // no longer existing is a change!
  96. }
  97. return false;
  98. }
  99. // The file exists, decide if we want to load it.
  100. if (mLastExists)
  101. {
  102. // The file existed last time, don't read it if it hasn't changed since
  103. // last time.
  104. if (stat_data.st_mtime <= mLastModTime)
  105. {
  106. return false;
  107. }
  108. }
  109. // We want to read the file.  Update status info for the file.
  110. mLastExists = true;
  111. mLastStatTime = stat_data.st_mtime;
  112. return true;
  113. }
  114. void LLLiveFile::Impl::changed()
  115. {
  116. // we wanted to read this file, and we were successful.
  117. mLastModTime = mLastStatTime;
  118. }
  119. bool LLLiveFile::checkAndReload()
  120. {
  121. bool changed = impl.check();
  122. if (changed)
  123. {
  124. if(loadFile())
  125. {
  126. impl.changed();
  127. this->changed();
  128. }
  129. else
  130. {
  131. changed = false;
  132. }
  133. }
  134. return changed;
  135. }
  136. std::string LLLiveFile::filename() const
  137. {
  138. return impl.mFilename;
  139. }
  140. namespace
  141. {
  142. class LiveFileEventTimer : public LLEventTimer
  143. {
  144. public:
  145. LiveFileEventTimer(LLLiveFile& f, F32 refresh)
  146. : LLEventTimer(refresh), mLiveFile(f)
  147. { }
  148. BOOL tick()
  149. mLiveFile.checkAndReload(); 
  150. return FALSE;
  151. }
  152. private:
  153. LLLiveFile& mLiveFile;
  154. };
  155. }
  156. void LLLiveFile::addToEventTimer()
  157. {
  158. impl.mEventTimer = new LiveFileEventTimer(*this, impl.mRefreshPeriod);
  159. }
  160. void LLLiveFile::setRefreshPeriod(F32 seconds)
  161. {
  162. if (seconds < 0.f)
  163. {
  164. seconds = -seconds;
  165. }
  166. impl.mRefreshPeriod = seconds;
  167. }