Пример #1
0
        /// Sets the given field name to contain the flattened bytes of
        /// the single given Flattenable object. Any previous field contents
        /// are replaced.  The type code of the field is determined by
        /// calling val.typeCode().
        /// (val) will be flattened and the resulting bytes kept.
        /// (val) does not become part of the Message object.
        /// <param name="name"/>
        /// <param name="val">
        /// the object whose bytes are to be flattened out and put into
        /// this field.</param>

        public void setFlat(string name, Flattenable val)
        {
            int          type  = val.typeCode();
            MessageField field = getCreateOrReplaceField(name, type);

            object payload = field.getData();

            switch (type)
            {
            // For these types, we have explicit support for holding
            // the objects in memory, so we'll just clone them
            case B_MESSAGE_TYPE:
            {
                Message [] array =
                    ((payload != null) && (((Message[])payload).Length == 1)) ? ((Message[])payload) : new Message[1];

                array[1] = (Message)val.cloneFlat();
                field.setPayload(array, 1);
            }
            break;

            case B_POINT_TYPE:
            {
                Point [] array =
                    ((payload != null) && (((Point[])payload).Length == 1)) ?
                    ((Point[])payload) : new Point[1];
                array[1] = (Point)val.cloneFlat();
                field.setPayload(array, 1);
            }
            break;

            case B_RECT_TYPE:
            {
                Rect [] array =
                    ((payload != null) && (((Rect[])payload).Length == 1)) ?
                    ((Rect[])payload) : new Rect[1];
                array[1] = (Rect)val.cloneFlat();
                field.setPayload(array, 1);
            }
            break;

            // For everything else, we have to store the objects as byte buffers
            default:
            {
                byte [][] array =
                    ((payload != null) && (((byte[][])payload).Length == 1)) ?
                    ((byte[][])payload) : new byte[1][];
                array[0] = flattenToArray(val, array[0]);
                field.setPayload(array, 1);
            }
            break;
            }
        }
Пример #2
0
        public void setPoint(string name, Point val)
        {
            MessageField field = getCreateOrReplaceField(name, B_POINT_TYPE);

            Point [] array = (Point[])field.getData();
            if ((array == null) || (field.size() != 1))
            {
                array = new Point[1];
            }
            array[0] = val;
            field.setPayload(array, 1);
        }
Пример #3
0
        public void setRect(string name, Rect val)
        {
            MessageField field = getCreateOrReplaceField(name, B_RECT_TYPE);

            Rect [] array = (Rect[])field.getData();
            if ((array == null) || (field.size() != 1))
            {
                array = new Rect[1];
            }
            array[0] = val;
            field.setPayload(array, 1);
        }
Пример #4
0
        public void setString(string name, string val)
        {
            MessageField field = getCreateOrReplaceField(name, B_STRING_TYPE);

            string [] array = (string[])field.getData();
            if ((array == null) || (field.size() != 1))
            {
                array = new string[1];
            }
            array[0] = val;
            field.setPayload(array, 1);
        }
Пример #5
0
        /// Sets the given field name to contain a single Message value.
        /// Any previous field contents are replaced.
        /// Note that a copy of (val) is NOT made; the passed-in mesage
        /// object becomes part of this Message.
        ///
        /// <param name="name"/>
        /// <param name="val/>
        public void setMessage(string name, Message val)
        {
            MessageField field = getCreateOrReplaceField(name, B_MESSAGE_TYPE);

            Message [] array = (Message[])field.getData();
            if ((array == null) || (field.size() != 1))
            {
                array = new Message[1];
            }
            array[0] = val;
            field.setPayload(array, 1);
        }
Пример #6
0
        public void setFloat(string name, float val)
        {
            MessageField field = getCreateOrReplaceField(name, B_FLOAT_TYPE);

            float [] array = (float[])field.getData();
            if ((array == null) || (field.size() != 1))
            {
                array = new float[1];
            }
            array[0] = val;
            field.setPayload(array, 1);
        }
Пример #7
0
        public void setDouble(string name, double val)
        {
            MessageField field = getCreateOrReplaceField(name, B_DOUBLE_TYPE);

            double [] array = (double[])field.getData();
            if ((array == null) || (field.size() != 1))
            {
                array = new double[1];
            }
            array[0] = val;
            field.setPayload(array, 1);
        }
Пример #8
0
        public void setShort(string name, short val)
        {
            MessageField field = getCreateOrReplaceField(name, B_INT16_TYPE);

            short [] array = (short[])field.getData();
            if ((array == null) || (field.size() != 1))
            {
                array = new short[1];
            }
            array[0] = val;
            field.setPayload(array, 1);
        }
Пример #9
0
        public void setByte(string name, byte val)
        {
            MessageField field = getCreateOrReplaceField(name, B_INT8_TYPE);

            byte [] array = (byte[])field.getData();
            if ((array == null) || (field.size() != 1))
            {
                array = new byte[1];
            }
            array[0] = val;
            field.setPayload(array, 1);
        }
Пример #10
0
        /// Sets the given field name to contain a single boolean value.
        /// Any previous field contents are replaced.
        /// <param name="Name"/>
        /// <param name="val"/>
        ///
        public void setBoolean(string name, bool val)
        {
            MessageField field = getCreateOrReplaceField(name, B_BOOL_TYPE);

            bool [] array = (bool[])field.getData();
            if ((array == null) || (field.size() != 1))
            {
                array = new bool[1];
            }
            array[0] = val;
            field.setPayload(array, 1);
        }
