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

@ -16,6 +16,7 @@
// http://code.google.com/p/dolphin-emu/
#include <stdio.h>
#include <algorithm>
#include "Common.h"
#include "ColorUtil.h"
@ -24,6 +25,25 @@
#include "FileUtil.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
{
@ -152,16 +172,8 @@ bool CBannerLoaderWii::GetStringFromComments(const CommentIndex index, std::stri
{
// find Banner type
SWiiBanner *pBanner = (SWiiBanner*)m_pBannerFile;
// Ensure the string is null-terminating, since the banner format
// 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;
// TODO: trim NULLs
ret = CopyBeUnicodeToString(s, pBanner->m_Comment[index], COMMENT_SIZE);
}
return ret;
@ -208,11 +220,6 @@ bool CBannerLoaderWii::GetDescription(std::string* _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)
{
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