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(); } }
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); } }