/* silcstatus.c Author: Pekka Riikonen Copyright (C) 2003 - 2006 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. */ /* $Id$ */ #include "silc.h" #include "silcstatus.h" /* Returns arguments by the status type. */ SilcUInt32 silc_status_get_args(SilcStatus status, SilcArgumentPayload args, void **ret_arg1, void **ret_arg2) { SilcUInt32 num, len; unsigned char *tmp; assert(ret_arg1 && ret_arg2); num = silc_argument_get_arg_num(args); if (num > 3) return 0; if (num == 0) return 0; switch (status) { case SILC_STATUS_ERR_NO_SUCH_NICK: case SILC_STATUS_ERR_NO_SUCH_CHANNEL: case SILC_STATUS_ERR_NO_SUCH_SERVER: case SILC_STATUS_ERR_NO_SUCH_SERVICE: case SILC_STATUS_ERR_UNKNOWN_ALGORITHM: tmp = silc_argument_get_arg_type(args, 2, &len); if (!tmp) return 0; *ret_arg1 = silc_memdup(tmp, len); if (!(*ret_arg1)) return 0; num = 1; break; case SILC_STATUS_ERR_NO_SUCH_CLIENT_ID: case SILC_STATUS_ERR_BAD_CLIENT_ID: { SilcID id; tmp = silc_argument_get_arg_type(args, 2, &len); if (!tmp) return 0; if (silc_id_payload_parse_id(tmp, len, &id)) return 0; *ret_arg1 = silc_id_dup(&id.u.client_id, SILC_ID_CLIENT); if (!(*ret_arg1)) return 0; num = 1; } break; case SILC_STATUS_ERR_NO_SUCH_SERVER_ID: case SILC_STATUS_ERR_BAD_SERVER_ID: { SilcID id; tmp = silc_argument_get_arg_type(args, 2, &len); if (!tmp) return 0; if (silc_id_payload_parse_id(tmp, len, &id)) return 0; *ret_arg1 = silc_id_dup(&id.u.server_id, SILC_ID_SERVER); if (!(*ret_arg1)) return 0; num = 1; } break; case SILC_STATUS_ERR_NO_SUCH_CHANNEL_ID: case SILC_STATUS_ERR_BAD_CHANNEL_ID: case SILC_STATUS_ERR_NOT_ON_CHANNEL: case SILC_STATUS_ERR_CHANNEL_IS_FULL: case SILC_STATUS_ERR_NOT_INVITED: case SILC_STATUS_ERR_BANNED_FROM_CHANNEL: case SILC_STATUS_ERR_NO_CHANNEL_PRIV: case SILC_STATUS_ERR_NO_CHANNEL_FOPRIV: { SilcID id; tmp = silc_argument_get_arg_type(args, 2, &len); if (!tmp) return 0; if (silc_id_payload_parse_id(tmp, len, &id)) return 0; *ret_arg1 = silc_id_dup(&id.u.channel_id, SILC_ID_CHANNEL); if (!(*ret_arg1)) return 0; num = 1; } break; case SILC_STATUS_ERR_USER_NOT_ON_CHANNEL: case SILC_STATUS_ERR_USER_ON_CHANNEL: { SilcID id; tmp = silc_argument_get_arg_type(args, 2, &len); if (!tmp) return 0; if (silc_id_payload_parse_id(tmp, len, &id)) return 0; *ret_arg1 = silc_id_dup(&id.u.client_id, id.type); if (!(*ret_arg1)) return 0; num = 1; tmp = silc_argument_get_arg_type(args, 3, &len); if (!tmp) return num; if (silc_id_payload_parse_id(tmp, len, &id)) return 0; *ret_arg2 = silc_id_dup(&id.u.channel_id, id.type); if (!(*ret_arg2)) return num; num = 2; } break; default: return 0; break; } return num; }