Kill wstring version of game description.

This commit is contained in:
Jordan Woyak 2013-03-01 19:33:17 -06:00
parent b0630790c1
commit e079d24912
8 changed files with 120 additions and 176 deletions

View File

@ -22,25 +22,6 @@
#include "VolumeCreator.h" #include "VolumeCreator.h"
#include "FileUtil.h" #include "FileUtil.h"
// HyperIris: dunno if this suitable, may be need move.
#ifdef _WIN32
#include <Windows.h>
#else
#include <sys/param.h>
#ifndef ANDROID
#include <iconv.h>
#endif
#include <errno.h>
#endif
#ifndef ICONV_CONST
#if defined __FreeBSD__ || __NetBSD__
#define ICONV_CONST const
#else
#define ICONV_CONST
#endif
#endif
namespace DiscIO namespace DiscIO
{ {
void IBannerLoader::CopyToStringAndCheck(std::string& _rDestination, const char* _src) void IBannerLoader::CopyToStringAndCheck(std::string& _rDestination, const char* _src)
@ -96,113 +77,6 @@ void IBannerLoader::CopyToStringAndCheck(std::string& _rDestination, const char*
_rDestination = destBuffer; _rDestination = destBuffer;
} }
bool IBannerLoader::CopyBeUnicodeToString( std::string& _rDestination, const u16* _src, int length )
{
bool returnCode = false;
#ifdef WIN32
if (_src)
{
u16* buffer = new u16[length];
if (buffer)
{
memcpy(buffer, _src, sizeof(u16)*length);
for (int i = 0; i < length; i++)
{
buffer[i] = swap16(buffer[i]);
}
u32 ansiNameSize = WideCharToMultiByte(932, 0,
(LPCWSTR)buffer, (int)wcslen((LPCWSTR)buffer),
NULL, NULL, NULL, NULL);
if (ansiNameSize > 0)
{
char* pAnsiStrBuffer = new char[ansiNameSize + 1];
if (pAnsiStrBuffer)
{
memset(pAnsiStrBuffer, 0, (ansiNameSize + 1) * sizeof(char));
if (WideCharToMultiByte(932, 0,
(LPCWSTR)buffer, (int)wcslen((LPCWSTR)buffer),
pAnsiStrBuffer, ansiNameSize, NULL, NULL))
{
_rDestination = pAnsiStrBuffer;
returnCode = true;
}
delete[] pAnsiStrBuffer;
}
}
delete[] buffer;
}
}
#else
#ifdef ANDROID
return false;
#else
if (_src)
{
iconv_t conv_desc = iconv_open("UTF-8", "CP932");
if (conv_desc == (iconv_t) -1)
{
// Initialization failure.
if (errno == EINVAL)
{
ERROR_LOG(DISCIO, "Conversion from CP932 to UTF-8 is not supported.");
}
else
{
ERROR_LOG(DISCIO, "Iconv initialization failure: %s\n", strerror (errno));
}
return false;
}
char* src_buffer = new char[length];
for (int i = 0; i < length; i++)
src_buffer[i] = swap16(_src[i]);
size_t inbytes = sizeof(char) * length;
size_t outbytes = 2 * inbytes;
char* utf8_buffer = new char[outbytes + 1];
memset(utf8_buffer, 0, (outbytes + 1) * sizeof(char));
// Save the buffer locations because iconv increments them
char* utf8_buffer_start = utf8_buffer;
char* src_buffer_start = src_buffer;
size_t iconv_size = iconv(conv_desc,
(ICONV_CONST char**)&src_buffer, &inbytes,
&utf8_buffer, &outbytes);
// Handle failures
if (iconv_size == (size_t) -1)
{
ERROR_LOG(DISCIO, "iconv failed.");
switch (errno) {
case EILSEQ:
ERROR_LOG(DISCIO, "Invalid multibyte sequence.");
break;
case EINVAL:
ERROR_LOG(DISCIO, "Incomplete multibyte sequence.");
break;
case E2BIG:
ERROR_LOG(DISCIO, "Insufficient space allocated for output buffer.");
break;
default:
ERROR_LOG(DISCIO, "Error: %s.", strerror(errno));
}
}
else
{
_rDestination = utf8_buffer_start;
returnCode = true;
}
delete[] utf8_buffer_start;
delete[] src_buffer_start;
iconv_close(conv_desc);
}
#endif
#endif
return returnCode;
}
IBannerLoader* CreateBannerLoader(DiscIO::IFileSystem& _rFileSystem, DiscIO::IVolume *pVolume) IBannerLoader* CreateBannerLoader(DiscIO::IFileSystem& _rFileSystem, DiscIO::IVolume *pVolume)
{ {
if (IsVolumeWiiDisc(pVolume) || IsVolumeWadFile(pVolume)) if (IsVolumeWiiDisc(pVolume) || IsVolumeWadFile(pVolume))

View File

@ -43,14 +43,11 @@ class IBannerLoader
virtual bool GetCompany(std::string& _rCompany) = 0; virtual bool GetCompany(std::string& _rCompany) = 0;
virtual bool GetDescription(std::string* _rDescription) = 0; virtual bool GetDescription(std::string* _rDescription) = 0;
virtual bool GetDescription(std::wstring& _rDescription) {return false;};
protected: protected:
void CopyToStringAndCheck(std::string& _rDestination, const char* _src); void CopyToStringAndCheck(std::string& _rDestination, const char* _src);
bool CopyBeUnicodeToString(std::string& _rDestination, const u16* _src, int length);
private: private:
u16 swap16(u16 data) u16 swap16(u16 data)
{ {

View File

@ -16,6 +16,7 @@
// http://code.google.com/p/dolphin-emu/ // http://code.google.com/p/dolphin-emu/
#include <stdio.h> #include <stdio.h>
#include <algorithm>
#include "Common.h" #include "Common.h"
#include "ColorUtil.h" #include "ColorUtil.h"
@ -24,6 +25,25 @@
#include "FileUtil.h" #include "FileUtil.h"
#include "FileHandlerARC.h" #include "FileHandlerARC.h"
// HyperIris: dunno if this suitable, may be need move.
#ifdef _WIN32
#include <Windows.h>
#else
#include <sys/param.h>
#ifndef ANDROID
#include <iconv.h>
#endif
#include <errno.h>
#endif
#ifndef ICONV_CONST
#if defined __FreeBSD__ || __NetBSD__
#define ICONV_CONST const
#else
#define ICONV_CONST
#endif
#endif
namespace DiscIO namespace DiscIO
{ {
@ -152,16 +172,8 @@ bool CBannerLoaderWii::GetStringFromComments(const CommentIndex index, std::stri
{ {
// find Banner type // find Banner type
SWiiBanner *pBanner = (SWiiBanner*)m_pBannerFile; SWiiBanner *pBanner = (SWiiBanner*)m_pBannerFile;
// TODO: trim NULLs
// Ensure the string is null-terminating, since the banner format ret = CopyBeUnicodeToString(s, pBanner->m_Comment[index], COMMENT_SIZE);
// doesn't require it
u16 *src = new u16[COMMENT_SIZE + 1];
memcpy(src, &pBanner->m_Comment[index], COMMENT_SIZE * sizeof(u16));
src[COMMENT_SIZE] = 0;
ret = CopyBeUnicodeToString(s, src, COMMENT_SIZE + 1);
delete [] src;
} }
return ret; return ret;
@ -208,11 +220,6 @@ bool CBannerLoaderWii::GetDescription(std::string* _rDescription)
return GetStringFromComments(DESC_IDX, *_rDescription); return GetStringFromComments(DESC_IDX, *_rDescription);
} }
bool CBannerLoaderWii::GetDescription(std::wstring& _rDescription)
{
return GetStringFromComments(DESC_IDX, _rDescription);
}
void CBannerLoaderWii::decode5A3image(u32* dst, u16* src, int width, int height) void CBannerLoaderWii::decode5A3image(u32* dst, u16* src, int width, int height)
{ {
for (int y = 0; y < height; y += 4) for (int y = 0; y < height; y += 4)
@ -231,4 +238,87 @@ void CBannerLoaderWii::decode5A3image(u32* dst, u16* src, int width, int height)
} }
} }
bool CBannerLoaderWii::CopyBeUnicodeToString( std::string& _rDestination, const u16* _src, int length )
{
bool returnCode = false;
#ifdef _WIN32
if (_src)
{
std::wstring src;
src.resize(length);
std::transform(_src, _src + length, &src[0], (u16(&)(u16))Common::swap16);
_rDestination = UTF16ToUTF8(src);
returnCode = true;
}
#else
#ifdef ANDROID
return false;
#else
if (_src)
{
iconv_t conv_desc = iconv_open("UTF-8", "CP932");
if (conv_desc == (iconv_t) -1)
{
// Initialization failure.
if (errno == EINVAL)
{
ERROR_LOG(DISCIO, "Conversion from CP932 to UTF-8 is not supported.");
}
else
{
ERROR_LOG(DISCIO, "Iconv initialization failure: %s\n", strerror (errno));
}
return false;
}
char* src_buffer = new char[length];
for (int i = 0; i < length; i++)
src_buffer[i] = swap16(_src[i]);
size_t inbytes = sizeof(char) * length;
size_t outbytes = 2 * inbytes;
char* utf8_buffer = new char[outbytes + 1];
memset(utf8_buffer, 0, (outbytes + 1) * sizeof(char));
// Save the buffer locations because iconv increments them
char* utf8_buffer_start = utf8_buffer;
char* src_buffer_start = src_buffer;
size_t iconv_size = iconv(conv_desc,
(ICONV_CONST char**)&src_buffer, &inbytes,
&utf8_buffer, &outbytes);
// Handle failures
if (iconv_size == (size_t) -1)
{
ERROR_LOG(DISCIO, "iconv failed.");
switch (errno) {
case EILSEQ:
ERROR_LOG(DISCIO, "Invalid multibyte sequence.");
break;
case EINVAL:
ERROR_LOG(DISCIO, "Incomplete multibyte sequence.");
break;
case E2BIG:
ERROR_LOG(DISCIO, "Insufficient space allocated for output buffer.");
break;
default:
ERROR_LOG(DISCIO, "Error: %s.", strerror(errno));
}
}
else
{
_rDestination = utf8_buffer_start;
returnCode = true;
}
delete[] utf8_buffer_start;
delete[] src_buffer_start;
iconv_close(conv_desc);
}
#endif
#endif
return returnCode;
}
} // namespace } // namespace

View File

@ -43,8 +43,6 @@ class CBannerLoaderWii
virtual bool GetDescription(std::string* _rDescription); virtual bool GetDescription(std::string* _rDescription);
bool GetDescription(std::wstring& _rDescription);
private: private:
enum enum
@ -82,6 +80,8 @@ class CBannerLoaderWii
bool GetStringFromComments(const CommentIndex index, std::string& s); bool GetStringFromComments(const CommentIndex index, std::string& s);
bool GetStringFromComments(const CommentIndex index, std::wstring& s); bool GetStringFromComments(const CommentIndex index, std::wstring& s);
bool CopyBeUnicodeToString(std::string& _rDestination, const u16* _src, int length);
}; };
} // namespace } // namespace

