Changeset - r6317:48fa3b65b6bb
[Not reviewed]
master
0 7 0
rubidium - 17 years ago 2007-03-17 11:36:04
rubidium@openttd.org
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
7 files changed with 82 insertions and 129 deletions:
0 comments (0 inline, 0 general)
src/fileio.cpp
Show inline comments
 
@@ -9,12 +9,13 @@
 
#include "string.h"
 
#include "macros.h"
 
#include "variables.h"
 
#include "debug.h"
 
#include "fios.h"
 
#ifndef WIN32
 
#include <unistd.h>
 
#include <sys/stat.h>
 
#endif
 

	
 
/*************************************************/
 
/* FILE IO ROUTINES ******************************/
 
/*************************************************/
 
@@ -255,30 +256,104 @@ void AppendPathSeparator(char *buf, size
 
	if (s != 0 && buf[s - 1] != PATHSEPCHAR && s + 2 < buflen) {
 
		buf[s]     = PATHSEPCHAR;
 
		buf[s + 1] = '\0';
 
	}
 
}
 

	
 
#if defined(WIN32) || defined(WINCE)
 
/**
 
 * Determine the base (personal dir and game data dir) paths
 
 * @param exe the path to the executable
 
 */
 
extern void DetermineBasePaths(const char *exe);
 
#else /* defined(WIN32) || defined(WINCE) */
 

	
 
/**
 
 * Changes the working directory to the path of the give executable.
 
 * For OSX application bundles '.app' is the required extension of the bundle,
 
 * so when we crop the path to there, when can remove the name of the bundle
 
 * in the same way we remove the name from the executable name.
 
 * @param exe the path to the executable
 
 */
 
void ChangeWorkingDirectory(const char *exe)
 
{
 
#ifdef WITH_COCOA
 
	char *app_bundle = strchr(exe, '.');
 
	while (app_bundle != NULL && strncasecmp(app_bundle, ".app", 4) != 0) app_bundle = strchr(&app_bundle[1], '.');
 

	
 
	if (app_bundle != NULL) app_bundle[0] = '\0';
 
#endif /* WITH_COCOA */
 
	char *s = strrchr(exe, PATHSEPCHAR);
 
	if (s != NULL) {
 
		*s = '\0';
 
		chdir(exe);
 
		*s = PATHSEPCHAR;
 
	}
 
#ifdef WITH_COCOA
 
	if (app_bundle != NULL) app_bundle[0] = '.';
 
#endif /* WITH_COCOA */
 
}
 

	
 
/**
 
 * Determine the base (personal dir and game data dir) paths
 
 * @note defined in the OS related files (os2.cpp, win32.cpp, unix.cpp etc)
 
 * @param exe the path to the executable
 
 */
 
extern void DetermineBasePaths();
 
void DetermineBasePaths(const char *exe)
 
{
 
	/* Change the working directory to enable doubleclicking in UIs */
 
	ChangeWorkingDirectory(exe);
 

	
 
	_paths.game_data_dir = MallocT<char>(MAX_PATH);
 
	ttd_strlcpy(_paths.game_data_dir, GAME_DATA_DIR, MAX_PATH);
 
#if defined(SECOND_DATA_DIR)
 
	_paths.second_data_dir = MallocT<char>(MAX_PATH);
 
	ttd_strlcpy(_paths.second_data_dir, SECOND_DATA_DIR, MAX_PATH);
 
#endif
 

	
 
#if defined(USE_HOMEDIR)
 
	const char *homedir = getenv("HOME");
 

	
 
	if (homedir == NULL) {
 
		const struct passwd *pw = getpwuid(getuid());
 
		if (pw != NULL) homedir = pw->pw_dir;
 
	}
 

	
 
	_paths.personal_dir = str_fmt("%s" PATHSEP "%s", homedir, PERSONAL_DIR);
 
#else /* not defined(USE_HOMEDIR) */
 
	_paths.personal_dir = MallocT<char>(MAX_PATH);
 
	ttd_strlcpy(_paths.personal_dir, PERSONAL_DIR, MAX_PATH);
 

	
 
	/* check if absolute or relative path */
 
	const char *s = strchr(_paths.personal_dir, PATHSEPCHAR);
 

	
 
	/* add absolute path */
 
	if (s == NULL || _paths.personal_dir != s) {
 
		getcwd(_paths.personal_dir, MAX_PATH);
 
		AppendPathSeparator(_paths.personal_dir, MAX_PATH);
 
		ttd_strlcat(_paths.personal_dir, PERSONAL_DIR, MAX_PATH);
 
	}
 
#endif /* defined(USE_HOMEDIR) */
 

	
 
	AppendPathSeparator(_paths.personal_dir,  MAX_PATH);
 
	AppendPathSeparator(_paths.game_data_dir, MAX_PATH);
 
}
 
