private void bStart_Click(object sender, EventArgs e) { if (_isRun) { DialogResult cancelResult = MessageBox.Show("Are you sure you want to cancel data fetching?", "Cancel fetching?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (cancelResult == DialogResult.Yes) { _isRun = false; if (_processor != null) { _processor.EndStreaming(); } EnableControls(true); bStart.Text = "Start"; pbProgress.Value = 0; if (_results.Count > 0) { DialogResult saveResult = MessageBox.Show("Do you want to save fetched data to the CSV file?", "Save data?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (saveResult == DialogResult.Yes) { GenerateCsv(_results); } } } return; } if (!IsValidParameters()) { return; } _isRun = true; PopulateSettings(); EnableControls(false); bStart.Text = "Cancel"; WriteLineToTrace("Connecting to stream..."); _results.Clear(); pbProgress.Minimum = 0; pbProgress.Maximum = _settings.total; pbProgress.Step = 1; SandBoxConnection connection = new SandBoxConnection(_settings.username, _settings.password, _settings.account, _settings.source); connection.ReplyFrom = DateTime.ParseExact(_settings.from, "yyyyMMddHHmm", CultureInfo.InvariantCulture); connection.ReplyTo = DateTime.ParseExact(_settings.to, "yyyyMMddHHmm", CultureInfo.InvariantCulture); connection.IsLive = _settings.live; GnipStreamProcessorAsync processor = GnipStreamProcessorBase.CreateGnipProcessor <GnipStreamProcessorAsync>(connection); processor.DataReceived += processor_DataReceived; processor.ErrorHappened += processor_ErrorHappened; processor.BeginStreaming(); }
public override void BeginStreaming() { HttpWebRequest request = GetStreamRequest(); Stream stream = null; StreamReader reader = null; try { HttpWebResponse response = (HttpWebResponse)request.GetResponse(); stream = (Connection.UseEncoding) ? new GZipStream(response.GetResponseStream(), CompressionMode.Decompress) : response.GetResponseStream(); byte[] buffer = new byte[8192]; List <byte> output = new List <byte>(); while (stream.CanRead) { Thread.Sleep(1000); if (response.StatusCode != HttpStatusCode.OK) { throw new StreamingException(response.StatusCode, response.StatusDescription); } int readCount = stream.Read(buffer, 0, buffer.Length); output.AddRange(buffer.Take(readCount)); string outputString = Encoding.UTF8.GetString(output.ToArray()); if (!Formatter.HasDelimiter(outputString)) { continue; } int delimiterIndex = Formatter.FindLastDelimiter(outputString); outputString = outputString.Substring(0, delimiterIndex); output.RemoveRange(0, Encoding.UTF8.GetByteCount(outputString)); if (String.IsNullOrEmpty(outputString)) { continue; } outputString = Formatter.Normalize(outputString); OnHeartbeatReceived(new HeartbeatEventArgs() { Message = outputString }); string[] lines = outputString.Split(new[] { Environment.NewLine }, new StringSplitOptions()); for (int i = 0; i < lines.Length; i++) { string heartBeatCheck = lines[i]; if (heartBeatCheck.Trim().Length > 0) { if (!Formatter.IsValid(heartBeatCheck)) { continue; } Type contentType = GnipStreamProcessorBase.GetObjectTypeByService(Connection.DataSource); try { DynamicActivityBase activity = null; if (Connection.DataFormat == GnipDataFormat.XML) { MemoryStream memStr = new MemoryStream(Encoding.UTF8.GetBytes(heartBeatCheck)); XmlTextReader xmlReader = new XmlTextReader(memStr); DynamicXMLObjectConverter converter = new DynamicXMLObjectConverter(); dynamic obj = converter.Deserialize(xmlReader, typeof(DynamicXMLObject)); activity = ReflectionHelper.CreateAndCastInstance(contentType, obj); } else { JavaScriptSerializer serializer = new JavaScriptSerializer(); serializer.RegisterConverters(new[] { new DynamicJsonObjectConverter() }); dynamic obj = serializer.Deserialize(heartBeatCheck, typeof(DynamicJsonObject)); activity = ReflectionHelper.CreateAndCastInstance(contentType, obj); } OnDataReceived(activity); } catch (Exception ex) { OnErrorHappened(ex); } } } } } catch (WebException ex) { string status = ""; string message = ""; if (ex.Status == WebExceptionStatus.ProtocolError) { HttpWebResponse response = (HttpWebResponse)ex.Response; using (response) { status = ((int)response.StatusCode).ToString(); message = response.StatusDescription; stream = response.GetResponseStream(); if (stream != null && stream.CanRead) { reader = new StreamReader(stream); message = reader.ReadToEnd(); OnErrorHappened(ex); } } } else { OnErrorHappened(ex); } } catch (Exception ex) { OnErrorHappened(ex); } finally { if (stream != null) { stream.Close(); } if (reader != null) { reader.Close(); reader = null; } } }