COMMON: Added VersionInfo parser to WinResources

This commit is contained in:
Eugene Sandulenko 2020-07-09 23:13:05 +02:00
parent 4e0eec203d
commit f534e11ccf
2 changed files with 60 additions and 0 deletions

View file

@ -23,6 +23,7 @@
#include "common/file.h"
#include "common/memstream.h"
#include "common/str.h"
#include "common/ustr.h"
#include "common/winexe.h"
#include "common/winexe_ne.h"
#include "common/winexe_pe.h"
@ -183,4 +184,59 @@ WinResources *WinResources::createFromEXE(const String &fileName) {
return nullptr;
}
WinResources::VersionHash *WinResources::parseVersionInfo(SeekableReadStream *res) {
VersionHash *versionMap = new VersionHash;
while (res->pos() < res->size() && !res->eos()) {
while (res->pos() % 4 && !res->eos()) // Pad to 4
res->readByte();
/* uint16 len = */ res->readUint16LE();
uint16 valLen = res->readUint16LE();
uint16 type = res->readUint16LE();
uint16 c;
Common::U32String info;
while ((c = res->readUint16LE()) != 0 && !res->eos())
info += c;
while (res->pos() % 4 && !res->eos()) // Pad to 4
res->readByte();
if (res->eos())
break;
if (type != 0) { // text
Common::U32String value;
for (int j = 0; j < valLen; j++)
value += res->readUint16LE();
versionMap->setVal(info.encode(), value);
} else {
if (info == "VS_VERSION_INFO") {
uint16 pos2 = res->pos() + valLen;
res->readUint32LE();
res->readUint32LE();
uint16 fileB = res->readUint16LE();
uint16 fileA = res->readUint16LE();
uint16 fileD = res->readUint16LE();
uint16 fileC = res->readUint16LE();
uint16 prodB = res->readUint16LE();
uint16 prodA = res->readUint16LE();
uint16 prodD = res->readUint16LE();
uint16 prodC = res->readUint16LE();
versionMap->setVal("File:", Common::String::format("%d.%d.%d.%d", fileA, fileB, fileC, fileD));
versionMap->setVal("Prod:", Common::String::format("%d.%d.%d.%d", prodA, prodB, prodC, prodD));
while (res->pos() != pos2 && !res->eos())
res->readByte();
}
}
}
return versionMap;
}
} // End of namespace Common

View file

@ -130,6 +130,10 @@ public:
}
static WinResources *createFromEXE(const String &fileName);
typedef Common::HashMap<Common::String, Common::U32String, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> VersionHash;
static VersionHash *parseVersionInfo(SeekableReadStream *stream);
};
} // End of namespace Common