90 lines
3.3 KiB
C#
90 lines
3.3 KiB
C#
|
// <copyright>
|
|||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|||
|
// </copyright>
|
|||
|
|
|||
|
namespace System.Activities.DynamicUpdate
|
|||
|
{
|
|||
|
using System;
|
|||
|
using System.Activities.Validation;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
|
|||
|
public class NativeActivityUpdateMapMetadata : UpdateMapMetadata
|
|||
|
{
|
|||
|
internal NativeActivityUpdateMapMetadata(DynamicUpdateMapBuilder.Finalizer finalizer,
|
|||
|
DynamicUpdateMapBuilder.IDefinitionMatcher matcher, Activity targetActivity)
|
|||
|
: base(finalizer, matcher, targetActivity)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
public void SaveOriginalValue(Activity updatedChildActivity, object originalValue)
|
|||
|
{
|
|||
|
this.ThrowIfDisposed();
|
|||
|
bool isReferencedChild;
|
|||
|
ValidateOriginalValueAccess(this.TargetActivity, updatedChildActivity, "updatedChildActivity", out isReferencedChild);
|
|||
|
if (GetMatch(updatedChildActivity) == null)
|
|||
|
{
|
|||
|
throw FxTrace.Exception.Argument("updatedChildActivity", SR.CannotSaveOriginalValueForNewActivity(updatedChildActivity));
|
|||
|
}
|
|||
|
|
|||
|
this.Finalizer.SetOriginalValue(updatedChildActivity, originalValue, isReferencedChild);
|
|||
|
}
|
|||
|
|
|||
|
public void SaveOriginalValue(string propertyName, object originalValue)
|
|||
|
{
|
|||
|
this.ThrowIfDisposed();
|
|||
|
if (propertyName == null)
|
|||
|
{
|
|||
|
throw FxTrace.Exception.ArgumentNull("propertyName");
|
|||
|
}
|
|||
|
|
|||
|
if (this.Finalizer.SavedOriginalValuesForCurrentActivity == null)
|
|||
|
{
|
|||
|
this.Finalizer.SavedOriginalValuesForCurrentActivity = new Dictionary<string, object>();
|
|||
|
}
|
|||
|
this.Finalizer.SavedOriginalValuesForCurrentActivity[propertyName] = originalValue;
|
|||
|
}
|
|||
|
|
|||
|
internal static void ValidateOriginalValueAccess(Activity parent, Activity child, string paramName, out bool isReferencedChild)
|
|||
|
{
|
|||
|
if (child == null)
|
|||
|
{
|
|||
|
throw FxTrace.Exception.ArgumentNull(paramName);
|
|||
|
}
|
|||
|
|
|||
|
if (!IsPublicOrImportedDelegateOrChild(parent, child, out isReferencedChild))
|
|||
|
{
|
|||
|
throw FxTrace.Exception.Argument(paramName, SR.CannotSaveOriginalValueForActivity);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static bool IsPublicOrImportedDelegateOrChild(Activity parent, Activity child, out bool isReferencedChild)
|
|||
|
{
|
|||
|
isReferencedChild = false;
|
|||
|
if (child.Parent == parent)
|
|||
|
{
|
|||
|
if (child.HandlerOf == null)
|
|||
|
{
|
|||
|
return child.RelationshipToParent == Activity.RelationshipType.Child ||
|
|||
|
child.RelationshipToParent == Activity.RelationshipType.ImportedChild;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return child.HandlerOf.ParentCollectionType == ActivityCollectionType.Public ||
|
|||
|
child.HandlerOf.ParentCollectionType == ActivityCollectionType.Imports;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (parent.MemberOf != child.MemberOf)
|
|||
|
{
|
|||
|
isReferencedChild = true;
|
|||
|
bool isImport;
|
|||
|
return IsChild(parent, child, out isImport);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|