Example #1
0
        public override void flatten(BinaryWriter writer)
        {
            // Format:  0. Protocol revision number
            //             (4 bytes, always set to CURRENT_PROTOCOL_VERSION)
            //          1. 'what' code (4 bytes)
            //          2. Number of entries (4 bytes)
            //          3. Entry name length (4 bytes)
            //          4. Entry name string (flattened String)
            //          5. Entry type code (4 bytes)
            //          6. Entry data length (4 bytes)
            //          7. Entry data (n bytes)
            //          8. loop to 3 as necessary
            writer.Write((int)CURRENT_PROTOCOL_VERSION);
            writer.Write((int)what);
            writer.Write((int)countFields());
            IEnumerator e = fieldNames();

            while (e.MoveNext())
            {
                string       name  = (string)e.Current;
                MessageField field = (MessageField)_fieldTable[name];

                byte [] byteArray = Encoding.UTF8.GetBytes(name);

                writer.Write((int)(byteArray.Length + 1));
                writer.Write(byteArray);
                writer.Write((byte)0);  // terminating NUL byte

                writer.Write(field.typeCode());
                writer.Write(field.flattenedSize());
                field.flatten(writer);
            }
        }
Example #2
0
        /// Returns The number of bytes it would take to flatten this
        /// Message into a byte buffer.
        public override int flattenedSize()
        {
            // 4 bytes for the protocol revision #, 4 bytes for the
            // number-of-entries field, 4 bytes for what code
            int sum = 4 + 4 + 4;

            if (_fieldTable != null)
            {
                IEnumerator e = fieldNames();
                while (e.MoveNext())
                {
                    string       fieldName = (string)e.Current;
                    MessageField field     = (MessageField)_fieldTable[fieldName];

                    // 4 bytes for the name length, name data,
                    // 4 bytes for entry type code,
                    /// 4 bytes for entry data length, entry data
                    sum += 4 + (fieldName.Length + 1) + 4 + 4 + field.flattenedSize();
                }
            }
            return(sum);
        }