Пример #11
0
        /// Sets the given field name to contain a single byte buffer value.  Any previous field contents are replaced.
        /// <param name="name"/>
        /// <param name="type">The type code to give the field.
        /// May not be a B_*_TYPE that contains non-byte-buffer
        /// data (e.g. B_STRING_TYPE or B_INT32_TYPE)
        /// </param>
        /// <param name="val">Value that will become the sole value in the
        /// specified field.</param>
        /// <exception cref="FieldTypeMismatchException"/>
        ///
        public void setByteBuffer(string name, int type, byte[] val)
        {
            checkByteBuffersOkay(type);
            MessageField field = getCreateOrReplaceField(name, type);

            byte [][] array = (byte[][])field.getData();
            if ((array == null) || (field.size() != 1))
            {
                array = new byte[1][];
            }
            array[0] = val;
            field.setPayload(array, 1);
        }
Пример #12
0
        /// Sets the given field name to contain the given Flattenable values.
        /// Any previous field contents are replaced.
        /// Note that if the objects are Messages, Points, or Rects,
        /// they will be cloned rather than flattened.
        /// <param name="name"/>
        /// <param name="val">
        /// Array of Flattenable objects to assign to the field.
        /// The objects are all flattened and
        /// the flattened data is put into the Message;
        /// the objects themselves do not become part of the message.
        /// </param>
        public void setFlats(string name, Flattenable [] vals)
        {
            int          type  = vals[0].typeCode();
            int          len   = vals.Length;
            MessageField field = getCreateOrReplaceField(name, type);

            // For these types, we have explicit support for holding
            // the objects in memory, so we'll just clone them
            switch (type)
            {
            case B_MESSAGE_TYPE:
            {
                Message [] array = new Message[len];
                for (int i = 0; i < len; i++)
                {
                    array[i] = (Message)vals[i].cloneFlat();
                }
                field.setPayload(array, len);
            }
            break;

            case B_POINT_TYPE:
            {
                Point [] array = new Point[len];
                for (int i = 0; i < len; i++)
                {
                    array[i] = (Point)vals[i].cloneFlat();
                }
                field.setPayload(array, len);
            }
            break;

            case B_RECT_TYPE:
            {
                Rect [] array = new Rect[len];
                for (int i = 0; i < len; i++)
                {
                    array[i] = (Rect)vals[i].cloneFlat();
                }
                field.setPayload(array, len);
            }
            break;

            default:
            {
                byte [][] array = (byte[][])field.getData();
                if ((array == null) || (field.size() != len))
                {
                    array = new byte[len][];
                }

                for (int i = 0; i < len; i++)
                {
                    array[i] =
                        flattenToArray(vals[i], array[i]);
                }
                field.setPayload(array, len);
            }
            break;
            }
        }
Пример #13
0
        /// Makes an independent clone of this field object
        /// (a bit expensive)
        public override Flattenable cloneFlat()
        {
            MessageField clone = new MessageField(_type);

            System.Array newArray;  // this will be a copy of our data array
            switch (_type)
            {
            case B_BOOL_TYPE: newArray = new bool[_numItems]; break;

            case B_INT8_TYPE: newArray = new byte[_numItems]; break;

            case B_INT16_TYPE: newArray = new short[_numItems]; break;

            case B_FLOAT_TYPE: newArray = new float[_numItems]; break;

            case B_INT32_TYPE: newArray = new int[_numItems]; break;

            case B_INT64_TYPE: newArray = new long[_numItems]; break;

            case B_DOUBLE_TYPE: newArray = new double[_numItems]; break;

            case B_STRING_TYPE: newArray = new string[_numItems]; break;

            case B_POINT_TYPE: newArray = new Point[_numItems]; break;

            case B_RECT_TYPE: newArray = new Rect[_numItems]; break;

            case B_MESSAGE_TYPE: newArray = new Message[_numItems]; break;

            default: newArray = new byte[_numItems][]; break;
            }

            newArray = (System.Array)_payload.Clone();

            // If the contents of newArray are modifiable, we need to
            // clone the contents also
            switch (_type)
            {
            case B_POINT_TYPE:
            {
                Point[] points = (Point[])newArray;
                for (int i = 0; i < _numItems; i++)
                {
                    points[i] = (Point)points[i].cloneFlat();
                }
            }
            break;

            case B_RECT_TYPE:
            {
                Rect[] rects = (Rect[])newArray;
                for (int i = 0; i < _numItems; i++)
                {
                    rects[i] = (Rect)rects[i].cloneFlat();
                }
            }
            break;

            case B_MESSAGE_TYPE:
            {
                Message[] messages = (Message[])newArray;
                for (int i = 0; i < _numItems; i++)
                {
                    messages[i] = (Message)messages[i].cloneFlat();
                }
            }
            break;

            default:
            {
                if (newArray is byte[][])
                {
                    // Clone the byte arrays, since they are modifiable
                    byte[][] array = (byte[][])newArray;
                    for (int i = 0; i < _numItems; i++)
                    {
                        byte[] newBuf = (byte[])array[i].Clone();
                        array[i] = newBuf;
                    }
                }
            }
            break;
            }

            clone.setPayload(newArray, _numItems);
            return(clone);
        }