/// <summary> /// Creates a Metaweblog Post object from the XML struct /// </summary> /// <param name="node"> /// XML contains a Metaweblog Post Struct /// </param> /// <returns> /// Metaweblog Post Struct Obejct /// </returns> private static MWAPost GetPost(XmlNode node) { var temp = new MWAPost(); // Require Title and Description var title = node.SelectSingleNode("value/struct/member[name='title']"); if (title == null) { throw new MetaWeblogException("05", "Page Struct Element, Title, not Sent."); } temp.title = title.LastChild.InnerText; var description = node.SelectSingleNode("value/struct/member[name='description']"); if (description == null) { throw new MetaWeblogException("05", "Page Struct Element, Description, not Sent."); } temp.description = description.LastChild.InnerText; var link = node.SelectSingleNode("value/struct/member[name='link']"); temp.link = link == null ? string.Empty : link.LastChild.InnerText; var allowComments = node.SelectSingleNode("value/struct/member[name='mt_allow_comments']"); temp.commentPolicy = allowComments == null ? string.Empty : allowComments.LastChild.InnerText; var excerpt = node.SelectSingleNode("value/struct/member[name='mt_excerpt']"); temp.excerpt = excerpt == null ? string.Empty : excerpt.LastChild.InnerText; var slug = node.SelectSingleNode("value/struct/member[name='wp_slug']"); temp.slug = slug == null ? string.Empty : slug.LastChild.InnerText; var authorId = node.SelectSingleNode("value/struct/member[name='wp_author_id']"); temp.author = authorId == null ? string.Empty : authorId.LastChild.InnerText; var cats = new List<string>(); var categories = node.SelectSingleNode("value/struct/member[name='categories']"); if (categories != null) { var categoryArray = categories.LastChild; var categoryArrayNodes = categoryArray.SelectNodes("array/data/value/string"); if (categoryArrayNodes != null) { cats.AddRange(categoryArrayNodes.Cast<XmlNode>().Select( catnode => catnode.InnerText)); } } temp.categories = cats; // postDate has a few different names to worry about var dateCreated = node.SelectSingleNode("value/struct/member[name='dateCreated']"); var pubDate = node.SelectSingleNode("value/struct/member[name='pubDate']"); if (dateCreated != null) { try { var tempDate = dateCreated.LastChild.InnerText; temp.postDate = DateTime.ParseExact( tempDate, "yyyyMMdd'T'HH':'mm':'ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); } catch (Exception ex) { // Ignore PubDate Error Debug.WriteLine(ex.Message); } } else if (pubDate != null) { try { var tempPubDate = pubDate.LastChild.InnerText; temp.postDate = DateTime.ParseExact( tempPubDate, "yyyyMMdd'T'HH':'mm':'ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); } catch (Exception ex) { // Ignore PubDate Error Debug.WriteLine(ex.Message); } } // WLW tags implementation using mt_keywords var tags = new List<string>(); var keywords = node.SelectSingleNode("value/struct/member[name='mt_keywords']"); if (keywords != null) { var tagsList = keywords.LastChild.InnerText; foreach (var item in tagsList.Split(',').Where(item => string.IsNullOrEmpty(tags.Find(t => t.Equals(item.Trim(), StringComparison.OrdinalIgnoreCase))))) { tags.Add(item.Trim()); } } temp.tags = tags; return temp; }
/// <summary> /// Creates a Metaweblog Post object from the XML struct /// </summary> /// <param name="node"> /// XML contains a Metaweblog Post Struct /// </param> /// <returns> /// Metaweblog Post Struct Obejct /// </returns> private static MWAPost GetPost(XmlNode node) { var temp = new MWAPost(); // Require Title and Description var title = node.SelectSingleNode("value/struct/member[name='title']"); if (title == null) { throw new MetaWeblogException("05", "Page Struct Element, Title, not Sent."); } temp.title = title.LastChild.InnerText; var description = node.SelectSingleNode("value/struct/member[name='description']"); if (description == null) { throw new MetaWeblogException("05", "Page Struct Element, Description, not Sent."); } temp.description = description.LastChild.InnerText; var link = node.SelectSingleNode("value/struct/member[name='link']"); temp.link = link == null ? string.Empty : link.LastChild.InnerText; var allowComments = node.SelectSingleNode("value/struct/member[name='mt_allow_comments']"); temp.commentPolicy = allowComments == null ? string.Empty : allowComments.LastChild.InnerText; var excerpt = node.SelectSingleNode("value/struct/member[name='mt_excerpt']"); temp.excerpt = excerpt == null ? string.Empty : excerpt.LastChild.InnerText; var slug = node.SelectSingleNode("value/struct/member[name='wp_slug']"); temp.slug = slug == null ? string.Empty : slug.LastChild.InnerText; var authorId = node.SelectSingleNode("value/struct/member[name='wp_author_id']"); temp.author = authorId == null ? string.Empty : authorId.LastChild.InnerText; var cats = new List <string>(); var categories = node.SelectSingleNode("value/struct/member[name='categories']"); if (categories != null) { var categoryArray = categories.LastChild; var categoryArrayNodes = categoryArray.SelectNodes("array/data/value/string"); if (categoryArrayNodes != null) { cats.AddRange(categoryArrayNodes.Cast <XmlNode>().Select( catnode => catnode.InnerText)); } } temp.categories = cats; // postDate has a few different names to worry about var dateCreated = node.SelectSingleNode("value/struct/member[name='dateCreated']"); var pubDate = node.SelectSingleNode("value/struct/member[name='pubDate']"); if (dateCreated != null) { try { var tempDate = dateCreated.LastChild.InnerText; temp.postDate = DateTime.ParseExact( tempDate, "yyyyMMdd'T'HH':'mm':'ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); } catch (Exception ex) { // Ignore PubDate Error Debug.WriteLine(ex.Message); } } else if (pubDate != null) { try { var tempPubDate = pubDate.LastChild.InnerText; temp.postDate = DateTime.ParseExact( tempPubDate, "yyyyMMdd'T'HH':'mm':'ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); } catch (Exception ex) { // Ignore PubDate Error Debug.WriteLine(ex.Message); } } // WLW tags implementation using mt_keywords var tags = new List <string>(); var keywords = node.SelectSingleNode("value/struct/member[name='mt_keywords']"); if (keywords != null) { var tagsList = keywords.LastChild.InnerText; foreach (var item in tagsList.Split(',').Where(item => string.IsNullOrEmpty(tags.Find(t => t.Equals(item.Trim(), StringComparison.OrdinalIgnoreCase))))) { tags.Add(item.Trim()); } } temp.tags = tags; return(temp); }
/// <summary> /// metaWeblog.editPost method /// </summary> /// <param name="postId"> /// post guid in string format /// </param> /// <param name="userName"> /// login username /// </param> /// <param name="password"> /// login password /// </param> /// <param name="sentPost"> /// struct with post details /// </param> /// <param name="publish"> /// mark as published? /// </param> /// <returns> /// 1 if successful /// </returns> internal bool EditPost(string postId, string userName, string password, MWAPost sentPost, bool publish) { int blogid = Convert.ToInt32(postId); if (!UserCanEditPost(userName, blogid)) { throw new MetaWeblogException("11", MetaweblogResources.AccessDenied); } string author = String.IsNullOrEmpty(sentPost.author) ? userName : sentPost.author; Blog post = new Blog(blogid); if (post.ItemId == -1) { //not found throw new MetaWeblogException("11", MetaweblogResources.PostNotFound); } try { Hashtable moduleSettings = ModuleSettings.GetModuleSettings(post.ModuleId); BlogConfiguration config = new BlogConfiguration(moduleSettings); post.LastModUserGuid = siteUser.UserGuid; post.Title = sentPost.title; post.Description = SiteUtils.ChangeFullyQualifiedLocalUrlsToRelative(navigationSiteRoot, imageSiteRoot, sentPost.description); post.IsPublished = publish; //post.Slug = sentPost.slug; if (!string.IsNullOrEmpty(sentPost.excerpt)) { if (BlogConfiguration.UseExcerptFromMetawblogAsMetaDescription) { post.MetaDescription = UIHelper.CreateExcerpt(sentPost.excerpt, BlogConfiguration.MetaDescriptionMaxLengthToGenerate); } post.Excerpt = SiteUtils.ChangeFullyQualifiedLocalUrlsToRelative(navigationSiteRoot, imageSiteRoot, sentPost.excerpt); } switch (sentPost.commentPolicy) { //closed case "2": post.AllowCommentsForDays = -1; // closed break; // open case "1": // if the post was previously closed to comments // re-open it using the default allowed days if (post.AllowCommentsForDays < 0) { post.AllowCommentsForDays = config.DefaultCommentDaysAllowed; } break; //else unspecified, no change } post.ContentChanged += new ContentChangedEventHandler(blog_ContentChanged); bool enableContentVersioning = config.EnableContentVersioning; if ((siteSettings.ForceContentVersioning) || (WebConfigSettings.EnforceContentVersioningGlobally)) { enableContentVersioning = true; } if (enableContentVersioning) { post.CreateHistory(siteSettings.SiteGuid); } post.Save(); SetCategories(post, sentPost); SiteUtils.QueueIndexing(); return true; } catch (Exception ex) { log.Error(ex); throw new MetaWeblogException("12", string.Format("EditPost failed. Error: {0}", ex.Message)); } }
private void SetCategories(Blog post, MWAPost sentPost) { List<MWACategory> allBlogCategories = GetCategoriesForBlog(post.ModuleId); List<string> postCategories = GetCategoriesForPost(post.ItemId); foreach (string category in sentPost.categories) { if (category.Trim().Length == 0) { continue; } MWACategory categoryInfo = allBlogCategories.Find(delegate(MWACategory ci) { return ci.title.Equals(category, StringComparison.OrdinalIgnoreCase); }); if ((categoryInfo.id != null) && (categoryInfo.id.Length > 0)) { if (!postCategories.Contains(category)) { Blog.AddItemCategory(post.ItemId, Convert.ToInt32(categoryInfo.id)); } } else { int newCategoryId = Blog.AddBlogCategory(post.ModuleId, category); Blog.AddItemCategory(post.ItemId, newCategoryId); } } }
/// <summary> /// metaWeblog.newPost method /// </summary> /// <param name="blogId"> /// always 1000 in BlogEngine since it is a singlar blog instance /// </param> /// <param name="userName"> /// login username /// </param> /// <param name="password"> /// login password /// </param> /// <param name="sentPost"> /// struct with post details /// </param> /// <param name="publish"> /// mark as published? /// </param> /// <returns> /// postID as string /// </returns> internal string NewPost(string blogId, string userName, string password, MWAPost sentPost, bool publish) { int moduleId = Convert.ToInt32(blogId); if (!UserCanPostToBlog(userName, moduleId)) { throw new MetaWeblogException("11", MetaweblogResources.AccessDenied); } try { Module module = new Module(moduleId); Blog post = new Blog(); post.ModuleId = module.ModuleId; post.ModuleGuid = module.ModuleGuid; post.UserGuid = siteUser.UserGuid; post.LastModUserGuid = siteUser.UserGuid; if ((sentPost.postDate != null) && (sentPost.postDate > DateTime.MinValue) && (sentPost.postDate < DateTime.MaxValue)) { if (!WebConfigSettings.DisableUseOfPassedInDateForMetaWeblogApi) { post.StartDate = sentPost.postDate; } } post.Title = sentPost.title; post.Description = SiteUtils.ChangeFullyQualifiedLocalUrlsToRelative(navigationSiteRoot, imageSiteRoot, sentPost.description); if (!string.IsNullOrEmpty(sentPost.excerpt)) { if (BlogConfiguration.UseExcerptFromMetawblogAsMetaDescription) { post.MetaDescription = UIHelper.CreateExcerpt(sentPost.excerpt, BlogConfiguration.MetaDescriptionMaxLengthToGenerate); } post.Excerpt = SiteUtils.ChangeFullyQualifiedLocalUrlsToRelative(navigationSiteRoot, imageSiteRoot, sentPost.excerpt); } post.IncludeInFeed = true; post.IsPublished = publish; //post.Slug = sentPost.slug; //string author = String.IsNullOrEmpty(sentPost.author) ? userName : sentPost.author; switch (sentPost.commentPolicy) { //closed case "2": post.AllowCommentsForDays = -1; // closed break; // open case "1": default: Hashtable moduleSettings = ModuleSettings.GetModuleSettings(post.ModuleId); BlogConfiguration config = new BlogConfiguration(moduleSettings); post.AllowCommentsForDays = config.DefaultCommentDaysAllowed; break; } string newUrl = SiteUtils.SuggestFriendlyUrl(post.Title, siteSettings); post.ItemUrl = "~/" + newUrl; if (!post.Title.Contains("Theme Detection")) // don't index a temp post from livewriter that will be deleted { post.ContentChanged += new ContentChangedEventHandler(blog_ContentChanged); } post.Save(); int pageId = GetPageIdForModule(moduleId); FriendlyUrl newFriendlyUrl = new FriendlyUrl(); newFriendlyUrl.SiteId = siteSettings.SiteId; newFriendlyUrl.SiteGuid = siteSettings.SiteGuid; newFriendlyUrl.PageGuid = post.BlogGuid; newFriendlyUrl.Url = newUrl; newFriendlyUrl.RealUrl = "~/Blog/ViewPost.aspx?pageid=" + pageId.ToInvariantString() + "&mid=" + post.ModuleId.ToInvariantString() + "&ItemID=" + post.ItemId.ToInvariantString(); if (pageId > -1) { newFriendlyUrl.Save(); } SetCategories(post, sentPost); //post.Tags.Clear(); //foreach (var item in sentPost.tags.Where(item => item != null && item.Trim() != string.Empty)) //{ // post.Tags.Add(item); //} if (!post.Title.Contains("Theme Detection")) // don't index a temp post from livewriter that will be deleted { SiteUtils.QueueIndexing(); } return post.ItemId.ToString(); } catch (Exception ex) { log.Error(ex); throw new MetaWeblogException("12", string.Format("Create new post failed. Error: {0}", ex.Message)); } }
/// <summary> /// metaWeblog.getRecentPosts method /// </summary> /// <param name="blogId"> /// always 1000 in BlogEngine since it is a singlar blog instance /// </param> /// <param name="userName"> /// login username /// </param> /// <param name="password"> /// login password /// </param> /// <param name="numberOfPosts"> /// number of posts to return /// </param> /// <returns> /// array of post structs /// </returns> internal List<MWAPost> GetRecentPosts(string blogId, string userName, string password, int numberOfPosts) { int moduleId = Convert.ToInt32(blogId); if (moduleId == -1) { return new List<MWAPost>(); } //pages only no posts if (!UserCanPostToBlog(userName, moduleId)) { throw new MetaWeblogException("11", MetaweblogResources.AccessDenied); } try { var sendPosts = new List<MWAPost>(); DataSet blogPosts = Blog.GetBlogsForMetaWeblogApiDataSet(moduleId, DateTime.MaxValue); //using (IDataReader rdr = Blog.GetBlogsForMetaWeblogApi(moduleId, DateTime.MaxValue)) //{ //while (rdr.Read()) foreach (DataRow rdr in blogPosts.Tables["Posts"].Rows) { var tempPost = new MWAPost { postID = Convert.ToInt32(rdr["ItemID"]).ToInvariantString(), postDate = Convert.ToDateTime(rdr["StartDate"]).ToLocalTime(timeZone), title = rdr["Heading"].ToString(), description = SiteUtils.ChangeRelativeUrlsToFullyQualifiedUrls(navigationSiteRoot, imageSiteRoot, rdr["Description"].ToString()), link = FormatUrl(rdr["ItemUrl"].ToString(), Convert.ToInt32(rdr["ItemID"]), Convert.ToInt32(rdr["ModuleID"])), // slug = post.Slug, excerpt = SiteUtils.ChangeRelativeUrlsToFullyQualifiedUrls(navigationSiteRoot, imageSiteRoot, rdr["Abstract"].ToString()), //commentPolicy = post.HasCommentsEnabled ? string.Empty : "0", publish = Convert.ToBoolean(rdr["IsPublished"]), categories = GetCategories(blogPosts.Tables["Categories"], Convert.ToInt32(rdr["ItemID"])) }; //var tempCats = post.Categories.Select(t => Category.GetCategory(t.Id).ToString()).ToList(); //tempPost.categories = tempCats; //var tempTags = post.Tags.ToList(); //tempPost.tags = tempTags; sendPosts.Add(tempPost); } //} return sendPosts; } catch (Exception ex) { log.Error(ex); throw new MetaWeblogException("12", string.Format("GetRecentPosts failed. Error: {0}", ex.Message)); } }
/// <summary> /// metaWeblog.getPost method /// </summary> /// <param name="postId"> /// post guid in string format /// </param> /// <param name="userName"> /// login username /// </param> /// <param name="password"> /// login password /// </param> /// <returns> /// struct with post details /// </returns> internal MWAPost GetPost(string postId, string userName, string password) { var sendPost = new MWAPost(); int blogId = Convert.ToInt32(postId); if (blogId == -1) { throw new MetaWeblogException("11", MetaweblogResources.NoBlogConfigured); } if (!UserCanEditPost(userName, blogId)) { throw new MetaWeblogException("11", MetaweblogResources.AccessDenied); } Blog post = new Blog(blogId); if (post.ItemId == -1) { //not found throw new MetaWeblogException("11", MetaweblogResources.PostNotFound); } try { //Hashtable moduleSettings = ModuleSettings.GetModuleSettings(post.ModuleId); //BlogConfiguration config = new BlogConfiguration(moduleSettings); sendPost.link = FormatUrl(post.ItemUrl, post.ItemId, post.ModuleId); sendPost.postID = post.ItemId.ToString(); sendPost.postDate = post.StartDate.ToLocalTime(timeZone); sendPost.title = post.Title; sendPost.description = SiteUtils.ChangeRelativeUrlsToFullyQualifiedUrls(navigationSiteRoot, imageSiteRoot, post.Description); //sendPost.link = post.AbsoluteLink.AbsoluteUri; //sendPost.slug = post.Slug; sendPost.excerpt = SiteUtils.ChangeRelativeUrlsToFullyQualifiedUrls(navigationSiteRoot, imageSiteRoot, post.Excerpt); sendPost.publish = post.IsPublished; sendPost.categories = GetCategoriesForPost(post.ItemId); if(siteSettings.UseEmailForLogin) { sendPost.author = post.UserEmail; } else { sendPost.author = post.UserLoginName; } if (post.AllowCommentsForDays == -1) //closed { sendPost.commentPolicy = "2"; //closed } else { DateTime endDate = post.StartDate.AddDays((double)post.AllowCommentsForDays); if (endDate > DateTime.UtcNow) { sendPost.commentPolicy = "1"; //allowed } else { sendPost.commentPolicy = "2"; } } //var tags = post.Tags.ToList(); //sendPost.tags = tags; return sendPost; } catch (Exception ex) { log.Error(ex); throw new MetaWeblogException("12", string.Format("GetPost new post failed. Error: {0}", ex.Message)); } }