| Index: remoting/host/chromoting_param_traits.cc
|
| diff --git a/remoting/host/chromoting_param_traits.cc b/remoting/host/chromoting_param_traits.cc
|
| index 8b10a7f764308bca6d501b4399a94be2f7891ea4..8050dc19859375fa76c4ae51da96b72739f3de03 100644
|
| --- a/remoting/host/chromoting_param_traits.cc
|
| +++ b/remoting/host/chromoting_param_traits.cc
|
| @@ -5,6 +5,7 @@
|
| #include "remoting/host/chromoting_param_traits.h"
|
|
|
| #include "base/strings/stringprintf.h"
|
| +#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
|
|
|
| namespace IPC {
|
|
|
| @@ -88,6 +89,72 @@ void ParamTraits<webrtc::DesktopRect>::Log(const webrtc::DesktopRect& p,
|
| }
|
|
|
| // static
|
| +void ParamTraits<webrtc::MouseCursor>::Write(
|
| + Message* m,
|
| + const webrtc::MouseCursor& p) {
|
| + ParamTraits<webrtc::DesktopSize>::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<const char*>(p.image()->data()), data.size());
|
| +
|
| + ParamTraits<webrtc::DesktopVector>::Write(m, p.hotspot());
|
| +}
|
| +
|
| +// static
|
| +bool ParamTraits<webrtc::MouseCursor>::Read(
|
| + const Message* m,
|
| + PickleIterator* iter,
|
| + webrtc::MouseCursor* r) {
|
| + webrtc::DesktopSize size;
|
| + if (!ParamTraits<webrtc::DesktopSize>::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 (!m->ReadData(iter, &data, &data_length) ||
|
| + data_length != expected_length) {
|
| + return false;
|
| + }
|
| +
|
| + webrtc::DesktopVector hotspot;
|
| + if (!ParamTraits<webrtc::DesktopVector>::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<webrtc::MouseCursor>::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<remoting::ScreenResolution>::Write(
|
| Message* m,
|
| const remoting::ScreenResolution& p) {
|
|
|