/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* dbus-timeout.h DBusTimeout internal interfaces
 *
 * Copyright (C) 2003  CodeFactory AB
 *
 * Licensed under the Academic Free License version 2.1
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */
#ifndef DBUS_TIMEOUT_H
#define DBUS_TIMEOUT_H

#include <dbus/dbus-connection.h>
#include <dbus/dbus-internals.h>

DBUS_BEGIN_DECLS

/**
 * @addtogroup DBusTimeoutInternals
 * @{
 */

/* Public methods on DBusTimeout are in dbus-connection.h */

typedef struct DBusTimeoutList DBusTimeoutList;

/** function to run when the timeout is handled */
typedef dbus_bool_t (* DBusTimeoutHandler) (void *data);

DBusTimeout* _dbus_timeout_new          (int                 interval,
                                         DBusTimeoutHandler  handler,
                                         void               *data,
                                         DBusFreeFunction    free_data_function);
DBusTimeout* _dbus_timeout_ref          (DBusTimeout        *timeout);
void         _dbus_timeout_unref        (DBusTimeout        *timeout);
void         _dbus_timeout_set_interval (DBusTimeout        *timeout,
                                         int                 interval);
void         _dbus_timeout_set_enabled  (DBusTimeout        *timeout,
                                         dbus_bool_t         enabled);

DBusTimeoutList *_dbus_timeout_list_new            (void);
void             _dbus_timeout_list_free           (DBusTimeoutList           *timeout_list);
dbus_bool_t      _dbus_timeout_list_set_functions  (DBusTimeoutList           *timeout_list,
						    DBusAddTimeoutFunction     add_function,
						    DBusRemoveTimeoutFunction  remove_function,
                                                    DBusTimeoutToggledFunction toggled_function,
						    void                      *data,
						    DBusFreeFunction           free_data_function);
dbus_bool_t      _dbus_timeout_list_add_timeout    (DBusTimeoutList           *timeout_list,
						    DBusTimeout               *timeout);
void             _dbus_timeout_list_remove_timeout (DBusTimeoutList           *timeout_list,
						    DBusTimeout               *timeout);
void             _dbus_timeout_list_toggle_timeout (DBusTimeoutList           *timeout_list,
                                                    DBusTimeout               *timeout,
                                                    dbus_bool_t                enabled);


/** @} */

DBUS_END_DECLS

#endif /* DBUS_TIMEOUT_H */
