mirror of
https://github.com/electron/rcedit
synced 2026-08-09 12:35:16 +00:00
Merge pull request #63 from electron/create-if-no-exist
Fill default data when resource information is not there
This commit is contained in:
+40
-46
@@ -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
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user