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