Copy() private method

private Copy ( ) : ParseRecord
return ParseRecord
 private void ParseMember(ParseRecord pr)
 {
     ParseRecord parentPr = (ParseRecord) this.stack.Peek();
     if (parentPr != null)
     {
         string pRname = parentPr.PRname;
     }
     if ((parentPr.PRdtType == Converter.typeofSoapFault) && (pr.PRname.ToLower(CultureInfo.InvariantCulture) == "faultstring"))
     {
         this.faultString = pr.PRvalue;
     }
     if ((parentPr.PRobjectPositionEnum == InternalObjectPositionE.Top) && !this.isTopObjectResolved)
     {
         if (pr.PRdtType == Converter.typeofString)
         {
             this.ParseString(pr, parentPr);
         }
         this.topStack.Push(pr.Copy());
     }
     else
     {
         switch (pr.PRmemberTypeEnum)
         {
             case InternalMemberTypeE.Item:
                 this.ParseArrayMember(pr);
                 return;
         }
         if (parentPr.PRobjectInfo != null)
         {
             parentPr.PRobjectInfo.AddMemberSeen();
         }
         bool flag = ((this.IsFakeTopObject && (parentPr.PRobjectPositionEnum == InternalObjectPositionE.Top)) && (parentPr.PRobjectInfo != null)) && (parentPr.PRdtType != Converter.typeofSoapFault);
         if ((pr.PRdtType == null) && parentPr.PRobjectInfo.isTyped)
         {
             if (flag)
             {
                 pr.PRdtType = parentPr.PRobjectInfo.GetType(this.paramPosition++);
             }
             else
             {
                 pr.PRdtType = parentPr.PRobjectInfo.GetType(pr.PRname);
             }
             if (pr.PRdtType == null)
             {
                 throw new SerializationException(string.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_TypeResolved"), new object[] { parentPr.PRnewObj + " " + pr.PRname }));
             }
             pr.PRdtTypeCode = Converter.ToCode(pr.PRdtType);
         }
         else if (flag)
         {
             this.paramPosition++;
         }
         if (pr.PRmemberValueEnum == InternalMemberValueE.Null)
         {
             parentPr.PRobjectInfo.AddValue(pr.PRname, null);
         }
         else if (pr.PRmemberValueEnum == InternalMemberValueE.Nested)
         {
             this.ParseObject(pr);
             this.stack.Push(pr);
             if ((pr.PRobjectInfo != null) && pr.PRobjectInfo.objectType.IsValueType)
             {
                 if (this.IsFakeTopObject)
                 {
                     parentPr.PRobjectInfo.AddParamName(pr.PRname);
                 }
                 pr.PRisValueTypeFixup = true;
                 this.valueFixupStack.Push(new ValueFixup(parentPr.PRnewObj, pr.PRname, parentPr.PRobjectInfo));
             }
             else
             {
                 parentPr.PRobjectInfo.AddValue(pr.PRname, pr.PRnewObj);
             }
         }
         else if (pr.PRmemberValueEnum == InternalMemberValueE.Reference)
         {
             object obj2 = this.m_objectManager.GetObject(pr.PRidRef);
             if (obj2 == null)
             {
                 parentPr.PRobjectInfo.AddValue(pr.PRname, null);
                 parentPr.PRobjectInfo.RecordFixup(parentPr.PRobjectId, pr.PRname, pr.PRidRef);
             }
             else
             {
                 parentPr.PRobjectInfo.AddValue(pr.PRname, obj2);
             }
         }
         else if (pr.PRmemberValueEnum == InternalMemberValueE.InlineValue)
         {
             if (pr.PRdtType == Converter.typeofString)
             {
                 this.ParseString(pr, parentPr);
                 parentPr.PRobjectInfo.AddValue(pr.PRname, pr.PRvalue);
             }
             else if (pr.PRdtTypeCode != InternalPrimitiveTypeE.Invalid)
             {
                 object pRvarValue = null;
                 if (pr.PRvarValue != null)
                 {
                     pRvarValue = pr.PRvarValue;
                 }
                 else
                 {
                     pRvarValue = Converter.FromString(pr.PRvalue, pr.PRdtTypeCode);
                 }
                 if ((pr.PRdtTypeCode == InternalPrimitiveTypeE.QName) && (pRvarValue != null))
                 {
                     SoapQName name = (SoapQName) pRvarValue;
                     if (name.Key != null)
                     {
                         if (name.Key.Length == 0)
                         {
                             name.Namespace = (string) this.soapHandler.keyToNamespaceTable["xmlns"];
                         }
                         else
                         {
                             name.Namespace = (string) this.soapHandler.keyToNamespaceTable["xmlns:" + name.Key];
                         }
                     }
                 }
                 parentPr.PRobjectInfo.AddValue(pr.PRname, pRvarValue);
             }
             else if (pr.PRarrayTypeEnum == InternalArrayTypeE.Base64)
             {
                 parentPr.PRobjectInfo.AddValue(pr.PRname, Convert.FromBase64String(this.FilterBin64(pr.PRvalue)));
             }
             else if ((pr.PRdtType != Converter.typeofObject) || (pr.PRvalue == null))
             {
                 if ((pr.PRdtType != null) && pr.PRdtType.IsEnum)
                 {
                     object obj3 = Enum.Parse(pr.PRdtType, pr.PRvalue);
                     parentPr.PRobjectInfo.AddValue(pr.PRname, obj3);
                 }
                 else if ((pr.PRdtType != null) && (pr.PRdtType == Converter.typeofTypeArray))
                 {
                     parentPr.PRobjectInfo.AddValue(pr.PRname, pr.PRvarValue);
                 }
                 else
                 {
                     if (!pr.PRisRegistered && (pr.PRobjectId > 0L))
                     {
                         if (pr.PRvalue == null)
                         {
                             pr.PRvalue = "";
                         }
                         this.RegisterObject(pr.PRvalue, pr, parentPr);
                     }
                     if (pr.PRdtType == Converter.typeofSystemVoid)
                     {
                         parentPr.PRobjectInfo.AddValue(pr.PRname, pr.PRdtType);
                     }
                     else if (parentPr.PRobjectInfo.isSi)
                     {
                         parentPr.PRobjectInfo.AddValue(pr.PRname, pr.PRvalue);
                     }
                 }
             }
             else if ((parentPr != null) && (parentPr.PRdtType == Converter.typeofHeader))
             {
                 pr.PRdtType = Converter.typeofString;
                 this.ParseString(pr, parentPr);
                 parentPr.PRobjectInfo.AddValue(pr.PRname, pr.PRvalue);
             }
         }
         else
         {
             this.ParseError(pr, parentPr);
         }
     }
 }
 private void ParseObject(ParseRecord pr)
 {
     if (pr.PRobjectPositionEnum == InternalObjectPositionE.Top)
     {
         this.topId = pr.PRobjectId;
     }
     if (pr.PRparseTypeEnum == InternalParseTypeE.Object)
     {
         this.stack.Push(pr);
     }
     if (pr.PRobjectTypeEnum == InternalObjectTypeE.Array)
     {
         this.ParseArray(pr);
     }
     else
     {
         if ((pr.PRdtType == null) && !this.IsFakeTopObject)
         {
             throw new SerializationException(string.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_TopObjectInstantiate"), new object[] { pr.PRname }));
         }
         if (((pr.PRobjectPositionEnum == InternalObjectPositionE.Top) && this.IsFakeTopObject) && (pr.PRdtType != Converter.typeofSoapFault))
         {
             if (this.handler == null)
             {
                 if (this.formatterEnums.FEtopObject != null)
                 {
                     if (!this.isTopObjectSecondPass)
                     {
                         this.isTopObjectResolved = false;
                         this.topStack = new SerStack("Top ParseRecords");
                         this.topStack.Push(pr.Copy());
                         return;
                     }
                     pr.PRnewObj = new InternalSoapMessage();
                     pr.PRdtType = typeof(InternalSoapMessage);
                     this.CheckSecurity(pr);
                     if (this.formatterEnums.FEtopObject != null)
                     {
                         ISoapMessage fEtopObject = this.formatterEnums.FEtopObject;
                         pr.PRobjectInfo = this.CreateReadObjectInfo(pr.PRdtType, fEtopObject.ParamNames, fEtopObject.ParamTypes, pr.PRassemblyName);
                     }
                 }
             }
             else
             {
                 if (!this.isHeaderHandlerCalled)
                 {
                     this.newheaders = null;
                     this.isHeaderHandlerCalled = true;
                     if (this.headers == null)
                     {
                         this.newheaders = new Header[1];
                     }
                     else
                     {
                         this.newheaders = new Header[this.headers.Length + 1];
                         Array.Copy(this.headers, 0, this.newheaders, 1, this.headers.Length);
                     }
                     Header header = new Header("__methodName", pr.PRname, false, pr.PRnameXmlKey);
                     this.newheaders[0] = header;
                     this.handlerObject = this.handler(this.newheaders);
                 }
                 if (!this.isHeaderHandlerCalled)
                 {
                     this.isTopObjectResolved = false;
                     this.topStack = new SerStack("Top ParseRecords");
                     this.topStack.Push(pr.Copy());
                     return;
                 }
                 pr.PRnewObj = this.handlerObject;
                 pr.PRdtType = this.handlerObject.GetType();
                 this.CheckSecurity(pr);
                 if (pr.PRnewObj is IFieldInfo)
                 {
                     IFieldInfo pRnewObj = (IFieldInfo) pr.PRnewObj;
                     if ((pRnewObj.FieldTypes != null) && (pRnewObj.FieldTypes.Length > 0))
                     {
                         pr.PRobjectInfo = this.CreateReadObjectInfo(pr.PRdtType, pRnewObj.FieldNames, pRnewObj.FieldTypes, pr.PRassemblyName);
                     }
                 }
             }
         }
         else
         {
             if (pr.PRdtType == Converter.typeofString)
             {
                 if (pr.PRvalue != null)
                 {
                     pr.PRnewObj = pr.PRvalue;
                     if (pr.PRobjectPositionEnum == InternalObjectPositionE.Top)
                     {
                         this.isTopObjectResolved = true;
                         this.topObject = pr.PRnewObj;
                         return;
                     }
                     this.stack.Pop();
                     this.RegisterObject(pr.PRnewObj, pr, (ParseRecord) this.stack.Peek());
                 }
                 return;
             }
             if (pr.PRdtType == null)
             {
                 ParseRecord record = (ParseRecord) this.stack.Peek();
                 if (record.PRdtType == Converter.typeofSoapFault)
                 {
                     throw new ServerException(string.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_SoapFault"), new object[] { this.faultString }));
                 }
                 throw new SerializationException(string.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_TypeElement"), new object[] { pr.PRname }));
             }
             this.CheckSerializable(pr.PRdtType);
             if (this.IsRemoting && (this.formatterEnums.FEsecurityLevel != TypeFilterLevel.Full))
             {
                 pr.PRnewObj = FormatterServices.GetSafeUninitializedObject(pr.PRdtType);
             }
             else
             {
                 pr.PRnewObj = FormatterServices.GetUninitializedObject(pr.PRdtType);
             }
             this.CheckSecurity(pr);
             this.m_objectManager.RaiseOnDeserializingEvent(pr.PRnewObj);
         }
         if (pr.PRnewObj == null)
         {
             throw new SerializationException(string.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_TopObjectInstantiate"), new object[] { pr.PRdtType }));
         }
         if (pr.PRobjectId < 1L)
         {
             pr.PRobjectId = this.GetId("GenId-" + this.objectIds);
         }
         if (this.IsFakeTopObject && (pr.PRobjectPositionEnum == InternalObjectPositionE.Top))
         {
             this.isTopObjectResolved = true;
             this.topObject = pr.PRnewObj;
         }
         if (pr.PRobjectInfo == null)
         {
             pr.PRobjectInfo = this.CreateReadObjectInfo(pr.PRdtType, pr.PRassemblyName);
         }
         pr.PRobjectInfo.obj = pr.PRnewObj;
         if (this.IsFakeTopObject && (pr.PRobjectPositionEnum == InternalObjectPositionE.Top))
         {
             pr.PRobjectInfo.AddValue("__methodName", pr.PRname);
             pr.PRobjectInfo.AddValue("__keyToNamespaceTable", this.soapHandler.keyToNamespaceTable);
             pr.PRobjectInfo.AddValue("__paramNameList", pr.PRobjectInfo.SetFakeObject());
             if (this.formatterEnums.FEtopObject != null)
             {
                 pr.PRobjectInfo.AddValue("__xmlNameSpace", pr.PRxmlNameSpace);
             }
         }
     }
 }
 private void ParseObjectEnd(ParseRecord pr)
 {
     ParseRecord record = (ParseRecord) this.stack.Peek();
     if (record == null)
     {
         record = pr;
     }
     if (record.PRobjectPositionEnum == InternalObjectPositionE.Top)
     {
         if (record.PRdtType == Converter.typeofString)
         {
             if (record.PRvalue == null)
             {
                 record.PRvalue = string.Empty;
             }
             record.PRnewObj = record.PRvalue;
             this.CheckSecurity(record);
             this.isTopObjectResolved = true;
             this.topObject = record.PRnewObj;
             return;
         }
         if ((((record.PRdtType != null) && (record.PRvalue != null)) && !this.IsWhiteSpace(record.PRvalue)) && (record.PRdtType.IsPrimitive || (record.PRdtType == Converter.typeofTimeSpan)))
         {
             record.PRnewObj = Converter.FromString(record.PRvalue, Converter.ToCode(record.PRdtType));
             this.CheckSecurity(record);
             this.isTopObjectResolved = true;
             this.topObject = record.PRnewObj;
             return;
         }
         if (!this.isTopObjectResolved && (record.PRdtType != Converter.typeofSoapFault))
         {
             this.topStack.Push(pr.Copy());
             if (record.PRparseRecordId == pr.PRparseRecordId)
             {
                 this.stack.Pop();
             }
             return;
         }
     }
     this.stack.Pop();
     ParseRecord objectPr = (ParseRecord) this.stack.Peek();
     if (record.PRobjectTypeEnum == InternalObjectTypeE.Array)
     {
         if (record.PRobjectPositionEnum == InternalObjectPositionE.Top)
         {
             this.isTopObjectResolved = true;
             this.topObject = record.PRnewObj;
         }
         this.RegisterObject(record.PRnewObj, record, objectPr);
     }
     else
     {
         if (record.PRobjectInfo != null)
         {
             record.PRobjectInfo.PopulateObjectMembers();
         }
         if (record.PRnewObj == null)
         {
             if (record.PRdtType != Converter.typeofString)
             {
                 throw new SerializationException(string.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_ObjectMissing"), new object[] { pr.PRname }));
             }
             if (record.PRvalue == null)
             {
                 record.PRvalue = string.Empty;
             }
             record.PRnewObj = record.PRvalue;
             this.CheckSecurity(record);
         }
         if (!record.PRisRegistered && (record.PRobjectId > 0L))
         {
             this.RegisterObject(record.PRnewObj, record, objectPr);
         }
         if (record.PRisValueTypeFixup)
         {
             ((ValueFixup) this.valueFixupStack.Pop()).Fixup(record, objectPr);
         }
         if (record.PRobjectPositionEnum == InternalObjectPositionE.Top)
         {
             this.isTopObjectResolved = true;
             this.topObject = record.PRnewObj;
         }
         if (record.PRnewObj is SoapFault)
         {
             this.soapFaultId = record.PRobjectId;
         }
         if (record.PRobjectInfo != null)
         {
             if (record.PRobjectInfo.bfake && !record.PRobjectInfo.bSoapFault)
             {
                 record.PRobjectInfo.AddValue("__fault", null);
             }
             record.PRobjectInfo.ObjectEnd();
         }
     }
 }
Beispiel #4
0
        private void ProcessHeaderMember(ParseRecord pr)
        {
            ParseRecord headerPr;

            InternalST.Soap( this,"ProcessHeaderMember HeaderState ",((Enum)headerState).ToString());
            pr.Dump(); 

            if (headerState == HeaderStateEnum.NestedObject)
            {
                // Nested object in Header member
                ParseRecord newPr = pr.Copy();
                headerList.Add(newPr);
                return;
            }

            // Item record
            headerPr = GetPr();
            headerPr.PRparseTypeEnum = InternalParseTypeE.Member;
            headerPr.PRmemberTypeEnum = InternalMemberTypeE.Item;
            headerPr.PRmemberValueEnum = InternalMemberValueE.Nested;
            headerPr.PRisHeaderRoot = true;
            headerArrayLength++;
            headerList.Add(headerPr);

            // Name field
            headerPr = GetPr();
            headerPr.PRparseTypeEnum = InternalParseTypeE.Member;
            headerPr.PRmemberTypeEnum = InternalMemberTypeE.Field;
            headerPr.PRmemberValueEnum = InternalMemberValueE.InlineValue;
            headerPr.PRisHeaderRoot = true;
            headerPr.PRname = "Name";
            headerPr.PRvalue = pr.PRname;
            headerPr.PRdtType = SoapUtil.typeofString;
            headerPr.PRdtTypeCode = InternalPrimitiveTypeE.Invalid;
            headerList.Add(headerPr);

            // Namespace field
            headerPr = GetPr();
            headerPr.PRparseTypeEnum = InternalParseTypeE.Member;
            headerPr.PRmemberTypeEnum = InternalMemberTypeE.Field;
            headerPr.PRmemberValueEnum = InternalMemberValueE.InlineValue;
            headerPr.PRisHeaderRoot = true;
            headerPr.PRname = "HeaderNamespace";
            headerPr.PRvalue = pr.PRxmlNameSpace;
            headerPr.PRdtType = SoapUtil.typeofString;
            headerPr.PRdtTypeCode = InternalPrimitiveTypeE.Invalid;
            headerList.Add(headerPr);

            // MustUnderstand Field
            headerPr = GetPr();
            headerPr.PRparseTypeEnum = InternalParseTypeE.Member;
            headerPr.PRmemberTypeEnum = InternalMemberTypeE.Field;
            headerPr.PRmemberValueEnum = InternalMemberValueE.InlineValue;
            headerPr.PRisHeaderRoot = true;         
            headerPr.PRname = "MustUnderstand";
            if (pr.PRisMustUnderstand)
                headerPr.PRvarValue = true;
            else
                headerPr.PRvarValue = false;            
            headerPr.PRdtType = SoapUtil.typeofBoolean;
            headerPr.PRdtTypeCode = InternalPrimitiveTypeE.Boolean;
            headerList.Add(headerPr);       

            // Value field
            headerPr = GetPr();
            headerPr.PRparseTypeEnum = InternalParseTypeE.Member;
            headerPr.PRmemberTypeEnum = InternalMemberTypeE.Field;
            headerPr.PRmemberValueEnum = pr.PRmemberValueEnum;
            headerPr.PRisHeaderRoot = true;         
            headerPr.PRname = "Value";
            switch (pr.PRmemberValueEnum)
            {
                case InternalMemberValueE.Null:
                    headerList.Add(headerPr);
                    ProcessHeaderMemberEnd(pr);
                    break;
                case InternalMemberValueE.Reference:
                    headerPr.PRidRef = pr.PRidRef;
                    headerList.Add(headerPr);
                    ProcessHeaderMemberEnd(pr);             
                    break;
                case InternalMemberValueE.Nested:
                    headerPr.PRdtType = pr.PRdtType;
                    headerPr.PRdtTypeCode = pr.PRdtTypeCode;
                    headerPr.PRkeyDt = pr.PRkeyDt;
                    headerList.Add(headerPr);
                    // ProcessHeaderMemberEnd will be called from the parse loop
                    break;

                case InternalMemberValueE.InlineValue:
                    headerPr.PRvalue = pr.PRvalue;
                    headerPr.PRvarValue = pr.PRvarValue;
                    headerPr.PRdtType = pr.PRdtType;
                    headerPr.PRdtTypeCode = pr.PRdtTypeCode;
                    headerPr.PRkeyDt = pr.PRkeyDt;
                    headerList.Add(headerPr);
                    ProcessHeaderMemberEnd(pr);             
                    break;
            }
        }
Beispiel #5
0
        private void ProcessHeaderMemberEnd(ParseRecord pr)
        {
            ParseRecord headerPr = null;

            InternalST.Soap( this,"ProcessHeaderMemberEnd HeaderState ",((Enum)headerState).ToString());
            pr.Dump(); 

            if (headerState == HeaderStateEnum.NestedObject)
            {
                ParseRecord newPr = pr.Copy();
                headerList.Add(newPr);
            }
            else
            {
                // Member End
                headerPr = GetPr();
                headerPr.PRparseTypeEnum = InternalParseTypeE.MemberEnd;
                headerPr.PRmemberTypeEnum = InternalMemberTypeE.Field;
                headerPr.PRmemberValueEnum = pr.PRmemberValueEnum;
                headerPr.PRisHeaderRoot = true;
                headerList.Add(headerPr);

                // Item End
                headerPr = GetPr();
                headerPr.PRparseTypeEnum = InternalParseTypeE.MemberEnd;
                headerPr.PRmemberTypeEnum = InternalMemberTypeE.Item;
                headerPr.PRmemberValueEnum = InternalMemberValueE.Nested;
                headerPr.PRisHeaderRoot = true;             
                headerList.Add(headerPr);
            }
        }
 private void ProcessHeaderMemberEnd(ParseRecord pr)
 {
     ParseRecord record = null;
     if (this.headerState == HeaderStateEnum.NestedObject)
     {
         ParseRecord record2 = pr.Copy();
         this.headerList.Add(record2);
     }
     else
     {
         record = this.GetPr();
         record.PRparseTypeEnum = InternalParseTypeE.MemberEnd;
         record.PRmemberTypeEnum = InternalMemberTypeE.Field;
         record.PRmemberValueEnum = pr.PRmemberValueEnum;
         record.PRisHeaderRoot = true;
         this.headerList.Add(record);
         record = this.GetPr();
         record.PRparseTypeEnum = InternalParseTypeE.MemberEnd;
         record.PRmemberTypeEnum = InternalMemberTypeE.Item;
         record.PRmemberValueEnum = InternalMemberValueE.Nested;
         record.PRisHeaderRoot = true;
         this.headerList.Add(record);
     }
 }
        private void ProcessHeaderMember(ParseRecord pr)
        {
            if (this.headerState == HeaderStateEnum.NestedObject)
            {
                ParseRecord record2 = pr.Copy();
                this.headerList.Add(record2);
            }
            else
            {
                ParseRecord record = this.GetPr();
                record.PRparseTypeEnum = InternalParseTypeE.Member;
                record.PRmemberTypeEnum = InternalMemberTypeE.Item;
                record.PRmemberValueEnum = InternalMemberValueE.Nested;
                record.PRisHeaderRoot = true;
                this.headerArrayLength++;
                this.headerList.Add(record);
                record = this.GetPr();
                record.PRparseTypeEnum = InternalParseTypeE.Member;
                record.PRmemberTypeEnum = InternalMemberTypeE.Field;
                record.PRmemberValueEnum = InternalMemberValueE.InlineValue;
                record.PRisHeaderRoot = true;
                record.PRname = "Name";
                record.PRvalue = pr.PRname;
                record.PRdtType = SoapUtil.typeofString;
                record.PRdtTypeCode = InternalPrimitiveTypeE.Invalid;
                this.headerList.Add(record);
                record = this.GetPr();
                record.PRparseTypeEnum = InternalParseTypeE.Member;
                record.PRmemberTypeEnum = InternalMemberTypeE.Field;
                record.PRmemberValueEnum = InternalMemberValueE.InlineValue;
                record.PRisHeaderRoot = true;
                record.PRname = "HeaderNamespace";
                record.PRvalue = pr.PRxmlNameSpace;
                record.PRdtType = SoapUtil.typeofString;
                record.PRdtTypeCode = InternalPrimitiveTypeE.Invalid;
                this.headerList.Add(record);
                record = this.GetPr();
                record.PRparseTypeEnum = InternalParseTypeE.Member;
                record.PRmemberTypeEnum = InternalMemberTypeE.Field;
                record.PRmemberValueEnum = InternalMemberValueE.InlineValue;
                record.PRisHeaderRoot = true;
                record.PRname = "MustUnderstand";
                if (pr.PRisMustUnderstand)
                {
                    record.PRvarValue = true;
                }
                else
                {
                    record.PRvarValue = false;
                }
                record.PRdtType = SoapUtil.typeofBoolean;
                record.PRdtTypeCode = InternalPrimitiveTypeE.Boolean;
                this.headerList.Add(record);
                record = this.GetPr();
                record.PRparseTypeEnum = InternalParseTypeE.Member;
                record.PRmemberTypeEnum = InternalMemberTypeE.Field;
                record.PRmemberValueEnum = pr.PRmemberValueEnum;
                record.PRisHeaderRoot = true;
                record.PRname = "Value";
                switch (pr.PRmemberValueEnum)
                {
                    case InternalMemberValueE.InlineValue:
                        record.PRvalue = pr.PRvalue;
                        record.PRvarValue = pr.PRvarValue;
                        record.PRdtType = pr.PRdtType;
                        record.PRdtTypeCode = pr.PRdtTypeCode;
                        record.PRkeyDt = pr.PRkeyDt;
                        this.headerList.Add(record);
                        this.ProcessHeaderMemberEnd(pr);
                        return;

                    case InternalMemberValueE.Nested:
                        record.PRdtType = pr.PRdtType;
                        record.PRdtTypeCode = pr.PRdtTypeCode;
                        record.PRkeyDt = pr.PRkeyDt;
                        this.headerList.Add(record);
                        return;

                    case InternalMemberValueE.Reference:
                        record.PRidRef = pr.PRidRef;
                        this.headerList.Add(record);
                        this.ProcessHeaderMemberEnd(pr);
                        return;

                    case InternalMemberValueE.Null:
                        this.headerList.Add(record);
                        this.ProcessHeaderMemberEnd(pr);
                        return;
                }
            }
        }
Beispiel #8
0
        // End of object encountered in stream
        
        private void ParseObjectEnd(ParseRecord pr)
        {
            InternalST.Soap( this, "ParseObjectEnd Entry ",pr.Trace());
            ParseRecord objectPr = (ParseRecord)stack.Peek();
            if (objectPr == null)
                objectPr = pr;


            //BCLDebug.Assert(objectPr != null, "[System.Runtime.Serialization.Formatters.ParseObjectEnd]objectPr != null");

            InternalST.Soap( this, "ParseObjectEnd objectPr ",objectPr.Trace());

            if (objectPr.PRobjectPositionEnum == InternalObjectPositionE.Top) 
            {
                InternalST.Soap( this, "ParseObjectEnd Top Object dtType ",objectPr.PRdtType);
                if (objectPr.PRdtType == Converter.typeofString)
                {
                    InternalST.Soap( this, "ParseObjectEnd Top String");
                    if (objectPr.PRvalue == null)
                        objectPr.PRvalue = String.Empty; // Not a null object, but an empty string

                    objectPr.PRnewObj = objectPr.PRvalue;
                    CheckSecurity(objectPr);
                    isTopObjectResolved = true;
                    topObject = objectPr.PRnewObj;
                    return;
                }
                else if (objectPr.PRdtType != null  && objectPr.PRvalue != null && !IsWhiteSpace(objectPr.PRvalue) && (objectPr.PRdtType.IsPrimitive || objectPr.PRdtType == Converter.typeofTimeSpan))
                {
                    // When an xsd type is transmitted as a top level string <xsd:int>111</xsd:int>
                    objectPr.PRnewObj = Converter.FromString(objectPr.PRvalue, Converter.ToCode(objectPr.PRdtType));
                    CheckSecurity(objectPr);
                    isTopObjectResolved = true;
                    topObject = objectPr.PRnewObj;
                    return;

                }
                else if ((!isTopObjectResolved) && (objectPr.PRdtType != Converter.typeofSoapFault))
                {
                    InternalST.Soap( this, "ParseObjectEnd Top but not String");                    
                    // Need to keep top record on object stack until finished building top stack
                    topStack.Push(pr.Copy());
                    // Note this is PRparseRecordId and not objectId
                    if (objectPr.PRparseRecordId == pr.PRparseRecordId)
                    {
                        // This handles the case of top stack containing nested objects and
                        // referenced objects. If nested objects the objects are not placed
                        // on stack, only topstack. If referenced objects they are placed on
                        // stack and need to be popped.
                        stack.Pop();
                    }
                    return;
                }
            }

            stack.Pop();

            ParseRecord parentPr = (ParseRecord)stack.Peek();

            if (objectPr.PRobjectTypeEnum == InternalObjectTypeE.Array)
            {
                if (objectPr.PRobjectPositionEnum == InternalObjectPositionE.Top)
                {
                    InternalST.Soap( this, "ParseObjectEnd  Top Object (Array) Resolved");
                    isTopObjectResolved = true;
                    topObject = objectPr.PRnewObj;
                }

                InternalST.Soap( this, "ParseArray  RegisterObject ",objectPr.PRobjectId," ",objectPr.PRnewObj.GetType());
                RegisterObject(objectPr.PRnewObj, objectPr, parentPr);                  

                return;
            }

            if (objectPr.PRobjectInfo != null)
            {
                objectPr.PRobjectInfo.PopulateObjectMembers();
            }

            if (objectPr.PRnewObj == null)
            {
                if (objectPr.PRdtType == Converter.typeofString)
                {
                    InternalST.Soap( this, "ParseObjectEnd String ");
                    if (objectPr.PRvalue == null)
                        objectPr.PRvalue = String.Empty; // Not a null object, but an empty string
                    objectPr.PRnewObj = objectPr.PRvalue;
                    CheckSecurity(objectPr);
                }
                else
                    throw new SerializationException(String.Format(SoapUtil.GetResourceString("Serialization_ObjectMissing"),pr.PRname));               
            }

            // Registration is after object is populated
            if (!objectPr.PRisRegistered && objectPr.PRobjectId > 0)
            {
                InternalST.Soap( this, "ParseObjectEnd Register Object ",objectPr.PRobjectId," ",objectPr.PRnewObj.GetType());
                RegisterObject(objectPr.PRnewObj, objectPr, parentPr);
            }

            if (objectPr.PRisValueTypeFixup)
            {
                InternalST.Soap( this, "ParseObjectEnd  ValueTypeFixup ",objectPr.PRnewObj.GetType());
                ValueFixup fixup = (ValueFixup)valueFixupStack.Pop(); //Value fixup
                fixup.Fixup(objectPr, parentPr);  // Value fixup
            }

            if (objectPr.PRobjectPositionEnum == InternalObjectPositionE.Top)
            {
                InternalST.Soap( this, "ParseObjectEnd  Top Object Resolved ",objectPr.PRnewObj.GetType());
                isTopObjectResolved = true;
                topObject = objectPr.PRnewObj;
            }

            if (objectPr.PRnewObj is SoapFault)
                soapFaultId = objectPr.PRobjectId;

            if (objectPr.PRobjectInfo != null)
            {
                if (objectPr.PRobjectInfo.bfake && !objectPr.PRobjectInfo.bSoapFault)
                    objectPr.PRobjectInfo.AddValue("__fault", null); // need this because SerializationObjectInfo throws an exception if a name being referenced is missing

                objectPr.PRobjectInfo.ObjectEnd();
            }

            InternalST.Soap( this, "ParseObjectEnd  Exit ",objectPr.PRnewObj," id: ",objectPr.PRobjectId);      
        }
Beispiel #9
0
        // New object encountered in stream
        private void ParseObject(ParseRecord pr)
        {
            InternalST.Soap( this, "ParseObject Entry ");

            if (pr.PRobjectPositionEnum == InternalObjectPositionE.Top)
                topId = pr.PRobjectId;

            if (pr.PRparseTypeEnum == InternalParseTypeE.Object)
            {
                InternalST.Soap( this, "ParseObject Push "+pr.PRname);
                stack.Push(pr); // Nested objects member names are already on stack
            }

            if (pr.PRobjectTypeEnum == InternalObjectTypeE.Array)
            {
                ParseArray(pr);
                InternalST.Soap( this, "ParseObject Exit, ParseArray ");
                return;
            }

            if ((pr.PRdtType == null) && !IsFakeTopObject)
                throw new SerializationException(String.Format(SoapUtil.GetResourceString("Serialization_TopObjectInstantiate"),pr.PRname));


            if (pr.PRobjectPositionEnum == InternalObjectPositionE.Top && IsFakeTopObject && pr.PRdtType != Converter.typeofSoapFault)
            {

                // Soap fake top object
                if (handler != null) 
                {
                    // Handler object will supply real top object
                    InternalST.Soap( this, "ParseObject FakeTopObject with handlerObject ");    

                    // Now know the method name, can call header handler 
                    //Create header for method name
                    if (!isHeaderHandlerCalled)
                    {
                        newheaders = null;
                        isHeaderHandlerCalled = true;
                        if (headers == null)
                        {
                            newheaders = new Header[1];
                        }
                        else
                        {
                            newheaders = new Header[headers.Length+1];
                            Array.Copy(headers, 0, newheaders, 1, headers.Length);
                        }

                        Header methodNameHeader = new Header("__methodName", pr.PRname, false, pr.PRnameXmlKey);
                        newheaders[0] = methodNameHeader;
                        InternalST.Soap( this, "Deserialize Before Delegate Invoke ");
                        handlerObject = handler(newheaders);

                        InternalST.Soap( this, "Deserialize after Delegate Invoke");
                        InternalST.Soap( this, "Deserialize delgate object ",((handlerObject == null)?"null":handlerObject));                   
                    }

                    if (isHeaderHandlerCalled)
                    {
                        // Handler object has supplied the real object for the fake object
                        // which is on top of the stack
                        pr.PRnewObj = handlerObject;
                        pr.PRdtType = handlerObject.GetType();
                        CheckSecurity(pr);
                        if (pr.PRnewObj is IFieldInfo)
                        {
                            IFieldInfo fi = (IFieldInfo)pr.PRnewObj;
                            if ((fi.FieldTypes != null) && (fi.FieldTypes.Length > 0))
                            {
                                pr.PRobjectInfo = CreateReadObjectInfo(pr.PRdtType, fi.FieldNames, fi.FieldTypes, pr.PRassemblyName);
                            }
                        }                       
                    }
                    else
                    {
                        // Handler object has not yet been asked for the real object
                        // Stack the parse record until the second pass
                        isTopObjectResolved = false;
                        topStack = new SerStack("Top ParseRecords");
                        InternalST.Soap( this, "ParseObject Handler Push "+pr.PRname);
                        topStack.Push(pr.Copy());
                        return;
                    }
                }
                else if (formatterEnums.FEtopObject != null)
                {
                    // SoapMessage will be used as the real object
                    InternalST.Soap( this, "ParseObject FakeTopObject with SoapMessage ");                                  
                    if (isTopObjectSecondPass)
                    {
                        // This creates a the SoapMessage object as the real object, at this point it is an unitialized object.
                        pr.PRnewObj = new InternalSoapMessage();
                        pr.PRdtType = typeof(InternalSoapMessage);
                        CheckSecurity(pr);
                        if (formatterEnums.FEtopObject != null)
                        {
                            ISoapMessage soapMessage = (ISoapMessage)formatterEnums.FEtopObject;
                            pr.PRobjectInfo = CreateReadObjectInfo(pr.PRdtType, soapMessage.ParamNames, soapMessage.ParamTypes, pr.PRassemblyName);
                        }
                    }
                    else
                    {
                        // Stack the parse record until the second pass
                        isTopObjectResolved = false;
                        topStack = new SerStack("Top ParseRecords");
                        topStack.Push(pr.Copy());
                        return;
                    }
                }
            }
            else if (pr.PRdtType == Converter.typeofString)
            {
                // String as a top level object
                if (pr.PRvalue != null)
                {
                    pr.PRnewObj = pr.PRvalue;
                    if (pr.PRobjectPositionEnum == InternalObjectPositionE.Top)
                    {
                        InternalST.Soap( this, "ParseObject String as top level, Top Object Resolved");
                        isTopObjectResolved = true;
                        topObject = pr.PRnewObj;
                        //stack.Pop();
                        return;
                    }
                    else
                    {
                        InternalST.Soap( this, "ParseObject  String as an object");
                        stack.Pop();                        
                        RegisterObject(pr.PRnewObj, pr, (ParseRecord)stack.Peek());                         
                        return;
                    }
                }
                else
                {
                    // xml Doesn't have the value until later
                    return;
                }
            }
            else 
            {
                if (pr.PRdtType == null)
                {
                    ParseRecord objectPr = (ParseRecord)stack.Peek();
                    if (objectPr.PRdtType == Converter.typeofSoapFault)
                    {
                        InternalST.Soap( this, "ParseObject unknown SoapFault detail");
                        throw new ServerException(String.Format(SoapUtil.GetResourceString("Serialization_SoapFault"),faultString));                
                    }

                    throw new SerializationException(String.Format(SoapUtil.GetResourceString("Serialization_TypeElement"),pr.PRname));             
                }

                pr.PRnewObj = FormatterServices.GetUninitializedObject(pr.PRdtType);    
                CheckSecurity(pr);
            }

            if (pr.PRnewObj == null)
                throw new SerializationException(String.Format(SoapUtil.GetResourceString("Serialization_TopObjectInstantiate"),pr.PRdtType));              

            long genId = pr.PRobjectId;
            if (genId < 1)
                pr.PRobjectId = GetId("GenId-"+objectIds);


            if (IsFakeTopObject && pr.PRobjectPositionEnum == InternalObjectPositionE.Top)
            {
                InternalST.Soap( this, "ParseObject fake Top object resolved ",pr.PRnewObj);
                isTopObjectResolved = true;
                topObject = pr.PRnewObj;
            }

            if (pr.PRobjectInfo == null)
                pr.PRobjectInfo = CreateReadObjectInfo(pr.PRdtType, pr.PRassemblyName);
            pr.PRobjectInfo.obj = pr.PRnewObj;

            if (IsFakeTopObject && pr.PRobjectPositionEnum == InternalObjectPositionE.Top)
            {
                InternalST.Soap( this, "ParseObject AddValue to fake object ",pr.PRobjectInfo.obj);
                // Add the methodName to top object, either InternalSoapMessage or object returned by handler
                pr.PRobjectInfo.AddValue("__methodName", pr.PRname);
                pr.PRobjectInfo.AddValue("__keyToNamespaceTable", soapHandler.keyToNamespaceTable);
                pr.PRobjectInfo.AddValue("__paramNameList", pr.PRobjectInfo.SetFakeObject());
                if (formatterEnums.FEtopObject != null)
                    pr.PRobjectInfo.AddValue("__xmlNameSpace", pr.PRxmlNameSpace);
            }

            InternalST.Soap( this, "ParseObject Exit ");        
        }
Beispiel #10
0
        // Object member encountered in stream
        private void ParseMember(ParseRecord pr)
        {
            InternalST.Soap( this, "ParseMember Entry ");


            ParseRecord objectPr = (ParseRecord)stack.Peek();
            String objName = null;
            if (objectPr != null)
                objName = objectPr.PRname;
                
            InternalST.Soap( this, "ParseMember ",objectPr.PRobjectId," ",pr.PRname);
            InternalST.Soap( this, "ParseMember objectPr ",objectPr.Trace());
            InternalST.Soap( this, "ParseMember pr ",pr.Trace());

            if (objectPr.PRdtType == Converter.typeofSoapFault && pr.PRname.ToLower(CultureInfo.InvariantCulture) == "faultstring")
                faultString = pr.PRvalue; // Save fault string in case rest of SoapFault cannot be parsed


            if ((objectPr.PRobjectPositionEnum == InternalObjectPositionE.Top) && !isTopObjectResolved)
            {
                InternalST.Soap( this, "ParseMember Top not resolved");
                if (pr.PRdtType == Converter.typeofString)
                {
                    ParseString(pr, objectPr);
                }
                topStack.Push(pr.Copy());
                return;
            }

            switch(pr.PRmemberTypeEnum)
            {
                case InternalMemberTypeE.Item:
                    ParseArrayMember(pr);
                    return;
                case InternalMemberTypeE.Field:
                    break;
            }
            

            if (objectPr.PRobjectInfo != null)
                objectPr.PRobjectInfo.AddMemberSeen();

            bool bParams = (IsFakeTopObject &&
                    objectPr.PRobjectPositionEnum == InternalObjectPositionE.Top && 
                    objectPr.PRobjectInfo != null && objectPr.PRdtType != Converter.typeofSoapFault);

            if ((pr.PRdtType == null) && objectPr.PRobjectInfo.isTyped)         
            {
                InternalST.Soap( this, "ParseMember pr.PRdtType null and not isSi");

                if (bParams)
                {
                    // Get type of parameters
                    InternalST.Soap( this, "ParseMember pr.PRdtType Get Param Type position "+paramPosition+" name "+pr.PRname);    
                    pr.PRdtType = objectPr.PRobjectInfo.GetType(paramPosition++);
                    InternalST.Soap( this, "ParseMember pr.PRdtType Get Param Type Type "+pr.PRdtType);
                }
                else
                    pr.PRdtType = objectPr.PRobjectInfo.GetType(pr.PRname);

                if (pr.PRdtType == null)
                    throw new SerializationException(String.Format(SoapUtil.GetResourceString("Serialization_TypeResolved"), objectPr.PRnewObj+" "+pr.PRname));

                pr.PRdtTypeCode = Converter.ToCode(pr.PRdtType);
            }
            else
            {
                if (bParams)
                {
                    paramPosition++;
                }
            }


            if (pr.PRmemberValueEnum == InternalMemberValueE.Null)
            {
                // Value is Null
                InternalST.Soap( this, "ParseMember null member: ",pr.PRname);
                InternalST.Soap( this, "AddValue 1");
                objectPr.PRobjectInfo.AddValue(pr.PRname, null);
            }
            else if (pr.PRmemberValueEnum == InternalMemberValueE.Nested)
            {
                InternalST.Soap( this, "ParseMember Nested Type member: ",pr.PRname," objectPr.PRnewObj ",objectPr.PRnewObj);
                ParseObject(pr);
                InternalST.Soap( "ParseMember Push object "+pr.PRname);
                stack.Push(pr);
                InternalST.Soap( this, "AddValue 2 ",pr.PRnewObj," is value type ",pr.PRnewObj.GetType().IsValueType);

                if ((pr.PRobjectInfo != null) && (pr.PRobjectInfo.objectType.IsValueType))
                {
                    InternalST.Soap( "ParseMember ValueType ObjectPr ",objectPr.PRnewObj," memberName  ",pr.PRname," nested object ",pr.PRnewObj);
                    if (IsFakeTopObject)
                        objectPr.PRobjectInfo.AddParamName(pr.PRname);
                    
                    pr.PRisValueTypeFixup = true; //Valuefixup
                    valueFixupStack.Push(new ValueFixup(objectPr.PRnewObj, pr.PRname, objectPr.PRobjectInfo));//valuefixup
                }
                else
                {
                    InternalST.Soap( this, "AddValue 2A ");
                    objectPr.PRobjectInfo.AddValue(pr.PRname, pr.PRnewObj);
                }
            }
            else if (pr.PRmemberValueEnum == InternalMemberValueE.Reference)
            {
                InternalST.Soap( this, "ParseMember Reference Type member: ",pr.PRname);            
                // See if object has already been instantiated
                Object refObj = m_objectManager.GetObject(pr.PRidRef);
                if (refObj == null)
                {
                    InternalST.Soap( this, "ParseMember RecordFixup: ",pr.PRname);
                    InternalST.Soap( this, "AddValue 3");                   
                    objectPr.PRobjectInfo.AddValue(pr.PRname, null);                    
                    objectPr.PRobjectInfo.RecordFixup(objectPr.PRobjectId, pr.PRname, pr.PRidRef); // Object not instantiated
                }
                else
                {
                    InternalST.Soap( this, "ParseMember Referenced Object Known ",pr.PRname," ",refObj);
                    InternalST.Soap( this, "AddValue 5");               
                    objectPr.PRobjectInfo.AddValue(pr.PRname, refObj);
                }
            }

            else if (pr.PRmemberValueEnum == InternalMemberValueE.InlineValue) 
            {
                // Primitive type or String
                InternalST.Soap( this, "ParseMember primitive or String member: ",pr.PRname);

                if (pr.PRdtType == Converter.typeofString)
                {
                    ParseString(pr, objectPr);
                    InternalST.Soap( this, "AddValue 6");               
                    objectPr.PRobjectInfo.AddValue(pr.PRname, pr.PRvalue);  
                }
                else if (pr.PRdtTypeCode == InternalPrimitiveTypeE.Invalid)
                {
                    // The member field was an object put the value is Inline either  bin.Base64 or invalid
                    if (pr.PRarrayTypeEnum == InternalArrayTypeE.Base64)
                    {
                        InternalST.Soap( this, "AddValue 7");                   
                        objectPr.PRobjectInfo.AddValue(pr.PRname, Convert.FromBase64String(FilterBin64(pr.PRvalue)));                                   
                    }
                    else if (pr.PRdtType == Converter.typeofObject && pr.PRvalue != null) 
                    {
                        if (objectPr != null && objectPr.PRdtType == Converter.typeofHeader)
                        {
                            // assume the type is a string for a header
                            pr.PRdtType = Converter.typeofString;
                            ParseString(pr, objectPr);
                            InternalST.Soap( this, "AddValue 6");               
                            objectPr.PRobjectInfo.AddValue(pr.PRname, pr.PRvalue);  
                        }
                        else
                            throw new SerializationException(String.Format(SoapUtil.GetResourceString("Serialization_TypeMissing"), pr.PRname));
                    }
                    else
                    {
                        InternalST.Soap( this, "Object Class with no memberInfo data  Member "+pr.PRname+" type "+pr.PRdtType);

                        if (pr.PRdtType != null && pr.PRdtType.IsEnum)
                        {
                            // Soap sends Enums as strings
                            Object obj = Enum.Parse(pr.PRdtType, pr.PRvalue);
                            InternalST.Soap( this, "AddValue 8");                           
                            objectPr.PRobjectInfo.AddValue(pr.PRname, obj);                         
                        }
                        else if (pr.PRdtType != null && pr.PRdtType == Converter.typeofTypeArray)
                        {
                            // Soap sends MethodSignature as an array of types
                            InternalST.Soap( this, "AddValue 8A");                          
                            objectPr.PRobjectInfo.AddValue(pr.PRname, pr.PRvarValue);                                                       
                        }
                        else
                        {
                            if  ((!pr.PRisRegistered) && (pr.PRobjectId > 0))
                            {
                                if (pr.PRvalue == null)
                                    pr.PRvalue = ""; //can't register null value, this must be a string so set to empty string.

                                InternalST.Soap( this, "ParseMember RegisterObject ",pr.PRvalue," ",pr.PRobjectId);                         
                                RegisterObject(pr.PRvalue, pr, objectPr);
                            }

                            // Object Class with no memberInfo data
                            if (pr.PRdtType == Converter.typeofSystemVoid)
                            {
                                InternalST.Soap( this, "AddValue 9");
                                objectPr.PRobjectInfo.AddValue(pr.PRname, pr.PRdtType);
                            }
                            else if (objectPr.PRobjectInfo.isSi)
                            {
                                // ISerializable are added as strings, the conversion to type is done by the
                                // ISerializable object
                                InternalST.Soap( this, "AddValue 10");
                                objectPr.PRobjectInfo.AddValue(pr.PRname, pr.PRvalue);                          
                            }
                        }
                    }
                }
                else
                {
                    Object var = null;
                    if (pr.PRvarValue != null)
                        var = pr.PRvarValue;
                    else
                        var = Converter.FromString(pr.PRvalue, pr.PRdtTypeCode);
                    // Not a string, convert the value
                    InternalST.Soap( this, "ParseMember Converting primitive and storing");
                    stack.Dump();
                    InternalST.Soap( this, "ParseMember pr "+pr.Trace());
                    InternalST.Soap( this, "ParseMember objectPr ",objectPr.Trace());

                    InternalST.Soap( this, "AddValue 11");  
                    if (pr.PRdtTypeCode == InternalPrimitiveTypeE.QName && var != null)
                    {
                        SoapQName soapQName = (SoapQName)var;
                        if (soapQName.Key != null)
                        {
                            if (soapQName.Key.Length == 0)
                                soapQName.Namespace = (String)soapHandler.keyToNamespaceTable["xmlns"];
                            else
                                soapQName.Namespace = (String)soapHandler.keyToNamespaceTable["xmlns"+":"+soapQName.Key];
                        }
                    }
                    objectPr.PRobjectInfo.AddValue(pr.PRname, var);             
                }
            }
            else
                ParseError(pr, objectPr);
        }