Exemplo n.º 1
0
            private BlogAccountFromRsdServiceDescription(RsdServiceDescription rsdServiceDescription)
            {
                // look for supported apis from highest fidelity to lowest
                RsdApi rsdApi = rsdServiceDescription.ScanForApi("WordPress");

                if (rsdApi == null)
                {
                    rsdApi = rsdServiceDescription.ScanForApi("MovableType");
                }
                if (rsdApi == null)
                {
                    rsdApi = rsdServiceDescription.ScanForApi("MetaWeblog");
                }

                if (rsdApi != null)
                {
                    Init(rsdServiceDescription.EngineName, rsdApi.Name, rsdApi.ApiLink, rsdApi.BlogId);
                    return;
                }
                else
                {
                    // couldn't find a supported api type so we fall through to here
                    throw new NoSupportedRsdClientTypeException();
                }
            }
Exemplo n.º 2
0
        private BlogAccount ScanForSupportedRsdApi(RsdServiceDescription rsdServiceDescription)
        {
            // initialize client type mappings (including mapping "implied" from ClientType itself
            ArrayList rsdClientTypeMappings = new ArrayList(_rsdClientTypeMappings);

            rsdClientTypeMappings.Add(new RsdClientTypeMapping(ClientType, ClientType));

            // scan for a match
            foreach (RsdClientTypeMapping mapping in rsdClientTypeMappings)
            {
                RsdApi rsdApi = rsdServiceDescription.ScanForApi(mapping.RsdClientType);
                if (rsdApi != null)
                {
                    // HACK: the internal spaces.msn-int site has a bug that causes it to return
                    // the production API URL, so force storage.msn.com to storage.msn-int.com
                    string postApiUrl = rsdApi.ApiLink;
                    if (rsdServiceDescription.HomepageLink.IndexOf("msn-int", StringComparison.OrdinalIgnoreCase) != -1)
                    {
                        postApiUrl = postApiUrl.Replace("storage.msn.com", "storage.msn-int.com");
                    }

                    return(new BlogAccount(Name, mapping.ClientType, postApiUrl, rsdApi.BlogId));
                }
            }

            // no match
            return(null);
        }
        public RsdRoot GetRsd()
        {
            RsdApiCollection apiCollection = new RsdApiCollection();

            UriBuilder home = new UriBuilder(_dasBlogSettings.GetBaseUrl());

            home.Path = "feed/blogger";
            string blogapiurl = home.ToString();

            RsdRoot    rsd            = new RsdRoot();
            RsdService dasBlogService = new RsdService();

            dasBlogService.HomePageLink = _dasBlogSettings.GetBaseUrl();

            RsdApi metaWeblog = new RsdApi();

            metaWeblog.Name      = "MetaWeblog";
            metaWeblog.Preferred = (_dasBlogSettings.SiteConfiguration.PreferredBloggingAPI == metaWeblog.Name);
            metaWeblog.ApiLink   = blogapiurl;
            metaWeblog.BlogID    = dasBlogService.HomePageLink;
            apiCollection.Add(metaWeblog);

            RsdApi blogger = new RsdApi();

            blogger.Name      = "Blogger";
            blogger.Preferred = (_dasBlogSettings.SiteConfiguration.PreferredBloggingAPI == blogger.Name);
            blogger.ApiLink   = blogapiurl;
            blogger.BlogID    = dasBlogService.HomePageLink;
            apiCollection.Add(blogger);

            RsdApi moveableType = new RsdApi();

            moveableType.Name      = "Moveable Type";
            moveableType.Preferred = (_dasBlogSettings.SiteConfiguration.PreferredBloggingAPI == moveableType.Name);
            moveableType.ApiLink   = blogapiurl;
            moveableType.BlogID    = dasBlogService.HomePageLink;
            apiCollection.Add(moveableType);

            dasBlogService.RsdApiCollection = apiCollection;
            rsd.Services.Add(dasBlogService);

            return(rsd);
        }
        public RsdRoot GetRsd()
        {
            var apiCollection = new RsdApiCollection();

            // UriBuilder home = new UriBuilder(dasBlogSettings.RelativeToRoot("feed/blogger"));
            var blogapiurl = dasBlogSettings.RelativeToRoot("feed/blogger");

            var rsd            = new RsdRoot();
            var dasBlogService = new RsdService();

            dasBlogService.HomePageLink = dasBlogSettings.GetBaseUrl();

            var metaWeblog = new RsdApi();

            metaWeblog.Name      = "MetaWeblog";
            metaWeblog.Preferred = (dasBlogSettings.SiteConfiguration.PreferredBloggingAPI == metaWeblog.Name);
            metaWeblog.ApiLink   = blogapiurl;
            metaWeblog.BlogID    = dasBlogService.HomePageLink;
            apiCollection.Add(metaWeblog);

            var blogger = new RsdApi();

            blogger.Name      = "Blogger";
            blogger.Preferred = (dasBlogSettings.SiteConfiguration.PreferredBloggingAPI == blogger.Name);
            blogger.ApiLink   = blogapiurl;
            blogger.BlogID    = dasBlogService.HomePageLink;
            apiCollection.Add(blogger);

            var moveableType = new RsdApi();

            moveableType.Name      = "Moveable Type";
            moveableType.Preferred = (dasBlogSettings.SiteConfiguration.PreferredBloggingAPI == moveableType.Name);
            moveableType.ApiLink   = blogapiurl;
            moveableType.BlogID    = dasBlogService.HomePageLink;
            apiCollection.Add(moveableType);

            dasBlogService.RsdApiCollection = apiCollection;
            rsd.Services.Add(dasBlogService);

            return(rsd);
        }
        public RsdRoot GetRsd()
        {
            // TODO: NLS - Make the default API configurable through SiteConfig
            SiteConfig       siteConfig    = SiteConfig.GetSiteConfig();
            RsdApiCollection apiCollection = new RsdApiCollection();

            RsdRoot    rsd            = new RsdRoot();
            RsdService dasBlogService = new RsdService();

            dasBlogService.HomePageLink = SiteUtilities.GetBaseUrl(siteConfig);

            RsdApi metaWeblog = new RsdApi();

            metaWeblog.Name      = "MetaWeblog";
            metaWeblog.Preferred = (siteConfig.PreferredBloggingAPI == metaWeblog.Name);
            metaWeblog.ApiLink   = SiteUtilities.GetBloggerUrl(siteConfig);
            metaWeblog.BlogID    = dasBlogService.HomePageLink;
            apiCollection.Add(metaWeblog);

            RsdApi blogger = new RsdApi();

            blogger.Name      = "Blogger";
            blogger.Preferred = (siteConfig.PreferredBloggingAPI == blogger.Name);
            blogger.ApiLink   = SiteUtilities.GetBloggerUrl(siteConfig);
            blogger.BlogID    = dasBlogService.HomePageLink;
            apiCollection.Add(blogger);

            RsdApi moveableType = new RsdApi();

            moveableType.Name      = "Moveable Type";
            moveableType.Preferred = (siteConfig.PreferredBloggingAPI == moveableType.Name);
            moveableType.ApiLink   = SiteUtilities.GetBloggerUrl(siteConfig);
            moveableType.BlogID    = dasBlogService.HomePageLink;
            apiCollection.Add(moveableType);

            dasBlogService.RsdApiCollection = apiCollection;
            rsd.Services.Add(dasBlogService);

            return(rsd);
        }
        /// <summary>
        /// Read the definition of a blog service from the passed RSD XML
        /// </summary>
        /// <param name="rsdStream"></param>
        /// <returns></returns>
        private static async Task <RsdServiceDescription> ReadFromRsdStream(Stream rsdStream, string url)
        {
            // initialize a blog service to return
            RsdServiceDescription rsdServiceDescription = new RsdServiceDescription();

            rsdServiceDescription.SourceUrl = url;

            ArrayList blogApis = new ArrayList();

            try
            {
                // liberally parse the RSD xml
                XmlReader reader = XmlReader.Create(rsdStream, new XmlReaderSettings()
                {
                    Async = true
                });
                //SkipLeadingWhitespace(new StreamReader(rsdStream, new UTF8Encoding(false, false))) ) ;
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        // windows-live writer extensions to rsd
                        if (UrlHelper.UrlsAreEqual(reader.NamespaceURI, WINDOWS_LIVE_WRITER_NAMESPACE))
                        {
                            /*
                             * switch ( reader.LocalName.ToLower() )
                             * {
                             *      case "manifestlink":
                             *              rsdServiceDescription.WriterManifestUrl = reader.ReadString().Trim() ;
                             *              break;
                             * }
                             */
                        }
                        // standard rsd elements
                        else
                        {
                            switch (reader.LocalName.ToUpperInvariant())
                            {
                            case "ENGINENAME":
                                rsdServiceDescription.EngineName = (await reader.ReadElementContentAsStringAsync()).Trim();
                                break;

                            case "ENGINELINK":
                                rsdServiceDescription.EngineLink = ToAbsoluteUrl(url, (await reader.ReadElementContentAsStringAsync()).Trim());
                                break;

                            case "HOMEPAGELINK":
                                rsdServiceDescription.HomepageLink = ToAbsoluteUrl(url, (await reader.ReadElementContentAsStringAsync()).Trim());
                                break;

                            case "API":
                                RsdApi api = new RsdApi();
                                for (int i = 0; i < reader.AttributeCount; i++)
                                {
                                    reader.MoveToAttribute(i);
                                    switch (reader.LocalName.ToUpperInvariant())
                                    {
                                    case "NAME":
                                        api.Name = NormalizeApiName(reader.Value);
                                        break;

                                    case "PREFERRED":
                                        api.Preferred = "true" == reader.Value.Trim();
                                        break;

                                    case "APILINK":
                                    case "RPCLINK":                                                     // radio-userland uses rpcLink
                                        api.ApiLink = ToAbsoluteUrl(url, reader.Value.Trim());
                                        break;

                                    case "BLOGID":
                                        api.BlogId = reader.Value.Trim();
                                        break;
                                    }
                                }
                                blogApis.Add(api);
                                break;

                            case "SETTING":
                                if (blogApis.Count > 0)
                                {
                                    RsdApi lastRsdApi = (RsdApi)blogApis[blogApis.Count - 1];
                                    string name       = reader.GetAttribute("name");
                                    if (name != null)
                                    {
                                        string value = (await reader.ReadContentAsStringAsync()).Trim();
                                        lastRsdApi.Settings.Add(name, value);
                                    }
                                }
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //Trace.Fail("Exception attempting to read RSD file: " + ex.ToString()) ;

                // don't re-propagate exceptions here becaus we found that TypePad's
                // RSD file was returning bogus HTTP crap at the end of the response
                // and the XML parser cholking on this caused us to fail autodetection
            }

            // if we got at least one API then return the service description
            if (blogApis.Count > 0)
            {
                rsdServiceDescription.Apis = (RsdApi[])blogApis.ToArray(typeof(RsdApi));
                return(rsdServiceDescription);
            }
            else
            {
                return(null);
            }
        }