private void DoJob(object sender, DoWorkEventArgs e) { if ((!_ready) || String.IsNullOrEmpty(_job.SourcePath)) { _logger.WriteLogMessage("*** Job Dispatcher not ready.", LogLevel.Info, true); return; } _logger.WriteLogMessage("+++ Start new job:", LogLevel.Info); _status.ResultCode = JobResultCode.FatalError; CdrDecoder decoder = new CdrDecoder(); decoder.ElementDefinitionProvider.CurrentSchema = _job.DefinitionSchemaName; CdrElement record; RecordFormatter formatter = (_job.IsFormatterActive && (_job.FormatterSettings != null)) ? new RecordFormatter(_job.FormatterSettings) : null; Regex filterRegex = null; if (_job.IsFilterActive && !String.IsNullOrEmpty(_job.FilterText)) { try { filterRegex = new Regex(_job.FilterText, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline); } catch (Exception error) { _logger.WriteLogMessage(String.Format("!!! A filter regular expression parsing error in FilterText occurred: {0}", error.Message), LogLevel.Error, true); _status.ResultCode = JobResultCode.FatalError; _logger.WriteLogMessage("+++ The job finished with an error.", LogLevel.Info); return; } } StreamWriter dstFile = new StreamWriter(_job.DestinationPath); if ((formatter != null) && _job.FormatterSettings.PrintColumnsHeader) { dstFile.WriteLine(_job.FormatterSettings.ColumnsHeader); } FileInfo[] cdrFiles; cdrFiles = new DirectoryInfo(Path.GetDirectoryName(_job.SourcePath)).GetFiles(Path.GetFileName(_job.SourcePath), SearchOption.TopDirectoryOnly); FileStream cdr; long cdrLength; long rem; string recText; // SGSN patch /////////////////////////////////////////////////////////// bool sgsn = !String.IsNullOrEmpty(decoder.ElementDefinitionProvider.Type) && (String.Compare(decoder.ElementDefinitionProvider.Type, "SGSN", true) == 0); List <CdrElement> sgsnRecord = new List <CdrElement>(); ///////////////////////////////////////////////////////////////////////// _status.CdrFilesIn = cdrFiles.Length; _logger.WriteLogMessage(String.Format("Files to decode: {0}", _status.CdrFilesIn), LogLevel.Info, false); _logger.WriteLogMessage(String.Format("Schema: {0}", _job.DefinitionSchemaName), LogLevel.Info, false); _worker.ReportProgress(_status.Percent); foreach (FileInfo fi in cdrFiles) { cdr = new FileStream(fi.FullName, FileMode.Open); cdrLength = cdr.Length; if (_job.StartOffset > 0) { cdr.Seek(_job.StartOffset, SeekOrigin.Begin); } _status.RecordsOut = 0; _status.CurrentCdrFile = fi.Name; rem = 0; if (sgsn) { sgsnRecord.Clear(); } _logger.WriteLogMessage(String.Format("{0} ... ", fi.Name), LogLevel.Info); _worker.ReportProgress(_status.Percent); for (; ;) { if (_status.RecordsOut == 0) { if (sgsn && (sgsnRecord.Count > 0)) { record = decoder.DecodeRecord(cdr, false); } else { record = decoder.DecodeRecord(cdr, true); } } else { record = decoder.DecodeRecord(cdr, false); } if (record == null) { if (sgsn && (sgsnRecord.Count > 0)) { _status.RecordsOut++; _status.RecordsOutTotal++; _status.Percent = (int)Math.Ceiling((double)cdr.Position / cdrLength * 100); if (formatter == null) { StringBuilder sgsnText = new StringBuilder(String.Format("{0,8} > {1} {2}=[", sgsnRecord[0].Offset, _status.RecordsOut, sgsnRecord[0].Name), sgsnRecord.Count + 1); for (int s = 1; s < sgsnRecord.Count; s++) { if (s > 1) { sgsnText.Append(' '); } sgsnText.Append(sgsnRecord[s].ToString()); } sgsnText.Append("]"); recText = sgsnText.ToString(); } else { recText = formatter.FormatSGSNRecord(sgsnRecord); } if ((filterRegex == null) || (filterRegex.Match(recText).Success)) { dstFile.WriteLine(recText); } Math.DivRem(_status.RecordsOut, 1000, out rem); if (rem == 0) { _worker.ReportProgress(_status.Percent); } } break; } if (sgsn) { if (_worker.CancellationPending) { break; } if (record.IsConstructed && (record.Path.Equals("20") || record.Path.Equals("23") || record.Path.Equals("24"))) { if (sgsnRecord.Count == 0) { sgsnRecord.Add(record); continue; } } else { sgsnRecord.Add(record); continue; } } _status.RecordsOut++; _status.RecordsOutTotal++; _status.Percent = (int)Math.Ceiling((double)cdr.Position / cdrLength * 100); if (sgsn) { if (formatter == null) { StringBuilder sgsnText = new StringBuilder(String.Format("{0,8} > {1} {2}=[", sgsnRecord[0].Offset, _status.RecordsOut, sgsnRecord[0].Name), sgsnRecord.Count + 1); for (int s = 1; s < sgsnRecord.Count; s++) { if (s > 1) { sgsnText.Append(' '); } sgsnText.Append(sgsnRecord[s].ToString()); } sgsnText.Append("]"); recText = sgsnText.ToString(); } else { recText = formatter.FormatSGSNRecord(sgsnRecord); } sgsnRecord.Clear(); sgsnRecord.Add(record); } else { recText = (formatter == null) ? String.Format("{0,8} > {1} {2}", record.Offset, _status.RecordsOut, record.ToString()) : formatter.FormatRecord(record); } if ((filterRegex == null) || (filterRegex.Match(recText).Success)) { dstFile.WriteLine(recText); } Math.DivRem(_status.RecordsOut, 1000, out rem); if (rem == 0) { _worker.ReportProgress(_status.Percent); } if (_worker.CancellationPending) { break; } } cdr.Close(); _logger.AppendLogMessage(_status.RecordsOut.ToString()); if (_worker.CancellationPending) { break; } else { _status.CdrFilesIn--; _status.CdrFilesOut++; _status.Percent = 100; _worker.ReportProgress(_status.Percent); } } dstFile.Close(); if (_worker.CancellationPending) { _status.ResultCode = JobResultCode.CanceledByUser; _logger.WriteLogMessage("+++ Process aborted by user.", LogLevel.Info); } else { _status.ResultCode = JobResultCode.AllOK; _logger.WriteLogMessage("+++ Decoding is successful done.", LogLevel.Info); } }
private void DoJob(object sender, DoWorkEventArgs e) { if ((!_ready) || String.IsNullOrEmpty(_job.SourcePath)) { _logger.WriteLogMessage("*** Job Dispatcher not ready.", LogLevel.Info, true); return; } _logger.WriteLogMessage("+++ Start new job:", LogLevel.Info); _status.ResultCode = JobResultCode.FatalError; CdrDecoder decoder = new CdrDecoder(); decoder.ElementDefinitionProvider.CurrentSchema = _job.DefinitionSchemaName; CdrElement record; RecordFormatter formatter = (_job.IsFormatterActive && (_job.FormatterSettings != null)) ? new RecordFormatter(_job.FormatterSettings) : null; Regex filterRegex = null; if (_job.IsFilterActive && !String.IsNullOrEmpty(_job.FilterText)) { try { filterRegex = new Regex(_job.FilterText, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline); } catch (Exception error) { _logger.WriteLogMessage(String.Format("!!! A filter regular expression parsing error in FilterText occurred: {0}", error.Message), LogLevel.Error, true); _status.ResultCode = JobResultCode.FatalError; _logger.WriteLogMessage("+++ The job finished with an error.", LogLevel.Info); return; } } StreamWriter dstFile = new StreamWriter(_job.DestinationPath); if ((formatter != null) && _job.FormatterSettings.PrintColumnsHeader) { dstFile.WriteLine(_job.FormatterSettings.ColumnsHeader); } FileInfo[] cdrFiles; cdrFiles = new DirectoryInfo(Path.GetDirectoryName(_job.SourcePath)).GetFiles(Path.GetFileName(_job.SourcePath), SearchOption.TopDirectoryOnly); FileStream cdr; long cdrLength; long rem; string recText; // SGSN patch /////////////////////////////////////////////////////////// bool sgsn = !String.IsNullOrEmpty(decoder.ElementDefinitionProvider.Type) && (String.Compare(decoder.ElementDefinitionProvider.Type, "SGSN", true) == 0); List<CdrElement> sgsnRecord = new List<CdrElement>(); ///////////////////////////////////////////////////////////////////////// _status.CdrFilesIn = cdrFiles.Length; _logger.WriteLogMessage(String.Format("Files to decode: {0}", _status.CdrFilesIn), LogLevel.Info, false); _logger.WriteLogMessage(String.Format("Schema: {0}", _job.DefinitionSchemaName), LogLevel.Info, false); _worker.ReportProgress(_status.Percent); foreach (FileInfo fi in cdrFiles) { cdr = new FileStream(fi.FullName, FileMode.Open); cdrLength = cdr.Length; if (_job.StartOffset > 0) cdr.Seek(_job.StartOffset, SeekOrigin.Begin); _status.RecordsOut = 0; _status.CurrentCdrFile = fi.Name; rem = 0; if (sgsn) { sgsnRecord.Clear(); } _logger.WriteLogMessage(String.Format("{0} ... ", fi.Name), LogLevel.Info); _worker.ReportProgress(_status.Percent); for (; ; ) { if (_status.RecordsOut == 0) { if (sgsn && (sgsnRecord.Count > 0)) { record = decoder.DecodeRecord(cdr, false); } else { record = decoder.DecodeRecord(cdr, true); } } else { record = decoder.DecodeRecord(cdr, false); } if (record == null) { if (sgsn && (sgsnRecord.Count > 0)) { _status.RecordsOut++; _status.RecordsOutTotal++; _status.Percent = (int)Math.Ceiling((double)cdr.Position / cdrLength * 100); if (formatter == null) { StringBuilder sgsnText = new StringBuilder(String.Format("{0,8} > {1} {2}=[", sgsnRecord[0].Offset, _status.RecordsOut, sgsnRecord[0].Name), sgsnRecord.Count + 1); for (int s = 1; s < sgsnRecord.Count; s++) { if (s > 1) sgsnText.Append(' '); sgsnText.Append(sgsnRecord[s].ToString()); } sgsnText.Append("]"); recText = sgsnText.ToString(); } else { recText = formatter.FormatSGSNRecord(sgsnRecord); } if ((filterRegex == null) || (filterRegex.Match(recText).Success)) dstFile.WriteLine(recText); Math.DivRem(_status.RecordsOut, 1000, out rem); if (rem == 0) _worker.ReportProgress(_status.Percent); } break; } if (sgsn) { if (_worker.CancellationPending) { break; } if (record.IsConstructed && (record.Path.Equals("20") || record.Path.Equals("23") || record.Path.Equals("24"))) { if (sgsnRecord.Count == 0) { sgsnRecord.Add(record); continue; } } else { sgsnRecord.Add(record); continue; } } _status.RecordsOut++; _status.RecordsOutTotal++; _status.Percent = (int)Math.Ceiling((double)cdr.Position / cdrLength * 100); if (sgsn) { if (formatter == null) { StringBuilder sgsnText = new StringBuilder(String.Format("{0,8} > {1} {2}=[", sgsnRecord[0].Offset, _status.RecordsOut, sgsnRecord[0].Name), sgsnRecord.Count + 1); for (int s = 1; s < sgsnRecord.Count; s++) { if (s > 1) sgsnText.Append(' '); sgsnText.Append(sgsnRecord[s].ToString()); } sgsnText.Append("]"); recText = sgsnText.ToString(); } else { recText = formatter.FormatSGSNRecord(sgsnRecord); } sgsnRecord.Clear(); sgsnRecord.Add(record); } else { recText = (formatter == null) ? String.Format("{0,8} > {1} {2}", record.Offset, _status.RecordsOut, record.ToString()) : formatter.FormatRecord(record); } if ((filterRegex == null) || (filterRegex.Match(recText).Success)) dstFile.WriteLine(recText); Math.DivRem(_status.RecordsOut, 1000, out rem); if (rem == 0) _worker.ReportProgress(_status.Percent); if (_worker.CancellationPending) { break; } } cdr.Close(); _logger.AppendLogMessage(_status.RecordsOut.ToString()); if (_worker.CancellationPending) { break; } else { _status.CdrFilesIn--; _status.CdrFilesOut++; _status.Percent = 100; _worker.ReportProgress(_status.Percent); } } dstFile.Close(); if (_worker.CancellationPending) { _status.ResultCode = JobResultCode.CanceledByUser; _logger.WriteLogMessage("+++ Process aborted by user.", LogLevel.Info); } else { _status.ResultCode = JobResultCode.AllOK; _logger.WriteLogMessage("+++ Decoding is successful done.", LogLevel.Info); } }