View File

@ -456,16 +456,9 @@ void CGameListCtrl::InsertItemInReportView(long _Index)
SetItemColumnImage(_Index, COLUMN_BANNER, ImageIndex); SetItemColumnImage(_Index, COLUMN_BANNER, ImageIndex);
std::wstring wstring_name; std::wstring wstring_name;
const std::wstring& wstring_description = rISOFile.GetDescription();
std::string company;
wxString name; wxString name;
wxString description;
// We show the company string on Gamecube only
// On Wii we show the description instead as the company string is empty
if (rISOFile.GetPlatform() == GameListItem::GAMECUBE_DISC)
company = rISOFile.GetCompany().c_str();
int SelectedLanguage = SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage; int SelectedLanguage = SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage;
switch (rISOFile.GetCountry()) switch (rISOFile.GetCountry())
{ {
@ -475,11 +468,10 @@ void CGameListCtrl::InsertItemInReportView(long _Index)
rISOFile.GetName(wstring_name, -1); rISOFile.GetName(wstring_name, -1);
name = wxString(rISOFile.GetName(0).c_str(), SJISConv); name = wxString(rISOFile.GetName(0).c_str(), SJISConv);
m_gameList.append(StringFromFormat("%s (J)\n", (const char *)name.c_str())); m_gameList.append(StringFromFormat("%s (J)\n", (const char *)name.c_str()));
description = wxString(company.size() ? company.c_str() :
rISOFile.GetDescription(0).c_str(), SJISConv);
} }
break; break;
case DiscIO::IVolume::COUNTRY_USA: case DiscIO::IVolume::COUNTRY_USA:
// Is this sane?
SelectedLanguage = 0; SelectedLanguage = 0;
default: default:
{ {
@ -490,19 +482,21 @@ void CGameListCtrl::InsertItemInReportView(long _Index)
m_gameList.append(StringFromFormat("%s (%c)\n", m_gameList.append(StringFromFormat("%s (%c)\n",
rISOFile.GetName(SelectedLanguage).c_str(), rISOFile.GetName(SelectedLanguage).c_str(),
(rISOFile.GetCountry() == DiscIO::IVolume::COUNTRY_USA) ? 'U' : 'E')); (rISOFile.GetCountry() == DiscIO::IVolume::COUNTRY_USA) ? 'U' : 'E'));
description = wxString(company.size() ? company.c_str() :
rISOFile.GetDescription(SelectedLanguage).c_str(), WindowsCP1252);
} }
break; break;
} }
if (wstring_name.length()) if (wstring_name.length())
name = wstring_name.c_str(); name = wstring_name.c_str();
if (wstring_description.length())
description = wstring_description.c_str();
SetItem(_Index, COLUMN_TITLE, name, -1); SetItem(_Index, COLUMN_TITLE, name, -1);
SetItem(_Index, COLUMN_NOTES, description, -1);
// We show the company string on Gamecube only
// On Wii we show the description instead as the company string is empty
std::string const notes = (rISOFile.GetPlatform() == GameListItem::GAMECUBE_DISC) ?
rISOFile.GetCompany() : rISOFile.GetDescription(SelectedLanguage);
SetItem(_Index, COLUMN_NOTES, StrToWxStr(notes), -1);
// Emulation state // Emulation state
SetItemColumnImage(_Index, COLUMN_EMULATION_STATE, m_EmuStateImageIndex[rISOFile.GetEmuState()]); SetItemColumnImage(_Index, COLUMN_EMULATION_STATE, m_EmuStateImageIndex[rISOFile.GetEmuState()]);

