• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 CONTENT_RENDERER_P2P_HOST_ADDRESS_REQUEST_H_
6 #define CONTENT_RENDERER_P2P_HOST_ADDRESS_REQUEST_H_
7 
8 #include <string>
9 
10 #include "base/callback.h"
11 #include "base/memory/ref_counted.h"
12 #include "content/common/content_export.h"
13 #include "net/base/net_util.h"
14 
15 namespace base {
16 class MessageLoopProxy;
17 }  // namespace base
18 
19 namespace content {
20 
21 class P2PSocketDispatcher;
22 
23 // P2PHostAddressRequest performs DNS hostname resolution. It's used
24 // to resolve addresses of STUN and relay servers.
25 //
26 // TODO(sergeyu): Name of this class may be confusing. Rename it to
27 // something else, e.g. P2PHostnameResolver.
28 class CONTENT_EXPORT P2PHostAddressRequest
29     : public base::RefCountedThreadSafe<P2PHostAddressRequest>  {
30  public:
31   typedef base::Callback<void(const net::IPAddressNumber&)> DoneCallback;
32 
33   P2PHostAddressRequest(P2PSocketDispatcher* dispatcher);
34 
35   // Sends host address request.
36   void Request(const std::string& host_name,
37                const DoneCallback& done_callback);
38 
39   // Cancels the request. The callback passed to Request() will not be
40   // called after Cancel() is called.
41   void Cancel();
42 
43  private:
44   enum State {
45     STATE_CREATED,
46     STATE_SENT,
47     STATE_FINISHED,
48   };
49 
50   friend class P2PSocketDispatcher;
51 
52   friend class base::RefCountedThreadSafe<P2PHostAddressRequest>;
53   virtual ~P2PHostAddressRequest();
54 
55   void DoSendRequest(const std::string& host_name,
56                      const DoneCallback& done_callback);
57   void DoUnregister();
58   void OnResponse(const net::IPAddressNumber& address);
59   void DeliverResponse(const net::IPAddressNumber& address);
60 
61   P2PSocketDispatcher* dispatcher_;
62   scoped_refptr<base::MessageLoopProxy> ipc_message_loop_;
63   scoped_refptr<base::MessageLoopProxy> delegate_message_loop_;
64   DoneCallback done_callback_;
65 
66   // State must be accessed from delegate thread only.
67   State state_;
68 
69   // Accessed on the IPC thread only.
70   int32 request_id_;
71   bool registered_;
72 
73   DISALLOW_COPY_AND_ASSIGN(P2PHostAddressRequest);
74 };
75 
76 }  // namespace content
77 
78 #endif  // CONTENT_RENDERER_P2P_HOST_ADDRESS_REQUEST_H_
79