Tizen 2.1 release
[platform/core/uifw/e17.git] / src / bin / e_ipc.c
1 #include "e.h"
2
3 #ifdef USE_IPC
4 /* local subsystem functions */
5 static Eina_Bool _e_ipc_cb_client_add(void *data __UNUSED__, int type __UNUSED__, void *event);
6 static Eina_Bool _e_ipc_cb_client_del(void *data __UNUSED__, int type __UNUSED__, void *event);
7 static Eina_Bool _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event);
8
9 /* local subsystem globals */
10 static Ecore_Ipc_Server *_e_ipc_server = NULL;
11 #endif
12
13 /* externally accessible functions */
14 EINTERN int
15 e_ipc_init(void)
16 {
17 #ifdef USE_IPC
18    char buf[1024], buf2[128], buf3[4096];
19    char *tmp, *user, *disp, *base;
20    int pid, trynum = 0;
21
22    tmp = getenv("TMPDIR");
23    if (!tmp) tmp = "/tmp";
24    base = tmp;
25
26    tmp = getenv("XDG_RUNTIME_DIR");
27    if (tmp) base = tmp;
28    tmp = getenv("SD_USER_SOCKETS_DIR");
29    if (tmp) base = tmp;
30      
31    user = getenv("USER");
32    if (!user)
33      {
34         int uidint;
35         
36         user = "__unknown__";
37         uidint = getuid();
38         if (uidint >= 0)
39           {
40              snprintf(buf2, sizeof(buf2), "%i", uidint);
41              user = buf2;
42           }
43      }
44    
45    disp = getenv("DISPLAY");
46    if (!disp) disp = ":0";
47    
48    e_util_env_set("E_IPC_SOCKET", "");
49    
50    pid = (int)getpid();
51    for (trynum = 0; trynum <= 4096; trynum++)
52      {
53         struct stat st;
54         int id1 = 0, id2 = 0;
55         
56         snprintf(buf, sizeof(buf), "%s/enlightenment-%s@%08x%08x",
57                  base, user, id1, id2);
58         mkdir(buf, S_IRWXU);
59         if (stat(buf, &st) == 0)
60           {
61              if ((st.st_uid == getuid()) &&
62                   ((st.st_mode & (S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)) ==
63                       (S_IRWXU | S_IFDIR)))
64                {
65                   snprintf(buf3, sizeof(buf3), "%s/disp-%s-%i",
66                            buf, disp, pid);
67                   _e_ipc_server = ecore_ipc_server_add
68                     (ECORE_IPC_LOCAL_SYSTEM, buf3, 0, NULL);
69                   if (_e_ipc_server) break;
70                }
71           }
72         id1 = rand();
73         id2 = rand();
74      }
75    if (!_e_ipc_server) return 0;
76
77    e_util_env_set("E_IPC_SOCKET", buf3);
78    ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
79                            _e_ipc_cb_client_add, NULL);
80    ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
81                            _e_ipc_cb_client_del, NULL);
82    ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
83                            _e_ipc_cb_client_data, NULL);
84
85    e_ipc_codec_init();
86 #endif
87    return 1;
88 }
89
90 EINTERN int
91 e_ipc_shutdown(void)
92 {
93 #ifdef USE_IPC
94    e_ipc_codec_shutdown();
95    if (_e_ipc_server)
96      {
97         ecore_ipc_server_del(_e_ipc_server);
98         _e_ipc_server = NULL;
99      }
100 #endif
101    return 1;
102 }
103
104 #ifdef USE_IPC
105 /* local subsystem globals */
106 static Eina_Bool
107 _e_ipc_cb_client_add(void *data __UNUSED__, int type __UNUSED__, void *event)
108 {
109    Ecore_Ipc_Event_Client_Add *e;
110
111    e = event;
112    if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
113      return ECORE_CALLBACK_PASS_ON;
114    return ECORE_CALLBACK_PASS_ON;
115 }
116
117 static Eina_Bool
118 _e_ipc_cb_client_del(void *data __UNUSED__, int type __UNUSED__, void *event)
119 {
120    Ecore_Ipc_Event_Client_Del *e;
121
122    e = event;
123    if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
124      return ECORE_CALLBACK_PASS_ON;
125    /* delete client sruct */
126    e_thumb_client_del(e);
127    e_fm2_client_del(e);
128    e_init_client_del(e);
129    ecore_ipc_client_del(e->client);
130    return ECORE_CALLBACK_PASS_ON;
131 }
132
133 static Eina_Bool
134 _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event)
135 {
136    Ecore_Ipc_Event_Client_Data *e;
137
138    e = event;
139    if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
140      return ECORE_CALLBACK_PASS_ON;
141    switch (e->major)
142      {
143       case E_IPC_DOMAIN_SETUP:
144       case E_IPC_DOMAIN_REQUEST:
145       case E_IPC_DOMAIN_REPLY:
146       case E_IPC_DOMAIN_EVENT:
147         switch (e->minor)
148           {
149            case E_IPC_OP_EXEC_ACTION:
150                {
151                   E_Ipc_2Str *req = NULL;
152
153                   if (e_ipc_codec_2str_dec(e->data, e->size, &req))
154                     {
155                        Eina_List *m = e_manager_list();
156                        int len, ok = 0;
157                        void *d;
158
159                        if (m)
160                          {
161                             E_Manager *man = eina_list_data_get(m);
162
163                             if (man)
164                               {
165                                  E_Action *act = e_action_find(req->str1);
166
167                                  if ((act) && (act->func.go))
168                                    {
169                                       act->func.go(E_OBJECT(man), req->str2);
170                                       ok = 1;
171                                    }
172                               }
173                          }
174
175                        d = e_ipc_codec_int_enc(ok, &len);
176                        if (d)
177                          {
178                             ecore_ipc_client_send(e->client,
179                                                   E_IPC_DOMAIN_REPLY,
180                                                   E_IPC_OP_EXEC_ACTION_REPLY,
181                                                   0, 0, 0, d, len);
182                             free(d);
183                          }
184
185                        if (req)
186                          {
187                             E_FREE(req->str1);
188                             E_FREE(req->str2);
189                             E_FREE(req);
190                          }
191                     }
192                }
193              break;
194
195            default:
196              break;
197           }
198         break;
199
200       case E_IPC_DOMAIN_THUMB:
201         e_thumb_client_data(e);
202         break;
203
204       case E_IPC_DOMAIN_FM:
205         e_fm2_client_data(e);
206         break;
207
208       case E_IPC_DOMAIN_INIT:
209         e_init_client_data(e);
210         break;
211
212       case E_IPC_DOMAIN_ALERT:
213           {
214              switch (e->minor)
215                {
216                 case E_ALERT_OP_RESTART:
217                   if (getenv("E_START_MTRACK"))
218                     e_util_env_set("MTRACK", "track");
219                   ecore_app_restart();
220                   break;
221                 case E_ALERT_OP_EXIT:
222                   exit(-11);
223                   break;
224                }
225           }
226         break;
227       default:
228         break;
229      }
230    return ECORE_CALLBACK_PASS_ON;
231 }
232
233 #endif