OLD | NEW |
| (Empty) |
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 #include "net/base/single_request_host_resolver.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/bind_helpers.h" | |
9 #include "base/compiler_specific.h" | |
10 #include "base/logging.h" | |
11 #include "net/base/net_errors.h" | |
12 | |
13 namespace net { | |
14 | |
15 SingleRequestHostResolver::SingleRequestHostResolver(HostResolver* resolver) | |
16 : resolver_(resolver), | |
17 cur_request_(NULL), | |
18 ALLOW_THIS_IN_INITIALIZER_LIST(callback_( | |
19 base::Bind(&SingleRequestHostResolver::OnResolveCompletion, | |
20 base::Unretained(this)))) { | |
21 DCHECK(resolver_ != NULL); | |
22 } | |
23 | |
24 SingleRequestHostResolver::~SingleRequestHostResolver() { | |
25 Cancel(); | |
26 } | |
27 | |
28 int SingleRequestHostResolver::Resolve( | |
29 const HostResolver::RequestInfo& info, AddressList* addresses, | |
30 const CompletionCallback& callback, const BoundNetLog& net_log) { | |
31 DCHECK(addresses); | |
32 DCHECK_EQ(false, callback.is_null()); | |
33 DCHECK(cur_request_callback_.is_null()) << "resolver already in use"; | |
34 | |
35 HostResolver::RequestHandle request = NULL; | |
36 | |
37 // We need to be notified of completion before |callback| is called, so that | |
38 // we can clear out |cur_request_*|. | |
39 CompletionCallback transient_callback = | |
40 callback.is_null() ? CompletionCallback() : callback_; | |
41 | |
42 int rv = resolver_->Resolve( | |
43 info, addresses, transient_callback, &request, net_log); | |
44 | |
45 if (rv == ERR_IO_PENDING) { | |
46 DCHECK_EQ(false, callback.is_null()); | |
47 // Cleared in OnResolveCompletion(). | |
48 cur_request_ = request; | |
49 cur_request_callback_ = callback; | |
50 } | |
51 | |
52 return rv; | |
53 } | |
54 | |
55 void SingleRequestHostResolver::Cancel() { | |
56 if (!cur_request_callback_.is_null()) { | |
57 resolver_->CancelRequest(cur_request_); | |
58 cur_request_ = NULL; | |
59 cur_request_callback_.Reset(); | |
60 } | |
61 } | |
62 | |
63 void SingleRequestHostResolver::OnResolveCompletion(int result) { | |
64 DCHECK(cur_request_); | |
65 DCHECK_EQ(false, cur_request_callback_.is_null()); | |
66 | |
67 CompletionCallback callback = cur_request_callback_; | |
68 | |
69 // Clear the outstanding request information. | |
70 cur_request_ = NULL; | |
71 cur_request_callback_.Reset(); | |
72 | |
73 // Call the user's original callback. | |
74 callback.Run(result); | |
75 } | |
76 | |
77 } // namespace net | |
OLD | NEW |