bindings/ruby/rblm-ssl.c
changeset 382 bc887affb431
parent 375 1f0f637e3ae8
child 383 926c939af071
--- a/bindings/ruby/rblm-ssl.c	Thu Apr 10 15:56:42 2008 +0200
+++ b/bindings/ruby/rblm-ssl.c	Thu Apr 10 16:23:26 2008 +0200
@@ -2,9 +2,91 @@
 
 VALUE lm_cSSL;
 
+static LmSSL *
+rb_lm_ssl_from_ruby_object (VALUE obj)
+{
+	LmSSL *ssl;
+
+	if (!rb_lm__is_kind_of (obj, lm_cSSL)) {
+		rb_raise (rb_eTypeError, "not a LmSSL");
+	}
+
+	Data_Get_Struct (obj, LmSSL, ssl);
+
+	return ssl;
+}
+
+void
+ssl_free (LmSSL *ssl)
+{
+	lm_ssl_unref (ssl);
+}
+
+VALUE
+ssl_allocate (VALUE klass)
+{
+	return Data_Wrap_Struct (klass, NULL, ssl_free, NULL);
+}
+
+static LmSSLResponse
+ssl_func_callback (LmSSL       *ssl,
+		   LmSSLStatus  status,
+		   gpointer     user_data)
+{
+	VALUE response;
+
+	if (!user_data) {
+		return LM_SSL_RESPONSE_CONTINUE;
+	}
+
+	response = rb_funcall ((VALUE)user_data, rb_intern ("call"), 1,
+			       INT2FIX (status));
+
+	return rb_lm_ssl_response_from_ruby_object (response);
+}
+
+VALUE
+ssl_initialize (int argc, VALUE *argv, VALUE self)
+{
+	LmSSL    *ssl;
+	VALUE     fingerprint;
+	VALUE     func;
+	char     *fingerprint_str = NULL;
+	gpointer  func_ptr = NULL;
+
+	rb_scan_args (argc, argv, "01&", &fingerprint, &func);
+
+	if (!NIL_P (func)) {
+		func_ptr = (gpointer) func;
+	}
+
+	if (!NIL_P (fingerprint)) {
+		VALUE str_val;
+
+		if (!rb_respond_to (fingerprint, rb_intern ("to_s"))) {
+			rb_raise (rb_eArgError, 
+				  "fingerprint should respond to to_s");
+		}
+
+		str_val = rb_funcall (fingerprint, rb_intern ("to_s"), 0);
+		fingerprint_str = StringValuePtr (str_val);
+	}
+
+	ssl = lm_ssl_new (fingerprint_str, ssl_func_callback,
+			  func_ptr, NULL);
+
+	DATA_PTR (self) = ssl;
+
+	return self;
+}
+
 extern void
 Init_lm_ssl (VALUE lm_mLM)
 {
 	lm_cSSL = rb_define_class_under (lm_mLM, "SSL", rb_cObject);
+
+	rb_define_alloc_func (lm_cSSL, ssl_allocate);
+
+	rb_define_method (lm_cSSL, "initialize", ssl_initialize, -1);
 }