Exemple #1
0
        public IAdaptingType read(FlashorbBinaryReader reader, ParseContext parseContext)
        {
            int refId = reader.ReadVarInteger();

            if ((refId & 0x1) == 0)
            {
                return(parseContext.getReference(refId >> 1));
            }

            int           arraySize    = refId >> 1;
            IAdaptingType adaptingType = null;
            object        container    = null;

            while (true)
            {
                string str = ReaderUtils.readString(reader, parseContext);

                if (str == null || str.Length == 0)
                {
                    break;
                }

                if (container == null)
                {
                    container    = new Dictionary <object, object>();
                    adaptingType = new AnonymousObject((IDictionary)container);
                    parseContext.addReference(adaptingType);
                }

                object obj = RequestParser.readData(reader, parseContext);
                ((IDictionary)container)[str] = obj;
            }

            if (adaptingType == null)
            {
                container    = new object[arraySize];
                adaptingType = new ArrayType((object[])container);
                parseContext.addReference(adaptingType);

                for (int i = 0; i < arraySize; i++)
                {
                    ((object[])container)[i] = RequestParser.readData(reader, parseContext);
                }
            }
            else
            {
                for (int i = 0; i < arraySize; i++)
                {
                    object obj = RequestParser.readData(reader, parseContext);
                    ((IDictionary)container)[i.ToString()] = obj;
                }
            }

            return(adaptingType);
        }
Exemple #2
0
        public IAdaptingType read(FlashorbBinaryReader reader, ParseContext parseContext)
        {
            int  handle = reader.ReadVarInteger();
            bool inline = ((handle & 1) != 0);

            handle = handle >> 1;
            if (inline)
            {
                object[] array = new object[handle];

                ArrayType ar = new ArrayType(array);
                parseContext.addReference(ar);

                // whether vector is readonly
                int @fixed = reader.ReadVarInteger();

                if (!typeof(T).IsValueType)
                {
                    // type name of the vector's elements
                    string elementTypeName = ReaderUtils.readString(reader, parseContext);
                }

                for (int i = 0; i < handle; i++)
                {
                    if (typeof(T) == typeof(int))
                    {
                        array[i] = reader.ReadInteger();
                    }
                    else if (typeof(T) == typeof(uint))
                    {
                        array[i] = reader.ReadUInteger();
                    }
                    else if (typeof(T) == typeof(double))
                    {
                        array[i] = reader.ReadDouble();
                    }
                    else
                    {
                        array[i] = RequestParser.readData(reader, parseContext);
                        //array[ i ] = objectReader.read( reader, parseContext );
                    }
                }

                return(ar);
            }
            else
            {
                return(parseContext.getReference(handle));
            }
        }
Exemple #3
0
        private ClassInfo getClassInfo(int refId, FlashorbBinaryReader reader, ParseContext parseContext)
        {
            if ((refId & 0x3) == 1)
            {
                return((ClassInfo)parseContext.getClassInfoReference(refId >> 2));
            }

            ClassInfo classInfo = new ClassInfo();

            classInfo.externalizable = (refId & 0x4) == 4;
            classInfo.looseProps     = (refId & 0x8) == 8;
            classInfo.className      = ReaderUtils.readString(reader, parseContext);
            int propsCount = refId >> 4;

            for (int i = 0; i < propsCount; i++)
            {
                classInfo.addProperty(ReaderUtils.readString(reader, parseContext));
            }

            parseContext.addClassInfoReference(classInfo);
            return(classInfo);
        }
Exemple #4
0
        public IAdaptingType read(FlashorbBinaryReader reader, ParseContext parseContext)
        {
            int refId = reader.ReadVarInteger();

            if ((refId & 0x1) == 0)
            {
                return((IAdaptingType)parseContext.getReference(refId >> 1));
            }

            ClassInfo classInfo = getClassInfo(refId, reader, parseContext);

            Type mappedType = null;

            if (!string.IsNullOrEmpty(classInfo.className))
            {
                mappedType = Types.Types.getServerTypeForClientClass(classInfo.className);
            }

            if (classInfo.externalizable || typeof(IExternalizable).IsAssignableFrom(mappedType))
            {
                Type   type   = Types.Types.getServerTypeForClientClass(classInfo.className);
                object extobj = null;

                if (type != null)
                {
                    extobj = ObjectFactories.CreateServiceObject(type);
                }
                else
                {
                    extobj = ObjectFactories.CreateServiceObject(classInfo.className);
                }

                if (!(extobj is IExternalizable))
                {
                    throw new Exception("object must implement IExternalizable");
                }
                else
                {
                    CacheableAdaptingTypeWrapper wrapper = new CacheableAdaptingTypeWrapper();
                    parseContext.addReference(wrapper);

                    IAdaptingType returnValue = null;
                    extobj = ((IExternalizable)extobj).readExternal(reader, parseContext);

                    if (extobj is IAdaptingType)
                    {
                        returnValue = (IAdaptingType)extobj;
                    }
                    else
                    {
                        returnValue = new ConcreteObject(extobj);
                    }

                    wrapper.setType(returnValue);
                    return(returnValue);
                }
            }
            else
            {
                Dictionary <String, IAdaptingType> props = new Dictionary <String, IAdaptingType>();
                AnonymousObject anonObj     = new AnonymousObject();
                IAdaptingType   returnValue = anonObj;

                if (classInfo.className != null && classInfo.className.Length > 0)
                {
                    returnValue = new NamedObject(classInfo.className, anonObj);
                }

                parseContext.addReference(returnValue);
                int propCount = classInfo.getPropertyCount();

                for (int i = 0; i < propCount; i++)
                {
                    if (Log.isLogging(LoggingConstants.DEBUG))
                    {
                        Log.log(LoggingConstants.DEBUG, "reading object property " + classInfo.getProperty(i));
                    }

                    props[classInfo.getProperty(i)] = RequestParser.readData(reader, parseContext);
                }

                if (classInfo.looseProps)
                {
                    while (true)
                    {
                        string propName = ReaderUtils.readString(reader, parseContext);

                        if (propName == null || propName.Length == 0)
                        {
                            break;
                        }

                        props[propName] = RequestParser.readData(reader, parseContext);
                    }
                }

                anonObj.Properties = props;
                return(returnValue);
            }
        }
Exemple #5
0
 public IAdaptingType read(FlashorbBinaryReader reader, ParseContext parseContext)
 {
     return(new StringType(ReaderUtils.readString(reader, parseContext)));
 }