Пример #1
0
 /// <summary>
 /// Inserts an element into the RssChannelCollection at the specified index
 /// </summary>
 /// <param name="index">
 /// The index at which the RssChannel is to be inserted.
 /// </param>
 /// <param name="value">
 /// The RssChannel to insert.
 /// </param>
 public virtual void Insert(int index, RssChannel value)
 {
     this.List.Insert(index, value);
 }
Пример #2
0
 /// <summary>
 /// Removes the first occurrence of a specific RssChannel from this RssChannelCollection.
 /// </summary>
 /// <param name="value">
 /// The RssChannel value to remove from this RssChannelCollection.
 /// </param>
 public virtual void Remove(RssChannel value)
 {
     this.List.Remove(value);
 }
Пример #3
0
 /// <summary>
 /// Determines whether a specfic RssChannel value is in this RssChannelCollection.
 /// </summary>
 /// <param name="value">
 /// The RssChannel value to locate in this RssChannelCollection.
 /// </param>
 /// <returns>
 /// true if value is found in this RssChannelCollection;
 /// false otherwise.
 /// </returns>
 public virtual bool Contains(RssChannel value)
 {
     return this.List.Contains(value);
 }
Пример #4
0
 /// <summary>
 /// Return the zero-based index of the first occurrence of a specific value
 /// in this RssChannelCollection
 /// </summary>
 /// <param name="value">
 /// The RssChannel value to locate in the RssChannelCollection.
 /// </param>
 /// <returns>
 /// The zero-based index of the first occurrence of the _ELEMENT value if found;
 /// -1 otherwise.
 /// </returns>
 public virtual int IndexOf(RssChannel value)
 {
     return this.List.IndexOf(value);
 }
Пример #5
0
 /// <summary>
 /// Adds an instance of type RssChannel to the end of this RssChannelCollection.
 /// </summary>
 /// <param name="value">
 /// The RssChannel to be added to the end of this RssChannelCollection.
 /// </param>
 public virtual void Add(RssChannel value)
 {
     this.List.Add(value);
 }
Пример #6
0
 /// <summary>
 /// Adds the elements of an array to the end of this RssChannelCollection.
 /// </summary>
 /// <param name="items">
 /// The array whose elements are to be added to the end of this RssChannelCollection.
 /// </param>
 public virtual void AddRange(RssChannel[] items)
 {
     foreach (RssChannel item in items)
     {
         this.List.Add(item);
     }
 }
