You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
3.5 KiB
C#
109 lines
3.5 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using uPLibrary.Networking.M2Mqtt.Messages;
|
|
using uPLibrary.Networking.M2Mqtt.Session;
|
|
|
|
namespace uPLibrary.Networking.M2Mqtt.Managers
|
|
{
|
|
/// <summary>
|
|
/// Manager for client session
|
|
/// </summary>
|
|
public class MqttSessionManager
|
|
{
|
|
// subscription info for each client
|
|
private Dictionary<string, MqttBrokerSession> sessions;
|
|
|
|
/// <summary>
|
|
/// Constructor
|
|
/// </summary>
|
|
public MqttSessionManager()
|
|
{
|
|
this.sessions = new Dictionary<string, MqttBrokerSession>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Save session for a client (all related subscriptions)
|
|
/// </summary>
|
|
/// <param name="clientId">Client Id to save subscriptions</param>
|
|
/// <param name="clientSession">Client session with inflight messages</param>
|
|
/// <param name="subscriptions">Subscriptions to save</param>
|
|
public void SaveSession(string clientId, MqttClientSession clientSession, List<MqttSubscription> subscriptions)
|
|
{
|
|
MqttBrokerSession session = null;
|
|
|
|
// session doesn't exist
|
|
if (!this.sessions.ContainsKey(clientId))
|
|
{
|
|
// create new session
|
|
session = new MqttBrokerSession();
|
|
session.ClientId = clientId;
|
|
|
|
// add to sessions list
|
|
this.sessions.Add(clientId, session);
|
|
}
|
|
else
|
|
{
|
|
// get existing session
|
|
session = this.sessions[clientId];
|
|
}
|
|
|
|
// null reference to disconnected client
|
|
session.Client = null;
|
|
|
|
// update subscriptions
|
|
session.Subscriptions = new List<MqttSubscription>();
|
|
foreach (MqttSubscription subscription in subscriptions)
|
|
{
|
|
session.Subscriptions.Add(new MqttSubscription(subscription.ClientId, subscription.Topic, subscription.QosLevel, null));
|
|
}
|
|
|
|
// update inflight messages
|
|
session.InflightMessages = new Hashtable();
|
|
foreach (MqttMsgContext msgContext in clientSession.InflightMessages.Values)
|
|
{
|
|
session.InflightMessages.Add(msgContext.Key, msgContext);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get session for a client
|
|
/// </summary>
|
|
/// <param name="clientId">Client Id to get subscriptions</param>
|
|
/// <returns>Subscriptions for the client</returns>
|
|
public MqttBrokerSession GetSession(string clientId)
|
|
{
|
|
if (!this.sessions.ContainsKey(clientId))
|
|
return null;
|
|
else
|
|
return this.sessions[clientId];
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public List<MqttBrokerSession> GetSessions()
|
|
{
|
|
// TODO : verificare altro modo
|
|
return new List<MqttBrokerSession>(this.sessions.Values);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Clear session for a client (all related subscriptions)
|
|
/// </summary>
|
|
/// <param name="clientId">Client Id to clear session</param>
|
|
public void ClearSession(string clientId)
|
|
{
|
|
if (this.sessions.ContainsKey(clientId))
|
|
{
|
|
// clear and remove client session
|
|
this.sessions[clientId].Clear();
|
|
this.sessions.Remove(clientId);
|
|
}
|
|
}
|
|
}
|
|
}
|