You've already forked linux-packaging-mono
Imported Upstream version 4.6.0.125
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
This commit is contained in:
parent
a569aebcfd
commit
e79aa3c0ed
@ -0,0 +1,161 @@
|
||||
//------------------------------------------------------------
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Workflow.ComponentModel;
|
||||
using System.Workflow.Runtime;
|
||||
using System.Workflow.Runtime.Hosting;
|
||||
using System.Security.Principal;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace System.Workflow.Activities
|
||||
{
|
||||
[Serializable]
|
||||
[Obsolete("The System.Workflow.* types are deprecated. Instead, please use the new types from System.Activities.*")]
|
||||
public sealed class EventDeliveryFailedException : SystemException
|
||||
{
|
||||
public EventDeliveryFailedException()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public EventDeliveryFailedException(String message)
|
||||
: base(message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public EventDeliveryFailedException(String message, Exception innerException)
|
||||
: base(message, innerException)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private EventDeliveryFailedException(SerializationInfo info, StreamingContext context)
|
||||
: base(info, context)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
internal sealed class WorkflowMessageEventHandler
|
||||
{
|
||||
Type proxiedType;
|
||||
string eventName;
|
||||
[NonSerialized]
|
||||
Type eventHandlerType;
|
||||
[NonSerialized]
|
||||
IDeliverMessage enqueueWrapper;
|
||||
|
||||
internal WorkflowMessageEventHandler(Type proxiedType, EventInfo eventInfo, IDeliverMessage enqueueWrapper)
|
||||
{
|
||||
this.proxiedType = proxiedType;
|
||||
this.eventName = eventInfo.Name;
|
||||
this.eventHandlerType = eventInfo.EventHandlerType;
|
||||
this.enqueueWrapper = enqueueWrapper;
|
||||
}
|
||||
|
||||
internal IDeliverMessage EnqueueWrapper
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.enqueueWrapper;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
throw new ArgumentNullException("value");
|
||||
}
|
||||
this.enqueueWrapper = value;
|
||||
}
|
||||
}
|
||||
|
||||
internal Delegate Delegate
|
||||
{
|
||||
get
|
||||
{
|
||||
MethodInfo interceptedHandler = this.eventHandlerType.GetMethod("Invoke");
|
||||
ParameterInfo[] parameters = interceptedHandler.GetParameters();
|
||||
bool isValidParameter = false;
|
||||
if (parameters.Length == 2)
|
||||
{
|
||||
if (parameters[1].ParameterType.IsSubclassOf(typeof(ExternalDataEventArgs))
|
||||
|| parameters[1].ParameterType == (typeof(ExternalDataEventArgs)))
|
||||
isValidParameter = true;
|
||||
}
|
||||
|
||||
if (isValidParameter)
|
||||
{
|
||||
MethodInfo mHandler = typeof(WorkflowMessageEventHandler).GetMethod("EventHandler");
|
||||
return (Delegate)Activator.CreateInstance(eventHandlerType, new object[] { this, mHandler.MethodHandle.GetFunctionPointer() });
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void EventHandler(object sender, ExternalDataEventArgs eventArgs)
|
||||
{
|
||||
if (eventArgs == null)
|
||||
{
|
||||
throw new ArgumentNullException("eventArgs");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
object workItem;
|
||||
IPendingWork workHandler;
|
||||
object[] args = this.enqueueWrapper.PrepareEventArgsArray(sender, eventArgs, out workItem, out workHandler);
|
||||
EventQueueName key = GetKey(args);
|
||||
|
||||
String securityIdentifier = null;
|
||||
if (eventArgs.Identity == null)
|
||||
{
|
||||
IIdentity identity = System.Threading.Thread.CurrentPrincipal.Identity;
|
||||
WindowsIdentity windowsIdentity = identity as WindowsIdentity;
|
||||
if (windowsIdentity != null && windowsIdentity.User != null)
|
||||
securityIdentifier = windowsIdentity.User.Translate(typeof(NTAccount)).ToString();
|
||||
else if (identity != null)
|
||||
securityIdentifier = identity.Name;
|
||||
|
||||
eventArgs.Identity = securityIdentifier;
|
||||
}
|
||||
else
|
||||
{
|
||||
securityIdentifier = eventArgs.Identity;
|
||||
}
|
||||
|
||||
MethodMessage message = new MethodMessage(this.proxiedType, this.eventName, args, securityIdentifier);
|
||||
|
||||
WorkflowActivityTrace.Activity.TraceEvent(TraceEventType.Information, 0, "Firing event {0} for instance {1}", this.eventName, eventArgs.InstanceId);
|
||||
|
||||
this.enqueueWrapper.DeliverMessage(eventArgs, key, message, workItem, workHandler);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
if (ExternalDataExchangeService.IsIrrecoverableException(e))
|
||||
{
|
||||
throw;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new EventDeliveryFailedException(SR.GetString(SR.Error_EventDeliveryFailedException, this.proxiedType, this.eventName, eventArgs.InstanceId), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private EventQueueName GetKey(object[] eventArgs)
|
||||
{
|
||||
bool provideInitializerTokens = CorrelationResolver.IsInitializingMember(this.proxiedType, this.eventName, eventArgs);
|
||||
|
||||
ICollection<CorrelationProperty> predicates = CorrelationResolver.ResolveCorrelationValues(this.proxiedType, this.eventName, eventArgs, provideInitializerTokens);
|
||||
return new EventQueueName(this.proxiedType, this.eventName, predicates);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user