DataStreamPtr FileSystemArchive::open(
const String& filename)
const {
String full_path = concatenate_path(mName, filename);
// Use filesystem to determine size // (quicker than streaming to the end and back) struct stat tagStat;
int ret = stat(full_path.c_str(), &tagStat);
assert(ret == 0 && "Problem getting file size" );
// Always open in binary mode static std::vector<wchar_t> s_wchar_buf((size_t)128);
size_t lengthUnicode = MultiByteToWideChar(CP_ACP, 0, full_path.c_str(), full_path.size(), NULL, 0);
if (s_wchar_buf.size() < lengthUnicode + 1)
{
s_wchar_buf.resize(lengthUnicode * 2);
}
wchar_t* szUnicode = &s_wchar_buf[0];
MultiByteToWideChar(CP_ACP, 0, full_path.c_str(), full_path.size(), szUnicode, lengthUnicode);
szUnicode[lengthUnicode] = 0;
std::ifstream* origStream =
new std::ifstream();
origStream->open(szUnicode, std::ios::
in | std::ios::binary);
// Should check ensure open succeeded, in case fail for some reason. if (origStream->fail())
{
delete origStream;
OGRE_EXCEPT(Exception::ERR_FILE_NOT_FOUND,
"Cannot open file: " + filename,
"FileSystemArchive::open");
}
/// Construct return stream, tell it to delete on destroy FileStreamDataStream* stream =
new FileStreamDataStream(filename,
origStream, tagStat.st_size,
true);
return DataStreamPtr(stream);
}