private XmlRpcStruct GetParticipatedTopics(string participantUserName, int startIndex, int endIndex, string searchId, int participantUserId)
        {
            var aftContext = ActiveForumsTapatalkModuleContext.Create(Context);

            if (aftContext == null || aftContext.Module == null)
                throw new XmlRpcFaultException(100, "Invalid Context");

            Context.Response.AddHeader("Mobiquo_is_login", aftContext.UserId > 0 ? "true" : "false");

            var portalId = aftContext.Module.PortalID;
            var forumModuleId = aftContext.ModuleSettings.ForumModuleId;
            var userId = aftContext.UserId;

            // Lookup the user id for the username if needed
            if (participantUserId <= 0)
            {
                var forumUser = new ActiveForums.UserController().GetUser(aftContext.Portal.PortalID, aftContext.ModuleSettings.ForumModuleId, participantUserName);

                if (forumUser != null)
                    participantUserId = forumUser.UserId;
            }

            // If we don't have a valid participant user id at this point, return invalid result
            if (participantUserId <= 0)
            {
                return new XmlRpcStruct
                           {
                               {"result", false},
                               {"result_text", "User Not Found".ToBytes()},
                               {"total_topic_num", 0},
                               {"total_unread_num", 0}
                           };
            }


            // Build a list of forums the user has access to
            var fc = new AFTForumController();
            var forumIds = fc.GetForumsForUser(aftContext.ForumUser.UserRoles, portalId, forumModuleId, "CanRead");

            var mainSettings = new SettingsInfo { MainSettings = new Entities.Modules.ModuleController().GetModuleSettings(forumModuleId) };

            var maxRows = endIndex + 1 - startIndex;

            var participatedTopics = fc.GetParticipatedTopics(portalId, forumModuleId, userId, forumIds, participantUserId, startIndex, maxRows).ToList();

            return new XmlRpcStruct
                       {
                           {"result", true},
                           {"total_topic_num", participatedTopics.Count > 0 ? participatedTopics[0].TopicCount : 0},
                           {"total_unread_num", participatedTopics.Count > 0 ? participatedTopics[0].UnreadTopicCount : 0},
                           {"topics", participatedTopics.Select(t => new ExtendedTopicStructure{ 
                                                   TopicId = t.TopicId.ToString(),
                                                   AuthorAvatarUrl = GetAvatarUrl(t.LastReplyAuthorId),
                                                   AuthorId = t.LastReplyAuthorId.ToString(),
                                                   AuthorName = GetLastReplyAuthorName(mainSettings, t).ToBytes(),
                                                   ForumId = t.ForumId.ToString(),
                                                   ForumName = t.ForumName.ToBytes(),
                                                   HasNewPosts =  (t.LastReplyId < 0 && t.TopicId > t.UserLastTopicRead) || t.LastReplyId > t.UserLastReplyRead,
                                                   IsLocked = t.IsLocked,
                                                   IsSubscribed = t.SubscriptionType > 0,
                                                   CanSubscribe = ActiveForums.Permissions.HasPerm(aftContext.ForumUser.UserRoles, fc.GetForumPermissions(t.ForumId).CanSubscribe), // GetforumPermissions uses cache so it shouldn't be a performance issue
                                                   ReplyCount = t.ReplyCount,
                                                   Summary = GetSummary(null, t.LastReplyBody).ToBytes(),
                                                   ViewCount = t.ViewCount,
                                                   DateCreated = t.LastReplyDate,
                                                   Title = HttpUtility.HtmlDecode(t.Subject + string.Empty).ToBytes()
                                               }).ToArray()}
                       };
        }
        public XmlRpcStruct Login(string login, string password)
        {
            var aftContext = ActiveForumsTapatalkModuleContext.Create(Context);

            if (aftContext == null || aftContext.Portal == null)
                throw new XmlRpcFaultException(100, "Invalid Context");

            var loginStatus = UserLoginStatus.LOGIN_FAILURE;

            Entities.Users.UserController.ValidateUser(aftContext.Portal.PortalID, login, password, string.Empty, aftContext.Portal.PortalName, Context.Request.UserHostAddress, ref loginStatus);

            var result = false;
            var resultText = string.Empty;

            switch (loginStatus)
            {
                case UserLoginStatus.LOGIN_SUCCESS:
                case UserLoginStatus.LOGIN_SUPERUSER:
                    result = true;
                    break;

                case UserLoginStatus.LOGIN_FAILURE:
                    resultText = "Invalid Login/Password Combination";
                    break;

                case UserLoginStatus.LOGIN_USERNOTAPPROVED:
                    resultText = "User Not Approved";
                    break;

                case UserLoginStatus.LOGIN_USERLOCKEDOUT:
                    resultText = "User Temporarily Locked Out";
                    break;

                default:
                    resultText = "Unknown Login Error";
                    break;
            }

            User forumUser = null;

            if (result)
            {
                // Get the User
                var userInfo = Entities.Users.UserController.GetUserByName(aftContext.Module.PortalID, login);

                if (userInfo == null)
                {
                    result = false;
                    resultText = "Unknown Login Error";
                }
                else
                {
                    // Set Login Cookie
                    var expiration = DateTime.Now.Add(FormsAuthentication.Timeout);

                    var ticket = new FormsAuthenticationTicket(1, login, DateTime.Now, expiration, false, userInfo.UserID.ToString());
                    var authCookie = new HttpCookie(aftContext.AuthCookieName, FormsAuthentication.Encrypt(ticket))
                    {
                        Domain = FormsAuthentication.CookieDomain,
                        Path = FormsAuthentication.FormsCookiePath,
                    };


                    Context.Response.SetCookie(authCookie);

                    forumUser = new ActiveForums.UserController().GetUser(aftContext.Module.PortalID, aftContext.ModuleSettings.ForumModuleId, userInfo.UserID);
                }
            }

            Context.Response.AddHeader("Mobiquo_is_login", result ? "true" : "false");



            var rpcstruct = new XmlRpcStruct
                                {
                                    {"result", result },
                                    {"result_text", resultText.ToBytes()}, 
                                    {"can_upload_avatar", false},
                                    {"can_pm", false}
                                };

            if (result && forumUser != null)
            {
                rpcstruct.Add("user_id", forumUser.UserId.ToString());
                rpcstruct.Add("username", forumUser.UserName.ToBytes());
                rpcstruct.Add("email", forumUser.Email.ToBytes());
                rpcstruct.Add("usergroup_id", new string[] { });
                rpcstruct.Add("post_count", forumUser.PostCount);
                rpcstruct.Add("icon_url", GetAvatarUrl(forumUser.UserId));

            }


            return rpcstruct;

        }