Пример #7
0
 /// <summary>
 /// Initializes a new instance of the RssChannelCollection class, containing elements
 /// copied from an array.
 /// </summary>
 /// <param name="items">
 /// The array whose elements are to be added to the new RssChannelCollection.
 /// </param>
 public RssChannelCollection(RssChannel[] items)
 {
     this.AddRange(items);
 }
        private RssRoot GetRssCore(string category, int maxDayCount, int maxEntryCount)
        {
            if (RedirectToFeedBurnerIfNeeded(category) == true)
            {
                return null;
            }
            EntryCollection entries = null;
            //We only build the entries if blogcore doesn't exist and we'll need them later...
            if (dataService.GetLastEntryUpdate() == DateTime.MinValue)
            {
                entries = BuildEntries(category, maxDayCount, maxEntryCount);
            }

            //Try to get out as soon as possible with as little CPU as possible
            if ( inASMX )
            {
                DateTime lastModified = SiteUtilities.GetLatestModifedEntryDateTime(dataService, entries);
                if (SiteUtilities.GetStatusNotModified(lastModified))
                    return null;
            }

            if ( inASMX )
            {
                string referrer = Context.Request.UrlReferrer!=null?Context.Request.UrlReferrer.AbsoluteUri:"";
                if (ReferralBlackList.IsBlockedReferrer(referrer))
                {
                    if (siteConfig.EnableReferralUrlBlackList404s)
                    {
                        return null;
                    }
                }
                else
                {
                    loggingService.AddReferral(
                        new LogDataItem(
                        Context.Request.RawUrl,
                        referrer,
                        Context.Request.UserAgent,
                        Context.Request.UserHostName));
                }
            }

            //not-modified didn't work, do we have this in cache?
            string CacheKey = "Rss:" + category + ":" + maxDayCount.ToString() + ":" + maxEntryCount.ToString();
            RssRoot documentRoot = cache[CacheKey] as RssRoot;
            if (documentRoot == null) //we'll have to build it...
            {
                //However, if we made it this far, the not-modified check didn't work, and we may not have entries...
                if(entries == null)
                {
                    entries = BuildEntries(category, maxDayCount, maxEntryCount);
                }

                documentRoot = new RssRoot();
                documentRoot.Namespaces.Add("dc","http://purl.org/dc/elements/1.1/");
                documentRoot.Namespaces.Add("trackback","http://madskills.com/public/xml/rss/module/trackback/");
                documentRoot.Namespaces.Add("pingback","http://madskills.com/public/xml/rss/module/pingback/");
                if (siteConfig.EnableComments)
                {
                    documentRoot.Namespaces.Add("wfw","http://wellformedweb.org/CommentAPI/");
                    documentRoot.Namespaces.Add("slash","http://purl.org/rss/1.0/modules/slash/");
                }
                if (siteConfig.EnableGeoRss)
                {
                    documentRoot.Namespaces.Add("georss", "http://www.georss.org/georss");
                }

                RssChannel ch = new RssChannel();

                if(category == null)
                {
                    ch.Title = siteConfig.Title;
                }
                else
                {
                    ch.Title = siteConfig.Title + " - " + category;
                }

                if ( siteConfig.Description == null || siteConfig.Description.Trim().Length == 0 )
                {
                    ch.Description = siteConfig.Subtitle;
                }
                else
                {
                    ch.Description=siteConfig.Description;
                }

                ch.Link = SiteUtilities.GetBaseUrl(siteConfig);
                ch.Copyright = siteConfig.Copyright;
                if (siteConfig.RssLanguage != null && siteConfig.RssLanguage.Length >0)
                {
                    ch.Language = siteConfig.RssLanguage;
                }
                ch.ManagingEditor = siteConfig.Contact;
                ch.WebMaster = siteConfig.Contact;
                ch.Image = null;
                if (siteConfig.ChannelImageUrl != null && siteConfig.ChannelImageUrl.Trim().Length > 0)
                {
                    ChannelImage channelImage = new ChannelImage();
                    channelImage.Title = ch.Title;
                    channelImage.Link = ch.Link;
                    if (siteConfig.ChannelImageUrl.StartsWith("http"))
                    {
                        channelImage.Url = siteConfig.ChannelImageUrl;
                    }
                    else
                    {
                        channelImage.Url = SiteUtilities.RelativeToRoot(siteConfig,siteConfig.ChannelImageUrl);
                    }
                    ch.Image = channelImage;
                }

                documentRoot.Channels.Add(ch);

                foreach (Entry entry in entries)
                {
                    if (entry.IsPublic == false || entry.Syndicated == false)
                    {
                        continue;
                    }
                    XmlDocument doc2 = new XmlDocument();
                    ArrayList anyElements = new ArrayList();
                    RssItem item = new RssItem();
                    item.Title = entry.Title;
                    item.Guid = new Rss20.Guid();
                    item.Guid.IsPermaLink = false;
                    item.Guid.Text = SiteUtilities.GetPermaLinkUrl(siteConfig, entry.EntryId);
                    item.Link = SiteUtilities.GetPermaLinkUrl(siteConfig, entry);
                    User user = SiteSecurity.GetUser(entry.Author);
                    //Scott Hanselman: According to the RSS 2.0 spec and FeedValidator.org,
                    // we can have EITHER an Author tag OR the preferred dc:creator tag, but NOT BOTH.
                    //					if (user != null && user.EmailAddress != null && user.EmailAddress.Length > 0)
                    //					{
                    //						if (user.DisplayName != null && user.DisplayName.Length > 0)
                    //						{
                    //							item.Author = String.Format("{0} ({1})", user.EmailAddress, user.DisplayName);
                    //						}
                    //						else
                    //						{
                    //							item.Author = user.EmailAddress;
                    //						}
                    //					}
                    XmlElement trackbackPing = doc2.CreateElement("trackback","ping","http://madskills.com/public/xml/rss/module/trackback/");
                    trackbackPing.InnerText= SiteUtilities.GetTrackbackUrl(siteConfig,entry.EntryId);
                    anyElements.Add(trackbackPing);

                    XmlElement pingbackServer = doc2.CreateElement("pingback","server","http://madskills.com/public/xml/rss/module/pingback/");
                    pingbackServer.InnerText= new Uri(new Uri(SiteUtilities.GetBaseUrl(siteConfig)), "pingback.aspx").ToString();
                    anyElements.Add(pingbackServer);

                    XmlElement pingbackTarget = doc2.CreateElement("pingback","target","http://madskills.com/public/xml/rss/module/pingback/");
                    pingbackTarget.InnerText=SiteUtilities.GetPermaLinkUrl(siteConfig, entry.EntryId);
                    anyElements.Add(pingbackTarget);

                    XmlElement dcCreator = doc2.CreateElement("dc","creator","http://purl.org/dc/elements/1.1/");
                    if (user != null)
                    {
                        // HACK AG No author e-mail address in feed items.
                        //						if (user.DisplayName != null && user.DisplayName.Length > 0)
                        //						{
                        //							if(user.EmailAddress != null && user.EmailAddress.Length > 0)
                        //							{
                        //								dcCreator.InnerText = String.Format("{0} ({1})", user.EmailAddress, user.DisplayName);
                        //							}
                        //							else
                        //							{
                        dcCreator.InnerText = user.DisplayName;
                        //							}
                        //						}
                        //						else
                        //						{
                        //							dcCreator.InnerText = user.EmailAddress;
                        //						}
                    }
                    anyElements.Add(dcCreator);

                    // Add GeoRSS if it exists.
                    if (siteConfig.EnableGeoRss)
                    {
                        Nullable<double> latitude = new Nullable<double>();
                        Nullable<double> longitude = new Nullable<double>();

                        if (entry.Latitude.HasValue)
                        {
                            latitude = entry.Latitude;
                        }
                        else
                        {
                            if (siteConfig.EnableDefaultLatLongForNonGeoCodedPosts)
                            {
                                latitude = siteConfig.DefaultLatitude;
                            }
                        }

                        if (entry.Longitude.HasValue)
                        {
                            longitude = entry.Longitude;
                        }
                        else
                        {
                            if (siteConfig.EnableDefaultLatLongForNonGeoCodedPosts)
                            {
                                longitude = siteConfig.DefaultLongitude;
                            }
                        }

                        if (latitude.HasValue && longitude.HasValue)
                        {
                            XmlElement geoLoc = doc2.CreateElement("georss", "point", "http://www.georss.org/georss");
                            geoLoc.InnerText = String.Format(CultureInfo.InvariantCulture, "{0:R} {1:R}", latitude, longitude);
                            anyElements.Add(geoLoc);
                        }
                    }

                    if (siteConfig.EnableComments)
                    {
                        if (entry.AllowComments)
                        {
                            XmlElement commentApi = doc2.CreateElement("wfw","comment","http://wellformedweb.org/CommentAPI/");
                            commentApi.InnerText=SiteUtilities.GetCommentViewUrl(siteConfig,entry.EntryId);
                            anyElements.Add(commentApi);
                        }

                        XmlElement commentRss = doc2.CreateElement("wfw","commentRss","http://wellformedweb.org/CommentAPI/");
                        commentRss.InnerText=SiteUtilities.GetEntryCommentsRssUrl(siteConfig,entry.EntryId);
                        anyElements.Add(commentRss);

                        //for RSS conformance per FeedValidator.org
                        int commentsCount = dataService.GetPublicCommentsFor(entry.EntryId).Count;
                        if (commentsCount > 0)
                        {
                            XmlElement slashComments = doc2.CreateElement("slash","comments","http://purl.org/rss/1.0/modules/slash/");
                            slashComments.InnerText=commentsCount.ToString();
                            anyElements.Add(slashComments);
                        }
                        item.Comments = SiteUtilities.GetCommentViewUrl(siteConfig,entry.EntryId);
                    }
                    item.Language = entry.Language;

                    if (entry.Categories != null && entry.Categories.Length > 0)
                    {
                        if(item.Categories == null) item.Categories = new RssCategoryCollection();

                        string[] cats = entry.Categories.Split(';');
                        foreach(string c in cats)
                        {
                            RssCategory cat = new RssCategory();
                            string cleanCat = c.Replace('|', '/');
                            cat.Text = cleanCat;
                            item.Categories.Add(cat);
                        }
                    }
                    if (entry.Attachments.Count > 0)
                    {
                        // RSS currently supports only a single enclsoure so we return the first one
                        item.Enclosure =  new Enclosure();
                        item.Enclosure.Url = SiteUtilities.GetEnclosureLinkUrl(entry.EntryId, entry.Attachments[0]);
                        item.Enclosure.Type = entry.Attachments[0].Type;
                        item.Enclosure.Length = entry.Attachments[0].Length.ToString();
                    }
                    item.PubDate = entry.CreatedUtc.ToString("R");
                    if (ch.LastBuildDate == null || ch.LastBuildDate.Length == 0)
                    {
                        ch.LastBuildDate = item.PubDate;
                    }

                    if (!siteConfig.AlwaysIncludeContentInRSS &&
                        entry.Description != null &&
                        entry.Description.Trim().Length > 0)
                    {
                        item.Description = PreprocessItemContent(entry.EntryId, entry.Description);

                    }
                    else
                    {
                       if (siteConfig.HtmlTidyContent == false)
                       {
                          item.Description = "<div>" + PreprocessItemContent(entry.EntryId, entry.Content) + "</div>";
                       }
                       else
                       {
                     item.Description = ContentFormatter.FormatContentAsHTML(PreprocessItemContent(entry.EntryId, entry.Content));

                     try
                     {
                        string xhtml = ContentFormatter.FormatContentAsXHTML(PreprocessItemContent(entry.EntryId, entry.Content));
                        doc2.LoadXml(xhtml);
                        anyElements.Add((XmlElement)doc2.SelectSingleNode("//*[local-name() = 'body'][namespace-uri()='http://www.w3.org/1999/xhtml']"));
                     }
                     catch //(Exception ex)
                     {
                        //Debug.Write(ex.ToString());
                        // absorb
                     }
                       }
                    }

                    item.anyElements = (XmlElement[])anyElements.ToArray(typeof(XmlElement));
                    ch.Items.Add(item);
                }
                cache.Insert(CacheKey,documentRoot,DateTime.Now.AddMinutes(5));
            }
            return documentRoot;
        }
        private RssRoot GetCommentsRssCore(CommentCollection _com, string guid)
        {
            //Try to get out as soon as possible with as little CPU as possible
            if ( inASMX )
            {
                DateTime lastModified = SiteUtilities.GetLatestModifedCommentDateTime(dataService, _com);
                if (SiteUtilities.GetStatusNotModified(lastModified))
                    return null;
            }

            if ( inASMX )
            {
                string referrer = Context.Request.UrlReferrer!=null?Context.Request.UrlReferrer.AbsoluteUri:"";
                if (ReferralBlackList.IsBlockedReferrer(referrer) == false)
                {
                    loggingService.AddReferral(
                        new LogDataItem(
                        Context.Request.RawUrl,
                        referrer,
                        Context.Request.UserAgent,
                        Context.Request.UserHostName));
                }
            }

            // TODO: Figure out why this code is copied and pasted from above rather than using a function (shame!)
            RssRoot documentRoot = new RssRoot();
            RssChannel ch = new RssChannel();
            if (guid != null && guid != String.Empty)
            {
                //Set the title for this RSS Comments feed
                ch.Title = siteConfig.Title + " - Comments on " + dataService.GetEntry(guid).Title;
            }
            else
            {
                ch.Title = siteConfig.Title + " - Comments";
            }
            ch.Link = SiteUtilities.GetBaseUrl(siteConfig);
            ch.Copyright = siteConfig.Copyright;
            ch.ManagingEditor = siteConfig.Contact;
            ch.WebMaster = siteConfig.Contact;
            documentRoot.Channels.Add(ch);

            int i = 0;

            foreach (Comment c in _com)
            {
                ArrayList anyElements = new ArrayList();
                if (i == siteConfig.RssEntryCount) { break; }
                i++;
                string tempTitle = "";
                RssItem item = new RssItem();

                if(c.TargetTitle != null && c.TargetTitle.Length > 0 )
                {
                    tempTitle = " on \"" + c.TargetTitle + "\"";
                }

                if(c.Author == null || c.Author == "")
                {
                    item.Title = "Comment" + tempTitle;
                }
                else
                {
                    item.Title = "Comment by " + c.Author + tempTitle;
                }

                //Per the RSS Comments Spec it makes more sense for guid and link to be the same.
                // http://blogs.law.harvard.edu/tech/rss#comments
                // 11/11/05 - SDH - Now, I'm thinking not so much...
                item.Guid = new Rss20.Guid();
                item.Guid.Text = c.EntryId;
                item.Guid.IsPermaLink = false;
                item.Link = SiteUtilities.GetCommentViewUrl(siteConfig, c.TargetEntryId, c.EntryId);

                item.PubDate = c.CreatedUtc.ToString("R");

                item.Description = c.Content.Replace(Environment.NewLine, "<br />");
                if (c.AuthorHomepage == null || c.AuthorHomepage == "")
                {
                    if (c.AuthorEmail == null || c.AuthorEmail == "")
                    {
                        if(!(c.Author == null || c.Author == "") )
                        {
                            item.Description = c.Content.Replace(Environment.NewLine, "<br />") + "<br /><br />" + "Posted by: " + c.Author;
                        }
                    }
                    else
                    {
                        string content = c.Content.Replace(Environment.NewLine, "<br />");
                        if (!siteConfig.SupressEmailAddressDisplay)
                        {
                            item.Description = content + "<br /><br />" + "Posted by: " + "<a href=\"mailto:" + SiteUtilities.SpamBlocker(c.AuthorEmail) + "\">" + c.Author + "</a>";
                        }
                        else
                        {
                            item.Description = content + "<br /><br />" + "Posted by: " + c.Author;
                        }

                    }
                }
                else
                {
                    if (c.AuthorHomepage.IndexOf("http://") < 0)
                    {
                        c.AuthorHomepage = "http://" + c.AuthorHomepage;
                    }
                    item.Description += "<br /><br />" + "Posted by: " + "<a href=\"" + c.AuthorHomepage +
                        "\">" + c.Author + "</a>";
                }

                if (c.Author != null && c.Author.Length > 0 )
                {

                     	// the rss spec requires an email address in the author tag
                    // and it can not be obfuscated
                        // according to the feedvalidator
                    string email;

                    if ( !siteConfig.SupressEmailAddressDisplay )
                    {
                        email = (c.AuthorEmail != null && c.AuthorEmail.Length > 0 ? c.AuthorEmail : "*****@*****.**");
                    }
                    else
                    {
                        email = "*****@*****.**";
                    }

                    item.Author = String.Format( "{0} ({1})", email, c.Author);
                }

                item.Comments = SiteUtilities.GetCommentViewUrl(siteConfig,c.TargetEntryId,c.EntryId);

                if (ch.LastBuildDate == null || ch.LastBuildDate.Length == 0)
                {
                    ch.LastBuildDate = item.PubDate;
                }

                XmlDocument doc2 = new XmlDocument();
                try
                {
                    doc2.LoadXml(c.Content);
                    anyElements.Add( (XmlElement)doc2.SelectSingleNode("//*[local-name() = 'body'][namespace-uri()='http://www.w3.org/1999/xhtml']") );
                }
                catch
                {
                    // absorb
                }
                item.anyElements = (XmlElement[])anyElements.ToArray(typeof(XmlElement));
                ch.Items.Add(item);
            }

            return documentRoot;
        }