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