public IList <SocialEvent> DoWork()
        {
            // TODO make this threadsafe
            List <SocialEvent> events = this.eventQueue.ToList();

            this.eventQueue.Clear();

            lock (this.syncRoot)
            {
                foreach (SocialGraph graph in this.userGraphs.Values)
                {
                    graph.DoWork(events);

                    HashSet <WeakReference> userGroups;
                    if (this.userGroupsMap.TryGetValue(graph.LocalUser, out userGroups))
                    {
                        // Graph the social groups for this user and update them.
                        foreach (WeakReference groupReference in userGroups.ToList())
                        {
                            XboxSocialUserGroup group = groupReference.Target as XboxSocialUserGroup;
                            if (group == null)
                            {
                                userGroups.Remove(groupReference);
                                continue;
                            }

                            group.UpdateView(graph.ActiveBufferSocialGraph, events);
                        }
                    }
                }
            }

            return(events.ToList());
        }
Пример #2
0
        public XboxSocialUserGroup CreateSocialUserGroupFromList(XboxLiveUser user, List <ulong> userIds)
        {
            if (user == null)
            {
                throw new ArgumentNullException("user");
            }
            if (userIds == null)
            {
                throw new ArgumentNullException("userIds");
            }

            SocialGraph userGraph;

            if (!this.userGraphs.TryGetValue(user, out userGraph))
            {
                throw new ArgumentException("You must add a local user before you can create a social group for them.", "user");
            }

            XboxSocialUserGroup group = new XboxSocialUserGroup(user, userIds);

            if (userGraph.IsInitialized)
            {
                group.InitializeGroup(userGraph.ActiveUsers);
            }

            this.AddUserGroup(user, group);

            userGraph.AddUsers(userIds).ContinueWith(addUsersTask =>
            {
                this.eventQueue.Enqueue(new SocialEvent(SocialEventType.SocialUserGroupLoaded, user, userIds, group, addUsersTask.Exception));
            });

            return(group);
        }
Пример #3
0
        public XboxSocialUserGroup CreateSocialUserGroupFromFilters(XboxLiveUser user, PresenceFilter presenceFilter, RelationshipFilter relationshipFilter)
        {
            if (user == null)
            {
                throw new ArgumentNullException("user");
            }

            // Allocates memory for returned objects
            IntPtr cGroupPtr   = Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>());
            IntPtr cErrMessage = Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>());

            // Invokes the c method
            XSAPI_RESULT errCode = SocialManagerCreateSocialUserGroupFromFilters(user.Impl.XboxLiveUserPtr, presenceFilter, relationshipFilter, cGroupPtr, cErrMessage);

            // Handles error
            string errMessage = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(cErrMessage));

            Marshal.FreeHGlobal(cErrMessage);

            if (errCode != XSAPI_RESULT.XSAPI_RESULT_OK)
            {
                // todo do something
            }

            // Handles returned objects
            XboxSocialUserGroup socialUserGroup = new XboxSocialUserGroup(Marshal.ReadIntPtr(cGroupPtr));

            Marshal.FreeHGlobal(cGroupPtr);
            m_groups.Add(socialUserGroup);

            return(socialUserGroup);
        }
Пример #4
0
        public void UpdateSocialUserGroup(XboxSocialUserGroup socialGroup, IList <string> users)
        {
            if (socialGroup == null)
            {
                throw new ArgumentNullException("socialGroup");
            }
            if (users == null)
            {
                throw new ArgumentNullException("users");
            }

            // Allocates memory for parameters
            IntPtr cUserIds = MarshalingHelpers.StringListToHGlobalUtf8StringArray(users);

            // Allocates memory for returned objects
            IntPtr cErrMessage;

            // Invokes the c method
            XSAPI_RESULT errCode = SocialManagerUpdateSocialUserGroup(socialGroup.GetPtr(), cUserIds, (uint)users.Count, out cErrMessage);

            MarshalingHelpers.FreeHGlobalUtf8StringArray(cUserIds, users.Count);
            if (errCode != XSAPI_RESULT.XSAPI_RESULT_OK)
            {
                throw new XboxException(errCode, cErrMessage);
            }

            // Does local work
            socialGroup.Refresh();
        }
