1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/renderer/p2p/host_address_request.h"
#include "base/bind.h"
#include "base/message_loop_proxy.h"
#include "content/common/p2p_messages.h"
#include "content/renderer/p2p/socket_dispatcher.h"
namespace content {
P2PHostAddressRequest::P2PHostAddressRequest(P2PSocketDispatcher* dispatcher)
: dispatcher_(dispatcher),
ipc_message_loop_(dispatcher->message_loop()),
delegate_message_loop_(base::MessageLoopProxy::current()),
state_(STATE_CREATED),
request_id_(0),
registered_(false) {
}
P2PHostAddressRequest::~P2PHostAddressRequest() {
DCHECK(state_ == STATE_CREATED || state_ == STATE_FINISHED);
DCHECK(!registered_);
}
void P2PHostAddressRequest::Request(const std::string& host_name,
const DoneCallback& done_callback) {
DCHECK(delegate_message_loop_->BelongsToCurrentThread());
DCHECK_EQ(STATE_CREATED, state_);
state_ = STATE_SENT;
ipc_message_loop_->PostTask(FROM_HERE, base::Bind(
&P2PHostAddressRequest::DoSendRequest, this, host_name, done_callback));
}
void P2PHostAddressRequest::Cancel() {
DCHECK(delegate_message_loop_->BelongsToCurrentThread());
if (state_ != STATE_FINISHED) {
state_ = STATE_FINISHED;
ipc_message_loop_->PostTask(FROM_HERE, base::Bind(
&P2PHostAddressRequest::DoUnregister, this));
}
}
void P2PHostAddressRequest::DoSendRequest(const std::string& host_name,
const DoneCallback& done_callback) {
DCHECK(ipc_message_loop_->BelongsToCurrentThread());
done_callback_ = done_callback;
request_id_ = dispatcher_->RegisterHostAddressRequest(this);
registered_ = true;
dispatcher_->SendP2PMessage(
new P2PHostMsg_GetHostAddress(host_name, request_id_));
}
void P2PHostAddressRequest::DoUnregister() {
DCHECK(ipc_message_loop_->BelongsToCurrentThread());
if (registered_) {
dispatcher_->UnregisterHostAddressRequest(request_id_);
registered_ = false;
}
}
void P2PHostAddressRequest::OnResponse(const net::IPAddressNumber& address) {
DCHECK(ipc_message_loop_->BelongsToCurrentThread());
DCHECK(registered_);
dispatcher_->UnregisterHostAddressRequest(request_id_);
registered_ = false;
delegate_message_loop_->PostTask(FROM_HERE, base::Bind(
&P2PHostAddressRequest::DeliverResponse, this, address));
}
void P2PHostAddressRequest::DeliverResponse(
const net::IPAddressNumber& address) {
DCHECK(delegate_message_loop_->BelongsToCurrentThread());
if (state_ == STATE_SENT) {
done_callback_.Run(address);
state_ = STATE_FINISHED;
}
}
} // namespace content
|