evas/cserve2: Use Slave_Command instead of
[profile/ivi/evas.git] / src / bin / evas_cserve2.h
1 #ifndef _EVAS_CSERVE2_H
2 #define _EVAS_CSERVE2_H
3
4 #include <Eina.h>
5 #include "evas_cs2.h"
6
7 #ifdef ERR
8 #undef ERR
9 #endif
10 #define ERR(...) EINA_LOG_DOM_ERR(_evas_cserve2_bin_log_dom, __VA_ARGS__)
11 #ifdef DBG
12 #undef DBG
13 #endif
14 #define DBG(...) EINA_LOG_DOM_DBG(_evas_cserve2_bin_log_dom, __VA_ARGS__)
15 #ifdef WRN
16 #undef WRN
17 #endif
18 #define WRN(...) EINA_LOG_DOM_WARN(_evas_cserve2_bin_log_dom, __VA_ARGS__)
19 #ifdef INF
20 #undef INF
21 #endif
22 #define INF(...) EINA_LOG_DOM_INFO(_evas_cserve2_bin_log_dom, __VA_ARGS__)
23
24 extern int _evas_cserve2_bin_log_dom;
25
26 typedef struct _Slave Slave;
27 typedef struct _Slave_Thread_Data Slave_Thread_Data;
28 typedef struct _Shm_Handle Shm_Handle;
29
30 typedef enum {
31    FD_READ = 1,
32    FD_WRITE = 2,
33    FD_ERROR = 4
34 } Fd_Flags;
35
36 struct _Client {
37     unsigned int id;
38     int socket;
39     struct {
40        Eina_Bool reading;
41        char *buf; // buffer of data being read
42        int done, size;
43        Eina_Binbuf *pending; // pending data to send
44     } msg;
45     struct {
46        Eina_Hash *referencing; // indexed by client file id
47     } files;
48     struct {
49        Eina_Hash *referencing; // indexed by client image id
50     } images;
51     struct {
52        Eina_List *referencing;
53     } fonts;
54 };
55
56 typedef struct _Client Client;
57
58 struct _Image_Load_Opts {
59    unsigned int w, h;
60    unsigned int rx, ry, rw, rh;
61    unsigned int scale_down_by;
62    double dpi;
63    Eina_Bool orientation;
64 };
65
66 typedef struct _Image_Load_Opts Image_Load_Opts;
67
68 typedef enum {
69    IMAGE_OPEN,
70    IMAGE_LOAD,
71    FONT_LOAD,
72    FONT_GLYPHS_LOAD,
73    SLAVE_QUIT,
74    ERROR
75 } Slave_Command;
76
77 struct _Slave_Msg_Image_Open {
78    Eina_Bool has_opts : 1;
79    Eina_Bool has_loader_data : 1;
80 };
81
82 struct _Slave_Msg_Image_Opened {
83    int w, h;
84    int degree;
85    int scale; /* used by jpeg when loading in smaller sizes */
86    int frame_count;
87    int loop_count;
88    int loop_hint; /* include Evas.h? Copy the enum around? */
89    Eina_Bool alpha : 1;
90    Eina_Bool animated : 1;
91    Eina_Bool rotated : 1;
92
93    Eina_Bool has_loader_data : 1;
94 };
95
96 struct _Slave_Msg_Image_Load {
97    int w, h;
98    Image_Load_Opts opts;
99    struct {
100       int mmap_offset;
101       int image_offset;
102       int mmap_size;
103       int image_size;
104    } shm;
105    Eina_Bool alpha : 1;
106    Eina_Bool has_loader_data : 1;
107 };
108
109 struct _Slave_Msg_Image_Loaded {
110    Eina_Bool alpha_sparse : 1;
111 };
112
113 typedef struct _Slave_Msg_Image_Open Slave_Msg_Image_Open;
114 typedef struct _Slave_Msg_Image_Opened Slave_Msg_Image_Opened;
115 typedef struct _Slave_Msg_Image_Load Slave_Msg_Image_Load;
116 typedef struct _Slave_Msg_Image_Loaded Slave_Msg_Image_Loaded;
117
118 typedef void *(*Font_Request_Msg_Create)(void *data, int *size);
119 typedef void *(*Font_Request_Msg_Free)(void *data);
120 typedef void (*Font_Request_Response)(Client *c, void *data, void *resp, unsigned int rid);
121 typedef void (*Font_Request_Error)(Client *c, void *data, Error_Type error, unsigned int rid);
122
123 struct _Font_Request_Funcs {
124    Font_Request_Msg_Create msg_create;
125    Font_Request_Msg_Free msg_free;
126    Font_Request_Response response;
127    Font_Request_Error error;
128 };
129
130 typedef struct _Font_Request Font_Request;
131 typedef struct _Font_Request_Funcs Font_Request_Funcs;
132
133 typedef enum {
134    CSERVE2_REQ_FONT_LOAD = 0,
135    CSERVE2_REQ_FONT_GLYPHS_LOAD,
136    CSERVE2_REQ_LAST
137 } Font_Request_Type;
138
139 typedef void (*Fd_Watch_Cb)(int fd, Fd_Flags flags, void *data);
140 typedef void (*Timeout_Cb)(void); /* void* for compat? */
141 typedef void (*Main_Loop_Child_Dead_Cb)(int pid, int status); /* void* for compat? */
142 typedef void (*Slave_Dead_Cb)(Slave *slave, void *data);
143 typedef void (*Slave_Read_Cb)(Slave *slave, Slave_Command cmd, void *msg, void *data);
144 typedef void *(*Slave_Thread_Cb)(Slave_Thread_Data *sd, Slave_Command cmd, const void *cmddata, void *userdata);
145 typedef void (*File_Change_Cb)(const char *path, Eina_Bool deleted, void *data);
146
147 void cserve2_client_accept(int fd);
148 ssize_t cserve2_client_read(Client *client, void *buf, size_t len);
149 ssize_t cserve2_client_write(Client *client, const void *buf, size_t len);
150 void cserve2_client_del(Client *client);
151 void cserve2_client_deliver(Client *client);
152 void cserve2_client_error_send(Client *client, unsigned int rid, int error_code);
153 ssize_t cserve2_client_send(Client *client, const void *data, size_t size);
154
155 Eina_Bool cserve2_fd_watch_add(int fd, Fd_Flags flags, Fd_Watch_Cb cb, const void *data);
156 Eina_Bool cserve2_fd_watch_del(int fd);
157 Eina_Bool cserve2_fd_watch_flags_set(int fd, Fd_Flags flags);
158 Eina_Bool cserve2_fd_watch_flags_get(int fd, Fd_Flags *flags);
159
160 Eina_Bool cserve2_file_change_watch_add(const char *path, File_Change_Cb cb, const void *data);
161 Eina_Bool cserve2_file_change_watch_del(const char *path);
162
163 void cserve2_on_child_dead_set(Main_Loop_Child_Dead_Cb cb);
164
165 void cserve2_timeout_cb_set(int t, Timeout_Cb cb);
166
167 Eina_Bool cserve2_main_loop_setup(void);
168 void cserve2_main_loop_run(void);
169 void cserve2_main_loop_finish(void);
170
171 Eina_Bool cserve2_slaves_init(void);
172 void cserve2_slaves_shutdown(void);
173 int cserve2_slave_available_get(void);
174 Eina_Bool cserve2_slave_cmd_dispatch(void *data, Slave_Command cmd, const void *msg, int size);
175 Slave *cserve2_slave_run(const char *exe, Slave_Read_Cb read_cb, Slave_Dead_Cb dead_cb, const void *data);
176 Slave *cserve2_slave_thread_run(Slave_Thread_Cb thread_cb, void *thread_data, Slave_Read_Cb read_cb, Slave_Dead_Cb dead_cb, const void *data);
177 void cserve2_slave_send(Slave *s, Slave_Command cmd, const char *data, size_t size);
178 void cserve2_slave_kill(Slave *s);
179
180 void cserve2_message_handler(int fd, Fd_Flags flags, void *data);
181
182 Shm_Handle *cserve2_shm_request(size_t size);
183 void cserve2_shm_unref(Shm_Handle *shm);
184 const char *cserve2_shm_name_get(const Shm_Handle *shm);
185 off_t cserve2_shm_map_offset_get(const Shm_Handle *shm);
186 off_t cserve2_shm_offset_get(const Shm_Handle *shm);
187 size_t cserve2_shm_map_size_get(const Shm_Handle *shm);
188 size_t cserve2_shm_size_get(const Shm_Handle *shm);
189
190 void cserve2_command_run(Client *client, Message_Type type);
191
192 void cserve2_cache_init(void);
193 void cserve2_cache_shutdown(void);
194 void cserve2_cache_client_new(Client *client);
195 void cserve2_cache_client_del(Client *client);
196 int cserve2_cache_file_open(Client *client, unsigned int client_file_id, const char *path, const char *key, unsigned int rid);
197 void cserve2_cache_file_close(Client *client, unsigned int client_file_id);
198 int cserve2_cache_image_opts_set(Client *client, Msg_Setopts *msg);
199 void cserve2_cache_image_load(Client *client, unsigned int client_image_id, unsigned int rid);
200 void cserve2_cache_image_preload(Client *client, unsigned int client_image_id, unsigned int rid);
201 void cserve2_cache_image_unload(Client *client, unsigned int client_image_id);
202
203 int cserve2_cache_font_load(Client *client, const char *name, unsigned int namelen, unsigned int rend_flags, unsigned int hint, unsigned int size, unsigned int dpi, unsigned int rid);
204
205
206 Font_Request *cserve2_request_add(Font_Request_Type type, unsigned int rid, Client *client, Font_Request_Funcs *funcs, void *data);
207 void cserve2_request_cancel(Font_Request *req, Client *client, Error_Type err);
208 void cserve2_request_cancel_all(Font_Request *req, Error_Type err);
209 void cserve2_requests_init(void);
210 void cserve2_requests_shutdown(void);
211
212 void cserve2_cache_requests_process(void);
213 void cserve2_cache_requests_response(Slave_Command type, void *msg, void *data);
214
215 #endif /* _EVAS_CSERVE2_H */