#endif /* defined(WIN32) || defined(WINCE) */
 

	
 
/**
 
 * Acquire the base paths (personal dir and game data dir),
 
 * fill all other paths (save dir, autosave dir etc) and
 
 * make the save and scenario directories.
 
 * @param exe the path to the executable
 
 * @todo for save_dir, autosave_dir, scenario_dir and heightmap_dir the
 
 *       assumption is that there is no path separator, however for gm_dir
 
 *       lang_dir and data_dir that assumption is made.
 
 *       This inconsistency should be resolved.
 
 */
 
void DeterminePaths()
 
void DeterminePaths(const char *exe)
 
{
 
	DetermineBasePaths();
 
	DetermineBasePaths(exe);
 

	
 
	_paths.save_dir      = str_fmt("%ssave", _paths.personal_dir);
 
	_paths.autosave_dir  = str_fmt("%s" PATHSEP "autosave", _paths.save_dir);
 
	_paths.scenario_dir  = str_fmt("%sscenario", _paths.personal_dir);
 
	_paths.heightmap_dir = str_fmt("%s" PATHSEP "heightmap", _paths.scenario_dir);
 
	_paths.gm_dir        = str_fmt("%sgm" PATHSEP, _paths.game_data_dir);
src/fileio.h
Show inline comments
 
@@ -18,9 +18,9 @@ void FioSkipBytes(int n);
 

	
 
FILE *FioFOpenFile(const char *filename);
 
bool FioCheckFileExists(const char *filename);
 
void FioCreateDirectory(const char *filename);
 

	
 
void AppendPathSeparator(char *buf, size_t buflen);
 
void DeterminePaths();
 
void DeterminePaths(const char *exe);
 

	
 
#endif /* FILEIO_H */
src/openttd.cpp
Show inline comments
 
@@ -430,13 +430,13 @@ int ttd_main(int argc, char *argv[])
 
		case 'h':
 
			showhelp();
 
			return 0;
 
		}
 
	}
 

	
 
	DeterminePaths();
 
	DeterminePaths(argv[0]);
 
	CheckExternalFiles();
 

	
 
#if defined(UNIX) && !defined(__MORPHOS__)
 
	// We must fork here, or we'll end up without some resources we need (like sockets)
 
	if (_dedicated_forks)
 
		DedicatedFork();
src/os2.cpp
Show inline comments
 
