Re: Skype and DBus: should my client library act as a server?

Simon McVittie <simon.mcvittie-ZGY8ohtN/[email protected]>
Newsgroups gmane.comp.freedesktop.dbus
Organization Collabora Ltd.
Message-ID <[email protected]>
On 09/03/15 23:31, Julien JPK wrote:
> Skype provides a single object: /com/Skype. This object has one method:
> Invoke(String).

This is poor D-Bus API design; but if you're using a proprietary service
like Skype, you're stuck with how they have chosen to design their API.

> However, when Skype has too much data to reply, it returns an empty
> string instead, and ends the method call. [...] After
> returning "", Skype began building its heavy reply, and when it was
> done, tried to contact my program (library) through a completely
> different object and interface.

This is also poor D-Bus API design, particularly if they do not document
that this is how it works; but again, if you're using Skype, you're
stuck with their choice of API.

> As you can see, while the Invoke(String) call returned nothing,
> it seems like Skype did try to reply later on, through a different
> method: my chat messages are sent to my program through a Notify(String)
> method [...] Does this mean that, while it is designed to act as a
> client component, my library should register an object to the session
> bus, and be ready to receive replies through it, while it sends requests
> through Skype's /com/Skype object, in FTP duplex-fashion?

Yes, it looks like that is the intention. If you don't like that design
you'd have to take that up with Skype.

> If so, would any of you have some pointers as to how I can register
> objects and their methods using the low-level API?

* Don't. High-level APIs are there for a reason. I would suggest
exporting a high-level object using gdbus-codegen, or at least the
semi-high-level GDBusInterfaceSkeleton (which is what the code generated
by gdbus-codegen uses).

* For C or C++ without Qt, prefer GDBus (a reimplementation) over
libdbus. You can still use the low-level APIs that  in GDBus - libdbus
only has semi-low-level and really-low-level message-passing-based APIs,
whereas GDBus has both a message-passing layer equivalent to libdbus,
and higher-level object-oriented layers on top of that.

* Don't. High-level APIs are there for a reason. :-)

* g_dbus_connection_register_object() (or its slightly lower-level
libdbus equivalent dbus_connection_register_object_path()) is the
canonical semi-low-level way to register objects to receive method calls.

* If you insist on torturing yourself with low-level details, use
g_dbus_connection_add_filter() or dbus_connection_add_filter() to filter
incoming method calls, reply to them, and mark them as "I handled this"
so that the library does not send back a redundant error reply. (But
seriously, don't do this. I'm a D-Bus maintainer who does know the
low-level details, and I avoid these functions unless absolutely
necessary - part of the reason for high-level API patterns is to guide
application authors towards doing the right thing, whereas the
lower-level message-passing APIs give you plenty of scope for shooting
yourself in the foot.)

> I do understand the
> concepts themselves (having read "An Introduction to the Basics" [1] and
> a few others)

I hope you are aware of the cognitive dissonance involved in reading an
introduction to the basics, and then doing things that the D-Bus
maintainer specifically advises against :-)

If you want to see the messages that result from a higher-level API, all
the D-Bus implementations I'm aware of are open source, so you can
always look at exactly what they're doing on your behalf. (Also, I see
you've already discovered dbus-monitor, which, again, tells you what is
going on at the message-passing level.)

-- 
Simon McVittie
Collabora Ltd. <http://www.collabora.com/>

_______________________________________________
dbus mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dbus
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.