public MemberTemplate(ResourceTemplate template, MemberType type, byte index, string name) { this.template = template; this.type = type; this.index = index; this.name = name; }
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; }
public FunctionTemplate(ResourceTemplate template, byte index, string name, bool isVoid, string expansion) : base(template, MemberType.Property, index, name) { this.IsVoid = isVoid; this.Expansion = expansion; }
public EventTemplate(ResourceTemplate template, byte index, string name, string expansion) : base(template, MemberType.Property, index, name) { this.Expansion = expansion; }
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); }