internal void SetObjectData(SerializationInfo info, StreamingContext context)
        {
            InternalST.Soap(this, "SetObjectData ");
            ArrayList paramValuesList = new ArrayList(20);

            methodName          = (string)info.GetString("__methodName");
            keyToNamespaceTable = (Hashtable)info.GetValue("__keyToNamespaceTable", typeof(Hashtable));
            ArrayList paramNamesList = (ArrayList)info.GetValue("__paramNameList", typeof(ArrayList));

            xmlNameSpace = (String)info.GetString("__xmlNameSpace");

            for (int i = 0; i < paramNamesList.Count; i++)
            {
                paramValuesList.Add(info.GetValue((string)paramNamesList[i], Converter.typeofObject));
            }

            paramNames  = new String[paramNamesList.Count];
            paramValues = new Object[paramValuesList.Count];

            for (int i = 0; i < paramNamesList.Count; i++)
            {
                paramNames[i]  = (String)paramNamesList[i];
                paramValues[i] = (Object)paramValuesList[i];
                InternalST.Soap(this, "SetObjectData param ", i, " ", paramNames[i], " paramValue ", paramValues[i]);
            }
        }
Exemple #2
0
        internal virtual void Fixup(ParseRecord record, ParseRecord parent)
        {
            Object obj = record.PRnewObj;

            InternalST.Soap(this, "Fixup ", obj, " ", ((Enum)valueFixupEnum).ToString());

            switch (valueFixupEnum)
            {
            case ValueFixupEnum.Array:
                arrayObj.SetValue(obj, indexMap);
                break;

            case ValueFixupEnum.Member:

                InternalST.Soap(this, "Fixup Member new object value ", obj, " memberObject ", memberObject);

                if (objectInfo.isSi)
                {
                    InternalST.Soap(this, "Recording a fixup on member: ", memberName,
                                    " in object id", parent.PRobjectId, " Required Object ", record.PRobjectId);
                    objectInfo.objectManager.RecordDelayedFixup(parent.PRobjectId, memberName, record.PRobjectId);
                }
                else
                {
                    MemberInfo memberInfo = objectInfo.GetMemberInfo(memberName);
                    InternalST.Soap(this, "Recording a fixup on member:", memberInfo, " in object id ",
                                    parent.PRobjectId, " Required Object", record.PRobjectId);
                    objectInfo.objectManager.RecordFixup(parent.PRobjectId, memberInfo, record.PRobjectId);
                }
                break;
            }
        }
Exemple #3
0
        private void InitMemberInfo()
        {
            InternalST.Soap(this, objectInfoId, " ", objectType, " InitMemberInfo Entry");

            cache = (SerObjectInfoCache)serObjectInfoInit.seenBeforeTable[objectType];
            if (cache == null)
            {
                InternalST.Soap(this, objectInfoId, " ", objectType, " InitMemberInfo new cache");
                cache                      = new SerObjectInfoCache();
                cache.memberInfos          = FormatterServices.GetSerializableMembers(objectType, context);
                count                      = cache.memberInfos.Length;
                cache.memberNames          = new String[count];
                cache.memberTypes          = new Type[count];
                cache.memberAttributeInfos = new SoapAttributeInfo[count];

                // Calculate new arrays
                for (int i = 0; i < count; i++)
                {
                    cache.memberNames[i]          = cache.memberInfos[i].Name;
                    cache.memberTypes[i]          = GetMemberType(cache.memberInfos[i]);
                    cache.memberAttributeInfos[i] = Attr.GetMemberAttributeInfo(cache.memberInfos[i], cache.memberNames[i], cache.memberTypes[i]);
                    InternalST.Soap(this, objectInfoId, " InitMemberInfo name ", cache.memberNames[i], ", type ", cache.memberTypes[i], ", memberInfoType ", cache.memberInfos[i].GetType());
                }
                cache.fullTypeName   = objectType.FullName;
                cache.assemblyString = objectType.Module.Assembly.FullName;
                serObjectInfoInit.seenBeforeTable.Add(objectType, cache);
            }
            memberData  = new Object[cache.memberNames.Length];
            memberNames = new String[cache.memberNames.Length];

            isTyped = true;
            isNamed = true;
            InternalST.Soap(this, objectInfoId, " ", objectType, " InitMemberInfo Exit");
        }
