bindings/ruby/rblm-ssl.c
changeset 390 8623ce9ef39d
parent 389 95287bd6f233
child 391 d8b64455b5ee
equal deleted inserted replaced
389:95287bd6f233 390:8623ce9ef39d
     1 #include "rblm.h"
       
     2 #include "rblm-private.h"
       
     3 
       
     4 VALUE lm_cSSL;
       
     5 
       
     6 LmSSL *
       
     7 rb_lm_ssl_from_ruby_object (VALUE obj)
       
     8 {
       
     9 	LmSSL *ssl;
       
    10 
       
    11 	if (!rb_lm__is_kind_of (obj, lm_cSSL)) {
       
    12 		rb_raise (rb_eTypeError, "not a LmSSL");
       
    13 	}
       
    14 
       
    15 	Data_Get_Struct (obj, LmSSL, ssl);
       
    16 
       
    17 	return ssl;
       
    18 }
       
    19 
       
    20 void
       
    21 ssl_free (LmSSL *ssl)
       
    22 {
       
    23 	lm_ssl_unref (ssl);
       
    24 }
       
    25 
       
    26 VALUE
       
    27 rb_lm_ssl_to_ruby_object (LmSSL *ssl)
       
    28 {
       
    29 	if (ssl) {
       
    30 		lm_ssl_ref (ssl);
       
    31 		return Data_Wrap_Struct (lm_cSSL, NULL, 
       
    32 					 ssl_free, ssl);
       
    33 	} else {
       
    34 		return Qnil;
       
    35 	}
       
    36 }
       
    37 
       
    38 VALUE
       
    39 ssl_allocate (VALUE klass)
       
    40 {
       
    41 	return Data_Wrap_Struct (klass, NULL, ssl_free, NULL);
       
    42 }
       
    43 
       
    44 static VALUE
       
    45 ssl_is_supported (VALUE self)
       
    46 {
       
    47 	return GBOOL2RVAL (lm_ssl_is_supported ());
       
    48 }
       
    49 
       
    50 static LmSSLResponse
       
    51 ssl_func_callback (LmSSL       *ssl,
       
    52 		   LmSSLStatus  status,
       
    53 		   gpointer     user_data)
       
    54 {
       
    55 	VALUE response;
       
    56 
       
    57 	if (!user_data) {
       
    58 		return LM_SSL_RESPONSE_CONTINUE;
       
    59 	}
       
    60 
       
    61 	response = rb_funcall ((VALUE)user_data, rb_intern ("call"), 1,
       
    62 			       INT2FIX (status));
       
    63 
       
    64 	return rb_lm_ssl_response_from_ruby_object (response);
       
    65 }
       
    66 
       
    67 static VALUE
       
    68 ssl_initialize (int argc, VALUE *argv, VALUE self)
       
    69 {
       
    70 	LmSSL    *ssl;
       
    71 	VALUE     fingerprint;
       
    72 	VALUE     func;
       
    73 	char     *fingerprint_str = NULL;
       
    74 	gpointer  func_ptr = NULL;
       
    75 
       
    76 	rb_scan_args (argc, argv, "01&", &fingerprint, &func);
       
    77 
       
    78 	if (!NIL_P (func)) {
       
    79 		func_ptr = (gpointer) func;
       
    80 	}
       
    81 
       
    82 	if (!NIL_P (fingerprint)) {
       
    83 		VALUE str_val;
       
    84 
       
    85 		if (!rb_respond_to (fingerprint, rb_intern ("to_s"))) {
       
    86 			rb_raise (rb_eArgError, 
       
    87 				  "fingerprint should respond to to_s");
       
    88 		}
       
    89 
       
    90 		str_val = rb_funcall (fingerprint, rb_intern ("to_s"), 0);
       
    91 		fingerprint_str = StringValuePtr (str_val);
       
    92 	}
       
    93 
       
    94 	ssl = lm_ssl_new (fingerprint_str, ssl_func_callback,
       
    95 			  func_ptr, NULL);
       
    96 
       
    97 	DATA_PTR (self) = ssl;
       
    98 
       
    99 	return self;
       
   100 }
       
   101 
       
   102 static VALUE
       
   103 ssl_get_fingerprint (VALUE self)
       
   104 {
       
   105 	LmSSL *ssl = rb_lm_ssl_from_ruby_object (self);
       
   106 
       
   107 	if (lm_ssl_get_fingerprint (ssl)) {
       
   108 		return rb_str_new2 (lm_ssl_get_fingerprint (ssl));
       
   109 	}
       
   110 
       
   111 	return Qnil;
       
   112 }
       
   113 
       
   114 static VALUE
       
   115 ssl_get_use_starttls (VALUE self)
       
   116 {
       
   117 	LmSSL *ssl = rb_lm_ssl_from_ruby_object (self);
       
   118 
       
   119 	return GBOOL2RVAL (lm_ssl_get_use_starttls (ssl));
       
   120 }
       
   121 
       
   122 static VALUE
       
   123 ssl_set_use_starttls (VALUE self, VALUE use)
       
   124 {
       
   125 	LmSSL *ssl = rb_lm_ssl_from_ruby_object (self);
       
   126 
       
   127 	lm_ssl_use_starttls (ssl,
       
   128 			     RVAL2GBOOL (use),
       
   129 			     lm_ssl_get_require_starttls (ssl));
       
   130 
       
   131 	return Qnil;
       
   132 }
       
   133 
       
   134 static VALUE
       
   135 ssl_get_require_starttls (VALUE self)
       
   136 {
       
   137 	LmSSL *ssl = rb_lm_ssl_from_ruby_object (self);
       
   138 
       
   139 	return GBOOL2RVAL (lm_ssl_get_require_starttls (ssl));
       
   140 }
       
   141 
       
   142 static VALUE
       
   143 ssl_set_require_starttls (VALUE self, VALUE require)
       
   144 {
       
   145 	LmSSL *ssl = rb_lm_ssl_from_ruby_object (self);
       
   146 
       
   147 	lm_ssl_use_starttls (ssl,
       
   148 			     lm_ssl_get_use_starttls (ssl),
       
   149 			     RVAL2GBOOL (require));
       
   150 
       
   151 	return Qnil;
       
   152 }
       
   153 
       
   154 extern void
       
   155 Init_lm_ssl (VALUE lm_mLM)
       
   156 {
       
   157 	lm_cSSL = rb_define_class_under (lm_mLM, "SSL", rb_cObject);
       
   158 
       
   159 	rb_define_alloc_func (lm_cSSL, ssl_allocate);
       
   160 
       
   161 	rb_define_singleton_method (lm_cSSL, "supported?", 
       
   162 				    ssl_is_supported, 0);
       
   163 
       
   164 	rb_define_method (lm_cSSL, "initialize", ssl_initialize, -1);
       
   165 	rb_define_method (lm_cSSL, "fingerprint", ssl_get_fingerprint, 0);
       
   166 	rb_define_method (lm_cSSL, "use_starttls", ssl_get_use_starttls, 0);
       
   167 	rb_define_method (lm_cSSL, "use_starttls=", ssl_set_use_starttls, 1);
       
   168 	rb_define_method (lm_cSSL, "require_starttls", ssl_get_require_starttls, 0);
       
   169 	rb_define_method (lm_cSSL, "require_starttls=", ssl_set_require_starttls, 1);
       
   170 }
       
   171