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
{
///
/// Manager for client session
///
public class MqttSessionManager
{
// subscription info for each client
private Dictionary sessions;
///
/// Constructor
///
public MqttSessionManager()
{
this.sessions = new Dictionary();
}
///
/// Save session for a client (all related subscriptions)
///
/// Client Id to save subscriptions
/// Client session with inflight messages
/// Subscriptions to save
public void SaveSession(string clientId, MqttClientSession clientSession, List 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();
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);
}
}
///
/// Get session for a client
///
/// Client Id to get subscriptions
/// Subscriptions for the client
public MqttBrokerSession GetSession(string clientId)
{
if (!this.sessions.ContainsKey(clientId))
return null;
else
return this.sessions[clientId];
}
///
///
///
///
public List GetSessions()
{
// TODO : verificare altro modo
return new List(this.sessions.Values);
}
///
/// Clear session for a client (all related subscriptions)
///
/// Client Id to clear session
public void ClearSession(string clientId)
{
if (this.sessions.ContainsKey(clientId))
{
// clear and remove client session
this.sessions[clientId].Clear();
this.sessions.Remove(clientId);
}
}
}
}