replaced tcp_client_close with ebb_client_close in ruby binding. need to replace...
[ebb.git] / ruby_binding / ebb_ext.c
blob6e0d6b65c5d9879b765b1a0098aea8803b8446e8
1 /* A ruby binding to the ebb web server
2 * Copyright (c) 2007 Ry Dahl <ry.d4hl@gmail.com>
3 * This software is released under the "MIT License". See README file for details.
4 */
6 #include <ruby.h>
7 #include <ebb.h>
8 #include <tcp.h>
10 static VALUE cServer;
11 static VALUE cClient;
13 /* Variables with an underscore are C-level variables */
15 VALUE client_new(ebb_client*);
17 VALUE server_alloc(VALUE self)
19 ebb_server *_server = ebb_server_new();
20 VALUE server = Qnil;
21 server = Data_Wrap_Struct(cServer, 0, ebb_server_free, _server);
22 return server;
25 void request_cb(ebb_client *_client, void *data)
27 VALUE server = (VALUE)data;
28 VALUE client = client_new(_client);
29 rb_funcall(server, rb_intern("process"), 1, client);
32 VALUE server_start(VALUE server)
34 ebb_server *_server;
35 VALUE host, port;
37 Data_Get_Struct(server, ebb_server, _server);
39 host = rb_iv_get(server, "@host");
40 Check_Type(host, T_STRING);
41 port = rb_iv_get(server, "@port");
42 Check_Type(port, T_FIXNUM);
44 ebb_server_start(_server, StringValuePtr(host), FIX2INT(port), request_cb, (void*)server);
46 return Qnil;
49 VALUE server_stop(VALUE server) {
50 ebb_server *_server;
51 Data_Get_Struct(server, ebb_server, _server);
52 ebb_server_stop(_server);
53 return Qnil;
56 VALUE client_new(ebb_client *_client)
58 return Data_Wrap_Struct(cClient, 0, ebb_client_free, _client);
61 VALUE client_write(VALUE client, VALUE string)
63 ebb_client *_client;
64 int written;
66 Data_Get_Struct(client, ebb_client, _client);
67 written = tcp_client_write(_client->socket, RSTRING_PTR(string), RSTRING_LEN(string));
68 return INT2FIX(written);
71 VALUE client_env(VALUE client)
73 ebb_client *_client;
74 VALUE hash = rb_hash_new();
75 ebb_env_pair *pair;
77 Data_Get_Struct(client, ebb_client, _client);
78 while((pair = g_queue_pop_head(_client->env))) {
79 rb_hash_aset(hash
80 , rb_str_new(pair->field, pair->flen) // use symbol?
81 , rb_str_new(pair->value, pair->vlen)
84 return hash;
87 VALUE client_close(VALUE client)
89 ebb_client *_client;
91 Data_Get_Struct(client, ebb_client, _client);
92 ebb_client_close(_client);
93 return Qnil;
96 void Init_ebb_ext()
98 VALUE mEbb = rb_define_module("Ebb");
99 cServer = rb_define_class_under(mEbb, "Server", rb_cObject);
100 cClient = rb_define_class_under(mEbb, "Client", rb_cObject);
102 rb_define_alloc_func(cServer, server_alloc);
103 rb_define_method(cServer, "_start", server_start, 0);
104 rb_define_method(cServer, "stop", server_stop, 0);
106 rb_define_method(cClient, "write", client_write, 1);
107 rb_define_method(cClient, "env", client_env, 0);
108 rb_define_method(cClient, "close", client_close, 0);