Exemplo n.º 1
0
                        private bool ZBuildLineFromBytes(cTrace.cContext pParentContext)
                        {
                            var lContext = pParentContext.NewMethod(nameof(cResponseBuilder), nameof(ZBuildLineFromBytes));

                            if (mBytes.Count < 3 || mBytes[mBytes.Count - 1] != cASCII.RBRACE)
                            {
                                ZAddWholeLine(false, lContext);
                                return(true); // complete
                            }

                            int lBytePosition = mBytes.Count - 2;

                            while (lBytePosition > 0)
                            {
                                byte lByte = mBytes[lBytePosition];
                                if (lByte < cASCII.ZERO || lByte > cASCII.NINE)
                                {
                                    break;
                                }
                                lBytePosition--;
                            }

                            if (lBytePosition == mBytes.Count - 2 || mBytes[lBytePosition] != cASCII.LBRACE)
                            {
                                ZAddWholeLine(false, lContext);
                                return(true); // complete
                            }

                            mBytesToGo = 0;

                            checked
                            {
                                for (int i = lBytePosition + 1; i < mBytes.Count - 1; i++)
                                {
                                    mBytesToGo = mBytesToGo * 10 + mBytes[i] - cASCII.ZERO;
                                }
                            }

                            if (lBytePosition != 0 && mBytes[lBytePosition - 1] == cASCII.TILDA)
                            {
                                lBytePosition--;
                            }

                            mBytes.RemoveRange(lBytePosition, mBytes.Count - lBytePosition);
                            ZAddWholeLine(false, lContext);

                            if (mBytesToGo == 0)
                            {
                                if (!lContext.ContextTraceDelay)
                                {
                                    lContext.TraceVerbose("adding empty literal line");
                                }
                                mLines.Add(new cResponseLine(true, new byte[0]));
                            }
                            else if (!lContext.ContextTraceDelay)
                            {
                                lContext.TraceVerbose("expecting literal of length {0}", mBytesToGo);
                            }

                            return(false); // still need more bytes
                        }