ec489b7863686d7d6f1f36067b8c57df62bd4cf0
[framework/uifw/e17.git] / src / bin / e_fm / e_fm_main.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #ifdef HAVE_ALLOCA_H
6 # include <alloca.h>
7 #elif defined __GNUC__
8 # define alloca __builtin_alloca
9 #elif defined _AIX
10 # define alloca __alloca
11 #elif defined _MSC_VER
12 # include <malloc.h>
13 # define alloca _alloca
14 #else
15 # include <stddef.h>
16 # ifdef  __cplusplus
17 extern "C"
18 # endif
19 void *alloca (size_t);
20 #endif
21
22 #ifdef __linux__
23 #include <features.h>
24 #endif
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <unistd.h>
28 #include <string.h>
29 #include <sys/types.h>
30 #include <sys/stat.h>
31 #include <sys/time.h>
32 #include <sys/param.h>
33 #include <utime.h>
34 #include <math.h>
35 #include <fnmatch.h>
36 #include <limits.h>
37 #include <ctype.h>
38 #include <time.h>
39 #include <dirent.h>
40 #include <pwd.h>
41 #include <glob.h>
42 #include <errno.h>
43 #include <signal.h>
44 #include <Ecore.h>
45 #include <Ecore_Ipc.h>
46 #include <Ecore_File.h>
47 #include <Eet.h>
48 #include <Evas.h>
49
50 #define E_TYPEDEFS
51 #include "e_config_data.h"
52 #include "e_fm_op.h"
53 #undef E_TYPEDEFS
54 #include "e_config_data.h"
55 #include "e_fm_op.h"
56
57 #include "e_fm_shared_device.h"
58 #ifdef HAVE_HAL_MOUNT
59 # include "e_fm_main_hal.h"
60 #endif
61 #ifdef HAVE_UDISKS_MOUNT
62 # include "e_fm_main_udisks.h"
63 #endif
64 #ifdef HAVE_EEZE_MOUNT
65 # include "e_fm_main_eeze.h"
66 #endif
67
68
69 /* if using ehal, functions will point to _e_fm_main_hal_X
70  * if using udisks, functions will point to _e_fm_main_udisks_X
71  * if using eeze, functions will point to _e_fm_main_eeze_X
72  */
73
74 static Efm_Mode mode = EFM_MODE_USING_RASTER_MOUNT;
75
76 /* FIXME: things to add to the slave enlightenment_fm process and ipc to e:
77  * 
78  * * reporting results of fop's (current status - what has been don, what failed etc.)
79  * * dbus removable device monitoring (in e17 itself now via e_dbus - move to enlightenment_fm and ipc removable device add/del and anything else)
80  * * mount/umount of removable devices (to go along with removable device support - put it in here and message back mount success/failure and where it is now mounted - remove from e17 itself)
81  * 
82  */
83
84 #ifndef EAPI
85 #define EAPI
86 #endif
87
88 #include "e_fm_main.h"
89 #include "e_fm_shared_types.h"
90 #include "e_fm_shared_codec.h"
91 #include "e_fm_ipc.h"
92
93 static void
94 _e_fm_init(void)
95 {
96 #ifdef HAVE_HAL_MOUNT
97    _e_fm_main_hal_init();
98 #else
99 # ifdef HAVE_UDISKS_MOUNT
100    _e_fm_main_udisks_init();
101 # else
102 #  ifdef HAVE_EEZE_MOUNT
103    _e_fm_main_eeze_init();
104 #  endif
105 # endif
106 #endif
107 }
108
109 static void
110 _e_fm_shutdown(void)
111 {
112 #ifdef HAVE_HAL_MOUNT
113    _e_fm_main_hal_shutdown();
114 #else
115 # ifdef HAVE_UDISKS_MOUNT
116    _e_fm_main_udisks_shutdown();
117 # else
118 #  ifdef HAVE_EEZE_MOUNT
119    _e_fm_main_eeze_shutdown();
120 #  endif
121 # endif
122 #endif
123 }
124
125 /* externally accessible functions */
126 int
127 main(int argc, char **argv)
128 {
129    if (argc > 1)
130      {
131         printf(
132         "This is an internal tool for Enlightenment.\n"
133         "do not use it.\n"
134         );
135         exit(0);
136      }
137
138    eina_init();
139    ecore_init();
140    ecore_app_args_set(argc, (const char **)argv);
141
142    _e_fm_init();
143
144    ecore_file_init();
145    ecore_ipc_init();
146    _e_storage_volume_edd_init();
147    _e_fm_ipc_init();
148    
149    ecore_event_handler_add(ECORE_EXE_EVENT_DATA, _e_fm_ipc_slave_data_cb, NULL);
150    ecore_event_handler_add(ECORE_EXE_EVENT_ERROR, _e_fm_ipc_slave_error_cb, NULL);
151    ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _e_fm_ipc_slave_del_cb, NULL);
152    
153    ecore_main_loop_begin();
154   
155    if (_e_fm_ipc_server)
156      {
157         ecore_ipc_server_del(_e_fm_ipc_server);
158         _e_fm_ipc_server = NULL;
159      }
160
161    _e_fm_shutdown();
162    _e_storage_volume_edd_shutdown();
163    ecore_ipc_shutdown();
164    ecore_file_shutdown();
165    ecore_shutdown();
166    eina_shutdown();
167 }
168
169 #ifdef HAVE_HAL_MOUNT
170 void
171 _e_fm_main_hal_catch(Eina_Bool usable)
172 {
173    if (usable) mode = EFM_MODE_USING_HAL_MOUNT;
174 }
175 #endif
176 #ifdef HAVE_UDISKS_MOUNT
177 void
178 _e_fm_main_udisks_catch(Eina_Bool usable)
179 {
180    if (usable) mode = EFM_MODE_USING_UDISKS_MOUNT;
181 }
182 #endif
183 #ifdef HAVE_EEZE_MOUNT
184 void
185 _e_fm_main_eeze_catch(Eina_Bool usable)
186 {
187    if (usable) mode = EFM_MODE_USING_EEZE_MOUNT;
188 }
189 #endif
190
191 void
192 _e_storage_free(E_Storage *s)
193 {
194    _e_fm_shared_device_storage_free(s);
195 }
196
197 void
198 _e_volume_free(E_Volume *v)
199 {
200    _e_fm_shared_device_volume_free(v);
201 }
202
203 /* API functions */
204
205 EAPI void
206 e_volume_mount(E_Volume *v)
207 {
208   switch (mode)
209     {
210 #ifdef HAVE_HAL_MOUNT
211      case EFM_MODE_USING_HAL_MOUNT:
212        _e_fm_main_hal_volume_mount(v);
213        break;
214 #endif
215 #ifdef HAVE_UDISKS_MOUNT
216      case EFM_MODE_USING_UDISKS_MOUNT:
217        _e_fm_main_udisks_volume_mount(v);
218        break;
219 #endif
220 #ifdef HAVE_EEZE_MOUNT
221      case EFM_MODE_USING_EEZE_MOUNT:
222        _e_fm_main_eeze_volume_mount(v);
223        break;
224 #endif
225      default:
226        printf("raster can't mount disks by himself!\n");
227     }
228 }
229
230
231 EAPI void
232 e_volume_unmount(E_Volume *v)
233 {
234   switch (mode)
235     {
236 #ifdef HAVE_HAL_MOUNT
237      case EFM_MODE_USING_HAL_MOUNT:
238        _e_fm_main_hal_volume_unmount(v);
239        break;
240 #endif
241 #ifdef HAVE_UDISKS_MOUNT
242      case EFM_MODE_USING_UDISKS_MOUNT:
243        _e_fm_main_udisks_volume_unmount(v);
244        break;
245 #endif
246 #ifdef HAVE_EEZE_MOUNT
247      case EFM_MODE_USING_EEZE_MOUNT:
248        _e_fm_main_eeze_volume_unmount(v);
249        break;
250 #endif
251      default:
252        printf("raster can't unmount disks by himself!\n");
253     }
254 }
255
256 EAPI void
257 e_volume_eject(E_Volume *v)
258 {
259   switch (mode)
260     {
261 #ifdef HAVE_HAL_MOUNT
262      case EFM_MODE_USING_HAL_MOUNT:
263        _e_fm_main_hal_volume_eject(v);
264        break;
265 #endif
266 #ifdef HAVE_UDISKS_MOUNT
267      case EFM_MODE_USING_UDISKS_MOUNT:
268        _e_fm_main_udisks_volume_eject(v);
269        break;
270 #endif
271 #ifdef HAVE_EEZE_MOUNT
272      case EFM_MODE_USING_EEZE_MOUNT:
273        _e_fm_main_eeze_volume_eject(v);
274        break;
275 #endif
276      default:
277        printf("raster can't eject disks by himself!\n");
278     }
279 }
280
281 EAPI E_Volume *
282 e_volume_find(const char *udi)
283 {
284    switch (mode)
285      {
286 #ifdef HAVE_HAL_MOUNT
287       case EFM_MODE_USING_HAL_MOUNT:
288         return _e_fm_main_hal_volume_find(udi);
289 #endif
290 #ifdef HAVE_UDISKS_MOUNT
291       case EFM_MODE_USING_UDISKS_MOUNT:
292         return _e_fm_main_udisks_volume_find(udi);
293 #endif
294 #ifdef HAVE_EEZE_MOUNT
295       case EFM_MODE_USING_EEZE_MOUNT:
296         return _e_fm_main_eeze_volume_find(udi);
297 #endif
298       default:
299         printf("raster can't find disks by himself!\n");
300      }
301    return NULL;
302 }
303
304 EAPI void
305 e_storage_del(const char *udi)
306 {
307   switch (mode)
308     {
309 #ifdef HAVE_HAL_MOUNT
310      case EFM_MODE_USING_HAL_MOUNT:
311        _e_fm_main_hal_storage_del(udi);
312        break;
313 #endif
314 #ifdef HAVE_UDISKS_MOUNT
315      case EFM_MODE_USING_UDISKS_MOUNT:
316        _e_fm_main_udisks_storage_del(udi);
317        break;
318 #endif
319 #ifdef HAVE_EEZE_MOUNT
320      case EFM_MODE_USING_EEZE_MOUNT:
321        _e_fm_main_eeze_storage_del(udi);
322        break;
323 #endif
324      default:
325        printf("raster can't delete disks by himself!\n");
326     }
327 }
328
329 EAPI E_Storage *
330 e_storage_find(const char *udi)
331 {
332   switch (mode)
333     {
334 #ifdef HAVE_HAL_MOUNT
335      case EFM_MODE_USING_HAL_MOUNT:
336        return _e_fm_main_hal_storage_find(udi);
337 #endif
338 #ifdef HAVE_UDISKS_MOUNT
339      case EFM_MODE_USING_UDISKS_MOUNT:
340        return _e_fm_main_udisks_storage_find(udi);
341 #endif
342 #ifdef HAVE_EEZE_MOUNT
343      case EFM_MODE_USING_EEZE_MOUNT:
344        return _e_fm_main_eeze_storage_find(udi);
345 #endif
346      default:
347        printf("raster can't find disks by himself!\n");
348     }
349   return NULL;
350 }