Thank you for your quick answer!
The `Server` to `Client` "conversion" is done via the bootstrap capability,
but I need the underlying `Server` back when calling capabilities returned
by the bootstrap capability.
Here is a simplified example where I (tried) to implement your advice:
interface MediaLibrary {
addPublisher @0 (name :Text) -> (pub :Publisher);
addSubscriber @1 (name :Text) -> (sub :Subscriber);
interface Publisher {}
interface Subscriber {
listenTo @0 (publisher :Publisher);
}
}
class MediaLibraryImpl final : public MediaLibrary::Server {
public:
kj::Promise<void> addPublisher(AddPublisherContext context) override {
my_underlying_library::Publisher* output = ...; // call the underlying
lib
MediaLibrary::Publisher::Client pub = publishers_.add(kj::heap<Publisher
Impl>(output));
context.getResults().setPub(pub);
return kj::READY_NOW;
}
kj::Promise<void> addSubscriber(AddSubscriberContext context) override {
my_underlying_library::Subscriber* output = ...; // call the
underlying lib
MediaLibrary::Subscriber::Client sub = subscribers_.add(kj::heap<
SubscriberImpl>(output));
context.getResults().setSub(sub);
return kj::READY_NOW;
}
private:
capnp::CapabilityServerSet<MediaLibrary::Subscriber> subscribers_;
capnp::CapabilityServerSet<MediaLibrary::Publisher> publishers_;
};
class PublisherImpl : public virtual GstDaemon::Publisher::Server {
protected:
PublisherImpl(my_underlying_library::Publisher* pub) : pub_(pub) {}
private:
my_underlying_library::Publisher* pub_;
}
class SubscriberImpl : public virtual GstDaemon::Subscriber::Server {
protected:
SubscriberImpl(my_underlying_library::Subscriber* sub) : sub_(sub) {}
kj::Promise<void> listenTo(ListenToContext context) override {
auto pub = context.getParams().getPublisher(); // GstDaemon::Publisher
::Client
// No access to CapabilityServerSet !
// We we would like to do: sub_->listenTo("pub_")
}
private:
my_underlying_library::Subscriber* sub_;
}
If I understand well, I can now do subscribers_.getLocalServer("GstDaemon::
Publisher::Client") from `MediaLibraryImpl`.
Bu what about SubscriberImpl, where the `listenTo` needs `PublisherImpl` ?
Is it possible to have access to `MediaLibraryImpl` from `SubscriberImpl` ?
Instead, should I pass references to the `CapabilityServerSet` to `Publisher
Impl` and `SubscriberImpl` ?
Le lundi 26 avril 2021 à 16:30:55 UTC+2, [email protected] a écrit :
> Hi Théophile,
>
> Take a look at CapabilityServerSet:
>
>
> https://github.com/capnproto/capnproto/blob/6b5bcc2c6e954bc6e167ac581eb628e5a462a469/c++/src/capnp/capability.h#L607-L633
>
> When you convert your `Server` object to a `Client`, you need to do it
> using a CapabilityServerSet. Later, you can use the same set to unwrap the
> `Client` and get the underlying `Server` back -- even if the client has
> been passed over the network and back in the meantime.
>
> -Kenton
>
> On Mon, Apr 26, 2021 at 9:25 AM Théophile B. <[email protected]> wrote:
>
>> I'm not sure I'm usign the right terminology in my question, but I hope
>> you will understand my problem with the following example.
>>
>> I'm developing a media library where the user can play/pause/stop
>> different kinds of "pipelines" (source ~ camera, filter ~ processing, sink
>> ~ display). Depending on their type, these pipeline can listen to each
>> other, or not (e.g: a source pipeline cannot listen). I'm now working on a
>> "capnp wrapper" of the library, so that it can be controlled via RPC.
>>
>> I have replicated the class inheritance with success:
>>
>> interface Publisher {}
>>
>> interface Subscriber {
>> listenTo @0 (publisher :Publisher);
>> }
>>
>> interface Pipeline {
>> play @0 ();
>> pause @1 ();
>> stop @2 ();
>> }
>>
>> interface SourcePipeline extends(Pipeline, Publisher) {}
>>
>> interface FilterPipeline extends(Pipeline, Publisher, Subscriber) {}
>>
>> interface SinkPipeline extends(Pipeline, Subscriber) {}
>>
>> Server-side I have those impl classes, which holds the references to the
>> underlying objects of the media library (pub_ & sub_).
>>
>> class PublisherImpl : public virtual GstDaemon::Publisher::Server {
>> protected:
>> PublisherImpl(my_underlying_library::Publisher* pub) : pub_(pub) {}
>> private:
>> my_underlying_library::Publisher* pub_;
>> };
>>
>> class SubscriberImpl : public virtual GstDaemon::Subscriber::Server {
>> protected:
>> SubscriberImpl(my_underlying_library::Subscriber* sub) : sub_(sub) {}
>>
>> kj::Promise<void> listenTo(ListenToContext context) override {
>> auto pub = context.getParams().getPublisher(); // GstDaemon::Publisher
>> ::Client
>> // ??? = PublisherImpl::pub_
>> sub_->listenTo(???)
>> }
>>
>> private:
>> my_underlying_library::Subscriber* sub_;
>> };
>>
>> Now, from the client, I wanted to do something like this:
>> //GstDaemon::Subscriber::Client subscriber; // already returned by the
>> server
>> //GstDaemon::Publisher::Client publisher; // already returned by the
>> server
>> auto request = subscriber.listenToRequest();
>> request.setPublisher(publisher);
>> auto promise = request.send();
>>
>> However, as you can see, on the server it's not possible to get the pub_
>> pointer when the listenTo method is called. Is there any way I can get a
>> reference to the PublisherImpl here ?
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Cap'n Proto" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/capnproto/488a63c6-92bc-4bc8-9ab8-e648d3a577bfn%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/capnproto/488a63c6-92bc-4bc8-9ab8-e648d3a577bfn%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>
--
You received this message because you are subscribed to the Google Groups
"Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/capnproto/45982dae-5fb0-4adb-8b15-9fea70506d25n%40googlegroups.com.