Пример #5
0
        public void DestroySocialUserGroup(XboxSocialUserGroup xboxSocialUserGroup)
        {
            if (xboxSocialUserGroup == null)
            {
                throw new ArgumentNullException("xboxSocialUserGroup");
            }

            // Allocates memory for returned objects
            IntPtr cErrMessage = Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>());

            // Invokes the c method
            XSAPI_RESULT errCode = SocialManagerDestroySocialUserGroup(xboxSocialUserGroup.GetPtr(), cErrMessage);

            // Handles error
            string errMessage = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(cErrMessage));

            Marshal.FreeHGlobal(cErrMessage);

            if (errCode != XSAPI_RESULT.XSAPI_RESULT_OK)
            {
                // todo do something
            }

            // Does local work
            m_groups.Remove(xboxSocialUserGroup);
        }
Пример #6
0
        public XboxSocialUserGroup CreateSocialUserGroupFromFilters(XboxLiveUser user, PresenceFilter presenceFilter, RelationshipFilter relationshipFilter, uint titleId)
        {
            if (user == null)
            {
                throw new ArgumentNullException("user");
            }

            SocialGraph userGraph;

            if (!this.userGraphs.TryGetValue(user, out userGraph))
            {
                throw new ArgumentException("You must add a local user before you can create a social group for them.", "user");
            }

            XboxSocialUserGroup group = new XboxSocialUserGroup(user, presenceFilter, relationshipFilter, XboxLiveAppConfiguration.Instance.TitleId);

            if (userGraph.IsInitialized)
            {
                group.InitializeGroup(userGraph.ActiveUsers);
            }

            this.AddUserGroup(user, group);

            this.eventQueue.Enqueue(new SocialEvent(SocialEventType.SocialUserGroupLoaded, user, null, group));

            return(group);
        }
Пример #7
0
        public XboxSocialUserGroup CreateSocialUserGroupFromList(XboxLiveUser user, IList <string> xboxUserIdList)
        {
            if (user == null)
            {
                throw new ArgumentNullException("user");
            }
            if (xboxUserIdList == null)
            {
                throw new ArgumentNullException("xboxUserIdList");
            }

            // Allocates memory for parameters
            IntPtr cUserIds = MarshalingHelpers.StringListToHGlobalUtf8StringArray(xboxUserIdList);

            // Allocates memory for returned objects
            IntPtr cGroupPtr;
            IntPtr cErrMessage;

            // Invokes the c method
            XSAPI_RESULT errCode = SocialManagerCreateSocialUserGroupFromList(user.Impl.XboxLiveUserPtr, cUserIds, (uint)xboxUserIdList.Count, out cGroupPtr, out cErrMessage);

            MarshalingHelpers.FreeHGlobalUtf8StringArray(cUserIds, xboxUserIdList.Count);
            if (errCode != XSAPI_RESULT.XSAPI_RESULT_OK)
            {
                throw new XboxException(errCode, cErrMessage);
            }

            // Handles returned objects
            XboxSocialUserGroup socialUserGroup = new XboxSocialUserGroup(cGroupPtr);

            m_groups.Add(socialUserGroup);

            return(socialUserGroup);
        }
 public void UpdateSocialUserGroup(XboxSocialUserGroup group, List <ulong> users)
 {
     this.userGraphs[group.LocalUser].AddUsers(users).ContinueWith(
         addUsersTask =>
     {
         SocialEvent socialEvent = new SocialEvent(SocialEventType.SocialUserGroupUpdated, group.LocalUser, users);
         this.eventQueue.Enqueue(socialEvent);
     });
 }