Exemple #4
0
 private void DumpPopulate(MemberInfo[] memberInfos, Object[] memberData)
 {
     for (int i = 0; i < memberInfos.Length; i++)
     {
         InternalST.Soap(this, objectInfoId, " ", objectType, " PopulateObjectMembers ", memberInfos[i].Name, " ", memberData[i]);
     }
 }
 internal ValueFixup(Array arrayObj, int[] indexMap)
 {
     InternalST.Soap(this, "Array Constructor ", arrayObj);
     valueFixupEnum = ValueFixupEnum.Array;
     this.arrayObj  = arrayObj;
     this.indexMap  = indexMap;
 }
Exemple #6
0
        private int Position(String name)
        {
            InternalST.Soap(this, objectInfoId, " Position ", lastPosition, " ", name);
            if (cache.memberNames[lastPosition].Equals(name))
            {
                return(lastPosition);
            }
            else if ((++lastPosition < cache.memberNames.Length) && (cache.memberNames[lastPosition].Equals(name)))
            {
                return(lastPosition);
            }
            else
            {
                // Search for name
                InternalST.Soap(this, objectInfoId, " Position miss search for name " + name);
                for (int i = 0; i < cache.memberNames.Length; i++)
                {
                    if (cache.memberNames[i].Equals(name))
                    {
                        lastPosition = i;
                        return(lastPosition);
                    }
                }

                throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_Position"), objectType + " " + name));
            }
        }
Exemple #7
0
 private void DumpMemberInfo()
 {
     for (int i = 0; i < cache.memberInfos.Length; i++)
     {
         InternalST.Soap(this, objectInfoId, " Constructor 1 memberInfos data ", cache.memberInfos[i].Name, " ", memberData[i]);
     }
 }
Exemple #8
0
        private void InternalInit()
        {
            InternalST.Soap(this, objectInfoId, " objectType ", objectType, " InternalInit");
            obj               = null;
            objectType        = null;
            count             = 0;
            isSi              = false;
            isNamed           = false;
            isTyped           = false;
            si                = null;
            wireMemberNames   = null;
            wireMemberTypes   = null;
            cache             = null;
            lastPosition      = 0;
            numberMembersSeen = 0;

            bfake               = false;
            bSoapFault          = false;
            majorVersion        = 0;
            minorVersion        = 0;
            typeAttributeInfo   = null;
            arrayElemObjectInfo = null;



            // Si Read
            if (memberTypesList != null)
            {
                memberTypesList.Clear();
            }
        }
 internal void Dump(String value)
 {
     InternalST.Soap("Dump NameInfo ", NIid, " ", value);
     Util.NVTrace("nameSpaceEnum", ((Enum)NInameSpaceEnum).ToString());
     Util.NVTrace("name", NIname);
     Util.NVTrace("objectId", NIobjectId);
     Util.NVTrace("assemId", NIassemId);
     Util.NVTrace("primitiveTypeEnum", ((Enum)NIprimitiveTypeEnum).ToString());
     Util.NVTrace("type", NItype);
     Util.NVTrace("isSealed", NIisSealed);
     Util.NVTrace("transmitTypeOnObject", NItransmitTypeOnObject);
     Util.NVTrace("transmitTypeOnMember", NItransmitTypeOnMember);
     Util.NVTrace("isParentTypeOnObject", NIisParentTypeOnObject);
     Util.NVTrace("isMustUnderstand", NIisMustUnderstand);
     Util.NVTrace("namespace", NInamespace);
     Util.NVTrace("headerPrefix", NIheaderPrefix);
     Util.NVTrace("itemName", NIitemName);
     Util.NVTrace("isArray", NIisArray);
     Util.NVTrace("isArrayItem", NIisArrayItem);
     Util.NVTrace("isTopLevelObject", NIisTopLevelObject);
     Util.NVTrace("isNestedObject", NIisNestedObject);
     Util.NVTrace("isHeader", NIisHeader);
     Util.NVTrace("isRemoteRecord", NIisRemoteRecord);
     if (NIattributeInfo != null)
     {
         NIattributeInfo.Dump(NIname);
     }
 }
