Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / clr / src / BCL / System / Text / EncoderNLS.cs / 2 / 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; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DiagnosticsConfiguration.cs
- FacetDescription.cs
- IdnElement.cs
- TdsRecordBufferSetter.cs
- XmlSchemaAppInfo.cs
- CachedBitmap.cs
- ChildChangedEventArgs.cs
- ResumeStoryboard.cs
- KnownTypesProvider.cs
- CodeAttributeDeclarationCollection.cs
- TemplateComponentConnector.cs
- GenericTypeParameterBuilder.cs
- Automation.cs
- ContentValidator.cs
- XmlEntity.cs
- ProjectionPath.cs
- DataGridLinkButton.cs
- DynamicActivity.cs
- DrawToolTipEventArgs.cs
- OciHandle.cs
- Soap.cs
- UnSafeCharBuffer.cs
- BevelBitmapEffect.cs
- infer.cs
- AnnouncementService.cs
- CaseStatementSlot.cs
- TableParaClient.cs
- StylusEditingBehavior.cs
- ArithmeticException.cs
- DocumentXmlWriter.cs
- InheritablePropertyChangeInfo.cs
- ExpressionBindingCollection.cs
- WebConfigurationHostFileChange.cs
- LookupBindingPropertiesAttribute.cs
- XmlDocument.cs
- TextBlock.cs
- ObjectDataSourceSelectingEventArgs.cs
- Thumb.cs
- CheckBoxBaseAdapter.cs
- CodeExporter.cs
- XsltException.cs
- SignedInfo.cs
- ParserContext.cs
- JsonStringDataContract.cs
- OperationCanceledException.cs
- DataServiceRequestOfT.cs
- StrongNameMembershipCondition.cs
- CollectionView.cs
- SmtpException.cs
- XmlWellformedWriterHelpers.cs
- EventlogProvider.cs
- PtsHost.cs
- ClientBuildManager.cs
- ProcessProtocolHandler.cs
- StringConverter.cs
- CapabilitiesAssignment.cs
- TextChangedEventArgs.cs
- __ConsoleStream.cs
- JumpPath.cs
- CustomCredentialPolicy.cs
- LambdaCompiler.Statements.cs
- CompositeScriptReference.cs
- PassportAuthentication.cs
- SqlComparer.cs
- StorageScalarPropertyMapping.cs
- RenderingBiasValidation.cs
- ConfigurationPropertyCollection.cs
- BaseCollection.cs
- streamingZipPartStream.cs
- BitmapCodecInfo.cs
- SqlRetyper.cs
- TreeNode.cs
- SqlGenericUtil.cs
- DesignerVerbCollection.cs
- SimpleTypeResolver.cs
- RequiredAttributeAttribute.cs
- WorkflowMarkupSerializationProvider.cs
- PathFigureCollectionValueSerializer.cs
- BoundPropertyEntry.cs
- ScrollItemPatternIdentifiers.cs
- CompositeDataBoundControl.cs
- TextSpanModifier.cs
- TextEditorSelection.cs
- FixedSOMPageConstructor.cs
- OpCodes.cs
- CommandID.cs
- DataGridViewCheckBoxCell.cs
- PlainXmlSerializer.cs
- Propagator.JoinPropagator.cs
- NativeMethods.cs
- basecomparevalidator.cs
- ObjRef.cs
- Int32CollectionValueSerializer.cs
- SmiMetaDataProperty.cs
- _SslStream.cs
- DataGridRow.cs
- ToolStripComboBox.cs
- TextLineBreak.cs
- MainMenu.cs
- ToolStripSeparatorRenderEventArgs.cs