public override CIEngineSource.TState Read() { CIEngineSource.TState ret = CIEngineSource.TState.EStateReadyCorrupt; // Listen to container creation events in all plugin reader objects foreach (CFFSource source in iPluginSources) { CFFReader reader = source.Reader; reader.Observer += new CFFReader.ReaderObserver(CFFReader_Observer); reader.ExceptionHandler += new CFFReader.ReaderExceptionHandler(CFFReader_ExceptionHandler); } // try { CIEngineTraceReader traceReader = new CIEngineTraceReader(this); traceReader.Read(TSynchronicity.ESynchronous); } finally { ret = CalculateFinalState(); // Stop listening to container creation events in all plugin reader objects foreach (CFFSource source in iPluginSources) { CFFReader reader = source.Reader; reader.Observer -= new CFFReader.ReaderObserver(CFFReader_Observer); reader.ExceptionHandler -= new CFFReader.ReaderExceptionHandler(CFFReader_ExceptionHandler); } } // return(ret); }
public override CIEngineSource.TState Read() { CIEngineSource.TState ret = CIEngineSource.TState.EStateReadyCorrupt; CFFReader reader = iPluginSource.Reader; // try { reader.Observer += new CFFReader.ReaderObserver(CFFReader_Observer); reader.ExceptionHandler += new CFFReader.ReaderExceptionHandler(CFFReader_ExceptionHandler); // Perform synchronous read reader.OnNativeReadInit(); // Decide final state CFFReader.TState readerState = reader.State; switch (readerState) { default: case CFFReader.TState.EStateProcessing: case CFFReader.TState.EStateUninitialised: SymbianUtils.SymDebug.SymDebugger.Assert(false); break; case CFFReader.TState.EStateCorrupt: ret = CIEngineSource.TState.EStateReadyCorrupt; break; case CFFReader.TState.EStateReady: if (base.CrashItemCount > 0) { ret = CIEngineSource.TState.EStateReady; } else { ret = CIEngineSource.TState.EStateReadyNoItems; } break; } } finally { reader.Observer -= new CFFReader.ReaderObserver(CFFReader_Observer); reader.ExceptionHandler -= new CFFReader.ReaderExceptionHandler(CFFReader_ExceptionHandler); } // return(ret); }
private CIEngineSource.TState CalculateFinalState() { CIEngineSource.TState ret = CIEngineSource.TState.EStateReadyCorrupt; // For trace-based operations we'll potentially be firing each trace // line at multiple readers, in which case we only mark the file as // corrupt if no readers completed successfully. int countCorrupt = 0; int countReady = 0; int countContainers = base.CrashItemCount; // Count number of ready vs corrupt readers foreach (CFFSource source in iPluginSources) { CFFReader reader = source.Reader; CFFReader.TState readerState = reader.State; // switch (readerState) { case CFFReader.TState.EStateCorrupt: ++countCorrupt; break; case CFFReader.TState.EStateReady: ++countReady; break; default: case CFFReader.TState.EStateProcessing: case CFFReader.TState.EStateUninitialised: SymbianUtils.SymDebug.SymDebugger.Assert(false); break; } } // If we created at least one container, then we did still manage to create // some kind of crash output irrespective of how many of the readers indicated // the source was corrupt. In that case, the underlying source file is treated // as valid. base.Trace("[CIEngineSourceReaderTrace] CalculateFinalState() - total: {0}, ready: {1}, corrupt: {2}", countContainers, countReady, countCorrupt); if (countContainers > 0) { ret = CIEngineSource.TState.EStateReady; } else { // We didn't manage to create any crash items at all from this source // file. if (countCorrupt > 0) { // At least one reader indicated that the source file was corrupt, // and since no other reader could create any kind of valid output // we'll treat the source file as entirely corrupt. ret = CIEngineSource.TState.EStateReadyCorrupt; } else { // No crash container created, but nobody said the file was corrupt // either. It's just a "no items" file. ret = CIEngineSource.TState.EStateReadyNoItems; } } base.Trace("[CIEngineSourceReaderTrace] CalculateFinalState() - END - ret: {0}, file: {1}", ret, base.Source.FileName); return(ret); }