summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2013-03-02 22:57:49 -0600
committerJordan Woyak <jordan.woyak@gmail.com>2013-03-03 02:12:24 -0600
commitaeb4fc9846f19d78248994b72c0902c17df3947b (patch)
treec2c03b5db15ee55ef8dbad02a214dbb871f5ded9 /Source/Core/DiscIO
parent88cb11ba0a24e0fb841b4fc4367f4d61ae18558e (diff)
Fix what I broke.
Diffstat (limited to 'Source/Core/DiscIO')
-rw-r--r--Source/Core/DiscIO/Src/BannerLoader.cpp4
-rw-r--r--Source/Core/DiscIO/Src/BannerLoader.h6
-rw-r--r--Source/Core/DiscIO/Src/BannerLoaderGC.cpp11
-rw-r--r--Source/Core/DiscIO/Src/BannerLoaderGC.h13
-rw-r--r--Source/Core/DiscIO/Src/BannerLoaderWii.cpp139
-rw-r--r--Source/Core/DiscIO/Src/BannerLoaderWii.h3
-rw-r--r--Source/Core/DiscIO/Src/Volume.h2
7 files changed, 33 insertions, 145 deletions
diff --git a/Source/Core/DiscIO/Src/BannerLoader.cpp b/Source/Core/DiscIO/Src/BannerLoader.cpp
index 7e641aa85b..d38c7e9ea4 100644
--- a/Source/Core/DiscIO/Src/BannerLoader.cpp
+++ b/Source/Core/DiscIO/Src/BannerLoader.cpp
@@ -31,9 +31,9 @@ IBannerLoader* CreateBannerLoader(DiscIO::IFileSystem& _rFileSystem, DiscIO::IVo
{
return new CBannerLoaderWii(pVolume);
}
- if (_rFileSystem.IsValid())
+ if (_rFileSystem.IsValid())
{
- return new CBannerLoaderGC(_rFileSystem);
+ return new CBannerLoaderGC(_rFileSystem, pVolume);
}
return NULL;
diff --git a/Source/Core/DiscIO/Src/BannerLoader.h b/Source/Core/DiscIO/Src/BannerLoader.h
index 92bb874979..b30ee17a46 100644
--- a/Source/Core/DiscIO/Src/BannerLoader.h
+++ b/Source/Core/DiscIO/Src/BannerLoader.h
@@ -44,12 +44,6 @@ class IBannerLoader
virtual std::vector<std::string> GetNames() = 0;
virtual std::string GetCompany() = 0;
virtual std::vector<std::string> GetDescriptions() = 0;
-
- private:
- u16 swap16(u16 data)
- {
- return ((data & 0xff00) >> 8) | ((data & 0xff) << 8);
- }
};
IBannerLoader* CreateBannerLoader(DiscIO::IFileSystem& _rFileSystem, DiscIO::IVolume *pVolume);
diff --git a/Source/Core/DiscIO/Src/BannerLoaderGC.cpp b/Source/Core/DiscIO/Src/BannerLoaderGC.cpp
index bf087cbfb6..d8ae259b16 100644
--- a/Source/Core/DiscIO/Src/BannerLoaderGC.cpp
+++ b/Source/Core/DiscIO/Src/BannerLoaderGC.cpp
@@ -23,9 +23,10 @@
namespace DiscIO
{
-CBannerLoaderGC::CBannerLoaderGC(DiscIO::IFileSystem& _rFileSystem)
- : m_pBannerFile(NULL),
- m_IsValid(false)
+CBannerLoaderGC::CBannerLoaderGC(DiscIO::IFileSystem& _rFileSystem, DiscIO::IVolume* volume)
+ : m_pBannerFile(NULL)
+ , m_IsValid(false)
+ , m_country(volume->GetCountry())
{
// load the opening.bnr
size_t FileSize = (size_t) _rFileSystem.GetFileSize("opening.bnr");
@@ -104,7 +105,7 @@ std::vector<std::string> CBannerLoaderGC::GetNames()
auto const banner = reinterpret_cast<const DVDBanner*>(m_pBannerFile);
- for (int i = 0; i != name_count; ++i)
+ for (u32 i = 0; i != name_count; ++i)
{
auto& comment = banner->comment[i];
@@ -167,7 +168,7 @@ std::vector<std::string> CBannerLoaderGC::GetDescriptions()
auto banner = reinterpret_cast<const DVDBanner*>(m_pBannerFile);
- for (int i = 0; i != desc_count; ++i)
+ for (u32 i = 0; i != desc_count; ++i)
{
auto& data = banner->comment[i].comment;
descriptions.push_back(GetDecodedString(data));
diff --git a/Source/Core/DiscIO/Src/BannerLoaderGC.h b/Source/Core/DiscIO/Src/BannerLoaderGC.h
index b4903561e4..8bc8c46483 100644
--- a/Source/Core/DiscIO/Src/BannerLoaderGC.h
+++ b/Source/Core/DiscIO/Src/BannerLoaderGC.h
@@ -19,6 +19,7 @@
#define _BANNER_LOADER_GC_H_
#include "BannerLoader.h"
+#include "StringUtil.h"
namespace DiscIO
{
@@ -26,7 +27,7 @@ class CBannerLoaderGC
: public IBannerLoader
{
public:
- CBannerLoaderGC(DiscIO::IFileSystem& _rFileSystem);
+ CBannerLoaderGC(DiscIO::IFileSystem& _rFileSystem, DiscIO::IVolume* volume);
virtual ~CBannerLoaderGC();
virtual bool IsValid();
@@ -76,8 +77,12 @@ class CBannerLoaderGC
template <u32 N>
std::string GetDecodedString(const char (&data)[N])
{
- // Can I always assume SHIFT-JIS?
- return SHIFTJISToUTF8(std::string(data, strnlen(data, sizeof(data))));
+ auto const string_decoder = (DiscIO::IVolume::COUNTRY_JAPAN == m_country ||
+ DiscIO::IVolume::COUNTRY_TAIWAN == m_country) ?
+ SHIFTJISToUTF8 : CP1252ToUTF8;
+
+ // strnlen to trim NULLs
+ return string_decoder(std::string(data, strnlen(data, sizeof(data))));
}
u8* m_pBannerFile;
@@ -86,6 +91,8 @@ class CBannerLoaderGC
void decode5A3image(u32* dst, u16* src, int width, int height);
BANNER_TYPE getBannerType();
+
+ DiscIO::IVolume::ECountry const m_country;
};
} // namespace
diff --git a/Source/Core/DiscIO/Src/BannerLoaderWii.cpp b/Source/Core/DiscIO/Src/BannerLoaderWii.cpp
index b94e299f04..f606ed8876 100644
--- a/Source/Core/DiscIO/Src/BannerLoaderWii.cpp
+++ b/Source/Core/DiscIO/Src/BannerLoaderWii.cpp
@@ -25,25 +25,6 @@
#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
{
@@ -164,35 +145,24 @@ bool CBannerLoaderWii::GetBanner(u32* _pBannerImage)
return true;
}
-bool CBannerLoaderWii::GetStringFromComments(const CommentIndex index, std::string& s)
+bool CBannerLoaderWii::GetStringFromComments(const CommentIndex index, std::string& result)
{
- bool ret = false;
-
if (IsValid())
{
- // find Banner type
- SWiiBanner *pBanner = (SWiiBanner*)m_pBannerFile;
- // TODO: trim NULLs
- ret = CopyBeUnicodeToString(s, pBanner->m_Comment[index], COMMENT_SIZE);
- }
-
- return ret;
-}
-
-bool CBannerLoaderWii::GetStringFromComments(const CommentIndex index, std::wstring& s)
-{
- if (IsValid())
- {
- // find Banner type
- SWiiBanner* pBanner = (SWiiBanner*)m_pBannerFile;
-
- std::wstring description;
- for (int i = 0; i < COMMENT_SIZE; ++i)
- description.push_back(Common::swap16(pBanner->m_Comment[index][i]));
-
- s = description;
+ auto const banner = reinterpret_cast<const SWiiBanner*>(m_pBannerFile);
+ auto const src_ptr = banner->m_Comment[index];
+
+ // Trim at first NULL
+ auto const length = std::find(src_ptr, src_ptr + COMMENT_SIZE, 0x0) - src_ptr;
+
+ std::wstring src;
+ src.resize(length);
+ std::transform(src_ptr, src_ptr + src.size(), src.begin(), (u16(&)(u16))Common::swap16);
+ result = UTF16ToUTF8(src);
+
return true;
}
+
return false;
}
@@ -237,87 +207,4 @@ 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
diff --git a/Source/Core/DiscIO/Src/BannerLoaderWii.h b/Source/Core/DiscIO/Src/BannerLoaderWii.h
index 60d317155b..036eeeacbd 100644
--- a/Source/Core/DiscIO/Src/BannerLoaderWii.h
+++ b/Source/Core/DiscIO/Src/BannerLoaderWii.h
@@ -75,9 +75,6 @@ class CBannerLoaderWii
void decode5A3image(u32* dst, u16* src, int width, int height);
bool GetStringFromComments(const CommentIndex index, std::string& s);
- bool GetStringFromComments(const CommentIndex index, std::wstring& s);
-
- bool CopyBeUnicodeToString(std::string& _rDestination, const u16* _src, int length);
};
} // namespace
diff --git a/Source/Core/DiscIO/Src/Volume.h b/Source/Core/DiscIO/Src/Volume.h
index 4743cfce89..c19aaf93a8 100644
--- a/Source/Core/DiscIO/Src/Volume.h
+++ b/Source/Core/DiscIO/Src/Volume.h
@@ -22,6 +22,7 @@
#include <vector>
#include "Common.h"
+#include "StringUtil.h"
namespace DiscIO
{
@@ -37,6 +38,7 @@ public:
virtual void GetTMD(u8*, u32 *_sz) const { *_sz=0; }
virtual std::string GetUniqueID() const = 0;
virtual std::string GetMakerID() const = 0;
+ // TODO: eliminate?
virtual std::string GetName() const;
virtual std::vector<std::string> GetNames() const = 0;
virtual u32 GetFSTSize() const = 0;