Beispiel #1
0
 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);
            }
        }