blob: b8773f059628bc55f8e2090bba8c1eba94f13fcc [file] [log] [blame]
[email protected]b9ed58f2013-05-16 10:45:241// Copyright 2013 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 "remoting/host/chromoting_param_traits.h"
6
avic5960f32015-12-22 22:49:487#include <stdint.h>
Erik Jensen8f1acc12019-01-14 20:18:318#include <sstream>
avic5960f32015-12-22 22:49:489
[email protected]eaf92532013-06-11 07:39:1910#include "base/strings/stringprintf.h"
zijiehef401c5182017-07-19 00:21:4611#include "ipc/ipc_message_protobuf_utils.h"
martijna46bd47a2016-04-06 18:05:4812#include "ipc/ipc_message_utils.h"
Erik Jensen8f1acc12019-01-14 20:18:3113#include "remoting/protocol/file_transfer_helpers.h"
[email protected]20013202014-08-08 06:33:5014#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
[email protected]b9ed58f2013-05-16 10:45:2415
16namespace IPC {
17
Gary Kacmarcik91f5ed42018-11-29 22:24:1418// webrtc::DesktopVector
19
[email protected]b9ed58f2013-05-16 10:45:2420// static
rockot502c94f2016-02-03 20:20:1621void ParamTraits<webrtc::DesktopVector>::Write(base::Pickle* m,
[email protected]b9ed58f2013-05-16 10:45:2422 const webrtc::DesktopVector& p) {
23 m->WriteInt(p.x());
24 m->WriteInt(p.y());
25}
26
27// static
rockot502c94f2016-02-03 20:20:1628bool ParamTraits<webrtc::DesktopVector>::Read(const base::Pickle* m,
brettwbd4d7112015-06-03 04:29:2529 base::PickleIterator* iter,
[email protected]b9ed58f2013-05-16 10:45:2430 webrtc::DesktopVector* r) {
31 int x, y;
avi48fc13b2014-12-28 23:31:4832 if (!iter->ReadInt(&x) || !iter->ReadInt(&y))
[email protected]b9ed58f2013-05-16 10:45:2433 return false;
34 *r = webrtc::DesktopVector(x, y);
35 return true;
36}
37
38// static
39void ParamTraits<webrtc::DesktopVector>::Log(const webrtc::DesktopVector& p,
40 std::string* l) {
41 l->append(base::StringPrintf("webrtc::DesktopVector(%d, %d)",
42 p.x(), p.y()));
43}
44
Gary Kacmarcik91f5ed42018-11-29 22:24:1445// webrtc::DesktopSize
46
[email protected]b9ed58f2013-05-16 10:45:2447// static
rockot502c94f2016-02-03 20:20:1648void ParamTraits<webrtc::DesktopSize>::Write(base::Pickle* m,
[email protected]b9ed58f2013-05-16 10:45:2449 const webrtc::DesktopSize& p) {
50 m->WriteInt(p.width());
51 m->WriteInt(p.height());
52}
53
54// static
rockot502c94f2016-02-03 20:20:1655bool ParamTraits<webrtc::DesktopSize>::Read(const base::Pickle* m,
brettwbd4d7112015-06-03 04:29:2556 base::PickleIterator* iter,
[email protected]b9ed58f2013-05-16 10:45:2457 webrtc::DesktopSize* r) {
58 int width, height;
avi48fc13b2014-12-28 23:31:4859 if (!iter->ReadInt(&width) || !iter->ReadInt(&height))
[email protected]b9ed58f2013-05-16 10:45:2460 return false;
61 *r = webrtc::DesktopSize(width, height);
62 return true;
63}
64
65// static
66void ParamTraits<webrtc::DesktopSize>::Log(const webrtc::DesktopSize& p,
67 std::string* l) {
68 l->append(base::StringPrintf("webrtc::DesktopSize(%d, %d)",
69 p.width(), p.height()));
70}
71
Gary Kacmarcik91f5ed42018-11-29 22:24:1472// webrtc::DesktopRect
73
[email protected]b9ed58f2013-05-16 10:45:2474// static
rockot502c94f2016-02-03 20:20:1675void ParamTraits<webrtc::DesktopRect>::Write(base::Pickle* m,
[email protected]b9ed58f2013-05-16 10:45:2476 const webrtc::DesktopRect& p) {
77 m->WriteInt(p.left());
78 m->WriteInt(p.top());
79 m->WriteInt(p.right());
80 m->WriteInt(p.bottom());
81}
82
83// static
rockot502c94f2016-02-03 20:20:1684bool ParamTraits<webrtc::DesktopRect>::Read(const base::Pickle* m,
brettwbd4d7112015-06-03 04:29:2585 base::PickleIterator* iter,
[email protected]b9ed58f2013-05-16 10:45:2486 webrtc::DesktopRect* r) {
87 int left, right, top, bottom;
avi48fc13b2014-12-28 23:31:4888 if (!iter->ReadInt(&left) || !iter->ReadInt(&top) ||
89 !iter->ReadInt(&right) || !iter->ReadInt(&bottom)) {
[email protected]b9ed58f2013-05-16 10:45:2490 return false;
91 }
92 *r = webrtc::DesktopRect::MakeLTRB(left, top, right, bottom);
93 return true;
94}
95
96// static
97void ParamTraits<webrtc::DesktopRect>::Log(const webrtc::DesktopRect& p,
98 std::string* l) {
99 l->append(base::StringPrintf("webrtc::DesktopRect(%d, %d, %d, %d)",
100 p.left(), p.top(), p.right(), p.bottom()));
101}
102
Gary Kacmarcik91f5ed42018-11-29 22:24:14103// webrtc::MouseCursor
104
[email protected]b9ed58f2013-05-16 10:45:24105// static
rockot502c94f2016-02-03 20:20:16106void ParamTraits<webrtc::MouseCursor>::Write(base::Pickle* m,
107 const webrtc::MouseCursor& p) {
[email protected]20013202014-08-08 06:33:50108 ParamTraits<webrtc::DesktopSize>::Write(m, p.image()->size());
109
110 // Data is serialized in such a way that size is exactly width * height *
111 // |kBytesPerPixel|.
112 std::string data;
113 uint8_t* current_row = p.image()->data();
114 for (int y = 0; y < p.image()->size().height(); ++y) {
115 data.append(current_row,
116 current_row + p.image()->size().width() *
117 webrtc::DesktopFrame::kBytesPerPixel);
118 current_row += p.image()->stride();
119 }
120 m->WriteData(reinterpret_cast<const char*>(p.image()->data()), data.size());
121
122 ParamTraits<webrtc::DesktopVector>::Write(m, p.hotspot());
123}
124
125// static
rockot502c94f2016-02-03 20:20:16126bool ParamTraits<webrtc::MouseCursor>::Read(const base::Pickle* m,
brettwbd4d7112015-06-03 04:29:25127 base::PickleIterator* iter,
128 webrtc::MouseCursor* r) {
[email protected]20013202014-08-08 06:33:50129 webrtc::DesktopSize size;
130 if (!ParamTraits<webrtc::DesktopSize>::Read(m, iter, &size) ||
131 size.width() <= 0 || size.width() > (SHRT_MAX / 2) ||
132 size.height() <= 0 || size.height() > (SHRT_MAX / 2)) {
133 return false;
134 }
135
136 const int expected_length =
137 size.width() * size.height() * webrtc::DesktopFrame::kBytesPerPixel;
138
139 const char* data;
140 int data_length;
avi48fc13b2014-12-28 23:31:48141 if (!iter->ReadData(&data, &data_length) || data_length != expected_length)
[email protected]20013202014-08-08 06:33:50142 return false;
[email protected]20013202014-08-08 06:33:50143
144 webrtc::DesktopVector hotspot;
145 if (!ParamTraits<webrtc::DesktopVector>::Read(m, iter, &hotspot))
146 return false;
147
148 webrtc::BasicDesktopFrame* image = new webrtc::BasicDesktopFrame(size);
149 memcpy(image->data(), data, data_length);
150
151 r->set_image(image);
152 r->set_hotspot(hotspot);
153 return true;
154}
155
156// static
157void ParamTraits<webrtc::MouseCursor>::Log(
158 const webrtc::MouseCursor& p,
159 std::string* l) {
160 l->append(base::StringPrintf(
161 "webrtc::DesktopRect{image(%d, %d), hotspot(%d, %d)}",
162 p.image()->size().width(), p.image()->size().height(),
163 p.hotspot().x(), p.hotspot().y()));
164}
165
Gary Kacmarcik91f5ed42018-11-29 22:24:14166// remoting::ScreenResolution
[email protected]20013202014-08-08 06:33:50167
168// static
[email protected]b9ed58f2013-05-16 10:45:24169void ParamTraits<remoting::ScreenResolution>::Write(
rockot502c94f2016-02-03 20:20:16170 base::Pickle* m,
[email protected]b9ed58f2013-05-16 10:45:24171 const remoting::ScreenResolution& p) {
172 ParamTraits<webrtc::DesktopSize>::Write(m, p.dimensions());
173 ParamTraits<webrtc::DesktopVector>::Write(m, p.dpi());
174}
175
176// static
177bool ParamTraits<remoting::ScreenResolution>::Read(
rockot502c94f2016-02-03 20:20:16178 const base::Pickle* m,
brettwbd4d7112015-06-03 04:29:25179 base::PickleIterator* iter,
[email protected]b9ed58f2013-05-16 10:45:24180 remoting::ScreenResolution* r) {
181 webrtc::DesktopSize size;
182 webrtc::DesktopVector dpi;
183 if (!ParamTraits<webrtc::DesktopSize>::Read(m, iter, &size) ||
184 !ParamTraits<webrtc::DesktopVector>::Read(m, iter, &dpi)) {
185 return false;
186 }
187 if (size.width() < 0 || size.height() < 0 ||
188 dpi.x() < 0 || dpi.y() < 0) {
189 return false;
190 }
191 *r = remoting::ScreenResolution(size, dpi);
192 return true;
193}
194
195// static
196void ParamTraits<remoting::ScreenResolution>::Log(
197 const remoting::ScreenResolution& p,
198 std::string* l) {
199 l->append(base::StringPrintf("webrtc::ScreenResolution(%d, %d, %d, %d)",
200 p.dimensions().width(), p.dimensions().height(),
201 p.dpi().x(), p.dpi().y()));
202}
203
Gary Kacmarcik91f5ed42018-11-29 22:24:14204// remoting::DesktopEnvironmentOptions
205
sergeyuc986f522016-11-28 22:51:01206// static
207void ParamTraits<remoting::DesktopEnvironmentOptions>::Write(
208 base::Pickle* m,
209 const remoting::DesktopEnvironmentOptions& p) {
210 m->WriteBool(p.enable_curtaining());
211 m->WriteBool(p.enable_user_interface());
212 m->WriteBool(p.desktop_capture_options()->use_update_notifications());
213 m->WriteBool(p.desktop_capture_options()->disable_effects());
214 m->WriteBool(p.desktop_capture_options()->detect_updated_region());
215#if defined(WEBRTC_WIN)
216 m->WriteBool(p.desktop_capture_options()->allow_use_magnification_api());
217 m->WriteBool(p.desktop_capture_options()->allow_directx_capturer());
218#endif // defined(WEBRTC_WIN)
219}
220
221// static
222bool ParamTraits<remoting::DesktopEnvironmentOptions>::Read(
223 const base::Pickle* m,
224 base::PickleIterator* iter,
225 remoting::DesktopEnvironmentOptions* r) {
226 *r = remoting::DesktopEnvironmentOptions::CreateDefault();
227 bool enable_curtaining;
228 bool enable_user_interface;
229 bool use_update_notifications;
230 bool disable_effects;
231 bool detect_updated_region;
232
233 if (!iter->ReadBool(&enable_curtaining) ||
234 !iter->ReadBool(&enable_user_interface) ||
235 !iter->ReadBool(&use_update_notifications) ||
236 !iter->ReadBool(&disable_effects) ||
237 !iter->ReadBool(&detect_updated_region)) {
238 return false;
239 }
240
241 r->set_enable_curtaining(enable_curtaining);
242 r->set_enable_user_interface(enable_user_interface);
243 r->desktop_capture_options()->set_use_update_notifications(
244 use_update_notifications);
245 r->desktop_capture_options()->set_detect_updated_region(
246 detect_updated_region);
247 r->desktop_capture_options()->set_disable_effects(disable_effects);
248
249#if defined(WEBRTC_WIN)
250 bool allow_use_magnification_api;
251 bool allow_directx_capturer;
252
253 if (!iter->ReadBool(&allow_use_magnification_api) ||
254 !iter->ReadBool(&allow_directx_capturer)) {
255 return false;
256 }
257
258 r->desktop_capture_options()->set_allow_use_magnification_api(
259 allow_use_magnification_api);
260 r->desktop_capture_options()->set_allow_directx_capturer(
261 allow_directx_capturer);
262#endif // defined(WEBRTC_WIN)
263
264 return true;
265}
266
267// static
268void ParamTraits<remoting::DesktopEnvironmentOptions>::Log(
269 const remoting::DesktopEnvironmentOptions& p,
270 std::string* l) {
271 l->append("DesktopEnvironmentOptions()");
272}
273
Gary Kacmarcik91f5ed42018-11-29 22:24:14274// remoting::protocol::ProcessResourceUsage
275
zijiehe36763d82017-06-19 23:52:31276// static
zijiehef401c5182017-07-19 00:21:46277void ParamTraits<remoting::protocol::ProcessResourceUsage>::Write(
zijiehe36763d82017-06-19 23:52:31278 base::Pickle* m,
zijiehef401c5182017-07-19 00:21:46279 const param_type& p) {
280 m->WriteString(p.process_name());
zijiehe36763d82017-06-19 23:52:31281 m->WriteDouble(p.processor_usage());
282 m->WriteUInt64(p.working_set_size());
283 m->WriteUInt64(p.pagefile_size());
284}
285
286// static
zijiehef401c5182017-07-19 00:21:46287bool ParamTraits<remoting::protocol::ProcessResourceUsage>::Read(
zijiehe36763d82017-06-19 23:52:31288 const base::Pickle* m,
289 base::PickleIterator* iter,
zijiehef401c5182017-07-19 00:21:46290 param_type* p) {
291 std::string process_name;
zijiehe36763d82017-06-19 23:52:31292 double processor_usage;
293 uint64_t working_set_size;
294 uint64_t pagefile_size;
zijiehef401c5182017-07-19 00:21:46295 if (!iter->ReadString(&process_name) ||
zijiehe36763d82017-06-19 23:52:31296 !iter->ReadDouble(&processor_usage) ||
297 !iter->ReadUInt64(&working_set_size) ||
298 !iter->ReadUInt64(&pagefile_size)) {
299 return false;
300 }
301
zijiehef401c5182017-07-19 00:21:46302 p->set_process_name(process_name);
zijiehe36763d82017-06-19 23:52:31303 p->set_processor_usage(processor_usage);
304 p->set_working_set_size(working_set_size);
305 p->set_pagefile_size(pagefile_size);
306 return true;
307}
308
309// static
zijiehef401c5182017-07-19 00:21:46310void ParamTraits<remoting::protocol::ProcessResourceUsage>::Log(
311 const param_type& p,
zijiehe36763d82017-06-19 23:52:31312 std::string* l) {
zijiehef401c5182017-07-19 00:21:46313 l->append("ProcessResourceUsage(").append(p.process_name()).append(")");
314}
315
Gary Kacmarcik91f5ed42018-11-29 22:24:14316// remoting::protocol::AggregatedProcessResourceUsage
317
zijiehef401c5182017-07-19 00:21:46318// static
zijiehef401c5182017-07-19 00:21:46319void ParamTraits<remoting::protocol::AggregatedProcessResourceUsage>::Write(
320 base::Pickle* m,
321 const param_type& p) {
322 WriteParam(m, p.usages());
323}
324
325// static
326bool ParamTraits<remoting::protocol::AggregatedProcessResourceUsage>::Read(
327 const base::Pickle* m,
328 base::PickleIterator* iter,
329 param_type* p) {
330 return ReadParam(m, iter, p->mutable_usages());
331}
332
333// static
334void ParamTraits<remoting::protocol::AggregatedProcessResourceUsage>::Log(
335 const param_type& p,
336 std::string* l) {
337 l->append("AggregatedProcessResourceUsage(");
338 LogParam(p.usages(), l);
339 l->append(")");
zijiehe36763d82017-06-19 23:52:31340}
341
Gary Kacmarcik91f5ed42018-11-29 22:24:14342// remoting::protocol::ActionRequest
343
Joe Downing505ae0d02018-10-17 17:47:30344// static
345void ParamTraits<remoting::protocol::ActionRequest>::Write(
346 base::Pickle* m,
347 const param_type& p) {
348 std::string serialized_action_request;
349 bool result = p.SerializeToString(&serialized_action_request);
350 DCHECK(result);
351 m->WriteString(serialized_action_request);
352}
353
354// static
355bool ParamTraits<remoting::protocol::ActionRequest>::Read(
356 const base::Pickle* m,
357 base::PickleIterator* iter,
358 param_type* p) {
359 std::string serialized_action_request;
360 if (!iter->ReadString(&serialized_action_request))
361 return false;
362
363 return p->ParseFromString(serialized_action_request);
364}
365
366// static
367void ParamTraits<remoting::protocol::ActionRequest>::Log(const param_type& p,
368 std::string* l) {
369 l->append(base::StringPrintf("ActionRequest action: %d, id: %u", p.action(),
370 p.request_id()));
371}
372
Gary Kacmarcik91f5ed42018-11-29 22:24:14373// remoting::protocol::VideoLayout
[email protected]b9ed58f2013-05-16 10:45:24374
Gary Kacmarcik91f5ed42018-11-29 22:24:14375// static
376void ParamTraits<remoting::protocol::VideoLayout>::Write(
377 base::Pickle* m,
378 const remoting::protocol::VideoLayout& p) {
379 std::string serialized_video_layout;
380 bool result = p.SerializeToString(&serialized_video_layout);
381 DCHECK(result);
382 m->WriteString(serialized_video_layout);
383}
384
385// static
386bool ParamTraits<remoting::protocol::VideoLayout>::Read(
387 const base::Pickle* m,
388 base::PickleIterator* iter,
389 remoting::protocol::VideoLayout* p) {
390 std::string serialized_video_layout;
391 if (!iter->ReadString(&serialized_video_layout))
392 return false;
393
394 return p->ParseFromString(serialized_video_layout);
395}
396
397// static
398void ParamTraits<remoting::protocol::VideoLayout>::Log(
399 const remoting::protocol::VideoLayout& p,
400 std::string* l) {
401 l->append(base::StringPrintf("protocol::VideoLayout(["));
402 for (int i = 0; i < p.video_track_size(); i++) {
403 remoting::protocol::VideoTrackLayout track = p.video_track(i);
404 l->append("])");
405 if (i != 0)
406 l->append(",");
407 l->append(base::StringPrintf("{(%d,%d) %dx%d}", track.position_x(),
408 track.position_y(), track.width(),
409 track.height()));
410 }
411 l->append("])");
412}
413
Erik Jensenc08ecf112019-12-19 00:29:49414// remoting::protocol::KeyboardLayout
415
416// static
417void ParamTraits<remoting::protocol::KeyboardLayout>::Write(
418 base::Pickle* m,
419 const remoting::protocol::KeyboardLayout& p) {
420 std::string serialized_keyboard_layout;
421 bool result = p.SerializeToString(&serialized_keyboard_layout);
422 DCHECK(result);
423 m->WriteString(serialized_keyboard_layout);
424}
425
426// static
427bool ParamTraits<remoting::protocol::KeyboardLayout>::Read(
428 const base::Pickle* m,
429 base::PickleIterator* iter,
430 remoting::protocol::KeyboardLayout* p) {
431 std::string serialized_keyboard_layout;
432 if (!iter->ReadString(&serialized_keyboard_layout))
433 return false;
434
435 return p->ParseFromString(serialized_keyboard_layout);
436}
437
438// static
439void ParamTraits<remoting::protocol::KeyboardLayout>::Log(
440 const remoting::protocol::KeyboardLayout& p,
441 std::string* l) {
442 l->append("[protocol::KeyboardLayout]");
443}
444
Erik Jensen8f1acc12019-01-14 20:18:31445// remoting::protocol::FileTransfer_Error
446
447// static
448void IPC::ParamTraits<remoting::protocol::FileTransfer_Error>::Write(
449 base::Pickle* m,
450 const param_type& p) {
451 std::string serialized_file_transfer_error;
452 bool result = p.SerializeToString(&serialized_file_transfer_error);
453 DCHECK(result);
454 m->WriteString(serialized_file_transfer_error);
455}
456
457// static
458bool ParamTraits<remoting::protocol::FileTransfer_Error>::Read(
459 const base::Pickle* m,
460 base::PickleIterator* iter,
461 param_type* p) {
462 std::string serialized_file_transfer_error;
463 if (!iter->ReadString(&serialized_file_transfer_error))
464 return false;
465
466 return p->ParseFromString(serialized_file_transfer_error);
467}
468
469// static
470void ParamTraits<remoting::protocol::FileTransfer_Error>::Log(
471 const param_type& p,
472 std::string* l) {
473 std::ostringstream formatted;
474 formatted << p;
475 l->append(
476 base::StringPrintf("FileTransfer Error: %s", formatted.str().c_str()));
477}
478
Erik Jensen042b4392019-01-17 20:32:31479// remoting::Monostate
480
481// static
482void IPC::ParamTraits<remoting::Monostate>::Write(base::Pickle*,
483 const param_type&) {}
484
485// static
486bool ParamTraits<remoting::Monostate>::Read(const base::Pickle*,
487 base::PickleIterator*,
488 param_type*) {
489 return true;
490}
491
492// static
493void ParamTraits<remoting::Monostate>::Log(const param_type&, std::string* l) {
494 l->append("()");
495}
496
Gary Kacmarcik91f5ed42018-11-29 22:24:14497} // namespace IPC