Smuxi.Engine.XmppProtocolManager.FindGroupChats C# (CSharp) Метод

FindGroupChats() публичный Метод

public FindGroupChats ( Smuxi.Engine.GroupChatModel filter ) : IList
filter Smuxi.Engine.GroupChatModel
Результат IList
        public override IList<GroupChatModel> FindGroupChats(GroupChatModel filter)
        {
            Trace.Call(filter);

            var list = new List<GroupChatModel>();
            if (ContactChat == null) {
                list.Add(new GroupChatModel("Contacts", "Contacts", this));
            }

            // find all transport/conference groups/whatnot
            DiscoItem[] discoItems;
            if (ServerDiscoItems == null) {
                var reset = new AutoResetEvent(false);
                lock (this) {
                    Disco.DiscoverItems(JabberClient.Server, (sender, e) => FindGroupChatsDiscoItems(e, reset));
                }
                reset.WaitOne();
            }
            lock (this) {
                if (ServerDiscoItems == null) {
                    return list;
                } else {
                    discoItems = ServerDiscoItems.GetDiscoItems();
                }
            }

            var resetList = new List<AutoResetEvent>();

            if ((CachedMucJids == null) ||
                ((DateTime.Now - CachedMucJidsTimeStamp) > TimeSpan.FromMinutes(5))) {
                // find all conference groups
                var mucList = new List<Jid>();
                foreach (var discoItem in discoItems) {
                    var reset = new AutoResetEvent(false);
                    var jid = discoItem.Jid;
                    lock (this) {
                        Disco.DiscoverInformation(discoItem.Jid, (sender, e) => FindGroupChatsItemDiscoInfo(e, reset, mucList, jid));
                    }
                    resetList.Add(reset);
                }
                foreach (var reset in resetList) {
                    reset.WaitOne();
                }
                resetList.Clear();

                // find all chats in all conference groups
                var jidList = new List<Jid>();
                foreach (var mucGroup in mucList) {
                    var reset = new AutoResetEvent(false);
                    lock (this) {
                        Disco.DiscoverItems(mucGroup, (sender, e) => FindGroupChatsDiscoMucs(e, reset, jidList));
                    }
                    resetList.Add(reset);
                }
                foreach (var reset in resetList) {
                    reset.WaitOne();
                }
                CachedMucJids = jidList;
                CachedMucJidsTimeStamp = DateTime.Now;
                CachedMucInfo = new Dictionary<Jid, DiscoInfo>();
            }

            // filter found items
            var filteredList = new List<Jid>();
            if (filter == null || String.IsNullOrEmpty(filter.Name)) {
                filteredList = CachedMucJids;
            } else {
                string searchPattern = null;
                if (!filter.Name.StartsWith("*") && !filter.Name.EndsWith("*")) {
                    searchPattern = String.Format("*{0}*", filter.Name);
                } else {
                    searchPattern = filter.Name;
                }
                foreach (var jid in CachedMucJids) {
                    if (!Pattern.IsMatch(jid, searchPattern)) {
                        continue;
                    }
                    filteredList.Add(jid);
                }
            }

            // get info on all chats matching the pattern
            resetList.Clear();
            foreach (var jid in CachedMucJids) {
                bool isCached = false;
                DiscoInfo info;
                lock (this) {
                    isCached = CachedMucInfo.TryGetValue(jid, out info);
                }
                if (isCached) {
                    FindGroupChatsChatInfoParse(jid, info, list);
                    continue;
                }
                var reset = new AutoResetEvent(false);
                lock (this) {
                    Disco.DiscoverInformation(jid, (sender, e) => FindGroupChatsChatInfo(e, reset, list));
                }
                resetList.Add(reset);
            }
            foreach (var reset in resetList) {
                reset.WaitOne();
            }
            return list;
        }