1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace System.Activities
{
using System;
using System.Activities.Runtime;
using System.Diagnostics.CodeAnalysis;
using System.Runtime;
[Fx.Tag.XamlVisible(false)]
public sealed class HandleInitializationContext
{
ActivityExecutor executor;
ActivityInstance scope;
bool isDiposed;
internal HandleInitializationContext(ActivityExecutor executor, ActivityInstance scope)
{
this.executor = executor;
this.scope = scope;
}
internal ActivityInstance OwningActivityInstance
{
get
{
return this.scope;
}
}
internal ActivityExecutor Executor
{
get
{
return this.executor;
}
}
public THandle CreateAndInitializeHandle<THandle>() where THandle : Handle
{
ThrowIfDisposed();
THandle value = Activator.CreateInstance<THandle>();
value.Initialize(this);
// If we have a scope, we need to add this new handle to the LocationEnvironment.
if (this.scope != null)
{
this.scope.Environment.AddHandle(value);
}
// otherwise add it to the Executor.
else
{
this.executor.AddHandle(value);
}
return value;
}
public T GetExtension<T>() where T : class
{
return this.executor.GetExtension<T>();
}
public void UninitializeHandle(Handle handle)
{
ThrowIfDisposed();
handle.Uninitialize(this);
}
internal object CreateAndInitializeHandle(Type handleType)
{
Fx.Assert(ActivityUtilities.IsHandle(handleType), "This should only be called with Handle subtypes.");
object value = Activator.CreateInstance(handleType);
((Handle)value).Initialize(this);
// If we have a scope, we need to add this new handle to the LocationEnvironment.
if (this.scope != null)
{
this.scope.Environment.AddHandle((Handle)value);
}
// otherwise add it to the Executor.
else
{
this.executor.AddHandle((Handle)value);
}
return value;
}
internal BookmarkScope CreateAndRegisterBookmarkScope()
{
return this.executor.BookmarkScopeManager.CreateAndRegisterScope(Guid.Empty);
}
internal void UnregisterBookmarkScope(BookmarkScope bookmarkScope)
{
Fx.Assert(bookmarkScope != null, "The sub instance should not equal null.");
this.executor.BookmarkScopeManager.UnregisterScope(bookmarkScope);
}
void ThrowIfDisposed()
{
if (this.isDiposed)
{
throw FxTrace.Exception.AsError(new ObjectDisposedException(SR.HandleInitializationContextDisposed));
}
}
internal void Dispose()
{
this.isDiposed = true;
}
}
}
|