1/*
2 * Copyright (C) 2011, Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
23 * DAMAGE.
24 */
25
26#include "config.h"
27#include "modules/gamepad/NavigatorGamepad.h"
28
29#include "core/frame/Navigator.h"
30#include "modules/gamepad/GamepadList.h"
31#include "public/platform/Platform.h"
32#include "wtf/PassOwnPtr.h"
33
34namespace WebCore {
35
36static void sampleGamepads(GamepadList* into)
37{
38    blink::WebGamepads gamepads;
39
40    blink::Platform::current()->sampleGamepads(gamepads);
41
42    for (unsigned i = 0; i < blink::WebGamepads::itemsLengthCap; ++i) {
43        blink::WebGamepad& webGamepad = gamepads.items[i];
44        if (i < gamepads.length && webGamepad.connected) {
45            RefPtr<Gamepad> gamepad = into->item(i);
46            if (!gamepad)
47                gamepad = Gamepad::create();
48            gamepad->id(webGamepad.id);
49            gamepad->index(i);
50            gamepad->timestamp(webGamepad.timestamp);
51            gamepad->axes(webGamepad.axesLength, webGamepad.axes);
52            gamepad->buttons(webGamepad.buttonsLength, webGamepad.buttons);
53            into->set(i, gamepad);
54        } else {
55            into->set(i, 0);
56        }
57    }
58}
59
60NavigatorGamepad::NavigatorGamepad()
61{
62}
63
64NavigatorGamepad::~NavigatorGamepad()
65{
66}
67
68const char* NavigatorGamepad::supplementName()
69{
70    return "NavigatorGamepad";
71}
72
73NavigatorGamepad* NavigatorGamepad::from(Navigator* navigator)
74{
75    NavigatorGamepad* supplement = static_cast<NavigatorGamepad*>(Supplement<Navigator>::from(navigator, supplementName()));
76    if (!supplement) {
77        supplement = new NavigatorGamepad();
78        provideTo(navigator, supplementName(), adoptPtr(supplement));
79    }
80    return supplement;
81}
82
83GamepadList* NavigatorGamepad::webkitGetGamepads(Navigator* navigator)
84{
85    return NavigatorGamepad::from(navigator)->gamepads();
86}
87
88GamepadList* NavigatorGamepad::gamepads()
89{
90    if (!m_gamepads)
91        m_gamepads = GamepadList::create();
92    sampleGamepads(m_gamepads.get());
93    return m_gamepads.get();
94}
95
96} // namespace WebCore
97