Example #1
0
        public void Subscribe(Topic[] topics)
        {
            for (int i = 0; i < topics.Length; i++)
            {
                SNQoS realQos = SNQoS.AT_LEAST_ONCE;
                switch (topics[i].Qos)
                {
                case QOS.AT_LEAST_ONCE:
                    realQos = SNQoS.AT_LEAST_ONCE;
                    break;

                case QOS.AT_MOST_ONCE:
                    realQos = SNQoS.AT_MOST_ONCE;
                    break;

                case QOS.EXACTLY_ONCE:
                    realQos = SNQoS.EXACTLY_ONCE;
                    break;
                }

                SNTopic topic;
                if (reverseMappedTopics.ContainsKey(topics[i].Name))
                {
                    topic = new IdentifierTopic(reverseMappedTopics[topics[i].Name], realQos);
                }
                else
                {
                    topic = new FullTopic(topics[i].Name, realQos);
                }

                SNSubscribe subscribe = new SNSubscribe(null, topic, false);
                _timers.Store(subscribe);
                _client.Send(subscribe);
            }
        }
Example #2
0
        public void ProcessWillTopicRequest()
        {
            Boolean retain    = false;
            String  topicName = String.Empty;
            SNQoS   topicQos  = SNQoS.EXACTLY_ONCE;

            if (_will != null && _will.Topic != null)
            {
                retain = _will.Retain;
                if (_will.Topic.Name != null)
                {
                    topicName = _will.Topic.Name;
                }

                switch (_will.Topic.Qos)
                {
                case QOS.AT_LEAST_ONCE:
                    topicQos = SNQoS.AT_LEAST_ONCE;
                    break;

                case QOS.AT_MOST_ONCE:
                    topicQos = SNQoS.AT_MOST_ONCE;
                    break;

                default:
                    break;
                }
            }

            FullTopic topic     = new FullTopic(_will.Topic.Name, topicQos);
            WillTopic willTopic = new WillTopic(retain, topic);

            _client.Send(willTopic);
        }
 public SNSuback reInit(Int32 topicID, Int32 messageID, ReturnCode code, SNQoS allowedQos)
 {
     this._topicID    = topicID;
     this.MessageID   = messageID;
     this._code       = code;
     this._allowedQos = allowedQos;
     return(this);
 }
Example #4
0
        public void ProcessPublish(Int32?packetID, SNTopic topic, Byte[] content, Boolean retain, Boolean isDup)
        {
            SNQoS publisherQos = topic.getQos();
            QOS   realQos      = QOS.AT_MOST_ONCE;

            switch (publisherQos)
            {
            case SNQoS.AT_LEAST_ONCE:
                SNPuback puback = new SNPuback();
                puback.MessageID  = packetID;
                puback.ReturnCode = ReturnCode.ACCEPTED;
                int topicID = 0;
                if (topic is IdentifierTopic)
                {
                    topicID = ((IdentifierTopic)topic).Value;
                }
                else if (topic is ShortTopic)
                {
                    topicID = Int32.Parse(((ShortTopic)topic).Value);
                }

                puback.topicID = topicID;
                _client.Send(puback);
                realQos = QOS.AT_LEAST_ONCE;
                break;

            case SNQoS.EXACTLY_ONCE:
                realQos = QOS.EXACTLY_ONCE;
                SNPubrec pubrec = new SNPubrec(packetID.Value);
                _client.Send(pubrec);
                break;

            default:
                break;
            }

            String topicName = String.Empty;

            if (topic is IdentifierTopic && mappedTopics.ContainsKey(((IdentifierTopic)topic).Value))
            {
                topicName = mappedTopics[((IdentifierTopic)topic).Value];
            }

            if (topicName.Length == 0)
            {
                return;
            }

            if (!(isDup && publisherQos == SNQoS.EXACTLY_ONCE))
            {
                _dbInterface.StoreMessage(topicName, content, realQos);
            }

            if (_listener != null)
            {
                _listener.MessageReceived(MessageType.PUBLISH);
            }
        }
