/*

  silcstatus.h

  Author: Pekka Riikonen <priikone@silcnet.org>

  Copyright (C) 2002 - 2007 Pekka Riikonen

  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; version 2 of the License.

  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.

*/

/****h* silccore/SILC Status Types
 *
 * DESCRIPTION
 *
 * This header includes the SILC Status Types that are used with
 * command replies and with notify packets.  With command reply packets
 * they indicate whether error occurred during procesing of the command
 * and indicate the error type.  With notify type they always indicate
 * which error occurred.  Both command reply and notify type share the
 * same status types.
 *
 ***/

#ifndef SILCSTATUS_H
#define SILCSTATUS_H

/****d* silccore/StatusTypes/SilcStatus
 *
 * NAME
 *
 *    typedef SilcUInt8 SilcStatus
 *
 * DESCRIPTION
 *
 *    The SilcStatus type definition and the status defines.  The
 *    server returns a status in each Command Payload indicating
 *    the status of the command.  The server can also return this
 *    inside SILC_NOTIFY_TYPE_ERROR notify type.
 *
 * SOURCE
 */
typedef SilcUInt8 SilcStatus;

/* Command Status messages */
#define SILC_STATUS_OK                      0
#define SILC_STATUS_LIST_START              1
#define SILC_STATUS_LIST_ITEM               2
#define SILC_STATUS_LIST_END                3
#define SILC_STATUS_ERR_NO_SUCH_NICK        10
#define SILC_STATUS_ERR_NO_SUCH_CHANNEL     11
#define SILC_STATUS_ERR_NO_SUCH_SERVER      12
#define SILC_STATUS_ERR_INCOMPLETE_INFORMATION    13
#define SILC_STATUS_ERR_NO_RECIPIENT        14
#define SILC_STATUS_ERR_UNKNOWN_COMMAND     15
#define SILC_STATUS_ERR_WILDCARDS           16
#define SILC_STATUS_ERR_NO_CLIENT_ID        17
#define SILC_STATUS_ERR_NO_CHANNEL_ID       18
#define SILC_STATUS_ERR_NO_SERVER_ID        19
#define SILC_STATUS_ERR_BAD_CLIENT_ID       20
#define SILC_STATUS_ERR_BAD_CHANNEL_ID      21
#define SILC_STATUS_ERR_NO_SUCH_CLIENT_ID   22
#define SILC_STATUS_ERR_NO_SUCH_CHANNEL_ID  23
#define SILC_STATUS_ERR_NICKNAME_IN_USE     24
#define SILC_STATUS_ERR_NOT_ON_CHANNEL      25
#define SILC_STATUS_ERR_USER_NOT_ON_CHANNEL 26
#define SILC_STATUS_ERR_USER_ON_CHANNEL     27
#define SILC_STATUS_ERR_NOT_REGISTERED      28
#define SILC_STATUS_ERR_NOT_ENOUGH_PARAMS   29
#define SILC_STATUS_ERR_TOO_MANY_PARAMS     30
#define SILC_STATUS_ERR_PERM_DENIED         31
#define SILC_STATUS_ERR_BANNED_FROM_SERVER  32
#define SILC_STATUS_ERR_BAD_PASSWORD        33
#define SILC_STATUS_ERR_CHANNEL_IS_FULL     34
#define SILC_STATUS_ERR_NOT_INVITED         35
#define SILC_STATUS_ERR_BANNED_FROM_CHANNEL 36
#define SILC_STATUS_ERR_UNKNOWN_MODE        37
#define SILC_STATUS_ERR_NOT_YOU             38
#define SILC_STATUS_ERR_NO_CHANNEL_PRIV     39
#define SILC_STATUS_ERR_NO_CHANNEL_FOPRIV   40
#define SILC_STATUS_ERR_NO_SERVER_PRIV      41
#define SILC_STATUS_ERR_NO_ROUTER_PRIV      42
#define SILC_STATUS_ERR_BAD_NICKNAME        43
#define SILC_STATUS_ERR_BAD_CHANNEL         44
#define SILC_STATUS_ERR_AUTH_FAILED         45
#define SILC_STATUS_ERR_UNKNOWN_ALGORITHM   46
#define SILC_STATUS_ERR_NO_SUCH_SERVER_ID   47
#define SILC_STATUS_ERR_RESOURCE_LIMIT      48
#define SILC_STATUS_ERR_NO_SUCH_SERVICE     49
#define SILC_STATUS_ERR_NOT_AUTHENTICATED   50
#define SILC_STATUS_ERR_BAD_SERVER_ID       51
#define SILC_STATUS_ERR_KEY_EXCHANGE_FAILED 52
#define SILC_STATUS_ERR_BAD_VERSION         53
#define SILC_STATUS_ERR_TIMEDOUT            54
#define SILC_STATUS_ERR_UNSUPPORTED_PUBLIC_KEY    55
#define SILC_STATUS_ERR_OPERATION_ALLOWED   56
#define SILC_STATUS_ERR_BAD_SERVER          57
#define SILC_STATUS_ERR_BAD_USERNAME        58
#define SILC_STATUS_ERR_NO_SUCH_PUBLIC_KEY  59
/***/

#define SILC_STATUS_IS_ERROR(status) (status >= SILC_STATUS_ERR_NO_SUCH_NICK)

/****f* silccore/SilcStatusTypes/silc_status_get_args
 *
 * SYNOPSIS
 *
 *    SilcUInt32 silc_status_get_args(SilcStatus status,
 *                                    SilcArgumentPayload args,
 *                                    void **ret_arg1, **ret_arg2);
 *
 * DESCRIPTION
 *
 *    Parses and returns the arguments from the `args' by the status type
 *    indicated by `status'.  Returns the number of arguments (0, 1 or 2)
 *    parsed.  The caller must free with silc_free the returned arguments.
 *
 ***/
SilcUInt32 silc_status_get_args(SilcStatus status,
				SilcArgumentPayload args,
				void **ret_arg1, void **ret_arg2);


#endif /* SILCSTATUS_H */
