2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
11 #elif defined __GNUC__
12 # define alloca __builtin_alloca
14 # define alloca __alloca
15 #elif defined _MSC_VER
17 # define alloca _alloca
23 void *alloca (size_t);
29 #ifdef HAVE_NETINET_IN_H
30 # include <netinet/in.h>
34 # include <winsock2.h>
40 #include "Eet_private.h"
42 #define MAGIC_EET_DATA_PACKET 0x4270ACE1
44 typedef struct _Eet_Message Eet_Message;
50 struct _Eet_Connection
52 Eet_Read_Cb *eet_read_cb;
53 Eet_Write_Cb *eet_write_cb;
64 eet_connection_new(Eet_Read_Cb *eet_read_cb,
65 Eet_Write_Cb *eet_write_cb,
66 const void *user_data)
70 if (!eet_read_cb || !eet_write_cb)
73 conn = calloc(1, sizeof (Eet_Connection));
77 conn->eet_read_cb = eet_read_cb;
78 conn->eet_write_cb = eet_write_cb;
79 conn->user_data = (void*) user_data;
85 eet_connection_received(Eet_Connection *conn, const void *data, size_t size)
87 if (!conn || !data || !size)
95 const Eet_Message *msg;
98 if (size < sizeof (Eet_Message))
102 /* Check the magic */
103 if (ntohl(msg->magic) != MAGIC_EET_DATA_PACKET)
106 packet_size = ntohl(msg->size);
107 /* Message should always be under 64K */
108 if (packet_size > 64 * 1024)
111 data = (void*) (msg + 1);
112 size -= sizeof (msg);
113 if ((size_t) packet_size <= size)
115 /* Not a partial receive, go the quick way. */
116 if (!conn->eet_read_cb(data, packet_size, conn->user_data))
119 data = (void*) ((char *) data + packet_size);
126 conn->size = packet_size;
127 if (conn->allocated < conn->size)
131 tmp = realloc(conn->buffer, conn->size);
136 conn->allocated = conn->size;
140 /* Partial receive */
141 copy_size = (conn->size - conn->received >= size) ? size : conn->size - conn->received;
142 memcpy((char*) conn->buffer + conn->received, data, copy_size);
144 conn->received += copy_size;
145 data = (void*)((char *) data + copy_size);
148 if (conn->received == conn->size)
152 data_size = conn->size;
156 /* Completed a packet. */
157 if (!conn->eet_read_cb(conn->buffer, data_size, conn->user_data))
159 /* Something goes wrong. Stop now. */
170 _eet_connection_raw_send(Eet_Connection *conn, void *data, int data_size)
172 Eet_Message *message;
174 /* Message should never be above 64K */
175 if (data_size > 64 * 1024)
178 message = alloca(data_size + sizeof (Eet_Message));
179 message->magic = htonl(MAGIC_EET_DATA_PACKET);
180 message->size = htonl(data_size);
182 memcpy(message + 1, data, data_size);
184 conn->eet_write_cb(message, data_size + sizeof (Eet_Message), conn->user_data);
189 eet_connection_send(Eet_Connection *conn, Eet_Data_Descriptor *edd, const void *data_in, const char *cipher_key)
193 Eina_Bool ret = EINA_FALSE;
195 flat_data = eet_data_descriptor_encode_cipher(edd, data_in, cipher_key, &data_size);
199 if (_eet_connection_raw_send(conn, flat_data, data_size))
207 eet_connection_node_send(Eet_Connection *conn, Eet_Node *node, const char *cipher_key)
211 Eina_Bool ret = EINA_FALSE;
213 data = eet_data_node_encode_cipher(node, cipher_key, &data_size);
217 if (_eet_connection_raw_send(conn, data, data_size))
225 eet_connection_close(Eet_Connection *conn, Eina_Bool *on_going)
233 *on_going = conn->received == 0 ? EINA_FALSE : EINA_TRUE;
235 user_data = conn->user_data;