Added support for add_message_handler to ruby bindings
authorMikael Hallendal <micke@imendio.com>
Thu, 10 Apr 2008 21:14:27 +0200
changeset 389 95287bd6f233
parent 388 4eec2cf1fa08
child 390 8623ce9ef39d
Added support for add_message_handler to ruby bindings
bindings/ruby/rblm-connection.c
bindings/ruby/rblm-message.c
bindings/ruby/rblm-private.h
--- a/bindings/ruby/rblm-connection.c	Thu Apr 10 19:55:28 2008 +0200
+++ b/bindings/ruby/rblm-connection.c	Thu Apr 10 21:14:27 2008 +0200
@@ -289,6 +289,40 @@
 	return INT2FIX (lm_connection_get_state (conn));
 }
 
+static LmHandlerResult
+msg_handler_cb (LmMessageHandler *handler,
+		LmConnection     *connection,
+		LmMessage        *message,
+		gpointer          user_data)
+{
+	rb_funcall ((VALUE)user_data, rb_intern ("call"), 1, 
+		    LMMESSAGE2RVAL (message));
+
+	return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
+}
+
+VALUE
+conn_add_msg_handler (int argc, VALUE *argv, VALUE self)
+{
+	LmConnection     *conn = rb_lm_connection_from_ruby_object (self);
+	VALUE             type, func;
+	LmMessageHandler *handler;
+
+	rb_scan_args (argc, argv, "1&", &type, &func);
+	if (NIL_P (func)) {
+		func = rb_block_proc ();
+	}
+
+	handler = lm_message_handler_new (msg_handler_cb, (gpointer) func, NULL);
+
+	lm_connection_register_message_handler (conn, handler,
+						rb_lm_message_type_from_ruby_object (type),
+						LM_HANDLER_PRIORITY_NORMAL);
+	lm_message_handler_unref (handler);
+
+	return Qnil;
+}
+
 void
 Init_lm_connection (VALUE lm_mLM)
 {
@@ -326,4 +360,5 @@
 	*/
 
 	rb_define_method (lm_cConnection, "state", conn_get_state, 0);
+	rb_define_method (lm_cConnection, "add_message_handler", conn_add_msg_handler, -1);
 }
--- a/bindings/ruby/rblm-message.c	Thu Apr 10 19:55:28 2008 +0200
+++ b/bindings/ruby/rblm-message.c	Thu Apr 10 21:14:27 2008 +0200
@@ -26,6 +26,18 @@
 }
 
 VALUE
+rb_lm_message_to_ruby_object (LmMessage *m)
+{
+	if (m) {
+		lm_message_ref (m);
+		return Data_Wrap_Struct (lm_cMessage, NULL,
+					 msg_free, m);
+	} else {
+		return Qnil;
+	}
+}
+
+VALUE
 msg_allocate (VALUE klass)
 {
 	return Data_Wrap_Struct (klass, NULL, msg_free, NULL);
--- a/bindings/ruby/rblm-private.h	Thu Apr 10 19:55:28 2008 +0200
+++ b/bindings/ruby/rblm-private.h	Thu Apr 10 21:14:27 2008 +0200
@@ -12,9 +12,11 @@
 #define LMMESSAGENODE2RVAL(x) (rb_lm_message_node_to_ruby_object(x))
 #define LMSSL2RVAL(x) (rb_lm_ssl_to_ruby_object(x))
 #define LMPROXY2RVAL(x) (rb_lm_proxy_to_ruby_object(x))
+#define LMMESSAGE2RVAL(x) (rb_lm_message_to_ruby_object(x))
 
 gboolean            rb_lm__is_kind_of (VALUE object, VALUE klass);
 
+VALUE               rb_lm_message_to_ruby_object      (LmMessage     *m);
 VALUE               rb_lm_message_node_to_ruby_object (LmMessageNode *node);
 VALUE               rb_lm_ssl_to_ruby_object          (LmSSL         *ssl);
 VALUE               rb_lm_proxy_to_ruby_object        (LmProxy       *proxy);