/// <summary>
 /// Sends a <seealso cref="DiscoRequestMessage"/> to the given target.
 /// </summary>
 /// <param name="target">The target e.g. '*****@*****.**'.</param>
 /// <param name="type">The disco type</param>
 /// <param name="onMessage">The method that should get executed once the helper receives a new valid message.</param>
 /// <param name="onTimeout">The method that should get executed once the helper timeout gets triggered.</param>
 /// <returns>Returns a <seealso cref="MessageResponseHelperResult"/> listening for <seealso cref="DiscoRequestMessage"/> answers.</returns>
 public MessageResponseHelper<IQMessage> createDisco(string target, DiscoType type, MessageResponseHelper<IQMessage>.OnMessageHandler onMessage, MessageResponseHelper<IQMessage>.OnTimeoutHandler onTimeout)
 {
     MessageResponseHelper<IQMessage> helper = new MessageResponseHelper<IQMessage>(CONNECTION, onMessage, onTimeout);
     DiscoRequestMessage disco = new DiscoRequestMessage(CONNECTION.account.getFullJid(), target, type);
     helper.start(disco);
     return helper;
 }
示例#2
0
        public async Task <string> createDiscoAsync(string target, DiscoType type)
        {
            XMPPAccount         account = connection.account;
            DiscoRequestMessage disco   = new DiscoRequestMessage(account.getIdDomainAndResource(), target, type);
            await connection.sendAsync(disco, false, false);

            return(disco.ID);
        }
示例#3
0
        public DiscoRequestMessage(XmlNode n) : base(n)
        {
            XmlNode query = XMLUtils.getChildNode(n, "query");

            if (!(query is null))
            {
                switch (query.NamespaceURI)
                {
                case Consts.XML_XEP_0030_INFO_NAMESPACE:
                    DISCO_TYPE = DiscoType.INFO;
                    break;

                case Consts.XML_XEP_0030_ITEMS_NAMESPACE:
                    DISCO_TYPE = DiscoType.ITEMS;
                    break;

                default:
                    Logging.Logger.Warn("Invalid disco result message received! " + n.ToString().Replace('\n', ' '));
                    DISCO_TYPE = DiscoType.UNKNOWN;
                    break;
                }
            }
        }
示例#4
0
        private async Task <bool> DiscoAsync(string discoTarget, CheckDiscoResponseAsync action, DiscoType discoType)
        {
            MessageResponseHelperResult <IQMessage> result = await CONNECTION.GENERAL_COMMAND_HELPER.discoAsync(discoTarget, discoType);

            if (result.STATE != MessageResponseHelperResultState.SUCCESS)
            {
                Logger.Error($"Failed to perform server DISCO#{discoType} for '{CONNECTION.account.getBareJid()}' - {result.STATE}");
                return(false);
            }

            if (result.RESULT is IQErrorMessage errorMessage)
            {
                Logger.Error($"Failed to perform server DISCO#{discoType} for '{CONNECTION.account.getBareJid()}' - {errorMessage.ERROR_OBJ}");
                return(false);
            }

            // Success:
            if (result.RESULT is DiscoResponseMessage disco)
            {
                await OnDiscoResponseMessage(disco, action, discoTarget);

                return(true);
            }

            Logger.Error($"Failed to perform server DISCO#{discoType} for '{CONNECTION.account.getBareJid()}' - invalid response.");
            return(false);
        }
        //--------------------------------------------------------Constructor:----------------------------------------------------------------\\
        #region --Constructors--
        /// <summary>
        /// Basic Constructor
        /// </summary>
        /// <history>
        /// 10/11/2017 Created [Fabian Sauter]
        /// </history>
        public DiscoResponseMessage(XmlNode n) : base(n)
        {
            IDENTITIES   = new List <DiscoIdentity>();
            FEATURES     = new List <DiscoFeature>();
            ITEMS        = new List <DiscoItem>();
            ERROR_RESULT = null;
            XmlNode qNode = XMLUtils.getChildNode(n, "query", Consts.XML_XMLNS, "http://jabber.org/protocol/disco#info");

            if (qNode == null)
            {
                qNode = XMLUtils.getChildNode(n, "query", Consts.XML_XMLNS, "http://jabber.org/protocol/disco#items");
                if (qNode == null)
                {
                    Logging.Logger.Warn("Invalid disco result message received! " + n.ToString().Replace('\n', ' '));
                    DISCO_TYPE = DiscoType.UNKNOWN;
                    return;
                }
                DISCO_TYPE = DiscoType.ITEMS;
            }
            else
            {
                DISCO_TYPE = DiscoType.INFO;
            }

            // Load content:
            if (qNode != null)
            {
                foreach (XmlNode n1 in qNode.ChildNodes)
                {
                    switch (n1.Name)
                    {
                    case "feature":
                        FEATURES.Add(new DiscoFeature(n1));
                        break;

                    case "identity":
                        IDENTITIES.Add(new DiscoIdentity(n1));
                        break;

                    case "item":
                        ITEMS.Add(new DiscoItem(n1));
                        break;

                    case "error":
                        ERROR_RESULT = new StreamErrorMessage(n1);
                        break;
                    }
                }
                isPartialList = doesNodeContainPartialList(qNode);
            }

            // Sort disco items alphabetically:
            ITEMS.Sort((a, b) => {
                if (a == null || a.NAME == null)
                {
                    if (b == null || b.NAME == null)
                    {
                        return(0);
                    }
                    return(-1);
                }

                if (b == null || b.NAME == null)
                {
                    return(1);
                }

                return(a.NAME.CompareTo(b.NAME));
            });
        }
示例#6
0
 //--------------------------------------------------------Constructor:----------------------------------------------------------------\\
 #region --Constructors--
 public DiscoRequestMessage(string from, string to, DiscoType discoType) : base(from, to, GET, getRandomId())
 {
     DISCO_TYPE = discoType;
 }
 /// <summary>
 /// Sends a <seealso cref="DiscoRequestMessage"/> to the given target.
 /// </summary>
 /// <param name="target">The target e.g. '*****@*****.**'.</param>
 /// <param name="type">The disco type</param>
 /// <returns>Returns a <seealso cref="MessageResponseHelperResult"/> listening for <seealso cref="DiscoRequestMessage"/> answers.</returns>
 public async Task<MessageResponseHelperResult<IQMessage>> discoAsync(string target, DiscoType type)
 {
     Predicate<IQMessage> predicate = (x) => { return true; };
     AsyncMessageResponseHelper<IQMessage> helper = new AsyncMessageResponseHelper<IQMessage>(CONNECTION, predicate);
     DiscoRequestMessage msg = new DiscoRequestMessage(CONNECTION.account.getFullJid(), target, type);
     return await helper.startAsync(msg);
 }