Beispiel #1
0
        private void Dispatch()
        {
            // Make sure that we are not interfering with the crucial startup work);
            if (!Settings.RemoveThreadSleep)
            {
                System.Threading.Thread.Sleep(Settings.SleepBeforeSend * 1000);
            }

            // Turncate extra report files and try to send the first one in the queue
            Storer.TruncateReportFiles();

            // Now go through configured destinations and submit to all automatically
            for (bool hasReport = true; hasReport;)
            {
                using (Storer storer = new Storer())
                using (Stream stream = storer.GetFirstReportFile())
                {
                    if (stream != null)
                    {
                        if (this.EnumerateDestinations(stream) == false)
                        {
                            break;
                        }

                        // Delete the file after it was sent
                        storer.DeleteCurrentReportFile();
                    }
                    else
                    {
                        hasReport = false;
                    }
                }
            }
        }
Beispiel #2
0
		internal void VerifyAndDeleteCompressedReportFile(bool verifyCustomReport)
		{
			using (var storer = new Storer())
			using (var stream = storer.GetFirstReportFile())
			{
				Assert.NotNull(stream);
				this.VerifyIndividualReportItems(stream, verifyCustomReport);
				storer.DeleteCurrentReportFile();
			}
		}
Beispiel #3
0
		internal void DeleteGarbageReportFile()
		{
			using (var storer = new Storer())
			using (var stream = storer.GetFirstReportFile())
			{
				if (stream != null)
				{
					storer.DeleteCurrentReportFile();
				}
			}
		}
Beispiel #4
0
        private void Dispatch()
        {
            // Make sure that we are not interfering with the crucial startup work);
            if (!Settings.RemoveThreadSleep)
            {
                Thread.Sleep(Settings.SleepBeforeSend * 1000);
            }

            // Truncate extra report files and try to send the first one in the queue
            Storer.TruncateReportFiles();

            // Now go through configured destinations and submit to all automatically
            for (var hasReport = true; hasReport;)
            {
                using (var storer = new Storer())
                using (var stream = storer.GetFirstReportFile())
                {
                    if (stream != null)
                    {
                        // Extract crash/exception report data from the zip file. Delete the zip file if no data can be retrieved (i.e. corrupt file)
                      ExceptionData exceptionData;
                      try
                      {
              exceptionData = this.GetDataFromZip(stream);
                      }
            catch (Exception exception)
                      {
              storer.DeleteCurrentReportFile();
              Logger.Error("An exception occurred while extraction report data from zip file. Check the inner exception for details.", exception);
                        return;
                      }

            // Now submit the report file to all configured bug report submission targets
                        if (this.EnumerateDestinations(stream, exceptionData) == false)
                        {
                            break;
                        }

                        // Delete the file after it was sent
                        storer.DeleteCurrentReportFile();
                    }
                    else
                    {
                        hasReport = false;
                    }
                }
            }
        }
Beispiel #5
0
        private void CreateReportZip(SerializableException serializableException, Report report)
        {
            // Test if it has NOT been more than x many days since entry assembly was last modified)
            if (Settings.StopReportingAfter < 0 || File.GetLastWriteTime(Settings.EntryAssembly.Location).AddDays(Settings.StopReportingAfter).CompareTo(DateTime.Now) > 0)
            {
                // Test if there is already more than enough queued report files
                if (Settings.MaxQueuedReports < 0 || Storer.GetReportCount() < Settings.MaxQueuedReports)
                {
                    var reportFileName = "Exception_" + DateTime.UtcNow.ToFileTime() + ".zip";
                    var minidumpFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Exception_MiniDump_" + DateTime.UtcNow.ToFileTime() + ".mdmp");

                    using (var storer = new Storer())
                    using (var zipStorer = ZipStorer.Create(storer.CreateReportFile(reportFileName), string.Empty))
                    using (var stream = new MemoryStream())
                    {
                        // Store the exception
                        var serializer = new XmlSerializer(typeof(SerializableException));
                        serializer.Serialize(stream, serializableException);
                        stream.Position = 0;
                        zipStorer.AddStream(ZipStorer.Compression.Deflate, StoredItemFile.Exception, stream, DateTime.UtcNow, string.Empty);

                        // Store the report
                        stream.SetLength(0);

                        try
                        {
                            serializer = report.CustomInfo != null ? new XmlSerializer(typeof(Report), new[] { report.CustomInfo.GetType() }) : new XmlSerializer(typeof(Report));

                            serializer.Serialize(stream, report);
                        }
                        catch (Exception exception)
                        {
                            Logger.Error(string.Format("The given custom info of type [{0}] cannot be serialized. Make sure that given type and inner types are XML serializable.", report.CustomInfo.GetType()), exception);
                            report.CustomInfo = null;
                            serializer = new XmlSerializer(typeof(Report));
                            serializer.Serialize(stream, report);
                        }

                        stream.Position = 0;
                        zipStorer.AddStream(ZipStorer.Compression.Deflate, StoredItemFile.Report, stream, DateTime.UtcNow, string.Empty);

                        // Add the memory minidump to the report file (only if configured so)
                        if (DumpWriter.Write(minidumpFilePath))
                        {
                            zipStorer.AddFile(ZipStorer.Compression.Deflate, minidumpFilePath, StoredItemFile.MiniDump, string.Empty);
                            File.Delete(minidumpFilePath);
                        }

                        // Add any user supplied files in the report (if any)
                        if (Settings.AdditionalReportFiles.Count != 0)
                        {
                            // ToDo: This needs a lot more work!
                            this.AddAdditionalFiles(zipStorer);
                        }
                    }

                    Logger.Trace("Created a new report file. Currently the number of report files queued to be send is: " + Storer.GetReportCount());
                }
                else
                {
                    Logger.Trace("Current report count is at its limit as per 'Settings.MaxQueuedReports (" +
                        Settings.MaxQueuedReports + ")' setting: Skipping bug report generation.");
                }
            }
            else
            {
                Logger.Trace("As per setting 'Settings.StopReportingAfter(" + Settings.StopReportingAfter +
                    ")', bug reporting feature was enabled for a certain amount of time which has now expired: Bug reporting is now disabled.");

                // ToDo: Completely eliminate this with SettingsOverride.DisableReporting = true; since enumerating filesystem adds overhead);
                if (Storer.GetReportCount() > 0)
                {
                    Logger.Trace("As per setting 'Settings.StopReportingAfter(" + Settings.StopReportingAfter +
                        ")', bug reporting feature was enabled for a certain amount of time which has now expired: Truncating all expired bug reports.");
                    Storer.TruncateReportFiles(0);
                }
            }
        }