// C++ types for ContentProtection API.
// Generated automatically from 'IContentProtection.h'. DO NOT EDIT.

// Note: This code is inherently not thread safe. If required, proper synchronisation must be added.

#pragma once

#include <core/JSON.h>
#include <interfaces/IContentProtection.h>

namespace Thunder {

namespace JsonData {

    PUSH_WARNING(DISABLE_WARNING_TYPE_LIMITS)

    namespace ContentProtection {

        // Method params/result classes
        //

        class CloseDrmSessionParamsData : public Core::JSON::Container {
        public:
            CloseDrmSessionParamsData()
                : Core::JSON::Container()
            {
                Add(_T("sessionId"), &SessionId);
            }

            CloseDrmSessionParamsData(const CloseDrmSessionParamsData&) = delete;
            CloseDrmSessionParamsData(CloseDrmSessionParamsData&&) noexcept  = delete;

            CloseDrmSessionParamsData& operator=(const CloseDrmSessionParamsData&) = delete;
            CloseDrmSessionParamsData& operator=(CloseDrmSessionParamsData&&) noexcept  = delete;

            ~CloseDrmSessionParamsData() = default;

        public:
            bool IsDataValid() const
            {
                return (SessionId.IsSet() == true);
            }

        public:
            Core::JSON::DecUInt32 SessionId; // sec manager generated playback session id
        }; // class CloseDrmSessionParamsData

        class OpenDrmSessionParamsData : public Core::JSON::Container {
        public:
            OpenDrmSessionParamsData()
                : Core::JSON::Container()
            {
                Add(_T("clientId"), &ClientId);
                Add(_T("appId"), &AppId);
                Add(_T("keySystem"), &KeySystem);
                Add(_T("licenseRequest"), &LicenseRequest);
                Add(_T("initData"), &InitData);
            }

            OpenDrmSessionParamsData(const OpenDrmSessionParamsData&) = delete;
            OpenDrmSessionParamsData(OpenDrmSessionParamsData&&) noexcept  = delete;

            OpenDrmSessionParamsData& operator=(const OpenDrmSessionParamsData&) = delete;
            OpenDrmSessionParamsData& operator=(OpenDrmSessionParamsData&&) noexcept  = delete;

            ~OpenDrmSessionParamsData() = default;

        public:
            bool IsDataValid() const
            {
                return ((ClientId.IsSet() == true) && (AppId.IsSet() == true) && (KeySystem.IsSet() == true) && (LicenseRequest.IsSet() == true) && (InitData.IsSet() == true));
            }

        public:
            Core::JSON::String ClientId; // client that establishes the playback session
            Core::JSON::String AppId; // application requesting the new watermarking session
            Core::JSON::EnumType<Exchange::IContentProtection::KeySystem> KeySystem;
            Core::JSON::String LicenseRequest; // base64-encoded DRM license request
            Core::JSON::String InitData; // video platform specific init data
        }; // class OpenDrmSessionParamsData

        class OpenDrmSessionResultData : public Core::JSON::Container {
        public:
            OpenDrmSessionResultData()
                : Core::JSON::Container()
            {
                Add(_T("sessionId"), &SessionId);
                Add(_T("openSessionResponse"), &Response);
            }

            OpenDrmSessionResultData(const OpenDrmSessionResultData&) = delete;
            OpenDrmSessionResultData(OpenDrmSessionResultData&&) noexcept  = delete;

            OpenDrmSessionResultData& operator=(const OpenDrmSessionResultData&) = delete;
            OpenDrmSessionResultData& operator=(OpenDrmSessionResultData&&) noexcept  = delete;

            ~OpenDrmSessionResultData() = default;

        public:
            bool IsDataValid() const
            {
                return ((SessionId.IsSet() == true) && (Response.IsSet() == true));
            }

        public:
            Core::JSON::DecUInt32 SessionId; // generated by SecManager to track sessions
            Core::JSON::String Response; // video platform specific response data
        }; // class OpenDrmSessionResultData

        class SetDrmSessionStateParamsData : public Core::JSON::Container {
        public:
            SetDrmSessionStateParamsData()
                : Core::JSON::Container()
            {
                Add(_T("sessionId"), &SessionId);
                Add(_T("sessionState"), &SessionState);
            }

