Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / Configuration / System / Configuration / XmlUtilWriter.cs / 1 / XmlUtilWriter.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Configuration { using System.Configuration.Internal; using System.Collections; using System.Collections.Specialized; using System.Collections.Generic; using System.Configuration; using System.Globalization; using System.IO; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using System.Text; using System.Xml; using System.Net; // // A utility class for writing XML to a TextWriter. // // When this class is used to copy an XML document that may include a " 0xFFFD)) { appendCharEntity = true; } else { switch (ch) { case '<': entityRef = "lt"; break; case '>': entityRef = "gt"; break; case '&': entityRef = "amp"; break; case '\'': if (inAttribute && quoteChar == ch) { entityRef = "apos"; } break; case '"': if (inAttribute && quoteChar == ch) { entityRef = "quot"; } break; case '\n': case '\r': appendCharEntity = inAttribute; break; default: break; } } if (appendCharEntity) { charactersWritten += AppendCharEntity(ch); } else if (entityRef != null) { charactersWritten += AppendEntityRef(entityRef); } else { charactersWritten += Write(ch); } } return charactersWritten; } internal int AppendEntityRef(string entityRef) { Write('&'); Write(entityRef); Write(';'); return entityRef.Length + 2; } internal int AppendCharEntity(char ch) { string numberToWrite = ((int)ch).ToString("X", CultureInfo.InvariantCulture); Write('&'); Write('#'); Write('x'); Write(numberToWrite); Write(';'); return numberToWrite.Length + 4; } internal int AppendCData(string cdata) { Write(""); return cdata.Length + 12; } internal int AppendProcessingInstruction(string name, string value) { Write(""); Write(name); AppendSpace(); Write(value); Write("?>"); return name.Length + value.Length + 5; } internal int AppendComment(string comment) { Write(""); return comment.Length + 7; } internal int AppendAttributeValue(XmlTextReader reader) { int charactersWritten = 0; char quote = reader.QuoteChar; // // In !DOCTYPE, quote is '\0' for second public attribute. // Protect ourselves from writing invalid XML by always // supplying a valid quote char. // if (quote != '"' && quote != '\'') { quote = '"'; } charactersWritten += Write(quote); while (reader.ReadAttributeValue()) { if (reader.NodeType == XmlNodeType.Text) { charactersWritten += AppendEscapeXmlString(reader.Value, true, quote); } else { charactersWritten += AppendEntityRef(reader.Name); } } charactersWritten += Write(quote); return charactersWritten; } // Append whitespace, ensuring there is at least one space. internal int AppendRequiredWhiteSpace(int fromLineNumber, int fromLinePosition, int toLineNumber, int toLinePosition) { int charactersWritten = AppendWhiteSpace(fromLineNumber, fromLinePosition, toLineNumber, toLinePosition); if (charactersWritten == 0) { charactersWritten += AppendSpace(); } return charactersWritten; } // Append whitespce internal int AppendWhiteSpace(int fromLineNumber, int fromLinePosition, int toLineNumber, int toLinePosition) { int charactersWritten = 0; while (fromLineNumber++ < toLineNumber) { charactersWritten += AppendNewLine(); fromLinePosition = 1; } charactersWritten += AppendSpaces(toLinePosition - fromLinePosition); return charactersWritten; } // // Append indent // linePosition - starting line position // indent - number of spaces to indent each unit of depth // depth - depth to indent // newLine - insert new line before indent? // internal int AppendIndent(int linePosition, int indent, int depth, bool newLine) { int charactersWritten = 0; if (newLine) { charactersWritten += AppendNewLine(); } int c = (linePosition - 1) + (indent * depth); charactersWritten += AppendSpaces(c); return charactersWritten; } // // AppendSpacesToLinePosition // // Write spaces up to the line position, taking into account the // current line position of the writer. // internal int AppendSpacesToLinePosition(int linePosition) { Debug.Assert(_trackPosition, "_trackPosition"); if (linePosition <= 0) { return 0; } int delta = linePosition - _linePosition; if (delta < 0 && IsLastLineBlank) { SeekToLineStart(); } return AppendSpaces(linePosition - _linePosition); } // // Append a new line // internal int AppendNewLine() { return Write(NL); } // // AppendSpaces // // Write spaces to the writer provided. Since we do not want waste // memory by allocating do not use "new String(' ', count)". // internal int AppendSpaces(int count) { int c = count; while (c > 0) { if (c >= 8) { Write(SPACES_8); c -= 8; } else if (c >= 4) { Write(SPACES_4); c -= 4; } else if (c >= 2) { Write(SPACES_2); c -= 2; } else { Write(SPACE); break; } } return (count > 0) ? count : 0; } // // Append a single space character // internal int AppendSpace() { return Write(SPACE); } // // Reset the stream to the beginning of the current blank line. // internal void SeekToLineStart() { Debug.Assert(_isLastLineBlank, "_isLastLineBlank"); RestoreStreamCheckpoint(_lineStartCheckpoint); } // Create a checkpoint that can be restored with RestoreStreamCheckpoint(). internal object CreateStreamCheckpoint() { return new StreamWriterCheckpoint(this); } // Restore the writer state that was recorded with CreateStreamCheckpoint(). internal void RestoreStreamCheckpoint(object o) { StreamWriterCheckpoint checkpoint = (StreamWriterCheckpoint) o; Flush(); _lineNumber = checkpoint._lineNumber; _linePosition = checkpoint._linePosition; _isLastLineBlank = checkpoint._isLastLineBlank; _baseStream.Seek(checkpoint._streamPosition, SeekOrigin.Begin); _baseStream.SetLength(checkpoint._streamLength); _baseStream.Flush(); } // Class that contains the state of the writer and its underlying stream. private class StreamWriterCheckpoint { internal int _lineNumber; // line number internal int _linePosition; // line position internal bool _isLastLineBlank; // is the last line blank? internal long _streamLength; // length of the stream internal long _streamPosition; // position of the stream pointer internal StreamWriterCheckpoint(XmlUtilWriter writer) { writer.Flush(); _lineNumber = writer._lineNumber; _linePosition = writer._linePosition; _isLastLineBlank = writer._isLastLineBlank; writer._baseStream.Flush(); _streamPosition = writer._baseStream.Position; _streamLength = writer._baseStream.Length; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Configuration { using System.Configuration.Internal; using System.Collections; using System.Collections.Specialized; using System.Collections.Generic; using System.Configuration; using System.Globalization; using System.IO; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using System.Text; using System.Xml; using System.Net; // // A utility class for writing XML to a TextWriter. // // When this class is used to copy an XML document that may include a " 0xFFFD)) { appendCharEntity = true; } else { switch (ch) { case '<': entityRef = "lt"; break; case '>': entityRef = "gt"; break; case '&': entityRef = "amp"; break; case '\'': if (inAttribute && quoteChar == ch) { entityRef = "apos"; } break; case '"': if (inAttribute && quoteChar == ch) { entityRef = "quot"; } break; case '\n': case '\r': appendCharEntity = inAttribute; break; default: break; } } if (appendCharEntity) { charactersWritten += AppendCharEntity(ch); } else if (entityRef != null) { charactersWritten += AppendEntityRef(entityRef); } else { charactersWritten += Write(ch); } } return charactersWritten; } internal int AppendEntityRef(string entityRef) { Write('&'); Write(entityRef); Write(';'); return entityRef.Length + 2; } internal int AppendCharEntity(char ch) { string numberToWrite = ((int)ch).ToString("X", CultureInfo.InvariantCulture); Write('&'); Write('#'); Write('x'); Write(numberToWrite); Write(';'); return numberToWrite.Length + 4; } internal int AppendCData(string cdata) { Write(""); return cdata.Length + 12; } internal int AppendProcessingInstruction(string name, string value) { Write(""); Write(name); AppendSpace(); Write(value); Write("?>"); return name.Length + value.Length + 5; } internal int AppendComment(string comment) { Write(""); return comment.Length + 7; } internal int AppendAttributeValue(XmlTextReader reader) { int charactersWritten = 0; char quote = reader.QuoteChar; // // In !DOCTYPE, quote is '\0' for second public attribute. // Protect ourselves from writing invalid XML by always // supplying a valid quote char. // if (quote != '"' && quote != '\'') { quote = '"'; } charactersWritten += Write(quote); while (reader.ReadAttributeValue()) { if (reader.NodeType == XmlNodeType.Text) { charactersWritten += AppendEscapeXmlString(reader.Value, true, quote); } else { charactersWritten += AppendEntityRef(reader.Name); } } charactersWritten += Write(quote); return charactersWritten; } // Append whitespace, ensuring there is at least one space. internal int AppendRequiredWhiteSpace(int fromLineNumber, int fromLinePosition, int toLineNumber, int toLinePosition) { int charactersWritten = AppendWhiteSpace(fromLineNumber, fromLinePosition, toLineNumber, toLinePosition); if (charactersWritten == 0) { charactersWritten += AppendSpace(); } return charactersWritten; } // Append whitespce internal int AppendWhiteSpace(int fromLineNumber, int fromLinePosition, int toLineNumber, int toLinePosition) { int charactersWritten = 0; while (fromLineNumber++ < toLineNumber) { charactersWritten += AppendNewLine(); fromLinePosition = 1; } charactersWritten += AppendSpaces(toLinePosition - fromLinePosition); return charactersWritten; } // // Append indent // linePosition - starting line position // indent - number of spaces to indent each unit of depth // depth - depth to indent // newLine - insert new line before indent? // internal int AppendIndent(int linePosition, int indent, int depth, bool newLine) { int charactersWritten = 0; if (newLine) { charactersWritten += AppendNewLine(); } int c = (linePosition - 1) + (indent * depth); charactersWritten += AppendSpaces(c); return charactersWritten; } // // AppendSpacesToLinePosition // // Write spaces up to the line position, taking into account the // current line position of the writer. // internal int AppendSpacesToLinePosition(int linePosition) { Debug.Assert(_trackPosition, "_trackPosition"); if (linePosition <= 0) { return 0; } int delta = linePosition - _linePosition; if (delta < 0 && IsLastLineBlank) { SeekToLineStart(); } return AppendSpaces(linePosition - _linePosition); } // // Append a new line // internal int AppendNewLine() { return Write(NL); } // // AppendSpaces // // Write spaces to the writer provided. Since we do not want waste // memory by allocating do not use "new String(' ', count)". // internal int AppendSpaces(int count) { int c = count; while (c > 0) { if (c >= 8) { Write(SPACES_8); c -= 8; } else if (c >= 4) { Write(SPACES_4); c -= 4; } else if (c >= 2) { Write(SPACES_2); c -= 2; } else { Write(SPACE); break; } } return (count > 0) ? count : 0; } // // Append a single space character // internal int AppendSpace() { return Write(SPACE); } // // Reset the stream to the beginning of the current blank line. // internal void SeekToLineStart() { Debug.Assert(_isLastLineBlank, "_isLastLineBlank"); RestoreStreamCheckpoint(_lineStartCheckpoint); } // Create a checkpoint that can be restored with RestoreStreamCheckpoint(). internal object CreateStreamCheckpoint() { return new StreamWriterCheckpoint(this); } // Restore the writer state that was recorded with CreateStreamCheckpoint(). internal void RestoreStreamCheckpoint(object o) { StreamWriterCheckpoint checkpoint = (StreamWriterCheckpoint) o; Flush(); _lineNumber = checkpoint._lineNumber; _linePosition = checkpoint._linePosition; _isLastLineBlank = checkpoint._isLastLineBlank; _baseStream.Seek(checkpoint._streamPosition, SeekOrigin.Begin); _baseStream.SetLength(checkpoint._streamLength); _baseStream.Flush(); } // Class that contains the state of the writer and its underlying stream. private class StreamWriterCheckpoint { internal int _lineNumber; // line number internal int _linePosition; // line position internal bool _isLastLineBlank; // is the last line blank? internal long _streamLength; // length of the stream internal long _streamPosition; // position of the stream pointer internal StreamWriterCheckpoint(XmlUtilWriter writer) { writer.Flush(); _lineNumber = writer._lineNumber; _linePosition = writer._linePosition; _isLastLineBlank = writer._isLastLineBlank; writer._baseStream.Flush(); _streamPosition = writer._baseStream.Position; _streamLength = writer._baseStream.Length; } } } } // 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
- ProfileProvider.cs
- XmlNodeList.cs
- DataTable.cs
- _DigestClient.cs
- AccessDataSourceWizardForm.cs
- AssemblyBuilderData.cs
- UserControlDocumentDesigner.cs
- PixelFormat.cs
- ServerIdentity.cs
- DragSelectionMessageFilter.cs
- LineServicesRun.cs
- ValuePattern.cs
- HttpProfileBase.cs
- InvalidPrinterException.cs
- MouseCaptureWithinProperty.cs
- Span.cs
- WebBrowserNavigatingEventHandler.cs
- TextDecorationCollection.cs
- CodeIdentifiers.cs
- DesignTimeDataBinding.cs
- ChtmlTextBoxAdapter.cs
- BindingSourceDesigner.cs
- DbCommandDefinition.cs
- NonVisualControlAttribute.cs
- ScrollableControl.cs
- DeadCharTextComposition.cs
- WsdlParser.cs
- NavigationProgressEventArgs.cs
- WindowShowOrOpenTracker.cs
- HttpListenerPrefixCollection.cs
- XpsResource.cs
- SerializationAttributes.cs
- SignedXml.cs
- LowerCaseStringConverter.cs
- GridViewUpdateEventArgs.cs
- UserMapPath.cs
- LinkArea.cs
- FixedTextContainer.cs
- MaskInputRejectedEventArgs.cs
- TreeNode.cs
- OutputScopeManager.cs
- Descriptor.cs
- CurrencyWrapper.cs
- AuthorizationRule.cs
- SmtpAuthenticationManager.cs
- BaseAsyncResult.cs
- CacheAxisQuery.cs
- TrackingAnnotationCollection.cs
- ToolStripContentPanelRenderEventArgs.cs
- RouteUrlExpressionBuilder.cs
- VectorConverter.cs
- TypeElement.cs
- Transform3DGroup.cs
- DataGridBoolColumn.cs
- MailHeaderInfo.cs
- UserNameSecurityTokenParameters.cs
- BasicExpandProvider.cs
- SqlDataSourceSelectingEventArgs.cs
- PolicyStatement.cs
- WebControlParameterProxy.cs
- DataSourceGroupCollection.cs
- DiagnosticsConfigurationHandler.cs
- RadioButtonPopupAdapter.cs
- ReadContentAsBinaryHelper.cs
- XmlILIndex.cs
- CommandValueSerializer.cs
- WindowsFormsHostAutomationPeer.cs
- SafeFileMapViewHandle.cs
- DoubleLinkList.cs
- Typography.cs
- WebCategoryAttribute.cs
- TrustManagerMoreInformation.cs
- ApplicationDirectory.cs
- TextDpi.cs
- MetadataArtifactLoaderXmlReaderWrapper.cs
- FileDataSource.cs
- TreeViewEvent.cs
- MethodCallTranslator.cs
- SQLDecimal.cs
- TdsValueSetter.cs
- AnnouncementClient.cs
- PeerCustomResolverBindingElement.cs
- SerializationInfo.cs
- RoleGroupCollectionEditor.cs
- BindingEditor.xaml.cs
- EdgeProfileValidation.cs
- DesignerAttribute.cs
- BinaryFormatter.cs
- TextEvent.cs
- FileSystemEventArgs.cs
- ThousandthOfEmRealPoints.cs
- VisualStyleTypesAndProperties.cs
- XhtmlBasicTextBoxAdapter.cs
- TdsValueSetter.cs
- MouseGestureValueSerializer.cs
- FixedPageAutomationPeer.cs
- ThreadStateException.cs
- MatrixUtil.cs
- RSAProtectedConfigurationProvider.cs
- MimeTypeMapper.cs