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); } } } }