@@ -119,24 +119,12 @@ bool FiosIsValidFile(const char *path, c
 

	
 
bool FiosIsHiddenFile(const struct dirent *ent)
 
{
 
	return ent->d_name[0] == '.';
 
}
 

	
 

	
 
static void ChangeWorkingDirectory(char *exe)
 
{
 
	char *s = strrchr(exe, PATHSEPCHAR);
 

	
 
	if (s != NULL) {
 
		*s = '\0';
 
		chdir(exe);
 
		*s = PATHSEPCHAR;
 
	}
 
}
 

	
 
void ShowInfo(const unsigned char *str)
 
{
 
	HAB hab;
 
	HMQ hmq;
 
	ULONG rc;
 

	
 
@@ -175,49 +163,12 @@ int CDECL main(int argc, char* argv[])
 

	
 
	_random_seeds[1][1] = _random_seeds[1][0] = _random_seeds[0][1] = _random_seeds[0][0] = time(NULL);
 

	
 
	return ttd_main(argc, argv);
 
}
 

	
 
void DetermineBasePaths()
 
{
 
	_paths.game_data_dir = MallocT<char>(MAX_PATH);
 
	ttd_strlcpy(_paths.game_data_dir, GAME_DATA_DIR, MAX_PATH);
 
#if defined(SECOND_DATA_DIR)
 
	_paths.second_data_dir = MallocT<char>(MAX_PATH);
 
	ttd_strlcpy(_paths.second_data_dir, SECOND_DATA_DIR, MAX_PATH);
 
#endif
 

	
 
#if defined(USE_HOMEDIR)
 
	const char *homedir = getenv("HOME");
 

	
 
	if (homedir == NULL) {
 
		const struct passwd *pw = getpwuid(getuid());
 
		if (pw != NULL) homedir = pw->pw_dir;
 
	}
 

	
 
	_paths.personal_dir = str_fmt("%s" PATHSEP "%s", homedir, PERSONAL_DIR);
 
#else /* not defined(USE_HOMEDIR) */
 
	_paths.personal_dir = MallocT<char>(MAX_PATH);
 
	ttd_strlcpy(_paths.personal_dir, PERSONAL_DIR, MAX_PATH);
 

	
 
	/* check if absolute or relative path */
 
	const char *s = strchr(_paths.personal_dir, PATHSEPCHAR);
 

	
 
	/* add absolute path */
 
	if (s == NULL || _paths.personal_dir != s) {
 
		getcwd(_paths.personal_dir, MAX_PATH);
 
		AppendPathSeparator(_paths.personal_dir, MAX_PATH);
 
		ttd_strlcat(_paths.personal_dir, PERSONAL_DIR, MAX_PATH);
 
	}
 
#endif /* defined(USE_HOMEDIR) */
 

	
 
	AppendPathSeparator(_paths.personal_dir,  MAX_PATH);
 
	AppendPathSeparator(_paths.game_data_dir, MAX_PATH);
 
}
 

	
 
/**
 
 * Insert a chunk of text from the clipboard onto the textbuffer. Get TEXT clipboard
 
 * and append this up to the maximum length (either absolute or screenlength). If maxlength
 
 * is zero, we don't care about the screenlength but only about the physical length of the string
 
 * @param tb @Textbuf type to be changed
 
 * @return Return true on successfull change of Textbuf, or false otherwise
src/unix.cpp
Show inline comments
 
@@ -4,13 +4,12 @@
 
#include "openttd.h"
 
#include "functions.h"
 
#include "window.h"
 
#include "string.h"
 
#include "table/strings.h"
 
#include "variables.h"
 
#include "fileio.h"
 

	
 
#include <dirent.h>
 
#include <unistd.h>
 
#include <sys/stat.h>
 
#include <time.h>
 
#include <signal.h>
 
@@ -98,24 +97,12 @@ bool FiosIsValidFile(const char *path, c
 

	
 
bool FiosIsHiddenFile(const struct dirent *ent)
 
{
 
	return ent->d_name[0] == '.';
 
}
 

	
 
#if defined(__BEOS__) || defined(__linux__)
 
static void ChangeWorkingDirectory(char *exe)
 
{
 
	char *s = strrchr(exe, '/');
 
	if (s != NULL) {
 
		*s = '\0';
 
		chdir(exe);
 
		*s = '/';
 
	}
 
}
 
#endif
 

	
 
void ShowInfo(const char *str)
 
{
 
	fprintf(stderr, "%s\n", str);
 
}
 

	
 
void ShowOSErrorBox(const char *buf)
 
@@ -128,13 +115,12 @@ void ShowOSErrorBox(const char *buf)
 
	// all systems, but OSX
 
	fprintf(stderr, "\033[1;31mError: %s\033[0;39m\n", buf);
 
#endif
 
}
 

	
 
#ifdef WITH_COCOA
 
void cocoaSetWorkingDirectory();
 
void cocoaSetupAutoreleasePool();
 
void cocoaReleaseAutoreleasePool();
 
#endif
 

	
 
int CDECL main(int argc, char* argv[])
 
{
 
@@ -143,21 +129,15 @@ int CDECL main(int argc, char* argv[])
 
#ifdef WITH_COCOA
 
	cocoaSetupAutoreleasePool();
 
	/* This is passed if we are launched by double-clicking */
 
	if (argc >= 2 && strncmp(argv[1], "-psn", 4) == 0) {
 
		argv[1] = NULL;
 
		argc = 1;
 
		cocoaSetWorkingDirectory();
 
	}
 
#endif
 

	
 
	// change the working directory to enable doubleclicking in UIs
 
#if defined(__BEOS__) || defined(__linux__)
 
	ChangeWorkingDirectory(argv[0]);
 
#endif
 

	
 
	_random_seeds[1][1] = _random_seeds[1][0] = _random_seeds[0][1] = _random_seeds[0][0] = time(NULL);
 
	SeedMT(_random_seeds[0][1]);
 

	
 
	signal(SIGPIPE, SIG_IGN);
 

	
 
	ret = ttd_main(argc, argv);
 
@@ -166,49 +146,12 @@ int CDECL main(int argc, char* argv[])
 
	cocoaReleaseAutoreleasePool();
 
#endif
 

	
 
	return ret;
 
}
 

	
 
