Пример #1
0
 private void Reader_EcondingChanged(object sender, Encoding enc)
 {
     lock (lockObject)
     {
         fullUpdate = true;
     }
     EcondingChanged?.Invoke(this, enc);
 }
Пример #2
0
        public virtual LineRange ReadRange(long position, Origin origin, int maxPrev, int maxNext, int maxPrevExt, int maxNextExt, LineRange currentState = null)
        {
            Stream stream = null;

            try
            {
                int cp = CurEncoding.CodePage;

                stream = GetStream();
                if (stream == null)
                {
                    HandleStreamUnavailable();
                    return(new LineRange());
                }

                LineReader lineReader = new LineReader(stream, GetEncoding(stream));
                if (origin == Origin.End)
                {
                    position = stream.Length + position;
                    if (position < 0)
                    {
                        position = 0;
                    }
                }

                Line             curLine      = null;
                List <Line>      prev         = new List <Line>();
                List <Line>      next         = new List <Line>();
                List <Extent>    prevExtent   = new List <Extent>();
                List <Extent>    nextExtent   = new List <Extent>();
                Action <RawLine> feedDetector = (line) => { if (line != null)
                                                            {
                                                                FeedDetector(line, lineReader);
                                                            }
                };
                curLine = ReadRange(lineReader, position, maxPrev, maxNext, maxPrevExt, maxNextExt, prev, next, prevExtent, nextExtent, currentState, feedDetector);

                int enc = CurEncoding.CodePage;

                //foreach (Line line in prev)
                //{
                //   FeedDetector(line, lineReader);
                //}
                //if (curLine != null) FeedDetector(curLine, lineReader);
                //foreach (Line line in next)
                //{
                //   FeedDetector(line, lineReader);
                //}

                if (CurEncoding.CodePage != enc)
                {
                    // Read line again with new encoding
                    lineReader = new LineReader(stream, CurEncoding);
                    curLine    = ReadRange(lineReader, position, maxPrev, maxNext, maxPrevExt, maxNextExt, prev, next, prevExtent, nextExtent);
                }

                if (CurEncoding.CodePage != cp)
                {
                    EcondingChanged?.Invoke(this, CurEncoding);
                }

                LineRange lineRange = new LineRange(curLine, prev.ConvertAll <Line>(l => (Line)l), next.ConvertAll <Line>(l => (Line)l),
                                                    prevExtent, nextExtent, lineReader.StreamLength);
                CloseStream(stream);
                return(lineRange);
            }
            catch (Exception e)
            {
                HandleError(stream, e);
                return(new LineRange());
            }
        }