Exemple #10
0
        private void InitSiRead(String assemblyName)
        {
            InternalST.Soap(this, objectInfoId, " ", objectType, " InitMemberInfo new cache");
            if (assemblyName != null)
            {
                // Need to set to assembly name from the wire. This assembly name could contain version information
                // not in the default assembly name which was returned from fusion
                si.AssemblyName = assemblyName;
            }
            cache = new SerObjectInfoCache();
            cache.fullTypeName   = si.FullTypeName;
            cache.assemblyString = si.AssemblyName;

            // Input from IFieldInfo
            cache.memberNames = wireMemberNames;
            cache.memberTypes = wireMemberTypes;

            if (memberTypesList != null)
            {
                memberTypesList = new ArrayList(20);
            }


            if (wireMemberNames != null && wireMemberTypes != null)
            {
                isTyped = true;
            }
        }
        internal void Dump()
        {
            InternalST.Soap("ParseRecord Dump ", PRparseRecordId);
            InternalST.Soap("Enums");
            Util.NVTrace("ParseType", ((Enum)PRparseTypeEnum).ToString());
            Util.NVTrace("ObjectType", ((Enum)PRobjectTypeEnum).ToString());
            Util.NVTrace("ArrayType", ((Enum)PRarrayTypeEnum).ToString());
            Util.NVTrace("MemberType", ((Enum)PRmemberTypeEnum).ToString());
            Util.NVTrace("MemberValue", ((Enum)PRmemberValueEnum).ToString());
            Util.NVTrace("ObjectPosition", ((Enum)PRobjectPositionEnum).ToString());
            Util.NVTrace("ParseState", ((Enum)PRparseStateEnum).ToString());
            InternalST.Soap("Basics");
            Util.NVTrace("Name", PRname);
            Util.NVTrace("PRisParsed", PRisParsed);
            Util.NVTrace("PRisProcessAttributes", PRisParsed);
            Util.NVTrace("PRnameXmlKey", PRnameXmlKey);
            Util.NVTrace("PRxmlNameSpace", PRxmlNameSpace);
            Util.NVTrace("Value ", PRvalue);
            Util.NVTrace("varValue ", PRvarValue);
            if (PRvarValue != null)
            {
                Util.NVTrace("varValue type", PRvarValue.GetType());
            }

            Util.NVTrace("keyDt", PRkeyDt);
            Util.NVTrace("dtType", PRdtType);
            Util.NVTrace("assemblyName", PRassemblyName);
            Util.NVTrace("code", ((Enum)PRdtTypeCode).ToString());
            Util.NVTrace("objectID", PRobjectId);
            Util.NVTrace("idRef", PRidRef);
            Util.NVTrace("isEnum", PRisEnum);
            InternalST.Soap("Array ");
            Util.NVTrace("arrayElementTypeString", PRarrayElementTypeString);
            Util.NVTrace("arrayElementType", PRarrayElementType);
            Util.NVTrace("arrayElementTypeCode", ((Enum)PRarrayElementTypeCode).ToString());
            Util.NVTrace("isArrayVariant", PRisArrayVariant);
            Util.NVTrace("primitiveArrayTypeString", PRprimitiveArrayTypeString);
            Util.NVTrace("rank", PRrank);
            Util.NVTrace("dimensions", Util.PArray(PRlengthA));
            Util.NVTrace("position", Util.PArray(PRpositionA));
            Util.NVTrace("lowerBoundA", Util.PArray(PRlowerBoundA));
            Util.NVTrace("upperBoundA", Util.PArray(PRupperBoundA));
            InternalST.Soap("Header ");
            Util.NVTrace("isMustUnderstand", PRisMustUnderstand);
            Util.NVTrace("isHeaderRoot", PRisHeaderRoot);
            Util.NVTrace("isAttributesProcessed", PRisAttributesProcessed);
            Util.NVTrace("isXmlAttribute", PRisXmlAttribute);

            InternalST.Soap("New Object");
            if (PRnewObj != null)
            {
                Util.NVTrace("newObj", PRnewObj);
            }

            /*
             * if ((objectInfo != null) && (objectInfo.objectType != null))
             * Util.NVTrace("objectInfo", objectInfo.objectType.ToString());
             */
        }
 internal ValueFixup(Object memberObject, String memberName, ReadObjectInfo objectInfo)
 {
     InternalST.Soap(this, "Member Constructor ", memberObject);
     valueFixupEnum    = ValueFixupEnum.Member;
     this.memberObject = memberObject;
     this.memberName   = memberName;
     this.objectInfo   = objectInfo;
 }
 internal void Dump()
 {
     for (int i = 0; i < Count(); i++)
     {
         Object obj = objects[i];
         InternalST.Soap(this, "Stack Dump ", stackId, " " + ((obj is ITrace)?((ITrace)obj).Trace():""));
     }
 }
 // Push the object onto the stack
 internal void Push(Object obj)
 {
     InternalST.Soap(this, "Push ", stackId, " ", ((obj is ITrace)?((ITrace)obj).Trace():""));
     if (top == (objects.Length - 1))
     {
         IncreaseCapacity();
     }
     objects[++top] = obj;
 }
 internal static void NVTrace(String name, Object value)
 {
     try {
         InternalST.Soap("  " + name + ((value == null)?" = null":" = " + value.ToString()));
     }catch (Exception)
     {
         InternalST.Soap("  " + name + " = null"); //Empty StringBuilder is giving an exception
     }
 }
 // Gets the second entry in the stack.
 internal Object PeekPeek()
 {
     if (top < 1)
     {
         return(null);
     }
     InternalST.Soap(this, "PeekPeek ", stackId, " ", ((objects[top - 1] is ITrace)?((ITrace)objects[top - 1]).Trace():""));
     return(objects[top - 1]);
 }
 // Write Constructor
 internal InternalSoapMessage(String methodName, String xmlNameSpace, String[] paramNames, Object[] paramValues, Type[] paramTypes)
 {
     InternalST.Soap(this, "Constructor Write ", methodName);
     this.methodName   = methodName;
     this.xmlNameSpace = xmlNameSpace;
     this.paramNames   = paramNames;
     this.paramValues  = paramValues;
     this.paramTypes   = paramTypes;
 }
