1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/common/gamepad_param_traits.h"
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/pickle.h"
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/string16.h"
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ipc/ipc_message_utils.h"
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebGamepad.h"
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using blink::WebGamepad;
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace {
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void LogWebUCharString(
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const blink::WebUChar web_string[],
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const size_t array_size,
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    std::string* log) {
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::string16 utf16;
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  utf16.reserve(array_size);
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (size_t i = 0; i < array_size && web_string[i]; ++i) {
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    utf16[i] = web_string[i];
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  log->append(base::UTF16ToUTF8(utf16));
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace IPC {
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ParamTraits<WebGamepad>::Write(
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Message* m,
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const WebGamepad& p) {
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  m->WriteData(reinterpret_cast<const char*>(&p), sizeof(WebGamepad));
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ParamTraits<WebGamepad>::Read(
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const Message* m,
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PickleIterator* iter,
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    WebGamepad* p) {
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int length;
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const char* data;
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!m->ReadData(iter, &data, &length) || length != sizeof(WebGamepad))
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return false;
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  memcpy(p, data, sizeof(WebGamepad));
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return true;
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ParamTraits<WebGamepad>::Log(
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const WebGamepad& p,
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    std::string* l) {
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  l->append("WebGamepad(");
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LogParam(p.connected, l);
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LogWebUCharString(p.id, WebGamepad::idLengthCap, l);
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  l->append(",");
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LogWebUCharString(p.mapping, WebGamepad::mappingLengthCap, l);
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  l->append(",");
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LogParam(p.timestamp, l);
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  l->append(",");
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LogParam(p.axesLength, l);
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  l->append(", [");
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (size_t i = 0; i < arraysize(p.axes); ++i) {
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    l->append(base::StringPrintf("%f%s", p.axes[i],
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        i < (arraysize(p.axes) - 1) ? ", " : "], "));
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LogParam(p.buttonsLength, l);
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  l->append(", [");
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (size_t i = 0; i < arraysize(p.buttons); ++i) {
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    l->append(base::StringPrintf("(%u, %f)%s",
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        p.buttons[i].pressed, p.buttons[i].value,
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        i < (arraysize(p.buttons) - 1) ? ", " : "], "));
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  l->append(")");
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace IPC
80