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 / MimeMultiPart.cs / 1 / MimeMultiPart.cs
using System;
using System.IO;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
namespace System.Net.Mime
{
///
/// Summary description for MimeMultiPart.
///
internal class MimeMultiPart:MimeBasePart
{
Collection parts;
static int boundary;
AsyncCallback mimePartSentCallback;
internal MimeMultiPart(MimeMultiPartType type)
{
MimeMultiPartType = type;
}
internal MimeMultiPartType MimeMultiPartType {
/*
// Consider removing.
get {
return GetPartType();
}
*/
set {
if (value > MimeMultiPartType.Related || value < MimeMultiPartType.Mixed)
{
throw new NotSupportedException(value.ToString());
}
SetType(value);
}
}
void SetType(MimeMultiPartType type) {
ContentType.MediaType = "multipart" + "/" + type.ToString().ToLower(CultureInfo.InvariantCulture);
ContentType.Boundary = GetNextBoundary();
}
/*
// Consider removing.
MimeMultiPartType GetPartType()
{
switch (ContentType.MediaType)
{
case "multipart/alternative":
return MimeMultiPartType.Alternative;
case "multipart/mixed":
return MimeMultiPartType.Mixed;
case "multipart/parallel":
return MimeMultiPartType.Parallel;
case "multipart/related":
return MimeMultiPartType.Related;
}
return MimeMultiPartType.Unknown;
}
*/
internal Collection Parts {
get{
if (parts == null) {
parts = new Collection();
}
return parts;
}
}
internal void Complete(IAsyncResult result, Exception e){
//if we already completed and we got called again,
//it mean's that there was an exception in the callback and we
//should just rethrow it.
MimePartContext context = (MimePartContext)result.AsyncState;
if (context.completed) {
throw e;
}
try{
context.outputStream.Close();
}
catch(Exception ex){
if (e == null) {
e = ex;
}
}
catch {
if (e == null) {
e = new Exception(SR.GetString(SR.net_nonClsCompliantException));
}
}
context.completed = true;
context.result.InvokeCallback(e);
}
internal void MimeWriterCloseCallback(IAsyncResult result)
{
if (result.CompletedSynchronously ) {
return;
}
((MimePartContext)result.AsyncState).completedSynchronously = false;
try{
MimeWriterCloseCallbackHandler(result);
}
catch (Exception e) {
Complete(result,e);
}
catch {
Complete(result, new Exception(SR.GetString(SR.net_nonClsCompliantException)));
}
}
void MimeWriterCloseCallbackHandler(IAsyncResult result) {
MimePartContext context = (MimePartContext)result.AsyncState;
((MimeWriter)context.writer).EndClose(result);
Complete(result,null);
}
internal void MimePartSentCallback(IAsyncResult result)
{
if (result.CompletedSynchronously ) {
return;
}
((MimePartContext)result.AsyncState).completedSynchronously = false;
try{
MimePartSentCallbackHandler(result);
}
catch (Exception e) {
Complete(result,e);
}
catch {
Complete(result, new Exception(SR.GetString(SR.net_nonClsCompliantException)));
}
}
void MimePartSentCallbackHandler(IAsyncResult result)
{
MimePartContext context = (MimePartContext)result.AsyncState;
MimeBasePart part = (MimeBasePart)context.partsEnumerator.Current;
part.EndSend(result);
if (context.partsEnumerator.MoveNext()) {
part = (MimeBasePart)context.partsEnumerator.Current;
IAsyncResult sendResult = part.BeginSend(context.writer, mimePartSentCallback, context);
if (sendResult.CompletedSynchronously) {
MimePartSentCallbackHandler(sendResult);
}
return;
}
else {
IAsyncResult closeResult = ((MimeWriter)context.writer).BeginClose(new AsyncCallback(MimeWriterCloseCallback), context);
if (closeResult.CompletedSynchronously) {
MimeWriterCloseCallbackHandler(closeResult);
}
}
}
internal void ContentStreamCallback(IAsyncResult result)
{
if (result.CompletedSynchronously ) {
return;
}
((MimePartContext)result.AsyncState).completedSynchronously = false;
try{
ContentStreamCallbackHandler(result);
}
catch (Exception e) {
Complete(result,e);
}
catch {
Complete(result, new Exception(SR.GetString(SR.net_nonClsCompliantException)));
}
}
void ContentStreamCallbackHandler(IAsyncResult result)
{
MimePartContext context = (MimePartContext)result.AsyncState;
context.outputStream = context.writer.EndGetContentStream(result);
context.writer = new MimeWriter(context.outputStream, ContentType.Boundary);
if (context.partsEnumerator.MoveNext()) {
MimeBasePart part = (MimeBasePart)context.partsEnumerator.Current;
mimePartSentCallback = new AsyncCallback(MimePartSentCallback);
IAsyncResult sendResult = part.BeginSend(context.writer, mimePartSentCallback, context);
if (sendResult.CompletedSynchronously) {
MimePartSentCallbackHandler(sendResult);
}
return;
}
else {
IAsyncResult closeResult = ((MimeWriter)context.writer).BeginClose(new AsyncCallback(MimeWriterCloseCallback),context);
if (closeResult.CompletedSynchronously) {
MimeWriterCloseCallbackHandler(closeResult);
}
}
}
internal override IAsyncResult BeginSend(BaseWriter writer, AsyncCallback callback, object state)
{
writer.WriteHeaders(Headers);
MimePartAsyncResult result = new MimePartAsyncResult(this, state, callback);
MimePartContext context = new MimePartContext(writer, result, Parts.GetEnumerator());
IAsyncResult contentResult = writer.BeginGetContentStream(new AsyncCallback(ContentStreamCallback), context);
if (contentResult.CompletedSynchronously) {
ContentStreamCallbackHandler(contentResult);
}
return result;
}
internal class MimePartContext {
internal MimePartContext(BaseWriter writer, LazyAsyncResult result, IEnumerator partsEnumerator) {
this.writer = writer;
this.result = result;
this.partsEnumerator = partsEnumerator;
}
internal IEnumerator partsEnumerator;
internal Stream outputStream;
internal LazyAsyncResult result;
internal BaseWriter writer;
internal bool completed;
internal bool completedSynchronously = true;
}
internal override void Send(BaseWriter writer) {
writer.WriteHeaders(Headers);
Stream outputStream = writer.GetContentStream();
MimeWriter mimeWriter = new MimeWriter(outputStream, ContentType.Boundary);
foreach (MimeBasePart part in Parts) {
part.Send(mimeWriter);
}
mimeWriter.Close();
outputStream.Close();
}
internal string GetNextBoundary() {
string boundaryString = "--boundary_" + boundary.ToString(CultureInfo.InvariantCulture)+"_"+Guid.NewGuid().ToString(null, CultureInfo.InvariantCulture);
boundary++;
return boundaryString;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
using System;
using System.IO;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
namespace System.Net.Mime
{
///
/// Summary description for MimeMultiPart.
///
internal class MimeMultiPart:MimeBasePart
{
Collection parts;
static int boundary;
AsyncCallback mimePartSentCallback;
internal MimeMultiPart(MimeMultiPartType type)
{
MimeMultiPartType = type;
}
internal MimeMultiPartType MimeMultiPartType {
/*
// Consider removing.
get {
return GetPartType();
}
*/
set {
if (value > MimeMultiPartType.Related || value < MimeMultiPartType.Mixed)
{
throw new NotSupportedException(value.ToString());
}
SetType(value);
}
}
void SetType(MimeMultiPartType type) {
ContentType.MediaType = "multipart" + "/" + type.ToString().ToLower(CultureInfo.InvariantCulture);
ContentType.Boundary = GetNextBoundary();
}
/*
// Consider removing.
MimeMultiPartType GetPartType()
{
switch (ContentType.MediaType)
{
case "multipart/alternative":
return MimeMultiPartType.Alternative;
case "multipart/mixed":
return MimeMultiPartType.Mixed;
case "multipart/parallel":
return MimeMultiPartType.Parallel;
case "multipart/related":
return MimeMultiPartType.Related;
}
return MimeMultiPartType.Unknown;
}
*/
internal Collection Parts {
get{
if (parts == null) {
parts = new Collection();
}
return parts;
}
}
internal void Complete(IAsyncResult result, Exception e){
//if we already completed and we got called again,
//it mean's that there was an exception in the callback and we
//should just rethrow it.
MimePartContext context = (MimePartContext)result.AsyncState;
if (context.completed) {
throw e;
}
try{
context.outputStream.Close();
}
catch(Exception ex){
if (e == null) {
e = ex;
}
}
catch {
if (e == null) {
e = new Exception(SR.GetString(SR.net_nonClsCompliantException));
}
}
context.completed = true;
context.result.InvokeCallback(e);
}
internal void MimeWriterCloseCallback(IAsyncResult result)
{
if (result.CompletedSynchronously ) {
return;
}
((MimePartContext)result.AsyncState).completedSynchronously = false;
try{
MimeWriterCloseCallbackHandler(result);
}
catch (Exception e) {
Complete(result,e);
}
catch {
Complete(result, new Exception(SR.GetString(SR.net_nonClsCompliantException)));
}
}
void MimeWriterCloseCallbackHandler(IAsyncResult result) {
MimePartContext context = (MimePartContext)result.AsyncState;
((MimeWriter)context.writer).EndClose(result);
Complete(result,null);
}
internal void MimePartSentCallback(IAsyncResult result)
{
if (result.CompletedSynchronously ) {
return;
}
((MimePartContext)result.AsyncState).completedSynchronously = false;
try{
MimePartSentCallbackHandler(result);
}
catch (Exception e) {
Complete(result,e);
}
catch {
Complete(result, new Exception(SR.GetString(SR.net_nonClsCompliantException)));
}
}
void MimePartSentCallbackHandler(IAsyncResult result)
{
MimePartContext context = (MimePartContext)result.AsyncState;
MimeBasePart part = (MimeBasePart)context.partsEnumerator.Current;
part.EndSend(result);
if (context.partsEnumerator.MoveNext()) {
part = (MimeBasePart)context.partsEnumerator.Current;
IAsyncResult sendResult = part.BeginSend(context.writer, mimePartSentCallback, context);
if (sendResult.CompletedSynchronously) {
MimePartSentCallbackHandler(sendResult);
}
return;
}
else {
IAsyncResult closeResult = ((MimeWriter)context.writer).BeginClose(new AsyncCallback(MimeWriterCloseCallback), context);
if (closeResult.CompletedSynchronously) {
MimeWriterCloseCallbackHandler(closeResult);
}
}
}
internal void ContentStreamCallback(IAsyncResult result)
{
if (result.CompletedSynchronously ) {
return;
}
((MimePartContext)result.AsyncState).completedSynchronously = false;
try{
ContentStreamCallbackHandler(result);
}
catch (Exception e) {
Complete(result,e);
}
catch {
Complete(result, new Exception(SR.GetString(SR.net_nonClsCompliantException)));
}
}
void ContentStreamCallbackHandler(IAsyncResult result)
{
MimePartContext context = (MimePartContext)result.AsyncState;
context.outputStream = context.writer.EndGetContentStream(result);
context.writer = new MimeWriter(context.outputStream, ContentType.Boundary);
if (context.partsEnumerator.MoveNext()) {
MimeBasePart part = (MimeBasePart)context.partsEnumerator.Current;
mimePartSentCallback = new AsyncCallback(MimePartSentCallback);
IAsyncResult sendResult = part.BeginSend(context.writer, mimePartSentCallback, context);
if (sendResult.CompletedSynchronously) {
MimePartSentCallbackHandler(sendResult);
}
return;
}
else {
IAsyncResult closeResult = ((MimeWriter)context.writer).BeginClose(new AsyncCallback(MimeWriterCloseCallback),context);
if (closeResult.CompletedSynchronously) {
MimeWriterCloseCallbackHandler(closeResult);
}
}
}
internal override IAsyncResult BeginSend(BaseWriter writer, AsyncCallback callback, object state)
{
writer.WriteHeaders(Headers);
MimePartAsyncResult result = new MimePartAsyncResult(this, state, callback);
MimePartContext context = new MimePartContext(writer, result, Parts.GetEnumerator());
IAsyncResult contentResult = writer.BeginGetContentStream(new AsyncCallback(ContentStreamCallback), context);
if (contentResult.CompletedSynchronously) {
ContentStreamCallbackHandler(contentResult);
}
return result;
}
internal class MimePartContext {
internal MimePartContext(BaseWriter writer, LazyAsyncResult result, IEnumerator partsEnumerator) {
this.writer = writer;
this.result = result;
this.partsEnumerator = partsEnumerator;
}
internal IEnumerator partsEnumerator;
internal Stream outputStream;
internal LazyAsyncResult result;
internal BaseWriter writer;
internal bool completed;
internal bool completedSynchronously = true;
}
internal override void Send(BaseWriter writer) {
writer.WriteHeaders(Headers);
Stream outputStream = writer.GetContentStream();
MimeWriter mimeWriter = new MimeWriter(outputStream, ContentType.Boundary);
foreach (MimeBasePart part in Parts) {
part.Send(mimeWriter);
}
mimeWriter.Close();
outputStream.Close();
}
internal string GetNextBoundary() {
string boundaryString = "--boundary_" + boundary.ToString(CultureInfo.InvariantCulture)+"_"+Guid.NewGuid().ToString(null, CultureInfo.InvariantCulture);
boundary++;
return boundaryString;
}
}
}
// 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
- ScriptingRoleServiceSection.cs
- PackageDigitalSignatureManager.cs
- Color.cs
- OleDbTransaction.cs
- HttpConfigurationSystem.cs
- ThrowHelper.cs
- SQLDecimalStorage.cs
- SmtpFailedRecipientException.cs
- EventHandlersDesigner.cs
- CollectionBase.cs
- XmlLoader.cs
- DSACryptoServiceProvider.cs
- PageSettings.cs
- PathBox.cs
- BitmapDecoder.cs
- TextEditorDragDrop.cs
- FormViewInsertEventArgs.cs
- PageAdapter.cs
- DataGridColumnsPage.cs
- WMICapabilities.cs
- MatrixKeyFrameCollection.cs
- CollectionViewGroupInternal.cs
- TableLayoutRowStyleCollection.cs
- NullableConverter.cs
- DataGridViewTextBoxEditingControl.cs
- EncryptedKeyIdentifierClause.cs
- UndoManager.cs
- TraceListeners.cs
- PartialCachingControl.cs
- Button.cs
- IsolatedStorageFileStream.cs
- EastAsianLunisolarCalendar.cs
- LinearGradientBrush.cs
- TripleDESCryptoServiceProvider.cs
- MD5.cs
- ToolStripItemTextRenderEventArgs.cs
- BitmapEffectGeneralTransform.cs
- EventMappingSettingsCollection.cs
- ConstantExpression.cs
- ParameterModifier.cs
- NumberFormatter.cs
- ProcessModuleCollection.cs
- SectionInput.cs
- RequestNavigateEventArgs.cs
- XMLSchema.cs
- TableLayout.cs
- ProxyElement.cs
- XmlSchemaComplexContent.cs
- NullEntityWrapper.cs
- SecurityManager.cs
- Column.cs
- AdapterDictionary.cs
- CommonGetThemePartSize.cs
- WaitHandle.cs
- InstallerTypeAttribute.cs
- ByteStack.cs
- TextInfo.cs
- ParseElementCollection.cs
- MaterialGroup.cs
- SafeFileMappingHandle.cs
- ConfigurationErrorsException.cs
- ViewCellRelation.cs
- ObsoleteAttribute.cs
- DataGridViewCellValidatingEventArgs.cs
- WebPartCloseVerb.cs
- WebContext.cs
- WrappedIUnknown.cs
- AppearanceEditorPart.cs
- StringStorage.cs
- Attributes.cs
- SystemUdpStatistics.cs
- Geometry.cs
- RadioButtonDesigner.cs
- HandleRef.cs
- BaseDataBoundControl.cs
- BindStream.cs
- InvariantComparer.cs
- CacheChildrenQuery.cs
- Material.cs
- MarkupProperty.cs
- HtmlTableRowCollection.cs
- SelectionPattern.cs
- AxHost.cs
- DbDeleteCommandTree.cs
- JavaScriptSerializer.cs
- ObjectListFieldsPage.cs
- SqlProcedureAttribute.cs
- EventLogRecord.cs
- QuaternionAnimationUsingKeyFrames.cs
- _HeaderInfo.cs
- DataDocumentXPathNavigator.cs
- SafeLocalAllocation.cs
- SapiGrammar.cs
- XmlChildEnumerator.cs
- PngBitmapDecoder.cs
- BuildResult.cs
- ParameterCollection.cs
- ComponentDispatcher.cs
- VirtualPathProvider.cs
- AnnotationResource.cs