/*
 * Copyright (C) 2018 Igalia, S.L. All right reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 *
 */

#include "config.h"
#include "VRPlatformDisplay.h"

namespace WebCore {

void VRPlatformDisplay::setClient(VRPlatformDisplayClient* client)
{
    ASSERT(!client || !m_client);
    m_client = client;
}

void VRPlatformDisplay::notifyVRPlatformDisplayEvent(Event event)
{
    if (!m_client)
        return;

    switch (event) {
    case Event::Connected:
        m_client->platformDisplayConnected();
        break;
    case Event::Disconnected:
        m_client->platformDisplayDisconnected();
        break;
    case Event::Mounted:
        m_client->platformDisplayMounted();
        break;
    case Event::Unmounted:
        m_client->platformDisplayUnmounted();
        break;
    default:
        ASSERT_NOT_REACHED();
    };
}

} // namespace WebCore