            SetDrmSessionStateParamsData(const SetDrmSessionStateParamsData&) = delete;
            SetDrmSessionStateParamsData(SetDrmSessionStateParamsData&&) noexcept  = delete;

            SetDrmSessionStateParamsData& operator=(const SetDrmSessionStateParamsData&) = delete;
            SetDrmSessionStateParamsData& operator=(SetDrmSessionStateParamsData&&) noexcept  = delete;

            ~SetDrmSessionStateParamsData() = default;

        public:
            bool IsDataValid() const
            {
                return ((SessionId.IsSet() == true) && (SessionState.IsSet() == true));
            }

        public:
            Core::JSON::DecUInt32 SessionId; // sec manager generated playback session id
            Core::JSON::EnumType<Exchange::IContentProtection::State> SessionState;
        }; // class SetDrmSessionStateParamsData

        class SetPlaybackPositionParamsData : public Core::JSON::Container {
        public:
            SetPlaybackPositionParamsData()
                : Core::JSON::Container()
            {
                Add(_T("sessionId"), &SessionId);
                Add(_T("speed"), &Speed);
                Add(_T("position"), &Position);
            }

            SetPlaybackPositionParamsData(const SetPlaybackPositionParamsData&) = delete;
            SetPlaybackPositionParamsData(SetPlaybackPositionParamsData&&) noexcept  = delete;

            SetPlaybackPositionParamsData& operator=(const SetPlaybackPositionParamsData&) = delete;
            SetPlaybackPositionParamsData& operator=(SetPlaybackPositionParamsData&&) noexcept  = delete;

            ~SetPlaybackPositionParamsData() = default;

        public:
            bool IsDataValid() const
            {
                return ((SessionId.IsSet() == true) && (Speed.IsSet() == true) && (Position.IsSet() == true));
            }

        public:
            Core::JSON::DecUInt32 SessionId; // sec manager generated playback session id
            Core::JSON::DecSInt32 Speed; // current playback speed
            Core::JSON::DecSInt32 Position; // current playback position
        }; // class SetPlaybackPositionParamsData

        class ShowWatermarkParamsData : public Core::JSON::Container {
        public:
            ShowWatermarkParamsData()
                : Core::JSON::Container()
            {
                Add(_T("sessionId"), &SessionId);
                Add(_T("show"), &Show);
                Add(_T("opacityLevel"), &OpacityLevel);
            }

            ShowWatermarkParamsData(const ShowWatermarkParamsData&) = delete;
            ShowWatermarkParamsData(ShowWatermarkParamsData&&) noexcept  = delete;

            ShowWatermarkParamsData& operator=(const ShowWatermarkParamsData&) = delete;
            ShowWatermarkParamsData& operator=(ShowWatermarkParamsData&&) noexcept  = delete;

            ~ShowWatermarkParamsData() = default;

        public:
            bool IsDataValid() const
            {
                return ((SessionId.IsSet() == true) && (Show.IsSet() == true) && (((OpacityLevel.IsSet() == true) && (OpacityLevel.Value() <= 100))));
            }

        public:
            Core::JSON::DecUInt32 SessionId; // id returned on a call to openDrmSession
            Core::JSON::Boolean Show; // true when watermark has to be presented
            Core::JSON::DecUInt8 OpacityLevel;
        }; // class ShowWatermarkParamsData

        class UpdateDrmSessionParamsData : public Core::JSON::Container {
        public:
            UpdateDrmSessionParamsData()
                : Core::JSON::Container()
            {
                Add(_T("sessionId"), &SessionId);
                Add(_T("licenseRequest"), &LicenseRequest);
                Add(_T("initData"), &InitData);
            }

            UpdateDrmSessionParamsData(const UpdateDrmSessionParamsData&) = delete;
            UpdateDrmSessionParamsData(UpdateDrmSessionParamsData&&) noexcept  = delete;

            UpdateDrmSessionParamsData& operator=(const UpdateDrmSessionParamsData&) = delete;
            UpdateDrmSessionParamsData& operator=(UpdateDrmSessionParamsData&&) noexcept  = delete;

            ~UpdateDrmSessionParamsData() = default;

