• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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_SETUP_ME2ME_NATIVE_MESSAGING_HOST_H_
6 #define REMOTING_HOST_SETUP_ME2ME_NATIVE_MESSAGING_HOST_H_
7 
8 #include "base/memory/ref_counted.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/memory/weak_ptr.h"
11 #include "base/threading/thread_checker.h"
12 #include "remoting/host/native_messaging/native_messaging_channel.h"
13 #include "remoting/host/setup/daemon_controller.h"
14 #include "remoting/host/setup/oauth_client.h"
15 
16 namespace base {
17 class DictionaryValue;
18 class ListValue;
19 }  // namespace base
20 
21 namespace gaia {
22 class GaiaOAuthClient;
23 }  // namespace gaia
24 
25 namespace remoting {
26 
27 namespace protocol {
28 class PairingRegistry;
29 }  // namespace protocol
30 
31 // Implementation of the me2me native messaging host.
32 class Me2MeNativeMessagingHost {
33  public:
34   typedef NativeMessagingChannel::SendMessageCallback SendMessageCallback;
35 
36   Me2MeNativeMessagingHost(
37       scoped_ptr<NativeMessagingChannel> channel,
38       scoped_refptr<DaemonController> daemon_controller,
39       scoped_refptr<protocol::PairingRegistry> pairing_registry,
40       scoped_ptr<OAuthClient> oauth_client);
41   virtual ~Me2MeNativeMessagingHost();
42 
43   void Start(const base::Closure& quit_closure);
44 
45  private:
46   void ProcessMessage(scoped_ptr<base::DictionaryValue> message);
47 
48   // These "Process.." methods handle specific request types. The |response|
49   // dictionary is pre-filled by ProcessMessage() with the parts of the
50   // response already known ("id" and "type" fields).
51   bool ProcessHello(
52       const base::DictionaryValue& message,
53       scoped_ptr<base::DictionaryValue> response);
54   bool ProcessClearPairedClients(
55       const base::DictionaryValue& message,
56       scoped_ptr<base::DictionaryValue> response);
57   bool ProcessDeletePairedClient(
58       const base::DictionaryValue& message,
59       scoped_ptr<base::DictionaryValue> response);
60   bool ProcessGetHostName(
61       const base::DictionaryValue& message,
62       scoped_ptr<base::DictionaryValue> response);
63   bool ProcessGetPinHash(
64       const base::DictionaryValue& message,
65       scoped_ptr<base::DictionaryValue> response);
66   bool ProcessGenerateKeyPair(
67       const base::DictionaryValue& message,
68       scoped_ptr<base::DictionaryValue> response);
69   bool ProcessUpdateDaemonConfig(
70       const base::DictionaryValue& message,
71       scoped_ptr<base::DictionaryValue> response);
72   bool ProcessGetDaemonConfig(
73       const base::DictionaryValue& message,
74       scoped_ptr<base::DictionaryValue> response);
75   bool ProcessGetPairedClients(
76       const base::DictionaryValue& message,
77       scoped_ptr<base::DictionaryValue> response);
78   bool ProcessGetUsageStatsConsent(
79       const base::DictionaryValue& message,
80       scoped_ptr<base::DictionaryValue> response);
81   bool ProcessStartDaemon(
82       const base::DictionaryValue& message,
83       scoped_ptr<base::DictionaryValue> response);
84   bool ProcessStopDaemon(
85       const base::DictionaryValue& message,
86       scoped_ptr<base::DictionaryValue> response);
87   bool ProcessGetDaemonState(
88       const base::DictionaryValue& message,
89       scoped_ptr<base::DictionaryValue> response);
90   bool ProcessGetHostClientId(
91       const base::DictionaryValue& message,
92       scoped_ptr<base::DictionaryValue> response);
93   bool ProcessGetCredentialsFromAuthCode(
94       const base::DictionaryValue& message,
95       scoped_ptr<base::DictionaryValue> response);
96 
97   // These Send... methods get called on the DaemonController's internal thread,
98   // or on the calling thread if called by the PairingRegistry.
99   // These methods fill in the |response| dictionary from the other parameters,
100   // and pass it to SendResponse().
101   void SendConfigResponse(scoped_ptr<base::DictionaryValue> response,
102                           scoped_ptr<base::DictionaryValue> config);
103   void SendPairedClientsResponse(scoped_ptr<base::DictionaryValue> response,
104                                  scoped_ptr<base::ListValue> pairings);
105   void SendUsageStatsConsentResponse(
106       scoped_ptr<base::DictionaryValue> response,
107       const DaemonController::UsageStatsConsent& consent);
108   void SendAsyncResult(scoped_ptr<base::DictionaryValue> response,
109                        DaemonController::AsyncResult result);
110   void SendBooleanResult(scoped_ptr<base::DictionaryValue> response,
111                          bool result);
112   void SendCredentialsResponse(scoped_ptr<base::DictionaryValue> response,
113                                const std::string& user_email,
114                                const std::string& refresh_token);
115 
116   scoped_ptr<NativeMessagingChannel> channel_;
117   scoped_refptr<DaemonController> daemon_controller_;
118 
119   // Used to load and update the paired clients for this host.
120   scoped_refptr<protocol::PairingRegistry> pairing_registry_;
121 
122   // Used to exchange the service account authorization code for credentials.
123   scoped_ptr<OAuthClient> oauth_client_;
124 
125   base::ThreadChecker thread_checker_;
126 
127   base::WeakPtr<Me2MeNativeMessagingHost> weak_ptr_;
128   base::WeakPtrFactory<Me2MeNativeMessagingHost> weak_factory_;
129 
130   DISALLOW_COPY_AND_ASSIGN(Me2MeNativeMessagingHost);
131 };
132 
133 // Creates a Me2MeNativeMessagingHost instance, attaches it to stdin/stdout and
134 // runs the message loop until Me2MeNativeMessagingHost signals shutdown.
135 int Me2MeNativeMessagingHostMain();
136 
137 }  // namespace remoting
138 
139 #endif  // REMOTING_HOST_SETUP_ME2ME_NATIVE_MESSAGING_HOST_H_
140