Implemented ssl_initialize for LmSSL ruby bindings.
Also added rb_lm_ssl_response_from_ruby_object and rb_lm_ssl_status_from_ruby_object.
--- 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);
}