1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Use of this source code is governed by a BSD-style license that can be
306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// found in the LICENSE file.
406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "chrome/common/child_process_logging.h"
606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include <windows.h>
806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "base/string_util.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/stringprintf.h"
1206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "base/utf_string_conversions.h"
1306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "chrome/common/chrome_constants.h"
1406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "chrome/installer/util/google_update_settings.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/gpu/gpu_info.h"
1606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "googleurl/src/gurl.h"
1706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
1806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochnamespace child_process_logging {
1906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// exported in breakpad_win.cc: void __declspec(dllexport) __cdecl SetActiveURL.
2006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochtypedef void (__cdecl *MainSetActiveURL)(const wchar_t*);
2106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
2206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// exported in breakpad_win.cc: void __declspec(dllexport) __cdecl SetClientId.
2306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochtypedef void (__cdecl *MainSetClientId)(const wchar_t*);
2406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
2506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// exported in breakpad_win.cc:
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick//   void __declspec(dllexport) __cdecl SetNumberOfExtensions.
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merricktypedef void (__cdecl *MainSetNumberOfExtensions)(int);
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// exported in breakpad_win.cc:
3006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// void __declspec(dllexport) __cdecl SetExtensionID.
3106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochtypedef void (__cdecl *MainSetExtensionID)(size_t, const wchar_t*);
3206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
3306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// exported in breakpad_win.cc: void __declspec(dllexport) __cdecl SetGpuInfo.
3406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochtypedef void (__cdecl *MainSetGpuInfo)(const wchar_t*, const wchar_t*,
3506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                       const wchar_t*, const wchar_t*,
3606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                       const wchar_t*);
3706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// exported in breakpad_win.cc:
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick//   void __declspec(dllexport) __cdecl SetNumberOfViews.
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricktypedef void (__cdecl *MainSetNumberOfViews)(int);
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochvoid SetActiveURL(const GURL& url) {
4306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  static MainSetActiveURL set_active_url = NULL;
4406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // note: benign race condition on set_active_url.
4506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  if (!set_active_url) {
4606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
4706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    if (!exe_module)
4806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      return;
4906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    set_active_url = reinterpret_cast<MainSetActiveURL>(
5006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch        GetProcAddress(exe_module, "SetActiveURL"));
5106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    if (!set_active_url)
5206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      return;
5306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
5406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
5506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  (set_active_url)(UTF8ToWide(url.possibly_invalid_spec()).c_str());
5606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
5706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
5806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochvoid SetClientId(const std::string& client_id) {
5906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  std::string str(client_id);
6006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Remove all instance of '-' char from the GUID. So BCD-WXY becomes BCDWXY.
6106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ReplaceSubstringsAfterOffset(&str, 0, "-", "");
6206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
6306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  if (str.empty())
6406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    return;
6506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
6606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  std::wstring wstr = ASCIIToWide(str);
6706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  std::wstring old_wstr;
6806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  if (!GoogleUpdateSettings::GetMetricsId(&old_wstr) ||
6906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      wstr != old_wstr)
7006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    GoogleUpdateSettings::SetMetricsId(wstr);
7106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
7206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  static MainSetClientId set_client_id = NULL;
7306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  if (!set_client_id) {
7406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
7506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    if (!exe_module)
7606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      return;
7706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    set_client_id = reinterpret_cast<MainSetClientId>(
7806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch        GetProcAddress(exe_module, "SetClientId"));
7906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    if (!set_client_id)
8006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      return;
8106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
8206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  (set_client_id)(wstr.c_str());
8306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
8406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstd::string GetClientId() {
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::wstring wstr_client_id;
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (GoogleUpdateSettings::GetMetricsId(&wstr_client_id))
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return WideToASCII(wstr_client_id);
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  else
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return std::string();
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochvoid SetActiveExtensions(const std::set<std::string>& extension_ids) {
94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static MainSetNumberOfExtensions set_number_of_extensions = NULL;
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!set_number_of_extensions) {
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!exe_module)
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return;
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    set_number_of_extensions = reinterpret_cast<MainSetNumberOfExtensions>(
100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        GetProcAddress(exe_module, "SetNumberOfExtensions"));
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!set_number_of_extensions)
102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return;
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
10506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  static MainSetExtensionID set_extension_id = NULL;
10606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  if (!set_extension_id) {
10706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
10806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    if (!exe_module)
10906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      return;
11006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    set_extension_id = reinterpret_cast<MainSetExtensionID>(
11106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch        GetProcAddress(exe_module, "SetExtensionID"));
11206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    if (!set_extension_id)
11306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      return;
11406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
11506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  (set_number_of_extensions)(static_cast<int>(extension_ids.size()));
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
11806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  std::set<std::string>::const_iterator iter = extension_ids.begin();
11906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  for (size_t i = 0; i < kMaxReportedActiveExtensions; ++i) {
12006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    if (iter != extension_ids.end()) {
12106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      (set_extension_id)(i, ASCIIToWide(iter->c_str()).c_str());
12206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      ++iter;
12306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    } else {
12406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      (set_extension_id)(i, L"");
12506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    }
12606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
12706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
12806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
12906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochvoid SetGpuInfo(const GPUInfo& gpu_info) {
13006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  static MainSetGpuInfo set_gpu_info = NULL;
13106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  if (!set_gpu_info) {
13206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
13306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    if (!exe_module)
13406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      return;
13506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    set_gpu_info = reinterpret_cast<MainSetGpuInfo>(
13606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch        GetProcAddress(exe_module, "SetGpuInfo"));
13706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    if (!set_gpu_info)
13806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      return;
13906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  (set_gpu_info)(
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      base::StringPrintf(L"0x%04x", gpu_info.vendor_id).c_str(),
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      base::StringPrintf(L"0x%04x", gpu_info.device_id).c_str(),
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      UTF8ToUTF16(gpu_info.driver_version).c_str(),
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      UTF8ToUTF16(gpu_info.pixel_shader_version).c_str(),
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      UTF8ToUTF16(gpu_info.vertex_shader_version).c_str());
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid SetNumberOfViews(int number_of_views) {
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static MainSetNumberOfViews set_number_of_views = NULL;
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!set_number_of_views) {
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!exe_module)
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    set_number_of_views = reinterpret_cast<MainSetNumberOfViews>(
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        GetProcAddress(exe_module, "SetNumberOfViews"));
1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!set_number_of_views)
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  (set_number_of_views)(number_of_views);
16006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
16106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
16206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}  // namespace child_process_logging
163