private void DiscoCompleteCallback( IAsyncResult ar ) { try { Packet p = _sm.Session.EndSend(ar); if ( p == null || ! (p is DiscoveryItemsResponse) ) //this server probably doesn't support disco, try browse BrowseForChatServers(); else { DiscoveryItemsResponse resp = WConvert.ToDiscoItemsResponse(p); //request info for each of the items returned by the server //the info will tell is whether or not it is a chat server foreach (DiscoveryItem itm in resp.Items) { //chat servers usually don't use node, only request items with no node value if (itm.Node.Equals(string.Empty)) { DiscoveryInfoRequest req = new DiscoveryInfoRequest(itm.JID); _sm.BeginSend(req.ToPacket, new AsyncCallback(ServiceInfoCallback)); } } } } catch { //this server probably doesn't support disco, try browse BrowseForChatServers(); } }
private void ChatServiceItemsCallback( IAsyncResult ar ) { try { Packet p = _sm.Session.EndSend(ar); if ((p != null) && (p is DiscoveryItemsResponse)) { DiscoveryItemsResponse resp = WConvert.ToDiscoItemsResponse(p); if (resp.Items.Count > 0) //warning: this should be smarter as a service with many rooms will generate A LOT of traffic foreach ( DiscoveryItem itm in resp.Items ) { const int RoomItemsTimeout = 30000; DiscoveryInfoRequest req = new DiscoveryInfoRequest(itm.JID, itm.Node); _sm.BeginSend(req.ToPacket, RoomItemsTimeout, new AsyncCallback(RoomInfoCallback), ar.AsyncState); } } } catch {} }