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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lllocationhistory.cpp
  3.  * @brief Typed locations history
  4.  *
  5.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2009-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "lllocationhistory.h"
  34. #include <iomanip> // for std::setw()
  35. #include "llui.h"
  36. #include "llsd.h"
  37. #include "llsdserialize.h"
  38. LLLocationHistory::LLLocationHistory() :
  39. mFilename("typed_locations.txt")
  40. {
  41. }
  42. void LLLocationHistory::addItem(const LLLocationHistoryItem& item) {
  43. static LLUICachedControl<S32> max_items("LocationHistoryMaxSize", 100);
  44. // check if this item doesn't duplicate any existing one
  45. location_list_t::iterator item_iter = std::find(mItems.begin(), mItems.end(),item);
  46. if(item_iter != mItems.end()) // if it already exists, erase the old one
  47. {
  48. mItems.erase(item_iter);
  49. }
  50. mItems.push_back(item);
  51. // If the vector size exceeds the maximum, purge the oldest items (at the start of the mItems vector).
  52. if ((S32)mItems.size() > max_items)
  53. {
  54. mItems.erase(mItems.begin(), mItems.end()-max_items);
  55. }
  56. llassert((S32)mItems.size() <= max_items);
  57. }
  58. /*
  59.  * @brief Try to find item in history. 
  60.  * If item has been founded, it will be places into end of history.
  61.  * @return true - item has founded
  62.  */
  63. bool LLLocationHistory::touchItem(const LLLocationHistoryItem& item) {
  64. bool result = false;
  65. location_list_t::iterator item_iter = std::find(mItems.begin(), mItems.end(), item);
  66. // the last used item should be the first in the history
  67. if (item_iter != mItems.end()) {
  68. mItems.erase(item_iter);
  69. mItems.push_back(item);
  70. result = true;
  71. }
  72. return result;
  73. }
  74. void LLLocationHistory::removeItems()
  75. {
  76. mItems.clear();
  77. }
  78. bool LLLocationHistory::getMatchingItems(std::string substring, location_list_t& result) const
  79. {
  80. // *TODO: an STL algorithm would look nicer
  81. result.clear();
  82. std::string needle = substring;
  83. LLStringUtil::toLower(needle);
  84. for (location_list_t::const_iterator it = mItems.begin(); it != mItems.end(); ++it)
  85. {
  86. std::string haystack = it->getLocation();
  87. LLStringUtil::toLower(haystack);
  88. if (haystack.find(needle) != std::string::npos)
  89. result.push_back(*it);
  90. }
  91. return result.size();
  92. }
  93. void LLLocationHistory::dump() const
  94. {
  95. llinfos << "Location history dump:" << llendl;
  96. int i = 0;
  97. for (location_list_t::const_iterator it = mItems.begin(); it != mItems.end(); ++it, ++i)
  98. {
  99.     llinfos << "#" << std::setw(2) << std::setfill('0') << i << ": " << it->getLocation() << llendl;
  100. }
  101. }
  102. void LLLocationHistory::save() const
  103. {
  104. // build filename for each user
  105. std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename);
  106. if (resolved_filename.empty())
  107. {
  108. llinfos << "can't get path to location history filename - probably not logged in yet." << llendl;
  109. return;
  110. }
  111. // open a file for writing
  112. llofstream file (resolved_filename);
  113. if (!file.is_open())
  114. {
  115. llwarns << "can't open location history file "" << mFilename << "" for writing" << llendl;
  116. return;
  117. }
  118. for (location_list_t::const_iterator it = mItems.begin(); it != mItems.end(); ++it)
  119. {
  120. file << LLSDOStreamer<LLSDNotationFormatter>((*it).toLLSD()) << std::endl;
  121. }
  122. file.close();
  123. }
  124. void LLLocationHistory::load()
  125. {
  126. llinfos << "Loading location history." << llendl;
  127. // build filename for each user
  128. std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename);
  129. llifstream file(resolved_filename);
  130. if (!file.is_open())
  131. {
  132. llwarns << "can't load location history from file "" << mFilename << """ << llendl;
  133. return;
  134. }
  135. removeItems();
  136. // add each line in the file to the list
  137. std::string line;
  138. LLPointer<LLSDParser> parser = new LLSDNotationParser();
  139. while (std::getline(file, line)) {
  140. LLSD s_item;
  141. std::istringstream iss(line);
  142. if (parser->parse(iss, s_item, line.length()) == LLSDParser::PARSE_FAILURE)
  143. {
  144. llinfos<< "Parsing saved teleport history failed" << llendl;
  145. break;
  146. }
  147. mItems.push_back(s_item);
  148. }
  149. file.close();
  150. mLoadedSignal();
  151. }