/// <summary> /// Loads the feed sources. /// </summary> /// <param name="feedSources">The feed sources stream.</param> public void LoadFeedSources(Stream feedSources) { if (feedSources == null) { return; } try { XmlParserContext context = new XmlParserContext(null, new RssBanditXmlNamespaceResolver(), null, XmlSpace.None); XmlReader reader = new RssBanditXmlReader(feedSources, XmlNodeType.Document, context); //convert XML to objects XmlSerializer serializer = XmlHelper.SerializerCache.GetSerializer(typeof(SerializableFeedSources)); SerializableFeedSources mySources = (SerializableFeedSources)serializer.Deserialize(reader); _feedSources.Clear(); lastUsedKey = mySources.LastID; int maxUsedKey = 0; foreach (FeedSourceEntry fs in mySources.List) { if (maxUsedKey < fs.ID) { maxUsedKey = fs.ID; } _feedSources.Add(fs.ID, fs); fs.Source = FeedSource.CreateFeedSource(fs.ID, fs.SourceType, CreateSubscriptionLocation(fs.ID, fs.SourceType, fs.Properties)); } if (maxUsedKey > lastUsedKey) { lastUsedKey = maxUsedKey; } } catch (Exception e) { _log.Error("Error on deserializing feed source", e); } }
/// <summary> /// Loads the RSS feedlist from the given URL and validates it against the schema. /// </summary> /// <param name="xmlStream">The XML Stream of a feedlist to load</param> /// <param name="veh">The event handler that should be invoked on the client if validation errors occur. NOT USED.</param> /// <exception cref="XmlException">XmlException thrown if XML is not well-formed</exception> private void LoadFeedlist(Stream xmlStream, ValidationEventHandler veh) { var context = new XmlParserContext(null, new RssBanditXmlNamespaceResolver(), null, XmlSpace.None); XmlReader reader = new RssBanditXmlReader(xmlStream, XmlNodeType.Document, context); validationErrorOccured = false; //convert XML to objects XmlSerializer serializer = XmlHelper.SerializerCache.GetSerializer(typeof(feeds)); var myFeeds = (feeds)serializer.Deserialize(reader); reader.Close(); // reset migration properties dictionary: MigrationProperties.Clear(); //copy over category info if we are importing a new feed if (myFeeds.categories != null) { foreach (var cat in myFeeds.categories) { string cat_trimmed = cat.Value.Trim(); if (!categories.ContainsKey(cat_trimmed)) { cat.Value = cat_trimmed; categories.Add(cat_trimmed, cat); } } } //copy feeds over if we are importing a new feed if (myFeeds.feed != null) { foreach (var f in myFeeds.feed) { if (feedsTable.ContainsKey(f.link) == false) { Uri uri; if (Uri.TryCreate(f.link, UriKind.Absolute, out uri)) { // CLR 2.0 Uri does not like "news:" scheme, so we // switch it to "nntp:" (see http://msdn2.microsoft.com/en-us/library/system.uri.scheme.aspx) if (NntpWebRequest.NewsUriScheme.Equals(uri.Scheme)) { f.link = NntpWebRequest.NntpUriScheme + uri.CanonicalizedUri().Substring(uri.Scheme.Length); } else { f.link = uri.CanonicalizedUri(); } } else { // bad uri: continue; } // test again: we may have changed to Uri above: if (feedsTable.ContainsKey(f.link) == false) { f.owner = this; feedsTable.Add(f.link, f); //add category if needed if (f.category != null) { string cat_trimmed = f.category = f.category.Trim(); if (!categories.ContainsKey(cat_trimmed)) { AddCategory(cat_trimmed); } } } } } } ////copy over layout info if we are importing a new feed //if (myFeeds.listviewLayouts != null) //{ // foreach (var layout in myFeeds.listviewLayouts) // { // string layout_trimmed = layout.ID.Trim(); // if (!layouts.ContainsKey(layout_trimmed)) // { // layouts.Add(layout_trimmed, layout.FeedColumnLayout); // } // } //} /* * props. set by configuration/static, but required for migration: */ if (MigrateProperties) { //copy user-identities over if we are migrating if (myFeeds.identities != null) { MigrationProperties.Add("UserIdentity", myFeeds.identities); } //copy nntp-server defs. over if we are migrating if (myFeeds.nntpservers != null) { foreach (var sd in myFeeds.nntpservers) { // using the public property will initiate a load: if (NntpServers.ContainsKey(sd.Name) == false) { NntpServers.Add(sd.Name, sd); } } } //if refresh rate in imported feed then use that if (myFeeds.refreshrateSpecified) { MigrationProperties.Add("RefreshRate", myFeeds.refreshrate); } //if stylesheet specified in imported feed then use that if (!string.IsNullOrEmpty(myFeeds.stylesheet)) { MigrationProperties.Add("Stylesheet", myFeeds.stylesheet); //this.stylesheet = myFeeds.stylesheet; } //if download enclosures specified in imported feed then use that if (myFeeds.downloadenclosuresSpecified) { MigrationProperties.Add("DownloadEnclosures", myFeeds.downloadenclosures); } //if maximum enclosure cache size specified in imported feed then use that if (myFeeds.enclosurecachesizeSpecified) { MigrationProperties.Add("EnclosureCacheSize", myFeeds.enclosurecachesize); //this.enclosurecachesize = myFeeds.enclosurecachesize; } //if maximum number of enclosures to download on a new feed specified in imported feed then use that if (myFeeds.numtodownloadonnewfeedSpecified) { MigrationProperties.Add("NumEnclosuresToDownloadOnNewFeed", myFeeds.numtodownloadonnewfeed); //this.numtodownloadonnewfeed = myFeeds.numtodownloadonnewfeed; } //if cause alert on enclosures specified in imported feed then use that if (myFeeds.enclosurealertSpecified) { MigrationProperties.Add("EnclosureAlert", myFeeds.enclosurealert); //this.enclosurealert = myFeeds.enclosurealert; } //if create subfolders for enclosures specified in imported feed then use that if (myFeeds.createsubfoldersforenclosuresSpecified) { MigrationProperties.Add("CreateSubfoldersForEnclosures", myFeeds.createsubfoldersforenclosures); //this.createsubfoldersforenclosures = myFeeds.createsubfoldersforenclosures; } //if marking items as read on exit specified in imported feed then use that if (myFeeds.markitemsreadonexitSpecified) { MigrationProperties.Add("MarkItemsReadOnExit", myFeeds.markitemsreadonexit); //this.markitemsreadonexit = myFeeds.markitemsreadonexit; } //if enclosure folder specified in imported feed then use that if (!string.IsNullOrEmpty(myFeeds.enclosurefolder)) { MigrationProperties.Add("EnclosureFolder", myFeeds.enclosurefolder); } //if podcast folder specified in imported feed then use that if (!string.IsNullOrEmpty(myFeeds.podcastfolder)) { MigrationProperties.Add("PodcastFolder", myFeeds.podcastfolder); } //if podcast file extensions specified in imported feed then use that if (!string.IsNullOrEmpty(myFeeds.podcastfileexts)) { MigrationProperties.Add("PodcastFileExtensions", myFeeds.podcastfileexts); } ////if listview layout specified in imported feed then use that //if (!string.IsNullOrEmpty(myFeeds.listviewlayout)) //{ // FeedColumnLayout = myFeeds.listviewlayout; //} //if max item age in imported feed then use that try { if (!string.IsNullOrEmpty(myFeeds.maxitemage)) { MigrationProperties.Add("MaxItemAge", myFeeds.maxitemage); //this.maxitemage = XmlConvert.ToTimeSpan(myFeeds.maxitemage); } } catch (FormatException fe) { Trace("Error occured while parsing maximum item age from feed list: {0}", fe.ToDescriptiveString()); } } //if(FeedSource.MigrateProperties){ }