+/* Process received command reply payload */
+
+SILC_FSM_STATE(silc_client_command_reply_process)
+{
+ SilcClientCommandContext cmd = fsm_context;
+ SilcCommandPayload payload = state_context;
+
+ silc_command_get_status(payload, &cmd->status, &cmd->error);
+
+ switch (cmd->cmd) {
+ case SILC_COMMAND_WHOIS:
+ /** WHOIS */
+ silc_fsm_next(fsm, silc_client_command_reply_whois);
+ break;
+ case SILC_COMMAND_WHOWAS:
+ /** WHOWAS */
+ silc_fsm_next(fsm, silc_client_command_reply_whowas);
+ break;
+ case SILC_COMMAND_IDENTIFY:
+ /** IDENTIFY */
+ silc_fsm_next(fsm, silc_client_command_reply_identify);
+ break;
+ case SILC_COMMAND_NICK:
+ /** NICK */
+ silc_fsm_next(fsm, silc_client_command_reply_nick);
+ break;
+ case SILC_COMMAND_LIST:
+ /** LIST */
+ silc_fsm_next(fsm, silc_client_command_reply_list);
+ break;
+ case SILC_COMMAND_TOPIC:
+ /** TOPIC */
+ silc_fsm_next(fsm, silc_client_command_reply_topic);
+ break;
+ case SILC_COMMAND_INVITE:
+ /** INVITE */
+ silc_fsm_next(fsm, silc_client_command_reply_invite);
+ break;
+ case SILC_COMMAND_QUIT:
+ /** QUIT */
+ silc_fsm_next(fsm, silc_client_command_reply_quit);
+ break;
+ case SILC_COMMAND_KILL:
+ /** KILL */
+ silc_fsm_next(fsm, silc_client_command_reply_kill);
+ break;
+ case SILC_COMMAND_INFO:
+ /** INFO */
+ silc_fsm_next(fsm, silc_client_command_reply_info);
+ break;
+ case SILC_COMMAND_STATS:
+ /** STATS */
+ silc_fsm_next(fsm, silc_client_command_reply_stats);
+ break;
+ case SILC_COMMAND_PING:
+ /** PING */
+ silc_fsm_next(fsm, silc_client_command_reply_ping);
+ break;
+ case SILC_COMMAND_OPER:
+ /** OPER */
+ silc_fsm_next(fsm, silc_client_command_reply_oper);
+ break;
+ case SILC_COMMAND_JOIN:
+ /** JOIN */
+ silc_fsm_next(fsm, silc_client_command_reply_join);
+ break;
+ case SILC_COMMAND_MOTD:
+ /** MOTD */
+ silc_fsm_next(fsm, silc_client_command_reply_motd);
+ break;
+ case SILC_COMMAND_UMODE:
+ /** UMODE */
+ silc_fsm_next(fsm, silc_client_command_reply_umode);
+ break;
+ case SILC_COMMAND_CMODE:
+ /** CMODE */
+ silc_fsm_next(fsm, silc_client_command_reply_cmode);
+ break;
+ case SILC_COMMAND_CUMODE:
+ /** CUMODE */
+ silc_fsm_next(fsm, silc_client_command_reply_cumode);
+ break;
+ case SILC_COMMAND_KICK:
+ /** KICK */
+ silc_fsm_next(fsm, silc_client_command_reply_kick);
+ break;
+ case SILC_COMMAND_BAN:
+ /** BAN */
+ silc_fsm_next(fsm, silc_client_command_reply_ban);
+ break;
+ case SILC_COMMAND_DETACH:
+ /** DETACH */
+ silc_fsm_next(fsm, silc_client_command_reply_detach);
+ break;
+ case SILC_COMMAND_WATCH:
+ /** WATCH */
+ silc_fsm_next(fsm, silc_client_command_reply_watch);
+ break;
+ case SILC_COMMAND_SILCOPER:
+ /** SILCOPER */
+ silc_fsm_next(fsm, silc_client_command_reply_silcoper);
+ break;
+ case SILC_COMMAND_LEAVE:
+ /** LEAVE */
+ silc_fsm_next(fsm, silc_client_command_reply_leave);
+ break;
+ case SILC_COMMAND_USERS:
+ /** USERS */
+ silc_fsm_next(fsm, silc_client_command_reply_users);
+ break;
+ case SILC_COMMAND_GETKEY:
+ /** GETKEY */
+ silc_fsm_next(fsm, silc_client_command_reply_getkey);
+ break;
+ case SILC_COMMAND_SERVICE:
+ /** SERVICE */
+ silc_fsm_next(fsm, silc_client_command_reply_service);
+ break;
+ default:
+ return SILC_FSM_FINISH;
+ }
+
+ return SILC_FSM_CONTINUE;
+}
+
+/* Completes command reply processing */
+
+SILC_FSM_STATE(silc_client_command_reply_processed)
+{
+ SilcClientCommandContext cmd = fsm_context;
+ SilcClientConnection conn = cmd->conn;
+ SilcCommandPayload payload = state_context;
+
+ silc_command_payload_free(payload);
+
+ if (cmd->status == SILC_STATUS_OK || cmd->status == SILC_STATUS_LIST_END ||
+ SILC_STATUS_IS_ERROR(cmd->status))
+ return SILC_FSM_FINISH;
+
+ /* Add back to pending command reply list */
+ silc_mutex_lock(conn->internal->lock);
+ cmd->resolved = FALSE;
+ silc_list_add(conn->internal->pending_commands, cmd);
+ silc_mutex_unlock(conn->internal->lock);
+
+ /** Wait more command payloads */
+ silc_fsm_next(fsm, silc_client_command_reply_wait);
+ return SILC_FSM_CONTINUE;
+}
+
+/******************************** WHOIS *************************************/
+
+/* Received reply for WHOIS command. */
+
+SILC_FSM_STATE(silc_client_command_reply_whois)