Implemented ssl_initialize for LmSSL ruby bindings.
authorMikael Hallendal <micke@imendio.com>
Thu, 10 Apr 2008 16:23:26 +0200
changeset 382 bc887affb431
parent 381 b2eecf83193c
child 383 926c939af071
Implemented ssl_initialize for LmSSL ruby bindings. Also added rb_lm_ssl_response_from_ruby_object and rb_lm_ssl_status_from_ruby_object.
bindings/ruby/rblm-constants.c
bindings/ruby/rblm-private.h
bindings/ruby/rblm-proxy.c
bindings/ruby/rblm-ssl.c
--- a/bindings/ruby/rblm-constants.c	Thu Apr 10 15:56:42 2008 +0200
+++ b/bindings/ruby/rblm-constants.c	Thu Apr 10 16:23:26 2008 +0200
@@ -108,6 +108,40 @@
 	return status;
 }
 
+LmSSLStatus 
+rb_lm_ssl_status_from_ruby_object (VALUE obj)
+{
+	LmSSLStatus status;
+
+	status = FIX2INT (obj);
+	if (status < LM_SSL_STATUS_NO_CERT_FOUND || 
+	    status > LM_SSL_STATUS_GENERIC_ERROR) {
+		rb_raise (rb_eArgError, 
+			  "invalid LmSSLStatus: %d (expected %d <= LmSSLStatus <= %d)",
+			  status, LM_SSL_STATUS_NO_CERT_FOUND, 
+			  LM_SSL_STATUS_GENERIC_ERROR);
+	}
+
+	return status;
+}
+
+LmSSLResponse
+rb_lm_ssl_response_from_ruby_object (VALUE obj)
+{
+	LmSSLResponse response;
+	
+	response = FIX2INT (obj);
+	if (response < LM_SSL_RESPONSE_CONTINUE || 
+	    response < LM_SSL_RESPONSE_STOP) {
+		rb_raise (rb_eArgError,
+			  "invalid LmSSLResponse: %d (expected %d <= LmSSLResponse <= %d)",
+			  response,
+			  LM_SSL_RESPONSE_CONTINUE, LM_SSL_RESPONSE_STOP);
+	}
+
+	return response;
+}
+
 void 
 Init_lm_constants (VALUE lm_mLM)
 {
--- a/bindings/ruby/rblm-private.h	Thu Apr 10 15:56:42 2008 +0200
+++ b/bindings/ruby/rblm-private.h	Thu Apr 10 16:23:26 2008 +0200
@@ -8,7 +8,16 @@
 #define GBOOL2RVAL(x) (x == TRUE ? Qtrue : Qfalse)
 #define RVAL2GBOOL(x) RTEST(x)
 
-gboolean   rb_lm__is_kind_of (VALUE object, VALUE klass);
+gboolean            rb_lm__is_kind_of (VALUE object, VALUE klass);
+
+LmConnectionState   rb_lm_connection_state_from_ruby_object   (VALUE obj);
+LmDisconnectReason  rb_lm_disconnect_reason_from_ruby_object  (VALUE obj);
+LmMessageType       rb_lm_message_type_from_ruby_object       (VALUE obj);
+LmMessageSubType    rb_lm_message_sub_type_from_ruby_object   (VALUE obj);
+LmProxyType         rb_lm_proxy_type_from_ruby_object         (VALUE obj);
+LmCertificateStatus rb_lm_certificate_status_from_ruby_object (VALUE obj);
+LmSSLStatus         rb_lm_ssl_status_from_ruby_object         (VALUE obj);
+LmSSLResponse       rb_lm_ssl_response_from_ruby_object       (VALUE obj);
 
 #endif /* __RBLM_PRIVATE_H__ */
 
--- a/bindings/ruby/rblm-proxy.c	Thu Apr 10 15:56:42 2008 +0200
+++ b/bindings/ruby/rblm-proxy.c	Thu Apr 10 16:23:26 2008 +0200
@@ -8,7 +8,7 @@
 	LmProxy *proxy;
 
 	if (!rb_lm__is_kind_of (obj, lm_cProxy)) {
-		rb_raise (rb_eTypeError, "no a LmProxy");
+		rb_raise (rb_eTypeError, "not a LmProxy");
 	}
 
 	Data_Get_Struct (obj, LmProxy, proxy);
--- 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);
 }