public override void OnPostSerialize(ObjectIDmap objMap, XmlNode objectNode, bool saved, object serializer) { if (saved) { XmlUtil.SetAttribute(objectNode, XmlTags.XMLATT_MethodID, MemberId); XmlUtil.SetAttribute(objectNode, XmlTags.XMLATT_ClassID, ClassId); } else { UInt32 classId = XmlUtil.GetAttributeUInt(objectNode, XmlTags.XMLATT_ClassID); MemberId = XmlUtil.GetAttributeUInt(objectNode, XmlTags.XMLATT_MethodID); ClassPointer root = RootPointer; if (root == null) { throw new DesignerException("Owner class not set for base method [{0},{1}]", classId, MemberId); } if (classId == root.ClassId) { SetDeclarerDirect(root); } else { ClassPointer declarer = root.GetBaseClass(classId); if (declarer == null) { throw new DesignerException("Base class not set for base method [{0},{1}]", classId, MemberId); } SetDeclarerDirect(declarer); } MethodOverride baseMethod = root.GetCustomMethodByBaseMethodId(classId, MemberId); if (baseMethod == null) { throw new DesignerException("Base method not found [{0},{1}]", classId, MemberId); } DataTypePointer[] dps = new DataTypePointer[baseMethod.ParameterCount]; for (int i = 0; i < baseMethod.ParameterCount; i++) { dps[i] = baseMethod.Parameters[i]; } ParametersMatch(dps); Parameters = baseMethod.Parameters; } }
/// <summary> /// called from the holding class /// </summary> /// <param name="reader"></param> /// <param name="node"></param> public void OnReadFromXmlNode(IXmlCodeReader reader0, XmlNode node) { XmlObjectReader reader = (XmlObjectReader)reader0; //retrieve _holder, _event UInt32 memberId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_EventId); //declaring event id MemberId = memberId; // UInt32 varId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_varId); if (varId != 0) { ClassPointer root0 = reader.ObjectList.GetTypedData <ClassPointer>(); LocalVariable lv = root0.GetLocalVariable(varId); _holder = lv; ClassId = lv.ClassType.DefinitionClassId; ClassPointer r = reader.ObjectList.Project.GetTypedData <ClassPointer>(ClassId); _event = r.GetCustomEventById(memberId); } else { XmlNode nd = node.SelectSingleNode(XmlTags.XML_ClassInstance); if (nd != null) { ClassInstancePointer cp = new ClassInstancePointer(); cp.OnPostSerialize(reader.ObjectList, nd, false, reader); _event = cp.Definition.GetCustomEventById(memberId); _holder = cp; ClassId = cp.DefinitionClassId; } else { UInt32 cid = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ownerClassID); if (cid != 0) { ClassPointer root0 = ClassPointer.CreateClassPointer(cid, reader.ObjectList.Project); _holder = root0; ClassId = root0.ClassId; _event = root0.GetCustomEventById(memberId); } else { if (XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ClassID) == 0) { ClassPointer root0 = reader.ObjectList.GetTypedData <ClassPointer>(); _holder = root0; ClassId = root0.ClassId; _event = root0.GetCustomEventById(memberId); } } } } if (_event == null) { //===backward compatibility================================================== UInt32 instId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_instanceId); if (instId != 0) { XmlNode nd = node.SelectSingleNode(XmlTags.XML_ClassInstance); if (nd != null) { ClassInstancePointer cp = new ClassInstancePointer(); cp.OnPostSerialize(reader.ObjectList, nd, false, reader); ClassInstancePointer vi = (ClassInstancePointer)cp.Definition.ObjectList.GetClassRefById(instId); MemberComponentIdCustomInstance mcci = new MemberComponentIdCustomInstance(cp, vi, instId); _holder = mcci; _event = vi.Definition.GetCustomEventById(memberId); ClassId = vi.ClassId; } else { ClassPointer root0 = reader.ObjectList.GetTypedData <ClassPointer>(); ClassInstancePointer cp = (ClassInstancePointer)reader.ObjectList.GetClassRefById(instId); MemberComponentIdCustom mcc = new MemberComponentIdCustom(root0, cp, instId); _holder = mcc; _event = cp.Definition.GetCustomEventById(memberId); ClassId = cp.ClassId; } } else { if (XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ClassID) == 0) { ClassPointer root0 = reader.ObjectList.GetTypedData <ClassPointer>(); _holder = root0; ClassId = root0.ClassId; _holder = root0; _event = root0.GetCustomEventById(memberId); } else { //backward compatibility UInt32 classId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ClassID); //declaring class id UInt32 holderMemberId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ComponentID); //holding class member id ClassId = classId; MemberId = memberId; UInt32 holderClassId = XmlUtil.GetAttributeUInt(node.OwnerDocument.DocumentElement, XmlTags.XMLATT_ClassID); ClassPointer root = reader.ObjectList.Project.GetTypedData <ClassPointer>(holderClassId); if (holderClassId == classId) //holder is in the same class { _event = root.GetCustomEventById(memberId); if (holderMemberId == 0 || holderMemberId == reader.ObjectList.MemberId) //not an instance { _holder = ClassPointer.CreateClassPointer(reader.ObjectList); } else { _holder = (IClass)reader.ObjectList.GetClassRefById(holderMemberId); } } else //holder and declarer are different classes { ClassPointer baseClass = root.GetBaseClass(classId); if (baseClass != null) { EventClass eb = baseClass.GetCustomEventById(memberId); if (eb == null) { throw new DesignerException("Error reading custom event pointer: invalid event Id [{0},{1}] in class [{2}]", classId, memberId, holderClassId); } _event = eb.CreateInherited(root); } else { ClassPointer declarer = ClassPointer.CreateClassPointer(classId, reader.ObjectList.Project); _event = declarer.GetCustomEventById(memberId); } //holder an instance? object v = reader.ObjectList.GetObjectByID(holderMemberId); if (v != null) { _holder = reader.ObjectList.GetClassRefByObject(v) as IClass; } if (_holder == null) { //holder is a local variable //ClassPointer root = reader.ObjectList.GetTypedData<ClassPointer>(); LocalVariable lv = root.GetLocalVariable(holderMemberId); _holder = lv; } } } } } if (_event == null) { throw new DesignerException("Error reading custom event pointer: [{0}]", node.InnerXml); } if (_holder == null) { throw new DesignerException("Invalid custom event pointer. Holder not found. [{0}]", node.InnerXml); } }