aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--account.c12
-rw-r--r--account.h2
-rw-r--r--protocols/jabber/jabber.c89
-rw-r--r--protocols/nogaim.h1
-rw-r--r--protocols/oscar/oscar.c15
5 files changed, 84 insertions, 35 deletions
diff --git a/account.c b/account.c
index 186565dd..1f2ec165 100644
--- a/account.c
+++ b/account.c
@@ -27,8 +27,6 @@
#include "bitlbee.h"
#include "account.h"
-char *set_eval_account( set_t *set, char *value );
-
account_t *account_add( irc_t *irc, struct prpl *prpl, char *user, char *pass )
{
account_t *a;
@@ -50,19 +48,21 @@ account_t *account_add( irc_t *irc, struct prpl *prpl, char *user, char *pass )
a->auto_connect = 1;
a->irc = irc;
- s = set_add( &a->set, "auto_connect", NULL, set_eval_account, a );
+ s = set_add( &a->set, "auto_connect", "true", set_eval_account, a );
s->flags |= ACC_SET_NOSAVE;
s = set_add( &a->set, "password", NULL, set_eval_account, a );
s->flags |= ACC_SET_NOSAVE;
- s = set_add( &a->set, "server", NULL, set_eval_account, a );
- s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY;
-
s = set_add( &a->set, "username", NULL, set_eval_account, a );
s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY;
set_setstr( &a->set, "username", user );
+ /* This function adds some more settings (and might want to do more
+ things that have to be done now, although I can't think of anything. */
+ if( prpl->acc_init )
+ prpl->acc_init( a );
+
return( a );
}
diff --git a/account.h b/account.h
index 9fed399e..adb63f9e 100644
--- a/account.h
+++ b/account.h
@@ -49,6 +49,8 @@ void account_del( irc_t *irc, account_t *acc );
void account_on( irc_t *irc, account_t *a );
void account_off( irc_t *irc, account_t *a );
+char *set_eval_account( set_t *set, char *value );
+
#define ACC_SET_NOSAVE 1
#define ACC_SET_OFFLINE_ONLY 2
diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c
index c8e8ceca..e7f4534e 100644
--- a/protocols/jabber/jabber.c
+++ b/protocols/jabber/jabber.c
@@ -562,35 +562,17 @@ static void gjab_start(gjconn gjc)
{
account_t *acc;
int port = -1, ssl = 0;
- char *server = NULL, *s;
+ char *server = NULL;
if (!gjc || gjc->state != JCONN_STATE_OFF)
return;
acc = GJ_GC(gjc)->acc;
- if (acc->server) {
- /* If there's a dot, assume there's a hostname in the beginning */
- if (strchr(acc->server, '.')) {
- server = g_strdup(acc->server);
- if ((s = strchr(server, ':')))
- *s = 0;
- }
-
- /* After the hostname, there can be a port number */
- s = strchr(acc->server, ':');
- if (s && isdigit(s[1]))
- sscanf(s + 1, "%d", &port);
-
- /* And if there's the string ssl, the user wants an SSL-connection */
- if (strstr(acc->server, ":ssl") || g_strcasecmp(acc->server, "ssl") == 0)
- ssl = 1;
- }
+ server = acc->server;
+ port = set_getint(&acc->set, "port");
+ ssl = set_getbool(&acc->set, "ssl");
- if (port == -1 && !ssl)
- port = DEFAULT_PORT;
- else if (port == -1 && ssl)
- port = DEFAULT_PORT_SSL;
- else if (port < JABBER_PORT_MIN || port > JABBER_PORT_MAX) {
+ if (port < JABBER_PORT_MIN || port > JABBER_PORT_MAX) {
serv_got_crap(GJ_GC(gjc), "For security reasons, the Jabber port number must be in the %d-%d range.", JABBER_PORT_MIN, JABBER_PORT_MAX);
STATE_EVT(JCONN_STATE_OFF)
return;
@@ -613,8 +595,6 @@ static void gjab_start(gjconn gjc)
gjc->fd = proxy_connect(server, port, gjab_connected, GJ_GC(gjc));
}
- g_free(server);
-
if (!acc->gc || (gjc->fd < 0)) {
STATE_EVT(JCONN_STATE_OFF)
return;
@@ -1515,12 +1495,62 @@ static void jabber_handlestate(gjconn gjc, int state)
return;
}
-static void jabber_login(account_t *acc)
+static void jabber_acc_init(account_t *acc)
{
- struct gaim_connection *gc = new_gaim_conn(acc);
- struct jabber_data *jd = gc->proto_data = g_new0(struct jabber_data, 1);
- char *loginname = create_valid_jid(acc->user, DEFAULT_SERVER, "BitlBee");
+ set_t *s;
+
+ s = set_add( &acc->set, "port", "5222", set_eval_int, acc );
+ s->flags |= ACC_SET_OFFLINE_ONLY;
+
+ s = set_add( &acc->set, "resource", "BitlBee", NULL, acc );
+ s->flags |= ACC_SET_OFFLINE_ONLY;
+
+ s = set_add( &acc->set, "server", NULL, set_eval_account, acc );
+ s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY;
+
+ s = set_add( &acc->set, "ssl", "false", set_eval_bool, acc );
+ s->flags |= ACC_SET_OFFLINE_ONLY;
+}
+static void jabber_login(account_t *acc)
+{
+ struct gaim_connection *gc;
+ struct jabber_data *jd;
+ char *resource, *loginname;
+
+ /* Time to move some data/things from the old syntax to the new one: */
+ if (acc->server) {
+ char *s, *tmp_server;
+ int port;
+
+ if (g_strcasecmp(acc->server, "ssl") == 0) {
+ set_setstr(&acc->set, "server", "");
+ set_setint(&acc->set, "port", DEFAULT_PORT_SSL);
+ set_setstr(&acc->set, "ssl", "true");
+
+ g_free(acc->server);
+ acc->server = NULL;
+ } else if ((s = strchr(acc->server, ':'))) {
+ if (strstr(acc->server, ":ssl")) {
+ set_setint(&acc->set, "port", DEFAULT_PORT_SSL);
+ set_setstr(&acc->set, "ssl", "true");
+ }
+ if (isdigit(s[1])) {
+ if (sscanf(s + 1, "%d", &port) == 1)
+ set_setint(&acc->set, "port", port);
+ }
+ tmp_server = g_strndup(acc->server, s - acc->server);
+ set_setstr(&acc->set, "server", tmp_server);
+ g_free(tmp_server);
+ }
+ }
+
+ gc = new_gaim_conn(acc);
+ jd = gc->proto_data = g_new0(struct jabber_data, 1);
+
+ resource = set_getstr(&acc->set, "resource");
+ loginname = create_valid_jid(acc->user, DEFAULT_SERVER, resource);
+
jd->hash = g_hash_table_new(g_str_hash, g_str_equal);
jd->chats = NULL; /* we have no chats yet */
@@ -2336,6 +2366,7 @@ void jabber_init()
ret->name = "jabber";
ret->away_states = jabber_away_states;
+ ret->acc_init = jabber_acc_init;
ret->login = jabber_login;
ret->close = jabber_close;
ret->send_im = jabber_send_im;
diff --git a/protocols/nogaim.h b/protocols/nogaim.h
index 8c6519c1..c0a867d6 100644
--- a/protocols/nogaim.h
+++ b/protocols/nogaim.h
@@ -128,6 +128,7 @@ struct prpl {
int options;
const char *name;
+ void (* acc_init) (account_t *);
void (* login) (account_t *);
void (* keepalive) (struct gaim_connection *);
void (* close) (struct gaim_connection *);
diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c
index d55ce3f2..28239812 100644
--- a/protocols/oscar/oscar.c
+++ b/protocols/oscar/oscar.c
@@ -355,6 +355,14 @@ static gboolean oscar_login_connect(gpointer data, gint source, b_input_conditio
return FALSE;
}
+static void oscar_acc_init(account_t *acc)
+{
+ set_t *s;
+
+ s = set_add( &acc->set, "server", NULL, set_eval_account, acc );
+ s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY;
+}
+
static void oscar_login(account_t *acc) {
aim_session_t *sess;
aim_conn_t *conn;
@@ -389,6 +397,12 @@ static void oscar_login(account_t *acc) {
return;
}
+ if (acc->server == NULL) {
+ hide_login_progress(gc, "No servername specified");
+ signoff(gc);
+ return;
+ }
+
if (g_strcasecmp(acc->server, "login.icq.com") != 0 &&
g_strcasecmp(acc->server, "login.oscar.aol.com") != 0) {
serv_got_crap(gc, "Warning: Unknown OSCAR server: `%s'. Please review your configuration if the connection fails.",acc->server);
@@ -2648,6 +2662,7 @@ void oscar_init()
ret->name = "oscar";
ret->away_states = oscar_away_states;
ret->login = oscar_login;
+ ret->acc_init = oscar_acc_init;
ret->close = oscar_close;
ret->send_im = oscar_send_im;
ret->get_info = oscar_get_info;