Merge pull request #63 from electron/create-if-no-exist

Fill default data when resource information is not there
This commit is contained in:
Cheng Zhao
2017-09-26 16:32:03 +09:00
committed by GitHub
2 changed files with 44 additions and 50 deletions
+40 -46
View File
@@ -74,6 +74,7 @@ typedef struct _VS_VERSION_ROOT {
// The default en-us LANGID.
LANGID kLangEnUs = 1033;
LANGID kCodePageEnUs = 1200;
template<typename T>
inline T round(T value, int modula = 4) {
@@ -113,6 +114,10 @@ struct VersionStampValue {
} // namespace
VersionInfo::VersionInfo() {
FillDefaultData();
}
VersionInfo::VersionInfo(HMODULE hModule, WORD languageId) {
HRSRC hRsrc = FindResourceExW(hModule, RT_VERSION, MAKEINTRESOURCEW(1), languageId);
@@ -136,6 +141,7 @@ VersionInfo::VersionInfo(HMODULE hModule, WORD languageId) {
}
DeserializeVersionInfo(static_cast<BYTE*>(p), size);
FillDefaultData();
}
bool VersionInfo::HasFixedFileInfo() const {
@@ -247,6 +253,19 @@ std::vector<BYTE> VersionInfo::Serialize() const {
return std::move(versionInfo.Serialize());
}
void VersionInfo::FillDefaultData() {
if (stringTables.empty()) {
Translate enUsTranslate = {kLangEnUs, kCodePageEnUs};
stringTables.push_back({enUsTranslate});
supportedTranslations.push_back(enUsTranslate);
}
if (!HasFixedFileInfo()) {
fixedFileInfo_ = {0};
fixedFileInfo_.dwSignature = 0xFEEF04BD;
fixedFileInfo_.dwFileType = VFT_APP;
}
}
void VersionInfo::DeserializeVersionInfo(const BYTE* pData, size_t size) {
auto pVersionInfo = reinterpret_cast<const VS_VERSION_ROOT*>(pData);
WORD fixedFileInfoSize = pVersionInfo->Header.wValueLength;
@@ -421,10 +440,6 @@ bool ResourceUpdater::IsApplicationManifestSet() {
}
bool ResourceUpdater::SetVersionString(WORD languageId, const WCHAR* name, const WCHAR* value) {
if (versionStampMap_.find(languageId) == versionStampMap_.end()) {
return false;
}
std::wstring nameStr(name);
std::wstring valueStr(value);
@@ -446,18 +461,12 @@ bool ResourceUpdater::SetVersionString(WORD languageId, const WCHAR* name, const
}
bool ResourceUpdater::SetVersionString(const WCHAR* name, const WCHAR* value) {
if (versionStampMap_.size() < 1) {
return false;
} else {
return SetVersionString(versionStampMap_.begin()->first, name, value);
}
LANGID langId = versionStampMap_.empty() ? kLangEnUs
: versionStampMap_.begin()->first;
return SetVersionString(langId, name, value);
}
const WCHAR* ResourceUpdater::GetVersionString(WORD languageId, const WCHAR* name) {
if (versionStampMap_.find(languageId) == versionStampMap_.end()) {
return NULL;
}
std::wstring nameStr(name);
const auto& stringTables = versionStampMap_[languageId].stringTables;
@@ -474,7 +483,7 @@ const WCHAR* ResourceUpdater::GetVersionString(WORD languageId, const WCHAR* nam
}
const WCHAR* ResourceUpdater::GetVersionString(const WCHAR* name) {
if (versionStampMap_.size() < 1) {
if (versionStampMap_.empty()) {
return NULL;
} else {
return GetVersionString(versionStampMap_.begin()->first, name);
@@ -482,10 +491,6 @@ const WCHAR* ResourceUpdater::GetVersionString(const WCHAR* name) {
}
bool ResourceUpdater::SetProductVersion(WORD languageId, UINT id, unsigned short v1, unsigned short v2, unsigned short v3, unsigned short v4) {
if (versionStampMap_.find(languageId) == versionStampMap_.end()) {
return false;
}
VersionInfo& versionInfo = versionStampMap_[languageId];
if (!versionInfo.HasFixedFileInfo()) {
return false;
@@ -500,19 +505,13 @@ bool ResourceUpdater::SetProductVersion(WORD languageId, UINT id, unsigned short
}
bool ResourceUpdater::SetProductVersion(unsigned short v1, unsigned short v2, unsigned short v3, unsigned short v4) {
if (versionStampMap_.size() < 1) {
return false;
} else {
return SetProductVersion(versionStampMap_.begin()->first, 1, v1, v2, v3, v4);
}
LANGID langId = versionStampMap_.empty() ? kLangEnUs
: versionStampMap_.begin()->first;
return SetProductVersion(langId, 1, v1, v2, v3, v4);
}
bool ResourceUpdater::SetFileVersion(WORD languageId, UINT id, unsigned short v1, unsigned short v2, unsigned short v3, unsigned short v4) {
if (versionStampMap_.find(languageId) == versionStampMap_.end()) {
return false;
}
VersionInfo& versionInfo = versionStampMap_[ languageId ];
VersionInfo& versionInfo = versionStampMap_[languageId];
if (!versionInfo.HasFixedFileInfo()) {
return false;
}
@@ -525,38 +524,33 @@ bool ResourceUpdater::SetFileVersion(WORD languageId, UINT id, unsigned short v1
}
bool ResourceUpdater::SetFileVersion(unsigned short v1, unsigned short v2, unsigned short v3, unsigned short v4) {
if (versionStampMap_.size() < 1) {
return false;
} else {
return SetFileVersion(versionStampMap_.begin()->first, 1, v1, v2, v3, v4);
}
LANGID langId = versionStampMap_.empty() ? kLangEnUs
: versionStampMap_.begin()->first;
return SetFileVersion(langId, 1, v1, v2, v3, v4);
}
bool ResourceUpdater::ChangeString(WORD languageId, UINT id, const WCHAR* value) {
if (stringTableMap_.find(languageId) == stringTableMap_.end()) {
return false;
}
StringTable& table = stringTableMap_[ languageId ];
StringTable& table = stringTableMap_[languageId];
UINT blockId = id / 16;
if (table.find(blockId) == table.end()) {
return false;
// Fill the table until we reach the block.
for (size_t i = table.size(); i <= blockId; ++i) {
table[i] = std::vector<std::wstring>(16);
}
}
assert(table[ blockId ].size() == 16);
assert(table[blockId].size() == 16);
UINT blockIndex = id % 16;
table[ blockId ][ blockIndex ] = value;
table[blockId][blockIndex] = value;
return true;
}
bool ResourceUpdater::ChangeString(UINT id, const WCHAR* value) {
if (stringTableMap_.size() < 1) {
return false;
} else {
return ChangeString(stringTableMap_.begin()->first, id, value);
}
LANGID langId = stringTableMap_.empty() ? kLangEnUs
: stringTableMap_.begin()->first;
return ChangeString(langId, id, value);
}
bool ResourceUpdater::SetIcon(const WCHAR* path, const LANGID& langId,
+4 -4
View File
@@ -77,8 +77,7 @@ struct VersionStringTable {
class VersionInfo {
public:
VersionInfo() {}
VersionInfo();
VersionInfo(HMODULE hModule, WORD languageId);
std::vector<BYTE> Serialize() const;
@@ -94,6 +93,7 @@ class VersionInfo {
private:
VS_FIXEDFILEINFO fixedFileInfo_;
void FillDefaultData();
void DeserializeVersionInfo(const BYTE* pData, size_t size);
VersionStringTable DeserializeVersionStringTable(const BYTE* tableData);
@@ -105,8 +105,8 @@ class VersionInfo {
class ResourceUpdater {
public:
typedef std::vector<std::wstring> StringValues;
typedef std::map<UINT,StringValues> StringTable;
typedef std::map<WORD,StringTable> StringTableMap;
typedef std::map<UINT, StringValues> StringTable;
typedef std::map<WORD, StringTable> StringTableMap;
typedef std::map<LANGID, VersionInfo> VersionStampMap;
typedef std::map<UINT, std::unique_ptr<IconsValue>> IconTable;