View File

@ -37,7 +37,7 @@
#include "ChunkFile.h" #include "ChunkFile.h"
#include "ConfigManager.h" #include "ConfigManager.h"
#define CACHE_REVISION 0x10F #define CACHE_REVISION 0x110
#define DVD_BANNER_WIDTH 96 #define DVD_BANNER_WIDTH 96
#define DVD_BANNER_HEIGHT 32 #define DVD_BANNER_HEIGHT 32
@ -109,7 +109,6 @@ GameListItem::GameListItem(const std::string& _rFileName)
pBannerLoader->GetName(m_wNames); pBannerLoader->GetName(m_wNames);
pBannerLoader->GetName(m_Name); pBannerLoader->GetName(m_Name);
pBannerLoader->GetCompany(m_Company); pBannerLoader->GetCompany(m_Company);
pBannerLoader->GetDescription(m_wDescription);
pBannerLoader->GetDescription(m_Description); pBannerLoader->GetDescription(m_Description);
if (pBannerLoader->GetBanner(g_ImageTemp)) if (pBannerLoader->GetBanner(g_ImageTemp))
@ -235,7 +234,6 @@ void GameListItem::DoState(PointerWrap &p)
p.Do(m_Company); p.Do(m_Company);
p.Do(m_Description[0]); p.Do(m_Description[1]); p.Do(m_Description[2]); p.Do(m_Description[0]); p.Do(m_Description[1]); p.Do(m_Description[2]);
p.Do(m_Description[3]); p.Do(m_Description[4]); p.Do(m_Description[5]); p.Do(m_Description[3]); p.Do(m_Description[4]); p.Do(m_Description[5]);
p.Do(m_wDescription);
p.Do(m_UniqueID); p.Do(m_UniqueID);
p.Do(m_FileSize); p.Do(m_FileSize);
p.Do(m_VolumeSize); p.Do(m_VolumeSize);
@ -273,11 +271,6 @@ const std::string& GameListItem::GetDescription(int index) const
return m_Description[0]; return m_Description[0];
} }
const std::wstring& GameListItem::GetDescription() const
{
return m_wDescription;
}
const std::string& GameListItem::GetName(int index) const const std::string& GameListItem::GetName(int index) const
{ {
if ((index >=0) && (index < 6)) if ((index >=0) && (index < 6))

View File

@ -37,8 +37,7 @@ public:
const std::string& GetName(int index) const; const std::string& GetName(int index) const;
bool GetName(std::wstring& wName, int index=0) const; bool GetName(std::wstring& wName, int index=0) const;
const std::string& GetCompany() const {return m_Company;} const std::string& GetCompany() const {return m_Company;}
const std::string& GetDescription(int index) const; const std::string& GetDescription(int index = 0) const;
const std::wstring& GetDescription() const;
const std::string& GetUniqueID() const {return m_UniqueID;} const std::string& GetUniqueID() const {return m_UniqueID;}
const std::string GetWiiFSPath() const; const std::string GetWiiFSPath() const;
DiscIO::IVolume::ECountry GetCountry() const {return m_Country;} DiscIO::IVolume::ECountry GetCountry() const {return m_Country;}
@ -69,7 +68,6 @@ private:
std::vector<std::wstring> m_wNames; std::vector<std::wstring> m_wNames;
std::string m_Company; std::string m_Company;
std::string m_Description[6]; std::string m_Description[6];
std::wstring m_wDescription;
std::string m_UniqueID; std::string m_UniqueID;
std::string m_issues; std::string m_issues;

View File

@ -1339,8 +1339,7 @@ void CISOProperties::ChangeBannerDetails(int lang)
else else
shortName = wxString(OpenGameListItem->GetName(0).c_str(), SJISConv); shortName = wxString(OpenGameListItem->GetName(0).c_str(), SJISConv);
if ((comment = OpenGameListItem->GetDescription().c_str()).size() == 0) comment = StrToWxStr(OpenGameListItem->GetDescription());
comment = wxString(OpenGameListItem->GetDescription(0).c_str(), SJISConv);
maker = wxString(OpenGameListItem->GetCompany().c_str(), SJISConv); maker = wxString(OpenGameListItem->GetCompany().c_str(), SJISConv);
break; break;
case DiscIO::IVolume::COUNTRY_USA: case DiscIO::IVolume::COUNTRY_USA:
@ -1352,8 +1351,7 @@ void CISOProperties::ChangeBannerDetails(int lang)
shortName = wname.c_str(); shortName = wname.c_str();
else else
shortName = wxString(OpenGameListItem->GetName(lang).c_str(), WindowsCP1252); shortName = wxString(OpenGameListItem->GetName(lang).c_str(), WindowsCP1252);
if ((comment = OpenGameListItem->GetDescription().c_str()).size() == 0) comment = StrToWxStr(OpenGameListItem->GetDescription(lang));
comment = wxString(OpenGameListItem->GetDescription(lang).c_str(), WindowsCP1252);
maker = wxString(OpenGameListItem->GetCompany().c_str(), WindowsCP1252); maker = wxString(OpenGameListItem->GetCompany().c_str(), WindowsCP1252);
} }
break; break;