internal bool EditPost(string postID, string userName, string password, MWAPost sentPost, bool publish)
        {
            ValidateRequest(userName, password);

            var repository = Ioc.Resolve <IRepository>();

            var user = repository.Find <UserProfile>().GetBy(string.IsNullOrEmpty(sentPost.author) ? userName : sentPost.author);
            var post = repository.Get <Post>(postID.ToInt());

            post.Author      = user.Name;
            post.Title       = sentPost.title;
            post.Content     = sentPost.description;
            post.IsPublished = publish;
            post.Slug        = sentPost.slug;
            post.Description = sentPost.excerpt;

            post.Categories.Clear();
            foreach (string item in sentPost.categories.Where(x => x != null && x.Trim() != ""))
            {
                post.Categories.Add(new Category(item.Trim(), ""));
            }

            post.Tags.Clear();
            foreach (string item in sentPost.tags.Where(x => x != null && x.Trim() != ""))
            {
                post.Tags.Add(item.Trim());
            }

            if (sentPost.postDate != DateTime.MinValue)
            {
                post.DateCreated = sentPost.postDate;
            }

            repository.Save(post);

            return(true);
        }
        private void LoadXMLRequest(string xml)
        {
            var request = new XmlDocument();
            try
            {
                if (!(xml.StartsWith("<?xml") || xml.StartsWith("<method")))
                    xml = xml.Substring(xml.IndexOf("<?xml"));
                request.LoadXml(xml);
            }
            catch (Exception ex)
            {
                throw new MetaWeblogException("01", "Invalid XMLRPC Request. (" + ex.Message + ")");
            }

            // Method name is always first
            _methodName = request.DocumentElement.ChildNodes[0].InnerText;

            // Parameters are next (and last)
            _inputParams = new List<XmlNode>();
            foreach (XmlNode node in request.SelectNodes("/methodCall/params/param"))
                _inputParams.Add(node);

            // Determine what params are what by method name
            switch (_methodName)
            {
                case "metaWeblog.newPost":
                    _blogID = _inputParams[0].InnerText;
                    _userName = _inputParams[1].InnerText;
                    _password = _inputParams[2].InnerText;
                    _post = GetPost(_inputParams[3]);
                    if (_inputParams[4].InnerText == "0" || _inputParams[4].InnerText == "false")
                        _publish = false;
                    else
                        _publish = true;
                    break;
                case "metaWeblog.editPost":
                    _postID = _inputParams[0].InnerText;
                    _userName = _inputParams[1].InnerText;
                    _password = _inputParams[2].InnerText;
                    _post = GetPost(_inputParams[3]);
                    if (_inputParams[4].InnerText == "0" || _inputParams[4].InnerText == "false")
                        _publish = false;
                    else
                        _publish = true;
                    break;
                case "metaWeblog.getPost":
                    _postID = _inputParams[0].InnerText;
                    _userName = _inputParams[1].InnerText;
                    _password = _inputParams[2].InnerText;
                    break;
                case "metaWeblog.newMediaObject":
                    _blogID = _inputParams[0].InnerText;
                    _userName = _inputParams[1].InnerText;
                    _password = _inputParams[2].InnerText;
                    _media = GetMediaObject(_inputParams[3]);
                    break;
                case "metaWeblog.getCategories":
                case "wp.getAuthors":
                case "wp.getPageList":
                case "wp.getPages":
                case "wp.getTags":
                    _blogID = _inputParams[0].InnerText;
                    _userName = _inputParams[1].InnerText;
                    _password = _inputParams[2].InnerText;
                    break;
                case "metaWeblog.getRecentPosts":
                    _blogID = _inputParams[0].InnerText;
                    _userName = _inputParams[1].InnerText;
                    _password = _inputParams[2].InnerText;
                    _numberOfPosts = Int32.Parse(_inputParams[3].InnerText, CultureInfo.InvariantCulture);
                    break;
                case "blogger.getUsersBlogs":
                case "metaWeblog.getUsersBlogs":
                    _appKey = _inputParams[0].InnerText;
                    _userName = _inputParams[1].InnerText;
                    _password = _inputParams[2].InnerText;
                    break;
                case "blogger.deletePost":
                    _appKey = _inputParams[0].InnerText;
                    _postID = _inputParams[1].InnerText;
                    _userName = _inputParams[2].InnerText;
                    _password = _inputParams[3].InnerText;
                    if (_inputParams[4].InnerText == "0" || _inputParams[4].InnerText == "false")
                        _publish = false;
                    else
                        _publish = true;
                    break;
                case "blogger.getUserInfo":
                    _appKey = _inputParams[0].InnerText;
                    _userName = _inputParams[1].InnerText;
                    _password = _inputParams[2].InnerText;
                    break;
                case "wp.newPage":
                    _blogID = _inputParams[0].InnerText;
                    _userName = _inputParams[1].InnerText;
                    _password = _inputParams[2].InnerText;
                    _page = GetPage(_inputParams[3]);
                    if (_inputParams[4].InnerText == "0" || _inputParams[4].InnerText == "false")
                        _publish = false;
                    else
                        _publish = true;
                    break;
                case "wp.getPage":
                    _blogID = _inputParams[0].InnerText;
                    _pageID = _inputParams[1].InnerText;
                    _userName = _inputParams[2].InnerText;
                    _password = _inputParams[3].InnerText;
                    break;
                case "wp.editPage":
                    _blogID = _inputParams[0].InnerText;
                    _pageID = _inputParams[1].InnerText;
                    _userName = _inputParams[2].InnerText;
                    _password = _inputParams[3].InnerText;
                    _page = GetPage(_inputParams[4]);
                    if (_inputParams[5].InnerText == "0" || _inputParams[5].InnerText == "false")
                        _publish = false;
                    else
                        _publish = true;
                    break;
                case "wp.deletePage":
                    _blogID = _inputParams[0].InnerText;
                    _userName = _inputParams[1].InnerText;
                    _password = _inputParams[2].InnerText;
                    _pageID = _inputParams[3].InnerText;
                    break;
                default:
                    throw new MetaWeblogException("02", "Unknown Method. (" + _methodName + ")");
            }
        }
        private MWAPost GetPost(XmlNode node)
        {
            var temp = new MWAPost();
            var cats = new List<string>();
            var tags = new List<string>();

            // Require Title and Description
            try
            {
                temp.title = node.SelectSingleNode("value/struct/member[name='title']").LastChild.InnerText;
                temp.description = node.SelectSingleNode("value/struct/member[name='description']").LastChild.InnerText;
            }
            catch (Exception ex)
            {
                throw new MetaWeblogException("05",
                                              "Post Struct Element, Title or Description,  not Sent. (" + ex.Message +
                                              ")");
            }
            if (node.SelectSingleNode("value/struct/member[name='link']") == null)
                temp.link = "";
            else
                temp.link = node.SelectSingleNode("value/struct/member[name='link']").LastChild.InnerText;

            if (node.SelectSingleNode("value/struct/member[name='mt_allow_comments']") == null)
                temp.commentPolicy = "";
            else
                temp.commentPolicy =
                    node.SelectSingleNode("value/struct/member[name='mt_allow_comments']").LastChild.InnerText;

            if (node.SelectSingleNode("value/struct/member[name='mt_excerpt']") == null)
                temp.excerpt = "";
            else
                temp.excerpt = node.SelectSingleNode("value/struct/member[name='mt_excerpt']").LastChild.InnerText;

            if (node.SelectSingleNode("value/struct/member[name='wp_slug']") == null)
                temp.slug = "";
            else
                temp.slug = node.SelectSingleNode("value/struct/member[name='wp_slug']").LastChild.InnerText;

            if (node.SelectSingleNode("value/struct/member[name='wp_author_id']") == null)
                temp.author = "";
            else
                temp.author = node.SelectSingleNode("value/struct/member[name='wp_author_id']").LastChild.InnerText;

            if (node.SelectSingleNode("value/struct/member[name='categories']") != null)
            {
                XmlNode categoryArray = node.SelectSingleNode("value/struct/member[name='categories']").LastChild;
                foreach (XmlNode catnode in categoryArray.SelectNodes("array/data/value/string"))
                {
                    cats.Add(catnode.InnerText);
                }
            }
            temp.categories = cats;

            // postDate has a few different names to worry about
            if (node.SelectSingleNode("value/struct/member[name='dateCreated']") != null)
            {
                try
                {
                    string tempDate =
                        node.SelectSingleNode("value/struct/member[name='dateCreated']").LastChild.InnerText;
                    temp.postDate = DateTime.ParseExact(tempDate, "yyyyMMdd'T'HH':'mm':'ss",
                                                        CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
                }
                catch
                {
                    // Ignore PubDate Error
                }
            }
            else if (node.SelectSingleNode("value/struct/member[name='pubDate']") != null)
            {
                try
                {
                    string tempPubDate =
                        node.SelectSingleNode("value/struct/member[name='pubDate']").LastChild.InnerText;
                    temp.postDate = DateTime.ParseExact(tempPubDate, "yyyyMMdd'T'HH':'mm':'ss",
                                                        CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
                }
                catch
                {
                    // Ignore PubDate Error
                }
            }

            // WLW tags implementation using mt_keywords
            if (node.SelectSingleNode("value/struct/member[name='mt_keywords']") != null)
            {
                string tagsList = node.SelectSingleNode("value/struct/member[name='mt_keywords']").LastChild.InnerText;
                foreach (string item in tagsList.Split(','))
                {
                    tags.Add(item.Trim().ToLowerInvariant());
                }
            }
            temp.tags = tags;

            return temp;
        }
        internal string NewPost(string blogId, string userName, string password, MWAPost sentPost, bool publish)
        {
            ValidateRequest(userName, password);

            var repository = Ioc.Resolve<IRepository>();

            var user = repository.Find<UserProfile>().GetBy(string.IsNullOrEmpty(sentPost.author) ? userName : sentPost.author);
            var post = new Post(user.Name, sentPost.title, sentPost.description, sentPost.excerpt, sentPost.slug, publish);

            foreach (string item in sentPost.categories.Where(x => x != null && x.Trim() != ""))
                post.Categories.Add(new Category(item.Trim(), ""));

            foreach (string item in sentPost.tags.Where(x => x != null && x.Trim() != ""))
                post.Tags.Add(item.Trim());

            if (sentPost.postDate != DateTime.MinValue)
                post.DateCreated = sentPost.postDate;

            repository.Save(post);

            return post.Id.ToString();
        }
        internal MWAPost GetPost(string postID, string userName, string password)
        {
            ValidateRequest(userName, password);

            MWAPost sendPost = new MWAPost();

            var repository = Ioc.Resolve<IRepository>();
            Post post = repository.Get<Post>(x => x.Id == postID.ToInt());

            sendPost.postID = post.Id.ToString();
            sendPost.postDate = post.DateCreated;
            sendPost.title = post.Title;
            sendPost.description = post.Content;

            //TODO: ????
            //sendPost.link = post.AbsoluteLink.AbsoluteUri;
            sendPost.slug = post.Slug;
            sendPost.excerpt = post.Description;

            sendPost.publish = post.IsPublished;

            var categories = new List<string>();
            for (int i = 0; i < post.Categories.Count; i++)
            {
                var category = repository.Get<Category>(x => x.Id == post.Categories[i].Id);
                categories.Add(category.Title);
            }
            sendPost.categories = categories;

            List<string> tags = new List<string>();
            for (int i = 0; i < post.Tags.Count; i++)
                tags.Add(post.Tags[i]);

            sendPost.tags = tags;

            return sendPost;
        }
        internal bool EditPost(string postID, string userName, string password, MWAPost sentPost, bool publish)
        {
            ValidateRequest(userName, password);

            var repository = Ioc.Resolve<IRepository>();

            var user = repository.Find<UserProfile>().GetBy(string.IsNullOrEmpty(sentPost.author) ? userName : sentPost.author);
            var post = repository.Get<Post>(postID.ToInt());

            post.Author = user.Name;
            post.Title = sentPost.title;
            post.Content = sentPost.description;
            post.IsPublished = publish;
            post.Slug = sentPost.slug;
            post.Description = sentPost.excerpt;

            post.Categories.Clear();
            foreach (string item in sentPost.categories.Where(x => x != null && x.Trim() != ""))
                post.Categories.Add(new Category(item.Trim(), ""));

            post.Tags.Clear();
            foreach (string item in sentPost.tags.Where(x => x != null && x.Trim() != ""))
                post.Tags.Add(item.Trim());

            if (sentPost.postDate != DateTime.MinValue)
                post.DateCreated = sentPost.postDate;

            repository.Save(post);

            return true;
        }