blob: 6c69708aef0e0095e62dcff97361e8cb91a2a4fb [file] [log] [blame]
license.botbf09a502008-08-24 00:55:551// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commitd7cae122008-07-26 21:49:384
tony@chromium.orgbcff05a2010-04-14 01:46:435#include "base/file_version_info_win.h"
initial.commitd7cae122008-07-26 21:49:386
phajdan.jr@chromium.orgf5393332009-06-03 15:01:297#include <windows.h>
8
9#include "base/file_path.h"
tony@chromium.orgbcff05a2010-04-14 01:46:4310#include "base/file_version_info.h"
initial.commitd7cae122008-07-26 21:49:3811#include "base/logging.h"
12#include "base/path_service.h"
jam@chromium.org45446a52010-11-04 17:41:0013#include "base/thread_restrictions.h"
initial.commitd7cae122008-07-26 21:49:3814
15// This has to be last.
16#include <strsafe.h>
17
tony@chromium.orgbcff05a2010-04-14 01:46:4318FileVersionInfoWin::FileVersionInfoWin(void* data, int language, int code_page)
initial.commitd7cae122008-07-26 21:49:3819 : language_(language), code_page_(code_page) {
jam@chromium.org45446a52010-11-04 17:41:0020 base::ThreadRestrictions::AssertIOAllowed();
initial.commitd7cae122008-07-26 21:49:3821 data_.reset((char*) data);
22 fixed_file_info_ = NULL;
23 UINT size;
24 ::VerQueryValue(data_.get(), L"\\", (LPVOID*)&fixed_file_info_, &size);
25}
26
tony@chromium.orgbcff05a2010-04-14 01:46:4327FileVersionInfoWin::~FileVersionInfoWin() {
initial.commitd7cae122008-07-26 21:49:3828 DCHECK(data_.get());
29}
30
31typedef struct {
32 WORD language;
33 WORD code_page;
34} LanguageAndCodePage;
35
36// static
37FileVersionInfo* FileVersionInfo::CreateFileVersionInfoForCurrentModule() {
thestig@chromium.orgef5ff1b2009-09-09 20:00:1338 FilePath app_path;
initial.commitd7cae122008-07-26 21:49:3839 if (!PathService::Get(base::FILE_MODULE, &app_path))
40 return NULL;
41
42 return CreateFileVersionInfo(app_path);
43}
44
45// static
46FileVersionInfo* FileVersionInfo::CreateFileVersionInfo(
avi@google.com0956223822008-12-23 16:57:3647 const FilePath& file_path) {
jam@chromium.org45446a52010-11-04 17:41:0048 base::ThreadRestrictions::AssertIOAllowed();
49
initial.commitd7cae122008-07-26 21:49:3850 DWORD dummy;
avi@google.com0956223822008-12-23 16:57:3651 const wchar_t* path = file_path.value().c_str();
initial.commitd7cae122008-07-26 21:49:3852 DWORD length = ::GetFileVersionInfoSize(path, &dummy);
53 if (length == 0)
54 return NULL;
55
56 void* data = calloc(length, 1);
57 if (!data)
58 return NULL;
59
60 if (!::GetFileVersionInfo(path, dummy, length, data)) {
61 free(data);
62 return NULL;
63 }
64
65 LanguageAndCodePage* translate = NULL;
66 uint32 page_count;
67 BOOL query_result = VerQueryValue(data, L"\\VarFileInfo\\Translation",
68 (void**) &translate, &page_count);
69
70 if (query_result && translate) {
tony@chromium.orgbcff05a2010-04-14 01:46:4371 return new FileVersionInfoWin(data, translate->language,
72 translate->code_page);
initial.commitd7cae122008-07-26 21:49:3873
74 } else {
75 free(data);
76 return NULL;
77 }
78}
79
tony@chromium.orgbcff05a2010-04-14 01:46:4380// static
avi@google.com0956223822008-12-23 16:57:3681FileVersionInfo* FileVersionInfo::CreateFileVersionInfo(
82 const std::wstring& file_path) {
83 FilePath file_path_fp = FilePath::FromWStringHack(file_path);
84 return CreateFileVersionInfo(file_path_fp);
85}
86
tony@chromium.orgbcff05a2010-04-14 01:46:4387std::wstring FileVersionInfoWin::company_name() {
initial.commitd7cae122008-07-26 21:49:3888 return GetStringValue(L"CompanyName");
89}
90
tony@chromium.orgbcff05a2010-04-14 01:46:4391std::wstring FileVersionInfoWin::company_short_name() {
initial.commitd7cae122008-07-26 21:49:3892 return GetStringValue(L"CompanyShortName");
93}
94
tony@chromium.orgbcff05a2010-04-14 01:46:4395std::wstring FileVersionInfoWin::internal_name() {
initial.commitd7cae122008-07-26 21:49:3896 return GetStringValue(L"InternalName");
97}
98
tony@chromium.orgbcff05a2010-04-14 01:46:4399std::wstring FileVersionInfoWin::product_name() {
initial.commitd7cae122008-07-26 21:49:38100 return GetStringValue(L"ProductName");
101}
102
tony@chromium.orgbcff05a2010-04-14 01:46:43103std::wstring FileVersionInfoWin::product_short_name() {
initial.commitd7cae122008-07-26 21:49:38104 return GetStringValue(L"ProductShortName");
105}
106
tony@chromium.orgbcff05a2010-04-14 01:46:43107std::wstring FileVersionInfoWin::comments() {
initial.commitd7cae122008-07-26 21:49:38108 return GetStringValue(L"Comments");
109}
110
tony@chromium.orgbcff05a2010-04-14 01:46:43111std::wstring FileVersionInfoWin::legal_copyright() {
initial.commitd7cae122008-07-26 21:49:38112 return GetStringValue(L"LegalCopyright");
113}
114
tony@chromium.orgbcff05a2010-04-14 01:46:43115std::wstring FileVersionInfoWin::product_version() {
initial.commitd7cae122008-07-26 21:49:38116 return GetStringValue(L"ProductVersion");
117}
118
tony@chromium.orgbcff05a2010-04-14 01:46:43119std::wstring FileVersionInfoWin::file_description() {
initial.commitd7cae122008-07-26 21:49:38120 return GetStringValue(L"FileDescription");
121}
122
tony@chromium.orgbcff05a2010-04-14 01:46:43123std::wstring FileVersionInfoWin::legal_trademarks() {
initial.commitd7cae122008-07-26 21:49:38124 return GetStringValue(L"LegalTrademarks");
125}
126
tony@chromium.orgbcff05a2010-04-14 01:46:43127std::wstring FileVersionInfoWin::private_build() {
initial.commitd7cae122008-07-26 21:49:38128 return GetStringValue(L"PrivateBuild");
129}
130
tony@chromium.orgbcff05a2010-04-14 01:46:43131std::wstring FileVersionInfoWin::file_version() {
initial.commitd7cae122008-07-26 21:49:38132 return GetStringValue(L"FileVersion");
133}
134
tony@chromium.orgbcff05a2010-04-14 01:46:43135std::wstring FileVersionInfoWin::original_filename() {
initial.commitd7cae122008-07-26 21:49:38136 return GetStringValue(L"OriginalFilename");
137}
138
tony@chromium.orgbcff05a2010-04-14 01:46:43139std::wstring FileVersionInfoWin::special_build() {
initial.commitd7cae122008-07-26 21:49:38140 return GetStringValue(L"SpecialBuild");
141}
142
tony@chromium.orgbcff05a2010-04-14 01:46:43143std::wstring FileVersionInfoWin::last_change() {
initial.commitd7cae122008-07-26 21:49:38144 return GetStringValue(L"LastChange");
145}
146
tony@chromium.orgbcff05a2010-04-14 01:46:43147bool FileVersionInfoWin::is_official_build() {
initial.commitd7cae122008-07-26 21:49:38148 return (GetStringValue(L"Official Build").compare(L"1") == 0);
149}
150
tony@chromium.orgbcff05a2010-04-14 01:46:43151bool FileVersionInfoWin::GetValue(const wchar_t* name,
152 std::wstring* value_str) {
initial.commitd7cae122008-07-26 21:49:38153 WORD lang_codepage[8];
154 int i = 0;
155 // Use the language and codepage from the DLL.
156 lang_codepage[i++] = language_;
157 lang_codepage[i++] = code_page_;
158 // Use the default language and codepage from the DLL.
159 lang_codepage[i++] = ::GetUserDefaultLangID();
160 lang_codepage[i++] = code_page_;
161 // Use the language from the DLL and Latin codepage (most common).
162 lang_codepage[i++] = language_;
163 lang_codepage[i++] = 1252;
164 // Use the default language and Latin codepage (most common).
165 lang_codepage[i++] = ::GetUserDefaultLangID();
166 lang_codepage[i++] = 1252;
167
168 i = 0;
169 while (i < arraysize(lang_codepage)) {
170 wchar_t sub_block[MAX_PATH];
171 WORD language = lang_codepage[i++];
172 WORD code_page = lang_codepage[i++];
173 _snwprintf_s(sub_block, MAX_PATH, MAX_PATH,
mmentovai@google.com51154742008-08-14 00:41:45174 L"\\StringFileInfo\\%04x%04x\\%ls", language, code_page, name);
initial.commitd7cae122008-07-26 21:49:38175 LPVOID value = NULL;
176 uint32 size;
177 BOOL r = ::VerQueryValue(data_.get(), sub_block, &value, &size);
178 if (r && value) {
179 value_str->assign(static_cast<wchar_t*>(value));
180 return true;
181 }
182 }
183 return false;
184}
185
tony@chromium.orgbcff05a2010-04-14 01:46:43186std::wstring FileVersionInfoWin::GetStringValue(const wchar_t* name) {
initial.commitd7cae122008-07-26 21:49:38187 std::wstring str;
188 if (GetValue(name, &str))
189 return str;
190 else
191 return L"";
192}