diff options
Diffstat (limited to 'indra/llvfs')
| -rw-r--r-- | indra/llvfs/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | indra/llvfs/lldir.cpp | 16 | ||||
| -rw-r--r-- | indra/llvfs/lldir.h | 1 | ||||
| -rw-r--r-- | indra/llvfs/lldir_mac.cpp | 3 | ||||
| -rw-r--r-- | indra/llvfs/lldir_win32.cpp | 21 | ||||
| -rw-r--r-- | indra/llvfs/lldirguard.h | 78 | 
6 files changed, 106 insertions, 14 deletions
| diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt index cc0297e3dc..0de3fa33f9 100644 --- a/indra/llvfs/CMakeLists.txt +++ b/indra/llvfs/CMakeLists.txt @@ -23,6 +23,7 @@ set(llvfs_HEADER_FILES      CMakeLists.txt      lldir.h +    lldirguard.h      lllfsthread.h      llpidlock.h      llvfile.h diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 745e53c980..781321e5e4 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -404,6 +404,12 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd  		prefix = getExecutableDir();  		break; +	case LL_PATH_FONTS: +		prefix = getAppRODataDir(); +		prefix += mDirDelimiter; +		prefix += "fonts"; +		break; +		  	default:  		llassert(0);  	} @@ -419,6 +425,11 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd  		filename = subdir1 + mDirDelimiter + filename;  	} +	if (prefix.empty()) +	{ +		llwarns << "prefix is empty, possible bad filename" << llendl; +	} +	  	std::string expanded_filename;  	if (!filename.empty())  	{ @@ -673,11 +684,6 @@ void LLDir::dumpCurrentDirectories()  	LL_DEBUGS2("AppInit","Directories") << "  CAFile:				 " << getCAFile() << LL_ENDL;  	LL_DEBUGS2("AppInit","Directories") << "  SkinBaseDir:           " << getSkinBaseDir() << LL_ENDL;  	LL_DEBUGS2("AppInit","Directories") << "  SkinDir:               " << getSkinDir() << LL_ENDL; - -#if LL_LIBXUL_ENABLED - 	LL_DEBUGS2("AppInit","Directories") << "  HTML Path:             " << getExpandedFilename( LL_PATH_HTML, "" ) << llendl; - 	LL_DEBUGS2("AppInit","Directories") << "  Mozilla Profile Path:  " << getExpandedFilename( LL_PATH_MOZILLA_PROFILE, "" ) << llendl; -#endif  } diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index 6c9fea6b6a..07c814769e 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -60,6 +60,7 @@ typedef enum ELLPath  //	LL_PATH_HTML = 16,  	LL_PATH_EXECUTABLE = 16,  	LL_PATH_DEFAULT_SKIN = 17, +	LL_PATH_FONTS = 18,  	LL_PATH_LAST  } ELLPath; diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index 346f7dd8ed..7bc6f63e1f 100644 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -68,7 +68,8 @@ static void CFStringRefToLLString(CFStringRef stringRef, std::string &llString,  {  	if (stringRef)  	{ -		long	bufferSize = CFStringGetLength(stringRef) + 1; +		long stringSize = CFStringGetLength(stringRef) + 1; +		long bufferSize = CFStringGetMaximumSizeForEncoding(stringSize,kCFStringEncodingUTF8);  		char* buffer = new char[bufferSize];  		memset(buffer, 0, bufferSize);  		if (CFStringGetCString(stringRef, buffer, bufferSize, kCFStringEncodingUTF8)) diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp index 3e302764de..4c376f11a5 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -121,17 +121,22 @@ LLDir_Win32::LLDir_Win32()  	GetCurrentDirectory(MAX_PATH, w_str);  	mExecutableDir = utf16str_to_utf8str(llutf16string(w_str));  #endif -	 -	// When running in a dev tree, app_settings is under indra/newview/ -	// but in production it is under Program Files/SecondLife/ -	// Attempt to detect which one we're using. JC -	if (mExecutableDir.find("indra") != std::string::npos) -		mAppRODataDir = getCurPath(); -	else -		mAppRODataDir = mExecutableDir; + +	mAppRODataDir = ".";	  	mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins"; +	if (mExecutableDir.find("indra") == std::string::npos) +	{ +		// Running from installed directory.  Make sure current +		// directory isn't something crazy (e.g. if invoking from +		// command line). +		SetCurrentDirectory(utf8str_to_utf16str(mExecutableDir).c_str()); +		GetCurrentDirectory(MAX_PATH, w_str); +		mWorkingDir = utf16str_to_utf8str(llutf16string(w_str)); +	} +	llinfos << "mAppRODataDir = " << mAppRODataDir << llendl; +  	// Build the default cache directory  	mDefaultCacheDir = buildSLOSCacheDir(); diff --git a/indra/llvfs/lldirguard.h b/indra/llvfs/lldirguard.h new file mode 100644 index 0000000000..85366120d8 --- /dev/null +++ b/indra/llvfs/lldirguard.h @@ -0,0 +1,78 @@ +/**  + * @file lldirguard.h + * @brief Protect working directory from being changed in scope. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_DIRGUARD_H +#define LL_DIRGUARD_H + +#include "linden_common.h" +#include "llerror.h" + +#if LL_WINDOWS +class LLDirectoryGuard +{ +public: +	LLDirectoryGuard() +	{ +		mOrigDirLen = GetCurrentDirectory(MAX_PATH, mOrigDir); +	} + +	~LLDirectoryGuard() +	{ +		mFinalDirLen = GetCurrentDirectory(MAX_PATH, mFinalDir); +		if ((mOrigDirLen!=mFinalDirLen) || +			(wcsncmp(mOrigDir,mFinalDir,mOrigDirLen)!=0)) +		{ +			// Dir has changed +			std::string mOrigDirUtf8 = utf16str_to_utf8str(llutf16string(mOrigDir)); +			std::string mFinalDirUtf8 = utf16str_to_utf8str(llutf16string(mFinalDir)); +			llinfos << "Resetting working dir from " << mFinalDirUtf8 << " to " << mOrigDirUtf8 << llendl; +			SetCurrentDirectory(mOrigDir); +		} +	} + +private: +	TCHAR mOrigDir[MAX_PATH]; +	DWORD mOrigDirLen; +	TCHAR mFinalDir[MAX_PATH]; +	DWORD mFinalDirLen; +}; +#else // No-op outside Windows. +class LLDirectoryGuard +{ +public: +	LLDirectoryGuard() {} +	~LLDirectoryGuard() {} +}; +#endif  + + +#endif | 
