Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / infocard / Service / managed / Microsoft / InfoCards / UIAgentAsyncBeginRequest.cs / 1 / UIAgentAsyncBeginRequest.cs
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
//
// Presharp uses the c# pragma mechanism to supress its warnings.
// These are not recognised by the base compiler so we need to explictly
// disable the following warnings. See http://winweb/cse/Tools/PREsharp/userguide/default.asp
// for details.
//
#pragma warning disable 1634, 1691 // unknown message, unknown pragma
namespace Microsoft.InfoCards
{
using Microsoft.Win32.SafeHandles;
using System;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.IO;
using Microsoft.InfoCards.Diagnostics;
using IDT = Microsoft.InfoCards.Diagnostics.InfoCardTrace;
//
// Summary:
// Base class for begining any async operations from the UI Agent.
//
internal abstract class UIAgentAsyncBeginRequest : UIAgentRequest
{
SafeWaitHandle m_agentEventHandle;
int m_asyncHandle;
//
// Summary:
// Creates an new UIAgentAsyncBeginRequest
//
// Arguments:
// rpcHandle: The RPC Context handle.
// inArgs: The stream to hold the input arguments
// outArgs: The stream to hold the output arguments
// parent: the parent UI Request
//
public UIAgentAsyncBeginRequest(
IntPtr rpcHandle,
Stream inArgs,
Stream outArgs,
ClientUIRequest parent )
: base( rpcHandle, inArgs, outArgs, parent )
{
}
//
// Summary:
// Reads incoming params.
//
// Remarks:
// Reads the wait handle, and clones it for this process.
//
protected sealed override void OnMarshalInArgs()
{
IntPtr nativeEvent = IntPtr.Zero;
BinaryReader breader = new InfoCardBinaryReader( InArgs, Encoding.Unicode );
nativeEvent = Utility.ReadHandle( breader );
//
// Then translate the remote event handle into a locally valid handle.
//
using( SafeWaitHandle waitHandle = new SafeWaitHandle( nativeEvent, false ) )
{
m_agentEventHandle = Utility.GetLocalHandleFromRemoteHandle(
waitHandle,
(int) ParentRequest.UIAgentPid );
}
OnMarshalAsyncInArgs( breader );
}
//
// Summary:
// Called after the standard async args are already marsheled to allow derived classes to marshal op
// specific arguments.
//
protected virtual void OnMarshalAsyncInArgs( BinaryReader reader )
{
//
// Default is to do nothing.
//
}
//
// Summary:
// Process the Begin operateration.
//
protected override void OnProcess()
{
AsyncParams param = CreateAsyncParams();
param.AsyncResult.CancelCallback = new RpcAsyncResult.AsyncCancelCallback( AsyncCancel );
IDT.Assert( null != param, "Null AsyncParams" );
try
{
//
// Capture the async context handle.
//
m_asyncHandle = param.AsyncResult.Handle;
IDT.Assert( 0 != m_asyncHandle, "null async context handle" );
//
// Start the operation.
//
if (!ThreadPool.QueueUserWorkItem(IDT.ThunkCallback(new WaitCallback(AsyncEntry)), param))
{
throw IDT.ThrowHelperError( new CommunicationException( SR.GetString( SR.UnableToQueueThreadpool ) ) );
}
}
catch
{
//
// An error occured, be sure to dispose the async context.
// Should AsyncParams support dispose?
//
param.AsyncResult.Dispose();
throw;
}
}
//
// Summary:
// marshal the base async info out.
//
protected override void OnMarshalOutArgs()
{
BinaryWriter bwriter = new BinaryWriter( OutArgs, Encoding.Unicode );
IDT.Assert( 0 != m_asyncHandle, "null async handle" );
bwriter.Write( m_asyncHandle );
}
protected override void OnDisposeAsUser()
{
if( null != m_agentEventHandle )
{
m_agentEventHandle.Dispose();
m_agentEventHandle = null;
}
}
//
// Summary:
// Creates the AsyncParams for the async operation.
//
// Remarks:
// By default, a UIAgentAsyncParams object is created, but derived classes
// can change this by returning any AsyncParams derived class.
//
protected virtual AsyncParams CreateAsyncParams( )
{
//
// Get the name of this request type. We put this in the asyncParams to make debugging easier.
//
Type thisType = GetType();
AsyncParams retParams = new UIAgentAsyncParams( thisType.Name,
ParentRequest,
m_agentEventHandle,
this );
//
// The asyncParams takes ownership of the handle.
//
m_agentEventHandle = null;
return retParams;
}
//
// Summary:
// Abstract entry point for the execution of the async operation.
//
protected abstract object AsyncExecute( AsyncParams asyncParam );
//
// Summary:
// Abstract entry point for the cancelation of the async operation.
//
protected abstract void AsyncCancel( );
//
// Summary:
// This is a WaitCallback conformant wrapper for Async Requests
//
// Parameters:
// state - An instance of a a AsyncParams class..
//
// Remarks:
// Running on threadpool thread.
//
private void AsyncEntry( object state )
{
//
// Consider for future -- see bug 38733 -- Clear out thread context here (in a finally block)
//
AsyncParams param = (AsyncParams)state;
try
{
if( param.AsyncResult.IsCanceled )
{
param.AsyncResult.Exception = new Win32Exception( NativeMethods.ERROR_CANCELLED );
}
else
{
param.AsyncResult.Result = AsyncExecute( param );
}
}
#pragma warning disable 56500 // do not catch non-recoverable exceptions
catch( Exception e )
{
if( IDT.IsFatal( e ) )
{
InfoCardService.Crash( e );
}
//
// Ensure that the result is completed.
//
//
// Even if it is InfoCardBaseException, we're simply transferring it.
//
param.AsyncResult.Exception = e;
}
#pragma warning restore 56500
//
// The complete method should not throw any exceptions.
//
param.AsyncResult.Complete();
//
// Consider for future -- see bug 38733 -- Clear out thread context here (in a finally block)
//
}
}
}
// 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
- TextProviderWrapper.cs
- ContentPlaceHolder.cs
- IndexOutOfRangeException.cs
- ActiveXContainer.cs
- ReflectPropertyDescriptor.cs
- TextDocumentView.cs
- GACMembershipCondition.cs
- LoginCancelEventArgs.cs
- XmlAttributes.cs
- IndependentlyAnimatedPropertyMetadata.cs
- ActivityBindForm.Designer.cs
- HintTextConverter.cs
- DataGridPagerStyle.cs
- CodeGroup.cs
- Msmq4SubqueuePoisonHandler.cs
- ApplicationFileCodeDomTreeGenerator.cs
- FamilyMapCollection.cs
- ActiveXContainer.cs
- IDQuery.cs
- KeyBinding.cs
- FontWeights.cs
- JsonEnumDataContract.cs
- ApplicationDirectoryMembershipCondition.cs
- ColorContextHelper.cs
- SmiMetaData.cs
- MarginCollapsingState.cs
- ComponentEvent.cs
- ChtmlFormAdapter.cs
- ImageListUtils.cs
- FontDriver.cs
- ResXBuildProvider.cs
- RSAOAEPKeyExchangeFormatter.cs
- XmlSerializableWriter.cs
- SkewTransform.cs
- Soap.cs
- ParameterElementCollection.cs
- DataBoundControlActionList.cs
- shaper.cs
- _ListenerResponseStream.cs
- ClientSettingsStore.cs
- StringAttributeCollection.cs
- WindowsImpersonationContext.cs
- SqlProviderUtilities.cs
- Socket.cs
- ISFTagAndGuidCache.cs
- ArrayList.cs
- MetadataArtifactLoaderFile.cs
- CodeObject.cs
- InheritanceAttribute.cs
- SoapInteropTypes.cs
- TextRunCacheImp.cs
- Transform.cs
- VBIdentifierDesigner.xaml.cs
- CapabilitiesUse.cs
- SQLByteStorage.cs
- EventProviderWriter.cs
- BamlRecords.cs
- DocumentPageViewAutomationPeer.cs
- EntityContainerEmitter.cs
- RefreshPropertiesAttribute.cs
- cookie.cs
- PackageRelationship.cs
- DataRowView.cs
- TrustLevelCollection.cs
- ComplexPropertyEntry.cs
- InvariantComparer.cs
- InProcStateClientManager.cs
- Privilege.cs
- CodeChecksumPragma.cs
- DrawListViewItemEventArgs.cs
- SelectingProviderEventArgs.cs
- System.Data_BID.cs
- GraphicsContainer.cs
- DrawListViewItemEventArgs.cs
- InstanceCreationEditor.cs
- SqlUserDefinedTypeAttribute.cs
- CustomLineCap.cs
- MouseWheelEventArgs.cs
- RsaKeyGen.cs
- WindowsRegion.cs
- Int32.cs
- ComNativeDescriptor.cs
- ReadOnlyHierarchicalDataSourceView.cs
- RadioButtonBaseAdapter.cs
- DataGridViewElement.cs
- SamlAuthenticationClaimResource.cs
- LocatorGroup.cs
- TypeToken.cs
- ReferenceSchema.cs
- WebHttpSecurityElement.cs
- Soap12FormatExtensions.cs
- Tracer.cs
- EmptyControlCollection.cs
- TrackingMemoryStreamFactory.cs
- TimersDescriptionAttribute.cs
- DiscoveryClientDocuments.cs
- JulianCalendar.cs
- Win32Exception.cs
- ImageMetadata.cs
- DocumentApplicationJournalEntry.cs