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.
4
5#include "chrome/common/child_process_logging.h"
6
7#include <windows.h>
8
9#include "base/string_util.h"
10#include "base/string_number_conversions.h"
11#include "base/stringprintf.h"
12#include "base/utf_string_conversions.h"
13#include "chrome/common/chrome_constants.h"
14#include "chrome/installer/util/google_update_settings.h"
15#include "content/common/gpu/gpu_info.h"
16#include "googleurl/src/gurl.h"
17
18namespace child_process_logging {
19// exported in breakpad_win.cc: void __declspec(dllexport) __cdecl SetActiveURL.
20typedef void (__cdecl *MainSetActiveURL)(const wchar_t*);
21
22// exported in breakpad_win.cc: void __declspec(dllexport) __cdecl SetClientId.
23typedef void (__cdecl *MainSetClientId)(const wchar_t*);
24
25// exported in breakpad_win.cc:
26//   void __declspec(dllexport) __cdecl SetNumberOfExtensions.
27typedef void (__cdecl *MainSetNumberOfExtensions)(int);
28
29// exported in breakpad_win.cc:
30// void __declspec(dllexport) __cdecl SetExtensionID.
31typedef void (__cdecl *MainSetExtensionID)(size_t, const wchar_t*);
32
33// exported in breakpad_win.cc: void __declspec(dllexport) __cdecl SetGpuInfo.
34typedef void (__cdecl *MainSetGpuInfo)(const wchar_t*, const wchar_t*,
35                                       const wchar_t*, const wchar_t*,
36                                       const wchar_t*);
37
38// exported in breakpad_win.cc:
39//   void __declspec(dllexport) __cdecl SetNumberOfViews.
40typedef void (__cdecl *MainSetNumberOfViews)(int);
41
42void SetActiveURL(const GURL& url) {
43  static MainSetActiveURL set_active_url = NULL;
44  // note: benign race condition on set_active_url.
45  if (!set_active_url) {
46    HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
47    if (!exe_module)
48      return;
49    set_active_url = reinterpret_cast<MainSetActiveURL>(
50        GetProcAddress(exe_module, "SetActiveURL"));
51    if (!set_active_url)
52      return;
53  }
54
55  (set_active_url)(UTF8ToWide(url.possibly_invalid_spec()).c_str());
56}
57
58void SetClientId(const std::string& client_id) {
59  std::string str(client_id);
60  // Remove all instance of '-' char from the GUID. So BCD-WXY becomes BCDWXY.
61  ReplaceSubstringsAfterOffset(&str, 0, "-", "");
62
63  if (str.empty())
64    return;
65
66  std::wstring wstr = ASCIIToWide(str);
67  std::wstring old_wstr;
68  if (!GoogleUpdateSettings::GetMetricsId(&old_wstr) ||
69      wstr != old_wstr)
70    GoogleUpdateSettings::SetMetricsId(wstr);
71
72  static MainSetClientId set_client_id = NULL;
73  if (!set_client_id) {
74    HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
75    if (!exe_module)
76      return;
77    set_client_id = reinterpret_cast<MainSetClientId>(
78        GetProcAddress(exe_module, "SetClientId"));
79    if (!set_client_id)
80      return;
81  }
82  (set_client_id)(wstr.c_str());
83}
84
85std::string GetClientId() {
86  std::wstring wstr_client_id;
87  if (GoogleUpdateSettings::GetMetricsId(&wstr_client_id))
88    return WideToASCII(wstr_client_id);
89  else
90    return std::string();
91}
92
93void SetActiveExtensions(const std::set<std::string>& extension_ids) {
94  static MainSetNumberOfExtensions set_number_of_extensions = NULL;
95  if (!set_number_of_extensions) {
96    HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
97    if (!exe_module)
98      return;
99    set_number_of_extensions = reinterpret_cast<MainSetNumberOfExtensions>(
100        GetProcAddress(exe_module, "SetNumberOfExtensions"));
101    if (!set_number_of_extensions)
102      return;
103  }
104
105  static MainSetExtensionID set_extension_id = NULL;
106  if (!set_extension_id) {
107    HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
108    if (!exe_module)
109      return;
110    set_extension_id = reinterpret_cast<MainSetExtensionID>(
111        GetProcAddress(exe_module, "SetExtensionID"));
112    if (!set_extension_id)
113      return;
114  }
115
116  (set_number_of_extensions)(static_cast<int>(extension_ids.size()));
117
118  std::set<std::string>::const_iterator iter = extension_ids.begin();
119  for (size_t i = 0; i < kMaxReportedActiveExtensions; ++i) {
120    if (iter != extension_ids.end()) {
121      (set_extension_id)(i, ASCIIToWide(iter->c_str()).c_str());
122      ++iter;
123    } else {
124      (set_extension_id)(i, L"");
125    }
126  }
127}
128
129void SetGpuInfo(const GPUInfo& gpu_info) {
130  static MainSetGpuInfo set_gpu_info = NULL;
131  if (!set_gpu_info) {
132    HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
133    if (!exe_module)
134      return;
135    set_gpu_info = reinterpret_cast<MainSetGpuInfo>(
136        GetProcAddress(exe_module, "SetGpuInfo"));
137    if (!set_gpu_info)
138      return;
139  }
140  (set_gpu_info)(
141      base::StringPrintf(L"0x%04x", gpu_info.vendor_id).c_str(),
142      base::StringPrintf(L"0x%04x", gpu_info.device_id).c_str(),
143      UTF8ToUTF16(gpu_info.driver_version).c_str(),
144      UTF8ToUTF16(gpu_info.pixel_shader_version).c_str(),
145      UTF8ToUTF16(gpu_info.vertex_shader_version).c_str());
146}
147
148void SetNumberOfViews(int number_of_views) {
149  static MainSetNumberOfViews set_number_of_views = NULL;
150  if (!set_number_of_views) {
151    HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
152    if (!exe_module)
153      return;
154    set_number_of_views = reinterpret_cast<MainSetNumberOfViews>(
155        GetProcAddress(exe_module, "SetNumberOfViews"));
156    if (!set_number_of_views)
157      return;
158  }
159  (set_number_of_views)(number_of_views);
160}
161
162}  // namespace child_process_logging
163