/// 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; } }
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); }
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); }
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); }
/// 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); }
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); }
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); }
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); }
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); }
/// 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); }
/// 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); }
/// 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; } }
/// 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); }