public override bool Read() { switch (this.currentState) { case ActivityTemplateFactoryBuilderReaderStates.InitialState: bool hasMoreNodes = this.underlyingReader.Read(); if (this.underlyingReader.NodeType == XamlNodeType.StartObject && IsActivityTemplateFactoryType(this.underlyingReader.Type)) { Type underlyingType = this.underlyingReader.Type.UnderlyingType; Type targetType = underlyingType.IsGenericType ? underlyingType.GetGenericArguments()[0] : null; this.currentState = ActivityTemplateFactoryBuilderReaderStates.ReadingFromBufferState; this.queuedNodes = new XamlNodeQueue(this.schemaContext); this.queuedNodes.Writer.WriteStartObject(this.ActivityTemplateFactoryBuilderType, (IXamlLineInfo)this.underlyingReader); string className; while (this.underlyingReader.Read()) { if (this.underlyingReader.NodeType == XamlNodeType.StartMember && this.underlyingReader.Member == XamlLanguage.Class) { this.underlyingReader.Read(); className = (string)this.underlyingReader.Value; this.underlyingReader.Read(); this.queuedNodes.Writer.WriteStartMember(this.ActivityTemplateFactoryBuilderNameMember, (IXamlLineInfo)this.underlyingReader); this.queuedNodes.Writer.WriteValue(className, (IXamlLineInfo)this.underlyingReader); this.queuedNodes.Writer.WriteEndMember((IXamlLineInfo)this.underlyingReader); if (targetType != null) { this.queuedNodes.Writer.WriteStartMember(this.ActivityTemplateFactoryBuilderTargetTypeMember, (IXamlLineInfo)this.underlyingReader); object targetTypeString = targetType; this.queuedNodes.Writer.WriteValue(targetTypeString); this.queuedNodes.Writer.WriteEndMember(); } } else if (this.underlyingReader.NodeType == XamlNodeType.StartMember && this.IsActivityTemplateFactoryImplementationMember(this.underlyingReader.Member)) { this.queuedNodes.Writer.WriteStartMember(this.ActivityTemplateFactoryBuilderImplementationMember, (IXamlLineInfo)this.underlyingReader); return(true); } } } return(hasMoreNodes); case ActivityTemplateFactoryBuilderReaderStates.ReadingFromBufferState: if (this.queuedNodes.Reader.Read()) { return(true); } else { this.currentState = ActivityTemplateFactoryBuilderReaderStates.BypassState; this.queuedNodes = null; return(this.underlyingReader.Read()); } default: SharedFx.Assert(this.currentState == ActivityTemplateFactoryBuilderReaderStates.BypassState, "This is the only remaining ActivityTemplateFactoryBuilderReaderStates."); return(this.underlyingReader.Read()); } }
public override bool Read() { switch (this.currentState) { case ActivityTemplateFactoryBuilderReaderStates.InitialState: bool hasMoreNodes = this.underlyingReader.Read(); if (this.underlyingReader.NodeType == XamlNodeType.StartObject && IsActivityTemplateFactoryType(this.underlyingReader.Type)) { Type underlyingType = this.underlyingReader.Type.UnderlyingType; Type targetType = underlyingType.IsGenericType ? underlyingType.GetGenericArguments()[0] : null; this.currentState = ActivityTemplateFactoryBuilderReaderStates.ReadingFromBufferState; this.queuedNodes = new XamlNodeQueue(this.schemaContext); this.queuedNodes.Writer.WriteStartObject(this.ActivityTemplateFactoryBuilderType, (IXamlLineInfo)this.underlyingReader); string className; while (this.underlyingReader.Read()) { if (this.underlyingReader.NodeType == XamlNodeType.StartMember && this.underlyingReader.Member == XamlLanguage.Class) { this.underlyingReader.Read(); className = (string)this.underlyingReader.Value; this.underlyingReader.Read(); this.queuedNodes.Writer.WriteStartMember(this.ActivityTemplateFactoryBuilderNameMember, (IXamlLineInfo)this.underlyingReader); this.queuedNodes.Writer.WriteValue(className, (IXamlLineInfo)this.underlyingReader); this.queuedNodes.Writer.WriteEndMember((IXamlLineInfo)this.underlyingReader); if (targetType != null) { this.queuedNodes.Writer.WriteStartMember(this.ActivityTemplateFactoryBuilderTargetTypeMember, (IXamlLineInfo)this.underlyingReader); object targetTypeString = targetType; this.queuedNodes.Writer.WriteValue(targetTypeString); this.queuedNodes.Writer.WriteEndMember(); } } else if (this.underlyingReader.NodeType == XamlNodeType.StartMember && this.IsActivityTemplateFactoryImplementationMember(this.underlyingReader.Member)) { this.queuedNodes.Writer.WriteStartMember(this.ActivityTemplateFactoryBuilderImplementationMember, (IXamlLineInfo)this.underlyingReader); return true; } } } return hasMoreNodes; case ActivityTemplateFactoryBuilderReaderStates.ReadingFromBufferState: if (this.queuedNodes.Reader.Read()) { return true; } else { this.currentState = ActivityTemplateFactoryBuilderReaderStates.BypassState; this.queuedNodes = null; return this.underlyingReader.Read(); } default: SharedFx.Assert(this.currentState == ActivityTemplateFactoryBuilderReaderStates.BypassState, "This is the only remaining ActivityTemplateFactoryBuilderReaderStates."); return this.underlyingReader.Read(); } }