1eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Copyright (c) 2008, Google Inc.
2eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// All rights reserved.
3eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai//
4eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Redistribution and use in source and binary forms, with or without
5eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// modification, are permitted provided that the following conditions are
6eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// met:
7eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai//
8eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai//     * Redistributions of source code must retain the above copyright
9eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// notice, this list of conditions and the following disclaimer.
10eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai//     * Redistributions in binary form must reproduce the above
11eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// copyright notice, this list of conditions and the following disclaimer
12eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// in the documentation and/or other materials provided with the
13eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// distribution.
14eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai//     * Neither the name of Google Inc. nor the names of its
15eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// contributors may be used to endorse or promote products derived from
16eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// this software without specific prior written permission.
17eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai//
18eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
30eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__
31eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__
32eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
33eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#include <list>
34eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#include <string>
35eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#include "client/windows/common/ipc_protocol.h"
36eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#include "client/windows/crash_generation/minidump_generator.h"
370fd594340f87c59b3f9302cfea4d39dd25ec028fthestig@chromium.org#include "common/scoped_ptr.h"
38eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
39eeca9921c563d802cccc5593bf55dcb7683e7250mmentovainamespace google_breakpad {
40b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.orgclass ClientInfo;
41eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
42eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Abstraction for server side implementation of out-of-process crash
43eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// generation protocol for Windows platform only. It generates Windows
44eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// minidump files for client processes that request dump generation. When
45eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// the server is requested to start listening for clients (by calling the
46eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Start method), it creates a named pipe and waits for the clients to
47eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// register. In response, it hands them event handles that the client can
48eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// signal to request dump generation. When the clients request dump
49eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// generation in this way, the server generates Windows minidump files.
50eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiclass CrashGenerationServer {
51eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai public:
52eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  typedef void (*OnClientConnectedCallback)(void* context,
53eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai                                            const ClientInfo* client_info);
54eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
55eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  typedef void (*OnClientDumpRequestCallback)(void* context,
569033edcd7bab5a25c748dd1979f51853bbe06f87doshimun                                              const ClientInfo* client_info,
579033edcd7bab5a25c748dd1979f51853bbe06f87doshimun                                              const std::wstring* file_path);
58eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
59eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  typedef void (*OnClientExitedCallback)(void* context,
60eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai                                         const ClientInfo* client_info);
61eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
62eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org  typedef void (*OnClientUploadRequestCallback)(void* context,
63eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org                                                const DWORD crash_id);
64eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org
65eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Creates an instance with the given parameters.
66eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  //
6705ec557277a40d214eb82183392b50e039a022a3doshimun  // Parameter pipe_name: Name of the Windows named pipe
6835c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun  // Parameter pipe_sec_attrs Security attributes to set on the pipe. Pass
6935c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun  //     NULL to use default security on the pipe. By default, the pipe created
7035c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun  //     allows Local System, Administrators and the Creator full control and
7135c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun  //     the Everyone group read access on the pipe.
72eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Parameter connect_callback: Callback for a new client connection.
73eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Parameter connect_context: Context for client connection callback.
74eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Parameter crash_callback: Callback for a client crash dump request.
75eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Parameter crash_context: Context for client crash dump request callback.
76eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Parameter exit_callback: Callback for client process exit.
77eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Parameter exit_context: Context for client exit callback.
78eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Parameter generate_dumps: Whether to automatically generate dumps.
79eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Client code of this class might want to generate dumps explicitly in the
80eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // crash dump request callback. In that case, false can be passed for this
81eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // parameter.
82eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Parameter dump_path: Path for generating dumps; required only if true is
83eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // passed for generateDumps parameter; NULL can be passed otherwise.
84eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  CrashGenerationServer(const std::wstring& pipe_name,
8535c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun                        SECURITY_ATTRIBUTES* pipe_sec_attrs,
86eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai                        OnClientConnectedCallback connect_callback,
87eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai                        void* connect_context,
88eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai                        OnClientDumpRequestCallback dump_callback,
89eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai                        void* dump_context,
90eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai                        OnClientExitedCallback exit_callback,
91eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai                        void* exit_context,
92eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org                        OnClientUploadRequestCallback upload_request_callback,
93eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org                        void* upload_context,
94eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai                        bool generate_dumps,
95eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai                        const std::wstring* dump_path);
96eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
97eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  ~CrashGenerationServer();
98eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
99b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  // Performs initialization steps needed to start listening to clients. Upon
100b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  // successful return clients may connect to this server's pipe.
101eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  //
102eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Returns true if initialization is successful; false otherwise.
103eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  bool Start();
104eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
105c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com  void pre_fetch_custom_info(bool do_pre_fetch) {
106c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com    pre_fetch_custom_info_ = do_pre_fetch;
107c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com  }
108c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com
109eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai private:
110eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Various states the client can be in during the handshake with
111eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // the server.
112eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  enum IPCServerState {
113b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org    // Server starts in this state.
114b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org    IPC_SERVER_STATE_UNINITIALIZED,
115b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org
116eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // Server is in error state and it cannot serve any clients.
117eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    IPC_SERVER_STATE_ERROR,
118eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
119eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // Server starts in this state.
120eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    IPC_SERVER_STATE_INITIAL,
121eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
122eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // Server has issued an async connect to the pipe and it is waiting
123eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // for the connection to be established.
124eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    IPC_SERVER_STATE_CONNECTING,
125eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
126eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // Server is connected successfully.
127eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    IPC_SERVER_STATE_CONNECTED,
128eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
129eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // Server has issued an async read from the pipe and it is waiting for
130eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // the read to finish.
131eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    IPC_SERVER_STATE_READING,
132eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
133eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // Server is done reading from the pipe.
134eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    IPC_SERVER_STATE_READ_DONE,
135eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
136eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // Server has issued an async write to the pipe and it is waiting for
137eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // the write to finish.
138eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    IPC_SERVER_STATE_WRITING,
139eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
140eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // Server is done writing to the pipe.
141eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    IPC_SERVER_STATE_WRITE_DONE,
142eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
143eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // Server has issued an async read from the pipe for an ack and it
144eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // is waiting for the read to finish.
145eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    IPC_SERVER_STATE_READING_ACK,
146eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
147eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // Server is done writing to the pipe and it is now ready to disconnect
148eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    // and reconnect.
149eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai    IPC_SERVER_STATE_DISCONNECTING
150eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  };
151eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
152eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  //
153eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Helper methods to handle various server IPC states.
154eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  //
155eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void HandleErrorState();
156eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void HandleInitialState();
157eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void HandleConnectingState();
158eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void HandleConnectedState();
159eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void HandleReadingState();
160eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void HandleReadDoneState();
161eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void HandleWritingState();
162eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void HandleWriteDoneState();
163eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void HandleReadingAckState();
164eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void HandleDisconnectingState();
165eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
166eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Prepares reply for a client from the given parameters.
167eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  bool PrepareReply(const ClientInfo& client_info,
168eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai                    ProtocolMessage* reply) const;
169eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
170eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Duplicates various handles in the ClientInfo object for the client
171eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // process and stores them in the given ProtocolMessage instance. If
172eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // creating any handle fails, ProtocolMessage will contain the handles
173eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // already created successfully, which should be closed by the caller.
174eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  bool CreateClientHandles(const ClientInfo& client_info,
175eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai                           ProtocolMessage* reply) const;
176eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
177eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Response to the given client. Return true if all steps of
178eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // responding to the client succeed, false otherwise.
179eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  bool RespondToClient(ClientInfo* client_info);
180eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
181eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Handles a connection request from the client.
182eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void HandleConnectionRequest();
183eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
184eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Handles a dump request from the client.
185eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void HandleDumpRequest(const ClientInfo& client_info);
186eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
187eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Callback for pipe connected event.
188eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  static void CALLBACK OnPipeConnected(void* context, BOOLEAN timer_or_wait);
189eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
190eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Callback for a dump request.
191eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  static void CALLBACK OnDumpRequest(void* context, BOOLEAN timer_or_wait);
192eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
193eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Callback for client process exit event.
194eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  static void CALLBACK OnClientEnd(void* context, BOOLEAN timer_or_wait);
195eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
19655cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com  // Handles client process exit.
19755cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com  void HandleClientProcessExit(ClientInfo* client_info);
198eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
199eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Adds the given client to the list of registered clients.
200eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  bool AddClient(ClientInfo* client_info);
201eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
202eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Generates dump for the given client.
2039033edcd7bab5a25c748dd1979f51853bbe06f87doshimun  bool GenerateDump(const ClientInfo& client, std::wstring* dump_path);
204eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
205b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  // Puts the server in a permanent error state and sets a signal such that
206b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  // the state will be immediately entered after the current state transition
207b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  // is complete.
208b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  void EnterErrorState();
209b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org
210b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  // Puts the server in the specified state and sets a signal such that the
211b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  // state is immediately entered after the current state transition is
212b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  // complete.
213b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  void EnterStateImmediately(IPCServerState state);
214b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org
215b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  // Puts the server in the specified state. No signal will be set, so the state
216b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  // transition will only occur when signaled manually or by completion of an
217b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  // asynchronous IO operation.
218b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org  void EnterStateWhenSignaled(IPCServerState state);
219b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org
22055cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com  // Sync object for thread-safe access to the shared list of clients.
22120371bcb7ed6fdcf505ac01dacfed7dc113d18f8mark@chromium.org  CRITICAL_SECTION sync_;
222eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
223eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // List of clients.
224eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  std::list<ClientInfo*> clients_;
225eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
226eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Pipe name.
227eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  std::wstring pipe_name_;
228eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
22935c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun  // Pipe security attributes
23035c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun  SECURITY_ATTRIBUTES* pipe_sec_attrs_;
23135c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun
232eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Handle to the pipe used for handshake with clients.
233eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  HANDLE pipe_;
234eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
235eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Pipe wait handle.
236eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  HANDLE pipe_wait_handle_;
237eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
238eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Handle to server-alive mutex.
239eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  HANDLE server_alive_handle_;
240eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
241eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Callback for a successful client connection.
242eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  OnClientConnectedCallback connect_callback_;
243eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
244eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Context for client connected callback.
245eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void* connect_context_;
246eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
247eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Callback for a client dump request.
248eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  OnClientDumpRequestCallback dump_callback_;
249eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
250eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Context for client dump request callback.
251eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void* dump_context_;
252eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
253eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Callback for client process exit.
254eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  OnClientExitedCallback exit_callback_;
255eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
256eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Context for client process exit callback.
257eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  void* exit_context_;
258eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
259eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org  // Callback for upload request.
260eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org  OnClientUploadRequestCallback upload_request_callback_;
261eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org
262eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org  // Context for upload request callback.
263eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org  void* upload_context_;
264eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org
265eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Whether to generate dumps.
266eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  bool generate_dumps_;
267eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
268c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com  // Wether to populate custom information up-front.
269c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com  bool pre_fetch_custom_info_;
270c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com
271f1cb1b4882b1b6111b922902ea7cf19730777bd0cdn@chromium.org  // The dump path for the server.
272f1cb1b4882b1b6111b922902ea7cf19730777bd0cdn@chromium.org  const std::wstring dump_path_;
273eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
274eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // State of the server in performing the IPC with the client.
275eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Note that since we restrict the pipe to one instance, we
276eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // only need to keep one state of the server. Otherwise, server
277eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // would have one state per client it is talking to.
27820371bcb7ed6fdcf505ac01dacfed7dc113d18f8mark@chromium.org  IPCServerState server_state_;
279eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
280eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Whether the server is shutting down.
28120371bcb7ed6fdcf505ac01dacfed7dc113d18f8mark@chromium.org  bool shutting_down_;
282eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
283eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Overlapped instance for async I/O on the pipe.
284eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  OVERLAPPED overlapped_;
285eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
286eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Message object used in IPC with the client.
287eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  ProtocolMessage msg_;
288eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
289eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Client Info for the client that's connecting to the server.
290eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  ClientInfo* client_info_;
291eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
292eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  // Disable copy ctor and operator=.
293eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  CrashGenerationServer(const CrashGenerationServer& crash_server);
294eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai  CrashGenerationServer& operator=(const CrashGenerationServer& crash_server);
295eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai};
296eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
297eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai}  // namespace google_breakpad
298eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai
299eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#endif  // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__
300