All pastes #1905061 Raw Edit

Someone

public diff v1 · immutable
#1905061 ·published 2010-07-21 05:29 UTC
rendered paste body
Index: src/main.c===================================================================--- src/main.c	(revision 11240)+++ src/main.c	(working copy)@@ -26,12 +26,7 @@  #include <SDL.h> -#if defined(WZ_OS_WIN)-#  include <shlobj.h> /* For SHGetFolderPath */-#elif defined(WZ_OS_UNIX)-#  include <errno.h>-#endif // WZ_OS_WIN-+#include "lib/framework/directory.h" #include "lib/framework/configfile.h" #include "lib/framework/input.h" #include "lib/framework/physfs_ext.h"@@ -95,7 +90,6 @@ #if defined(WZ_OS_WIN) # define WZ_WRITEDIR "Warzone 2100 Trunk" #elif defined(WZ_OS_MAC)-# include <CoreServices/CoreServices.h> # include <unistd.h> # define WZ_WRITEDIR "Warzone 2100 Trunk" #else@@ -353,97 +347,6 @@ 	return mod_list; } --/*!- * Retrieves the current working directory and copies it into the provided output buffer- * \param[out] dest the output buffer to put the current working directory in- * \param size the size (in bytes) of \c dest- * \return true on success, false if an error occurred (and dest doesn't contain a valid directory)- */-static bool getCurrentDir(char * const dest, size_t const size)-{-#if defined(WZ_OS_UNIX)-	if (getcwd(dest, size) == NULL)-	{-		if (errno == ERANGE)-		{-			debug(LOG_ERROR, "getPlatformUserDir: The buffer to contain our current directory is too small (%u bytes and more needed)", (unsigned int)size);-		}-		else-		{-			debug(LOG_ERROR, "getPlatformUserDir: getcwd failed: %s", strerror(errno));-		}--		return false;-	}-#elif defined(WZ_OS_WIN)-	const int len = GetCurrentDirectoryA(size, dest);--	if (len == 0)-	{-		// Retrieve Windows' error number-		const int err = GetLastError();-		char* err_string;--		// Retrieve a string describing the error number (uses LocalAlloc() to allocate memory for err_string)-		FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, (char*)&err_string, 0, NULL);--		// Print an error message with the above description-		debug(LOG_ERROR, "getPlatformUserDir: GetCurrentDirectoryA failed (error code: %d): %s", err, err_string);--		// Free our chunk of memory FormatMessageA gave us-		LocalFree(err_string);--		return false;-	}-	else if (len > size)-	{-		debug(LOG_ERROR, "getPlatformUserDir: The buffer to contain our current directory is too small (%u bytes and %d needed)", (unsigned int)size, len);--		return false;-	}-#else-# error "Provide an implementation here to copy the current working directory in 'dest', which is 'size' bytes large."-#endif--	// If we got here everything went well-	return true;-}---static void getPlatformUserDir(char * const tmpstr, size_t const size)-{-#if defined(WZ_OS_WIN)-	ASSERT(size >= MAX_PATH, "size (%u) is smaller than the required minimum of MAX_PATH (%u)", size, (size_t)MAX_PATH);-	if ( SUCCEEDED( SHGetFolderPathA( NULL, CSIDL_PERSONAL|CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, tmpstr ) ) )-		strlcat(tmpstr, PHYSFS_getDirSeparator(), size);-	else-#elif defined(WZ_OS_MAC)-	FSRef fsref;-	OSErr error = FSFindFolder(kUserDomain, kApplicationSupportFolderType, false, &fsref);-	if (!error)-		error = FSRefMakePath(&fsref, (UInt8 *) tmpstr, size);-	if (!error)-		strlcat(tmpstr, PHYSFS_getDirSeparator(), size);-	else-#endif-	if (PHYSFS_getUserDir())-	{-		strlcpy(tmpstr, PHYSFS_getUserDir(), size); // Use PhysFS supplied UserDir (As fallback on Windows / Mac, default on Linux)-	}-	// If PhysicsFS fails (might happen if environment variable HOME is unset or wrong) then use the current working directory-	else if (getCurrentDir(tmpstr, size))-	{-		strlcat(tmpstr, PHYSFS_getDirSeparator(), size);-	}-	else-	{-		debug(LOG_FATAL, "Can't get UserDir?");-		abort();-}-}-- static void initialize_ConfigDir(void) { 	char tmpstr[PATH_MAX] = { '\0' };@@ -612,11 +515,8 @@  #ifdef WZ_OS_MAC 	if( !PHYSFS_exists("gamedesc.lev") ) {-		CFURLRef resourceURL = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle()); 		char resourcePath[PATH_MAX];-		if( CFURLGetFileSystemRepresentation( resourceURL, true,-							(UInt8 *) resourcePath,-							PATH_MAX) ) {+		if( getMacResourcePath(resourcePath, PATH_MAX) ) { 			chdir( resourcePath ); 			registerSearchPath( "data", 7 ); 			rebuildSearchPath( mod_multiplay, true );Index: lib/framework/i18n.c===================================================================--- lib/framework/i18n.c	(revision 11240)+++ lib/framework/i18n.c	(working copy)@@ -21,13 +21,9 @@ #include <locale.h> #include <physfs.h> +#include "directory.h" #include "string_ext.h" -#ifdef WZ_OS_MAC-# include <CoreFoundation/CoreFoundation.h>-# include <CoreFoundation/CFURL.h>-#endif- /* Always use fallbacks on Windows */ #if defined(WZ_OS_WIN) #  undef LOCALEDIR@@ -389,8 +385,8 @@ 	#ifdef WZ_OS_MAC 	{ 		char resourcePath[PATH_MAX];-		CFURLRef resourceURL = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());-		if( CFURLGetFileSystemRepresentation( resourceURL, true, (UInt8 *) resourcePath, PATH_MAX) )++		if (getMacResourcePath(resourcePath, PATH_MAX)) 		{ 			sstrcat(resourcePath, "/locale"); 			textdomainDirectory = bindtextdomain(PACKAGE, resourcePath);Index: lib/framework/Makefile.am===================================================================--- lib/framework/Makefile.am	(revision 11240)+++ lib/framework/Makefile.am	(working copy)@@ -38,6 +38,7 @@ 	crc.h \ 	cursors.h \ 	debug.h \+	directory.h \ 	file.h \ 	fixedpoint.h \ 	frame.h \@@ -79,6 +80,7 @@ 	cursors32.c \ 	cursors.c \ 	debug.c \+	directory.c \ 	frame.c \ 	frameresource.c \ 	i18n.c \Index: lib/ivis_opengl/textdraw.c===================================================================--- lib/ivis_opengl/textdraw.c	(revision 11240)+++ lib/ivis_opengl/textdraw.c	(working copy)@@ -33,9 +33,9 @@ #include "lib/ivis_common/textdraw.h" #include "lib/ivis_common/bitimage.h" +#include "lib/framework/directory.h"+ #ifdef WZ_OS_MAC-# include <CoreFoundation/CoreFoundation.h>-# include <CoreFoundation/CFURL.h> # include <QuesoGLC/glc.h> #else # include <GL/glc.h>@@ -136,8 +136,8 @@ 	#ifdef WZ_OS_MAC 	{ 		char resourcePath[PATH_MAX];-		CFURLRef resourceURL = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());-		if (CFURLGetFileSystemRepresentation(resourceURL, true, (UInt8 *) resourcePath, PATH_MAX))++		if (getMacResourcePath(resourcePath, PATH_MAX)) 		{ 			sstrcat(resourcePath, "/Fonts"); 			glcAppendCatalog(resourcePath);Index: lib/framework/directory.c===================================================================--- lib/framework/directory.c	(revision 0)+++ lib/framework/directory.c	(revision 0)@@ -0,0 +1,136 @@+/*+	This file is part of Warzone 2100.+	Copyright (C) 2010 Warzone Project++	Warzone 2100 is free software; you can redistribute it and/or modify+	it under the terms of the GNU General Public License as published by+	the Free Software Foundation; either version 2 of the License, or+	(at your option) any later version.++	Warzone 2100 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 General Public License for more details.++	You should have received a copy of the GNU General Public License+	along with Warzone 2100; if not, write to the Free Software+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA+*/+#include "directory.h"++#ifdef WZ_OS_MAC+#include <CoreFoundation/CoreFoundation.h>+#include <CoreFoundation/CFURL.h>+#include <CoreServices/CoreServices.h>+#endif // WZ_OS_MAC++#if defined(WZ_OS_WIN)+#  include <shlobj.h> /* For SHGetFolderPath */+#elif defined(WZ_OS_UNIX)+#  include <errno.h>+#endif // WZ_OS_WIN++#include "frame.h"+#include "physfs_ext.h"++#ifdef WZ_OS_MAC+bool getMacResourcePath(char * resourcePath, size_t size)+{+	CFURLRef resourceURL = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());+	bool retVal;++	if (resourceURL == NULL)+	{+		return false;+	}++	retVal = CFURLGetFileSystemRepresentation(resourceURL, true, (UInt8 *) resourcePath, size);++	CFRelease(resourceURL);++	return retVal;+}+#endif // WZ_OS_MAC++bool getCurrentDir(char * const dest, size_t const size)+{+#if defined(WZ_OS_UNIX)+	if (getcwd(dest, size) == NULL)+	{+		if (errno == ERANGE)+		{+			debug(LOG_ERROR, "getCurrentDir: The buffer to contain our current directory is too small (%u bytes and more needed)", (unsigned int)size);+		}+		else+		{+			debug(LOG_ERROR, "getCurrentDir: getcwd failed: %s", strerror(errno));+		}++		return false;+	}+#elif defined(WZ_OS_WIN)+	const int len = GetCurrentDirectoryA(size, dest);++	if (len == 0)+	{+		// Retrieve Windows' error number+		const int err = GetLastError();+		char* err_string;++		// Retrieve a string describing the error number (uses LocalAlloc() to allocate memory for err_string)+		FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, (char*)&err_string, 0, NULL);++		// Print an error message with the above description+		debug(LOG_ERROR, "getCurrentDir: GetCurrentDirectoryA failed (error code: %d): %s", err, err_string);++		// Free our chunk of memory FormatMessageA gave us+		LocalFree(err_string);++		return false;+	}+	else if (len > size)+	{+		debug(LOG_ERROR, "getCurrentDir: The buffer to contain our current directory is too small (%u bytes and %d needed)", (unsigned int)size, len);++		return false;+	}+#else+# error "Provide an implementation here to copy the current working directory in 'dest', which is 'size' bytes large."+#endif++	// If we got here everything went well+	return true;+}+++void getPlatformUserDir(char * const tmpstr, size_t const size)+{+#if defined(WZ_OS_WIN)+	ASSERT(size >= MAX_PATH, "size (%u) is smaller than the required minimum of MAX_PATH (%u)", size, (size_t)MAX_PATH);+	if ( SUCCEEDED( SHGetFolderPathA( NULL, CSIDL_PERSONAL|CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, tmpstr ) ) )+		strlcat(tmpstr, PHYSFS_getDirSeparator(), size);+	else+#elif defined(WZ_OS_MAC)+	FSRef fsref;+	OSErr error = FSFindFolder(kUserDomain, kApplicationSupportFolderType, false, &fsref);+	if (!error)+		error = FSRefMakePath(&fsref, (UInt8 *) tmpstr, size);+	if (!error)+		strlcat(tmpstr, PHYSFS_getDirSeparator(), size);+	else+#endif+	if (PHYSFS_getUserDir())+	{+		strlcpy(tmpstr, PHYSFS_getUserDir(), size); // Use PhysFS supplied UserDir (As fallback on Windows / Mac, default on Linux)+	}+	// If PhysicsFS fails (might happen if environment variable HOME is unset or wrong) then use the current working directory+	else if (getCurrentDir(tmpstr, size))+	{+		strlcat(tmpstr, PHYSFS_getDirSeparator(), size);+	}+	else+	{+		debug(LOG_FATAL, "Can't get UserDir?");+		abort();+	}+}Index: lib/framework/directory.h===================================================================--- lib/framework/directory.h	(revision 0)+++ lib/framework/directory.h	(revision 0)@@ -0,0 +1,60 @@+/*+	This file is part of Warzone 2100.+	Copyright (C) 2010 Warzone Project++	Warzone 2100 is free software; you can redistribute it and/or modify+	it under the terms of the GNU General Public License as published by+	the Free Software Foundation; either version 2 of the License, or+	(at your option) any later version.++	Warzone 2100 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 General Public License for more details.++	You should have received a copy of the GNU General Public License+	along with Warzone 2100; if not, write to the Free Software+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA+*/+/*! \file directory.h+ *  \brief Directory handling code.+ *  \note May include platform specific code.+ */+#ifndef __DIRECTORY_H__+#define __DIRECTORY_H__++#include <stddef.h>++#include "wzglobal.h"+#include "types.h"++#ifdef __cplusplus+extern "C"+{+#endif //__cplusplus++#ifdef WZ_OS_MAC+/*!+ * Get the application's main bundle path.+ * \param resourcePath Buffer to hold the of the ressource path+ * 						in the filesystem's native representation.+ * \param size Size of resourcePath+ */+bool getMacResourcePath(char * resourcePath, size_t size);+#endif // WZ_OS_MAC++/*!+ * Retrieves the current working directory and copies it into the provided output buffer+ * \param[out] dest the output buffer to put the current working directory in+ * \param size the size (in bytes) of \c dest+ * \return true on success, false if an error occurred (and dest doesn't contain a valid directory)+ */+bool getCurrentDir(char * const dest, size_t const size);++void getPlatformUserDir(char * const tmpstr, size_t const size);++#ifdef __cplusplus+}+#endif //__cplusplus++#endif /* __DIRECTORY_H__ */