Don't crash when SimpleCache index is corrupt.
[chromium-blink-merge.git] / chrome / browser / idle_win.cc
blob3c6c7d51907213ccb56110845190599b8e57dc5a
1 // Copyright (c) 2011 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.
5 #include "chrome/browser/idle.h"
7 #include <limits.h>
8 #include <windows.h>
10 namespace {
12 DWORD CalculateIdleTimeInternal() {
13 LASTINPUTINFO last_input_info = {0};
14 last_input_info.cbSize = sizeof(LASTINPUTINFO);
15 DWORD current_idle_time = 0;
16 if (::GetLastInputInfo(&last_input_info)) {
17 DWORD now = ::GetTickCount();
18 if (now < last_input_info.dwTime) {
19 // GetTickCount() wraps around every 49.7 days -- assume it wrapped just
20 // once.
21 const DWORD kMaxDWORD = static_cast<DWORD>(-1);
22 DWORD time_before_wrap = kMaxDWORD - last_input_info.dwTime;
23 DWORD time_after_wrap = now;
24 // The sum is always smaller than kMaxDWORD.
25 current_idle_time = time_before_wrap + time_after_wrap;
26 } else {
27 current_idle_time = now - last_input_info.dwTime;
30 // Convert from ms to seconds.
31 current_idle_time /= 1000;
34 return current_idle_time;
37 bool IsScreensaverRunning() {
38 DWORD result = 0;
39 if (::SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &result, 0))
40 return result != FALSE;
41 return false;
44 bool IsWorkstationLocked() {
45 bool is_locked = true;
46 HDESK input_desk = ::OpenInputDesktop(0, 0, GENERIC_READ);
47 if (input_desk) {
48 wchar_t name[256] = {0};
49 DWORD needed = 0;
50 if (::GetUserObjectInformation(input_desk,
51 UOI_NAME,
52 name,
53 sizeof(name),
54 &needed)) {
55 is_locked = lstrcmpi(name, L"default") != 0;
57 ::CloseDesktop(input_desk);
59 return is_locked;
62 } // namespace
64 void CalculateIdleTime(IdleTimeCallback notify) {
65 notify.Run(static_cast<int>(CalculateIdleTimeInternal()));
68 bool CheckIdleStateIsLocked() {
69 return IsWorkstationLocked() || IsScreensaverRunning();