| 
									
										
										
										
											2009-07-28 21:32:10 +00:00
										 |  |  | // Copyright (C) 2003 Dolphin Project.
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // This program 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, version 2.0.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // This program 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 2.0 for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // A copy of the GPL 2.0 should have been included with the program.
 | 
					
						
							|  |  |  | // If not, see http://www.gnu.org/licenses/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Official SVN repository and contact information can be found at
 | 
					
						
							|  |  |  | // http://code.google.com/p/dolphin-emu/
 | 
					
						
							|  |  |  | #include "stdafx.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "BannerLoader.h"
 | 
					
						
							|  |  |  | #include "BannerLoaderWii.h"
 | 
					
						
							|  |  |  | #include "BannerLoaderGC.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "VolumeCreator.h"
 | 
					
						
							|  |  |  | #include "FileUtil.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 16:31:44 +00:00
										 |  |  | // HyperIris: dunno if this suitable, may be need move.
 | 
					
						
							|  |  |  | #ifdef WIN32
 | 
					
						
							|  |  |  | #include <Windows.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | namespace DiscIO | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-07-28 23:38:49 +00:00
										 |  |  | void IBannerLoader::CopyToStringAndCheck(std::string& _rDestination, const char* _src) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	static bool bValidChars[256]; | 
					
						
							|  |  |  | 	static bool bInitialized = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!bInitialized) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-07-28 23:38:49 +00:00
										 |  |  | 		for (int i = 0; i < 0x20; i++) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			bValidChars[i] = false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// generate valid chars
 | 
					
						
							| 
									
										
										
										
											2009-02-09 15:41:28 +00:00
										 |  |  | 		for (int i = 0x20; i < 256; i++) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2009-02-09 15:41:28 +00:00
										 |  |  | 			bValidChars[i] = true; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		bValidChars[0x0a] = true; | 
					
						
							| 
									
										
										
										
											2009-02-09 15:41:28 +00:00
										 |  |  | 		//bValidChars[0xa9] = true;
 | 
					
						
							|  |  |  | 		//bValidChars[0xe9] = true;
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		bInitialized = true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-09 15:41:28 +00:00
										 |  |  | 	char destBuffer[2048] = {0}; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 	char* dest = destBuffer; | 
					
						
							|  |  |  | 	const char* src = _src; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// copy the string and check for "unknown" characters
 | 
					
						
							|  |  |  | 	while (*src != 0x00) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		u8 c = *src; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (c == 0x0a){c = 0x20;} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (bValidChars[c] == false) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2009-07-28 23:38:49 +00:00
										 |  |  | 			src++; | 
					
						
							|  |  |  | 			continue; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		*dest = c; | 
					
						
							|  |  |  | 		dest++; | 
					
						
							|  |  |  | 		src++; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// finalize the string
 | 
					
						
							| 
									
										
										
										
											2009-07-28 23:38:49 +00:00
										 |  |  | 	*dest = 0x00; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	_rDestination = destBuffer; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-06 16:53:22 +00:00
										 |  |  | bool IBannerLoader::CopyBeUnicodeToString( std::string& _rDestination, const u16* _src, int length ) | 
					
						
							| 
									
										
										
										
											2009-01-21 16:31:44 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	bool returnCode = false; | 
					
						
							|  |  |  | #ifdef WIN32
 | 
					
						
							|  |  |  | 	if (_src) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-02-06 16:53:22 +00:00
										 |  |  | 		u16* buffer = new u16[length]; | 
					
						
							|  |  |  | 		if (buffer) | 
					
						
							| 
									
										
										
										
											2009-01-21 16:31:44 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2009-02-06 16:53:22 +00:00
										 |  |  | 			memcpy(buffer, _src, sizeof(u16)*length); | 
					
						
							|  |  |  | 			for (int i = 0; i < length; i++) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				buffer[i] = swap16(buffer[i]); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-02-28 18:44:39 +00:00
										 |  |  | 			u32 ansiNameSize = WideCharToMultiByte(932, 0,  | 
					
						
							|  |  |  | 				(LPCWSTR)buffer, (int)wcslen((LPCWSTR)buffer), | 
					
						
							| 
									
										
										
										
											2009-02-06 16:53:22 +00:00
										 |  |  | 				NULL, NULL, NULL, NULL); | 
					
						
							|  |  |  | 			if (ansiNameSize > 0) | 
					
						
							| 
									
										
										
										
											2009-01-21 16:31:44 +00:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2009-02-06 16:53:22 +00:00
										 |  |  | 				char* pAnsiStrBuffer = new char[ansiNameSize + 1]; | 
					
						
							|  |  |  | 				if (pAnsiStrBuffer) | 
					
						
							| 
									
										
										
										
											2009-01-21 16:31:44 +00:00
										 |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2009-02-06 16:53:22 +00:00
										 |  |  | 					memset(pAnsiStrBuffer, 0, (ansiNameSize + 1) * sizeof(char)); | 
					
						
							| 
									
										
										
										
											2009-02-28 18:44:39 +00:00
										 |  |  | 					if (WideCharToMultiByte(932, 0,  | 
					
						
							|  |  |  | 						(LPCWSTR)buffer, (int)wcslen((LPCWSTR)buffer), | 
					
						
							| 
									
										
										
										
											2009-02-06 16:53:22 +00:00
										 |  |  | 						pAnsiStrBuffer, ansiNameSize, NULL, NULL)) | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						_rDestination = pAnsiStrBuffer; | 
					
						
							|  |  |  | 						returnCode = true; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2009-08-03 22:51:13 +00:00
										 |  |  | 					delete[] pAnsiStrBuffer; | 
					
						
							| 
									
										
										
										
											2009-01-21 16:31:44 +00:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2009-02-06 16:53:22 +00:00
										 |  |  | 			}	 | 
					
						
							| 
									
										
										
										
											2009-08-03 22:51:13 +00:00
										 |  |  | 			delete[] buffer; | 
					
						
							| 
									
										
										
										
											2009-02-06 16:53:22 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-01-21 16:31:44 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2009-01-24 22:24:44 +00:00
										 |  |  | 	// FIXME: Horribly broke on non win32
 | 
					
						
							|  |  |  | 	//	_rDestination = _src;
 | 
					
						
							| 
									
										
										
										
											2009-02-03 15:03:34 +00:00
										 |  |  | 	returnCode = false; | 
					
						
							| 
									
										
										
										
											2009-01-21 16:31:44 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 	return returnCode; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-07 02:54:07 +00:00
										 |  |  | IBannerLoader* CreateBannerLoader(DiscIO::IFileSystem& _rFileSystem, DiscIO::IVolume *pVolume) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-06-07 02:54:07 +00:00
										 |  |  | 	if (IsVolumeWiiDisc(pVolume) || IsVolumeWadFile(pVolume)) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-06-07 02:54:07 +00:00
										 |  |  | 		return(new CBannerLoaderWii(pVolume)); | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return(new CBannerLoaderGC(_rFileSystem)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | } // namespace
 | 
					
						
							|  |  |  | 
 |