/// <summary> /// Retrieves the RSS feed for a particular subscription then converts /// the blog posts or articles to an arraylist of items. The http requests are async calls. /// </summary> /// <param name="feedUrl">The URL of the feed to download</param> /// <param name="forceDownload">Flag indicates whether cached feed items /// can be returned or whether the application must fetch resources from /// the web</param> /// <param name="manual">Flag indicates whether the call was initiated by user (true), or /// by automatic refresh timer (false)</param> /// <exception cref="ApplicationException">If the RSS feed is not version 0.91, 1.0 or 2.0</exception> /// <exception cref="XmlException">If an error occured parsing the RSS feed</exception> /// <exception cref="ArgumentNullException">If feedUrl is a null reference</exception> /// <exception cref="UriFormatException">If an error occurs while attempting to format the URL as an Uri</exception> /// <returns>true, if the request really was queued up</returns> /// <remarks>Result arraylist is returned by OnUpdatedFeed event within UpdatedFeedEventArgs</remarks> // [MethodImpl(MethodImplOptions.Synchronized)] public override bool AsyncGetItemsForFeed(string feedUrl, bool forceDownload, bool manual) { if (feedUrl == null || feedUrl.Trim().Length == 0) { throw new ArgumentNullException("feedUrl"); } string etag = null; bool requestQueued = false; int priority = 10; if (forceDownload) { priority += 100; } if (manual) { priority += 1000; } Uri feedUri = new Uri(feedUrl); NewsFeed theFeed = null; //see if we've retrieved the news feed before if (feedsTable.ContainsKey(feedUri.CanonicalizedUri())) { theFeed = feedsTable[feedUri.CanonicalizedUri()] as NewsFeed; } if (theFeed == null) //feed list is corrupted { return(false); } // raise event only if we "really" go over the wire for an update: RaiseOnUpdateFeedStarted(feedUri, forceDownload, priority); //DateTime lastRetrieved = DateTime.MinValue; DateTime lastModified = DateTime.MinValue; if (itemsTable.ContainsKey(feedUrl)) { etag = theFeed.etag; lastModified = (theFeed.lastretrievedSpecified ? theFeed.lastretrieved : theFeed.lastmodified); } Dictionary <string, string> parameters = new Dictionary <string, string>(); parameters.Add("viewer_id", this.facebookUserId); parameters.Add("session_key", this.sessionKey); parameters.Add("method", "stream.get"); /* FQL * string query = String.Format("?query=select post_id, source_id, created_time, actor_id, target_id, app_id, message, attachment, comments, likes, permalink, attribution, type from stream where filter_key in (select filter_key FROM stream_filter where uid = {0} and type = 'newsfeed') and created_time >= {1} order by created_time desc limit 50", facebookUserId, updatedTime); * parameters = "&v=1.0&method=fql.query&format=JSON&call_id={0}&session_key={1}&api_key={2}&sig={3}"; */ string reqUrl = feedUrl + "?" + CreateHTTPParameterList(parameters, false /* useJson */); Uri reqUri = new Uri(reqUrl); try { try { if ((!forceDownload) || Offline) { GetCachedItemsForFeed(feedUri.CanonicalizedUri()); //load feed into itemsTable RaiseOnUpdatedFeed(feedUri, null, RequestResult.NotModified, priority, false); return(false); } } catch (XmlException xe) { //cache file is corrupt Trace("Unexpected error retrieving cached feed '{0}': {1}", feedUrl, xe.ToDescriptiveString()); } ICredentials c = null; RequestParameter reqParam = RequestParameter.Create(reqUri, this.UserAgent, this.Proxy, c, lastModified, etag); reqParam = RequestParameter.Create(false, reqParam); AsyncWebRequest.QueueRequest(reqParam, OnRequestStart, OnRequestComplete, OnRequestException, priority); requestQueued = true; } catch (Exception e) { Trace("Unexpected error on QueueRequest(), processing feed '{0}': {1}", feedUrl, e.ToDescriptiveString()); RaiseOnUpdateFeedException(feedUrl, e, priority); } return(requestQueued); }