void DetermineBasePaths()
 
{
 
	_paths.game_data_dir = MallocT<char>(MAX_PATH);
 
	ttd_strlcpy(_paths.game_data_dir, GAME_DATA_DIR, MAX_PATH);
 
#if defined(SECOND_DATA_DIR)
 
	_paths.second_data_dir = MallocT<char>(MAX_PATH);
 
	ttd_strlcpy(_paths.second_data_dir, SECOND_DATA_DIR, MAX_PATH);
 
#endif
 

	
 
#if defined(USE_HOMEDIR)
 
	const char *homedir = getenv("HOME");
 

	
 
	if (homedir == NULL) {
 
		const struct passwd *pw = getpwuid(getuid());
 
		if (pw != NULL) homedir = pw->pw_dir;
 
	}
 

	
 
	_paths.personal_dir = str_fmt("%s" PATHSEP "%s", homedir, PERSONAL_DIR);
 
#else /* not defined(USE_HOMEDIR) */
 
	_paths.personal_dir = MallocT<char>(MAX_PATH);
 
	ttd_strlcpy(_paths.personal_dir, PERSONAL_DIR, MAX_PATH);
 

	
 
	/* check if absolute or relative path */
 
	const char *s = strchr(_paths.personal_dir, PATHSEPCHAR);
 

	
 
	/* add absolute path */
 
	if (s == NULL || _paths.personal_dir != s) {
 
		getcwd(_paths.personal_dir, MAX_PATH);
 
		AppendPathSeparator(_paths.personal_dir, MAX_PATH);
 
		ttd_strlcat(_paths.personal_dir, PERSONAL_DIR, MAX_PATH);
 
	}
 
#endif /* defined(USE_HOMEDIR) */
 

	
 
	AppendPathSeparator(_paths.personal_dir,  MAX_PATH);
 
	AppendPathSeparator(_paths.game_data_dir, MAX_PATH);
 
}
 

	
 
bool InsertTextBufferClipboard(Textbuf *tb)
 
{
 
	return false;
 
}
 

	
 

	
src/video/cocoa_v.mm
Show inline comments
 
@@ -2044,28 +2044,12 @@ void CocoaDialog(const char* title, cons
 

	
 
	if (!wasstarted) CocoaVideoStop();
 

	
 
	_cocoa_video_dialog = false;
 
}
 

	
 

	
 
/* This is needed since OS X applications are started with the working dir set to / when double-clicked */
 
void cocoaSetWorkingDirectory()
 
{
 
	char parentdir[MAXPATHLEN];
 
	int chdir_ret;
 
	CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle());
 
	CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url);
 
	if (CFURLGetFileSystemRepresentation(url2, true, (unsigned char*)parentdir, MAXPATHLEN)) {
 
		chdir_ret = chdir(parentdir); /* chdir to the binary app's parent */
 
		assert(chdir_ret == 0);
 
	}
 
	CFRelease(url);
 
	CFRelease(url2);
 
}
 

	
 
/* These are called from main() to prevent a _NSAutoreleaseNoPool error when
 
 * exiting before the cocoa video driver has been loaded
 
 */
 
void cocoaSetupAutoreleasePool()
 
{
 
	_ottd_autorelease_pool = [[NSAutoreleasePool alloc] init];
src/win32.cpp
Show inline comments
 
@@ -940,13 +940,13 @@ void GetCurrentDirectoryW(int length, wc
 
		int result = pDest - path + 1;
 
		path[result] = '\0';
 
	}
 
}
 
#endif
 

	
 
void DetermineBasePaths()
 
void DetermineBasePaths(const char *exe)
 
{
 
	_paths.personal_dir = _paths.game_data_dir = MallocT<char>(MAX_PATH);
 
#if defined(UNICODE)
 
	TCHAR path[MAX_PATH];
 
	GetCurrentDirectory(MAX_PATH - 1, path);
 
	convert_from_fs(path, _paths.personal_dir, MAX_PATH);
0 comments (0 inline, 0 general)