Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(739)

Side by Side Diff: remoting/client/jni/chromoting_jni_instance.cc

Issue 19297003: Add support for drawing video onto a Java ByteBuffer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix crashes discovered during integration testing Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/client/jni/chromoting_jni_instance.h" 5 #include "remoting/client/jni/chromoting_jni_instance.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "remoting/client/audio_player.h" 9 #include "remoting/client/audio_player.h"
10 #include "remoting/client/jni/chromoting_jni.h" 10 #include "remoting/client/jni/chromoting_jni.h"
11 #include "remoting/protocol/libjingle_transport_factory.h" 11 #include "remoting/protocol/libjingle_transport_factory.h"
12 12
13 namespace {
14 // TODO(solb) Move into location shared with client plugin. 13 // TODO(solb) Move into location shared with client plugin.
15 const char* const CHAT_SERVER = "talk.google.com"; 14 const char* const CHAT_SERVER = "talk.google.com";
16 const int CHAT_PORT = 5222; 15 const int CHAT_PORT = 5222;
17 const bool CHAT_USE_TLS = true; 16 const bool CHAT_USE_TLS = true;
18 const char* const CHAT_AUTH_METHOD = "oauth2";
19 } // namespace
20 17
21 namespace remoting { 18 namespace remoting {
22 19
23 ChromotingJniInstance::ChromotingJniInstance(const char* username, 20 ChromotingJniInstance::ChromotingJniInstance(const char* username,
24 const char* auth_token, 21 const char* auth_token,
25 const char* host_jid, 22 const char* host_jid,
26 const char* host_id, 23 const char* host_id,
27 const char* host_pubkey) { 24 const char* host_pubkey) {
28 DCHECK(ChromotingJni::GetInstance()-> 25 DCHECK(ChromotingJni::GetInstance()->
29 ui_task_runner()->BelongsToCurrentThread()); 26 ui_task_runner()->BelongsToCurrentThread());
30 27
31 username_ = username; 28 username_ = username;
32 auth_token_ = auth_token; 29 auth_token_ = auth_token;
33 host_jid_ = host_jid; 30 host_jid_ = host_jid;
34 host_id_ = host_id; 31 host_id_ = host_id;
35 host_pubkey_ = host_pubkey; 32 host_pubkey_ = host_pubkey;
36 33
37 ChromotingJni::GetInstance()->display_task_runner()->PostTask( 34 ChromotingJni::GetInstance()->display_task_runner()->PostTask(
38 FROM_HERE, 35 FROM_HERE,
39 base::Bind(&ChromotingJniInstance::ConnectToHostOnDisplayThread, 36 base::Bind(&ChromotingJniInstance::ConnectToHostOnDisplayThread,
40 this)); 37 this));
41 } 38 }
42 39
43 ChromotingJniInstance::~ChromotingJniInstance() {} 40 ChromotingJniInstance::~ChromotingJniInstance() {}
44 41
45 void ChromotingJniInstance::Cleanup() { 42 void ChromotingJniInstance::Cleanup() {
46 if (!ChromotingJni::GetInstance()-> 43 if (!ChromotingJni::GetInstance()->
47 network_task_runner()->BelongsToCurrentThread()) { 44 display_task_runner()->BelongsToCurrentThread()) {
48 ChromotingJni::GetInstance()->network_task_runner()->PostTask( 45 ChromotingJni::GetInstance()->display_task_runner()->PostTask(
49 FROM_HERE, 46 FROM_HERE,
50 base::Bind(&ChromotingJniInstance::Cleanup, this)); 47 base::Bind(&ChromotingJniInstance::Cleanup, this));
51 return; 48 return;
52 } 49 }
53 50
54 username_ = ""; 51 // This must be destroyed on the display thread before the producer is gone.
55 auth_token_ = ""; 52 view_.reset();
56 host_jid_ = "";
57 host_id_ = "";
58 host_pubkey_ = "";
59 53
60 // |client_| must be torn down before |signaling_|. 54 // The weak pointers must be invalidated on the same thread they were used.
61 pin_callback_.Reset(); 55 view_weak_factory_->InvalidateWeakPtrs();
62 client_.reset(); 56
63 connection_.reset(); 57 ChromotingJni::GetInstance()->network_task_runner()->PostTask(FROM_HERE,
64 client_context_.reset(); 58 base::Bind(&ChromotingJniInstance::DisconnectFromHostOnNetworkThread,
65 client_config_.reset(); 59 this));
66 signaling_.reset();
67 signaling_config_.reset();
68 network_settings_.reset();
69 } 60 }
70 61
71 void ChromotingJniInstance::ProvideSecret(const char* pin) { 62 void ChromotingJniInstance::ProvideSecret(const char* pin) {
72 DCHECK(ChromotingJni::GetInstance()-> 63 DCHECK(ChromotingJni::GetInstance()->
73 ui_task_runner()->BelongsToCurrentThread()); 64 ui_task_runner()->BelongsToCurrentThread());
74 DCHECK(!pin_callback_.is_null()); 65 DCHECK(!pin_callback_.is_null());
75 66
76 // We invoke the string constructor to ensure |pin| gets copied *before* the 67 // We invoke the string constructor to ensure |pin| gets copied *before* the
77 // asynchronous run, since Java might want it back as soon as we return. 68 // asynchronous run, since Java might want it back as soon as we return.
78 ChromotingJni::GetInstance()->network_task_runner()->PostTask(FROM_HERE, 69 ChromotingJni::GetInstance()->network_task_runner()->PostTask(FROM_HERE,
79 base::Bind(pin_callback_, pin)); 70 base::Bind(pin_callback_, pin));
80 } 71 }
81 72
73 void ChromotingJniInstance::RedrawDesktop() {
74 if (!ChromotingJni::GetInstance()->
75 display_task_runner()->BelongsToCurrentThread()) {
76 ChromotingJni::GetInstance()->display_task_runner()->PostTask(
77 FROM_HERE,
78 base::Bind(&ChromotingJniInstance::RedrawDesktop,
79 this));
80 return;
81 }
82
83 ChromotingJni::GetInstance()->RedrawCanvas();
84 }
85
82 void ChromotingJniInstance::OnConnectionState( 86 void ChromotingJniInstance::OnConnectionState(
83 protocol::ConnectionToHost::State state, 87 protocol::ConnectionToHost::State state,
84 protocol::ErrorCode error) { 88 protocol::ErrorCode error) {
85 if (!ChromotingJni::GetInstance()-> 89 if (!ChromotingJni::GetInstance()->
86 ui_task_runner()->BelongsToCurrentThread()) { 90 ui_task_runner()->BelongsToCurrentThread()) {
87 ChromotingJni::GetInstance()-> 91 ChromotingJni::GetInstance()->
88 ui_task_runner()->PostTask( 92 ui_task_runner()->PostTask(
89 FROM_HERE, 93 FROM_HERE,
90 base::Bind(&ChromotingJniInstance::OnConnectionState, 94 base::Bind(&ChromotingJniInstance::OnConnectionState,
91 this, 95 this,
(...skipping 29 matching lines...) Expand all
121 scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher> 125 scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher>
122 ChromotingJniInstance::GetTokenFetcher(const std::string& host_public_key) { 126 ChromotingJniInstance::GetTokenFetcher(const std::string& host_public_key) {
123 // Return null to indicate that third-party authentication is unsupported. 127 // Return null to indicate that third-party authentication is unsupported.
124 return scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher>(); 128 return scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher>();
125 } 129 }
126 130
127 void ChromotingJniInstance::ConnectToHostOnDisplayThread() { 131 void ChromotingJniInstance::ConnectToHostOnDisplayThread() {
128 DCHECK(ChromotingJni::GetInstance()-> 132 DCHECK(ChromotingJni::GetInstance()->
129 display_task_runner()->BelongsToCurrentThread()); 133 display_task_runner()->BelongsToCurrentThread());
130 134
131 if (!frame_consumer_.get()) { 135 frame_consumer_ = new FrameConsumerProxy(
132 frame_consumer_ = new FrameConsumerProxy( 136 ChromotingJni::GetInstance()->display_task_runner());
133 ChromotingJni::GetInstance()->display_task_runner()); 137 view_.reset(new JniFrameConsumer());
134 // TODO(solb) Instantiate some FrameConsumer implementation and attach it. 138 view_weak_factory_.reset(new base::WeakPtrFactory<JniFrameConsumer>(
135 } 139 view_.get()));
140 frame_consumer_->Attach(view_weak_factory_->GetWeakPtr());
136 141
137 ChromotingJni::GetInstance()->network_task_runner()->PostTask( 142 ChromotingJni::GetInstance()->network_task_runner()->PostTask(
138 FROM_HERE, 143 FROM_HERE,
139 base::Bind(&ChromotingJniInstance::ConnectToHostOnNetworkThread, 144 base::Bind(&ChromotingJniInstance::ConnectToHostOnNetworkThread,
140 this)); 145 this));
141 } 146 }
142 147
143 void ChromotingJniInstance::ConnectToHostOnNetworkThread() { 148 void ChromotingJniInstance::ConnectToHostOnNetworkThread() {
144 DCHECK(ChromotingJni::GetInstance()-> 149 DCHECK(ChromotingJni::GetInstance()->
145 network_task_runner()->BelongsToCurrentThread()); 150 network_task_runner()->BelongsToCurrentThread());
146 151
147 client_config_.reset(new ClientConfig()); 152 client_config_.reset(new ClientConfig());
148 client_config_->host_jid = host_jid_; 153 client_config_->host_jid = host_jid_;
149 client_config_->host_public_key = host_pubkey_; 154 client_config_->host_public_key = host_pubkey_;
150 155
151 client_config_->fetch_secret_callback = base::Bind( 156 client_config_->fetch_secret_callback = base::Bind(
152 &ChromotingJniInstance::FetchSecret, 157 &ChromotingJniInstance::FetchSecret,
153 this); 158 this);
154 client_config_->authentication_tag = host_id_; 159 client_config_->authentication_tag = host_id_;
155 160
156 // TODO(solb) Move these hardcoded values elsewhere:
157 client_config_->authentication_methods.push_back( 161 client_config_->authentication_methods.push_back(
158 protocol::AuthenticationMethod::FromString("spake2_hmac")); 162 protocol::AuthenticationMethod::FromString("spake2_hmac"));
159 client_config_->authentication_methods.push_back( 163 client_config_->authentication_methods.push_back(
160 protocol::AuthenticationMethod::FromString("spake2_plain")); 164 protocol::AuthenticationMethod::FromString("spake2_plain"));
161 165
162 client_context_.reset(new ClientContext( 166 client_context_.reset(new ClientContext(
163 ChromotingJni::GetInstance()->network_task_runner().get())); 167 ChromotingJni::GetInstance()->network_task_runner().get()));
164 client_context_->Start(); 168 client_context_->Start();
165 169
166 connection_.reset(new protocol::ConnectionToHost(true)); 170 connection_.reset(new protocol::ConnectionToHost(true));
167 171
168 client_.reset(new ChromotingClient(*client_config_, 172 client_.reset(new ChromotingClient(*client_config_,
169 client_context_.get(), 173 client_context_.get(),
170 connection_.get(), 174 connection_.get(),
171 this, 175 this,
172 frame_consumer_, 176 frame_consumer_,
173 scoped_ptr<AudioPlayer>())); 177 scoped_ptr<AudioPlayer>()));
174 178
179 view_->set_frame_producer(client_->GetFrameProducer());
180
175 signaling_config_.reset(new XmppSignalStrategy::XmppServerConfig()); 181 signaling_config_.reset(new XmppSignalStrategy::XmppServerConfig());
176 signaling_config_->host = CHAT_SERVER; 182 signaling_config_->host = CHAT_SERVER;
177 signaling_config_->port = CHAT_PORT; 183 signaling_config_->port = CHAT_PORT;
178 signaling_config_->use_tls = CHAT_USE_TLS; 184 signaling_config_->use_tls = CHAT_USE_TLS;
179 185
180 signaling_.reset(new XmppSignalStrategy( 186 signaling_.reset(new XmppSignalStrategy(
181 ChromotingJni::GetInstance()->url_requester(), 187 ChromotingJni::GetInstance()->url_requester(),
182 username_, 188 username_,
183 auth_token_, 189 auth_token_,
184 CHAT_AUTH_METHOD, 190 "oauth2",
185 *signaling_config_)); 191 *signaling_config_));
186 192
187 network_settings_.reset(new NetworkSettings( 193 network_settings_.reset(new NetworkSettings(
188 NetworkSettings::NAT_TRAVERSAL_OUTGOING)); 194 NetworkSettings::NAT_TRAVERSAL_OUTGOING));
189 scoped_ptr<protocol::TransportFactory> fact( 195 scoped_ptr<protocol::TransportFactory> fact(
190 protocol::LibjingleTransportFactory::Create( 196 protocol::LibjingleTransportFactory::Create(
191 *network_settings_, 197 *network_settings_,
192 ChromotingJni::GetInstance()->url_requester())); 198 ChromotingJni::GetInstance()->url_requester()));
193 199
194 client_->Start(signaling_.get(), fact.Pass()); 200 client_->Start(signaling_.get(), fact.Pass());
195 } 201 }
196 202
203 void ChromotingJniInstance::DisconnectFromHostOnNetworkThread() {
204 DCHECK(ChromotingJni::GetInstance()->
205 network_task_runner()->BelongsToCurrentThread());
206
207 username_ = "";
208 auth_token_ = "";
209 host_jid_ = "";
210 host_id_ = "";
211 host_pubkey_ = "";
212
213 // |client_| must be torn down before |signaling_|.
214 connection_.reset();
215 client_.reset();
216 }
217
197 void ChromotingJniInstance::FetchSecret( 218 void ChromotingJniInstance::FetchSecret(
198 bool pairable, 219 bool pairable,
199 const protocol::SecretFetchedCallback& callback) { 220 const protocol::SecretFetchedCallback& callback) {
200 if (!ChromotingJni::GetInstance()-> 221 if (!ChromotingJni::GetInstance()->
201 ui_task_runner()->BelongsToCurrentThread()) { 222 ui_task_runner()->BelongsToCurrentThread()) {
202 ChromotingJni::GetInstance()->ui_task_runner()->PostTask( 223 ChromotingJni::GetInstance()->ui_task_runner()->PostTask(
203 FROM_HERE, 224 FROM_HERE,
204 base::Bind(&ChromotingJniInstance::FetchSecret, 225 base::Bind(&ChromotingJniInstance::FetchSecret,
205 this, 226 this,
206 pairable, 227 pairable,
207 callback)); 228 callback));
208 return; 229 return;
209 } 230 }
210 231
211 pin_callback_ = callback; 232 pin_callback_ = callback;
212 ChromotingJni::GetInstance()->DisplayAuthenticationPrompt(); 233 ChromotingJni::GetInstance()->DisplayAuthenticationPrompt();
213 } 234 }
214 235
215 } // namespace remoting 236 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698