Files
Capnp.Net.Runtime
Rpc
AnswerOrCounterquestion.cs
BareProxy.cs
CapabilityReflection.cs
ConsumedCapability.cs
IEndpoint.cs
IMonoSkeleton.cs
IPromisedAnswer.cs
IProvidedCapability.cs
IResolvingCapability.cs
IRpcEndpoint.cs
Impatient.cs
ImportedCapability.cs
InvalidCapabilityInterfaceException.cs
LazyCapability.cs
LocalAnswer.cs
LocalAnswerCapability.cs
LocalCapability.cs
MemberAccessPath.cs
PendingAnswer.cs
PendingQuestion.cs
PolySkeleton.cs
PromisedCapability.cs
Proxy.cs
ProxyAttribute.cs
RefCountingCapability.cs
RemoteAnswerCapability.cs
RemoteCapability.cs
RemoteResolvingCapability.cs
ResolvingCapabilityExtensions.cs
RpcEngine.cs
RpcException.cs
RpcUnimplementedException.cs
Skeleton.cs
SkeletonAttribute.cs
TcpRpcClient.cs
TcpRpcServer.cs
Vine.cs
rpc.cs
AnyPointer.cs
Capnp.Net.Runtime.csproj
CapnpSerializable.cs
DeserializationException.cs
DeserializerState.cs
DynamicSerializerState.cs
EmptyList.cs
EmptyListDeserializer.cs
FramePump.cs
Framing.cs
ICapnpSerializable.cs
ISegmentAllocator.cs
IStructDeserializer.cs
IStructSerializer.cs
ListDeserializer.cs
ListKind.cs
ListOfBitsDeserializer.cs
ListOfBitsSerializer.cs
ListOfCapsDeserializer.cs
ListOfCapsSerializer.cs
ListOfEmptyDeserializer.cs
ListOfEmptySerializer.cs
ListOfPointersDeserializer.cs
ListOfPointersSerializer.cs
ListOfPrimitivesDeserializer.cs
ListOfPrimitivesSerializer.cs
ListOfStructsDeserializer.cs
ListOfStructsSerializer.cs
ListOfTextSerializer.cs
Logging.cs
MessageBuilder.cs
ObjectKind.cs
PrimitiveCoder.cs
ReadOnlyListExtensions.cs
Reserializing.cs
SecurityOptions.cs
SegmentAllocator.cs
SegmentSlice.cs
SerializerExtensions.cs
SerializerState.cs
UtilityExtensions.cs
WireFrame.cs
WirePointer.cs
Capnp.Net.Runtime.Tests
CapnpCompatTest
capnpc-csharp
.gitattributes
.gitignore
Capnp.Net.sln
CapnpCompatTest.sln
LICENSE
README.md
libs.capnproto-dotnetcore_R…/Capnp.Net.Runtime/Rpc/LocalCapability.cs
Christian Köllner cbf2144ef4 Initial commit
2019-06-12 21:56:55 +02:00

72 lines
2.1 KiB
C#

using System;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Capnp.Rpc
{
class LocalCapability : ConsumedCapability
{
static readonly ConditionalWeakTable<Skeleton, LocalCapability> _localCaps =
new ConditionalWeakTable<Skeleton, LocalCapability>();
public static ConsumedCapability Create(Skeleton skeleton)
{
if (skeleton is Vine vine)
return vine.Proxy.ConsumedCap;
else
return _localCaps.GetValue(skeleton, _ => new LocalCapability(_));
}
static async Task<DeserializerState> AwaitAnswer(Task<AnswerOrCounterquestion> call)
{
var aorcq = await call;
return aorcq.Answer ?? await aorcq.Counterquestion.WhenReturned;
}
public Skeleton ProvidedCap { get; }
LocalCapability(Skeleton providedCap)
{
ProvidedCap = providedCap ?? throw new ArgumentNullException(nameof(providedCap));
}
internal override void AddRef()
{
ProvidedCap.Claim();
}
internal override void Release()
{
ProvidedCap.Relinquish();
}
internal override IPromisedAnswer DoCall(ulong interfaceId, ushort methodId, DynamicSerializerState args, bool pipeline)
{
var cts = new CancellationTokenSource();
var call = ProvidedCap.Invoke(interfaceId, methodId, args, cts.Token);
return new LocalAnswer(cts, AwaitAnswer(call));
}
internal override void Export(IRpcEndpoint endpoint, CapDescriptor.WRITER capDesc)
{
capDesc.which = CapDescriptor.WHICH.SenderHosted;
capDesc.SenderHosted = endpoint.AllocateExport(ProvidedCap, out bool _);
}
internal override void Freeze(out IRpcEndpoint boundEndpoint)
{
boundEndpoint = null;
}
internal override void Unfreeze()
{
}
protected override void ReleaseRemotely()
{
}
}
}