1 /**
2  * Ecore example illustrating the basics of ecore evas extn socket usage.
3  *
4  * You'll need at least one Evas engine built for it (excluding the
5  * buffer one). See stdout/stderr for output.
6  * You can check functions of ecore extn socket if you use ecore extn plug together.
7  *
8  * @verbatim
9  * gcc -o ecore_evas_extn_socket_example ecore_evas_extn_socket_example.c `pkg-config --libs --cflags evas ecore ecore-evas`
10  * @endverbatim
11  */
12 
13 #ifdef HAVE_CONFIG_H
14 #include "config.h"
15 #else
16 #define EINA_UNUSED
17 #endif
18 
19 #include <Ecore.h>
20 #include <Ecore_Evas.h>
21 #include <unistd.h>
22 
23 // protocol version - change this as needed
24 #define MSG_DOMAIN_CONTROL_OBJECT 0x1004
25 #define MSG_ID_BG_COLOR 0x1005
26 #define MSG_ID_TEXT 0x1006
27 static int num = 0;
28 typedef struct _Msg_Color Msg_Color;
29 
30 struct _Msg_Color
31 {
32    int r;
33    int g;
34    int b;
35    int a;
36 };
37 
38 static void
_on_delete(Ecore_Evas * ee)39 _on_delete(Ecore_Evas *ee)
40 {
41    Ecore_Evas *ee_socket = NULL;
42    char *text = NULL;
43    ee_socket = ecore_evas_data_get(ee, "sock");
44    if (ee_socket)
45      {
46         text = ecore_evas_data_get(ee_socket, "text");
47         if (text) free(text);
48      }
49    ecore_main_loop_quit();
50 }
51 
52 static void
_ecore_evas_msg_parent_handle(Ecore_Evas * ee,int msg_domain,int msg_id,void * data,int size)53 _ecore_evas_msg_parent_handle(Ecore_Evas *ee, int msg_domain, int msg_id, void *data, int size)
54 {
55    printf("Receive msg from clien msg_domain=%x msg_id=%x size=%d\n", msg_domain, msg_id, size);
56    if (!data) return;
57 
58    if (msg_domain == MSG_DOMAIN_CONTROL_OBJECT)
59      {
60         if (msg_id == MSG_ID_BG_COLOR)
61           {
62              Evas_Object *bg = NULL;
63              Msg_Color *color = NULL;
64              int r = 0, g = 0, b = 0, a = 0;
65 
66              bg = ecore_evas_data_get(ee, "bg");
67              if (bg && (size == sizeof(Msg_Color)))
68                {
69                   color = data;
70                   r = color->r;
71                   g = color->g;
72                   b = color->b;
73                   a = color->a;
74                   printf("Receive msg is color r=%x g=%x b=%x a=%x\n", r, g, b, a);
75                   evas_object_color_set(bg, color->r, color->g, color->b, color->a);
76                }
77           }
78      }
79 }
80 
81 static void
_mouse_up(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)82 _mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
83 {
84    Ecore_Evas *ee = data;
85    size_t len = 0;
86    char *buf = NULL;
87 
88    num++;
89 
90    if (!ee) return;
91    buf = ecore_evas_data_get(ee, "text");
92    if (!buf) free(buf);
93 
94    buf = (char *)malloc(40);
95    memset(buf, 0, 40);
96    sprintf(buf, "Hello. I'm server!! number=%d!!", num);
97    len = strlen(buf);
98    ecore_evas_data_set(ee, "text", buf);
99 
100    printf("ecore extn socket txt = \"%s\" len=%zu.", buf, len);
101    ecore_evas_msg_send(ee, MSG_DOMAIN_CONTROL_OBJECT, MSG_ID_TEXT, buf, len);
102 }
103 
104 int
main(void)105 main(void)
106 {
107    Ecore_Evas *ee;
108    Ecore_Evas *ee_socket = NULL;
109    Evas *canvas;
110    Evas_Object *bg, *text;
111    Evas_Object *sock_bg;
112    int w, h;
113    int socket_w, socket_h;
114 
115    if (ecore_evas_init() <= 0)
116      return 1;
117 
118    w = 480;
119    h = 200;
120 
121    ee = ecore_evas_new(NULL, 0, 0, w, h, NULL);
122    ecore_evas_title_set(ee, "Ecore Evas Extn Socket Example");
123    ecore_evas_show(ee);
124 
125    ecore_evas_callback_delete_request_set(ee, _on_delete);
126 
127    printf("Using %s engine! ee=%p\n", ecore_evas_engine_name_get(ee), ee);
128 
129    //create ecore evas to show info
130    canvas = ecore_evas_get(ee);
131    if (ecore_evas_ecore_evas_get(canvas) == ee)
132      printf("Everything is sane!\n");
133 
134    bg = evas_object_rectangle_add(canvas);
135    evas_object_color_set(bg, 255, 255, 0, 255);
136    evas_object_resize(bg, w, h);
137    evas_object_show(bg);
138 
139    text = evas_object_text_add(canvas);
140    evas_object_color_set(text, 0, 0, 0, 255);
141    evas_object_text_style_set(text, EVAS_TEXT_STYLE_PLAIN);
142    evas_object_text_font_set(text, "Sans", 15);
143    evas_object_text_text_set(text, "1. Run ecore_evas_extn_plug_examples!!");
144    evas_object_move(text, 40, 30);
145    evas_object_show(text);
146 
147    text = evas_object_text_add(canvas);
148    evas_object_color_set(text, 0, 0, 0, 255);
149    evas_object_text_style_set(text, EVAS_TEXT_STYLE_PLAIN);
150    evas_object_text_font_set(text, "Sans", 15);
151    evas_object_text_text_set(text, "2. Press green rect to send msg to clients!!");
152    evas_object_move(text, 40, 60);
153    evas_object_show(text);
154 
155    bg = evas_object_rectangle_add(canvas);
156    evas_object_color_set(bg, 0, 255, 0, 255);
157    evas_object_resize(bg, w/4, h/4);
158    evas_object_move(bg, w/4, h/2);
159    evas_object_show(bg);
160 
161    //create ecore evas extn socket
162    socket_w = 460;
163    socket_h = 250;
164 
165    ee_socket = ecore_evas_extn_socket_new(1, 1);
166    ecore_evas_data_set(ee, "sock", ee_socket);
167 
168    if (!ee_socket)
169      {
170         printf("Fail to create ecore extn socket!\n");
171         return 0;
172      }
173 
174    if(!ecore_evas_extn_socket_listen(ee_socket, "socket_exam_service", 0, EINA_FALSE))
175      {
176         printf("Fail to listen socket_exam_service!\n");
177 		return 0;
178      }
179    ecore_evas_resize(ee_socket, socket_w, socket_h);
180    ecore_evas_show(ee_socket);
181 
182    //callback to deal with cient extn's message
183    ecore_evas_callback_msg_parent_handle_set(ee_socket, _ecore_evas_msg_parent_handle);
184    //_mouse_up is function to send msg to client extn plug
185    evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_UP, _mouse_up, ee_socket);
186 
187    canvas = ecore_evas_get(ee_socket);
188 
189    sock_bg = evas_object_rectangle_add(canvas);
190    evas_object_color_set(sock_bg, 0, 0, 255, 255);
191    evas_object_resize(sock_bg, socket_w, socket_h);
192    evas_object_move(sock_bg, 0, 0);
193    evas_object_show(sock_bg);
194    ecore_evas_data_set(ee_socket, "bg", sock_bg);
195 
196    ecore_evas_extn_socket_events_block_set(ee_socket, EINA_FALSE);
197 
198    ecore_main_loop_begin();
199 
200    ecore_evas_free(ee);
201    ecore_evas_shutdown();
202 
203    return 0;
204 }
205