Пример #9
0
        public XboxSocialUserGroup CreateSocialUserGroupFromList(XboxLiveUser user, IList <string> xboxUserIdList)
        {
            if (user == null)
            {
                throw new ArgumentNullException("user");
            }
            if (xboxUserIdList == null)
            {
                throw new ArgumentNullException("xboxUserIdList");
            }

            // Allocates memory for parameters
            List <IntPtr> userIdPtrs = new List <IntPtr>();

            for (int i = 0; i < xboxUserIdList.Count; i++)
            {
                IntPtr cXuid = Marshal.StringToHGlobalAnsi(xboxUserIdList[i]);
                userIdPtrs.Add(cXuid);
            }
            IntPtr cUserIds = Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>() * xboxUserIdList.Count);

            Marshal.Copy(userIdPtrs.ToArray(), 0, cUserIds, xboxUserIdList.Count);

            // Allocates memory for returned objects
            IntPtr cGroupPtr   = Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>());
            IntPtr cErrMessage = Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>());

            // Invokes the c method
            XSAPI_RESULT errCode = SocialManagerCreateSocialUserGroupFromList(user.Impl.XboxLiveUserPtr, cUserIds, (uint)xboxUserIdList.Count, cGroupPtr, cErrMessage);

            // Handles error
            string errMessage = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(cErrMessage));

            Marshal.FreeHGlobal(cErrMessage);

            if (errCode != XSAPI_RESULT.XSAPI_RESULT_OK)
            {
                // todo do something
            }

            // Cleans up parameters
            foreach (IntPtr ptr in userIdPtrs)
            {
                Marshal.FreeHGlobal(ptr);
            }
            Marshal.FreeHGlobal(cUserIds);

            // Handles returned objects
            XboxSocialUserGroup socialUserGroup = new XboxSocialUserGroup(Marshal.ReadIntPtr(cGroupPtr));

            Marshal.FreeHGlobal(cGroupPtr);
            m_groups.Add(socialUserGroup);

            return(socialUserGroup);
        }
        public XboxSocialUserGroup CreateSocialUserGroupFromFilters(XboxLiveUser user, PresenceFilter presenceFilter, RelationshipFilter relationshipFilter)
        {
            var group = new XboxSocialUserGroup(user, presenceFilter, relationshipFilter, XboxLiveAppConfiguration.Instance.TitleId);

            var users = Enumerable.Range(0, 5)
                        .Select(id =>
            {
                var groupUser = CreateUser();

                switch (presenceFilter)
                {
                case PresenceFilter.AllOnline:
                case PresenceFilter.TitleOnline:
                    InitUserForOnlinePresence(ref groupUser);
                    break;

                case PresenceFilter.AllOffline:
                case PresenceFilter.TitleOffline:
                    InitUserForOfflinePresence(ref groupUser);
                    break;

                case PresenceFilter.AllTitle:
                case PresenceFilter.All:
                    if (id % 2 == 0)
                    {
                        InitUserForOnlinePresence(ref groupUser);
                    }
                    else
                    {
                        InitUserForOfflinePresence(ref groupUser);
                    }
                    break;
                }

                switch (relationshipFilter)
                {
                case RelationshipFilter.Friends:
                    groupUser.IsFollowedByCaller = true;
                    break;

                case RelationshipFilter.Favorite:
                    groupUser.IsFollowedByCaller = true;
                    groupUser.IsFavorite         = true;
                    break;
                }

                return(groupUser);
            }).ToDictionary(u => u.XboxUserId);

            group.InitializeGroup(users.Values);
            group.UpdateView(users, new List <SocialEvent>());
            this.events.Add(new SocialEvent(SocialEventType.SocialUserGroupLoaded, user, null, group));

            return(group);
        }
Пример #11
0
        public void UpdateSocialUserGroup(XboxSocialUserGroup group, IList <string> userIds)
        {
            Dictionary <string, XboxSocialUser> users =
                userIds
                .Select(CreateUser)
                .ToDictionary(u => u.XboxUserId);

            group.UpdateGroup(users);

            mEvents.Add(new SocialEvent(SocialEventType.SocialUserGroupUpdated, group.LocalUser, null, group));
        }
