Removed RCS-style IDs.
[ruby-ecore.git] / src / ecore_con / rb_server.c
1 /*
2  * Copyright (C) 2005 ruby-ecore team (see AUTHORS)
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #include <ruby.h>
20
21 #include <Ecore.h>
22 #include <Ecore_Con.h>
23 #include <stdbool.h>
24
25 #include "../ecore/rb_event_handler.h"
26
27 #define CHECK_DELETED(s) \
28         if (s->deleted) \
29                 rb_raise (rb_eIOError, "server deleted");
30
31 typedef struct {
32         Ecore_Con_Server *real;
33         bool deleted;
34 } RbServer;
35
36 static void c_free (RbServer *svr)
37 {
38         if (svr->real && !svr->deleted)
39                 ecore_con_server_del (svr->real);
40
41         ecore_con_shutdown ();
42
43         free (svr);
44 }
45
46 static VALUE c_alloc (VALUE klass)
47 {
48         RbServer *svr = NULL;
49
50         return Data_Make_Struct (klass, RbServer, NULL, c_free, svr);
51 }
52
53 static VALUE c_init (VALUE self, VALUE type, VALUE host, VALUE port)
54 {
55         RbServer *svr = NULL;
56
57         Check_Type (type, T_FIXNUM);
58         StringValue (host);
59         Check_Type (port, T_FIXNUM);
60
61         Data_Get_Struct (self, RbServer, svr);
62
63         ecore_con_init ();
64
65         svr->deleted = false;
66         svr->real = ecore_con_server_connect (FIX2INT (type),
67                                               StringValuePtr (host),
68                                               FIX2INT (port), (void *) self);
69         if (!svr->real)
70                 rb_raise (rb_eIOError, "cannot create Server");
71
72         return self;
73 }
74
75 static VALUE c_write (VALUE self, VALUE data)
76 {
77         RbServer *svr;
78         int n;
79
80         StringValue (data);
81
82         Data_Get_Struct (self, RbServer, svr);
83         CHECK_DELETED (svr);
84
85         n = ecore_con_server_send (svr->real,
86                                    StringValuePtr (data),
87                                    RSTRING (data)->len);
88         if (!n)
89                 rb_raise (rb_eIOError, "couldn't write data");
90         else
91                 return INT2FIX (n);
92 }
93
94 /*
95  * call-seq:
96  *  server.delete => nil
97  *
98  * Deletes <i>server</i>.
99  */
100 static VALUE c_delete (VALUE self)
101 {
102         RbServer *svr = NULL;
103
104         Data_Get_Struct (self, RbServer, svr);
105         CHECK_DELETED (svr);
106
107         ecore_con_server_del (svr->real);
108         svr->deleted = true;
109         svr->real = NULL;
110
111         return self;
112 }
113
114 static VALUE find_server (Ecore_Con_Server *c)
115 {
116         /* FIXME what if the Ruby object has been destroyed already? */
117         return (VALUE) ecore_con_server_data_get (c);
118 }
119
120 static VALUE c_ev_server_add_init (VALUE self, VALUE event)
121 {
122         VALUE c = CLASS_OF (self), server;
123         Ecore_Con_Event_Server_Add *e = (void *) event;
124
125         server = find_server (e->server);
126         if (NIL_P (server))
127                 rb_bug ("cannot find server");
128
129         rb_define_attr (c, "server", 1, 0);
130
131         rb_iv_set (self, "@server", server);
132
133         return self;
134 }
135
136 static VALUE c_ev_server_del_init (VALUE self, VALUE event)
137 {
138         VALUE c = CLASS_OF (self), server;
139         Ecore_Con_Event_Server_Del *e = (void *) event;
140
141         server = find_server (e->server);
142         if (NIL_P (server))
143                 rb_bug ("cannot find server");
144
145         rb_define_attr (c, "server", 1, 0);
146
147         rb_iv_set (self, "@server", server);
148
149         return self;
150 }
151
152 static VALUE c_ev_server_data_init (VALUE self, VALUE event)
153 {
154         VALUE c = CLASS_OF (self), server;
155         Ecore_Con_Event_Server_Data *e = (void *) event;
156
157         server = find_server (e->server);
158         if (NIL_P (server))
159                 rb_bug ("cannot find server");
160
161         rb_define_attr (c, "server", 1, 0);
162         rb_define_attr (c, "data", 1, 0);
163
164         rb_iv_set (self, "@server", server);
165         rb_iv_set (self, "@data", rb_str_new (e->data, e->size));
166
167         return self;
168 }
169
170 void Init_Server (VALUE m)
171 {
172         VALUE c = rb_define_class_under (m, "Server", rb_cObject);
173
174         rb_define_alloc_func (c, c_alloc);
175         rb_define_method (c, "initialize", c_init, 3);
176         rb_define_method (c, "write", c_write, 1);
177         rb_define_alias (c, "<<", "write");
178         rb_define_method (c, "delete", c_delete, 0);
179
180         ADD_EVENT (m, ECORE_CON_EVENT_SERVER_ADD, "ServerAddEvent", c);
181         rb_define_private_method (c, "initialize",
182                                   c_ev_server_add_init, 1);
183
184         ADD_EVENT (m, ECORE_CON_EVENT_SERVER_DATA, "ServerDataEvent", c);
185         rb_define_private_method (c, "initialize",
186                                   c_ev_server_data_init, 1);
187
188         ADD_EVENT (m, ECORE_CON_EVENT_SERVER_DEL, "ServerDelEvent", c);
189         rb_define_private_method (c, "initialize",
190                                   c_ev_server_del_init, 1);
191 }