diff options
author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2024-05-15 16:35:49 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-15 16:35:49 +0300 |
commit | e49dcb8d0c9f539997effb640e350d9d0689aae6 (patch) | |
tree | 1bf99eaccce6de17c62f13c6595f7f497548dc5c /indra/newview/llteleporthistorystorage.cpp | |
parent | 531cd34f670170ade57f8813fe48012b61a1d3c2 (diff) | |
parent | 5f8a7374b9f18e0112d6749a9c845bd077a81acb (diff) |
Merge pull request #1476 from secondlife/marchcat/x-b-merge
Maint X -> Maint B merge
Diffstat (limited to 'indra/newview/llteleporthistorystorage.cpp')
-rw-r--r-- | indra/newview/llteleporthistorystorage.cpp | 300 |
1 files changed, 150 insertions, 150 deletions
diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp index 7d4988c0cc..fa4e92e209 100644 --- a/indra/newview/llteleporthistorystorage.cpp +++ b/indra/newview/llteleporthistorystorage.cpp @@ -5,21 +5,21 @@ * $LicenseInfo:firstyear=2009&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -41,39 +41,39 @@ const F64 MAX_GLOBAL_POS_OFFSET = 5.0f; LLTeleportHistoryPersistentItem::LLTeleportHistoryPersistentItem(const LLSD& val) { - mTitle = val["title"].asString(); - mGlobalPos.setValue(val["global_pos"]); - mDate = val["date"]; + mTitle = val["title"].asString(); + mGlobalPos.setValue(val["global_pos"]); + mDate = val["date"]; } LLSD LLTeleportHistoryPersistentItem::toLLSD() const { - LLSD val; + LLSD val; - val["title"] = mTitle; - val["global_pos"] = mGlobalPos.getValue(); - val["date"] = mDate; + val["title"] = mTitle; + val["global_pos"] = mGlobalPos.getValue(); + val["date"] = mDate; - return val; + return val; } struct LLSortItemsByDate { - bool operator()(const LLTeleportHistoryPersistentItem& a, const LLTeleportHistoryPersistentItem& b) - { - return a.mDate < b.mDate; - } + bool operator()(const LLTeleportHistoryPersistentItem& a, const LLTeleportHistoryPersistentItem& b) + { + return a.mDate < b.mDate; + } }; LLTeleportHistoryStorage::LLTeleportHistoryStorage() : - mFilename("teleport_history.txt") + mFilename("teleport_history.txt") { - mItems.clear(); - LLTeleportHistory *th = LLTeleportHistory::getInstance(); - if (th) - th->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryStorage::onTeleportHistoryChange, this)); + mItems.clear(); + LLTeleportHistory *th = LLTeleportHistory::getInstance(); + if (th) + th->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryStorage::onTeleportHistoryChange, this)); - load(); + load(); } LLTeleportHistoryStorage::~LLTeleportHistoryStorage() @@ -82,183 +82,183 @@ LLTeleportHistoryStorage::~LLTeleportHistoryStorage() void LLTeleportHistoryStorage::onTeleportHistoryChange() { - LLTeleportHistory *th = LLTeleportHistory::getInstance(); - if (!th) - return; + LLTeleportHistory *th = LLTeleportHistory::getInstance(); + if (!th) + return; - // Hacky sanity check. (EXT-6798) - if (th->getItems().size() == 0) - { - llassert(!"Inconsistent teleport history state"); - return; - } + // Hacky sanity check. (EXT-6798) + if (th->getItems().size() == 0) + { + llassert(!"Inconsistent teleport history state"); + return; + } - const LLTeleportHistoryItem &item = th->getItems()[th->getCurrentItemIndex()]; + const LLTeleportHistoryItem &item = th->getItems()[th->getCurrentItemIndex()]; - addItem(item.mTitle, item.mGlobalPos); - save(); + addItem(item.mTitle, item.mGlobalPos); + save(); } void LLTeleportHistoryStorage::purgeItems() { - mItems.clear(); - mHistoryChangedSignal(-1); + mItems.clear(); + mHistoryChangedSignal(-1); } void LLTeleportHistoryStorage::addItem(const std::string title, const LLVector3d& global_pos) { - addItem(title, global_pos, LLDate::now()); + addItem(title, global_pos, LLDate::now()); } bool LLTeleportHistoryStorage::compareByTitleAndGlobalPos(const LLTeleportHistoryPersistentItem& a, const LLTeleportHistoryPersistentItem& b) { - return a.mTitle == b.mTitle && (a.mGlobalPos - b.mGlobalPos).length() < MAX_GLOBAL_POS_OFFSET; + return a.mTitle == b.mTitle && (a.mGlobalPos - b.mGlobalPos).length() < MAX_GLOBAL_POS_OFFSET; } void LLTeleportHistoryStorage::addItem(const std::string title, const LLVector3d& global_pos, const LLDate& date) { - LLTeleportHistoryPersistentItem item(title, global_pos, date); - - slurl_list_t::iterator item_iter = std::find_if(mItems.begin(), mItems.end(), - boost::bind(&LLTeleportHistoryStorage::compareByTitleAndGlobalPos, this, _1, item)); - - // If there is such item already, remove it, since new item is more recent - S32 removed_index = -1; - if (item_iter != mItems.end()) - { - removed_index = item_iter - mItems.begin(); - mItems.erase(item_iter); - } - - mItems.push_back(item); - - // Check whether sorting is needed - if (mItems.size() > 1) - { - item_iter = mItems.end(); - - item_iter--; - item_iter--; - - // If second to last item is more recent than last, then resort items - if (item_iter->mDate > item.mDate) - { - removed_index = -1; - std::sort(mItems.begin(), mItems.end(), LLSortItemsByDate()); - } - } - - mHistoryChangedSignal(removed_index); + LLTeleportHistoryPersistentItem item(title, global_pos, date); + + slurl_list_t::iterator item_iter = std::find_if(mItems.begin(), mItems.end(), + boost::bind(&LLTeleportHistoryStorage::compareByTitleAndGlobalPos, this, _1, item)); + + // If there is such item already, remove it, since new item is more recent + S32 removed_index = -1; + if (item_iter != mItems.end()) + { + removed_index = item_iter - mItems.begin(); + mItems.erase(item_iter); + } + + mItems.push_back(item); + + // Check whether sorting is needed + if (mItems.size() > 1) + { + item_iter = mItems.end(); + + item_iter--; + item_iter--; + + // If second to last item is more recent than last, then resort items + if (item_iter->mDate > item.mDate) + { + removed_index = -1; + std::sort(mItems.begin(), mItems.end(), LLSortItemsByDate()); + } + } + + mHistoryChangedSignal(removed_index); } void LLTeleportHistoryStorage::removeItem(S32 idx) { - if (idx < 0 || idx >= (S32)mItems.size()) - return; + if (idx < 0 || idx >= (S32)mItems.size()) + return; - mItems.erase (mItems.begin() + idx); + mItems.erase (mItems.begin() + idx); } void LLTeleportHistoryStorage::save() { // build filename for each user - std::string resolvedFilename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename); - - // open the history file for writing - llofstream file(resolvedFilename.c_str()); - if (!file.is_open()) - { - LL_WARNS() << "can't open teleport history file \"" << mFilename << "\" for writing" << LL_ENDL; - return; - } - - for (size_t i=0; i<mItems.size(); i++) - { - LLSD s_item = mItems[i].toLLSD(); - file << LLSDOStreamer<LLSDNotationFormatter>(s_item) << std::endl; - } - - file.close(); + std::string resolvedFilename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename); + + // open the history file for writing + llofstream file(resolvedFilename.c_str()); + if (!file.is_open()) + { + LL_WARNS() << "can't open teleport history file \"" << mFilename << "\" for writing" << LL_ENDL; + return; + } + + for (size_t i=0; i<mItems.size(); i++) + { + LLSD s_item = mItems[i].toLLSD(); + file << LLSDOStreamer<LLSDNotationFormatter>(s_item) << std::endl; + } + + file.close(); } void LLTeleportHistoryStorage::load() { // build filename for each user - std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename); - - // open the history file for reading - llifstream file(resolved_filename.c_str()); - if (!file.is_open()) - { - LL_WARNS() << "can't load teleport history from file \"" << mFilename << "\"" << LL_ENDL; - return; - } - - // remove current entries before we load over them - mItems.clear(); - - // the parser's destructor is protected so we cannot create in the stack. - LLPointer<LLSDParser> parser = new LLSDNotationParser(); - std::string line; - while (std::getline(file, line)) - { - if (line.empty()) - { - LL_WARNS() << "Teleport history contains empty line."<< LL_ENDL; - continue; - } - - LLSD s_item; - std::istringstream iss(line); - if (parser->parse(iss, s_item, line.length()) == LLSDParser::PARSE_FAILURE) - { - LL_INFOS() << "Parsing saved teleport history failed" << LL_ENDL; - break; - } - - mItems.push_back(s_item); - } - - file.close(); - - std::sort(mItems.begin(), mItems.end(), LLSortItemsByDate()); - - mHistoryChangedSignal(-1); + std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename); + + // open the history file for reading + llifstream file(resolved_filename.c_str()); + if (!file.is_open()) + { + LL_WARNS() << "can't load teleport history from file \"" << mFilename << "\"" << LL_ENDL; + return; + } + + // remove current entries before we load over them + mItems.clear(); + + // the parser's destructor is protected so we cannot create in the stack. + LLPointer<LLSDParser> parser = new LLSDNotationParser(); + std::string line; + while (std::getline(file, line)) + { + if (line.empty()) + { + LL_WARNS() << "Teleport history contains empty line."<< LL_ENDL; + continue; + } + + LLSD s_item; + std::istringstream iss(line); + if (parser->parse(iss, s_item, line.length()) == LLSDParser::PARSE_FAILURE) + { + LL_INFOS() << "Parsing saved teleport history failed" << LL_ENDL; + break; + } + + mItems.push_back(s_item); + } + + file.close(); + + std::sort(mItems.begin(), mItems.end(), LLSortItemsByDate()); + + mHistoryChangedSignal(-1); } void LLTeleportHistoryStorage::dump() const { - LL_INFOS() << "Teleport history storage dump (" << mItems.size() << " items):" << LL_ENDL; + LL_INFOS() << "Teleport history storage dump (" << mItems.size() << " items):" << LL_ENDL; - for (size_t i=0; i<mItems.size(); i++) - { - std::stringstream line; - line << i << ": " << mItems[i].mTitle; - line << " global pos: " << mItems[i].mGlobalPos; - line << " date: " << mItems[i].mDate; + for (size_t i=0; i<mItems.size(); i++) + { + std::stringstream line; + line << i << ": " << mItems[i].mTitle; + line << " global pos: " << mItems[i].mGlobalPos; + line << " date: " << mItems[i].mDate; - LL_INFOS() << line.str() << LL_ENDL; - } + LL_INFOS() << line.str() << LL_ENDL; + } } boost::signals2::connection LLTeleportHistoryStorage::setHistoryChangedCallback(history_callback_t cb) { - return mHistoryChangedSignal.connect(cb); + return mHistoryChangedSignal.connect(cb); } void LLTeleportHistoryStorage::goToItem(S32 idx) { - // Validate specified index. - if (idx < 0 || idx >= (S32)mItems.size()) - { - LL_WARNS() << "Invalid teleport history index (" << idx << ") specified" << LL_ENDL; - dump(); - return; - } - - // Attempt to teleport to the requested item. - gAgent.teleportViaLocation(mItems[idx].mGlobalPos); + // Validate specified index. + if (idx < 0 || idx >= (S32)mItems.size()) + { + LL_WARNS() << "Invalid teleport history index (" << idx << ") specified" << LL_ENDL; + dump(); + return; + } + + // Attempt to teleport to the requested item. + gAgent.teleportViaLocation(mItems[idx].mGlobalPos); } void LLTeleportHistoryStorage::showItemOnMap(S32 idx) |