Example #5
0
        public void ProcessSuback(Int32 packetID, Int32 topicID, ReturnCode returnCode, SNQoS allowedQos)
        {
            SNMessage message = _timers.Remove(packetID);

            if (returnCode != ReturnCode.ACCEPTED)
            {
                throw new CoreLogicException("received invalid message suback");
            }
            else
            {
                SNSubscribe subscribe = (SNSubscribe)message;
                String      topicName = String.Empty;
                if (subscribe.SnTopic is IdentifierTopic)
                {
                    topicName = mappedTopics[((IdentifierTopic)subscribe.SnTopic).Value];
                }
                else
                {
                    topicName = ((FullTopic)subscribe.SnTopic).Value;
                }

                SNQoS actualQos = allowedQos;
                QOS   realQos   = QOS.AT_LEAST_ONCE;
                switch (actualQos)
                {
                case SNQoS.AT_MOST_ONCE:
                    realQos = QOS.AT_MOST_ONCE;
                    break;

                case SNQoS.EXACTLY_ONCE:
                    realQos = QOS.EXACTLY_ONCE;
                    break;

                case SNQoS.LEVEL_ONE:
                    realQos = QOS.AT_MOST_ONCE;
                    break;
                }

                _dbInterface.StoreTopic(topicName, realQos);

                if (_listener != null)
                {
                    _listener.MessageReceived(MessageType.SUBACK);
                }
            }
        }
Example #6
0
        public void Unsubscribe(String[] topics)
        {
            for (int i = 0; i < topics.Length; i++)
            {
                SNQoS   realQos = SNQoS.AT_LEAST_ONCE;
                SNTopic topic;
                if (reverseMappedTopics.ContainsKey(topics[i]))
                {
                    topic = new IdentifierTopic(reverseMappedTopics[topics[i]], realQos);
                }
                else
                {
                    topic = new FullTopic(topics[i], realQos);
                }

                SNUnsubscribe subscribe = new SNUnsubscribe(null, topic);
                _timers.Store(subscribe);
                _client.Send(subscribe);
            }
        }
Example #7
0
        public void Publish(Topic topic, byte[] content, Boolean retain, Boolean dup)
        {
            SNQoS realQos = SNQoS.AT_LEAST_ONCE;

            switch (topic.Qos)
            {
            case QOS.AT_LEAST_ONCE:
                realQos = SNQoS.AT_LEAST_ONCE;
                break;

            case QOS.AT_MOST_ONCE:
                realQos = SNQoS.AT_MOST_ONCE;
                break;

            case QOS.EXACTLY_ONCE:
                realQos = SNQoS.EXACTLY_ONCE;
                break;
            }

            if (reverseMappedTopics.ContainsKey(topic.Name))
            {
                IdentifierTopic idTopic = new IdentifierTopic(reverseMappedTopics[topic.Name], realQos);
                SNPublish       publish = new SNPublish(null, idTopic, content, dup, retain);
                if (topic.Qos != QOS.AT_MOST_ONCE)
                {
                    _timers.Store(publish);
                }

                _client.Send(publish);
            }
            else
            {
                FullTopic fullTopic = new FullTopic(topic.Name, realQos);
                pendingMessages.Add(new SNPublish(null, fullTopic, content, dup, retain));
                Register register = new Register(0, null, topic.Name);
                _timers.Store(register);
                _client.Send(register);
            }
        }
Example #8
0
 public FullTopic reInit(String value, SNQoS qos)
 {
     this._value = value;
     this._qos   = qos;
     return(this);
 }
Example #9
0
 public FullTopic(String value, SNQoS qos)
 {
     this._value = value;
     this._qos   = qos;
 }
 public IdentifierTopic reInit(Int32 value, SNQoS qos)
 {
     this._value = value;
     this._qos   = qos;
     return(this);
 }
 public IdentifierTopic(Int32 value, SNQoS qos)
 {
     this._value = value;
     this._qos   = qos;
 }
 public ShortTopic(String value, SNQoS qos)
 {
     this._value = value;
     this._qos   = qos;
 }
 public SNSuback(Int32 topicID, Int32 messageID, ReturnCode code, SNQoS allowedQos) : base(messageID)
 {
     this._topicID    = topicID;
     this._code       = code;
     this._allowedQos = allowedQos;
 }