Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / Net / System / Net / Mail / MailWriter.cs / 1 / MailWriter.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Net.Mail
{
using System;
using System.Collections;
using System.IO;
using System.Text;
using System.Collections.Specialized;
using System.Net.Mime;
internal class MailWriter:BaseWriter
{
static byte[] CRLF = new byte[] { (byte)'\r', (byte)'\n' };
static int DefaultLineLength = 78;
Stream contentStream;
bool isInContent;
int lineLength;
EventHandler onCloseHandler;
Stream stream;
BufferBuilder bufferBuilder = new BufferBuilder();
static AsyncCallback onWrite = new AsyncCallback(OnWrite);
///
/// ctor.
///
/// Underlying stream
internal MailWriter(Stream stream) : this(stream, DefaultLineLength)
{
}
///
/// ctor.
///
/// Underlying stream
/// Preferred line length
internal MailWriter(Stream stream, int lineLength)
{
if (stream == null)
throw new ArgumentNullException("stream");
if (lineLength < 0)
throw new ArgumentOutOfRangeException("lineLength");
this.stream = stream;
this.lineLength = lineLength;
this.onCloseHandler = new EventHandler(OnClose);
}
///
/// Closes underlying stream.
///
internal override void Close()
{
//
this.stream.Write(CRLF,0,2);
this.stream.Close();
}
internal IAsyncResult BeginGetContentStream(ContentTransferEncoding contentTransferEncoding, AsyncCallback callback, object state)
{
MultiAsyncResult multiResult = new MultiAsyncResult(this, callback, state);
Stream s = GetContentStream(contentTransferEncoding, multiResult);
if (!(multiResult.Result is Exception))
multiResult.Result = s;
multiResult.CompleteSequence();
return multiResult;
}
internal override IAsyncResult BeginGetContentStream(AsyncCallback callback, object state)
{
return BeginGetContentStream(ContentTransferEncoding.SevenBit, callback, state);
}
internal override Stream EndGetContentStream(IAsyncResult result)
{
object o = MultiAsyncResult.End(result);
if(o is Exception){
throw (Exception) o;
}
return (Stream)o;
}
internal Stream GetContentStream(ContentTransferEncoding contentTransferEncoding)
{
return GetContentStream(contentTransferEncoding, null);
}
internal override Stream GetContentStream()
{
return GetContentStream(ContentTransferEncoding.SevenBit);
}
Stream GetContentStream(ContentTransferEncoding contentTransferEncoding, MultiAsyncResult multiResult)
{
if (this.isInContent)
throw new InvalidOperationException(SR.GetString(SR.MailWriterIsInContent));
this.isInContent = true;
this.bufferBuilder.Append(CRLF);
Flush(multiResult);
Stream stream = this.stream;
if (contentTransferEncoding == ContentTransferEncoding.SevenBit)
stream = new SevenBitStream(stream);
else if (contentTransferEncoding == ContentTransferEncoding.QuotedPrintable)
stream = new QuotedPrintableStream(stream, this.lineLength);
else if (contentTransferEncoding == ContentTransferEncoding.Base64)
stream = new Base64Stream(stream, this.lineLength);
ClosableStream cs = new ClosableStream(stream, this.onCloseHandler);
this.contentStream = cs;
return cs;
}
internal override void WriteHeader(string name, string value)
{
if (name == null)
throw new ArgumentNullException("name");
if (value == null)
throw new ArgumentNullException("value");
if (this.isInContent)
throw new InvalidOperationException(SR.GetString(SR.MailWriterIsInContent));
this.bufferBuilder.Append(name);
this.bufferBuilder.Append(": ");
WriteAndFold(value);//, name.Length + 2);
this.bufferBuilder.Append(CRLF);
}
internal override void WriteHeaders(NameValueCollection headers) {
if (headers == null)
throw new ArgumentNullException("headers");
if (this.isInContent)
throw new InvalidOperationException(SR.GetString(SR.MailWriterIsInContent));
foreach (string key in headers) {
string[] values = headers.GetValues(key);
foreach (string value in values)
WriteHeader(key, value);
}
}
// helper methods
///
/// Called when the current stream is closed. Allows us to
/// prepare for the next message part.
///
/// Sender of the close event
/// Event args (not used)
void OnClose(object sender, EventArgs args)
{
System.Diagnostics.Debug.Assert(this.contentStream == sender);
this.contentStream.Flush();
this.contentStream = null;
}
static void OnWrite(IAsyncResult result)
{
if (!result.CompletedSynchronously)
{
MultiAsyncResult multiResult = (MultiAsyncResult)result.AsyncState;
MailWriter thisPtr = (MailWriter)multiResult.Context;
try
{
thisPtr.stream.EndWrite(result);
multiResult.Leave();
}
catch (Exception e)
{
multiResult.Leave(e);
}
catch {
multiResult.Leave(new Exception(SR.GetString(SR.net_nonClsCompliantException)));
}
}
}
void Flush(MultiAsyncResult multiResult)
{
if (this.bufferBuilder.Length > 0)
{
if (multiResult != null)
{
multiResult.Enter();
IAsyncResult result = this.stream.BeginWrite(this.bufferBuilder.GetBuffer(), 0, this.bufferBuilder.Length, onWrite, multiResult);
if (result.CompletedSynchronously)
{
this.stream.EndWrite(result);
multiResult.Leave();
}
}
else
{
this.stream.Write(this.bufferBuilder.GetBuffer(), 0, this.bufferBuilder.Length);
}
this.bufferBuilder.Reset();
}
}
void WriteAndFold(string value) {
if (value.Length < DefaultLineLength) {
bufferBuilder.Append(value);
return;
}
int i = 0;
int j = value.Length;
//new char[2] { '\t', ' ' }
while (j - i > DefaultLineLength){
int whiteSpace = value.LastIndexOf(' ', i + DefaultLineLength - 1, DefaultLineLength-1);
if (whiteSpace > -1) {
bufferBuilder.Append(value, i, whiteSpace-i);
bufferBuilder.Append(CRLF);
i = whiteSpace;
}
else {
bufferBuilder.Append(value, i, DefaultLineLength);
i += DefaultLineLength;
}
}
if (i < j){
bufferBuilder.Append(value, i, j-i);
}
}
/* old
void WriteAndFold(string value, int startLength)
{
for (int i = 0, l = 0, s = 0; ; i++)
{
if (i == value.Length)
{
if (i - s > 0)
{
this.bufferBuilder.Append(value, s, i - s);
}
break;
}
if (value[i] == ' ' || value[i] == '\t')
{
if (i - s >= this.lineLength - startLength)
{
startLength = 0;
if (l == s)
{
l = i;
}
this.bufferBuilder.Append(value, s, l - s);
this.bufferBuilder.Append(CRLF);
s = l;
}
l = i;
}
}
}
*/
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Net.Mail
{
using System;
using System.Collections;
using System.IO;
using System.Text;
using System.Collections.Specialized;
using System.Net.Mime;
internal class MailWriter:BaseWriter
{
static byte[] CRLF = new byte[] { (byte)'\r', (byte)'\n' };
static int DefaultLineLength = 78;
Stream contentStream;
bool isInContent;
int lineLength;
EventHandler onCloseHandler;
Stream stream;
BufferBuilder bufferBuilder = new BufferBuilder();
static AsyncCallback onWrite = new AsyncCallback(OnWrite);
///
/// ctor.
///
/// Underlying stream
internal MailWriter(Stream stream) : this(stream, DefaultLineLength)
{
}
///
/// ctor.
///
/// Underlying stream
/// Preferred line length
internal MailWriter(Stream stream, int lineLength)
{
if (stream == null)
throw new ArgumentNullException("stream");
if (lineLength < 0)
throw new ArgumentOutOfRangeException("lineLength");
this.stream = stream;
this.lineLength = lineLength;
this.onCloseHandler = new EventHandler(OnClose);
}
///
/// Closes underlying stream.
///
internal override void Close()
{
//
this.stream.Write(CRLF,0,2);
this.stream.Close();
}
internal IAsyncResult BeginGetContentStream(ContentTransferEncoding contentTransferEncoding, AsyncCallback callback, object state)
{
MultiAsyncResult multiResult = new MultiAsyncResult(this, callback, state);
Stream s = GetContentStream(contentTransferEncoding, multiResult);
if (!(multiResult.Result is Exception))
multiResult.Result = s;
multiResult.CompleteSequence();
return multiResult;
}
internal override IAsyncResult BeginGetContentStream(AsyncCallback callback, object state)
{
return BeginGetContentStream(ContentTransferEncoding.SevenBit, callback, state);
}
internal override Stream EndGetContentStream(IAsyncResult result)
{
object o = MultiAsyncResult.End(result);
if(o is Exception){
throw (Exception) o;
}
return (Stream)o;
}
internal Stream GetContentStream(ContentTransferEncoding contentTransferEncoding)
{
return GetContentStream(contentTransferEncoding, null);
}
internal override Stream GetContentStream()
{
return GetContentStream(ContentTransferEncoding.SevenBit);
}
Stream GetContentStream(ContentTransferEncoding contentTransferEncoding, MultiAsyncResult multiResult)
{
if (this.isInContent)
throw new InvalidOperationException(SR.GetString(SR.MailWriterIsInContent));
this.isInContent = true;
this.bufferBuilder.Append(CRLF);
Flush(multiResult);
Stream stream = this.stream;
if (contentTransferEncoding == ContentTransferEncoding.SevenBit)
stream = new SevenBitStream(stream);
else if (contentTransferEncoding == ContentTransferEncoding.QuotedPrintable)
stream = new QuotedPrintableStream(stream, this.lineLength);
else if (contentTransferEncoding == ContentTransferEncoding.Base64)
stream = new Base64Stream(stream, this.lineLength);
ClosableStream cs = new ClosableStream(stream, this.onCloseHandler);
this.contentStream = cs;
return cs;
}
internal override void WriteHeader(string name, string value)
{
if (name == null)
throw new ArgumentNullException("name");
if (value == null)
throw new ArgumentNullException("value");
if (this.isInContent)
throw new InvalidOperationException(SR.GetString(SR.MailWriterIsInContent));
this.bufferBuilder.Append(name);
this.bufferBuilder.Append(": ");
WriteAndFold(value);//, name.Length + 2);
this.bufferBuilder.Append(CRLF);
}
internal override void WriteHeaders(NameValueCollection headers) {
if (headers == null)
throw new ArgumentNullException("headers");
if (this.isInContent)
throw new InvalidOperationException(SR.GetString(SR.MailWriterIsInContent));
foreach (string key in headers) {
string[] values = headers.GetValues(key);
foreach (string value in values)
WriteHeader(key, value);
}
}
// helper methods
///
/// Called when the current stream is closed. Allows us to
/// prepare for the next message part.
///
/// Sender of the close event
/// Event args (not used)
void OnClose(object sender, EventArgs args)
{
System.Diagnostics.Debug.Assert(this.contentStream == sender);
this.contentStream.Flush();
this.contentStream = null;
}
static void OnWrite(IAsyncResult result)
{
if (!result.CompletedSynchronously)
{
MultiAsyncResult multiResult = (MultiAsyncResult)result.AsyncState;
MailWriter thisPtr = (MailWriter)multiResult.Context;
try
{
thisPtr.stream.EndWrite(result);
multiResult.Leave();
}
catch (Exception e)
{
multiResult.Leave(e);
}
catch {
multiResult.Leave(new Exception(SR.GetString(SR.net_nonClsCompliantException)));
}
}
}
void Flush(MultiAsyncResult multiResult)
{
if (this.bufferBuilder.Length > 0)
{
if (multiResult != null)
{
multiResult.Enter();
IAsyncResult result = this.stream.BeginWrite(this.bufferBuilder.GetBuffer(), 0, this.bufferBuilder.Length, onWrite, multiResult);
if (result.CompletedSynchronously)
{
this.stream.EndWrite(result);
multiResult.Leave();
}
}
else
{
this.stream.Write(this.bufferBuilder.GetBuffer(), 0, this.bufferBuilder.Length);
}
this.bufferBuilder.Reset();
}
}
void WriteAndFold(string value) {
if (value.Length < DefaultLineLength) {
bufferBuilder.Append(value);
return;
}
int i = 0;
int j = value.Length;
//new char[2] { '\t', ' ' }
while (j - i > DefaultLineLength){
int whiteSpace = value.LastIndexOf(' ', i + DefaultLineLength - 1, DefaultLineLength-1);
if (whiteSpace > -1) {
bufferBuilder.Append(value, i, whiteSpace-i);
bufferBuilder.Append(CRLF);
i = whiteSpace;
}
else {
bufferBuilder.Append(value, i, DefaultLineLength);
i += DefaultLineLength;
}
}
if (i < j){
bufferBuilder.Append(value, i, j-i);
}
}
/* old
void WriteAndFold(string value, int startLength)
{
for (int i = 0, l = 0, s = 0; ; i++)
{
if (i == value.Length)
{
if (i - s > 0)
{
this.bufferBuilder.Append(value, s, i - s);
}
break;
}
if (value[i] == ' ' || value[i] == '\t')
{
if (i - s >= this.lineLength - startLength)
{
startLength = 0;
if (l == s)
{
l = i;
}
this.bufferBuilder.Append(value, s, l - s);
this.bufferBuilder.Append(CRLF);
s = l;
}
l = i;
}
}
}
*/
}
}
// 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
- XslCompiledTransform.cs
- embossbitmapeffect.cs
- MD5CryptoServiceProvider.cs
- BitSet.cs
- PanelStyle.cs
- DBConcurrencyException.cs
- DataControlReference.cs
- DataGridViewRowHeaderCell.cs
- AutomationElementIdentifiers.cs
- TableDesigner.cs
- DelegatingTypeDescriptionProvider.cs
- XmlSchemaRedefine.cs
- CustomSignedXml.cs
- Accessible.cs
- httpstaticobjectscollection.cs
- DataControlButton.cs
- ChildTable.cs
- ExceptionHelpers.cs
- FrameDimension.cs
- GB18030Encoding.cs
- DataPager.cs
- FormViewModeEventArgs.cs
- TreeWalkHelper.cs
- TransformerConfigurationWizardBase.cs
- __FastResourceComparer.cs
- X509CertificateChain.cs
- Renderer.cs
- DataBindingCollection.cs
- WebPartConnection.cs
- CodeTypeReference.cs
- GenericTypeParameterConverter.cs
- RotateTransform.cs
- MembershipUser.cs
- CreatingCookieEventArgs.cs
- odbcmetadatacolumnnames.cs
- XmlBinaryReader.cs
- Viewport2DVisual3D.cs
- GeometryHitTestParameters.cs
- UndoManager.cs
- BitmapMetadataBlob.cs
- InputScopeManager.cs
- UserControlBuildProvider.cs
- NullableConverter.cs
- LoginCancelEventArgs.cs
- BamlMapTable.cs
- BinaryFormatter.cs
- BasePattern.cs
- Exceptions.cs
- Subtree.cs
- RoleGroupCollectionEditor.cs
- ImpersonationContext.cs
- ADMembershipProvider.cs
- BevelBitmapEffect.cs
- UserThread.cs
- ErrorFormatterPage.cs
- AssertHelper.cs
- XmlSchemaComplexContent.cs
- DataRelation.cs
- GridViewCancelEditEventArgs.cs
- CodeLabeledStatement.cs
- HelpInfo.cs
- TransformerInfo.cs
- AsmxEndpointPickerExtension.cs
- CompressEmulationStream.cs
- PersonalizableAttribute.cs
- ComponentManagerBroker.cs
- ClientOptions.cs
- TrustManagerMoreInformation.cs
- COM2PictureConverter.cs
- GroupQuery.cs
- EncodingTable.cs
- HttpServerUtilityBase.cs
- EntityContainerRelationshipSet.cs
- SafeRightsManagementQueryHandle.cs
- XamlTreeBuilderBamlRecordWriter.cs
- MemoryPressure.cs
- SHA384Managed.cs
- BadImageFormatException.cs
- TypeConvertions.cs
- DbCommandTree.cs
- Light.cs
- Imaging.cs
- BamlRecordHelper.cs
- DefaultEvaluationContext.cs
- XmlSchemaGroupRef.cs
- InstanceKeyCompleteException.cs
- SizeF.cs
- XpsDocumentEvent.cs
- ManagedFilter.cs
- TreeViewItemAutomationPeer.cs
- PersonalizationState.cs
- EdmPropertyAttribute.cs
- FunctionQuery.cs
- TemplateEditingVerb.cs
- GCHandleCookieTable.cs
- OutOfProcStateClientManager.cs
- ConfigXmlComment.cs
- DataGridPagingPage.cs
- PersonalizationDictionary.cs
- UpdateCommandGenerator.cs