15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_RENDERER_P2P_HOST_ADDRESS_REQUEST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_RENDERER_P2P_HOST_ADDRESS_REQUEST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/webrtc/base/asyncresolverinterface.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class MessageLoop;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopProxy;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class P2PSocketDispatcher;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// P2PAsyncAddressResolver performs DNS hostname resolution. It's used
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to resolve addresses of STUN and relay servers.
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class P2PAsyncAddressResolver
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public base::RefCountedThreadSafe<P2PAsyncAddressResolver> {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef base::Callback<void(const net::IPAddressList&)> DoneCallback;
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  P2PAsyncAddressResolver(P2PSocketDispatcher* dispatcher);
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Start address resolve process.
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void Start(const rtc::SocketAddress& addr,
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)             const DoneCallback& done_callback);
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Clients must unregister before exiting for cleanup.
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Cancel();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum State {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_CREATED,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_SENT,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_FINISHED,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class P2PSocketDispatcher;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend class base::RefCountedThreadSafe<P2PAsyncAddressResolver>;
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~P2PAsyncAddressResolver();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void DoSendRequest(const rtc::SocketAddress& host_name,
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     const DoneCallback& done_callback);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoUnregister();
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnResponse(const net::IPAddressList& address);
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DeliverResponse(const net::IPAddressList& address);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  P2PSocketDispatcher* dispatcher_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> ipc_message_loop_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> delegate_message_loop_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // State must be accessed from delegate thread only.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State state_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accessed on the IPC thread only.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 request_id_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool registered_;
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<rtc::IPAddress> addresses_;
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoneCallback done_callback_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(P2PAsyncAddressResolver);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_RENDERER_P2P_HOST_ADDRESS_REQUEST_H_
77