using System.ComponentModel;
/*
* Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the License);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using static Interop;
namespace Tizen.Multimedia.Remoting
{
///
/// Provides the ability to control WebRTC data channel.
///
/// 9
public partial class WebRTCDataChannel
{
private NativeDataChannel.OpenedCallback _webRtcDataChannelOpenedCallback;
private NativeDataChannel.ClosedCallback _webRtcDataChannelClosedCallback;
private NativeDataChannel.MessageReceivedCallback _webRtcDataChannelMsgRecvCallback;
private NativeDataChannel.ErrorOccurredCallback _webRtcDataChannelErrorOccurredCallback;
private NativeDataChannel.BufferedAmountLowThresholdCallback _webRtcDataChannelBufferedAmountLowThresholdCallback;
private event EventHandler _opened;
private event EventHandler _closed;
private event EventHandler _messageReceived;
private event EventHandler _errorOccurred;
private event EventHandler _bufferedAmountLowThresholdOccurred;
///
/// Occurs when the data channel's underlying data transport is established.
///
/// 9
public event EventHandler Opened
{
add
{
if (_opened == null)
{
RegisterDataChannelOpenedCallback();
}
_opened += value;
}
remove
{
_opened -= value;
if (_opened == null)
{
UnregisterDataChannelOpenedCallback();
}
}
}
///
/// Occurs when the data channel has closed down.
///
/// 9
public event EventHandler Closed
{
add
{
if (_closed == null)
{
RegisterDataChannelClosedCallback();
}
_closed += value;
}
remove
{
_closed -= value;
if (_closed == null)
{
UnregisterDataChannelClosedCallback();
}
}
}
///
/// Occurs when a message is received from the remote peer.
///
/// 9
public event EventHandler MessageReceived
{
add
{
if (_messageReceived == null)
{
RegisterDataChannelMessageReceivedCallback();
}
_messageReceived += value;
}
remove
{
_messageReceived -= value;
if (_messageReceived == null)
{
UnregisterDataChannelMessageReceivedCallback();
}
}
}
///
/// Occurs when an error occurs on the data channel.
///
/// 9
public event EventHandler ErrorOccurred
{
add
{
if (_errorOccurred == null)
{
RegisterDataChannelErrorOccurredCallback();
}
_errorOccurred += value;
}
remove
{
_errorOccurred -= value;
if (_errorOccurred == null)
{
UnregisterDataChannelErrorOccurredCallback();
}
}
}
///
/// Occurs when the buffered data amount is lower than .
/// If is not set, this event will not be raised.
///
/// 10
public event EventHandler BufferedAmountLow
{
add
{
if (_bufferedAmountLowThresholdOccurred == null)
{
RegisterDataChannelBufferedAmountLowThresholdCallback();
}
_bufferedAmountLowThresholdOccurred += value;
}
remove
{
_bufferedAmountLowThresholdOccurred -= value;
if (_bufferedAmountLowThresholdOccurred == null)
{
UnregisterDataChannelBufferedAmountLowThresholdCallback();
}
}
}
private void RegisterDataChannelOpenedCallback()
{
_webRtcDataChannelOpenedCallback = (dataChannelHandle, _) =>
{
_opened?.Invoke(this, new EventArgs());
};
NativeDataChannel.SetOpenedCb(_handle, _webRtcDataChannelOpenedCallback).
ThrowIfFailed("Failed to set data channel opened callback.");
}
private void UnregisterDataChannelOpenedCallback()
{
NativeDataChannel.UnsetOpenedCb(_handle).
ThrowIfFailed("Failed to unset data channel opened callback.");
}
private void RegisterDataChannelClosedCallback()
{
_webRtcDataChannelClosedCallback = (dataChannelHandle, _) =>
{
_closed?.Invoke(this, new EventArgs());
};
NativeDataChannel.SetClosedCb(_handle, _webRtcDataChannelClosedCallback).
ThrowIfFailed("Failed to set data channel closed callback.");
}
private void UnregisterDataChannelClosedCallback()
{
NativeDataChannel.UnsetClosedCb(_handle).
ThrowIfFailed("Failed to unset data channel closed callback.");
}
private void RegisterDataChannelMessageReceivedCallback()
{
_webRtcDataChannelMsgRecvCallback = (dataChannelHandle, type, message, _) =>
{
_messageReceived?.Invoke(this, new WebRTCDataChannelMessageReceivedEventArgs(type, message));
};
NativeDataChannel.SetMessageReceivedCb(_handle, _webRtcDataChannelMsgRecvCallback).
ThrowIfFailed("Failed to set data channel message received callback.");
}
private void UnregisterDataChannelMessageReceivedCallback()
{
NativeDataChannel.UnsetMessageReceivedCb(_handle).
ThrowIfFailed("Failed to unset data channel message received callback.");
}
private void RegisterDataChannelErrorOccurredCallback()
{
_webRtcDataChannelErrorOccurredCallback = (dataChannelHandle, error, _) =>
{
_errorOccurred?.Invoke(this, new WebRTCDataChannelErrorOccurredEventArgs((WebRTCError)error));
};
NativeDataChannel.SetErrorOccurredCb(_handle, _webRtcDataChannelErrorOccurredCallback).
ThrowIfFailed("Failed to set data channel error callback.");
}
private void UnregisterDataChannelErrorOccurredCallback()
{
NativeDataChannel.UnsetErrorOccurredCb(_handle).
ThrowIfFailed("Failed to unset data channel error callback.");
}
private void RegisterDataChannelBufferedAmountLowThresholdCallback()
{
if (_webRtcDataChannelBufferedAmountLowThresholdCallback == null)
{
_webRtcDataChannelBufferedAmountLowThresholdCallback = (dataChannelHanel, _) =>
{
_bufferedAmountLowThresholdOccurred?.Invoke(this, new EventArgs());
};
}
NativeDataChannel.SetBufferedAmountLowThresholdCb(_handle, _bufferThreshold.Value,
_webRtcDataChannelBufferedAmountLowThresholdCallback).
ThrowIfFailed("Failed to set buffered amount low threshold callback.");
}
private void UnregisterDataChannelBufferedAmountLowThresholdCallback()
{
NativeDataChannel.UnsetBufferedAmountLowThresholdCb(_handle).
ThrowIfFailed("Failed to unset buffered amount low threshold callback.");
}
}
}