/// <summary>
        ///
        /// </summary>
        /// <param name="id"></param>
        /// <param name="title"></param>
        /// <returns></returns>
        private OpdsLink GetDownloadLink(string id, string title)
        {
            if (String.IsNullOrEmpty(DownloadLinkPattern))
            {
                return(null);
            }

            var link = new OpdsLink
            {
                Title            = title,
                RelationshipType = OpdsRelations.OpenAcquisition,
                Uri = new Uri(String.Format(WebRequestHelper.CurrentHostUri + DownloadLinkPattern, Uri.EscapeDataString(id)), UriKind.RelativeOrAbsolute)
            };

            OnDownloadLinkGenerated(link);

            return(link);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="id"></param>
        /// <param name="title"></param>
        /// <param name="price"></param>
        /// <returns></returns>
        private OpdsLink GetBuyLink(string id, string title, decimal price)
        {
            if (String.IsNullOrEmpty(BuyLinkPattern))
            {
                return(null);
            }

            var link = new OpdsLink
            {
                Title            = title,
                RelationshipType = OpdsRelations.Buy,
                Uri = new Uri(String.Format(WebRequestHelper.CurrentHostUri + BuyLinkPattern, Uri.EscapeDataString(id)), UriKind.RelativeOrAbsolute),
            };

            link.Prices.Add(new OpdsPrice(price));
            OnBuyLinkGenerated(link);

            return(link);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="id"></param>
        /// <param name="title"></param>
        /// <returns></returns>
        private OpdsLink GetDetailLink(string id, string title)
        {
            if (String.IsNullOrEmpty(DetailLinkPattern))
            {
                throw new InvalidOperationException("DetailLinkPattern is not set.");
            }

            var link = new OpdsLink
            {
                Title            = title,
                MediaType        = OpdsMediaType.Entry,
                RelationshipType = OpdsRelations.Alternate,
                Uri = new Uri(String.Format(WebRequestHelper.CurrentHostUri + DetailLinkPattern, Uri.EscapeDataString(id)), UriKind.RelativeOrAbsolute)
            };

            OnDetailLinkGenerated(link);

            return(link);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="id"></param>
        /// <param name="title"></param>
        /// <returns></returns>
        private OpdsLink GetNavigationLink(string id, string title)
        {
            if (String.IsNullOrEmpty(NavigationLinkPattern))
            {
                throw new InvalidOperationException("NavigationLinkPattern is not set.");
            }

            var link = new OpdsLink
            {
                Title = title,
                // We don't know the media type of Uri point to.
                // It could either be a acquisition link or a navigation link.
                MediaType        = OpdsMediaType.Feed,
                RelationshipType = OpdsRelations.Alternate,
                Uri = new Uri(String.Format(WebRequestHelper.CurrentHostUri + NavigationLinkPattern, Uri.EscapeDataString(id)), UriKind.RelativeOrAbsolute)
            };

            OnNavigationLinkGenerated(link);

            return(link);
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="link"></param>
 protected virtual void OnDownloadLinkGenerated(OpdsLink link)
 {
 }
 /// <summary>
 ///
 /// </summary>
 /// <param name="link"></param>
 protected virtual void OnBuyLinkGenerated(OpdsLink link)
 {
 }
 /// <summary>
 ///
 /// </summary>
 /// <param name="link"></param>
 protected virtual void OnDetailLinkGenerated(OpdsLink link)
 {
 }
 /// <summary>
 ///
 /// </summary>
 /// <param name="link"></param>
 protected virtual void OnNavigationLinkGenerated(OpdsLink link)
 {
 }