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