Пример #12
0
        public XboxSocialUserGroup CreateSocialUserGroupFromFilters(XboxLiveUser user, PresenceFilter presenceFilter, RelationshipFilter relationshipFilter)
        {
            Dictionary <string, XboxSocialUser> users = Enumerable.Range(0, 5)
                                                        .Select(id =>
            {
                var groupUser = CreateUser();

                switch (presenceFilter)
                {
                case PresenceFilter.AllOnline:
                case PresenceFilter.TitleOnline:
                    InitUserForOnlinePresence(ref groupUser);
                    break;

                case PresenceFilter.AllOffline:
                case PresenceFilter.TitleOffline:
                    InitUserForOfflinePresence(ref groupUser);
                    break;

                case PresenceFilter.AllTitle:
                case PresenceFilter.All:
                    if (id % 2 == 0)
                    {
                        InitUserForOnlinePresence(ref groupUser);
                    }
                    else
                    {
                        InitUserForOfflinePresence(ref groupUser);
                    }
                    break;
                }

                switch (relationshipFilter)
                {
                case RelationshipFilter.Friends:
                    groupUser.IsFollowedByCaller = true;
                    break;

                case RelationshipFilter.Favorite:
                    groupUser.IsFollowedByCaller = true;
                    groupUser.IsFavorite         = true;
                    break;
                }

                return(groupUser);
            }).ToDictionary(u => u.XboxUserId);

            XboxSocialUserGroup group = new XboxSocialUserGroup(user, SocialUserGroupType.Filter, presenceFilter, relationshipFilter, users);

            mEvents.Add(new SocialEvent(SocialEventType.SocialUserGroupLoaded, user, null, group));

            return(group);
        }
        public XboxSocialUserGroup CreateSocialUserGroupFromList(XboxLiveUser user, List <ulong> userIds)
        {
            var group = new XboxSocialUserGroup(user, userIds);

            // Create 'real' users for the userIds
            var users = userIds
                        .Select(CreateUser)
                        .ToDictionary(u => u.XboxUserId);

            group.UpdateView(users, null);

            return(group);
        }
Пример #14
0
        private void AddUserGroup(XboxLiveUser user, XboxSocialUserGroup group)
        {
            lock (this.syncRoot)
            {
                HashSet <WeakReference> userGroups;
                if (!this.userGroupsMap.TryGetValue(user, out userGroups))
                {
                    this.userGroupsMap[user] = userGroups = new HashSet <WeakReference>();
                }

                WeakReference groupReference = new WeakReference(group);
                userGroups.Add(groupReference);
            }
        }
Пример #15
0
        public void UpdateUserGroup(XboxLiveUser user, XboxSocialUserGroup group, List <ulong> users)
        {
            if (group.SocialUserGroupType != SocialUserGroupType.UserList)
            {
                throw new ArgumentException("You can only modify the user list for a UserList type social group.");
            }

            this.userGraphs[user].AddUsers(users).ContinueWith(
                addUsersTask =>
            {
                SocialEvent socialEvent = new SocialEvent(SocialEventType.SocialUserGroupUpdated, user, users);
                this.eventQueue.Enqueue(socialEvent);
            });
        }
