diff options
Diffstat (limited to 'indra/llvfs')
| -rwxr-xr-x | indra/llvfs/lldir.cpp | 88 | ||||
| -rwxr-xr-x | indra/llvfs/lldir.h | 8 | ||||
| -rwxr-xr-x | indra/llvfs/lldir_mac.cpp | 2 | 
3 files changed, 94 insertions, 4 deletions
| diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 1bb17eae81..5f4fb8f4a0 100755 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -42,6 +42,7 @@  #include "lldiriterator.h"  #include "stringize.h" +#include <boost/filesystem.hpp>  #include <boost/foreach.hpp>  #include <boost/range/begin.hpp>  #include <boost/range/end.hpp> @@ -76,6 +77,7 @@ const char  	*LLDir::SKINBASE = "";  static const char* const empty = ""; +std::string LLDir::sDumpDir = "";  LLDir::LLDir()  :	mAppName(""), @@ -99,7 +101,32 @@ LLDir::~LLDir()  {  } - +std::vector<std::string> LLDir::getFilesInDir(const std::string &dirname) +{ +    //Returns a vector of fullpath filenames. +     +    boost::filesystem::path p (dirname); +    std::vector<std::string> v; +     +    if (exists(p)) +    { +        if (is_directory(p)) +        { +            boost::filesystem::directory_iterator end_iter; +            for (boost::filesystem::directory_iterator dir_itr(p); +                 dir_itr != end_iter; +                 ++dir_itr) +            { +                if (boost::filesystem::is_regular_file(dir_itr->status())) +                { +                    v.push_back(dir_itr->path().filename().string()); +                } +            } +        } +    } +    return v; +}    +              S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)  {  	S32 count = 0; @@ -158,6 +185,34 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)  	return count;  } +U32 LLDir::deleteDirAndContents(const std::string& dir_name) +{ +    //Removes the directory and its contents.  Returns number of files deleted. +	 +	U32 num_deleted = 0; + +	try +	{ +	   boost::filesystem::path dir_path(dir_name); +	   if (boost::filesystem::exists (dir_path)) +	   { +	      if (!boost::filesystem::is_empty (dir_path)) +		  {   // Directory has content +		     num_deleted = boost::filesystem::remove_all (dir_path); +		  } +		  else +		  {   // Directory is empty +		     boost::filesystem::remove (dir_path); +		  } +	   } +	} +	catch (boost::filesystem::filesystem_error &er) +	{  +		LL_WARNS() << "Failed to delete " << dir_name << " with error " << er.code().message() << LL_ENDL; +	}  +	return num_deleted; +} +  const std::string LLDir::findFile(const std::string &filename,   						   const std::string& searchPath1,   						   const std::string& searchPath2,  @@ -244,11 +299,36 @@ const std::string &LLDir::getLindenUserDir() const  	return mLindenUserDir;  } -const std::string &LLDir::getChatLogsDir() const +const std::string& LLDir::getChatLogsDir() const  {  	return mChatLogsDir;  } +void LLDir::setDumpDir( const std::string& path ) +{ +    LLDir::sDumpDir = path; +    if (! sDumpDir.empty() && sDumpDir.rbegin() == mDirDelimiter.rbegin() ) +    { +        sDumpDir.erase(sDumpDir.size() -1); +    } +} + +const std::string &LLDir::getDumpDir() const +{ +    if (sDumpDir.empty() ) +    { +        LLUUID uid; +        uid.generate(); +         +        sDumpDir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "") +                    + "dump-" + uid.asString(); + +        dir_exists_or_crash(sDumpDir);   +    } + +	return LLDir::sDumpDir; +} +  const std::string &LLDir::getPerAccountChatLogsDir() const  {  	return mPerAccountChatLogsDir; @@ -420,6 +500,10 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd  		prefix = getCacheDir();  		break; +    case LL_PATH_DUMP: +        prefix=getDumpDir(); +        break; +              	case LL_PATH_USER_SETTINGS:  		prefix = add(getOSUserAppDir(), "user_settings");  		break; diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index e02bf552aa..b219c6e29f 100755 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -53,6 +53,7 @@ typedef enum ELLPath  	LL_PATH_EXECUTABLE = 16,  	LL_PATH_DEFAULT_SKIN = 17,  	LL_PATH_FONTS = 18, +    LL_PATH_DUMP = 19,  	LL_PATH_LAST  } ELLPath; @@ -71,7 +72,8 @@ class LLDir  		const std::string& app_read_only_data_dir = "") = 0;  	virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask); - +    U32 deleteDirAndContents(const std::string& dir_name); +    std::vector<std::string> getFilesInDir(const std::string &dirname);  // pure virtual functions  	virtual std::string getCurPath() = 0;  	virtual bool fileExists(const std::string &filename) const = 0; @@ -92,6 +94,7 @@ class LLDir  	const std::string &getOSUserAppDir() const;	// Location of the os-specific user app dir  	const std::string &getLindenUserDir() const;	// Location of the Linden user dir.  	const std::string &getChatLogsDir() const;	// Location of the chat logs dir. +	const std::string &getDumpDir() const;	// Location of the per-run dump dir.  	const std::string &getPerAccountChatLogsDir() const;	// Location of the per account chat logs dir.  	const std::string &getTempDir() const;			// Common temporary directory  	const std::string  getCacheDir(bool get_default = false) const;	// Location of the cache. @@ -179,6 +182,8 @@ class LLDir  	// For producing safe download file names from potentially unsafe ones  	static std::string getScrubbedFileName(const std::string uncleanFileName);  	static std::string getForbiddenFileChars(); +    void setDumpDir( const std::string& path ); +  	virtual void setChatLogsDir(const std::string &path);		// Set the chat logs dir to this user's dir  	virtual void setPerAccountChatLogsDir(const std::string &username);		// Set the per user chat log directory. @@ -245,6 +250,7 @@ protected:  	std::vector<std::string> mSearchSkinDirs;  	std::string mLanguage;              // Current viewer language  	std::string mLLPluginDir;			// Location for plugins and plugin shell +    static std::string sDumpDir;            // Per-run crash report subdir of log directory.  	std::string mUserName;				// Current user name  }; diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index ac9ec8e8ee..4038c92465 100755 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -134,7 +134,7 @@ LLDir_Mac::LLDir_Mac()  		{              mOSCacheDir = *cachedir; -            //Aura TODO:  This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife.  Last dir level could go away. +            //TODO:  This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife.  Last dir level could go away.              CreateDirectory(mOSCacheDir, secondLifeString, NULL);  		} | 
