예제 #1
0
 public MemberTemplate(ResourceTemplate template, MemberType type, byte index, string name)
 {
     this.template = template;
     this.type     = type;
     this.index    = index;
     this.name     = name;
 }
예제 #2
0
 public PropertyTemplate(ResourceTemplate template, byte index, string name, string read, string write, StorageMode storage)
     : base(template, MemberType.Property, index, name)
 {
     //this.Recordable = recordable;
     this.Storage        = storage;
     this.ReadExpansion  = read;
     this.WriteExpansion = write;
 }
예제 #3
0
 public FunctionTemplate(ResourceTemplate template, byte index, string name, bool isVoid, string expansion)
     : base(template, MemberType.Property, index, name)
 {
     this.IsVoid    = isVoid;
     this.Expansion = expansion;
 }
예제 #4
0
 public EventTemplate(ResourceTemplate template, byte index, string name, string expansion)
     : base(template, MemberType.Property, index, name)
 {
     this.Expansion = expansion;
 }
예제 #5
0
        public static ResourceTemplate Parse(byte[] data, uint offset, uint contentLength)
        {
            uint ends = offset + contentLength;

            uint oOffset = offset;

            // start parsing...

            var od = new ResourceTemplate();

            od.content = data.Clip(offset, contentLength);

            od.classId   = data.GetGuid(offset);
            offset      += 16;
            od.className = data.GetString(offset + 1, data[offset]);// Encoding.ASCII.GetString(data, (int)offset + 1, data[offset]);
            offset      += (uint)data[offset] + 1;

            od.version = data.GetInt32(offset);
            offset    += 4;

            ushort methodsCount = data.GetUInt16(offset);

            offset += 2;

            byte functionIndex = 0;
            byte propertyIndex = 0;
            byte eventIndex    = 0;

            for (int i = 0; i < methodsCount; i++)
            {
                var type = data[offset] >> 5;

                if (type == 0) // function
                {
                    string expansion    = null;
                    var    hasExpansion = ((data[offset] & 0x10) == 0x10);
                    var    isVoid       = ((data[offset++] & 0x08) == 0x08);
                    var    name         = data.GetString(offset + 1, data[offset]);// Encoding.ASCII.GetString(data, (int)offset + 1, data[offset]);
                    offset += (uint)data[offset] + 1;

                    if (hasExpansion) // expansion ?
                    {
                        var cs = data.GetUInt32(offset);
                        offset   += 4;
                        expansion = data.GetString(offset, cs);
                        offset   += cs;
                    }

                    var ft = new FunctionTemplate(od, functionIndex++, name, isVoid, expansion);

                    od.functions.Add(ft);
                }
                else if (type == 1)    // property
                {
                    string readExpansion = null, writeExpansion = null;

                    var hasReadExpansion  = ((data[offset] & 0x8) == 0x8);
                    var hasWriteExpansion = ((data[offset] & 0x10) == 0x10);
                    var recordable        = ((data[offset] & 1) == 1);
                    var permission        = (PropertyTemplate.PropertyPermission)((data[offset++] >> 1) & 0x3);
                    var name = data.GetString(offset + 1, data[offset]);// Encoding.ASCII.GetString(data, (int)offset + 1, data[offset]);

                    offset += (uint)data[offset] + 1;

                    if (hasReadExpansion) // expansion ?
                    {
                        var cs = data.GetUInt32(offset);
                        offset       += 4;
                        readExpansion = data.GetString(offset, cs);
                        offset       += cs;
                    }

                    if (hasWriteExpansion) // expansion ?
                    {
                        var cs = data.GetUInt32(offset);
                        offset        += 4;
                        writeExpansion = data.GetString(offset, cs);
                        offset        += cs;
                    }

                    var pt = new PropertyTemplate(od, propertyIndex++, name, readExpansion, writeExpansion, recordable ? StorageMode.Recordable : StorageMode.Volatile);

                    od.properties.Add(pt);
                }
                else if (type == 2) // Event
                {
                    string expansion    = null;
                    var    hasExpansion = ((data[offset++] & 0x10) == 0x10);

                    var name = data.GetString(offset + 1, data[offset]);// Encoding.ASCII.GetString(data, (int)offset + 1, (int)data[offset]);
                    offset += (uint)data[offset] + 1;

                    if (hasExpansion) // expansion ?
                    {
                        var cs = data.GetUInt32(offset);
                        offset   += 4;
                        expansion = data.GetString(offset, cs);
                        offset   += cs;
                    }

                    var et = new EventTemplate(od, eventIndex++, name, expansion);

                    od.events.Add(et);
                }
            }

            // append signals
            for (int i = 0; i < od.events.Count; i++)
            {
                od.members.Add(od.events[i]);
            }
            // append slots
            for (int i = 0; i < od.functions.Count; i++)
            {
                od.members.Add(od.functions[i]);
            }
            // append properties
            for (int i = 0; i < od.properties.Count; i++)
            {
                od.members.Add(od.properties[i]);
            }


            //od.isReady = true;

            /*
             * var oo = owner.Socket.Engine.GetObjectDescription(od.GUID);
             * if (oo != null)
             * {
             *  Console.WriteLine("Already there ! description");
             *  return oo;
             * }
             * else
             * {
             *  owner.Socket.Engine.AddObjectDescription(od);
             *  return od;
             * }
             */

            return(od);
        }