Beispiel #1
0
        private object GetData()
        {
            using (MessageElementData val = _GetData())
            {
                if (val == null)
                {
                    return(null);
                }
                object a = null;
                a = MessageElementDataUtil.ToRRBaseArray(val);
                if (a != null)
                {
                    if (DataTypeUtil.IsNumber(val.GetTypeID()))
                    {
                        RRBaseArray ra = (RRBaseArray)a;
                        try
                        {
                            return(MessageElementDataUtil.RRBaseArrayToArray(ra));
                        }
                        finally
                        {
                            ra.Dispose();
                        }
                    }
                    if (val.GetTypeID() == DataTypes.string_t)
                    {
                        RRBaseArray ra = (RRBaseArray)a;
                        try
                        {
                            return(MessageElementDataUtil.RRBaseArrayToString(ra));
                        }
                        finally
                        {
                            ra.Dispose();
                        }
                    }
                    IDisposable ad = a as IDisposable;
                    if (ad != null)
                    {
                        ad.Dispose();
                    }
                    throw new DataTypeException("Unknown RRArray type");
                }
                a = MessageElementDataUtil.ToMessageElementNestedElementList(val);
                if (a != null)
                {
                    return(a);
                }
                throw new ApplicationException("Unknown data type");
            }

            throw new ApplicationException("Unknown data type");
        }
Beispiel #2
0
        private void SetData(object dat)
        {
            if (dat == null)
            {
                _SetData(null);
                return;
            }
            if (dat is Array)
            {
                using (RRBaseArray rb = MessageElementDataUtil.ArrayToRRBaseArray((Array)dat))
                {
                    _SetData(rb);
                }
                return;
            }

            if (dat is string)
            {
                using (RRBaseArray rb = MessageElementDataUtil.stringToRRBaseArray((string)dat))
                {
                    _SetData(rb);
                }

                return;
            }

            if (dat is MessageElementData)
            {
                _SetData((MessageElementData)dat);
                return;
            }

            string    datatype    = datatype = RobotRaconteurNode.GetTypeString(dat.GetType());
            DataTypes elementtype = DataTypeUtil.TypeIDFromString(datatype);

            if (elementtype != DataTypes.void_t && (elementtype < DataTypes.uint64_t || elementtype == DataTypes.bool_t) &&
                !(dat is Array))
            {
                object dat2 = DataTypeUtil.ArrayFromScalar(dat);

                using (RRBaseArray rb = MessageElementDataUtil.ArrayToRRBaseArray((Array)dat2))
                {
                    _SetData(rb);
                }

                return;
            }

            throw new DataTypeException("Invalid MessageElement data type");
        }
Beispiel #3
0
        public static RRBaseArray ArrayToRRBaseArray(Array i, RRBaseArray o)
        {
            if (i == null)
            {
                return(null);
            }
            DataTypes type = DataTypeUtil.TypeIDFromString(RobotRaconteurNode.GetTypeString(i.GetType().GetElementType()));

            if (i.Length != o.size())
            {
                throw new Exception("Length mismatch");
            }
            if (o.GetTypeID() != type)
            {
                throw new Exception("Type mismatch");
            }

            /*GCHandle h = GCHandle.Alloc(i, GCHandleType.Pinned);
             * rr_memcpy.memcpy(o.void_ptr(), h.AddrOfPinnedObject(), i.Length * o.ElementSize());
             * h.Free();*/

            switch (type)
            {
            case DataTypes.double_t: {
                var a = (double[])i;
                MessageElementDataUtil.DoublesToRRBaseArray(a, a.Length, o);
                return(o);
            }

            case DataTypes.single_t: {
                var a = (float[])i;
                MessageElementDataUtil.FloatsToRRBaseArray(a, a.Length, o);
                return(o);
            }

            case DataTypes.int8_t: {
                var a = (sbyte[])i;
                MessageElementDataUtil.BytesToRRBaseArray(a, a.Length, o);
                return(o);
            }

            case DataTypes.uint8_t: {
                var a = (byte[])i;
                MessageElementDataUtil.BytesToRRBaseArray(a, a.Length, o);
                return(o);
            }

            case DataTypes.int16_t: {
                var a = (short[])i;
                MessageElementDataUtil.ShortsToRRBaseArray(a, a.Length, o);
                return(o);
            }

            case DataTypes.uint16_t: {
                var a = (ushort[])i;
                MessageElementDataUtil.ShortsToRRBaseArray(a, a.Length, o);
                return(o);
            }

            case DataTypes.int32_t: {
                var a = (int[])i;
                MessageElementDataUtil.IntsToRRBaseArray(a, a.Length, o);
                return(o);
            }

            case DataTypes.uint32_t: {
                var a = (uint[])i;
                MessageElementDataUtil.IntsToRRBaseArray(a, a.Length, o);
                return(o);
            }

            case DataTypes.int64_t: {
                var a = (long[])i;
                MessageElementDataUtil.LongsToRRBaseArray(a, a.Length, o);
                return(o);
            }

            case DataTypes.uint64_t: {
                var a = (ulong[])i;
                MessageElementDataUtil.LongsToRRBaseArray(a, a.Length, o);
                return(o);
            }

            case DataTypes.cdouble_t: {
                var a = (CDouble[])i;
                var b = new double[a.Length * 2];
                for (int j = 0; j < a.Length; j++)
                {
                    b[j * 2]     = a[j].Real;
                    b[j * 2 + 1] = a[j].Imag;
                }
                MessageElementDataUtil.DoublesToComplexRRBaseArray(b, b.Length, o);
                return(o);
            }

            case DataTypes.csingle_t: {
                var a = (CSingle[])i;
                var b = new float[a.Length * 2];
                for (int j = 0; j < a.Length; j++)
                {
                    b[j * 2]     = a[j].Real;
                    b[j * 2 + 1] = a[j].Imag;
                }
                MessageElementDataUtil.FloatsToComplexRRBaseArray(b, b.Length, o);
                return(o);
            }

            case DataTypes.bool_t: {
                var a = (bool[])i;
                var b = new byte[a.Length];
                for (int j = 0; j < a.Length; j++)
                {
                    b[j] = a[j] ? (byte)1 : (byte)0;
                }
                MessageElementDataUtil.BytesToBoolRRBaseArray(b, b.Length, o);
                return(o);
            }

            default:
                throw new DataTypeException("Invalid RRBaseArray type");
            }

            return(o);
        }