• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef REMOTING_HOST_WIN_HOST_SERVICE_H_
6 #define REMOTING_HOST_WIN_HOST_SERVICE_H_
7 
8 #include <windows.h>
9 
10 #include <list>
11 
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/singleton.h"
14 #include "base/memory/weak_ptr.h"
15 #include "base/synchronization/waitable_event.h"
16 #include "remoting/host/win/wts_terminal_monitor.h"
17 
18 class CommandLine;
19 
20 namespace base {
21 class SingleThreadTaskRunner;
22 }  // namespace base
23 
24 namespace remoting {
25 
26 class AutoThreadTaskRunner;
27 class DaemonProcess;
28 class WtsTerminalObserver;
29 
30 class HostService : public WtsTerminalMonitor {
31  public:
32   static HostService* GetInstance();
33 
34   // This function parses the command line and selects the action routine.
35   bool InitWithCommandLine(const CommandLine* command_line);
36 
37   // Invoke the choosen action routine.
38   int Run();
39 
40   // WtsTerminalMonitor implementation
41   virtual bool AddWtsTerminalObserver(const std::string& terminal_id,
42                                       WtsTerminalObserver* observer) OVERRIDE;
43   virtual void RemoveWtsTerminalObserver(
44       WtsTerminalObserver* observer) OVERRIDE;
45 
46  private:
47   HostService();
48   ~HostService();
49 
50   // Notifies the service of changes in session state.
51   void OnSessionChange(uint32 event, uint32 session_id);
52 
53   // Creates the process launcher.
54   void CreateLauncher(scoped_refptr<AutoThreadTaskRunner> task_runner);
55 
56   // This function handshakes with the service control manager and starts
57   // the service.
58   int RunAsService();
59 
60   // Runs the service on the service thread. A separate routine is used to make
61   // sure all local objects are destoyed by the time |stopped_event_| is
62   // signalled.
63   void RunAsServiceImpl();
64 
65   // This function starts the service in interactive mode (i.e. as a plain
66   // console application).
67   int RunInConsole();
68 
69   // Stops and deletes |daemon_process_|.
70   void StopDaemonProcess();
71 
72   // Handles WM_WTSSESSION_CHANGE messages.
73   bool HandleMessage(UINT message,
74                      WPARAM wparam,
75                      LPARAM lparam,
76                      LRESULT* result);
77 
78   static BOOL WINAPI ConsoleControlHandler(DWORD event);
79 
80   // The control handler of the service.
81   static DWORD WINAPI ServiceControlHandler(DWORD control,
82                                             DWORD event_type,
83                                             LPVOID event_data,
84                                             LPVOID context);
85 
86   // The main service entry point.
87   static VOID WINAPI ServiceMain(DWORD argc, WCHAR* argv[]);
88 
89   struct RegisteredObserver {
90     // Unique identifier of the terminal to observe.
91     std::string terminal_id;
92 
93     // Specifies ID of the attached session or |kInvalidSession| if no session
94     // is attached to the WTS terminal.
95     uint32 session_id;
96 
97     // Points to the observer receiving notifications about the WTS terminal
98     // identified by |terminal_id|.
99     WtsTerminalObserver* observer;
100   };
101 
102   // The list of observers receiving session notifications.
103   std::list<RegisteredObserver> observers_;
104 
105   scoped_ptr<DaemonProcess> daemon_process_;
106 
107   // Service message loop. |main_task_runner_| must be valid as long as the
108   // Control+C or service notification handler is registered.
109   scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
110 
111   // The action routine to be executed.
112   int (HostService::*run_routine_)();
113 
114   // The service status handle.
115   SERVICE_STATUS_HANDLE service_status_handle_;
116 
117   // A waitable event that is used to wait until the service is stopped.
118   base::WaitableEvent stopped_event_;
119 
120   // Used to post session change notifications and control events.
121   base::WeakPtrFactory<HostService> weak_factory_;
122   base::WeakPtr<HostService> weak_ptr_;
123 
124   // Singleton.
125   friend struct DefaultSingletonTraits<HostService>;
126 
127   DISALLOW_COPY_AND_ASSIGN(HostService);
128 };
129 
130 }  // namespace remoting
131 
132 #endif  // REMOTING_HOST_WIN_HOST_SERVICE_H_
133