#ifndef foosimplewatchhfoo
#define foosimplewatchhfoo

/***
  This file is part of avahi.

  avahi is free software; you can redistribute it and/or modify it
  under the terms of the GNU Lesser General Public License as
  published by the Free Software Foundation; either version 2.1 of the
  License, or (at your option) any later version.

  avahi is distributed in the hope that it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
  Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with avahi; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  USA.
***/

/** \file simple-watch.h Simple poll() based main loop implementation */

#include <sys/poll.h>
#include "cdecl.h"
#include "watch.h"

AVAHI_C_DECL_BEGIN

/** A main loop object. Main loops of this type aren't very flexible
 * since they only support a single wakeup type. Nevertheless it
 * should suffice for small test and example applications.  */
typedef struct AvahiSimplePoll AvahiSimplePoll;

/** Create a new main loop object */
AvahiSimplePoll *avahi_simple_poll_new(void);

/** Free a main loop object */
void avahi_simple_poll_free(AvahiSimplePoll *s);

/** Return the abstracted poll API object for this main loop
 * object. The is will return the same pointer each time it is
 * called. */
const AvahiPoll* avahi_simple_poll_get(AvahiSimplePoll *s);

/** Run a single main loop iteration of this main loop. If sleep_time
is < 0 this will block until any of the registered events happens,
then it will execute the attached callback function. If sleep_time is
0 the routine just checks if any event is pending. If yes the attached
callback function is called, otherwise the function returns
immediately. If sleep_time > 0 the function will block for at most the
specified time in msecs. Returns -1 on error, 0 on success and 1 if a
quit request has been scheduled. Usually this function should be called
in a loop until it returns a non-zero value*/
int avahi_simple_poll_iterate(AvahiSimplePoll *s, int sleep_time);

/** Request that the main loop quits. If this is called the next
 call to avahi_simple_poll_iterate() will return 1 */
void avahi_simple_poll_quit(AvahiSimplePoll *s);

/** Prototype for a poll() type function */
typedef int (*AvahiPollFunc)(struct pollfd *ufds, unsigned int nfds, int timeout, void *userdata);

/** Replace the internally used poll() function. By default the system's poll() will be used */
void avahi_simple_poll_set_func(AvahiSimplePoll *s, AvahiPollFunc func, void *userdata);

/** The first stage of avahi_simple_poll_iterate(), use this function only if you know what you do */
int avahi_simple_poll_prepare(AvahiSimplePoll *s, int timeout);

/** The second stage of avahi_simple_poll_iterate(), use this function only if you know what you do */
int avahi_simple_poll_run(AvahiSimplePoll *s);

/** The third and final stage of avahi_simple_poll_iterate(), use this function only if you know what you do */
int avahi_simple_poll_dispatch(AvahiSimplePoll *s);

/** Call avahi_simple_poll_iterate() in a loop and return if it returns non-zero */
int avahi_simple_poll_loop(AvahiSimplePoll *s);

/** Wakeup the main loop. (for threaded environments) */
void avahi_simple_poll_wakeup(AvahiSimplePoll *s);

AVAHI_C_DECL_END

#endif
