Added id handler
This commit is contained in:
@@ -46,3 +46,10 @@ stbbr_auth_passwd(char *password)
|
|||||||
prime_required_passwd(password);
|
prime_required_passwd(password);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
stbbr_for(char *id, char *stanza)
|
||||||
|
{
|
||||||
|
prime_for(id, stanza);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ static XMPPStanza *curr_stanza;
|
|||||||
|
|
||||||
static stream_start_func stream_start_cb = NULL;
|
static stream_start_func stream_start_cb = NULL;
|
||||||
static auth_func auth_cb = NULL;
|
static auth_func auth_cb = NULL;
|
||||||
|
static id_func id_cb = NULL;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
start_element(void *data, const char *element, const char **attributes)
|
start_element(void *data, const char *element, const char **attributes)
|
||||||
@@ -44,18 +45,20 @@ end_element(void *data, const char *element)
|
|||||||
{
|
{
|
||||||
depth--;
|
depth--;
|
||||||
|
|
||||||
if (stanza_get_child_by_ns(curr_stanza, "jabber:iq:auth")) {
|
|
||||||
auth_cb(curr_stanza, xmppclient);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (depth > 0) {
|
if (depth > 0) {
|
||||||
stanza_add_child(curr_stanza->parent, curr_stanza);
|
stanza_add_child(curr_stanza->parent, curr_stanza);
|
||||||
curr_stanza = curr_stanza->parent;
|
curr_stanza = curr_stanza->parent;
|
||||||
} else {
|
} else {
|
||||||
stanza_add(curr_stanza);
|
stanza_add(curr_stanza);
|
||||||
}
|
if (stanza_get_child_by_ns(curr_stanza, "jabber:iq:auth")) {
|
||||||
|
auth_cb(curr_stanza, xmppclient);
|
||||||
|
} else {
|
||||||
|
const char *id = stanza_get_id(curr_stanza);
|
||||||
|
if (id) {
|
||||||
|
id_cb(id, xmppclient);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (depth == 0) {
|
|
||||||
do_reset = 1;
|
do_reset = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -71,11 +74,12 @@ handle_data(void *data, const char *content, int length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
parser_init(XMPPClient *client, stream_start_func startcb, auth_func authcb)
|
parser_init(XMPPClient *client, stream_start_func startcb, auth_func authcb, id_func idcb)
|
||||||
{
|
{
|
||||||
xmppclient = client;
|
xmppclient = client;
|
||||||
stream_start_cb = startcb;
|
stream_start_cb = startcb;
|
||||||
auth_cb = authcb;
|
auth_cb = authcb;
|
||||||
|
id_cb = idcb;
|
||||||
|
|
||||||
parser = XML_ParserCreate(NULL);
|
parser = XML_ParserCreate(NULL);
|
||||||
XML_SetElementHandler(parser, start_element, end_element);
|
XML_SetElementHandler(parser, start_element, end_element);
|
||||||
@@ -99,7 +103,7 @@ parser_reset(void)
|
|||||||
{
|
{
|
||||||
if (do_reset == 1) {
|
if (do_reset == 1) {
|
||||||
parser_close();
|
parser_close();
|
||||||
parser_init(xmppclient, stream_start_cb, auth_cb);
|
parser_init(xmppclient, stream_start_cb, auth_cb, id_cb);
|
||||||
do_reset = 0;
|
do_reset = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,9 @@
|
|||||||
|
|
||||||
typedef void (*stream_start_func)(XMPPClient *client);
|
typedef void (*stream_start_func)(XMPPClient *client);
|
||||||
typedef void (*auth_func)(XMPPStanza *stanza, XMPPClient *client);
|
typedef void (*auth_func)(XMPPStanza *stanza, XMPPClient *client);
|
||||||
|
typedef void (*id_func)(const char *id, XMPPClient *client);
|
||||||
|
|
||||||
void parser_init(XMPPClient *client, stream_start_func startcb, auth_func authcb);
|
void parser_init(XMPPClient *client, stream_start_func startcb, auth_func authcb, id_func);
|
||||||
int parser_feed(char *chunk, int len);
|
int parser_feed(char *chunk, int len);
|
||||||
void parser_close(void);
|
void parser_close(void);
|
||||||
void parser_reset(void);
|
void parser_reset(void);
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static char *required_passwd = NULL;
|
static char *required_passwd = NULL;
|
||||||
|
static GHashTable *idstubs;
|
||||||
|
|
||||||
void
|
void
|
||||||
prime_required_passwd(char *password)
|
prime_required_passwd(char *password)
|
||||||
@@ -13,3 +17,23 @@ prime_get_passwd(void)
|
|||||||
{
|
{
|
||||||
return required_passwd;
|
return required_passwd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
prime_for(char *id, char *stanza)
|
||||||
|
{
|
||||||
|
if (!idstubs) {
|
||||||
|
idstubs = g_hash_table_new_full(g_str_hash, g_str_equal, free, free);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_hash_table_insert(idstubs, strdup(id), strdup(stanza));
|
||||||
|
}
|
||||||
|
|
||||||
|
char*
|
||||||
|
prime_get_for(const char *id)
|
||||||
|
{
|
||||||
|
if (idstubs) {
|
||||||
|
return g_hash_table_lookup(idstubs, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,4 +4,7 @@
|
|||||||
void prime_required_passwd(char *password);
|
void prime_required_passwd(char *password);
|
||||||
char* prime_get_passwd(void);
|
char* prime_get_passwd(void);
|
||||||
|
|
||||||
|
int prime_for(char *id, char *stanza);
|
||||||
|
char* prime_get_for(const char *id);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -166,6 +166,18 @@ auth_callback(XMPPStanza *stanza, XMPPClient *client)
|
|||||||
log_print("RECV: ");
|
log_print("RECV: ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
id_callback(const char *id, XMPPClient *client)
|
||||||
|
{
|
||||||
|
char *stanza_ret = prime_get_for(id);
|
||||||
|
if (stanza_ret) {
|
||||||
|
log_print_chars("\n");
|
||||||
|
log_println("--> ID callback fired for '%s'", id);
|
||||||
|
send_to(client, stanza_ret);
|
||||||
|
log_print("RECV: ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
server_run(int port)
|
server_run(int port)
|
||||||
{
|
{
|
||||||
@@ -224,7 +236,7 @@ server_run(int port)
|
|||||||
}
|
}
|
||||||
|
|
||||||
client = xmppclient_new(client_addr, client_socket);
|
client = xmppclient_new(client_addr, client_socket);
|
||||||
parser_init(client, stream_start_callback, auth_callback);
|
parser_init(client, stream_start_callback, auth_callback, id_callback);
|
||||||
log_print("RECV: ");
|
log_print("RECV: ");
|
||||||
int res = listen_for_xmlstart(client);
|
int res = listen_for_xmlstart(client);
|
||||||
if (res == -1) {
|
if (res == -1) {
|
||||||
|
|||||||
@@ -2,5 +2,4 @@
|
|||||||
#define __H_SERVER
|
#define __H_SERVER
|
||||||
|
|
||||||
int server_run(int port);
|
int server_run(int port);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -139,3 +139,27 @@ stanza_get_child_by_name(XMPPStanza *stanza, char *name)
|
|||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
stanza_get_id(XMPPStanza *stanza)
|
||||||
|
{
|
||||||
|
if (!stanza) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stanza->attrs) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
GList *curr_attr = stanza->attrs;
|
||||||
|
while (curr_attr) {
|
||||||
|
XMPPAttr *attr = curr_attr->data;
|
||||||
|
if (g_strcmp0(attr->name, "id") == 0) {
|
||||||
|
return attr->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
curr_attr = g_list_next(curr_attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ void stanza_show(XMPPStanza *stanza);
|
|||||||
void stanza_show_all(void);
|
void stanza_show_all(void);
|
||||||
void stanza_add(XMPPStanza *stanza);
|
void stanza_add(XMPPStanza *stanza);
|
||||||
void stanza_add_child(XMPPStanza *parent, XMPPStanza *child);
|
void stanza_add_child(XMPPStanza *parent, XMPPStanza *child);
|
||||||
|
const char* stanza_get_id(XMPPStanza *stanza);
|
||||||
|
|
||||||
XMPPStanza* stanza_get_child_by_ns(XMPPStanza *stanza, char *ns);
|
XMPPStanza* stanza_get_child_by_ns(XMPPStanza *stanza, char *ns);
|
||||||
XMPPStanza* stanza_get_child_by_name(XMPPStanza *stanza, char *name);
|
XMPPStanza* stanza_get_child_by_name(XMPPStanza *stanza, char *name);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user