Beispiel #1
0
        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);
        }
Beispiel #3
0
        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);
        }