--- 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);