# Copyright (C) 2016-2017 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#if PLATFORM(IOS_FAMILY) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
messages -> PlaybackSessionManagerProxy {
    CurrentTimeChanged(uint64_t contextId, double currentTime, double hostTime)
    BufferedTimeChanged(uint64_t contextId, double bufferedTime)
    SeekableRangesVectorChanged(uint64_t contextId, Vector<std::pair<double, double>> ranges, double lastModifiedTime, double liveUpdateInterval)
    CanPlayFastReverseChanged(uint64_t contextId, bool value)
    AudioMediaSelectionOptionsChanged(uint64_t contextId, Vector<WebCore::MediaSelectionOption> options, uint64_t selectedIndex)
    LegibleMediaSelectionOptionsChanged(uint64_t contextId, Vector<WebCore::MediaSelectionOption> options, uint64_t selectedIndex)
    AudioMediaSelectionIndexChanged(uint64_t contextId, uint64_t selectedIndex)
    LegibleMediaSelectionIndexChanged(uint64_t contextId, uint64_t selectedIndex)
    ExternalPlaybackPropertiesChanged(uint64_t contextId, bool enabled, uint32_t targetType, String localizedDeviceName)
    WirelessVideoPlaybackDisabledChanged(uint64_t contextId, bool disabled)
    DurationChanged(uint64_t contextId, double duration)
    PlaybackStartedTimeChanged(uint64_t contextId, double playbackStartedTime)
    RateChanged(uint64_t contextId, bool isPlaying, double rate)
    MutedChanged(uint64_t contextId, bool muted);
    VolumeChanged(uint64_t contextId, double volume);
    PictureInPictureSupportedChanged(uint64_t contextID, bool pictureInPictureSupported)
    PictureInPictureActiveChanged(uint64_t contextId, bool pictureInPictureActive)
    SetUpPlaybackControlsManagerWithID(uint64_t contextId)
    ClearPlaybackControlsManager()

    HandleControlledElementIDResponse(uint64_t contextId, String id)
}
#endif