Пример #16
0
        public void UpdateSocialUserGroup(XboxSocialUserGroup socialGroup, IList <string> users)
        {
            if (socialGroup == null)
            {
                throw new ArgumentNullException("socialGroup");
            }
            if (users == null)
            {
                throw new ArgumentNullException("users");
            }

            // Allocates memory for parameters
            List <IntPtr> userIdPtrs = new List <IntPtr>();

            for (int i = 0; i < users.Count; i++)
            {
                IntPtr cXuid = Marshal.StringToHGlobalUni(users[i]);
                userIdPtrs.Add(cXuid);
            }
            IntPtr cUserIds = Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>() * users.Count);

            Marshal.Copy(userIdPtrs.ToArray(), 0, cUserIds, users.Count);

            // Allocates memory for returned objects
            IntPtr cErrMessage = Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>());

            // Invokes the c method
            XSAPI_RESULT errCode = SocialManagerUpdateSocialUserGroup(socialGroup.GetPtr(), cUserIds, (uint)users.Count, cErrMessage);

            // Handles error
            string errMessage = Marshal.PtrToStringUni(Marshal.ReadIntPtr(cErrMessage));

            Marshal.FreeHGlobal(cErrMessage);

            if (errCode != XSAPI_RESULT.XSAPI_RESULT_OK)
            {
                // todo do something
            }

            // Cleans up parameters
            foreach (IntPtr ptr in userIdPtrs)
            {
                Marshal.FreeHGlobal(ptr);
            }
            Marshal.FreeHGlobal(cUserIds);

            // Does local work
            socialGroup.Refresh();
        }
        public XboxSocialUserGroup CreateSocialUserGroupFromList(XboxLiveUser user, List <ulong> userIds)
        {
            var group = new XboxSocialUserGroup(user, userIds);

            // Create 'real' users for the userIds
            var users = userIds
                        .Select(CreateUser)
                        .ToDictionary(u => u.XboxUserId);

            group.InitializeGroup(users.Values);
            group.UpdateView(users, new List <SocialEvent>());
            this.events.Add(new SocialEvent(SocialEventType.SocialUserGroupLoaded, user, null, group));

            return(group);
        }
Пример #18
0
        public XboxSocialUserGroup CreateSocialUserGroupFromList(XboxLiveUser user, IList <string> xboxUserIdList)
        {
            Dictionary <string, XboxSocialUser> users = xboxUserIdList
                                                        .Select(CreateUser)
                                                        .ToDictionary(u => u.XboxUserId);

            XboxSocialUserGroup group = new XboxSocialUserGroup(
                user,
                SocialUserGroupType.UserList,
                PresenceFilter.Unknown,
                RelationshipFilter.Friends,
                users);

            mEvents.Add(new SocialEvent(SocialEventType.SocialUserGroupLoaded, user, null, group));

            return(group);
        }
Пример #19
0
        public IList <SocialEvent> DoWork()
        {
            List <SocialEvent> events;

            lock (this.syncRoot)
            {
                if (this.eventQueue.Count > 0)
                {
                    events = this.eventQueue.ToList();
                    this.eventQueue.Clear();
                }
                else
                {
                    events = emptyEventList;
                }

                foreach (SocialGraph graph in this.userGraphs.Values)
                {
                    graph.DoWork(events);

                    HashSet <WeakReference> userGroups;
                    if (!this.userGroupsMap.TryGetValue(graph.LocalUser, out userGroups))
                    {
                        continue;
                    }

                    // Grab the social groups for this user and update them.
                    foreach (WeakReference groupReference in userGroups.ToList())
                    {
                        XboxSocialUserGroup group = groupReference.Target as XboxSocialUserGroup;
                        // If the target is null that means the group has been disposed so we don't
                        // need to bother updating it anymore.
                        if (group == null)
                        {
                            userGroups.Remove(groupReference);
                            continue;
                        }

                        group.UpdateView(graph.ActiveBufferSocialGraph, events);
                    }
                }
            }

            return(events);
        }
Пример #20
0
        public void DestroySocialUserGroup(XboxSocialUserGroup xboxSocialUserGroup)
        {
            if (xboxSocialUserGroup == null)
            {
                throw new ArgumentNullException("xboxSocialUserGroup");
            }

            IntPtr cErrMessage;
            // Invokes the c method
            XSAPI_RESULT errCode = SocialManagerDestroySocialUserGroup(xboxSocialUserGroup.GetPtr(), out cErrMessage);

            if (errCode != XSAPI_RESULT.XSAPI_RESULT_OK)
            {
                throw new XboxException(errCode, cErrMessage);
            }

            // Does local work
            m_groups.Remove(xboxSocialUserGroup);
        }
