SILC_CLIENT_CMD_REPLY_FUNC(list)
{
SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context;
+ SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data;
unsigned char *tmp, *name, *topic;
- SilcUInt32 usercount = 0;
+ SilcUInt32 usercount = 0, len;
+ SilcChannelID *channel_id = NULL;
+ SilcChannelEntry channel_entry;
COMMAND_CHECK_STATUS_LIST;
+ tmp = silc_argument_get_arg_type(cmd->args, 2, &len);
+ if (!tmp) {
+ COMMAND_REPLY_ERROR;
+ goto out;
+ }
+
+ channel_id = silc_id_payload_parse_id(tmp, len, NULL);
+ if (!channel_id) {
+ COMMAND_REPLY_ERROR;
+ goto out;
+ }
+
name = silc_argument_get_arg_type(cmd->args, 3, NULL);
+ if (!name) {
+ COMMAND_REPLY_ERROR;
+ goto out;
+ }
+
topic = silc_argument_get_arg_type(cmd->args, 4, NULL);
tmp = silc_argument_get_arg_type(cmd->args, 5, NULL);
if (tmp)
SILC_GET32_MSB(usercount, tmp);
+ /* Check whether the channel exists, and add it to cache if it doesn't. */
+ channel_entry = silc_client_get_channel_by_id(cmd->client, conn,
+ channel_id);
+ if (!channel_entry) {
+ /* Add new channel entry */
+ channel_entry = silc_client_add_channel(cmd->client, conn, name, 0,
+ channel_id);
+ if (!channel_entry) {
+ COMMAND_REPLY_ERROR;
+ goto out;
+ }
+ channel_id = NULL;
+ }
+
/* Notify application */
- COMMAND_REPLY((ARGS, NULL, name, topic, usercount));
+ COMMAND_REPLY((ARGS, channel_entry, name, topic, usercount));
/* Pending callbacks are not executed if this was an list entry */
if (cmd->status != SILC_STATUS_OK &&
}
out:
+ silc_free(channel_id);
SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_LIST);
silc_client_command_reply_free(cmd);
}
silc_client_command_reply_free(cmd);
}
-SILC_CLIENT_CMD_REPLY_FUNC(connect)
-{
- SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context;
- SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data;
-
- if (cmd->status != SILC_STATUS_OK) {
- SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR,
- "%s", silc_client_command_status_message(cmd->status));
- COMMAND_REPLY_ERROR;
- goto out;
- }
-
- /* Notify application */
- COMMAND_REPLY((ARGS));
-
- out:
- SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_CONNECT);
- silc_client_command_reply_free(cmd);
-}
-
SILC_CLIENT_CMD_REPLY_FUNC(ban)
{
SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context;
silc_client_command_reply_free(cmd);
}
-SILC_CLIENT_CMD_REPLY_FUNC(close)
-{
- SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context;
- SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data;
-
- if (cmd->status != SILC_STATUS_OK) {
- SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR,
- "%s", silc_client_command_status_message(cmd->status));
- COMMAND_REPLY_ERROR;
- goto out;
- }
-
- /* Notify application */
- COMMAND_REPLY((ARGS));
+/* Reply to LEAVE command. */
- out:
- SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_CLOSE);
- silc_client_command_reply_free(cmd);
-}
-
-SILC_CLIENT_CMD_REPLY_FUNC(shutdown)
+SILC_CLIENT_CMD_REPLY_FUNC(leave)
{
SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context;
SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data;
+ SilcChannelID *channel_id;
+ SilcChannelEntry channel = NULL;
+ unsigned char *tmp;
+ SilcUInt32 len;
if (cmd->status != SILC_STATUS_OK) {
SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR,
goto out;
}
- /* Notify application */
- COMMAND_REPLY((ARGS));
-
- out:
- SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_SHUTDOWN);
- silc_client_command_reply_free(cmd);
-}
-
-/* Reply to LEAVE command. */
+ /* From protocol version 1.1 we get the channel ID of the left channel */
+ tmp = silc_argument_get_arg_type(cmd->args, 2, &len);
+ if (tmp) {
+ channel_id = silc_id_payload_parse_id(tmp, len, NULL);
+ if (!channel_id)
+ goto out;
-SILC_CLIENT_CMD_REPLY_FUNC(leave)
-{
- SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context;
- SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data;
+ /* Get the channel entry */
+ channel = silc_client_get_channel_by_id(cmd->client, conn, channel_id);
+ if (!channel) {
+ silc_free(channel_id);
+ COMMAND_REPLY_ERROR;
+ goto out;
+ }
- if (cmd->status != SILC_STATUS_OK) {
- SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR,
- "%s", silc_client_command_status_message(cmd->status));
- COMMAND_REPLY_ERROR;
- goto out;
+ silc_free(channel_id);
}
/* Notify application */
- COMMAND_REPLY((ARGS));
+ COMMAND_REPLY((ARGS, channel));
out:
SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_LEAVE);
silc_free(server_id);
silc_client_command_reply_free(cmd);
}
+
+
+/* Private range commands, specific to this implementation (and compatible
+ with SILC Server). */
+
+SILC_CLIENT_CMD_REPLY_FUNC(connect)
+{
+ SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context;
+ SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data;
+
+ if (cmd->status != SILC_STATUS_OK) {
+ SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR,
+ "%s", silc_client_command_status_message(cmd->status));
+ COMMAND_REPLY_ERROR;
+ goto out;
+ }
+
+ /* Notify application */
+ COMMAND_REPLY((ARGS));
+
+ out:
+ SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_PRIV_CONNECT);
+ silc_client_command_reply_free(cmd);
+}
+
+SILC_CLIENT_CMD_REPLY_FUNC(close)
+{
+ SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context;
+ SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data;
+
+ if (cmd->status != SILC_STATUS_OK) {
+ SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR,
+ "%s", silc_client_command_status_message(cmd->status));
+ COMMAND_REPLY_ERROR;
+ goto out;
+ }
+
+ /* Notify application */
+ COMMAND_REPLY((ARGS));
+
+ out:
+ SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_PRIV_CLOSE);
+ silc_client_command_reply_free(cmd);
+}
+
+SILC_CLIENT_CMD_REPLY_FUNC(shutdown)
+{
+ SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context;
+ SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data;
+
+ if (cmd->status != SILC_STATUS_OK) {
+ SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR,
+ "%s", silc_client_command_status_message(cmd->status));
+ COMMAND_REPLY_ERROR;
+ goto out;
+ }
+
+ /* Notify application */
+ COMMAND_REPLY((ARGS));
+
+ out:
+ SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_PRIV_SHUTDOWN);
+ silc_client_command_reply_free(cmd);
+}
+