forked from weolar/miniblink49
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
21 changed files
with
4,446 additions
and
481 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
// Copyright (c) 2011 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#ifndef BASE_FILE_VERSION_INFO_H_ | ||
#define BASE_FILE_VERSION_INFO_H_ | ||
|
||
#include <string> | ||
|
||
#include "build/build_config.h" | ||
#include "base/base_export.h" | ||
#include "base/strings/string16.h" | ||
|
||
#if defined(OS_WIN) | ||
#include <windows.h> | ||
#endif | ||
|
||
namespace base { | ||
class FilePath; | ||
} | ||
|
||
// Provides an interface for accessing the version information for a file. This | ||
// is the information you access when you select a file in the Windows Explorer, | ||
// right-click select Properties, then click the Version tab, and on the Mac | ||
// when you select a file in the Finder and do a Get Info. | ||
// | ||
// This list of properties is straight out of Win32's VerQueryValue | ||
// <http://msdn.microsoft.com/en-us/library/ms647464.aspx> and the Mac | ||
// version returns values from the Info.plist as appropriate. TODO(avi): make | ||
// this a less-obvious Windows-ism. | ||
|
||
class BASE_EXPORT FileVersionInfo { | ||
public: | ||
virtual ~FileVersionInfo() {} | ||
#if defined(OS_WIN) || defined(OS_MACOSX) | ||
// Creates a FileVersionInfo for the specified path. Returns NULL if something | ||
// goes wrong (typically the file does not exit or cannot be opened). The | ||
// returned object should be deleted when you are done with it. | ||
static FileVersionInfo* CreateFileVersionInfo( | ||
const base::FilePath& file_path); | ||
#endif // OS_WIN || OS_MACOSX | ||
|
||
#if defined(OS_WIN) | ||
// Creates a FileVersionInfo for the specified module. Returns NULL in case | ||
// of error. The returned object should be deleted when you are done with it. | ||
static FileVersionInfo* CreateFileVersionInfoForModule(HMODULE module); | ||
#else | ||
// Creates a FileVersionInfo for the current module. Returns NULL in case | ||
// of error. The returned object should be deleted when you are done with it. | ||
static FileVersionInfo* CreateFileVersionInfoForCurrentModule(); | ||
#endif // OS_WIN | ||
|
||
// Accessors to the different version properties. | ||
// Returns an empty string if the property is not found. | ||
virtual base::string16 company_name() = 0; | ||
virtual base::string16 company_short_name() = 0; | ||
virtual base::string16 product_name() = 0; | ||
virtual base::string16 product_short_name() = 0; | ||
virtual base::string16 internal_name() = 0; | ||
virtual base::string16 product_version() = 0; | ||
virtual base::string16 private_build() = 0; | ||
virtual base::string16 special_build() = 0; | ||
virtual base::string16 comments() = 0; | ||
virtual base::string16 original_filename() = 0; | ||
virtual base::string16 file_description() = 0; | ||
virtual base::string16 file_version() = 0; | ||
virtual base::string16 legal_copyright() = 0; | ||
virtual base::string16 legal_trademarks() = 0; | ||
virtual base::string16 last_change() = 0; | ||
virtual bool is_official_build() = 0; | ||
}; | ||
|
||
#endif // BASE_FILE_VERSION_INFO_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,218 @@ | ||
// Copyright (c) 2011 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#include "base/file_version_info_win.h" | ||
|
||
#include <windows.h> | ||
#include <stddef.h> | ||
|
||
#include "base/files/file_path.h" | ||
#include "base/logging.h" | ||
#include "base/threading/thread_restrictions.h" | ||
#include "base/win/resource_util.h" | ||
|
||
using base::FilePath; | ||
|
||
namespace { | ||
|
||
struct LanguageAndCodePage { | ||
WORD language; | ||
WORD code_page; | ||
}; | ||
|
||
// Returns the \\VarFileInfo\\Translation value extracted from the | ||
// VS_VERSION_INFO resource in |data|. | ||
LanguageAndCodePage* GetTranslate(const void* data) { | ||
LanguageAndCodePage* translate = nullptr; | ||
UINT length; | ||
if (::VerQueryValue(data, L"\\VarFileInfo\\Translation", | ||
reinterpret_cast<void**>(&translate), &length)) { | ||
return translate; | ||
} | ||
return nullptr; | ||
} | ||
|
||
VS_FIXEDFILEINFO* GetVsFixedFileInfo(const void* data) { | ||
VS_FIXEDFILEINFO* fixed_file_info = nullptr; | ||
UINT length; | ||
if (::VerQueryValue(data, L"\\", reinterpret_cast<void**>(&fixed_file_info), | ||
&length)) { | ||
return fixed_file_info; | ||
} | ||
return nullptr; | ||
} | ||
|
||
} // namespace | ||
|
||
FileVersionInfoWin::~FileVersionInfoWin() = default; | ||
|
||
// static | ||
FileVersionInfo* FileVersionInfo::CreateFileVersionInfoForModule( | ||
HMODULE module) { | ||
void* data; | ||
size_t version_info_length; | ||
const bool has_version_resource = base::win::GetResourceFromModule( | ||
module, VS_VERSION_INFO, RT_VERSION, &data, &version_info_length); | ||
if (!has_version_resource) | ||
return nullptr; | ||
|
||
const LanguageAndCodePage* translate = GetTranslate(data); | ||
if (!translate) | ||
return nullptr; | ||
|
||
return new FileVersionInfoWin(data, translate->language, | ||
translate->code_page); | ||
} | ||
|
||
// static | ||
FileVersionInfo* FileVersionInfo::CreateFileVersionInfo( | ||
const FilePath& file_path) { | ||
base::ThreadRestrictions::AssertIOAllowed(); | ||
|
||
DWORD dummy; | ||
const wchar_t* path = file_path.value().c_str(); | ||
const DWORD length = ::GetFileVersionInfoSize(path, &dummy); | ||
if (length == 0) | ||
return nullptr; | ||
|
||
std::vector<uint8_t> data(length, 0); | ||
|
||
if (!::GetFileVersionInfo(path, dummy, length, data.data())) | ||
return nullptr; | ||
|
||
const LanguageAndCodePage* translate = GetTranslate(data.data()); | ||
if (!translate) | ||
return nullptr; | ||
|
||
return new FileVersionInfoWin(std::move(data), translate->language, | ||
translate->code_page); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::company_name() { | ||
return GetStringValue(L"CompanyName"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::company_short_name() { | ||
return GetStringValue(L"CompanyShortName"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::internal_name() { | ||
return GetStringValue(L"InternalName"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::product_name() { | ||
return GetStringValue(L"ProductName"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::product_short_name() { | ||
return GetStringValue(L"ProductShortName"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::comments() { | ||
return GetStringValue(L"Comments"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::legal_copyright() { | ||
return GetStringValue(L"LegalCopyright"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::product_version() { | ||
return GetStringValue(L"ProductVersion"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::file_description() { | ||
return GetStringValue(L"FileDescription"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::legal_trademarks() { | ||
return GetStringValue(L"LegalTrademarks"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::private_build() { | ||
return GetStringValue(L"PrivateBuild"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::file_version() { | ||
return GetStringValue(L"FileVersion"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::original_filename() { | ||
return GetStringValue(L"OriginalFilename"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::special_build() { | ||
return GetStringValue(L"SpecialBuild"); | ||
} | ||
|
||
base::string16 FileVersionInfoWin::last_change() { | ||
return GetStringValue(L"LastChange"); | ||
} | ||
|
||
bool FileVersionInfoWin::is_official_build() { | ||
return (GetStringValue(L"Official Build").compare(L"1") == 0); | ||
} | ||
|
||
bool FileVersionInfoWin::GetValue(const wchar_t* name, | ||
std::wstring* value_str) { | ||
WORD lang_codepage[8]; | ||
size_t i = 0; | ||
// Use the language and codepage from the DLL. | ||
lang_codepage[i++] = language_; | ||
lang_codepage[i++] = code_page_; | ||
// Use the default language and codepage from the DLL. | ||
lang_codepage[i++] = ::GetUserDefaultLangID(); | ||
lang_codepage[i++] = code_page_; | ||
// Use the language from the DLL and Latin codepage (most common). | ||
lang_codepage[i++] = language_; | ||
lang_codepage[i++] = 1252; | ||
// Use the default language and Latin codepage (most common). | ||
lang_codepage[i++] = ::GetUserDefaultLangID(); | ||
lang_codepage[i++] = 1252; | ||
|
||
i = 0; | ||
while (i < arraysize(lang_codepage)) { | ||
wchar_t sub_block[MAX_PATH]; | ||
WORD language = lang_codepage[i++]; | ||
WORD code_page = lang_codepage[i++]; | ||
_snwprintf_s(sub_block, MAX_PATH, MAX_PATH, | ||
L"\\StringFileInfo\\%04x%04x\\%ls", language, code_page, name); | ||
LPVOID value = NULL; | ||
uint32_t size; | ||
BOOL r = ::VerQueryValue(data_, sub_block, &value, &size); | ||
if (r && value) { | ||
value_str->assign(static_cast<wchar_t*>(value)); | ||
return true; | ||
} | ||
} | ||
return false; | ||
} | ||
|
||
std::wstring FileVersionInfoWin::GetStringValue(const wchar_t* name) { | ||
std::wstring str; | ||
if (GetValue(name, &str)) | ||
return str; | ||
else | ||
return L""; | ||
} | ||
|
||
FileVersionInfoWin::FileVersionInfoWin(std::vector<uint8_t>&& data, | ||
WORD language, | ||
WORD code_page) | ||
: owned_data_(std::move(data)), | ||
data_(owned_data_.data()), | ||
language_(language), | ||
code_page_(code_page), | ||
fixed_file_info_(GetVsFixedFileInfo(data_)) { | ||
DCHECK(!owned_data_.empty()); | ||
} | ||
|
||
FileVersionInfoWin::FileVersionInfoWin(void* data, | ||
WORD language, | ||
WORD code_page) | ||
: data_(data), | ||
language_(language), | ||
code_page_(code_page), | ||
fixed_file_info_(GetVsFixedFileInfo(data)) { | ||
DCHECK(data_); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
// Copyright (c) 2011 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#ifndef BASE_FILE_VERSION_INFO_WIN_H_ | ||
#define BASE_FILE_VERSION_INFO_WIN_H_ | ||
|
||
#include <windows.h> | ||
|
||
#include <stdint.h> | ||
|
||
#include <memory> | ||
#include <string> | ||
#include <vector> | ||
|
||
#include "base/base_export.h" | ||
#include "base/file_version_info.h" | ||
#include "base/macros.h" | ||
|
||
struct tagVS_FIXEDFILEINFO; | ||
typedef tagVS_FIXEDFILEINFO VS_FIXEDFILEINFO; | ||
|
||
class BASE_EXPORT FileVersionInfoWin : public FileVersionInfo { | ||
public: | ||
~FileVersionInfoWin() override; | ||
|
||
// Accessors to the different version properties. | ||
// Returns an empty string if the property is not found. | ||
base::string16 company_name() override; | ||
base::string16 company_short_name() override; | ||
base::string16 product_name() override; | ||
base::string16 product_short_name() override; | ||
base::string16 internal_name() override; | ||
base::string16 product_version() override; | ||
base::string16 private_build() override; | ||
base::string16 special_build() override; | ||
base::string16 comments() override; | ||
base::string16 original_filename() override; | ||
base::string16 file_description() override; | ||
base::string16 file_version() override; | ||
base::string16 legal_copyright() override; | ||
base::string16 legal_trademarks() override; | ||
base::string16 last_change() override; | ||
bool is_official_build() override; | ||
|
||
// Lets you access other properties not covered above. | ||
bool GetValue(const wchar_t* name, std::wstring* value); | ||
|
||
// Similar to GetValue but returns a wstring (empty string if the property | ||
// does not exist). | ||
std::wstring GetStringValue(const wchar_t* name); | ||
|
||
// Get the fixed file info if it exists. Otherwise NULL | ||
const VS_FIXEDFILEINFO* fixed_file_info() const { return fixed_file_info_; } | ||
|
||
private: | ||
friend FileVersionInfo; | ||
|
||
// |data| is a VS_VERSION_INFO resource. |language| and |code_page| are | ||
// extracted from the \VarFileInfo\Translation value of |data|. | ||
FileVersionInfoWin(std::vector<uint8_t>&& data, | ||
WORD language, | ||
WORD code_page); | ||
FileVersionInfoWin(void* data, WORD language, WORD code_page); | ||
|
||
const std::vector<uint8_t> owned_data_; | ||
const void* const data_; | ||
const WORD language_; | ||
const WORD code_page_; | ||
|
||
// This is a pointer into |data_| if it exists. Otherwise nullptr. | ||
const VS_FIXEDFILEINFO* const fixed_file_info_; | ||
|
||
DISALLOW_COPY_AND_ASSIGN(FileVersionInfoWin); | ||
}; | ||
|
||
#endif // BASE_FILE_VERSION_INFO_WIN_H_ |
Oops, something went wrong.