Exemple #18
0
        private void DumpPopulateSi()
        {
            InternalST.Soap(this, objectInfoId, " ", objectType, " PopulateObjectMembers SetObjectData, ISerializable obj ");
            SerializationInfoEnumerator siEnum = si.GetEnumerator();

            for (int i = 0; siEnum.MoveNext(); i++)
            {
                InternalST.Soap(this, objectInfoId, " ", objectType, " Populate Si ", siEnum.Name, " ", siEnum.Value);
            }
        }
        internal static void DumpHash(String tag, Hashtable hashTable)
        {
            IDictionaryEnumerator e = hashTable.GetEnumerator();

            InternalST.Soap("HashTable Dump Begin ", tag);
            while (e.MoveNext())
            {
                InternalST.Soap("HashTable key " + e.Key + ", value " + e.Value);
            }
            InternalST.Soap("HashTable Dump end \n");
        }
        // Looks up the resource string value for key.
        //
        internal static String GetResourceString(String key)
        {
            if (SystemResMgr == null)
            {
                InitResourceManager();
            }
            String s = SystemResMgr.GetString(key, null);

            InternalST.SoapAssert(s != null, "Managed resource string lookup failed.  Was your resource name misspelled?  Did you rebuild the SoapFormatter and SoapFormatter.resource after adding a resource to SoapFormatter.txt?  Debug this w/ cordbg and bug whoever owns the code that called SoapUtil.GetResourceString.  Resource name was: \"" + key + "\"");
            return(s);
        }
