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