Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Xml / System / Xml / Core / XmlTextEncoder.cs / 1305376 / XmlTextEncoder.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
using System;
using System.IO;
using System.Text;
using System.Diagnostics;
using System.Globalization;
namespace System.Xml {
// XmlTextEncoder
//
// This class does special handling of text content for XML. For example
// it will replace special characters with entities whenever necessary.
internal class XmlTextEncoder {
//
// Fields
//
// output text writer
TextWriter textWriter;
// true when writing out the content of attribute value
bool inAttribute;
// quote char of the attribute (when inAttribute)
char quoteChar;
// caching of attribute value
StringBuilder attrValue;
bool cacheAttrValue;
// XmlCharType
XmlCharType xmlCharType;
//
// Constructor
//
internal XmlTextEncoder( TextWriter textWriter ) {
this.textWriter = textWriter;
this.quoteChar = '"';
this.xmlCharType = XmlCharType.Instance;
}
//
// Internal methods and properties
//
internal char QuoteChar {
set {
this.quoteChar = value;
}
}
internal void StartAttribute( bool cacheAttrValue ) {
this.inAttribute = true;
this.cacheAttrValue = cacheAttrValue;
if ( cacheAttrValue ) {
if ( attrValue == null ) {
attrValue = new StringBuilder();
}
else {
attrValue.Length = 0;
}
}
}
internal void EndAttribute() {
if ( cacheAttrValue ) {
attrValue.Length = 0;
}
this.inAttribute = false;
this.cacheAttrValue = false;
}
internal string AttributeValue {
get {
if ( cacheAttrValue ) {
return attrValue.ToString();
}
else {
return String.Empty;
}
}
}
internal void WriteSurrogateChar( char lowChar, char highChar ) {
if ( !XmlCharType.IsLowSurrogate(lowChar) ||
!XmlCharType.IsHighSurrogate( highChar ) ) {
throw XmlConvert.CreateInvalidSurrogatePairException( lowChar, highChar );
}
textWriter.Write( highChar );
textWriter.Write( lowChar );
}
internal void Write( char[] array, int offset, int count ) {
if ( null == array ) {
throw new ArgumentNullException("array");
}
if ( 0 > offset ) {
throw new ArgumentOutOfRangeException("offset");
}
if ( 0 > count ) {
throw new ArgumentOutOfRangeException("count");
}
if ( count > array.Length - offset ) {
throw new ArgumentOutOfRangeException("count");
}
if ( cacheAttrValue ) {
attrValue.Append( array, offset, count );
}
int endPos = offset + count;
int i = offset;
char ch = (char)0;
for (;;) {
int startPos = i;
unsafe {
while ( i < endPos && ( xmlCharType.charProperties[ch = array[i]] & XmlCharType.fAttrValue ) != 0 ) { // ( xmlCharType.IsAttributeValueChar( ( ch = array[i] ) ) ) ) {
i++;
}
}
if ( startPos < i ) {
textWriter.Write( array, startPos, i - startPos );
}
if ( i == endPos ) {
break;
}
switch ( ch ) {
case (char)0x9:
textWriter.Write( ch );
break;
case (char)0xA:
case (char)0xD:
if ( inAttribute ) {
WriteCharEntityImpl( ch );
}
else {
textWriter.Write( ch );
}
break;
case '<':
WriteEntityRefImpl( "lt" );
break;
case '>':
WriteEntityRefImpl( "gt" );
break;
case '&':
WriteEntityRefImpl( "amp" );
break;
case '\'':
if ( inAttribute && quoteChar == ch ) {
WriteEntityRefImpl( "apos" );
}
else {
textWriter.Write( '\'' );
}
break;
case '"':
if ( inAttribute && quoteChar == ch ) {
WriteEntityRefImpl( "quot" );
}
else {
textWriter.Write( '"' );
}
break;
default:
if ( XmlCharType.IsHighSurrogate( ch ) ) {
if ( i + 1 < endPos ) {
WriteSurrogateChar( array[++i], ch );
}
else {
throw new ArgumentException( Res.GetString( Res.Xml_SurrogatePairSplit ) );
}
}
else if ( XmlCharType.IsLowSurrogate( ch ) ) {
throw XmlConvert.CreateInvalidHighSurrogateCharException( ch );
}
else {
Debug.Assert( ( ch < 0x20 && !xmlCharType.IsWhiteSpace( ch ) ) || ( ch > 0xFFFD ) );
WriteCharEntityImpl( ch );
}
break;
}
i++;
}
}
internal void WriteSurrogateCharEntity( char lowChar, char highChar ) {
if ( !XmlCharType.IsLowSurrogate( lowChar ) ||
!XmlCharType.IsHighSurrogate( highChar ) ) {
throw XmlConvert.CreateInvalidSurrogatePairException( lowChar, highChar );
}
int surrogateChar = XmlCharType.CombineSurrogateChar( lowChar, highChar );
if ( cacheAttrValue ) {
attrValue.Append( highChar );
attrValue.Append( lowChar );
}
textWriter.Write( "" );
textWriter.Write( surrogateChar.ToString( "X", NumberFormatInfo.InvariantInfo ) );
textWriter.Write( ';' );
}
internal void Write( string text ) {
if ( text == null ) {
return;
}
if ( cacheAttrValue ) {
attrValue.Append( text );
}
// scan through the string to see if there are any characters to be escaped
int len = text.Length;
int i = 0;
int startPos = 0;
char ch = (char)0;
for (;;) {
unsafe {
while ( i < len && ( xmlCharType.charProperties[ch = text[i]] & XmlCharType.fAttrValue ) != 0 ) { // ( xmlCharType.IsAttributeValueChar( ( ch = text[i] ) ) ) ) {
i++;
}
}
if ( i == len ) {
// reached the end of the string -> write it whole out
textWriter.Write( text );
return;
}
if ( inAttribute ) {
if ( ch == 0x9 ) {
i++;
continue;
}
}
else {
if ( ch == 0x9 || ch == 0xA || ch == 0xD || ch == '"' || ch == '\'' ) {
i++;
continue;
}
}
// some character that needs to be escaped is found:
break;
}
char[] helperBuffer = new char[256];
for (;;) {
if ( startPos < i ) {
WriteStringFragment( text, startPos, i - startPos, helperBuffer );
}
if ( i == len ) {
break;
}
switch ( ch ) {
case (char)0x9:
textWriter.Write( ch );
break;
case (char)0xA:
case (char)0xD:
if ( inAttribute ) {
WriteCharEntityImpl( ch );
}
else {
textWriter.Write( ch );
}
break;
case '<':
WriteEntityRefImpl( "lt" );
break;
case '>':
WriteEntityRefImpl( "gt" );
break;
case '&':
WriteEntityRefImpl( "amp" );
break;
case '\'':
if ( inAttribute && quoteChar == ch ) {
WriteEntityRefImpl( "apos" );
}
else {
textWriter.Write( '\'' );
}
break;
case '"':
if ( inAttribute && quoteChar == ch ) {
WriteEntityRefImpl( "quot" );
}
else {
textWriter.Write( '"' );
}
break;
default:
if ( XmlCharType.IsHighSurrogate( ch ) ) {
if ( i + 1 < len ) {
WriteSurrogateChar( text[++i], ch );
}
else {
throw XmlConvert.CreateInvalidSurrogatePairException( text[i], ch );
}
}
else if ( XmlCharType.IsLowSurrogate( ch ) ) {
throw XmlConvert.CreateInvalidHighSurrogateCharException( ch );
}
else {
Debug.Assert( ( ch < 0x20 && !xmlCharType.IsWhiteSpace( ch ) ) || ( ch > 0xFFFD ) );
WriteCharEntityImpl( ch );
}
break;
}
i++;
startPos = i;
unsafe {
while ( i < len && ( xmlCharType.charProperties[ch = text[i]] & XmlCharType.fAttrValue ) != 0 ) { // ( xmlCharType.IsAttributeValueChar( ( text[i] ) ) ) ) {
i++;
}
}
}
}
internal void WriteRawWithSurrogateChecking( string text ) {
if ( text == null ) {
return;
}
if ( cacheAttrValue ) {
attrValue.Append( text );
}
int len = text.Length;
int i = 0;
char ch = (char)0;
for (;;) {
unsafe {
while ( i < len &&
( ( xmlCharType.charProperties[ch = text[i]] & XmlCharType.fCharData ) != 0 // ( xmlCharType.IsCharData( ( ch = text[i] ) )
|| ch < 0x20 ) ) {
i++;
}
}
if ( i == len ) {
break;
}
if ( XmlCharType.IsHighSurrogate( ch ) ) {
if ( i + 1 < len ) {
char lowChar = text[i+1];
if ( XmlCharType.IsLowSurrogate( lowChar ) ) {
i += 2;
continue;
}
else {
throw XmlConvert.CreateInvalidSurrogatePairException( lowChar, ch );
}
}
throw new ArgumentException( Res.GetString( Res.Xml_InvalidSurrogateMissingLowChar ) );
}
else if ( XmlCharType.IsLowSurrogate( ch ) ) {
throw XmlConvert.CreateInvalidHighSurrogateCharException( ch );
}
else {
i++;
}
}
textWriter.Write( text );
return;
}
internal void WriteRaw( string value ) {
if ( cacheAttrValue ) {
attrValue.Append( value );
}
textWriter.Write( value );
}
internal void WriteRaw( char[] array, int offset, int count ) {
if ( null == array ) {
throw new ArgumentNullException("array");
}
if ( 0 > count ) {
throw new ArgumentOutOfRangeException("count");
}
if ( 0 > offset ) {
throw new ArgumentOutOfRangeException("offset");
}
if ( count > array.Length - offset ) {
throw new ArgumentOutOfRangeException("count");
}
if ( cacheAttrValue ) {
attrValue.Append( array, offset, count );
}
textWriter.Write( array, offset, count );
}
internal void WriteCharEntity( char ch ) {
if ( XmlCharType.IsSurrogate(ch) ) {
throw new ArgumentException( Res.GetString( Res.Xml_InvalidSurrogateMissingLowChar ) );
}
string strVal = ((int)ch).ToString( "X", NumberFormatInfo.InvariantInfo );
if ( cacheAttrValue ) {
attrValue.Append( "" );
attrValue.Append( strVal );
attrValue.Append( ';' );
}
WriteCharEntityImpl( strVal );
}
internal void WriteEntityRef( string name ) {
if ( cacheAttrValue ) {
attrValue.Append( '&' );
attrValue.Append( name );
attrValue.Append( ';' );
}
WriteEntityRefImpl( name );
}
internal void Flush() {
//
}
//
// Private implementation methods
//
// This is a helper method to woraround the fact that TextWriter does not have a Write method
// for fragment of a string such as Write( string, offset, count).
// The string fragment will be written out by copying into a small helper buffer and then
// calling textWriter to write out the buffer.
private void WriteStringFragment( string str, int offset, int count, char[] helperBuffer ) {
int bufferSize = helperBuffer.Length;
while ( count > 0 ) {
int copyCount = count;
if ( copyCount > bufferSize ) {
copyCount = bufferSize;
}
str.CopyTo( offset, helperBuffer, 0, copyCount );
textWriter.Write( helperBuffer, 0, copyCount );
offset += copyCount;
count -= copyCount;
}
}
private void WriteCharEntityImpl( char ch ) {
WriteCharEntityImpl( ((int)ch).ToString( "X", NumberFormatInfo.InvariantInfo ) );
}
private void WriteCharEntityImpl( string strVal ) {
textWriter.Write( "" );
textWriter.Write( strVal );
textWriter.Write( ';' );
}
private void WriteEntityRefImpl( string name ) {
textWriter.Write( '&' );
textWriter.Write( name );
textWriter.Write( ';' );
}
}
}
// 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
- KeyPressEvent.cs
- MemberCollection.cs
- OracleConnectionString.cs
- ZipIOExtraFieldElement.cs
- ListManagerBindingsCollection.cs
- DbReferenceCollection.cs
- MdiWindowListItemConverter.cs
- CodeVariableReferenceExpression.cs
- PersonalizationStateInfo.cs
- Header.cs
- TypeUnloadedException.cs
- BitmapData.cs
- FlowLayoutPanelDesigner.cs
- MouseCaptureWithinProperty.cs
- EntryPointNotFoundException.cs
- CacheEntry.cs
- QilXmlWriter.cs
- Literal.cs
- XmlEntity.cs
- httpstaticobjectscollection.cs
- InvalidAsynchronousStateException.cs
- ToolStripDropDownClosingEventArgs.cs
- XmlValidatingReaderImpl.cs
- newinstructionaction.cs
- FixedSchema.cs
- HttpClientCertificate.cs
- RegexTree.cs
- PrintControllerWithStatusDialog.cs
- GenericIdentity.cs
- AnimationClock.cs
- WebServicesSection.cs
- PerformanceCounterPermissionEntryCollection.cs
- Listbox.cs
- PenCursorManager.cs
- RSACryptoServiceProvider.cs
- ConfigurationStrings.cs
- ListViewGroupItemCollection.cs
- PageHandlerFactory.cs
- ImportContext.cs
- DeclaredTypeElement.cs
- HttpWebRequest.cs
- RegularExpressionValidator.cs
- FormatVersion.cs
- MenuCommand.cs
- MexHttpBindingElement.cs
- WebPageTraceListener.cs
- ImageConverter.cs
- Transform.cs
- DataGridViewAdvancedBorderStyle.cs
- NamespaceList.cs
- _UriTypeConverter.cs
- DataSourceXmlTextReader.cs
- ClientFormsIdentity.cs
- PolicyException.cs
- SqlDataSourceConfigureSortForm.cs
- DataMemberConverter.cs
- CssTextWriter.cs
- XmlNode.cs
- GacUtil.cs
- ImageSource.cs
- CurrentTimeZone.cs
- SqlDataSourceConfigureFilterForm.cs
- SystemResourceHost.cs
- AutomationEvent.cs
- Hyperlink.cs
- UriWriter.cs
- ResourceAttributes.cs
- DataGridViewButtonCell.cs
- WinInetCache.cs
- BuildResultCache.cs
- RootBrowserWindowAutomationPeer.cs
- DateTimeValueSerializerContext.cs
- ListItemConverter.cs
- BindingMemberInfo.cs
- FragmentQuery.cs
- SplitContainerDesigner.cs
- ModelFunctionTypeElement.cs
- PersistenceTypeAttribute.cs
- RegexRunner.cs
- FixedSOMPageConstructor.cs
- ScrollViewerAutomationPeer.cs
- OperationCanceledException.cs
- XmlDataSourceView.cs
- RequestCachePolicy.cs
- InvalidOleVariantTypeException.cs
- DataService.cs
- StylusCollection.cs
- SiteIdentityPermission.cs
- RemotingService.cs
- DBConnection.cs
- complextypematerializer.cs
- LinkButton.cs
- ActivatableWorkflowsQueryResult.cs
- OleDbException.cs
- ExtendedProperty.cs
- WsdlHelpGeneratorElement.cs
- sqlser.cs
- Geometry3D.cs
- DataProtectionSecurityStateEncoder.cs
- WindowAutomationPeer.cs