summaryrefslogtreecommitdiff
path: root/indra/llfilesystem/llfilesystem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llfilesystem/llfilesystem.cpp')
-rw-r--r--indra/llfilesystem/llfilesystem.cpp236
1 files changed, 72 insertions, 164 deletions
diff --git a/indra/llfilesystem/llfilesystem.cpp b/indra/llfilesystem/llfilesystem.cpp
index 6d6ff3d7e1..c6b20caa69 100644
--- a/indra/llfilesystem/llfilesystem.cpp
+++ b/indra/llfilesystem/llfilesystem.cpp
@@ -1,4 +1,4 @@
-/**
+/**
* @file filesystem.h
* @brief Simulate local file system operations.
* @Note The initial implementation does actually use standard C++
@@ -8,21 +8,21 @@
* $LicenseInfo:firstyear=2002&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$
*/
@@ -36,139 +36,74 @@
#include <fstream>
-const S32 LLFileSystem::READ = 0x00000001;
-const S32 LLFileSystem::WRITE = 0x00000002;
-const S32 LLFileSystem::READ_WRITE = 0x00000003; // LLFileSystem::READ & LLFileSystem::WRITE
-const S32 LLFileSystem::APPEND = 0x00000006; // 0x00000004 & LLFileSystem::WRITE
+const S32 LLFileSystem::READ = 0x00000001;
+const S32 LLFileSystem::WRITE = 0x00000002;
+const S32 LLFileSystem::READ_WRITE = 0x00000003; // LLFileSystem::READ & LLFileSystem::WRITE
+const S32 LLFileSystem::APPEND = 0x00000006; // 0x00000004 & LLFileSystem::WRITE
static LLTrace::BlockTimerStatHandle FTM_VFILE_WAIT("VFile Wait");
-LLDiskCache* LLFileSystem::mDiskCache = 0;
-std::string LLFileSystem::mCacheDirName = "cache";
-LLFileSystem::LLFileSystem(const LLUUID &file_id, const LLAssetType::EType file_type, S32 mode)
+LLFileSystem::LLFileSystem(const LLUUID& file_id, const LLAssetType::EType file_type, S32 mode)
{
- mFileType = file_type;
- mFileID = file_id;
- mPosition = 0;
+ mFileType = file_type;
+ mFileID = file_id;
+ mPosition = 0;
mBytesRead = 0;
- mReadComplete = FALSE;
- mMode = mode;
+ mMode = mode;
}
LLFileSystem::~LLFileSystem()
{
}
-const std::string assetTypeToString(LLAssetType::EType at)
+// static
+bool LLFileSystem::getExists(const LLUUID& file_id, const LLAssetType::EType file_type)
{
- /**
- * Make use of the C++17 (or is it 14) feature that allows
- * for inline initialization of an std::map<>
- */
- typedef std::map<LLAssetType::EType, std::string> asset_type_to_name_t;
- asset_type_to_name_t asset_type_to_name =
- {
- { LLAssetType::AT_TEXTURE, "TEXTURE" },
- { LLAssetType::AT_SOUND, "SOUND" },
- { LLAssetType::AT_CALLINGCARD, "CALLINGCARD" },
- { LLAssetType::AT_LANDMARK, "LANDMARK" },
- { LLAssetType::AT_SCRIPT, "SCRIPT" },
- { LLAssetType::AT_CLOTHING, "CLOTHING" },
- { LLAssetType::AT_OBJECT, "OBJECT" },
- { LLAssetType::AT_NOTECARD, "NOTECARD" },
- { LLAssetType::AT_CATEGORY, "CATEGORY" },
- { LLAssetType::AT_LSL_TEXT, "LSL_TEXT" },
- { LLAssetType::AT_LSL_BYTECODE, "LSL_BYTECODE" },
- { LLAssetType::AT_TEXTURE_TGA, "TEXTURE_TGA" },
- { LLAssetType::AT_BODYPART, "BODYPART" },
- { LLAssetType::AT_SOUND_WAV, "SOUND_WAV" },
- { LLAssetType::AT_IMAGE_TGA, "IMAGE_TGA" },
- { LLAssetType::AT_IMAGE_JPEG, "IMAGE_JPEG" },
- { LLAssetType::AT_ANIMATION, "ANIMATION" },
- { LLAssetType::AT_GESTURE, "GESTURE" },
- { LLAssetType::AT_SIMSTATE, "SIMSTATE" },
- { LLAssetType::AT_LINK, "LINK" },
- { LLAssetType::AT_LINK_FOLDER, "LINK_FOLDER" },
- { LLAssetType::AT_MARKETPLACE_FOLDER, "MARKETPLACE_FOLDER" },
- { LLAssetType::AT_WIDGET, "WIDGET" },
- { LLAssetType::AT_PERSON, "PERSON" },
- { LLAssetType::AT_MESH, "MESH" },
- { LLAssetType::AT_SETTINGS, "SETTINGS" },
- { LLAssetType::AT_UNKNOWN, "UNKNOWN" }
- };
+ std::string id_str;
+ file_id.toString(id_str);
+ const std::string extra_info = "";
+ const std::string filename = LLDiskCache::getInstance()->metaDataToFilepath(id_str, file_type, extra_info);
- asset_type_to_name_t::iterator iter = asset_type_to_name.find(at);
- if (iter != asset_type_to_name.end())
+ std::ifstream file(filename, std::ios::binary);
+ if (file.is_open())
{
- return iter->second;
+ file.seekg(0, std::ios::end);
+ return file.tellg() > 0;
}
-
- return std::string("UNKNOWN");
-}
-
-const std::string LLFileSystem::idToFilepath(const std::string id, LLAssetType::EType at)
-{
- /**
- * For the moment this is just {UUID}_{ASSET_TYPE}.txt but of
- * course, will be greatly expanded upon
- */
- std::ostringstream ss;
- ss << "00cache_";
- ss << id;
- ss << "_";
- ss << assetTypeToString(at);
- ss << ".txt";
-
- const std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, mCacheDirName, ss.str());
-
- return filepath;
-}
-
-// static
-bool LLFileSystem::getExists(const LLUUID &file_id, const LLAssetType::EType file_type)
-{
- std::string id_str;
- file_id.toString(id_str);
- const std::string filename = idToFilepath(id_str, file_type);
-
- std::ifstream file(filename, std::ios::binary);
- if (file.is_open())
- {
- file.seekg(0, std::ios::end);
- return file.tellg() > 0;
- }
- return false;
+ return false;
}
// static
-bool LLFileSystem::removeFile(const LLUUID &file_id, const LLAssetType::EType file_type)
+bool LLFileSystem::removeFile(const LLUUID& file_id, const LLAssetType::EType file_type)
{
std::string id_str;
file_id.toString(id_str);
- const std::string filename = idToFilepath(id_str, file_type);
-
+ const std::string extra_info = "";
+ const std::string filename = LLDiskCache::getInstance()->metaDataToFilepath(id_str, file_type, extra_info);
+
std::remove(filename.c_str());
return true;
}
// static
-bool LLFileSystem::renameFile(const LLUUID &old_file_id, const LLAssetType::EType old_file_type,
- const LLUUID &new_file_id, const LLAssetType::EType new_file_type)
+bool LLFileSystem::renameFile(const LLUUID& old_file_id, const LLAssetType::EType old_file_type,
+ const LLUUID& new_file_id, const LLAssetType::EType new_file_type)
{
std::string old_id_str;
old_file_id.toString(old_id_str);
- const std::string old_filename = idToFilepath(old_id_str, old_file_type);
+ const std::string extra_info = "";
+ const std::string old_filename = LLDiskCache::getInstance()->metaDataToFilepath(old_id_str, old_file_type, extra_info);
std::string new_id_str;
new_file_id.toString(new_id_str);
- const std::string new_filename = idToFilepath(new_id_str, new_file_type);
+ const std::string new_filename = LLDiskCache::getInstance()->metaDataToFilepath(new_id_str, new_file_type, extra_info);
if (std::rename(old_filename.c_str(), new_filename.c_str()))
{
// We would like to return FALSE here indicating the operation
// failed but the original code does not and doing so seems to
- // break a lot of things so we go with the flow...
+ // break a lot of things so we go with the flow...
//return FALSE;
}
@@ -176,11 +111,12 @@ bool LLFileSystem::renameFile(const LLUUID &old_file_id, const LLAssetType::ETyp
}
// static
-S32 LLFileSystem::getFileSize(const LLUUID &file_id, const LLAssetType::EType file_type)
+S32 LLFileSystem::getFileSize(const LLUUID& file_id, const LLAssetType::EType file_type)
{
std::string id_str;
file_id.toString(id_str);
- const std::string filename = idToFilepath(id_str, file_type);
+ const std::string extra_info = "";
+ const std::string filename = LLDiskCache::getInstance()->metaDataToFilepath(id_str, file_type, extra_info);
S32 file_size = 0;
std::ifstream file(filename, std::ios::binary);
@@ -193,15 +129,14 @@ S32 LLFileSystem::getFileSize(const LLUUID &file_id, const LLAssetType::EType fi
return file_size;
}
-BOOL LLFileSystem::read(U8 *buffer, S32 bytes, BOOL async, F32 priority)
+BOOL LLFileSystem::read(U8* buffer, S32 bytes)
{
- BOOL success = TRUE;
-
- mReadComplete = FALSE;
+ BOOL success = TRUE;
std::string id;
mFileID.toString(id);
- const std::string filename = idToFilepath(id, mFileType);
+ const std::string extra_info = "";
+ const std::string filename = LLDiskCache::getInstance()->metaDataToFilepath(id, mFileType, extra_info);
std::ifstream file(filename, std::ios::binary);
if (file.is_open())
@@ -226,44 +161,33 @@ BOOL LLFileSystem::read(U8 *buffer, S32 bytes, BOOL async, F32 priority)
{
success = FALSE;
}
-
- mReadComplete = TRUE;
}
- // update the last access time for the file - this is required
+ // update the last access time for the file - this is required
// even though we are reading and not writing because this is the
// way the cache works - it relies on a valid "last accessed time" for
// each file so it knows how to remove the oldest, unused files
- LLFileSystem::mDiskCache->updateFileAccessTime(filename);
+ LLDiskCache::getInstance()->updateFileAccessTime(filename);
return success;
}
-BOOL LLFileSystem::isReadComplete()
-{
- if (mReadComplete)
- {
- return TRUE;
- }
-
- return FALSE;
-}
-
S32 LLFileSystem::getLastBytesRead()
{
- return mBytesRead;
+ return mBytesRead;
}
BOOL LLFileSystem::eof()
{
- return mPosition >= getSize();
+ return mPosition >= getSize();
}
-BOOL LLFileSystem::write(const U8 *buffer, S32 bytes)
+BOOL LLFileSystem::write(const U8* buffer, S32 bytes)
{
std::string id_str;
mFileID.toString(id_str);
- const std::string filename = idToFilepath(id_str, mFileType);
+ const std::string extra_info = "";
+ const std::string filename = LLDiskCache::getInstance()->metaDataToFilepath(id_str, mFileType, extra_info);
BOOL success = FALSE;
@@ -295,37 +219,37 @@ BOOL LLFileSystem::write(const U8 *buffer, S32 bytes)
BOOL LLFileSystem::seek(S32 offset, S32 origin)
{
- if (-1 == origin)
- {
- origin = mPosition;
- }
+ if (-1 == origin)
+ {
+ origin = mPosition;
+ }
- S32 new_pos = origin + offset;
+ S32 new_pos = origin + offset;
- S32 size = getSize();
+ S32 size = getSize();
- if (new_pos > size)
- {
- LL_WARNS() << "Attempt to seek past end of file" << LL_ENDL;
+ if (new_pos > size)
+ {
+ LL_WARNS() << "Attempt to seek past end of file" << LL_ENDL;
- mPosition = size;
- return FALSE;
- }
- else if (new_pos < 0)
- {
- LL_WARNS() << "Attempt to seek past beginning of file" << LL_ENDL;
+ mPosition = size;
+ return FALSE;
+ }
+ else if (new_pos < 0)
+ {
+ LL_WARNS() << "Attempt to seek past beginning of file" << LL_ENDL;
- mPosition = 0;
- return FALSE;
- }
+ mPosition = 0;
+ return FALSE;
+ }
- mPosition = new_pos;
- return TRUE;
+ mPosition = new_pos;
+ return TRUE;
}
S32 LLFileSystem::tell() const
{
- return mPosition;
+ return mPosition;
}
S32 LLFileSystem::getSize()
@@ -335,11 +259,11 @@ S32 LLFileSystem::getSize()
S32 LLFileSystem::getMaxSize()
{
- // offer up a huge size since we don't care what the max is
+ // offer up a huge size since we don't care what the max is
return INT_MAX;
}
-BOOL LLFileSystem::rename(const LLUUID &new_id, const LLAssetType::EType new_type)
+BOOL LLFileSystem::rename(const LLUUID& new_id, const LLAssetType::EType new_type)
{
LLFileSystem::renameFile(mFileID, mFileType, new_id, new_type);
@@ -355,19 +279,3 @@ BOOL LLFileSystem::remove()
return TRUE;
}
-
-// static
-void LLFileSystem::initClass()
-{
- const std::string cache_dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, mCacheDirName);
-
- LLFileSystem::mDiskCache = new LLDiskCache(cache_dir);
-
- mDiskCache->purge();
-}
-
-// static
-void LLFileSystem::cleanupClass()
-{
- delete LLFileSystem::mDiskCache;
-}