1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <map> 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <string> 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <vector> 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/macros.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/synchronization/lock.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "breakpad/src/client/windows/common/ipc_protocol.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "breakpad/src/client/windows/handler/exception_handler.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace base { 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class CommandLine; 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace base 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace crash_reporter { 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass CrashReporterClient; 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace breakpad { 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Manages the breakpad key/value pair stash, there may only be one instance 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// of this class per process at one time. 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class CrashKeysWin { 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CrashKeysWin(); 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ~CrashKeysWin(); 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // May only be called once. 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |exe_path| is the path to the executable running, which may be used 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // to figure out whether this is a user or system install. 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |type| is the process type, or mode this process is running in e.g. 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // something like "browser" or "renderer". 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |profile_type| is a string describing the kind of the user's Windows 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // profile, e.g. "mandatory", or "roaming" or similar. 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |cmd_line| is the current process' command line consulted for explicit 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // crash reporting flags. 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |crash_client| is consulted for crash reporting settings. 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) google_breakpad::CustomClientInfo* GetCustomInfo( 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::wstring& exe_path, 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::wstring& type, 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::wstring& profile_type, 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::CommandLine* cmd_line, 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci crash_reporter::CrashReporterClient* crash_client); 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void SetCrashKeyValue(const std::wstring& key, const std::wstring& value); 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void ClearCrashKeyValue(const std::wstring& key); 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static CrashKeysWin* keeper() { return keeper_; } 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // One-time initialization of private key/value pairs. 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void SetPluginPath(const std::wstring& path); 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetBreakpadDumpPath(crash_reporter::CrashReporterClient* crash_client); 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Must not be resized after GetCustomInfo is invoked. 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<google_breakpad::CustomInfoEntry> custom_entries_; 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) typedef std::map<std::wstring, google_breakpad::CustomInfoEntry*> 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DynamicEntriesMap; 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Lock lock_; 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Keeps track of the next index for a new dynamic entry. 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t dynamic_keys_offset_; // Under lock_. 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Maintains key->entry information for dynamic key/value entries 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // in custom_entries_. 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DynamicEntriesMap dynamic_entries_; // Under lock_. 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Stores the sole instance of this class allowed per process. 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static CrashKeysWin* keeper_; 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CrashKeysWin); 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace breakpad 78