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