Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Data / System / NewXml / XmlBoundElement.cs / 1305376 / XmlBoundElement.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //[....] //----------------------------------------------------------------------------- #pragma warning disable 618 // ignore obsolete warning about XmlDataDocument namespace System.Xml { using System.Data; using System.Diagnostics; internal enum ElementState { None, Defoliated, WeakFoliation, StrongFoliation, Foliating, Defoliating, } internal sealed class XmlBoundElement: XmlElement { private DataRow row; private ElementState state; internal XmlBoundElement( string prefix, string localName, string namespaceURI, XmlDocument doc ) : base( prefix, localName, namespaceURI, doc ) { state = ElementState.None; } public override XmlAttributeCollection Attributes { get { AutoFoliate(); return base.Attributes; } } public override bool HasAttributes { get { return Attributes.Count > 0; } } public override XmlNode FirstChild { get { AutoFoliate(); return base.FirstChild; } } internal XmlNode SafeFirstChild { get { return base.FirstChild; } } public override XmlNode LastChild { get { AutoFoliate(); return base.LastChild; } } public override XmlNode PreviousSibling { get { XmlNode prev = base.PreviousSibling; if ( prev == null ) { XmlBoundElement parent = ParentNode as XmlBoundElement; if ( parent != null ) { parent.AutoFoliate(); return base.PreviousSibling; } } return prev; } } internal XmlNode SafePreviousSibling { get { return base.PreviousSibling; } } public override XmlNode NextSibling { get { XmlNode next = base.NextSibling; if ( next == null ) { XmlBoundElement parent = ParentNode as XmlBoundElement; if ( parent != null ) { parent.AutoFoliate(); return base.NextSibling; } } return next; } } internal XmlNode SafeNextSibling { get { return base.NextSibling; } } public override bool HasChildNodes { get { AutoFoliate(); return base.HasChildNodes; } } public override XmlNode InsertBefore(XmlNode newChild, XmlNode refChild) { AutoFoliate(); return base.InsertBefore( newChild, refChild ); } public override XmlNode InsertAfter(XmlNode newChild, XmlNode refChild) { AutoFoliate(); return base.InsertAfter( newChild, refChild ); } public override XmlNode ReplaceChild(XmlNode newChild, XmlNode oldChild) { AutoFoliate(); return base.ReplaceChild( newChild, oldChild ); } public override XmlNode AppendChild(XmlNode newChild) { AutoFoliate(); return base.AppendChild( newChild ); } internal void RemoveAllChildren() { XmlNode child = FirstChild; XmlNode sibling = null; while ( child != null ) { sibling = child.NextSibling; RemoveChild( child ); child = sibling; } } public override string InnerXml { get { return base.InnerXml; } set { RemoveAllChildren(); XmlDataDocument doc = (XmlDataDocument) OwnerDocument; bool bOrigIgnoreXmlEvents = doc.IgnoreXmlEvents; bool bOrigIgnoreDataSetEvents = doc.IgnoreDataSetEvents; doc.IgnoreXmlEvents = true; doc.IgnoreDataSetEvents = true; base.InnerXml = value; doc.SyncTree( this ); doc.IgnoreDataSetEvents = bOrigIgnoreDataSetEvents; doc.IgnoreXmlEvents = bOrigIgnoreXmlEvents; } } internal DataRow Row { get { return row;} set { row = value;} } internal bool IsFoliated { get { while ( state == ElementState.Foliating || state == ElementState.Defoliating ) System.Threading.Thread.Sleep(0); //has to be sure that we are either foliated or defoliated when ask for IsFoliated. return state != ElementState.Defoliated; } } internal ElementState ElementState { get { return state;} set { state = value;} } internal void Foliate( ElementState newState ) { XmlDataDocument doc = (XmlDataDocument) OwnerDocument; if ( doc != null ) doc.Foliate( this, newState ); } // Foliate the node as a side effect of user calling functions on this node (like NextSibling) OR as a side effect of DataDocNav using nodes to do editing private void AutoFoliate() { XmlDataDocument doc = (XmlDataDocument) OwnerDocument; if ( doc != null ) doc.Foliate( this, doc.AutoFoliationState ); } public override XmlNode CloneNode(bool deep) { XmlDataDocument doc = (XmlDataDocument)(this.OwnerDocument); ElementState oldAutoFoliationState = doc.AutoFoliationState; doc.AutoFoliationState = ElementState.WeakFoliation; XmlElement element; try { Foliate( ElementState.WeakFoliation ); element = (XmlElement)(base.CloneNode( deep )); // Clone should create a XmlBoundElement node Debug.Assert( element is XmlBoundElement ); } finally { doc.AutoFoliationState = oldAutoFoliationState; } return element; } public override void WriteContentTo( XmlWriter w ) { DataPointer dp = new DataPointer( (XmlDataDocument)OwnerDocument, this ); try { dp.AddPointer(); WriteBoundElementContentTo( dp, w ); } finally { dp.SetNoLongerUse(); } } public override void WriteTo( XmlWriter w ) { DataPointer dp = new DataPointer( (XmlDataDocument)OwnerDocument, this ); try { dp.AddPointer(); WriteRootBoundElementTo( dp, w ); } finally { dp.SetNoLongerUse(); } } private void WriteRootBoundElementTo(DataPointer dp, XmlWriter w) { Debug.Assert( dp.NodeType == XmlNodeType.Element ); XmlDataDocument doc = (XmlDataDocument)OwnerDocument; w.WriteStartElement( dp.Prefix, dp.LocalName, dp.NamespaceURI ); int cAttr = dp.AttributeCount; bool bHasXSI = false; if ( cAttr > 0 ) { for ( int iAttr = 0; iAttr < cAttr; iAttr++ ) { dp.MoveToAttribute( iAttr ); if ( dp.Prefix == "xmlns" && dp.LocalName == XmlDataDocument.XSI ) bHasXSI = true; WriteTo( dp, w ); dp.MoveToOwnerElement(); } } if ( !bHasXSI && doc.bLoadFromDataSet && doc.bHasXSINIL ) w.WriteAttributeString( "xmlns", "xsi", "http://www.w3.org/2000/xmlns/", Keywords.XSINS ); WriteBoundElementContentTo( dp, w ); // Force long end tag when the elem is not empty, even if there are no children. if ( dp.IsEmptyElement ) w.WriteEndElement(); else w.WriteFullEndElement(); } private static void WriteBoundElementTo( DataPointer dp, XmlWriter w ) { Debug.Assert( dp.NodeType == XmlNodeType.Element ); w.WriteStartElement( dp.Prefix, dp.LocalName, dp.NamespaceURI ); int cAttr = dp.AttributeCount; if ( cAttr > 0 ) { for ( int iAttr = 0; iAttr < cAttr; iAttr++ ) { dp.MoveToAttribute( iAttr ); WriteTo( dp, w ); dp.MoveToOwnerElement(); } } WriteBoundElementContentTo( dp, w ); // Force long end tag when the elem is not empty, even if there are no children. if ( dp.IsEmptyElement ) w.WriteEndElement(); else w.WriteFullEndElement(); } private static void WriteBoundElementContentTo( DataPointer dp, XmlWriter w ) { if ( !dp.IsEmptyElement && dp.MoveToFirstChild() ) { do { WriteTo( dp, w ); } while ( dp.MoveToNextSibling() ); dp.MoveToParent(); } } private static void WriteTo( DataPointer dp, XmlWriter w ) { switch ( dp.NodeType ) { case XmlNodeType.Attribute: if ( !dp.IsDefault ) { w.WriteStartAttribute( dp.Prefix, dp.LocalName, dp.NamespaceURI ); if ( dp.MoveToFirstChild() ) { do { WriteTo( dp, w ); } while ( dp.MoveToNextSibling() ); dp.MoveToParent(); } w.WriteEndAttribute(); } break; case XmlNodeType.Element: WriteBoundElementTo( dp, w ); break; case XmlNodeType.Text: w.WriteString(dp.Value); break; default: Debug.Assert( ((IXmlDataVirtualNode)dp).IsOnColumn( null ) ); if ( dp.GetNode() != null ) dp.GetNode().WriteTo( w ); break; } } public override XmlNodeList GetElementsByTagName(string name) { // Retrieving nodes from the returned nodelist may cause foliation which causes new nodes to be created, // so the System.Xml iterator will throw if this happens during iteration. To avoid this, foliate everything // before iteration, so iteration will not cause foliation (and as a result of this, creation of new nodes). XmlNodeList tempNodeList = base.GetElementsByTagName(name); int tempint = tempNodeList.Count; return tempNodeList; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //[....] //----------------------------------------------------------------------------- #pragma warning disable 618 // ignore obsolete warning about XmlDataDocument namespace System.Xml { using System.Data; using System.Diagnostics; internal enum ElementState { None, Defoliated, WeakFoliation, StrongFoliation, Foliating, Defoliating, } internal sealed class XmlBoundElement: XmlElement { private DataRow row; private ElementState state; internal XmlBoundElement( string prefix, string localName, string namespaceURI, XmlDocument doc ) : base( prefix, localName, namespaceURI, doc ) { state = ElementState.None; } public override XmlAttributeCollection Attributes { get { AutoFoliate(); return base.Attributes; } } public override bool HasAttributes { get { return Attributes.Count > 0; } } public override XmlNode FirstChild { get { AutoFoliate(); return base.FirstChild; } } internal XmlNode SafeFirstChild { get { return base.FirstChild; } } public override XmlNode LastChild { get { AutoFoliate(); return base.LastChild; } } public override XmlNode PreviousSibling { get { XmlNode prev = base.PreviousSibling; if ( prev == null ) { XmlBoundElement parent = ParentNode as XmlBoundElement; if ( parent != null ) { parent.AutoFoliate(); return base.PreviousSibling; } } return prev; } } internal XmlNode SafePreviousSibling { get { return base.PreviousSibling; } } public override XmlNode NextSibling { get { XmlNode next = base.NextSibling; if ( next == null ) { XmlBoundElement parent = ParentNode as XmlBoundElement; if ( parent != null ) { parent.AutoFoliate(); return base.NextSibling; } } return next; } } internal XmlNode SafeNextSibling { get { return base.NextSibling; } } public override bool HasChildNodes { get { AutoFoliate(); return base.HasChildNodes; } } public override XmlNode InsertBefore(XmlNode newChild, XmlNode refChild) { AutoFoliate(); return base.InsertBefore( newChild, refChild ); } public override XmlNode InsertAfter(XmlNode newChild, XmlNode refChild) { AutoFoliate(); return base.InsertAfter( newChild, refChild ); } public override XmlNode ReplaceChild(XmlNode newChild, XmlNode oldChild) { AutoFoliate(); return base.ReplaceChild( newChild, oldChild ); } public override XmlNode AppendChild(XmlNode newChild) { AutoFoliate(); return base.AppendChild( newChild ); } internal void RemoveAllChildren() { XmlNode child = FirstChild; XmlNode sibling = null; while ( child != null ) { sibling = child.NextSibling; RemoveChild( child ); child = sibling; } } public override string InnerXml { get { return base.InnerXml; } set { RemoveAllChildren(); XmlDataDocument doc = (XmlDataDocument) OwnerDocument; bool bOrigIgnoreXmlEvents = doc.IgnoreXmlEvents; bool bOrigIgnoreDataSetEvents = doc.IgnoreDataSetEvents; doc.IgnoreXmlEvents = true; doc.IgnoreDataSetEvents = true; base.InnerXml = value; doc.SyncTree( this ); doc.IgnoreDataSetEvents = bOrigIgnoreDataSetEvents; doc.IgnoreXmlEvents = bOrigIgnoreXmlEvents; } } internal DataRow Row { get { return row;} set { row = value;} } internal bool IsFoliated { get { while ( state == ElementState.Foliating || state == ElementState.Defoliating ) System.Threading.Thread.Sleep(0); //has to be sure that we are either foliated or defoliated when ask for IsFoliated. return state != ElementState.Defoliated; } } internal ElementState ElementState { get { return state;} set { state = value;} } internal void Foliate( ElementState newState ) { XmlDataDocument doc = (XmlDataDocument) OwnerDocument; if ( doc != null ) doc.Foliate( this, newState ); } // Foliate the node as a side effect of user calling functions on this node (like NextSibling) OR as a side effect of DataDocNav using nodes to do editing private void AutoFoliate() { XmlDataDocument doc = (XmlDataDocument) OwnerDocument; if ( doc != null ) doc.Foliate( this, doc.AutoFoliationState ); } public override XmlNode CloneNode(bool deep) { XmlDataDocument doc = (XmlDataDocument)(this.OwnerDocument); ElementState oldAutoFoliationState = doc.AutoFoliationState; doc.AutoFoliationState = ElementState.WeakFoliation; XmlElement element; try { Foliate( ElementState.WeakFoliation ); element = (XmlElement)(base.CloneNode( deep )); // Clone should create a XmlBoundElement node Debug.Assert( element is XmlBoundElement ); } finally { doc.AutoFoliationState = oldAutoFoliationState; } return element; } public override void WriteContentTo( XmlWriter w ) { DataPointer dp = new DataPointer( (XmlDataDocument)OwnerDocument, this ); try { dp.AddPointer(); WriteBoundElementContentTo( dp, w ); } finally { dp.SetNoLongerUse(); } } public override void WriteTo( XmlWriter w ) { DataPointer dp = new DataPointer( (XmlDataDocument)OwnerDocument, this ); try { dp.AddPointer(); WriteRootBoundElementTo( dp, w ); } finally { dp.SetNoLongerUse(); } } private void WriteRootBoundElementTo(DataPointer dp, XmlWriter w) { Debug.Assert( dp.NodeType == XmlNodeType.Element ); XmlDataDocument doc = (XmlDataDocument)OwnerDocument; w.WriteStartElement( dp.Prefix, dp.LocalName, dp.NamespaceURI ); int cAttr = dp.AttributeCount; bool bHasXSI = false; if ( cAttr > 0 ) { for ( int iAttr = 0; iAttr < cAttr; iAttr++ ) { dp.MoveToAttribute( iAttr ); if ( dp.Prefix == "xmlns" && dp.LocalName == XmlDataDocument.XSI ) bHasXSI = true; WriteTo( dp, w ); dp.MoveToOwnerElement(); } } if ( !bHasXSI && doc.bLoadFromDataSet && doc.bHasXSINIL ) w.WriteAttributeString( "xmlns", "xsi", "http://www.w3.org/2000/xmlns/", Keywords.XSINS ); WriteBoundElementContentTo( dp, w ); // Force long end tag when the elem is not empty, even if there are no children. if ( dp.IsEmptyElement ) w.WriteEndElement(); else w.WriteFullEndElement(); } private static void WriteBoundElementTo( DataPointer dp, XmlWriter w ) { Debug.Assert( dp.NodeType == XmlNodeType.Element ); w.WriteStartElement( dp.Prefix, dp.LocalName, dp.NamespaceURI ); int cAttr = dp.AttributeCount; if ( cAttr > 0 ) { for ( int iAttr = 0; iAttr < cAttr; iAttr++ ) { dp.MoveToAttribute( iAttr ); WriteTo( dp, w ); dp.MoveToOwnerElement(); } } WriteBoundElementContentTo( dp, w ); // Force long end tag when the elem is not empty, even if there are no children. if ( dp.IsEmptyElement ) w.WriteEndElement(); else w.WriteFullEndElement(); } private static void WriteBoundElementContentTo( DataPointer dp, XmlWriter w ) { if ( !dp.IsEmptyElement && dp.MoveToFirstChild() ) { do { WriteTo( dp, w ); } while ( dp.MoveToNextSibling() ); dp.MoveToParent(); } } private static void WriteTo( DataPointer dp, XmlWriter w ) { switch ( dp.NodeType ) { case XmlNodeType.Attribute: if ( !dp.IsDefault ) { w.WriteStartAttribute( dp.Prefix, dp.LocalName, dp.NamespaceURI ); if ( dp.MoveToFirstChild() ) { do { WriteTo( dp, w ); } while ( dp.MoveToNextSibling() ); dp.MoveToParent(); } w.WriteEndAttribute(); } break; case XmlNodeType.Element: WriteBoundElementTo( dp, w ); break; case XmlNodeType.Text: w.WriteString(dp.Value); break; default: Debug.Assert( ((IXmlDataVirtualNode)dp).IsOnColumn( null ) ); if ( dp.GetNode() != null ) dp.GetNode().WriteTo( w ); break; } } public override XmlNodeList GetElementsByTagName(string name) { // Retrieving nodes from the returned nodelist may cause foliation which causes new nodes to be created, // so the System.Xml iterator will throw if this happens during iteration. To avoid this, foliate everything // before iteration, so iteration will not cause foliation (and as a result of this, creation of new nodes). XmlNodeList tempNodeList = base.GetElementsByTagName(name); int tempint = tempNodeList.Count; return tempNodeList; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Decorator.cs
- NavigationHelper.cs
- ExtentKey.cs
- ListViewEditEventArgs.cs
- GeometryDrawing.cs
- PointConverter.cs
- DocumentSchemaValidator.cs
- GlyphShapingProperties.cs
- MachineSettingsSection.cs
- CommandSet.cs
- XmlSchema.cs
- Instrumentation.cs
- RoutedPropertyChangedEventArgs.cs
- ControlEvent.cs
- MenuCommandService.cs
- SchemaName.cs
- CompiledRegexRunnerFactory.cs
- ProviderUtil.cs
- DnsCache.cs
- CodeArrayCreateExpression.cs
- Baml2006SchemaContext.cs
- RenderCapability.cs
- RuleConditionDialog.Designer.cs
- HandleCollector.cs
- SqlRowUpdatingEvent.cs
- IteratorDescriptor.cs
- UrlPropertyAttribute.cs
- SqlDataSourceTableQuery.cs
- AsyncOperation.cs
- ImageSourceValueSerializer.cs
- Themes.cs
- Error.cs
- UpDownBase.cs
- MenuItemAutomationPeer.cs
- StsCommunicationException.cs
- TextBoxLine.cs
- CredentialSelector.cs
- PrivilegedConfigurationManager.cs
- DocumentEventArgs.cs
- AuthenticationModuleElement.cs
- LayoutEvent.cs
- WebEventCodes.cs
- DateTimeFormatInfo.cs
- CompilerCollection.cs
- keycontainerpermission.cs
- login.cs
- ReadOnlyTernaryTree.cs
- ManagementObject.cs
- CallInfo.cs
- SplayTreeNode.cs
- HitTestWithGeometryDrawingContextWalker.cs
- MemoryMappedFile.cs
- EnumConverter.cs
- FormsAuthenticationConfiguration.cs
- Exception.cs
- XmlObjectSerializerWriteContextComplex.cs
- WindowsListViewGroupHelper.cs
- ContextCorrelationInitializer.cs
- HandledMouseEvent.cs
- DataGridCommandEventArgs.cs
- FlowPanelDesigner.cs
- StringFormat.cs
- SynchronizationContext.cs
- SqlDataAdapter.cs
- HtmlTable.cs
- CriticalHandle.cs
- Cell.cs
- ListChangedEventArgs.cs
- PartitionedStreamMerger.cs
- MessageQueueConverter.cs
- OleDbException.cs
- StylusButtonCollection.cs
- EntityDataSourceChangedEventArgs.cs
- LocalizabilityAttribute.cs
- CompilerCollection.cs
- Comparer.cs
- SafeHandle.cs
- FixedSOMTable.cs
- HttpDigestClientCredential.cs
- ReadOnlyDataSource.cs
- Tablet.cs
- InputChannelBinder.cs
- SchemaTableOptionalColumn.cs
- ExistsInCollection.cs
- RecognizerStateChangedEventArgs.cs
- DataGridViewSelectedRowCollection.cs
- SemanticTag.cs
- SocketStream.cs
- WriteTimeStream.cs
- RegistryConfigurationProvider.cs
- DataGridViewAutoSizeColumnModeEventArgs.cs
- _UncName.cs
- MailMessageEventArgs.cs
- Animatable.cs
- AssemblyAttributesGoHere.cs
- XmlConvert.cs
- TextTreeObjectNode.cs
- KnownBoxes.cs
- SoundPlayerAction.cs
- TextChangedEventArgs.cs