Пример #1
0
        public StringBuilder encode(StringBuilder finalSB, ClassicEncodingSettings settings, bool isTransferEncode, int encodeLevel)
        {
            if (finalSB.Length + this.getEstimateDataSize() > finalSB.Capacity)
            {
                finalSB.EnsureCapacity(finalSB.Capacity + getEstimateDataSize());
            }

            int?formatId = null;

            bool formatWasInserted = false;

            bool needToInsertFormat = settings != null && settings.isEncodeFormat();

            bool isKnown = false;

            KnownFormatCollector collector = settings != null?settings.getKnownFormatCollector() : null;


            if (needToInsertFormat)
            {
                if (this.getFormat().getFieldCount() > 0 && settings.getFormatCache() != null)
                {
                    formatId = settings.getFormatCache().addIfNotExists(this.getFormat());

                    if (collector != null)
                    {
                        needToInsertFormat = false;

                        if (collector.isKnown(formatId) && collector.isMarked(formatId))
                        {
                            // Format is known - inserting ID only
                            new Element(ELEMENT_FORMAT_ID, formatId.ToString()).encode(finalSB, settings, isTransferEncode, encodeLevel);

                            isKnown = true;
                        }
                        else
                        {
                            var oldEncodeFormat = settings.isEncodeFormat();
                            settings.setEncodeFormat(true);

                            try
                            {
                                // Format is not known - inserting both format and ID
                                new Element(ELEMENT_FORMAT, this.getFormat()).encode(finalSB, settings, isTransferEncode, encodeLevel);
                                new Element(ELEMENT_FORMAT_ID, formatId.ToString()).encode(finalSB, settings, isTransferEncode, encodeLevel);

                                formatWasInserted = true;
                            }
                            finally
                            {
                                settings.setEncodeFormat((bool)oldEncodeFormat);
                            }
                        }
                    }
                }

                if (needToInsertFormat)
                {
                    var oldEncodeFormat = settings.isEncodeFormat();
                    settings.setEncodeFormat(true);
                    try
                    {
                        new Element(ELEMENT_FORMAT, this.getFormat()).encode(finalSB, settings, isTransferEncode, encodeLevel);

                        formatWasInserted = true;
                    }
                    finally
                    {
                        settings.setEncodeFormat((bool)oldEncodeFormat);
                    }
                }
            }

            bool?oldEncodeFormat1 = null;

            if (settings != null)
            {
                oldEncodeFormat1 = settings.isEncodeFormat();
            }
            try
            {
                if (formatWasInserted)
                {
                    settings.setEncodeFormat(false);
                }

                this.getEncodedData(finalSB, settings, isTransferEncode, encodeLevel + 1);
            }
            finally
            {
                if (oldEncodeFormat1 != null)
                {
                    settings.setEncodeFormat((bool)oldEncodeFormat1);
                }
            }

            if (isInvalid())
            {
                new Element(ELEMENT_FORMAT, this.invalidationMessage).encode(finalSB, settings, isTransferEncode, encodeLevel);
            }


            if (!isKnown && formatId != null && collector != null)
            {
                // Marking format as known
                collector.makeKnown((int)formatId, true);
            }

            return(finalSB);
        }
 public void setKnownFormatCollector(KnownFormatCollector aKnownFromatCollector)
 {
     this.knownFormatCollector = aKnownFromatCollector;
 }