EnumerateJsonValues ( String url, String jsonName, Int32 maximumValues, Boolean skipMostPage1Errors, RequestStatistics requestStatistics, ReportProgressHandler reportProgressHandler, CheckCancellationPendingHandler checkCancellationPendingHandler ) { // Note: // // The logic in this method is similar to the logic in // EnumerateSearchStatuses(). In fact, at one time all enumeration was // done through this EnumerateJsonValues() method. // EnumerateSearchStatuses() was created only when version 1.1 of the // Twitter API introduced yet another paging scheme, one that differs // from the cursor scheme that this method handles. // // A possible work item is to recombine the two methods into one, // possibly by using a delegate to handle the different paging schemes. Debug.Assert(!String.IsNullOrEmpty(url)); Debug.Assert(maximumValues > 0); Debug.Assert(requestStatistics != null); AssertValid(); Int32 iPage = 1; String sCursor = null; Int32 iObjectsEnumerated = 0; while (true) { if (iPage > 1) { HttpSocialNetworkUtil.ReportProgress(reportProgressHandler, "Getting page {0}." , iPage ); } String sUrlWithCursor = AppendCursorToUrl(url, sCursor); Dictionary <String, Object> oValueDictionary = null; Object [] aoObjectsThisPage; try { Object oDeserializedTwitterResponse = (new JavaScriptSerializer()).DeserializeObject( GetTwitterResponseAsString(sUrlWithCursor, requestStatistics, reportProgressHandler, checkCancellationPendingHandler)); Object oObjectsThisPageAsObject; if (jsonName == null) { // The top level of the Json response contains an array of // objects this method will enumerate. oObjectsThisPageAsObject = oDeserializedTwitterResponse; } else { // The top level of the Json response contains a set of // name/value pairs. The value for the specified name is // the array of objects this method will enumerate. oValueDictionary = (Dictionary <String, Object>) oDeserializedTwitterResponse; oObjectsThisPageAsObject = oValueDictionary[jsonName]; } aoObjectsThisPage = ( Object [] )oObjectsThisPageAsObject; } catch (Exception oException) { // Rethrow the exception if appropriate. TwitterUtil.OnExceptionWhileEnumeratingJsonValues( oException, iPage, skipMostPage1Errors); // Otherwise, just halt the enumeration. yield break; } Int32 iObjectsThisPage = aoObjectsThisPage.Length; if (iObjectsThisPage == 0) { yield break; } for (Int32 i = 0; i < iObjectsThisPage; i++) { yield return(aoObjectsThisPage[i]); iObjectsEnumerated++; if (iObjectsEnumerated == maximumValues) { yield break; } } iPage++; // When the top level of the Json response contains a set of // name/value pairs, a next_cursor_str value of "0" means "end of // data." if ( oValueDictionary == null || !TwitterJsonUtil.TryGetJsonValueFromDictionary( oValueDictionary, "next_cursor_str", out sCursor) || sCursor == "0" ) { yield break; } // Get the next page... } }
BeforeGetNetwork() { AssertValid(); // TwitterAccessToken caches the access token it reads from disk. Make // sure the latest access token is read. TwitterAccessToken oTwitterAccessToken = new TwitterAccessToken(); // A network should never be requested if the access token hasn't been // saved yet. String sToken, sSecret; if ( !oTwitterAccessToken.TryLoad(out sToken, out sSecret) ) { throw new Exception("Twitter access token not set."); } m_oTwitterUtil = new TwitterUtil(sToken, sSecret, HttpNetworkAnalyzerBase.UserAgent, HttpNetworkAnalyzerBase.HttpWebRequestTimeoutMs); }