Example #1
0
 //Handles _SessionManager.IncomingRoster
 private void OnIncomingRosterChange(RosterChange incomingRosterChange)
 {
     //work performed in here should be done on the main GUI thread
     //since it will be updating the treeview
     this.BeginInvoke(new Session.PacketReceivedDelegate(IncomingRosterChangeThreadSafe), new object[] { incomingRosterChange });
 }
Example #2
0
        public async Task <Microsoft.FSharp.Collections.FSharpList <Tuple <RosterChange, string> > > ChangesSince(string value)
        {
            using (var context = CreateContext()) {
                var lastVersion   = int.Parse(value);
                var latestChanges =

                    /*
                     * // Not working in MySql
                     * from change in context.RosterChanges
                     * where change.ApplicationUserId == user.Id
                     * where change.Version > lastVersion
                     * group change by change.Jid into g
                     * let latest =
                     *                      (from item in g
                     *                      orderby item.Version descending
                     *                      select item)
                     *                      .FirstOrDefault()
                     * orderby latest.Version
                     * select latest;
                     *
                     * // Not working in MySql
                     * context.RosterChanges
                     *      .Where (c => c.ApplicationUserId == user.Id && c.Version > lastVersion)
                     *      .GroupBy (c => c.Jid)
                     *      .Select (g => g.OrderByDescending(i => i.Version).FirstOrDefault())
                     *      .OrderBy(i => i.Version); */

                    from change in context.RosterChanges
                    join gro in
                    (from c in context.RosterChanges
                     group c by c.Jid into g
                     select new { Name = g.Key, MaxVer = g.Select(i => i.Version).Max() })
                    on change.Jid equals gro.Name
                    where change.ApplicationUserId == user &&
                    change.Version > lastVersion &&
                    change.Version == gro.MaxVer
                    orderby change.Version
                    select change;

                var list = new List <Tuple <RosterChange, string> > ();
                foreach (var item in await latestChanges.ToListAsync())
                {
                    // build list
                    RosterChange change = null;
                    switch (item.ChangeType)
                    {
                    case DbChangeType.Set:
                        var items =
                            await(from i in context.RosterItems
                                  where i.ApplicationUserId == user
                                  where i.Jid == item.Jid
                                  select i)
                            .FirstOrDefaultAsync();

                        change = RosterChange.NewSetItem(items.ToFSharp());
                        break;

                    case DbChangeType.Delete:
                        change = RosterChange.NewDeleteItem(JabberId.Parse(item.Jid));
                        break;

                    default:
                        throw new InvalidOperationException("Invalid ChangeType");
                    }
                    var t = Tuple.Create(change, VersionString(item.Version));
                    list.Add(t);
                }
                return(ListModule.OfSeq(list));
                //return null;
            }
        }