Пример #21
0
        public XboxSocialUserGroup CreateSocialUserGroupFromFilters(XboxLiveUser user, PresenceFilter presenceFilter, RelationshipFilter relationshipFilter)
        {
            if (user == null)
            {
                throw new ArgumentNullException("user");
            }

            IntPtr cGroupPtr;
            IntPtr cErrMessage;
            // Invokes the c method
            XSAPI_RESULT errCode = SocialManagerCreateSocialUserGroupFromFilters(user.Impl.XboxLiveUserPtr, presenceFilter, relationshipFilter, out cGroupPtr, out cErrMessage);

            if (errCode != XSAPI_RESULT.XSAPI_RESULT_OK)
            {
                throw new XboxException(errCode, cErrMessage);
            }

            // Handles returned objects
            XboxSocialUserGroup socialUserGroup = new XboxSocialUserGroup(cGroupPtr);

            m_groups.Add(socialUserGroup);

            return(socialUserGroup);
        }
 public SocialEvent(SocialEventType type, XboxLiveUser user, IList <ulong> usersAffected = null, XboxSocialUserGroup groupAffected = null, Exception exception = null)
 {
     this.EventType     = type;
     this.User          = user;
     this.UsersAffected = usersAffected == null ? new List <ulong>() : usersAffected;
     this.GroupAffected = groupAffected;
     this.Exception     = exception;
 }
 internal SocialUserGroupLoadedEventArgs(XboxSocialUserGroup group)
 {
     SocialUserGroup = group;
 }
Пример #24
0
 // todo do I need this method?
 internal SocialEvent(SocialEventType type, XboxLiveUser user, IList <string> usersAffected = null, XboxSocialUserGroup groupAffected = null, int errorCode = 0, string errorMessage = "")
 {
     this.EventType     = type;
     this.User          = user;
     this.UsersAffected = usersAffected == null ? new List <string>() : usersAffected;
     this.EventArgs     = groupAffected == null ? null : new SocialUserGroupLoadedEventArgs(groupAffected);
     this.ErrorCode     = errorCode;
     this.ErrorMessge   = errorMessage;
 }
Пример #25
0
 public SocialEvent(SocialEventType type, XboxLiveUser user, IList <ulong> usersAffected, XboxSocialUserGroup groupAffected = null)
 {
     this.EventType     = type;
     this.User          = user;
     this.UsersAffected = usersAffected;
     this.GroupAffected = groupAffected;
 }
        public XboxSocialUserGroup CreateSocialUserGroupFromFilters(XboxLiveUser user, PresenceFilter presenceFilter, RelationshipFilter relationshipFilter, uint titleId)
        {
            var group = new XboxSocialUserGroup(user, presenceFilter, relationshipFilter, titleId);

            var users = Enumerable.Range(0, 5)
                        .Select(id =>
            {
                var groupUser = CreateUser(0);

                switch (presenceFilter)
                {
                case PresenceFilter.TitleOnline:
                    groupUser.PresenceState   = UserPresenceState.Online;
                    groupUser.PresenceDetails = new List <SocialManagerPresenceTitleRecord>
                    {
                        new SocialManagerPresenceTitleRecord
                        {
                            TitleId       = titleId,
                            IsTitleActive = false,
                        }
                    };
                    break;

                case PresenceFilter.TitleOffline:
                    groupUser.PresenceState = UserPresenceState.Offline;
                    groupUser.TitleHistory  = new TitleHistory
                    {
                        HasUserPlayed      = true,
                        LastTimeUserPlayed = DateTime.UtcNow.AddDays(-1),
                    };
                    break;

                case PresenceFilter.AllOnline:
                    groupUser.PresenceState = UserPresenceState.Online;
                    break;

                case PresenceFilter.AllOffline:
                    groupUser.PresenceState = UserPresenceState.Offline;
                    break;

                case PresenceFilter.AllTitle:
                    break;
                }

                switch (relationshipFilter)
                {
                case RelationshipFilter.Friends:
                    groupUser.IsFollowedByCaller = true;
                    break;

                case RelationshipFilter.Favorite:
                    groupUser.IsFollowedByCaller = true;
                    groupUser.IsFavorite         = true;
                    break;
                }

                return(groupUser);
            }).ToDictionary(u => u.XboxUserId);

            group.UpdateView(users, new List <SocialEvent>());

            return(group);
        }
Пример #27
0
 public void DestroySocialUserGroup(XboxSocialUserGroup group)
 {
     // do nothing
 }