add Stream-Management support to bot example
Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de>
This commit is contained in:
@@ -23,6 +23,8 @@
|
|||||||
|
|
||||||
#include <strophe.h>
|
#include <strophe.h>
|
||||||
|
|
||||||
|
static int reconnect;
|
||||||
|
|
||||||
int version_handler(xmpp_conn_t *conn, xmpp_stanza_t *stanza, void *userdata)
|
int version_handler(xmpp_conn_t *conn, xmpp_stanza_t *stanza, void *userdata)
|
||||||
{
|
{
|
||||||
xmpp_stanza_t *reply, *query, *name, *version, *text;
|
xmpp_stanza_t *reply, *query, *name, *version, *text;
|
||||||
@@ -96,6 +98,10 @@ int message_handler(xmpp_conn_t *conn, xmpp_stanza_t *stanza, void *userdata)
|
|||||||
if (strcmp(intext, "quit") == 0) {
|
if (strcmp(intext, "quit") == 0) {
|
||||||
replytext = strdup("bye!");
|
replytext = strdup("bye!");
|
||||||
quit = 1;
|
quit = 1;
|
||||||
|
} else if (strcmp(intext, "reconnect") == 0) {
|
||||||
|
replytext = strdup("alright, let's see what happens!");
|
||||||
|
reconnect = 1;
|
||||||
|
quit = 1;
|
||||||
} else {
|
} else {
|
||||||
replytext = (char *)malloc(strlen(" to you too!") + strlen(intext) + 1);
|
replytext = (char *)malloc(strlen(" to you too!") + strlen(intext) + 1);
|
||||||
strcpy(replytext, intext);
|
strcpy(replytext, intext);
|
||||||
@@ -190,6 +196,7 @@ int main(int argc, char **argv)
|
|||||||
xmpp_ctx_t *ctx;
|
xmpp_ctx_t *ctx;
|
||||||
xmpp_conn_t *conn;
|
xmpp_conn_t *conn;
|
||||||
xmpp_log_t *log;
|
xmpp_log_t *log;
|
||||||
|
xmpp_sm_state_t *sm_state = NULL;
|
||||||
char *jid = NULL, *password = NULL, *host = NULL, *cert = NULL, *key = NULL;
|
char *jid = NULL, *password = NULL, *host = NULL, *cert = NULL, *key = NULL;
|
||||||
long flags = 0;
|
long flags = 0;
|
||||||
int i, tcp_keepalive = 0;
|
int i, tcp_keepalive = 0;
|
||||||
@@ -239,6 +246,8 @@ int main(int argc, char **argv)
|
|||||||
/* create a context */
|
/* create a context */
|
||||||
ctx = xmpp_ctx_new(NULL, log);
|
ctx = xmpp_ctx_new(NULL, log);
|
||||||
|
|
||||||
|
create_connection:
|
||||||
|
reconnect = 0;
|
||||||
/* create a connection */
|
/* create a connection */
|
||||||
conn = xmpp_conn_new(ctx);
|
conn = xmpp_conn_new(ctx);
|
||||||
|
|
||||||
@@ -261,6 +270,12 @@ int main(int argc, char **argv)
|
|||||||
if (tcp_keepalive)
|
if (tcp_keepalive)
|
||||||
xmpp_conn_set_sockopt_callback(conn, xmpp_sockopt_cb_keepalive);
|
xmpp_conn_set_sockopt_callback(conn, xmpp_sockopt_cb_keepalive);
|
||||||
|
|
||||||
|
/* set Stream-Mangement state if available */
|
||||||
|
if (sm_state) {
|
||||||
|
xmpp_conn_set_sm_state(conn, sm_state);
|
||||||
|
sm_state = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* initiate connection */
|
/* initiate connection */
|
||||||
if (xmpp_connect_client(conn, host, port, conn_handler, ctx) == XMPP_EOK) {
|
if (xmpp_connect_client(conn, host, port, conn_handler, ctx) == XMPP_EOK) {
|
||||||
|
|
||||||
@@ -269,8 +284,17 @@ int main(int argc, char **argv)
|
|||||||
xmpp_run(ctx);
|
xmpp_run(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* release our connection and context */
|
/* save the Stream-Mangement state if we should re-connect */
|
||||||
|
if (reconnect)
|
||||||
|
sm_state = xmpp_conn_get_sm_state(conn);
|
||||||
|
|
||||||
|
/* release our connection */
|
||||||
xmpp_conn_release(conn);
|
xmpp_conn_release(conn);
|
||||||
|
|
||||||
|
if (reconnect)
|
||||||
|
goto create_connection;
|
||||||
|
|
||||||
|
/* release our context */
|
||||||
xmpp_ctx_free(ctx);
|
xmpp_ctx_free(ctx);
|
||||||
|
|
||||||
/* final shutdown of the library */
|
/* final shutdown of the library */
|
||||||
|
|||||||
Reference in New Issue
Block a user