/*
- command.h
+ command.h
Author: Pekka Riikonen <priikone@silcnet.org>
#ifndef COMMAND_H
#define COMMAND_H
-/* Forward declarations */
-typedef struct SilcClientCommandStruct *SilcClientCommand;
-typedef struct SilcClientCommandContextStruct *SilcClientCommandContext;
-
-#include "silcapi.h"
#include "command_reply.h"
/* Structure holding one command and pointer to its function. This
SilcCommandCb command; /* Command function */
SilcCommandCb reply; /* Command reply callback */
char *name; /* Name of the command (optional) */
- uint8 max_args; /* Maximum arguments (optional) */
- uint16 ident; /* Identifier for command (optional) */
+ SilcUInt8 max_args; /* Maximum arguments (optional) */
+ SilcUInt16 ident; /* Identifier for command (optional) */
struct SilcClientCommandStruct *next;
};
SilcClient client;
SilcClientConnection conn;
SilcClientCommand command;
- uint32 argc;
+ SilcUInt32 argc;
unsigned char **argv;
- uint32 *argv_lens;
- uint32 *argv_types;
+ SilcUInt32 *argv_lens;
+ SilcUInt32 *argv_types;
int pending; /* Command is being re-processed when TRUE */
int users; /* Reference counter */
};
executed after command reply has been executed. */
typedef struct SilcClientCommandPendingStruct {
SilcCommand reply_cmd;
+ SilcUInt16 ident;
+ unsigned int reply_check : 8;
SilcCommandCb callback;
void *context;
- uint16 ident;
struct SilcClientCommandPendingStruct *next;
} SilcClientCommandPending;
void silc_client_command_##func(void *context, void *context2)
/* Executed pending command callback */
-#define SILC_CLIENT_PENDING_EXEC(ctx, cmd) \
-do { \
- if ((ctx)->callback) \
- (*ctx->callback)(ctx->context, ctx); \
- silc_client_command_pending_del((ctx)->sock->user_data, (cmd), \
- (ctx)->ident); \
+#define SILC_CLIENT_PENDING_EXEC(ctx, cmd) \
+do { \
+ int _i; \
+ for (_i = 0; _i < ctx->callbacks_count; _i++) \
+ if (ctx->callbacks[_i].callback) \
+ (*ctx->callbacks[_i].callback)(ctx->callbacks[_i].context, ctx); \
+ silc_client_command_pending_del(ctx->sock->user_data, cmd, ctx->ident); \
} while(0)
+SilcClientCommandContext silc_client_command_alloc(void);
+void silc_client_command_free(SilcClientCommandContext ctx);
+SilcClientCommandContext silc_client_command_dup(SilcClientCommandContext ctx);
+SilcClientCommand silc_client_command_find(SilcClient client,
+ const char *name);
bool silc_client_command_register(SilcClient client,
SilcCommand command,
const char *name,
SilcCommandCb command_function,
SilcCommandCb command_reply_function,
- uint8 max_args,
- uint16 ident);
+ SilcUInt8 max_args,
+ SilcUInt16 ident);
bool silc_client_command_unregister(SilcClient client,
SilcCommand command,
SilcCommandCb command_function,
SilcCommandCb command_reply_function,
- uint16 ident);
+ SilcUInt16 ident);
void silc_client_commands_register(SilcClient client);
void silc_client_commands_unregister(SilcClient client);
void silc_client_command_pending_del(SilcClientConnection conn,
SilcCommand reply_cmd,
- uint16 ident);
-int silc_client_command_pending_check(SilcClientConnection conn,
- SilcClientCommandReplyContext ctx,
- SilcCommand command,
- uint16 ident);
-
+ SilcUInt16 ident);
+SilcClientCommandPendingCallbacks
+silc_client_command_pending_check(SilcClientConnection conn,
+ SilcClientCommandReplyContext ctx,
+ SilcCommand command,
+ SilcUInt16 ident,
+ SilcUInt32 *callbacks_count);
+void silc_client_command_process(SilcClient client,
+ SilcSocketConnection sock,
+ SilcPacketContext *packet);
SILC_CLIENT_CMD_FUNC(whois);
SILC_CLIENT_CMD_FUNC(whowas);
SILC_CLIENT_CMD_FUNC(identify);
SILC_CLIENT_CMD_FUNC(quit);
SILC_CLIENT_CMD_FUNC(kill);
SILC_CLIENT_CMD_FUNC(info);
-SILC_CLIENT_CMD_FUNC(connect);
SILC_CLIENT_CMD_FUNC(ping);
SILC_CLIENT_CMD_FUNC(oper);
SILC_CLIENT_CMD_FUNC(join);
SILC_CLIENT_CMD_FUNC(cumode);
SILC_CLIENT_CMD_FUNC(kick);
SILC_CLIENT_CMD_FUNC(ban);
-SILC_CLIENT_CMD_FUNC(close);
-SILC_CLIENT_CMD_FUNC(shutdown);
+SILC_CLIENT_CMD_FUNC(detach);
+SILC_CLIENT_CMD_FUNC(watch);
SILC_CLIENT_CMD_FUNC(silcoper);
SILC_CLIENT_CMD_FUNC(leave);
SILC_CLIENT_CMD_FUNC(users);
SILC_CLIENT_CMD_FUNC(getkey);
+SILC_CLIENT_CMD_FUNC(shutdown);
+SILC_CLIENT_CMD_FUNC(close);
+SILC_CLIENT_CMD_FUNC(connect);
+
#endif