added server_redirect_peek_signal() function.

git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1988 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Timo Sirainen 2001-11-11 22:44:47 +00:00 committed by cras
commit 65f92c5e9d
2 changed files with 56 additions and 21 deletions

View file

@ -25,6 +25,8 @@
#include "irc-servers.h" #include "irc-servers.h"
#include "servers-redirect.h" #include "servers-redirect.h"
#define DEFAULT_REDIRECT_TIMEOUT 60
typedef struct { typedef struct {
int refcount; int refcount;
@ -151,7 +153,7 @@ void server_redirect_register_list(const char *command,
rec = g_new0(REDIRECT_CMD_REC, 1); rec = g_new0(REDIRECT_CMD_REC, 1);
redirect_cmd_ref(rec); redirect_cmd_ref(rec);
rec->remote = remote; rec->remote = remote;
rec->timeout = timeout; rec->timeout = timeout > 0 ? timeout : DEFAULT_REDIRECT_TIMEOUT;
rec->start = start; rec->start = start;
rec->stop = stop; rec->stop = stop;
g_hash_table_insert(command_redirects, g_strdup(command), rec); g_hash_table_insert(command_redirects, g_strdup(command), rec);
@ -365,10 +367,12 @@ static REDIRECT_REC *redirect_find(IRC_SERVER_REC *server, const char *event,
for (tmp = server->redirects; tmp != NULL; tmp = tmp->next) { for (tmp = server->redirects; tmp != NULL; tmp = tmp->next) {
REDIRECT_REC *rec = tmp->data; REDIRECT_REC *rec = tmp->data;
*signal = redirect_match(rec, event, args, match_stop); if (!rec->destroyed) {
if (*signal != NULL) { *signal = redirect_match(rec, event, args, match_stop);
redirect = rec; if (*signal != NULL) {
break; redirect = rec;
break;
}
} }
} }
@ -384,7 +388,7 @@ static REDIRECT_REC *redirect_find(IRC_SERVER_REC *server, const char *event,
next = tmp->next; next = tmp->next;
if (rec->destroyed || if (rec->destroyed ||
(rec->remote && (now-rec->created) > rec->cmd->timeout) || (rec->remote && (now-rec->created) > rec->cmd->timeout) ||
(redirect != NULL && !rec->remote)) { (!rec->remote && redirect != NULL)) {
server->redirects = server->redirects =
g_slist_remove(server->redirects, rec); g_slist_remove(server->redirects, rec);
if (!rec->destroyed && rec->failure_signal != NULL) { if (!rec->destroyed && rec->failure_signal != NULL) {
@ -398,27 +402,27 @@ static REDIRECT_REC *redirect_find(IRC_SERVER_REC *server, const char *event,
return redirect; return redirect;
} }
const char *server_redirect_get_signal(IRC_SERVER_REC *server, static const char *
const char *event, server_redirect_get(IRC_SERVER_REC *server, const char *event,
const char *args) const char *args, REDIRECT_REC **redirect, int *match_stop)
{ {
REDIRECT_REC *redirect;
const char *signal; const char *signal;
int match_stop;
*redirect = NULL;
*match_stop = FALSE;
if (server->redirects == NULL) if (server->redirects == NULL)
return NULL; return NULL;
match_stop = FALSE;
if (server->redirect_continue == NULL) { if (server->redirect_continue == NULL) {
/* find the redirection */ /* find the redirection */
redirect = redirect_find(server, event, args, *redirect = redirect_find(server, event, args,
&signal, &match_stop); &signal, match_stop);
} else { } else {
/* redirection is already started, now we'll just need to /* redirection is already started, now we'll just need to
keep redirecting until stop-event is found. */ keep redirecting until stop-event is found. */
redirect = server->redirect_continue; *redirect = server->redirect_continue;
signal = redirect_match(redirect, event, NULL, &match_stop); signal = redirect_match(*redirect, event, NULL, match_stop);
if (signal == NULL) { if (signal == NULL) {
/* unknown event - redirect to the default signal. /* unknown event - redirect to the default signal.
FIXME: if stop event isn't properly got, this FIXME: if stop event isn't properly got, this
@ -426,10 +430,24 @@ const char *server_redirect_get_signal(IRC_SERVER_REC *server,
we get eg. 10 different unknown events after this, we get eg. 10 different unknown events after this,
or if one of them matches to another redirection, or if one of them matches to another redirection,
abort this. */ abort this. */
signal = redirect->default_signal; signal = (*redirect)->default_signal;
} }
} }
return signal;
}
const char *server_redirect_get_signal(IRC_SERVER_REC *server,
const char *event,
const char *args)
{
REDIRECT_REC *redirect;
const char *signal;
int match_stop;
signal = server_redirect_get(server, event, args,
&redirect, &match_stop);
if (!match_stop || redirect == NULL) if (!match_stop || redirect == NULL)
server->redirect_continue = redirect; server->redirect_continue = redirect;
else { else {
@ -443,6 +461,17 @@ const char *server_redirect_get_signal(IRC_SERVER_REC *server,
return signal; return signal;
} }
const char *server_redirect_peek_signal(IRC_SERVER_REC *server,
const char *event,
const char *args)
{
REDIRECT_REC *redirect;
int match_stop;
return server_redirect_get(server, event, args,
&redirect, &match_stop);
}
static void sig_disconnected(IRC_SERVER_REC *server) static void sig_disconnected(IRC_SERVER_REC *server)
{ {
if (!IS_IRC_SERVER(server)) if (!IS_IRC_SERVER(server))
@ -467,8 +496,8 @@ void servers_redirect_init(void)
command_redirects = g_hash_table_new((GHashFunc) g_str_hash, (GCompareFunc) g_str_equal); command_redirects = g_hash_table_new((GHashFunc) g_str_hash, (GCompareFunc) g_str_equal);
/* WHOIS - register as remote command by default /* WHOIS - register as remote command by default
with a timeout of one minute */ with a default timeout */
server_redirect_register("whois", TRUE, 60, server_redirect_register("whois", TRUE, 0,
"event 311", 1, /* Begins the WHOIS */ "event 311", 1, /* Begins the WHOIS */
"event 401", 1, /* No such nick */ "event 401", 1, /* No such nick */
NULL, NULL,
@ -556,8 +585,8 @@ void servers_redirect_init(void)
"event 472", -1, /* unknown mode (you should check I-mode's existance from 004 event instead of relying on this) */ "event 472", -1, /* unknown mode (you should check I-mode's existance from 004 event instead of relying on this) */
NULL); NULL);
/* PING */ /* PING - use default timeout */
server_redirect_register("ping", TRUE, 60, server_redirect_register("ping", TRUE, 0,
NULL, NULL,
"event 402", -1, /* no such server */ "event 402", -1, /* no such server */
"event pong", -1, /* PONG */ "event pong", -1, /* PONG */

View file

@ -60,6 +60,12 @@ void server_redirect_command(IRC_SERVER_REC *server, const char *command,
const char *server_redirect_get_signal(IRC_SERVER_REC *server, const char *server_redirect_get_signal(IRC_SERVER_REC *server,
const char *event, const char *event,
const char *args); const char *args);
/* Returns the redirection signal for specified event.
Doesn't change the server state in any way, so if you really wish to
use the signal, call server_redirect_get_signal() after this. */
const char *server_redirect_peek_signal(IRC_SERVER_REC *server,
const char *event,
const char *args);
/* Destroy redirection record */ /* Destroy redirection record */
void server_redirect_destroy(REDIRECT_REC *rec); void server_redirect_destroy(REDIRECT_REC *rec);