mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 14:19:46 -06:00
Update Wii save import / export to use the same replace list as FileIO
add a couple of country codes I found through redump.org database git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6640 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -18,6 +18,7 @@
|
|||||||
#include "CommonPaths.h"
|
#include "CommonPaths.h"
|
||||||
#include "FileUtil.h"
|
#include "FileUtil.h"
|
||||||
#include "NandPaths.h"
|
#include "NandPaths.h"
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
namespace Common
|
namespace Common
|
||||||
{
|
{
|
||||||
@ -87,4 +88,36 @@ bool CheckTitleTIK(u64 _titleID)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void CreateReplacementFile(std::string &filename)
|
||||||
|
{
|
||||||
|
std::ofstream replace(filename.c_str());
|
||||||
|
replace <<"\" __22__\n";
|
||||||
|
replace << "* __2a__\n";
|
||||||
|
//replace << "/ __2f__\n";
|
||||||
|
replace << ": __3a__\n";
|
||||||
|
replace << "< __3c__\n";
|
||||||
|
replace << "> __3e__\n";
|
||||||
|
replace << "? __3f__\n";
|
||||||
|
//replace <<"\\ __5c__\n";
|
||||||
|
replace << "| __7c__\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReadReplacements(replace_v& replacements)
|
||||||
|
{
|
||||||
|
replacements.clear();
|
||||||
|
const std::string replace_fname = "/sys/replace";
|
||||||
|
std::string filename(File::GetUserPath(D_WIIROOT_IDX));
|
||||||
|
filename += replace_fname;
|
||||||
|
|
||||||
|
if (!File::Exists(filename.c_str()))
|
||||||
|
CreateReplacementFile(filename);
|
||||||
|
|
||||||
|
std::ifstream f(filename.c_str());
|
||||||
|
char letter;
|
||||||
|
std::string replacement;
|
||||||
|
|
||||||
|
while (f >> letter >> replacement && replacement.size())
|
||||||
|
replacements.push_back(std::make_pair(letter, replacement));
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -25,11 +25,15 @@
|
|||||||
|
|
||||||
namespace Common
|
namespace Common
|
||||||
{
|
{
|
||||||
|
typedef std::pair<char, std::string> replace_t;
|
||||||
|
typedef std::vector<replace_t> replace_v;
|
||||||
|
|
||||||
std::string CreateTicketFileName(u64 _titleID);
|
std::string CreateTicketFileName(u64 _titleID);
|
||||||
std::string CreateTitleDataPath(u64 _titleID);
|
std::string CreateTitleDataPath(u64 _titleID);
|
||||||
std::string CreateTitleContentPath(u64 _titleID);
|
std::string CreateTitleContentPath(u64 _titleID);
|
||||||
bool CheckTitleTMD(u64 _titleID);
|
bool CheckTitleTMD(u64 _titleID);
|
||||||
bool CheckTitleTIK(u64 _titleID);
|
bool CheckTitleTIK(u64 _titleID);
|
||||||
|
void ReadReplacements(replace_v& replacements);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -22,43 +22,11 @@
|
|||||||
|
|
||||||
#include "WII_IPC_HLE_Device_fs.h"
|
#include "WII_IPC_HLE_Device_fs.h"
|
||||||
#include "WII_IPC_HLE_Device_FileIO.h"
|
#include "WII_IPC_HLE_Device_FileIO.h"
|
||||||
|
#include "NandPaths.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
typedef std::pair<char, std::string> replace_t;
|
|
||||||
typedef std::vector<replace_t> replace_v;
|
|
||||||
static replace_v replacements;
|
|
||||||
|
|
||||||
static void CreateReplacementFile(std::string &filename)
|
static Common::replace_v replacements;
|
||||||
{
|
|
||||||
std::ofstream replace(filename.c_str());
|
|
||||||
replace <<"\" __22__\n";
|
|
||||||
replace << "* __2a__\n";
|
|
||||||
//replace << "/ __2f__\n";
|
|
||||||
replace << ": __3a__\n";
|
|
||||||
replace << "< __3c__\n";
|
|
||||||
replace << "> __3e__\n";
|
|
||||||
replace << "? __3f__\n";
|
|
||||||
//replace <<"\\ __5c__\n";
|
|
||||||
replace << "| __7c__\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ReadReplacements()
|
|
||||||
{
|
|
||||||
const std::string replace_fname = "/sys/replace";
|
|
||||||
std::string filename(File::GetUserPath(D_WIIROOT_IDX));
|
|
||||||
filename += replace_fname;
|
|
||||||
|
|
||||||
if (!File::Exists(filename.c_str()))
|
|
||||||
CreateReplacementFile(filename);
|
|
||||||
|
|
||||||
std::ifstream f(filename.c_str());
|
|
||||||
char letter;
|
|
||||||
std::string replacement;
|
|
||||||
|
|
||||||
while (f >> letter >> replacement && replacement.size())
|
|
||||||
replacements.push_back(std::make_pair(letter, replacement));
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is used by several of the FileIO and /dev/fs/ functions
|
// This is used by several of the FileIO and /dev/fs/ functions
|
||||||
std::string HLE_IPC_BuildFilename(const char* _pFilename, int _size)
|
std::string HLE_IPC_BuildFilename(const char* _pFilename, int _size)
|
||||||
@ -70,7 +38,7 @@ std::string HLE_IPC_BuildFilename(const char* _pFilename, int _size)
|
|||||||
path_full += std::string("/title"); // this looks and feel like a hack...
|
path_full += std::string("/title"); // this looks and feel like a hack...
|
||||||
|
|
||||||
// Replaces chars that FAT32 can't support with strings defined in /sys/replace
|
// Replaces chars that FAT32 can't support with strings defined in /sys/replace
|
||||||
for (replace_v::const_iterator i = replacements.begin(); i != replacements.end(); ++i)
|
for (Common::replace_v::const_iterator i = replacements.begin(); i != replacements.end(); ++i)
|
||||||
{
|
{
|
||||||
for (size_t j = 0; (j = path_wii.find(i->first, j)) != path_wii.npos; ++j)
|
for (size_t j = 0; (j = path_wii.find(i->first, j)) != path_wii.npos; ++j)
|
||||||
path_wii.replace(j, 1, i->second);
|
path_wii.replace(j, 1, i->second);
|
||||||
@ -88,7 +56,7 @@ CWII_IPC_HLE_Device_FileIO::CWII_IPC_HLE_Device_FileIO(u32 _DeviceID, const std:
|
|||||||
, m_Mode(0)
|
, m_Mode(0)
|
||||||
, m_Seek(0)
|
, m_Seek(0)
|
||||||
{
|
{
|
||||||
ReadReplacements();
|
Common::ReadReplacements(replacements);
|
||||||
}
|
}
|
||||||
|
|
||||||
CWII_IPC_HLE_Device_FileIO::~CWII_IPC_HLE_Device_FileIO()
|
CWII_IPC_HLE_Device_FileIO::~CWII_IPC_HLE_Device_FileIO()
|
||||||
@ -272,7 +240,7 @@ bool CWII_IPC_HLE_Device_FileIO::IOCtl(u32 _CommandAddress)
|
|||||||
{
|
{
|
||||||
case ISFS_IOCTL_GETFILESTATS:
|
case ISFS_IOCTL_GETFILESTATS:
|
||||||
{
|
{
|
||||||
m_FileLength = File::GetSize(m_pFileHandle);
|
m_FileLength = File::GetSize(m_pFileHandle);
|
||||||
u32 Position = (u32)ftello(m_pFileHandle);
|
u32 Position = (u32)ftello(m_pFileHandle);
|
||||||
|
|
||||||
u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18);
|
u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18);
|
||||||
|
@ -25,15 +25,18 @@ IVolume::ECountry CountrySwitch(u8 CountryCode)
|
|||||||
// Region free - fall through to European defaults for now
|
// Region free - fall through to European defaults for now
|
||||||
case 'A':
|
case 'A':
|
||||||
|
|
||||||
case 'X': // Not a real region code. Used by DVDX 1.0 and
|
|
||||||
// The Homebrew Channel versions 1.0.4 and earlier.
|
|
||||||
|
|
||||||
// PAL
|
// PAL
|
||||||
case 'D':
|
case 'D': // German
|
||||||
|
case 'X': // Used by a couple PAL games
|
||||||
|
case 'Y': // German, french
|
||||||
|
|
||||||
|
|
||||||
case 'L': // Japanese import to PAL regions
|
case 'L': // Japanese import to PAL regions
|
||||||
case 'M': // Japanese import to PAL regions
|
case 'M': // Japanese import to PAL regions
|
||||||
case 'S': // Spanish-speaking regions
|
case 'S': // Spanish-speaking regions
|
||||||
case 'P':
|
case 'P':
|
||||||
|
case 'U': // Australia
|
||||||
return IVolume::COUNTRY_EUROPE;
|
return IVolume::COUNTRY_EUROPE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -23,6 +23,10 @@
|
|||||||
#include "WiiSaveCrypted.h"
|
#include "WiiSaveCrypted.h"
|
||||||
#include "FileUtil.h"
|
#include "FileUtil.h"
|
||||||
#include "MathUtil.h"
|
#include "MathUtil.h"
|
||||||
|
#include "NandPaths.h"
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
static Common::replace_v replacements;
|
||||||
|
|
||||||
const u8 SDKey[16] = {0xAB, 0x01, 0xB9, 0xD8, 0xE1, 0x62, 0x2B, 0x08,
|
const u8 SDKey[16] = {0xAB, 0x01, 0xB9, 0xD8, 0xE1, 0x62, 0x2B, 0x08,
|
||||||
0xAF, 0xBA, 0xD8, 0x4D, 0xBF, 0xC2, 0xA5, 0x5D};
|
0xAF, 0xBA, 0xD8, 0x4D, 0xBF, 0xC2, 0xA5, 0x5D};
|
||||||
@ -32,6 +36,7 @@ const u8 MD5_BLANKER[0x10] = {0x0E, 0x65, 0x37, 0x81, 0x99, 0xBE, 0x45, 0x17,
|
|||||||
CWiiSaveCrypted::CWiiSaveCrypted(const char* FileName, u64 title)
|
CWiiSaveCrypted::CWiiSaveCrypted(const char* FileName, u64 title)
|
||||||
: _saveGameTitle(title)
|
: _saveGameTitle(title)
|
||||||
{
|
{
|
||||||
|
Common::ReadReplacements(replacements);
|
||||||
strcpy(pathData_bin, FileName);
|
strcpy(pathData_bin, FileName);
|
||||||
memcpy(SD_IV, "\x21\x67\x12\xE6\xAA\x1F\x68\x9F\x95\xC5\xA2\x23\x24\xDC\x6A\x98", 0x10);
|
memcpy(SD_IV, "\x21\x67\x12\xE6\xAA\x1F\x68\x9F\x95\xC5\xA2\x23\x24\xDC\x6A\x98", 0x10);
|
||||||
|
|
||||||
@ -286,7 +291,14 @@ void CWiiSaveCrypted::ImportWiiSaveFiles()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(pathRawSave, "%s%s", pathSavedir, _tmpFileHDR.name);
|
std::string fileName ((char*)_tmpFileHDR.name);
|
||||||
|
for (Common::replace_v::const_iterator iter = replacements.begin(); iter != replacements.end(); ++iter)
|
||||||
|
{
|
||||||
|
for (size_t j = 0; (j = fileName.find(iter->first, j)) != fileName.npos; ++j)
|
||||||
|
fileName.replace(j, 1, iter->second);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(pathRawSave, "%s%s", pathSavedir, fileName.c_str());
|
||||||
File::CreateFullPath(pathRawSave);
|
File::CreateFullPath(pathRawSave);
|
||||||
if (_tmpFileHDR.type == 1)
|
if (_tmpFileHDR.type == 1)
|
||||||
{
|
{
|
||||||
@ -349,13 +361,25 @@ void CWiiSaveCrypted::ExportWiiSaveFiles()
|
|||||||
SplitPath(FilesList.at(i), NULL, &__name, &__ext);
|
SplitPath(FilesList.at(i), NULL, &__name, &__ext);
|
||||||
__name += __ext;
|
__name += __ext;
|
||||||
|
|
||||||
|
|
||||||
|
for (Common::replace_v::const_iterator iter = replacements.begin(); iter != replacements.end(); ++iter)
|
||||||
|
{
|
||||||
|
|
||||||
|
for (size_t j = 0; (j = __name.find(iter->second, j)) != __name.npos; ++j)
|
||||||
|
{
|
||||||
|
/*std::string tmp = __name.substr(0, j) + iter->first +__name.substr(j+iter->second.length(), __name.length());
|
||||||
|
__name = tmp;*/
|
||||||
|
__name.replace(j, iter->second.length(), 1, iter->first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (__name.length() > 0x44)
|
if (__name.length() > 0x44)
|
||||||
{
|
{
|
||||||
PanicAlert("%s is too long for the filename, max chars is 45", __name.c_str());
|
PanicAlert("%s is too long for the filename, max chars is 45", __name.c_str());
|
||||||
b_valid = false;
|
b_valid = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
strncpy((char *)tmpFileHDR.name, __name.c_str(), 0x44);
|
strncpy((char *)tmpFileHDR.name, __name.c_str(), __name.length());
|
||||||
|
|
||||||
fpData_bin = fopen(pathData_bin, "ab");
|
fpData_bin = fopen(pathData_bin, "ab");
|
||||||
if (fpData_bin)
|
if (fpData_bin)
|
||||||
|
Reference in New Issue
Block a user