Exemple #21
0
        // Write Constructor used for array types or null members
        internal void InitSerialize(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, SoapAttributeInfo attributeInfo)
        {
            InternalST.Soap(this, objectInfoId, " Constructor 2 ", objectType);

            this.objectType                = objectType;
            this.context                   = context;
            this.serObjectInfoInit         = serObjectInfoInit;
            this.parentMemberAttributeInfo = attributeInfo;
            this.surrogateSelector         = surrogateSelector;
            this.converter                 = converter;

            if (objectType.IsArray)
            {
                arrayElemObjectInfo = Serialize(objectType.GetElementType(), surrogateSelector, context, serObjectInfoInit, converter, null);
                typeAttributeInfo   = GetTypeAttributeInfo();
                InitNoMembers();
                return;
            }

            typeAttributeInfo = GetTypeAttributeInfo();

            ISurrogateSelector surrogateSelectorTemp = null;

            if (surrogateSelector != null)
            {
                serializationSurrogate = surrogateSelector.GetSurrogate(objectType, context, out surrogateSelectorTemp);
            }

            if (serializationSurrogate != null)
            {
                isSi = true;
            }
            else if (objectType == Converter.typeofObject)
            {
            }
            else if (Converter.typeofISerializable.IsAssignableFrom(objectType))
            {
                isSi = true;
            }

            if (isSi)
            {
                si    = new SerializationInfo(objectType, converter);
                cache = new SerObjectInfoCache();
                cache.fullTypeName   = si.FullTypeName;
                cache.assemblyString = si.AssemblyName;
            }
            else
            {
                InitMemberInfo();
            }

            InternalST.Soap(this, objectInfoId, " ", objectType, " InitSerialize Exit ", isSi);
        }
        internal static String GetResourceString(String key, params Object[] values)
        {
            if (SystemResMgr == null)
            {
                InitResourceManager();
            }
            String s = SystemResMgr.GetString(key, null);

            InternalST.SoapAssert(s != null, "Managed resource string lookup failed.  Was your resource name misspelled?  Did you rebuild mscorlib after adding a resource to resources.txt?  Debug this w/ cordbg and bug whoever owns the code that called Environment.GetResourceString.  Resource name was: \"" + key + "\"");
            return(String.Format(s, values));
        }
Exemple #23
0
        // Fills in the values for an object
        internal void PopulateObjectMembers()
        {
            InternalST.Soap(this, objectInfoId, " ", objectType, " PopulateObjectMembers  isSi ", isSi);
            if (!isSi)
            {
                MemberInfo[] finalMemberInfos = null;
                Object[]     finalMemberData  = null;
                int          finalMemberIndex = 0;

                if (numberMembersSeen < memberNames.Length)
                {
                    finalMemberInfos = new MemberInfo[numberMembersSeen];
                    finalMemberData  = new Object[numberMembersSeen];

                    for (int iMember = 0; iMember < memberNames.Length; ++iMember)
                    {
                        if (memberNames[iMember] == null)
                        {
                            // A field on the type isnt found. See if the field has OptionallySerializable and the type has the deserialization constructor
                            Object [] attrs = cache.memberInfos[iMember].GetCustomAttributes(typeof(OptionalFieldAttribute), false);
                            if ((attrs == null || attrs.Length == 0) && (majorVersion >= 1 && minorVersion >= 0))
                            {
                                // the member isnt optionally serializable
                                throw new SerializationException(SoapUtil.GetResourceString("Serialization_WrongNumberOfMembers",
                                                                                            objectType, cache.memberInfos.Length, numberMembersSeen));
                            }
                        }
                        else
                        {
                            if (memberNames[iMember] != cache.memberInfos[iMember].Name)
                            {
                                throw new SerializationException(SoapUtil.GetResourceString("Serialization_WrongNumberOfMembers",
                                                                                            objectType, cache.memberInfos.Length, numberMembersSeen));
                            }

                            finalMemberInfos[finalMemberIndex] = cache.memberInfos[iMember];
                            finalMemberData[finalMemberIndex]  = memberData[iMember];
                            finalMemberIndex++;
                        }
                    }
                }
                else
                {
                    finalMemberInfos = cache.memberInfos;
                    finalMemberData  = memberData;
                }


                DumpPopulate(finalMemberInfos, finalMemberData);

                FormatterServices.PopulateObjectMembers(obj, finalMemberInfos, finalMemberData);
                numberMembersSeen = 0;
            }
        }
Exemple #24
0
        // Read Constructor
        internal void Init(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName)
        {
            InternalST.Soap(this, objectInfoId, " Constructor 3 ", objectType);

            this.objectType         = objectType;
            this.objectManager      = objectManager;
            this.context            = context;
            this.serObjectInfoInit  = serObjectInfoInit;
            this.formatterConverter = converter;

            InitReadConstructor(objectType, surrogateSelector, context, assemblyName);
        }
