Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / clr / src / BCL / System / Text / EncoderNLS.cs / 1 / EncoderNLS.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== namespace System.Text { using System.Runtime.Serialization; using System.Security.Permissions; using System.Text; using System; // An Encoder is used to encode a sequence of blocks of characters into // a sequence of blocks of bytes. Following instantiation of an encoder, // sequential blocks of characters are converted into blocks of bytes through // calls to the GetBytes method. The encoder maintains state between the // conversions, allowing it to correctly encode character sequences that span // adjacent blocks. // // Instances of specific implementations of the Encoder abstract base // class are typically obtained through calls to the GetEncoder method // of Encoding objects. // [Serializable] internal class EncoderNLS : Encoder, ISerializable { // Need a place for the last left over character, most of our encodings use this internal char charLeftOver; protected Encoding m_encoding; [NonSerialized] protected bool m_mustFlush; [NonSerialized] internal bool m_throwOnOverflow; [NonSerialized] internal int m_charsUsed; #region Serialization // Constructor called by serialization. called during deserialization. internal EncoderNLS(SerializationInfo info, StreamingContext context) { throw new NotSupportedException( String.Format( System.Globalization.CultureInfo.CurrentCulture, Environment.GetResourceString("NotSupported_TypeCannotDeserialized"), this.GetType())); } // ISerializable implementation. called during serialization. [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)] void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { SerializeEncoder(info); info.AddValue("encoding", this.m_encoding); info.AddValue("charLeftOver", this.charLeftOver); info.SetType(typeof(Encoding.DefaultEncoder)); } #endregion Serialization internal EncoderNLS(Encoding encoding) { this.m_encoding = encoding; this.m_fallback = this.m_encoding.EncoderFallback; this.Reset(); } // This one is used when deserializing (like UTF7Encoding.Encoder) internal EncoderNLS() { this.m_encoding = null; this.Reset(); } public override void Reset() { this.charLeftOver = (char)0; if (m_fallbackBuffer != null) m_fallbackBuffer.Reset(); } public override unsafe int GetByteCount(char[] chars, int index, int count, bool flush) { // Validate input parameters if (chars == null) throw new ArgumentNullException( "chars", Environment.GetResourceString("ArgumentNull_Array")); if (index < 0 || count < 0) throw new ArgumentOutOfRangeException((index<0 ? "index" : "count"), Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); if (chars.Length - index < count) throw new ArgumentOutOfRangeException("chars", Environment.GetResourceString("ArgumentOutOfRange_IndexCountBuffer")); // Avoid empty input problem if (chars.Length == 0) chars = new char[1]; // Just call the pointer version int result = -1; fixed (char* pChars = chars) { result = GetByteCount(pChars + index, count, flush); } return result; } public unsafe override int GetByteCount(char* chars, int count, bool flush) { // Validate input parameters if (chars == null) throw new ArgumentNullException( "chars", Environment.GetResourceString("ArgumentNull_Array")); if (count < 0) throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); this.m_mustFlush = flush; this.m_throwOnOverflow = true; return m_encoding.GetByteCount(chars, count, this); } public override unsafe int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex, bool flush) { // Validate parameters if (chars == null || bytes == null) throw new ArgumentNullException((chars == null ? "chars" : "bytes"), Environment.GetResourceString("ArgumentNull_Array")); if (charIndex < 0 || charCount < 0) throw new ArgumentOutOfRangeException((charIndex<0 ? "charIndex" : "charCount"), Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); if (chars.Length - charIndex < charCount) throw new ArgumentOutOfRangeException("chars", Environment.GetResourceString("ArgumentOutOfRange_IndexCountBuffer")); if (byteIndex < 0 || byteIndex > bytes.Length) throw new ArgumentOutOfRangeException("byteIndex", Environment.GetResourceString("ArgumentOutOfRange_Index")); if (chars.Length == 0) chars = new char[1]; int byteCount = bytes.Length - byteIndex; if (bytes.Length == 0) bytes = new byte[1]; // Just call pointer version fixed (char* pChars = chars) fixed (byte* pBytes = bytes) // Remember that charCount is # to decode, not size of array. return GetBytes(pChars + charIndex, charCount, pBytes + byteIndex, byteCount, flush); } public unsafe override int GetBytes(char* chars, int charCount, byte* bytes, int byteCount, bool flush) { // Validate parameters if (chars == null || bytes == null) throw new ArgumentNullException((chars == null ? "chars" : "bytes"), Environment.GetResourceString("ArgumentNull_Array")); if (byteCount < 0 || charCount < 0) throw new ArgumentOutOfRangeException((byteCount<0 ? "byteCount" : "charCount"), Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); this.m_mustFlush = flush; this.m_throwOnOverflow = true; return m_encoding.GetBytes(chars, charCount, bytes, byteCount, this); } // This method is used when your output buffer might not be large enough for the entire result. // Just call the pointer version. (This gets bytes) public override unsafe void Convert(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex, int byteCount, bool flush, out int charsUsed, out int bytesUsed, out bool completed) { // Validate parameters if (chars == null || bytes == null) throw new ArgumentNullException((chars == null ? "chars" : "bytes"), Environment.GetResourceString("ArgumentNull_Array")); if (charIndex < 0 || charCount < 0) throw new ArgumentOutOfRangeException((charIndex<0 ? "charIndex" : "charCount"), Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); if (byteIndex < 0 || byteCount < 0) throw new ArgumentOutOfRangeException((byteIndex<0 ? "byteIndex" : "byteCount"), Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); if (chars.Length - charIndex < charCount) throw new ArgumentOutOfRangeException("chars", Environment.GetResourceString("ArgumentOutOfRange_IndexCountBuffer")); if (bytes.Length - byteIndex < byteCount) throw new ArgumentOutOfRangeException("bytes", Environment.GetResourceString("ArgumentOutOfRange_IndexCountBuffer")); // Avoid empty input problem if (chars.Length == 0) chars = new char[1]; if (bytes.Length == 0) bytes = new byte[1]; // Just call the pointer version (can't do this for non-msft encoders) fixed (char* pChars = chars) { fixed (byte* pBytes = bytes) { Convert(pChars + charIndex, charCount, pBytes + byteIndex, byteCount, flush, out charsUsed, out bytesUsed, out completed); } } } // This is the version that uses pointers. We call the base encoding worker function // after setting our appropriate internal variables. This is getting bytes public override unsafe void Convert(char* chars, int charCount, byte* bytes, int byteCount, bool flush, out int charsUsed, out int bytesUsed, out bool completed) { // Validate input parameters if (bytes == null || chars == null) throw new ArgumentNullException(bytes == null ? "bytes" : "chars", Environment.GetResourceString("ArgumentNull_Array")); if (charCount < 0 || byteCount < 0) throw new ArgumentOutOfRangeException((charCount<0 ? "charCount" : "byteCount"), Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); // We don't want to throw this.m_mustFlush = flush; this.m_throwOnOverflow = false; this.m_charsUsed = 0; // Do conversion bytesUsed = this.m_encoding.GetBytes(chars, charCount, bytes, byteCount, this); charsUsed = this.m_charsUsed; // Its completed if they've used what they wanted AND if they didn't want flush or if we are flushed completed = (charsUsed == charCount) && (!flush || !this.HasState) && (m_fallbackBuffer == null || m_fallbackBuffer.Remaining == 0); // Our data thingys are now full, we can return } public Encoding Encoding { get { return m_encoding; } } public bool MustFlush { get { return m_mustFlush; } } // Anything left in our encoder? internal virtual bool HasState { get { return (this.charLeftOver != (char)0); } } // Allow encoding to clear our must flush instead of throwing (in ThrowBytesOverflow) internal void ClearMustFlush() { m_mustFlush = false; } } }
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- CaseKeyBox.xaml.cs
- Authorization.cs
- SafeNativeMethods.cs
- FastPropertyAccessor.cs
- InternalBufferOverflowException.cs
- AccessDataSourceView.cs
- PropertyChangeTracker.cs
- DynamicPropertyHolder.cs
- CategoryAttribute.cs
- FormView.cs
- XmlSchemaComplexContentExtension.cs
- SizeIndependentAnimationStorage.cs
- XPathBuilder.cs
- ProfilePropertySettings.cs
- RuleSettingsCollection.cs
- InplaceBitmapMetadataWriter.cs
- ProfileBuildProvider.cs
- PropertyCondition.cs
- SqlMethodTransformer.cs
- SqlRemoveConstantOrderBy.cs
- PasswordTextNavigator.cs
- MasterPage.cs
- ErrorFormatterPage.cs
- IxmlLineInfo.cs
- XamlVector3DCollectionSerializer.cs
- WindowsTitleBar.cs
- ISFClipboardData.cs
- LongCountAggregationOperator.cs
- NetworkInformationException.cs
- PasswordBoxAutomationPeer.cs
- WebReferenceOptions.cs
- ProtocolsConfigurationHandler.cs
- ZipIOExtraFieldZip64Element.cs
- ResourceExpressionEditorSheet.cs
- ClientCredentialsSecurityTokenManager.cs
- ImageFormat.cs
- SerTrace.cs
- MethodExpr.cs
- XamlSerializer.cs
- XPathQilFactory.cs
- ConnectionOrientedTransportElement.cs
- GPStream.cs
- AttachmentCollection.cs
- DataRowChangeEvent.cs
- SchemaElement.cs
- GacUtil.cs
- ClassicBorderDecorator.cs
- ToolStripSettings.cs
- FrameworkReadOnlyPropertyMetadata.cs
- ChildChangedEventArgs.cs
- TransportBindingElementImporter.cs
- SoapTypeAttribute.cs
- PropertyValueEditor.cs
- Material.cs
- WindowsFormsLinkLabel.cs
- AutomationPeer.cs
- ObjectQueryExecutionPlan.cs
- followingsibling.cs
- LinqDataSourceDeleteEventArgs.cs
- SimpleApplicationHost.cs
- HttpPostedFileBase.cs
- InvalidPropValue.cs
- MetadataItemEmitter.cs
- UnsafeNativeMethods.cs
- ExpressionDumper.cs
- DataControlPagerLinkButton.cs
- ListenerUnsafeNativeMethods.cs
- DLinqDataModelProvider.cs
- SelectionBorderGlyph.cs
- SimpleHandlerBuildProvider.cs
- DataGridViewSortCompareEventArgs.cs
- UrlMapping.cs
- ScalarRestriction.cs
- XmlFileEditor.cs
- SqlGenericUtil.cs
- XmlSchemaSimpleContent.cs
- CodeCatchClause.cs
- ChannelManager.cs
- Thread.cs
- SliderAutomationPeer.cs
- TextEditorSpelling.cs
- StronglyTypedResourceBuilder.cs
- Serializer.cs
- StyleBamlRecordReader.cs
- RawStylusInputReport.cs
- EventLogReader.cs
- SQLSingle.cs
- SqlDeflator.cs
- DbProviderConfigurationHandler.cs
- GridLength.cs
- ThemeableAttribute.cs
- FirstQueryOperator.cs
- cache.cs
- Publisher.cs
- DataControlField.cs
- ArrayWithOffset.cs
- DropDownHolder.cs
- OleDbRowUpdatingEvent.cs
- GreenMethods.cs
- StorageModelBuildProvider.cs