        public:
            bool IsDataValid() const
            {
                return ((SessionId.IsSet() == true) && (LicenseRequest.IsSet() == true) && (InitData.IsSet() == true));
            }

        public:
            Core::JSON::DecUInt32 SessionId; // sec manager generated playback session id
            Core::JSON::String LicenseRequest; // base64-encoded DRM license request
            Core::JSON::String InitData; // video platform specific init data
        }; // class UpdateDrmSessionParamsData

        class WatermarkStatusChangedParamsData : public Core::JSON::Container {
        public:
            class StatusData : public Core::JSON::Container {
            public:
                StatusData()
                    : Core::JSON::Container()
                {
                    _Init();
                }

                StatusData(const StatusData& _other)
                    : Core::JSON::Container()
                    , State(_other.State)
                    , FailureReason(_other.FailureReason)
                {
                    _Init();
                }

                StatusData(StatusData&& _other) noexcept
                    : Core::JSON::Container()
                    , State(std::move(_other.State))
                    , FailureReason(std::move(_other.FailureReason))
                {
                    _Init();
                }

                StatusData(const Exchange::IContentProtection::INotification::Status& _other)
                    : Core::JSON::Container()
                {
                    State = _other.state;
                    FailureReason = _other.failureReason;
                    _Init();
                }

                StatusData& operator=(const StatusData& _rhs)
                {
                    State = _rhs.State;
                    FailureReason = _rhs.FailureReason;
                    return (*this);
                }

                StatusData& operator=(StatusData&& _rhs) noexcept
                {
                    State = std::move(_rhs.State);
                    FailureReason = std::move(_rhs.FailureReason);
                    return (*this);
                }

                StatusData& operator=(const Exchange::IContentProtection::INotification::Status& _rhs)
                {
                    State = _rhs.state;
                    FailureReason = _rhs.failureReason;
                    return (*this);
                }

                operator Exchange::IContentProtection::INotification::Status() const
                {
                    Exchange::IContentProtection::INotification::Status _value{};
                    _value.state = State;
                    _value.failureReason = FailureReason;
                    return (_value);
                }

                ~StatusData() = default;

            public:
                bool IsDataValid() const
                {
                    return ((State.IsSet() == true) && (FailureReason.IsSet() == true));
                }

            private:
                void _Init()
                {
                    Add(_T("state"), &State);
                    Add(_T("failureReason"), &FailureReason);
                }

            public:
                Core::JSON::EnumType<Exchange::IContentProtection::INotification::Status::State> State;
                Core::JSON::DecSInt32 FailureReason; // same as that returned by the SecManager. For other cases greater than 20000
            }; // class StatusData

            WatermarkStatusChangedParamsData()
                : Core::JSON::Container()
            {
                Add(_T("sessionId"), &SessionId);
                Add(_T("appId"), &AppId);
                Add(_T("status"), &Status);
            }

            WatermarkStatusChangedParamsData(const WatermarkStatusChangedParamsData&) = delete;
            WatermarkStatusChangedParamsData(WatermarkStatusChangedParamsData&&) noexcept  = delete;

            WatermarkStatusChangedParamsData& operator=(const WatermarkStatusChangedParamsData&) = delete;
            WatermarkStatusChangedParamsData& operator=(WatermarkStatusChangedParamsData&&) noexcept  = delete;

            ~WatermarkStatusChangedParamsData() = default;

        public:
            bool IsDataValid() const
            {
                return ((SessionId.IsSet() == true) && (AppId.IsSet() == true) && ((Status.IsSet() == true) && (Status.IsDataValid() == true)));
            }

        public:
            Core::JSON::DecUInt32 SessionId; // session id for the content protection session
            Core::JSON::String AppId; // application that should receive the notification
            WatermarkStatusChangedParamsData::StatusData Status;
        }; // class WatermarkStatusChangedParamsData

    } // namespace ContentProtection

    POP_WARNING()

} // namespace JsonData

// Enum conversion handlers
ENUM_CONVERSION_HANDLER(Exchange::IContentProtection::KeySystem)
ENUM_CONVERSION_HANDLER(Exchange::IContentProtection::State)
ENUM_CONVERSION_HANDLER(Exchange::IContentProtection::INotification::Status::State)

}

