// Copyright 2013 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 "remoting/host/chromoting_param_traits.h" #include #include "base/strings/stringprintf.h" #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" namespace IPC { // static void ParamTraits::Write(base::Pickle* m, const webrtc::DesktopVector& p) { m->WriteInt(p.x()); m->WriteInt(p.y()); } // static bool ParamTraits::Read(const base::Pickle* m, base::PickleIterator* iter, webrtc::DesktopVector* r) { int x, y; if (!iter->ReadInt(&x) || !iter->ReadInt(&y)) return false; *r = webrtc::DesktopVector(x, y); return true; } // static void ParamTraits::Log(const webrtc::DesktopVector& p, std::string* l) { l->append(base::StringPrintf("webrtc::DesktopVector(%d, %d)", p.x(), p.y())); } // static void ParamTraits::Write(base::Pickle* m, const webrtc::DesktopSize& p) { m->WriteInt(p.width()); m->WriteInt(p.height()); } // static bool ParamTraits::Read(const base::Pickle* m, base::PickleIterator* iter, webrtc::DesktopSize* r) { int width, height; if (!iter->ReadInt(&width) || !iter->ReadInt(&height)) return false; *r = webrtc::DesktopSize(width, height); return true; } // static void ParamTraits::Log(const webrtc::DesktopSize& p, std::string* l) { l->append(base::StringPrintf("webrtc::DesktopSize(%d, %d)", p.width(), p.height())); } // static void ParamTraits::Write(base::Pickle* m, const webrtc::DesktopRect& p) { m->WriteInt(p.left()); m->WriteInt(p.top()); m->WriteInt(p.right()); m->WriteInt(p.bottom()); } // static bool ParamTraits::Read(const base::Pickle* m, base::PickleIterator* iter, webrtc::DesktopRect* r) { int left, right, top, bottom; if (!iter->ReadInt(&left) || !iter->ReadInt(&top) || !iter->ReadInt(&right) || !iter->ReadInt(&bottom)) { return false; } *r = webrtc::DesktopRect::MakeLTRB(left, top, right, bottom); return true; } // static void ParamTraits::Log(const webrtc::DesktopRect& p, std::string* l) { l->append(base::StringPrintf("webrtc::DesktopRect(%d, %d, %d, %d)", p.left(), p.top(), p.right(), p.bottom())); } // static void ParamTraits::Write(base::Pickle* m, const webrtc::MouseCursor& p) { ParamTraits::Write(m, p.image()->size()); // Data is serialized in such a way that size is exactly width * height * // |kBytesPerPixel|. std::string data; uint8_t* current_row = p.image()->data(); for (int y = 0; y < p.image()->size().height(); ++y) { data.append(current_row, current_row + p.image()->size().width() * webrtc::DesktopFrame::kBytesPerPixel); current_row += p.image()->stride(); } m->WriteData(reinterpret_cast(p.image()->data()), data.size()); ParamTraits::Write(m, p.hotspot()); } // static bool ParamTraits::Read(const base::Pickle* m, base::PickleIterator* iter, webrtc::MouseCursor* r) { webrtc::DesktopSize size; if (!ParamTraits::Read(m, iter, &size) || size.width() <= 0 || size.width() > (SHRT_MAX / 2) || size.height() <= 0 || size.height() > (SHRT_MAX / 2)) { return false; } const int expected_length = size.width() * size.height() * webrtc::DesktopFrame::kBytesPerPixel; const char* data; int data_length; if (!iter->ReadData(&data, &data_length) || data_length != expected_length) return false; webrtc::DesktopVector hotspot; if (!ParamTraits::Read(m, iter, &hotspot)) return false; webrtc::BasicDesktopFrame* image = new webrtc::BasicDesktopFrame(size); memcpy(image->data(), data, data_length); r->set_image(image); r->set_hotspot(hotspot); return true; } // static void ParamTraits::Log( const webrtc::MouseCursor& p, std::string* l) { l->append(base::StringPrintf( "webrtc::DesktopRect{image(%d, %d), hotspot(%d, %d)}", p.image()->size().width(), p.image()->size().height(), p.hotspot().x(), p.hotspot().y())); } // static void ParamTraits::Write( base::Pickle* m, const remoting::ScreenResolution& p) { ParamTraits::Write(m, p.dimensions()); ParamTraits::Write(m, p.dpi()); } // static bool ParamTraits::Read( const base::Pickle* m, base::PickleIterator* iter, remoting::ScreenResolution* r) { webrtc::DesktopSize size; webrtc::DesktopVector dpi; if (!ParamTraits::Read(m, iter, &size) || !ParamTraits::Read(m, iter, &dpi)) { return false; } if (size.width() < 0 || size.height() < 0 || dpi.x() < 0 || dpi.y() < 0) { return false; } *r = remoting::ScreenResolution(size, dpi); return true; } // static void ParamTraits::Log( const remoting::ScreenResolution& p, std::string* l) { l->append(base::StringPrintf("webrtc::ScreenResolution(%d, %d, %d, %d)", p.dimensions().width(), p.dimensions().height(), p.dpi().x(), p.dpi().y())); } } // namespace IPC