using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Paho.MqttDotnet
{
///
/// 表示Mqtt选项抽象
///
///
unsafe abstract class MqttOptionsBase : IMqttOptions
where TOption : IMQTTAsync_options, new()
{
///
/// 完成委托
///
private OptionCompletedHandler complectedAction;
///
/// 异常委托
///
private OptionExceptionHandler exceptionAction;
///
/// 执行成功委托
///
private readonly MQTTAsync_onSuccess onSuccess;
///
/// 执行失败委托
///
private readonly MQTTAsync_onFailure onFailure;
///
/// Mqtt选项抽象
///
public MqttOptionsBase()
{
this.onSuccess = new MQTTAsync_onSuccess(this.MQTTAsync_onSuccess);
this.onFailure = new MQTTAsync_onFailure(this.MQTTAsync_onFailure);
}
///
/// 执行成功
///
/// 上下文
/// 数据
protected abstract void MQTTAsync_onSuccess(IntPtr context, void* successData);
///
/// 执行失败
///
/// 上下文
/// 数据
protected abstract void MQTTAsync_onFailure(IntPtr context, MQTTAsync_failureData* failureData);
///
/// 触发执行完成
///
/// 上下文
/// 结果
protected void RaiseOnCompleted(IntPtr context, object value)
{
if (this.complectedAction != null)
{
var taskId = context.ToInt32();
this.complectedAction.Invoke(taskId, value);
}
}
///
/// 触发执行异常
///
/// 上下文
/// 异常
protected void RaiseOnException(IntPtr context, Exception ex)
{
if (this.exceptionAction != null)
{
var taskId = context.ToInt32();
this.exceptionAction.Invoke(taskId, ex);
}
}
///
/// 转换为结构体
///
/// 任务id
/// 要合并的结构
///
public TOption ToStruct(int taskId, TOption opt)
{
opt.SetContext(new IntPtr(taskId));
opt.SetCallbacks(this.onSuccess, this.onFailure);
return opt;
}
///
/// 转换为结构体
///
/// 任务id
///
public TOption ToStruct(int taskId)
{
var opt = new TOption();
opt.Init();
opt.SetContext(new IntPtr(taskId));
opt.SetCallbacks(this.onSuccess, this.onFailure);
return opt;
}
///
/// 设置完成的委托
///
///
void IMqttOptions.OnCompleted(OptionCompletedHandler action)
{
this.complectedAction = action;
}
///
/// 设置异常委托
///
///
void IMqttOptions.OnException(OptionExceptionHandler action)
{
this.exceptionAction = action;
}
}
}