Exemple #25
0
 private void InitNoMembers()
 {
     cache = (SerObjectInfoCache)serObjectInfoInit.seenBeforeTable[objectType];
     if (cache == null)
     {
         InternalST.Soap(this, objectInfoId, " ", objectType, " InitMemberInfo new cache");
         cache = new SerObjectInfoCache();
         cache.fullTypeName   = objectType.FullName;
         cache.assemblyString = objectType.Module.Assembly.FullName;
         serObjectInfoInit.seenBeforeTable.Add(objectType, cache);
     }
 }
Exemple #26
0
 // Records an objectId in a member when the actual object for that member is not yet known
 internal void RecordFixup(long objectId, String name, long idRef)
 {
     if (isSi)
     {
         InternalST.Soap(this, objectInfoId, " ", objectType, " RecordFixup  RecordDelayedFixup objectId ", objectId, " name ", name, " idRef ", idRef, " isSi ", isSi);
         objectManager.RecordDelayedFixup(objectId, name, idRef);
     }
     else
     {
         InternalST.Soap(this, objectInfoId, " ", objectType, " RecordFixup  objectId ", objectId, " name ", name, " idRef ", idRef, " isSi ", isSi);
         objectManager.RecordFixup(objectId, cache.memberInfos[Position(name)], idRef);
     }
 }
        // Pop the object from the stack
        internal Object Pop()
        {
            if (top < 0)
            {
                return(null);
            }

            Object obj = objects[top];

            objects[top--] = null;
            InternalST.Soap(this, "Pop ", stackId, " ", ((obj is ITrace)?((ITrace)obj).Trace():""));
            return(obj);
        }
Exemple #28
0
 // Get the memberInfo for a memberName
 internal MemberInfo GetMemberInfo(String name)
 {
     InternalST.Soap(this, objectInfoId, " ", objectType, " GetMemberInfo Entry ", name);
     if (isSi)
     {
         throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_MemberInfo"), objectType + " " + name));
     }
     if (cache.memberInfos == null)
     {
         throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_NoMemberInfo"), objectType + " " + name));
     }
     return(cache.memberInfos[Position(name)]);
 }
Exemple #29
0
        internal Type GetType(int position)
        {
            InternalST.Soap(this, objectInfoId, " ", objectType, " GetType Entry ByPosition ", position);
            Type type = null;

            if (isTyped)
            {
                if (position >= cache.memberTypes.Length)
                {
                    throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_ISerializableTypes"), objectType + " " + position));
                }
                type = cache.memberTypes[position];

                InternalST.Soap(this, objectInfoId, " ", objectType, " GetType Exit ByPosition ", type);
            }
            return(type);
        }
        internal virtual void Fixup(ParseRecord record, ParseRecord parent)
        {
            Object obj = record.PRnewObj;

            InternalST.Soap(this, "Fixup ", obj, " ", ((Enum)valueFixupEnum).ToString());

            switch (valueFixupEnum)
            {
            case ValueFixupEnum.Array:
                arrayObj.SetValue(obj, indexMap);
                break;

            case ValueFixupEnum.Header:
                Type type = typeof(Header);
                if (valueInfo == null)
                {
                    MemberInfo[] valueInfos = type.GetMember("Value");
                    if (valueInfos.Length != 1)
                    {
                        throw new SerializationException(String.Format(SoapUtil.GetResourceString("Serialization_HeaderReflection"), valueInfos.Length));
                    }
                    valueInfo = valueInfos[0];
                }
                InternalST.SerializationSetValue((FieldInfo)valueInfo, header, obj);
                break;

            case ValueFixupEnum.Member:

                InternalST.Soap(this, "Fixup Member new object value ", obj, " memberObject ", memberObject);

                if (objectInfo.isSi)
                {
                    InternalST.Soap(this, "Recording a fixup on member: ", memberName,
                                    " in object id", parent.PRobjectId, " Required Object ", record.PRobjectId);
                    objectInfo.objectManager.RecordDelayedFixup(parent.PRobjectId, memberName, record.PRobjectId);
                }
                else
                {
                    MemberInfo memberInfo = objectInfo.GetMemberInfo(memberName);
                    InternalST.Soap(this, "Recording a fixup on member:", memberInfo, " in object id ",
                                    parent.PRobjectId, " Required Object", record.PRobjectId);
                    objectInfo.objectManager.RecordFixup(parent.PRobjectId, memberInfo, record.PRobjectId);
                }
                break;
            }
        }