/* Copyright 2009-2010 DeSmuME team
This file 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.
This file 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 the this software. If not, see .
*/
#include
#ifdef _MSC_VER
#define mkdir _mkdir
#endif
#if defined(_WINDOWS)
//#define WIN32_LEAN_AND_MEAN
//#include
#include "windowsh_wrapper.h"
#include
#if !defined(WXPORT)
#include "resource.h"
#else
#include
#endif /* !WXPORT */
#else
#include
#endif /* _WINDOWS */
#include
#include
#include
#include "utils/xstring.h"
#ifdef _WINDOWS
#define FILE_EXT_DELIMITER_CHAR '.'
#define DIRECTORY_DELIMITER_CHAR '\\'
#else
#define FILE_EXT_DELIMITER_CHAR '.'
#define DIRECTORY_DELIMITER_CHAR '/'
#endif
#ifdef _WINDOWS
void FCEUD_MakePathDirs(const char *fname);
#endif
class Path
{
public:
static bool IsPathRooted (const std::string &path);
static std::string GetFileDirectoryPath(std::string filePath);
static std::string GetFileNameFromPath(std::string filePath);
static std::string GetFileNameWithoutExt(std::string fileName);
static std::string GetFileNameFromPathWithoutExt(std::string filePath);
static std::string GetFileExt(std::string fileName);
};
class PathInfo
{
public:
std::string path;
std::string RomName;
std::string RomDirectory;
#define MAX_FORMAT 20
#define SECTION "PathSettings"
#define ROMKEY "Roms"
#define BATTERYKEY "Battery"
#define STATEKEY "States"
#define SCREENSHOTKEY "Screenshots"
#define AVIKEY "AviFiles"
#define CHEATKEY "Cheats"
#define SOUNDKEY "SoundSamples"
#define FIRMWAREKEY "Firmware"
#define FORMATKEY "format"
#define DEFAULTFORMATKEY "defaultFormat"
#define NEEDSSAVINGKEY "needsSaving"
#define LASTVISITKEY "lastVisit"
#define LUAKEY "Lua"
char screenshotFormat[MAX_FORMAT];
bool savelastromvisit;
enum KnownPath
{
FIRSTKNOWNPATH = 0,
ROMS = 0,
BATTERY,
STATES,
SCREENSHOTS,
AVI_FILES,
CHEATS,
SOUNDS,
FIRMWARE,
MODULE,
MAXKNOWNPATH = MODULE
};
char pathToRoms[MAX_PATH];
char pathToBattery[MAX_PATH];
char pathToStates[MAX_PATH];
char pathToScreenshots[MAX_PATH];
char pathToAviFiles[MAX_PATH];
char pathToCheats[MAX_PATH];
char pathToSounds[MAX_PATH];
char pathToFirmware[MAX_PATH];
char pathToModule[MAX_PATH];
char pathToLua[MAX_PATH];
void init(const char * filename) {
path = std::string(filename);
//extract the internal part of the logical rom name
std::vector parts = tokenize_str(filename,"|");
SetRomName(parts[parts.size()-1].c_str());
LoadModulePath();
#ifndef WIN32
//ReadPathSettings();
#endif
}
void LoadModulePath()
{
#if defined(_WINDOWS)
char *p;
ZeroMemory(pathToModule, sizeof(pathToModule));
GetModuleFileNameA(NULL, pathToModule, sizeof(pathToModule));
p = pathToModule + strlen(pathToModule);
while (p >= pathToModule && *p != DIRECTORY_DELIMITER_CHAR) p--;
if (++p >= pathToModule) *p = 0;
#else
char *cwd = g_build_filename(g_get_user_config_dir(), "desmume", NULL);
g_mkdir_with_parents(cwd, 0755);
strncpy(pathToModule, cwd, MAX_PATH);
g_free(cwd);
#endif
}
enum Action
{
GET,
SET
};
void GetDefaultPath(char *pathToDefault, const char *, int maxCount)
{
#ifdef _WINDOWS
std::string temp = (std::string)"." + DIRECTORY_DELIMITER_CHAR + pathToDefault;
strncpy(pathToDefault, temp.c_str(), maxCount);
#else
strncpy(pathToDefault, pathToModule, maxCount);
#endif
}
/*void ReadKey(char *pathToRead, const char *key)
{
#ifdef _WINDOWS
GetPrivateProfileString(SECTION, key, key, pathToRead, MAX_PATH, IniName);
if(strcmp(pathToRead, key) == 0) {
//since the variables are all intialized in this file they all use MAX_PATH
GetDefaultPath(pathToRead, key, MAX_PATH);
}
#else
//since the variables are all intialized in this file they all use MAX_PATH
GetDefaultPath(pathToRead, key, MAX_PATH);
#endif
}*/
/*void ReadPathSettings()
{
if( ( strcmp(pathToModule, "") == 0) || !pathToModule)
LoadModulePath();
ReadKey(pathToRoms, ROMKEY);
ReadKey(pathToBattery, BATTERYKEY);
ReadKey(pathToStates, STATEKEY);
ReadKey(pathToScreenshots, SCREENSHOTKEY);
ReadKey(pathToAviFiles, AVIKEY);
ReadKey(pathToCheats, CHEATKEY);
ReadKey(pathToSounds, SOUNDKEY);
ReadKey(pathToFirmware, FIRMWAREKEY);
ReadKey(pathToLua, LUAKEY);
#ifdef _WINDOWS
GetPrivateProfileString(SECTION, FORMATKEY, "%f_%s_%r", screenshotFormat, MAX_FORMAT, IniName);
savelastromvisit = GetPrivateProfileBool(SECTION, LASTVISITKEY, true, IniName);
currentimageformat = (ImageFormat)GetPrivateProfileInt(SECTION, DEFAULTFORMATKEY, PNG, IniName);
#endif*/
/*
needsSaving = GetPrivateProfileInt(SECTION, NEEDSSAVINGKEY, true, IniName);
if(needsSaving)
{
needsSaving = false;
WritePathSettings();
}*/
/*}*/
void SwitchPath(Action action, KnownPath knownPath, char * buffer)
{
char *pathToCopy = 0;
switch(knownPath)
{
case ROMS:
pathToCopy = pathToRoms;
break;
case BATTERY:
pathToCopy = pathToBattery;
break;
case STATES:
pathToCopy = pathToStates;
break;
case SCREENSHOTS:
pathToCopy = pathToScreenshots;
break;
case AVI_FILES:
pathToCopy = pathToAviFiles;
break;
case CHEATS:
pathToCopy = pathToCheats;
break;
case SOUNDS:
pathToCopy = pathToSounds;
break;
case FIRMWARE:
pathToCopy = pathToFirmware;
break;
case MODULE:
pathToCopy = pathToModule;
break;
}
if(action == GET)
{
std::string thePath = pathToCopy;
std::string relativePath = (std::string)"." + DIRECTORY_DELIMITER_CHAR;
int len = (int)thePath.size()-1;
if(len == -1)
thePath = relativePath;
else
if(thePath[len] != DIRECTORY_DELIMITER_CHAR)
thePath += DIRECTORY_DELIMITER_CHAR;
if(!Path::IsPathRooted(thePath))
{
thePath = (std::string)pathToModule + thePath;
}
strncpy(buffer, thePath.c_str(), MAX_PATH);
#ifdef _WINDOWS
FCEUD_MakePathDirs(buffer);
#endif
}
else if(action == SET)
{
int len = strlen(buffer)-1;
if(buffer[len] == DIRECTORY_DELIMITER_CHAR)
buffer[len] = '\0';
strncpy(pathToCopy, buffer, MAX_PATH);
}
}
std::string getpath(KnownPath knownPath)
{
char temp[MAX_PATH];
SwitchPath(GET, knownPath, temp);
return temp;
}
void getpath(KnownPath knownPath, char *buffer)
{
SwitchPath(GET, knownPath, buffer);
}
void setpath(KnownPath knownPath, char *buffer)
{
SwitchPath(SET, knownPath, buffer);
}
void getfilename(char *buffer, int)
{
strcpy(buffer,noextension().c_str());
}
void getpathnoext(KnownPath knownPath, char *buffer)
{
getpath(knownPath, buffer);
strcat(buffer, GetRomNameWithoutExtension().c_str());
}
std::string extension()
{
return Path::GetFileExt(path);
}
std::string noextension()
{
std::string romNameWithPath = Path::GetFileDirectoryPath(path) + DIRECTORY_DELIMITER_CHAR + Path::GetFileNameWithoutExt(RomName);
return romNameWithPath;
}
void formatname(char *output)
{
std::string file;
time_t now = time(NULL);
tm *time_struct = localtime(&now);
srand((unsigned int)now);
for(int i = 0; i < MAX_FORMAT;i++)
{
char *c = &screenshotFormat[i];
char tmp[MAX_PATH] = {0};
if(*c == '%')
{
c = &screenshotFormat[++i];
switch(*c)
{
case 'f':
strcat(tmp, GetRomNameWithoutExtension().c_str());
break;
case 'D':
strftime(tmp, MAX_PATH, "%d", time_struct);
break;
case 'M':
strftime(tmp, MAX_PATH, "%m", time_struct);
break;
case 'Y':
strftime(tmp, MAX_PATH, "%Y", time_struct);
break;
case 'h':
strftime(tmp, MAX_PATH, "%H", time_struct);
break;
case 'm':
strftime(tmp, MAX_PATH, "%M", time_struct);
break;
case 's':
strftime(tmp, MAX_PATH, "%S", time_struct);
break;
case 'r':
sprintf(tmp, "%d", rand() % RAND_MAX);
break;
}
}
else
{
int j;
for(j=i;j