/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* dbus-auth.h Authentication
 *
 * Copyright (C) 2002  Red Hat Inc.
 *
 * 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_AUTH_H
#define DBUS_AUTH_H

#include <dbus/dbus-macros.h>
#include <dbus/dbus-errors.h>
#include <dbus/dbus-string.h>
#include <dbus/dbus-sysdeps.h>

DBUS_BEGIN_DECLS

typedef struct DBusAuth DBusAuth;

typedef enum
{
  DBUS_AUTH_STATE_WAITING_FOR_INPUT,
  DBUS_AUTH_STATE_WAITING_FOR_MEMORY,
  DBUS_AUTH_STATE_HAVE_BYTES_TO_SEND,
  DBUS_AUTH_STATE_NEED_DISCONNECT,
  DBUS_AUTH_STATE_AUTHENTICATED
} DBusAuthState;

DBusAuth*     _dbus_auth_server_new          (const DBusString       *guid);
DBusAuth*     _dbus_auth_client_new          (void);
DBusAuth*     _dbus_auth_ref                 (DBusAuth               *auth);
void          _dbus_auth_unref               (DBusAuth               *auth);
dbus_bool_t   _dbus_auth_set_mechanisms      (DBusAuth               *auth,
                                              const char            **mechanisms);
DBusAuthState _dbus_auth_do_work             (DBusAuth               *auth);
dbus_bool_t   _dbus_auth_get_bytes_to_send   (DBusAuth               *auth,
                                              const DBusString      **str);
void          _dbus_auth_bytes_sent          (DBusAuth               *auth,
                                              int                     bytes_sent);
void          _dbus_auth_get_buffer          (DBusAuth               *auth,
                                              DBusString            **buffer);
void          _dbus_auth_return_buffer       (DBusAuth               *auth,
                                              DBusString             *buffer,
                                              int                     bytes_read);
void          _dbus_auth_get_unused_bytes    (DBusAuth               *auth,
                                              const DBusString      **str);
void          _dbus_auth_delete_unused_bytes (DBusAuth               *auth);
dbus_bool_t   _dbus_auth_needs_encoding      (DBusAuth               *auth);
dbus_bool_t   _dbus_auth_encode_data         (DBusAuth               *auth,
                                              const DBusString       *plaintext,
                                              DBusString             *encoded);
dbus_bool_t   _dbus_auth_needs_decoding      (DBusAuth               *auth);
dbus_bool_t   _dbus_auth_decode_data         (DBusAuth               *auth,
                                              const DBusString       *encoded,
                                              DBusString             *plaintext);
dbus_bool_t   _dbus_auth_set_credentials     (DBusAuth               *auth,
                                              DBusCredentials        *credentials);
DBusCredentials* _dbus_auth_get_identity     (DBusAuth               *auth);
dbus_bool_t   _dbus_auth_set_context         (DBusAuth               *auth,
                                              const DBusString       *context);
const char*   _dbus_auth_get_guid_from_server(DBusAuth               *auth);

void          _dbus_auth_set_unix_fd_possible(DBusAuth               *auth, dbus_bool_t b);
dbus_bool_t   _dbus_auth_get_unix_fd_negotiated(DBusAuth             *auth);

DBUS_END_DECLS

#endif /* DBUS_AUTH_H */
