update for beta release
[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
49 #define E_TYPEDEFS
50 #include "e_config_data.h"
51 #include "e_fm_op.h"
52 #undef E_TYPEDEFS
53 #include "e_config_data.h"
54 #include "e_fm_op.h"
55
56 #include "e_fm_shared_device.h"
57 #ifdef HAVE_HAL_MOUNT
58 # include "e_fm_main_hal.h"
59 #endif
60 #ifdef HAVE_UDISKS_MOUNT
61 # include "e_fm_main_udisks.h"
62 #endif
63 #ifdef HAVE_EEZE_MOUNT
64 # include "e_fm_main_eeze.h"
65 #endif
66
67
68 /* if using ehal, functions will point to _e_fm_main_hal_X
69  * if using udisks, functions will point to _e_fm_main_udisks_X
70  * if using eeze, functions will point to _e_fm_main_eeze_X
71  */
72
73 static Efm_Mode mode = EFM_MODE_USING_RASTER_MOUNT;
74
75 /* FIXME: things to add to the slave enlightenment_fm process and ipc to e:
76  * 
77  * * reporting results of fop's (current status - what has been don, what failed etc.)
78  * * dbus removable device monitoring (in e17 itself now via e_dbus - move to enlightenment_fm and ipc removable device add/del and anything else)
79  * * 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)
80  * 
81  */
82
83 #ifndef EAPI
84 #define EAPI
85 #endif
86
87 #include "e_fm_main.h"
88 #include "e_fm_shared_types.h"
89 #include "e_fm_shared_codec.h"
90 #include "e_fm_ipc.h"
91
92 int efm_log_dom = -1;
93
94 static void
95 _e_fm_init(void)
96 {
97 #ifdef HAVE_HAL_MOUNT
98    _e_fm_main_hal_init();
99 #else
100 # ifdef HAVE_UDISKS_MOUNT
101    _e_fm_main_udisks_init();
102 # else
103 #  ifdef HAVE_EEZE_MOUNT
104    _e_fm_main_eeze_init();
105    mode = EFM_MODE_USING_EEZE_MOUNT; /* this gets overridden if the others are available */
106 #  endif
107 # endif
108 #endif
109 }
110
111 static void
112 _e_fm_shutdown(void)
113 {
114 #ifdef HAVE_HAL_MOUNT
115    _e_fm_main_hal_shutdown();
116 #else
117 # ifdef HAVE_UDISKS_MOUNT
118    _e_fm_main_udisks_shutdown();
119 # else
120 #  ifdef HAVE_EEZE_MOUNT
121    _e_fm_main_eeze_shutdown();
122 #  endif
123 # endif
124 #endif
125 }
126
127 /* externally accessible functions */
128 int
129 main(int argc, char **argv)
130 {
131    if (argc > 1)
132      {
133         printf(
134         "This is an internal tool for Enlightenment.\n"
135         "do not use it.\n"
136         );
137         exit(0);
138      }
139
140    eina_init();
141    eet_init();
142    ecore_init();
143    ecore_app_args_set(argc, (const char **)argv);
144
145    ecore_file_init();
146    ecore_ipc_init();
147    _e_storage_volume_edd_init();
148    _e_fm_ipc_init();
149    efm_log_dom = eina_log_domain_register("efm", EINA_COLOR_GREEN);
150    eina_log_domain_level_set("efm", EINA_LOG_LEVEL_DBG);
151    _e_fm_init();
152
153    ecore_event_handler_add(ECORE_EXE_EVENT_DATA, _e_fm_ipc_slave_data_cb, NULL);
154    ecore_event_handler_add(ECORE_EXE_EVENT_ERROR, _e_fm_ipc_slave_error_cb, NULL);
155    ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _e_fm_ipc_slave_del_cb, NULL);
156    
157    ecore_main_loop_begin();
158   
159    if (_e_fm_ipc_server)
160      {
161         ecore_ipc_server_del(_e_fm_ipc_server);
162         _e_fm_ipc_server = NULL;
163      }
164
165    _e_fm_shutdown();
166    _e_storage_volume_edd_shutdown();
167    ecore_ipc_shutdown();
168    ecore_file_shutdown();
169    ecore_shutdown();
170    eina_shutdown();
171 }
172
173 #ifdef HAVE_HAL_MOUNT
174 void
175 _e_fm_main_hal_catch(Eina_Bool usable)
176 {
177    if (usable)
178      {
179         mode = EFM_MODE_USING_HAL_MOUNT;
180         return;
181      }
182 # ifdef HAVE_EEZE_MOUNT
183    _e_fm_main_eeze_init();
184    mode = EFM_MODE_USING_EEZE_MOUNT;
185 # endif
186 }
187 #endif
188 #ifdef HAVE_UDISKS_MOUNT
189 void
190 _e_fm_main_udisks_catch(Eina_Bool usable)
191 {
192    if (usable)
193      {
194         mode = EFM_MODE_USING_UDISKS_MOUNT;
195         return;
196      }
197 # ifdef HAVE_EEZE_MOUNT
198    _e_fm_main_eeze_init();
199    mode = EFM_MODE_USING_EEZE_MOUNT;
200 # endif
201 }
202 #endif
203
204 void
205 _e_storage_free(E_Storage *s)
206 {
207    _e_fm_shared_device_storage_free(s);
208 }
209
210 void
211 _e_volume_free(E_Volume *v)
212 {
213    _e_fm_shared_device_volume_free(v);
214 }
215
216 /* API functions */
217
218 EAPI void
219 e_volume_mount(E_Volume *v)
220 {
221   switch (mode)
222     {
223 #ifdef HAVE_HAL_MOUNT
224      case EFM_MODE_USING_HAL_MOUNT:
225        _e_fm_main_hal_volume_mount(v);
226        break;
227 #endif
228 #ifdef HAVE_UDISKS_MOUNT
229      case EFM_MODE_USING_UDISKS_MOUNT:
230        _e_fm_main_udisks_volume_mount(v);
231        break;
232 #endif
233 #ifdef HAVE_EEZE_MOUNT
234      case EFM_MODE_USING_EEZE_MOUNT:
235        _e_fm_main_eeze_volume_mount(v);
236        break;
237 #endif
238      default:
239        printf("raster can't mount disks by himself!\n");
240     }
241 }
242
243
244 EAPI void
245 e_volume_unmount(E_Volume *v)
246 {
247   switch (mode)
248     {
249 #ifdef HAVE_HAL_MOUNT
250      case EFM_MODE_USING_HAL_MOUNT:
251        _e_fm_main_hal_volume_unmount(v);
252        break;
253 #endif
254 #ifdef HAVE_UDISKS_MOUNT
255      case EFM_MODE_USING_UDISKS_MOUNT:
256        _e_fm_main_udisks_volume_unmount(v);
257        break;
258 #endif
259 #ifdef HAVE_EEZE_MOUNT
260      case EFM_MODE_USING_EEZE_MOUNT:
261        _e_fm_main_eeze_volume_unmount(v);
262        break;
263 #endif
264      default:
265        printf("raster can't unmount disks by himself!\n");
266     }
267 }
268
269 EAPI void
270 e_volume_eject(E_Volume *v)
271 {
272   switch (mode)
273     {
274 #ifdef HAVE_HAL_MOUNT
275      case EFM_MODE_USING_HAL_MOUNT:
276        _e_fm_main_hal_volume_eject(v);
277        break;
278 #endif
279 #ifdef HAVE_UDISKS_MOUNT
280      case EFM_MODE_USING_UDISKS_MOUNT:
281        _e_fm_main_udisks_volume_eject(v);
282        break;
283 #endif
284 #ifdef HAVE_EEZE_MOUNT
285      case EFM_MODE_USING_EEZE_MOUNT:
286        _e_fm_main_eeze_volume_eject(v);
287        break;
288 #endif
289      default:
290        printf("raster can't eject disks by himself!\n");
291     }
292 }
293
294 EAPI E_Volume *
295 e_volume_find(const char *udi)
296 {
297    switch (mode)
298      {
299 #ifdef HAVE_HAL_MOUNT
300       case EFM_MODE_USING_HAL_MOUNT:
301         return _e_fm_main_hal_volume_find(udi);
302 #endif
303 #ifdef HAVE_UDISKS_MOUNT
304       case EFM_MODE_USING_UDISKS_MOUNT:
305         return _e_fm_main_udisks_volume_find(udi);
306 #endif
307 #ifdef HAVE_EEZE_MOUNT
308       case EFM_MODE_USING_EEZE_MOUNT:
309         return _e_fm_main_eeze_volume_find(udi);
310 #endif
311       default:
312         printf("raster can't find disks by himself!\n");
313      }
314    return NULL;
315 }
316
317 EAPI void
318 e_storage_del(const char *udi)
319 {
320   switch (mode)
321     {
322 #ifdef HAVE_HAL_MOUNT
323      case EFM_MODE_USING_HAL_MOUNT:
324        _e_fm_main_hal_storage_del(udi);
325        break;
326 #endif
327 #ifdef HAVE_UDISKS_MOUNT
328      case EFM_MODE_USING_UDISKS_MOUNT:
329        _e_fm_main_udisks_storage_del(udi);
330        break;
331 #endif
332 #ifdef HAVE_EEZE_MOUNT
333      case EFM_MODE_USING_EEZE_MOUNT:
334        _e_fm_main_eeze_storage_del(udi);
335        break;
336 #endif
337      default:
338        printf("raster can't delete disks by himself!\n");
339     }
340 }
341
342 EAPI E_Storage *
343 e_storage_find(const char *udi)
344 {
345   switch (mode)
346     {
347 #ifdef HAVE_HAL_MOUNT
348      case EFM_MODE_USING_HAL_MOUNT:
349        return _e_fm_main_hal_storage_find(udi);
350 #endif
351 #ifdef HAVE_UDISKS_MOUNT
352      case EFM_MODE_USING_UDISKS_MOUNT:
353        return _e_fm_main_udisks_storage_find(udi);
354 #endif
355 #ifdef HAVE_EEZE_MOUNT
356      case EFM_MODE_USING_EEZE_MOUNT:
357        return _e_fm_main_eeze_storage_find(udi);
358 #endif
359      default:
360        printf("raster can't find disks by himself!\n");
361     }
362   return NULL;
363 }