2019-06-12 21:56:55 +02:00
|
|
|
|
using System;
|
|
|
|
|
using System.Runtime.CompilerServices;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
namespace Capnp.Rpc
|
|
|
|
|
{
|
|
|
|
|
class LocalCapability : ConsumedCapability
|
|
|
|
|
{
|
|
|
|
|
public static ConsumedCapability Create(Skeleton skeleton)
|
|
|
|
|
{
|
|
|
|
|
if (skeleton is Vine vine)
|
2020-01-11 17:21:31 +01:00
|
|
|
|
return vine.Proxy.ConsumedCap!;
|
2019-06-12 21:56:55 +02:00
|
|
|
|
else
|
2020-03-10 21:55:34 +01:00
|
|
|
|
return new LocalCapability(skeleton);
|
2019-06-12 21:56:55 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static async Task<DeserializerState> AwaitAnswer(Task<AnswerOrCounterquestion> call)
|
|
|
|
|
{
|
|
|
|
|
var aorcq = await call;
|
2020-01-11 17:21:31 +01:00
|
|
|
|
return aorcq.Answer ?? await aorcq.Counterquestion!.WhenReturned;
|
2019-06-12 21:56:55 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Skeleton ProvidedCap { get; }
|
|
|
|
|
|
|
|
|
|
LocalCapability(Skeleton providedCap)
|
|
|
|
|
{
|
|
|
|
|
ProvidedCap = providedCap ?? throw new ArgumentNullException(nameof(providedCap));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal override void AddRef()
|
|
|
|
|
{
|
2020-03-22 16:08:28 +01:00
|
|
|
|
ProvidedCap.Claim();
|
2019-06-12 21:56:55 +02:00
|
|
|
|
}
|
|
|
|
|
|
2020-03-22 16:08:28 +01:00
|
|
|
|
internal override void Release()
|
2019-06-12 21:56:55 +02:00
|
|
|
|
{
|
2020-03-22 16:08:28 +01:00
|
|
|
|
ProvidedCap.Relinquish();
|
2019-06-12 21:56:55 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-11-06 18:48:25 +01:00
|
|
|
|
internal override IPromisedAnswer DoCall(ulong interfaceId, ushort methodId, DynamicSerializerState args)
|
2019-06-12 21:56:55 +02:00
|
|
|
|
{
|
|
|
|
|
var cts = new CancellationTokenSource();
|
|
|
|
|
var call = ProvidedCap.Invoke(interfaceId, methodId, args, cts.Token);
|
|
|
|
|
return new LocalAnswer(cts, AwaitAnswer(call));
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-21 13:27:46 +01:00
|
|
|
|
internal override Action? Export(IRpcEndpoint endpoint, CapDescriptor.WRITER capDesc)
|
2019-06-12 21:56:55 +02:00
|
|
|
|
{
|
|
|
|
|
capDesc.which = CapDescriptor.WHICH.SenderHosted;
|
|
|
|
|
capDesc.SenderHosted = endpoint.AllocateExport(ProvidedCap, out bool _);
|
2020-03-21 13:27:46 +01:00
|
|
|
|
return null;
|
2019-06-12 21:56:55 +02:00
|
|
|
|
}
|
|
|
|
|
|
2020-01-11 17:21:31 +01:00
|
|
|
|
internal override void Freeze(out IRpcEndpoint? boundEndpoint)
|
2019-06-12 21:56:55 +02:00
|
|
|
|
{
|
|
|
|
|
boundEndpoint = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal override void Unfreeze()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void ReleaseRemotely()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-01-11 17:56:12 +01:00
|
|
|
|
}
|