summaryrefslogtreecommitdiffstats
path: root/chrome/installer/gcapi/gcapi.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/installer/gcapi/gcapi.cc')
-rw-r--r--chrome/installer/gcapi/gcapi.cc99
1 files changed, 81 insertions, 18 deletions
diff --git a/chrome/installer/gcapi/gcapi.cc b/chrome/installer/gcapi/gcapi.cc
index dc38bbe..9982d55 100644
--- a/chrome/installer/gcapi/gcapi.cc
+++ b/chrome/installer/gcapi/gcapi.cc
@@ -2,19 +2,33 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// NOTE: This code is a legacy utility API for partners to check whether
+// Chrome can be installed and launched. Recent updates are being made
+// to add new functionality. These updates use code from Chromium, the old
+// coded against the win32 api directly. If you have an itch to shave a
+// yak, feel free to re-write the old code too.
+
#include "chrome/installer/gcapi/gcapi.h"
#include <atlbase.h>
#include <atlcom.h>
-#include <windows.h>
#include <sddl.h>
#define STRSAFE_NO_DEPRECATE
#include <strsafe.h>
#include <tlhelp32.h>
+#include <windows.h>
#include <cstdlib>
+#include <limits>
+#include <string>
+
+#include "base/basictypes.h"
+#include "base/string_number_conversions.h"
+#include "base/time.h"
+#include "base/win/registry.h"
+#include "chrome/installer/util/google_update_constants.h"
-#include "google_update_idl.h"
+#include "google_update_idl.h" // NOLINT
namespace {
@@ -24,6 +38,10 @@ const wchar_t kChromeRegClientsKey[] =
const wchar_t kChromeRegClientStateKey[] =
L"Software\\Google\\Update\\ClientState\\"
L"{8A69D345-D564-463c-AFF1-A69D9E530F96}";
+const wchar_t kChromeRegClientStateMediumKey[] =
+ L"Software\\Google\\Update\\ClientStateMedium\\"
+ L"{8A69D345-D564-463c-AFF1-A69D9E530F96}";
+
const wchar_t kChromeRegLaunchCmd[] = L"InstallerSuccessLaunchCmdLine";
const wchar_t kChromeRegLastLaunchCmd[] = L"LastInstallerSuccessLaunchCmdLine";
const wchar_t kChromeRegVersion[] = L"pv";
@@ -70,11 +88,14 @@ bool GetCompanyName(const wchar_t* filename, wchar_t* buffer, DWORD out_len) {
if (!::VerQueryValue(file_version_info, info_name,
reinterpret_cast<LPVOID *>(&data), reinterpret_cast<UINT *>(&data_len)))
return false;
- if (data_len <= 0 || data_len >= out_len)
+ if (data_len <= 0 || data_len >= (out_len / sizeof(wchar_t)))
return false;
memset(buffer, 0, out_len);
- ::StringCchCopyN(buffer, out_len, (const wchar_t*)data, data_len);
+ ::StringCchCopyN(buffer,
+ (out_len / sizeof(wchar_t)),
+ reinterpret_cast<const wchar_t*>(data),
+ data_len);
return true;
}
@@ -140,9 +161,9 @@ bool CanReOfferChrome(BOOL set_flag) {
// Helper function to read a value from registry. Returns true if value
// is read successfully and stored in parameter value. Returns false otherwise.
-bool ReadValueFromRegistry(HKEY root_key, const wchar_t *sub_key,
- const wchar_t *value_name, wchar_t *value,
- size_t *size) {
+bool ReadValueFromRegistry(HKEY root_key, const wchar_t* sub_key,
+ const wchar_t* value_name, wchar_t* value,
+ size_t* size) {
HKEY key;
if ((::RegOpenKeyEx(root_key, sub_key, NULL,
KEY_READ, &key) == ERROR_SUCCESS) &&
@@ -164,7 +185,7 @@ bool IsChromeInstalled(HKEY root_key) {
enum WindowsVersion {
VERSION_BELOW_XP_SP2,
- VERSION_XP_SP2_UP_TO_VISTA, // "but not including"
+ VERSION_XP_SP2_UP_TO_VISTA, // "but not including"
VERSION_VISTA_OR_HIGHER,
};
WindowsVersion GetWindowsVersion() {
@@ -283,9 +304,7 @@ bool GetUserIdForProcess(size_t pid, wchar_t** user_sid) {
}
} // namespace
-#pragma comment(linker, "/EXPORT:GoogleChromeCompatibilityCheck=_GoogleChromeCompatibilityCheck@8,PRIVATE")
-DLLEXPORT BOOL __stdcall GoogleChromeCompatibilityCheck(BOOL set_flag,
- DWORD *reasons) {
+BOOL __stdcall GoogleChromeCompatibilityCheck(BOOL set_flag, DWORD* reasons) {
DWORD local_reasons = 0;
WindowsVersion windows_version = GetWindowsVersion();
@@ -319,8 +338,7 @@ DLLEXPORT BOOL __stdcall GoogleChromeCompatibilityCheck(BOOL set_flag,
return (local_reasons == 0);
}
-#pragma comment(linker, "/EXPORT:LaunchGoogleChrome=_LaunchGoogleChrome@0,PRIVATE")
-DLLEXPORT BOOL __stdcall LaunchGoogleChrome() {
+BOOL __stdcall LaunchGoogleChrome() {
wchar_t launch_cmd[MAX_PATH];
size_t size = _countof(launch_cmd);
if (!ReadValueFromRegistry(HKEY_LOCAL_MACHINE, kChromeRegClientStateKey,
@@ -413,11 +431,10 @@ DLLEXPORT BOOL __stdcall LaunchGoogleChrome() {
return ret;
}
-#pragma comment(linker, "/EXPORT:LaunchGoogleChromeWithDimensions=_LaunchGoogleChromeWithDimensions@16,PRIVATE")
-DLLEXPORT BOOL __stdcall LaunchGoogleChromeWithDimensions(int x,
- int y,
- int width,
- int height) {
+BOOL __stdcall LaunchGoogleChromeWithDimensions(int x,
+ int y,
+ int width,
+ int height) {
if (!LaunchGoogleChrome())
return false;
@@ -451,3 +468,49 @@ DLLEXPORT BOOL __stdcall LaunchGoogleChromeWithDimensions(int x,
return (handle &&
SetWindowPos(handle, 0, x, y, width, height, SWP_NOZORDER));
}
+
+int __stdcall GoogleChromeDaysSinceLastRun() {
+ using base::win::RegKey;
+ using base::Time;
+ using base::TimeDelta;
+
+ int days_since_last_run = std::numeric_limits<int>::max();
+
+ struct {
+ HKEY hive;
+ const wchar_t* path;
+ } reg_data[] = {
+ { HKEY_LOCAL_MACHINE, kChromeRegClientStateMediumKey },
+ { HKEY_CURRENT_USER, kChromeRegClientStateKey }
+ };
+
+ for (int i = 0; i < arraysize(reg_data); ++i) {
+ if (IsChromeInstalled(reg_data[i].hive)) {
+ RegKey client_state(reg_data[i].hive, reg_data[i].path, KEY_QUERY_VALUE);
+ if (client_state.Valid()) {
+ std::wstring last_run;
+ int64 last_run_value = 0;
+ if (client_state.ReadValue(google_update::kRegLastRunTimeField,
+ &last_run) == ERROR_SUCCESS &&
+ base::StringToInt64(last_run, &last_run_value)) {
+ Time last_run_time = Time::FromInternalValue(last_run_value);
+ TimeDelta difference = Time::NowFromSystemTime() - last_run_time;
+
+ // We can end up with negative numbers here, given changes in system
+ // clock time or due to TimeDelta's int64 -> int truncation.
+ int new_days_since_last_run = difference.InDays();
+ if (new_days_since_last_run >= 0 &&
+ new_days_since_last_run < days_since_last_run) {
+ days_since_last_run = new_days_since_last_run;
+ }
+ }
+ }
+ }
+ }
+
+ if (days_since_last_run == std::numeric_limits<int>::max()) {
+ days_since_last_run = -1;
+ }
+
+ return days_since_last_run;
+}