<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
What are the minimal requirements for implementing a DBus server loop?<br>
<br>
Would it be sufficient to employ a timeout function (set with
"dbus_server_set_timeout_functions()")? <br>
<blockquote>If so, what is the timeout handler supposed to do then, how
can it get to the DBusConnection or is it supposed to create it on its
own? Is it supposed to invoke the new-connection function ("dbus_server_set_new_connection_function")?
If not, which function is responsible for invoking the supplied new-connection
function supplying the DBusConnection?<br>
</blockquote>
If one is supposed to supply a watch function (set with
"dbus_server_set_watch_functions()"):<br>
<blockquote>How to learn what to watch? What is the handler supposed to
do, how can it get to the DBusConnection or is it supposed to create it
on its own? Is it supposed to invoke the new-connection function
("dbus_server_set_new_connection_function")? If not, which function is
responsible for invoking the supplied new-connection function supplying
the DBusConnection?</blockquote>
Any (brief and conceptual) answers would really help a lot to
understand the needs one has to fulfill in a server loop!<br>
<br>
Would an implementation for the timer and watch functions like in <a
 class="moz-txt-link-rfc2396E"
 href="http://read.pudn.com/downloads116/ebook/495803/winDBus/dbus/dbus-server.c__.htm">&lt;http://read.pudn.com/downloads116/ebook/495803/winDBus/dbus/dbus-server.c__.htm&gt;</a>
be reasonable for any platform? If so, how does the
new-connection-function get invoked in order to get access to the
DBusConnection that attached to the server (which function is
responsible to invoke it)?<br>
<br>
---rony<br>
<br>
<br>
On 23.07.2011 15:55, rony wrote:
<blockquote cite="mid:4E2AD2D2.50504@wu.ac.at" type="cite">
  <pre wrap="">Dear Mike:

again, many thanks for your comments and hints!

So far I had (wrongly) assumed that there is a default implementation 
which gets kicked-off using dbus_server_listen() which will dispatch
connection attempts and invokes the new_connection callback function.
Probably this "wish was the father of my thoughts". Or with other words:
thought that dbus_server_listen() would set up and run a loop and
whenever a connection attempt is undertaken, authenticates and calls the
registered new_connection function. It seems that I need to create a
handler myself that does all of that.

Now, I am a little bit lost as to what steps in which order are needed
in such a server handler to determine whether a connection attempt was
undertaken, what to do then (like how to authenticate, how to assign a
unique bus-id, if necessary at all, ...)!

Do you know of a link to a description of what must be tackled, when
creating a loop in a separate thread to handle new connections for a
listening server? Surely, somewhere there is a specification for what a
server handler is supposed to do?

Is there somewhere a (simple) implementation that one could study to
create an own loop to service new connections to the listening server,
without using glib or the like, just a "raw", maybe
"strawman-like/nutshell" dbus reference implementation for a server
handler?

Even pseudo-code showing the most important steps would help
tremendeously in this situation!

TIA

---rony





On 23.07.2011 02:53, Mike Gorse wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">On Sat, 23 Jul 2011, rony wrote:

    </pre>
    <blockquote type="cite">
      <pre wrap="">There is no main-loop in this case, but a callback function that should
get invoked by the server once a connection is established
(authenticated?).
      </pre>
    </blockquote>
    <pre wrap="">
Then what are you using to listen for events on your server, if not a
main loop?  Ie, are you calling select() on a set of file descriptors?

    </pre>
    <blockquote type="cite">
      <pre wrap="">According to the documentation the server gets started with a call to
dbus_server_listen() and if a connection happens the function gets
called back that gets submitted via the
dbus_server_set_new_connection_function()-call.
      </pre>
    </blockquote>
    <pre wrap="">
As discussed in the documentation to dbus_server_listen,
dbus_server_set_watch_functions() and
dbus_server_set_timeout_functions() need to be called in addition to
dbus_server_set_new_connection_function.

    </pre>
    <blockquote type="cite">
      <pre wrap="">
The server starts and supplies the given addresses to clients that try
to connect to these addresses. But nothing more happens, the callback
function on the server side is not invoked. Calls from the client get no
answers but timeout.

      </pre>
      <blockquote type="cite">
        <pre wrap="">If you're using glib, then there's a function in dbus-glib called
dbus_server_setup_with_g_main that will integrate the server into the
glib main loop.  Otherwise that function might be useful to look at (I
don't understand how watches work all that well, but they need to be
set).
        </pre>
      </blockquote>
      <pre wrap="">glib is not used at all in this case. Also there are no watch and
timeout callbacks set up as there is no main-loop to be serviced.
      </pre>
    </blockquote>
    <pre wrap="">
If you aren't using a standard main loop, then I think you'll need to
roll your own code to handle dbus watches and invoke their callbacks
when there is data available; otherwise libdbus won't know that there
is data to process on the socket.  Your binding will need to expose or
wrap these watch functions somehow.  If you have a binding for glib,
then I'd recommend binding the dbus_*_setup_with_g_main functions from
dbus-glib as well, since they make it convenient to integrate a dbus
server or connection.

Hth,
-Mike G-</pre>
  </blockquote>
  <br>
</blockquote>
</body>
</html>