e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
214 lines
5.7 KiB
C#
214 lines
5.7 KiB
C#
//-----------------------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
namespace System.Activities
|
|
{
|
|
using System;
|
|
using System.Activities.Hosting;
|
|
using System.Globalization;
|
|
using System.Runtime;
|
|
using System.Runtime.Serialization;
|
|
|
|
[DataContract]
|
|
[Fx.Tag.XamlVisible(false)]
|
|
public sealed class BookmarkScope : IEquatable<BookmarkScope>
|
|
{
|
|
static BookmarkScope defaultBookmarkScope;
|
|
|
|
long temporaryId;
|
|
|
|
Guid id;
|
|
|
|
int handleReferenceCount;
|
|
|
|
internal BookmarkScope(long temporaryId)
|
|
{
|
|
Fx.Assert(temporaryId != default(long), "Should never call this constructor with the default value.");
|
|
this.temporaryId = temporaryId;
|
|
}
|
|
|
|
public BookmarkScope(Guid id)
|
|
{
|
|
this.id = id;
|
|
}
|
|
|
|
BookmarkScope()
|
|
{
|
|
// Only called for making the default sub instance
|
|
// which has an Id of Guid.Empty
|
|
}
|
|
|
|
public bool IsInitialized
|
|
{
|
|
get
|
|
{
|
|
return this.temporaryId == default(long);
|
|
}
|
|
}
|
|
|
|
public Guid Id
|
|
{
|
|
get
|
|
{
|
|
return this.id;
|
|
}
|
|
internal set
|
|
{
|
|
Fx.Assert(value != Guid.Empty, "Cannot set this to Guid.Empty.");
|
|
Fx.Assert(!this.IsInitialized, "Can only set this when uninitialized.");
|
|
|
|
this.id = value;
|
|
this.temporaryId = default(long);
|
|
}
|
|
}
|
|
|
|
internal int IncrementHandleReferenceCount()
|
|
{
|
|
return ++this.handleReferenceCount;
|
|
}
|
|
|
|
internal int DecrementHandleReferenceCount()
|
|
{
|
|
return --this.handleReferenceCount;
|
|
}
|
|
|
|
[DataMember(EmitDefaultValue = false, Name = "temporaryId")]
|
|
internal long SerializedTemporaryId
|
|
{
|
|
get { return this.temporaryId; }
|
|
set { this.temporaryId = value; }
|
|
}
|
|
|
|
[DataMember(EmitDefaultValue = false, Name = "id")]
|
|
internal Guid SerializedId
|
|
{
|
|
get { return this.id; }
|
|
set { this.id = value; }
|
|
}
|
|
|
|
internal long TemporaryId
|
|
{
|
|
get
|
|
{
|
|
return this.temporaryId;
|
|
}
|
|
}
|
|
|
|
public static BookmarkScope Default
|
|
{
|
|
get
|
|
{
|
|
if (defaultBookmarkScope == null)
|
|
{
|
|
defaultBookmarkScope = new BookmarkScope();
|
|
}
|
|
|
|
return defaultBookmarkScope;
|
|
}
|
|
}
|
|
|
|
internal bool IsDefault
|
|
{
|
|
get
|
|
{
|
|
// In the strictest sense the default is not initiailized.
|
|
// The Default BookmarkScope is really just a loose reference
|
|
// to the instance specific default that you can get to
|
|
// through NativeActivityContext.DefaultBookmarkScope.
|
|
// We use a scope initialized to Guid.Empty to signify this
|
|
// "loose reference".
|
|
return this.IsInitialized && this.id == Guid.Empty;
|
|
}
|
|
}
|
|
|
|
public void Initialize(NativeActivityContext context, Guid id)
|
|
{
|
|
if (context == null)
|
|
{
|
|
throw FxTrace.Exception.ArgumentNull("context");
|
|
}
|
|
|
|
if (id == Guid.Empty)
|
|
{
|
|
throw FxTrace.Exception.ArgumentNullOrEmpty("id");
|
|
}
|
|
|
|
if (this.IsInitialized)
|
|
{
|
|
throw FxTrace.Exception.AsError(new InvalidOperationException(SR.BookmarkScopeAlreadyInitialized));
|
|
}
|
|
|
|
context.InitializeBookmarkScope(this, id);
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
if (this.IsInitialized)
|
|
{
|
|
return this.id.GetHashCode();
|
|
}
|
|
else
|
|
{
|
|
return this.temporaryId.GetHashCode();
|
|
}
|
|
}
|
|
|
|
internal BookmarkScopeInfo GenerateScopeInfo()
|
|
{
|
|
if (this.IsInitialized)
|
|
{
|
|
return new BookmarkScopeInfo(this.Id);
|
|
}
|
|
else
|
|
{
|
|
return new BookmarkScopeInfo(this.temporaryId.ToString(CultureInfo.InvariantCulture));
|
|
}
|
|
}
|
|
|
|
public bool Equals(BookmarkScope other)
|
|
{
|
|
if (other == null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (object.ReferenceEquals(this, other))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
if (this.IsDefault)
|
|
{
|
|
return other.IsDefault;
|
|
}
|
|
else if (this.IsInitialized)
|
|
{
|
|
Fx.Assert(this.id != Guid.Empty, "If we're not the default but we're initialized then we must have a non-Empty Guid.");
|
|
|
|
if (other.id == this.id)
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Fx.Assert(this.temporaryId != 0, "We should have a non-zero temp id if we're not the default and not initialized.");
|
|
|
|
if (other.temporaryId == this.temporaryId)
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|