summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Franzke <benjaminfranzke@googlemail.com>2011-09-23 10:53:51 +0200
committerBenjamin Franzke <benjaminfranzke@googlemail.com>2011-09-23 10:53:51 +0200
commitd1fac4d941aaa9dbf9e72540f97d928af241cb5e (patch)
treefd360bbafbc5b90bbc088671d0306b38043622a1
parente50020020c9770e180735361182e9968249cbfa2 (diff)
downloadcmumble-d1fac4d941aaa9dbf9e72540f97d928af241cb5e.tar.gz
cmumble-d1fac4d941aaa9dbf9e72540f97d928af241cb5e.tar.bz2
cmumble-d1fac4d941aaa9dbf9e72540f97d928af241cb5e.zip
Store callbacks in context
-rw-r--r--src/cmumble.c10
-rw-r--r--src/cmumble.h13
-rw-r--r--src/connection.c6
-rw-r--r--src/connection.h6
-rw-r--r--src/messages.c13
5 files changed, 22 insertions, 26 deletions
diff --git a/src/cmumble.c b/src/cmumble.c
index bb2e934..5cc61c0 100644
--- a/src/cmumble.c
+++ b/src/cmumble.c
@@ -205,7 +205,12 @@ recv_user_state(MumbleProto__UserState *state, struct context *ctx)
ctx->users = g_list_prepend(ctx->users, user);
}
-static struct mumble_callbacks callbacks = {
+
+static const struct {
+#define MUMBLE_MSG(a,b) void (* a)(MumbleProto__##a *, struct context *);
+ MUMBLE_MSGS
+#undef MUMBLE_MSG
+} callbacks = {
.Version = recv_version,
.UDPTunnel = recv_udp_tunnel,
.Authenticate = NULL,
@@ -380,8 +385,9 @@ int main(int argc, char **argv)
g_type_init();
ctx.loop = g_main_loop_new(NULL, FALSE);
+ ctx.callbacks = (const callback_t *) &callbacks;
- if (cmumble_connection_init(&ctx, host, port, &callbacks) < 0)
+ if (cmumble_connection_init(&ctx, host, port) < 0)
return 1;
{
diff --git a/src/cmumble.h b/src/cmumble.h
index f315368..9f40d31 100644
--- a/src/cmumble.h
+++ b/src/cmumble.h
@@ -18,9 +18,12 @@
#include "io.h"
#include "connection.h"
+typedef void (*callback_t)(ProtobufCMessage *msg, struct context *);
+
struct context {
struct cmumble_connection con;
struct cmumble_io io;
+ const callback_t *callbacks;
GMainLoop *loop;
uint32_t session;
@@ -60,18 +63,10 @@ enum mumble_message {
#undef MUMBLE_MSG
};
-struct mumble_callbacks {
-#define MUMBLE_MSG(a,b) void (* a)(MumbleProto__##a *, struct context *);
- MUMBLE_MSGS
-#undef MUMBLE_MSG
-};
-
-typedef void (*callback_t)(ProtobufCMessage *msg, struct context *);
-
void
send_msg(struct context *ctx, ProtobufCMessage *msg);
int
-recv_msg(struct context *ctx, const struct mumble_callbacks *callbacks);
+recv_msg(struct context *ctx);
#endif
diff --git a/src/connection.c b/src/connection.c
index 3494d08..7cb48e6 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -12,7 +12,7 @@ read_cb(GObject *pollable_stream, gpointer data)
gint count;
do {
- count = recv_msg(ctx, ctx->con.callbacks);
+ count = recv_msg(ctx);
} while (count && g_pollable_input_stream_is_readable(input));
return TRUE;
@@ -46,13 +46,11 @@ setup_ping_timer(struct context *ctx)
int
cmumble_connection_init(struct context *ctx,
- const char *host, int port,
- struct mumble_callbacks *callbacks)
+ const char *host, int port)
{
struct cmumble_connection *con = &ctx->con;
GError *error = NULL;
- con->callbacks = callbacks;
con->sock_client = g_socket_client_new();
g_socket_client_set_tls(con->sock_client, TRUE);
g_socket_client_set_tls_validation_flags(con->sock_client,
diff --git a/src/connection.h b/src/connection.h
index e38150d..cf3dbc0 100644
--- a/src/connection.h
+++ b/src/connection.h
@@ -12,17 +12,13 @@ struct cmumble_connection {
GOutputStream *output;
GSource *source;
-
- struct mumble_callbacks *callbacks;
};
struct context;
-struct mumble_callbacks;
int
cmumble_connection_init(struct context *ctx,
- const char *host, int port,
- struct mumble_callbacks *cbs);
+ const char *host, int port);
int
cmumble_connection_fini(struct context *ctx);
diff --git a/src/messages.c b/src/messages.c
index 8807166..98b53e3 100644
--- a/src/messages.c
+++ b/src/messages.c
@@ -71,16 +71,17 @@ send_msg(struct context *ctx, ProtobufCMessage *msg)
}
int
-recv_msg(struct context *ctx, const struct mumble_callbacks *cbs)
+recv_msg(struct context *ctx)
{
uint8_t preamble[PREAMBLE_SIZE];
ProtobufCMessage *msg;
gchar *data;
int type, len;
gssize ret;
- const callback_t *callbacks = (const callback_t *) cbs;
GError *error = NULL;
+ g_assert(ctx->callbacks);
+
ret = g_pollable_input_stream_read_nonblocking(ctx->con.input,
preamble, PREAMBLE_SIZE,
NULL, &error);
@@ -121,8 +122,8 @@ recv_msg(struct context *ctx, const struct mumble_callbacks *cbs)
udptunnel.packet.len = len;
udptunnel.packet.data = (uint8_t *) data;
- if (callbacks[UDPTunnel])
- callbacks[UDPTunnel](&udptunnel.base, ctx);
+ if (ctx->callbacks[UDPTunnel])
+ ctx->callbacks[UDPTunnel](&udptunnel.base, ctx);
g_free(data);
return 0;
@@ -136,8 +137,8 @@ recv_msg(struct context *ctx, const struct mumble_callbacks *cbs)
}
g_print("debug: received message: %s type:%d, len:%d\n", messages[type].name, type, len);
- if (callbacks[type])
- callbacks[type](msg, ctx);
+ if (ctx->callbacks[type])
+ ctx->callbacks[type](msg, ctx);
protobuf_c_message_free_unpacked(msg, NULL);
g_free(data);