On Mon, 4 Oct 2010 23:33:23 -0700 "Enlightenment SVN"
<[email protected]> said:
along the way with all your efm commits here you broke removable device
storage. devices appear in e17 - but they mount "/" when you open them up (ie
u see /usr, /bin, /lib, /tmp etc. from /).
> Log:
> complete rewrite of all includes and file splitting to completely abstract
> dbus out of efm Author: discomfitor
> Date: 2010-10-04 23:33:23 -0700 (Mon, 04 Oct 2010)
> New Revision: 53051
>
> Added:
> trunk/e/src/bin/e_fm/Makefile.am trunk/e/src/bin/e_fm/e_fm_main.h
> trunk/e/src/bin/e_fm/e_fm_main_dbus.c trunk/e/src/bin/e_fm/e_fm_main_dbus.h
> trunk/e/src/bin/e_fm_shared_codec.c trunk/e/src/bin/e_fm_shared_codec.h
> trunk/e/src/bin/e_fm_shared_dbus.c trunk/e/src/bin/e_fm_shared_dbus.h
> trunk/e/src/bin/e_fm_shared_types.h Removed: trunk/e/src/bin/e_fm_shared.h
> Modified: trunk/e/src/bin/Makefile.am trunk/e/src/bin/e_fm.c
> trunk/e/src/bin/e_fm.h trunk/e/src/bin/e_fm/e_fm_ipc.c
> trunk/e/src/bin/e_fm/e_fm_ipc.h trunk/e/src/bin/e_fm/e_fm_main.c
> trunk/e/src/bin/e_fm_dbus.c
>
> Modified: trunk/e/src/bin/Makefile.am
> ===================================================================
> --- trunk/e/src/bin/Makefile.am 2010-10-05 06:33:19 UTC (rev 53050)
> +++ trunk/e/src/bin/Makefile.am 2010-10-05 06:33:23 UTC (rev 53051)
> @@ -159,7 +159,9 @@
> e_exec.h \
> e_widget_font_preview.h \
> e_fm_custom.h \
> -e_fm_shared.h \
> +e_fm_shared_types.h \
> +e_fm_shared_codec.h \
> +e_fm_shared_dbus.h \
> e_config_data.h \
> e_intl_data.h \
> e_toolbar.h \
> @@ -277,6 +279,8 @@
> e_int_border_prop.c \
> e_entry_dialog.c \
> e_fm.c \
> +e_fm_shared_codec.c \
> +e_fm_shared_dbus.c \
> e_fm_dbus.c \
> e_fm_op_registry.c \
> e_widget_scrollframe.c \
>
> Modified: trunk/e/src/bin/e_fm/e_fm_ipc.c
> ===================================================================
> --- trunk/e/src/bin/e_fm/e_fm_ipc.c 2010-10-05 06:33:19 UTC (rev 53050)
> +++ trunk/e/src/bin/e_fm/e_fm_ipc.c 2010-10-05 06:33:23 UTC (rev 53051)
> @@ -33,17 +33,12 @@
> #include <Evas.h>
> #include <Efreet.h>
> #include <Eet.h>
> -#include <E_DBus.h>
> -#ifdef HAVE_EUKIT
> -#include <E_Ukit.h>
> -#else
> -#include <E_Hal.h>
> -#endif
> +
> #include <eina_stringshare.h>
>
> #include "e.h"
> #include "e_fm_ipc.h"
> -
> +//#include "e_fm_shared_c.h"
> #include "e_fm_op.h"
>
>
> @@ -118,7 +113,7 @@
> int x,y;
> };
>
> -#include "e_fm_shared.h"
> +
> /* local subsystem globals */
> Ecore_Ipc_Server *_e_fm_ipc_server = NULL;
>
>
> Modified: trunk/e/src/bin/e_fm/e_fm_ipc.h
> ===================================================================
> --- trunk/e/src/bin/e_fm/e_fm_ipc.h 2010-10-05 06:33:19 UTC (rev 53050)
> +++ trunk/e/src/bin/e_fm/e_fm_ipc.h 2010-10-05 06:33:23 UTC (rev 53051)
> @@ -1,6 +1,8 @@
> #ifndef E_FM_IPC_H
> #define E_FM_IPC_H
>
> +#include "e_fm_shared_types.h"
> +
> int _e_fm_ipc_init(void);
> Eina_Bool _e_fm_ipc_slave_data_cb(void *data, int type, void *event);
> Eina_Bool _e_fm_ipc_slave_error_cb(void *data, int type, void *event);
>
> Modified: trunk/e/src/bin/e_fm/e_fm_main.c
> ===================================================================
> --- trunk/e/src/bin/e_fm/e_fm_main.c 2010-10-05 06:33:19 UTC (rev
> 53050) +++ trunk/e/src/bin/e_fm/e_fm_main.c 2010-10-05 06:33:23 UTC
> (rev 53051) @@ -42,16 +42,8 @@
> #include <Ecore.h>
> #include <Ecore_Ipc.h>
> #include <Ecore_File.h>
> -#include <Evas.h>
> -#include <Efreet.h>
> #include <Eet.h>
> -#include <E_DBus.h>
> -#ifdef HAVE_EUKIT
> -#include <E_Ukit.h>
> -#else
> -#include <E_Hal.h>
> -#endif
> -#include <eina_stringshare.h>
> +#include <Evas.h>
>
> #define E_TYPEDEFS
> #include "e_config_data.h"
> @@ -60,57 +52,41 @@
> #include "e_config_data.h"
> #include "e_fm_op.h"
>
> +/* if using ehal, functions will point to _e_fm_main_dbus_X
> + * if using eeze, functions will point to _e_fm_main_eeze_X
> + */
> +#ifndef HAVE_EEZE_MOUNT
> +#include "e_fm_main_dbus.h"
> +#include "e_fm_shared_dbus.h"
> +#define _E_FM(FUNC) _e_fm_main_dbus_##FUNC
> +#define _E_FM_SHARED(FUNC) _e_fm_shared_dbus_##FUNC
> +#else
> +#include "e_fm_main_eeze.h"
> +#define _E_FM(FUNC) _e_fm_main_eeze_##FUNC
> +#define _E_FM_SHARED(FUNC) _e_fm_shared_eeze_##FUNC
> +#endif
> +
> /* FIXME: things to add to the slave enlightenment_fm process and ipc to e:
> *
> * * reporting results of fop's (current status - what has been don, what
> failed etc.)
> - * * dbus removable device monitoring (in e17 itself now via ecore_dbus -
> move to enlightenment_fm and ipc removable device add/del and anything else)
> + * * dbus removable device monitoring (in e17 itself now via e_dbus - move
> to enlightenment_fm and ipc removable device add/del and anything else)
> * * 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)
> *
> */
> -static E_DBus_Signal_Handler *_hal_poll = NULL;
>
> #ifndef EAPI
> #define EAPI
> #endif
>
> -#define E_FM_SHARED_DATATYPES
> -#include "e_fm_shared.h"
> -#undef E_FM_SHARED_DATATYPES
> +#include "e_fm_main.h"
> +#include "e_fm_shared_types.h"
> +#include "e_fm_shared_codec.h"
> +#include "e_fm_ipc.h"
>
> +
> static void _e_fm_init(void);
> static void _e_fm_shutdown(void);
> -static void _e_dbus_cb_dev_all(void *user_data, void *reply_data, DBusError
> *error); -static void _e_dbus_cb_dev_store(void *user_data, void *reply_data,
> DBusError *error); -static void _e_dbus_cb_dev_vol(void *user_data, void
> *reply_data, DBusError *error); -static void _e_dbus_cb_store_is(void
> *user_data, void *reply_data, DBusError *error); -static void
> _e_dbus_cb_vol_is(void *user_data, void *reply_data, DBusError *error);
> -static void _e_dbus_cb_dev_add(void *data, DBusMessage *msg); -static void
> _e_dbus_cb_dev_del(void *data, DBusMessage *msg); -static void
> _e_dbus_cb_cap_add(void *data, DBusMessage *msg); -static void
> _e_dbus_cb_prop_modified(void *data, DBusMessage *msg); -static void
> _e_dbus_cb_store_prop(void *data, void *reply_data, DBusError *error);
> -static void _e_dbus_cb_vol_prop(void *data, void *reply_data, DBusError
> *error); -static void _e_dbus_cb_vol_prop_mount_modified(void *data, void
> *reply_data, DBusError *error); -static void _e_dbus_cb_vol_mounted(void
> *user_data, void *method_return, DBusError *error); -static void
> _e_dbus_cb_vol_unmounted(void *user_data, void *method_return, DBusError
> *error); -static void _e_dbus_cb_vol_unmounted_before_eject(void *user_data,
> void *method_return, DBusError *error); -static Eina_Bool
> _e_dbus_vb_vol_ejecting_after_unmount(void *data); -static void
> _e_dbus_cb_vol_ejected(void *user_data, void *method_return, DBusError
> *error); -static int _e_dbus_format_error_msg(char **buf, E_Volume *v,
> DBusError *error); -static void _hal_test(void *data, DBusMessage *msg,
> DBusError *error); -static void _e_hal_poll(void *data, DBusMessage *msg);
> -static Eina_Bool _e_dbus_vol_mount_timeout(void *data); -static Eina_Bool
> _e_dbus_vol_unmount_timeout(void *data); -static Eina_Bool
> _e_dbus_vol_eject_timeout(void *data); - -#define E_FM_MOUNT_TIMEOUT 30.0
> -#define E_FM_UNMOUNT_TIMEOUT 60.0
> -#define E_FM_EJECT_TIMEOUT 15.0
> -
> -static E_DBus_Connection *_e_dbus_conn = NULL;
> -extern Ecore_Ipc_Server *_e_fm_ipc_server;
> -
> /* contains:
> * _e_volume_edd
> * _e_storage_edd
> @@ -121,10 +97,7 @@
> * _e_storage_volume_edd_init()
> * _e_storage_volume_edd_shutdown()
> */
> -#define E_FM_SHARED_CODEC
> -#include "e_fm_shared.h"
> -#undef E_FM_SHARED_CODEC
> -#include "e_fm_ipc.h"
> +
> /* externally accessible functions */
> int
> main(int argc, char **argv)
> @@ -169,6 +142,7 @@
> }
>
> _e_fm_shutdown();
> + _e_storage_volume_edd_shutdown();
> ecore_ipc_shutdown();
> ecore_file_shutdown();
> ecore_shutdown();
> @@ -178,917 +152,60 @@
> static void
> _e_fm_init(void)
> {
> - e_dbus_init();
> - e_hal_init();
> - _e_dbus_conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
> - /* previously, this assumed that if dbus was running, hal was running. */
> - if (_e_dbus_conn)
> - e_dbus_get_name_owner(_e_dbus_conn, E_HAL_SENDER, _hal_test, NULL);
> + _E_FM(init)();
> }
>
> static void
> _e_fm_shutdown(void)
> {
> - if (_e_dbus_conn)
> - e_dbus_connection_close(_e_dbus_conn);
> - _e_storage_volume_edd_shutdown();
> - e_hal_shutdown();
> - e_dbus_shutdown();
> + _E_FM(shutdown)();
> }
>
> -static void
> -_e_hal_poll(void *data __UNUSED__, DBusMessage *msg)
> +EAPI void
> +e_volume_mount(E_Volume *v)
> {
> - DBusError err;
> - const char *name, *from, *to;
> -
> - dbus_error_init(&err);
> - if (!dbus_message_get_args(msg, &err,
> - DBUS_TYPE_STRING, &name,
> - DBUS_TYPE_STRING, &from,
> - DBUS_TYPE_STRING, &to,
> - DBUS_TYPE_INVALID))
> - dbus_error_free(&err);
> -
> - printf("name: %s\nfrom: %s\nto: %s\n", name, from, to);
> - if ((name) && !strcmp(name, E_HAL_SENDER))
> - _hal_test(NULL, NULL, NULL);
> + _E_FM(volume_mount)(v);
> }
>
> -static void
> -_hal_test(void *data __UNUSED__, DBusMessage *msg __UNUSED__, DBusError
> *error) -{
> - if ((error) && (dbus_error_is_set(error)))
> - {
> - dbus_error_free(error);
> - if (!_hal_poll)
> - _hal_poll =
> - e_dbus_signal_handler_add(_e_dbus_conn,
> - E_DBUS_FDO_BUS, E_DBUS_FDO_PATH,
> - E_DBUS_FDO_INTERFACE,
> - "NameOwnerChanged", _e_hal_poll, NULL);
> - return;
> - }
> - if (_hal_poll)
> - e_dbus_signal_handler_del(_e_dbus_conn, _hal_poll);
>
> - e_hal_manager_get_all_devices(_e_dbus_conn, _e_dbus_cb_dev_all, NULL);
> - e_hal_manager_find_device_by_capability(_e_dbus_conn, "storage",
> - _e_dbus_cb_dev_store, NULL);
> - e_hal_manager_find_device_by_capability(_e_dbus_conn, "volume",
> - _e_dbus_cb_dev_vol, NULL);
> -
> - e_dbus_signal_handler_add(_e_dbus_conn, E_HAL_SENDER,
> - E_HAL_MANAGER_PATH,
> - E_HAL_MANAGER_INTERFACE,
> - "DeviceAdded", _e_dbus_cb_dev_add, NULL);
> - e_dbus_signal_handler_add(_e_dbus_conn, E_HAL_SENDER,
> - E_HAL_MANAGER_PATH,
> - E_HAL_MANAGER_INTERFACE,
> - "DeviceRemoved", _e_dbus_cb_dev_del, NULL);
> - e_dbus_signal_handler_add(_e_dbus_conn, E_HAL_SENDER,
> - E_HAL_MANAGER_PATH,
> - E_HAL_MANAGER_INTERFACE,
> - "NewCapability", _e_dbus_cb_cap_add, NULL);
> -}
> -
> -static void
> -_e_dbus_cb_dev_all(void *user_data __UNUSED__, void *reply_data, DBusError
> *error) -{
> - E_Hal_Manager_Get_All_Devices_Return *ret = reply_data;
> - Eina_List *l;
> - char *udi;
> -
> - if (!ret || !ret->strings) return;
> -
> - if (dbus_error_is_set(error))
> - {
> - dbus_error_free(error);
> - return;
> - }
> -
> - EINA_LIST_FOREACH(ret->strings, l, udi)
> - {
> -// printf("DB INIT DEV+: %s\n", udi);
> - e_hal_device_query_capability(_e_dbus_conn, udi, "storage",
> - _e_dbus_cb_store_is, (void*)eina_stringshare_add(udi));
> - e_hal_device_query_capability(_e_dbus_conn, udi, "volume",
> - _e_dbus_cb_vol_is, (void*)eina_stringshare_add(udi));
> - }
> -}
> -
> -static void
> -_e_dbus_cb_dev_store(void *user_data __UNUSED__, void *reply_data, DBusError
> *error) -{
> - E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply_data;
> - Eina_List *l;
> - char *device;
> -
> - if (!ret || !ret->strings) return;
> -
> - if (dbus_error_is_set(error))
> - {
> - dbus_error_free(error);
> - return;
> - }
> -
> - EINA_LIST_FOREACH(ret->strings, l, device)
> - {
> -// printf("DB STORE+: %s\n", device);
> - e_storage_add(device);
> - }
> -}
> -
> -static void
> -_e_dbus_cb_dev_vol(void *user_data __UNUSED__, void *reply_data, DBusError
> *error) -{
> - E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply_data;
> - Eina_List *l;
> - char *device;
> -
> - if (!ret || !ret->strings) return;
> -
> - if (dbus_error_is_set(error))
> - {
> - dbus_error_free(error);
> - return;
> - }
> -
> - EINA_LIST_FOREACH(ret->strings, l, device)
> - {
> -// printf("DB VOL+: %s\n", device);
> - e_volume_add(device, 1);
> - }
> -}
> -
> -static void
> -_e_dbus_cb_store_is(void *user_data, void *reply_data, DBusError *error)
> -{
> - char *udi = user_data;
> - E_Hal_Device_Query_Capability_Return *ret = reply_data;
> -
> - if (dbus_error_is_set(error))
> - {
> - dbus_error_free(error);
> - goto error;
> - }
> -
> - if (ret && ret->boolean)
> - {
> -// printf("DB STORE IS+: %s\n", udi);
> - e_storage_add(udi);
> - }
> -
> - error:
> - eina_stringshare_del(udi);
> -}
> -
> -static void
> -_e_dbus_cb_vol_is(void *user_data, void *reply_data, DBusError *error)
> -{
> - char *udi = user_data;
> - E_Hal_Device_Query_Capability_Return *ret = reply_data;
> -
> - if (dbus_error_is_set(error))
> - {
> - dbus_error_free(error);
> - goto error;
> - }
> -
> - if (ret && ret->boolean)
> - {
> -// printf("DB VOL IS+: %s\n", udi);
> - e_volume_add(udi, 0);
> - }
> -
> - error:
> - eina_stringshare_del(udi);
> -}
> -
> -static void
> -_e_dbus_cb_dev_add(void *data __UNUSED__, DBusMessage *msg)
> -{
> - DBusError err;
> - char *udi = NULL;
> -
> - dbus_error_init(&err);
> - dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi,
> DBUS_TYPE_INVALID);
> - if (!udi) return;
> - e_hal_device_query_capability(_e_dbus_conn, udi, "storage",
> - _e_dbus_cb_store_is, (void*)
> eina_stringshare_add(udi));
> - e_hal_device_query_capability(_e_dbus_conn, udi, "volume",
> - _e_dbus_cb_vol_is, (void*)
> eina_stringshare_add(udi)); -}
> -
> -static void
> -_e_dbus_cb_dev_del(void *data __UNUSED__, DBusMessage *msg)
> -{
> - DBusError err;
> - char *udi;
> -
> - dbus_error_init(&err);
> -
> - dbus_message_get_args(msg,
> - &err, DBUS_TYPE_STRING,
> - &udi, DBUS_TYPE_INVALID);
> -// printf("DB DEV-: %s\n", udi);
> - e_storage_del(udi);
> - e_volume_del(udi);
> -}
> -
> -static void
> -_e_dbus_cb_cap_add(void *data __UNUSED__, DBusMessage *msg)
> -{
> - DBusError err;
> - char *udi, *capability;
> -
> - dbus_error_init(&err);
> -
> - dbus_message_get_args(msg,
> - &err, DBUS_TYPE_STRING,
> - &udi, DBUS_TYPE_STRING,
> - &capability, DBUS_TYPE_INVALID);
> - if (!strcmp(capability, "storage"))
> - {
> -// printf("DB STORE CAP+: %s\n", udi);
> - e_storage_add(udi);
> - }
> -}
> -
> -static void
> -_e_dbus_cb_prop_modified(void *data, DBusMessage *msg)
> -{
> - E_Volume *v;
> - DBusMessageIter iter, sub, subsub;
> - struct {
> - const char *name;
> - int added;
> - int removed;
> - } prop;
> - int num_changes = 0, i;
> -
> - if (!(v = data)) return;
> -
> - if (dbus_message_get_error_name(msg))
> - {
> - printf("DBUS ERROR: %s\n", dbus_message_get_error_name(msg));
> - return;
> - }
> - if (!dbus_message_iter_init(msg, &iter)) return;
> -
> - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) return;
> - dbus_message_iter_get_basic(&iter, &num_changes);
> - if (num_changes == 0) return;
> -
> - dbus_message_iter_next(&iter);
> - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) return;
> - dbus_message_iter_recurse(&iter, &sub);
> -
> - for (i = 0; i < num_changes; i++, dbus_message_iter_next(&sub))
> - {
> - dbus_message_iter_recurse(&sub, &subsub);
> -
> - if (dbus_message_iter_get_arg_type(&subsub) != DBUS_TYPE_STRING)
> break;
> - dbus_message_iter_get_basic(&subsub, &(prop.name));
> - if (!strcmp(prop.name, "volume.mount_point"))
> - {
> - e_hal_device_get_all_properties(_e_dbus_conn, v->udi,
> -
> _e_dbus_cb_vol_prop_mount_modified,
> - v);
> - return;
> - }
> -
> - dbus_message_iter_next(&subsub);
> - dbus_message_iter_next(&subsub);
> - }
> -}
> -
> -static void
> -_e_dbus_cb_store_prop(void *data, void *reply_data, DBusError *error)
> -{
> - E_Storage *s = data;
> - E_Hal_Properties *ret = reply_data;
> - int err = 0;
> -
> - if (!ret) goto error;
> -
> - if (dbus_error_is_set(error))
> - {
> - dbus_error_free(error);
> - goto error;
> - }
> -
> - s->bus = e_hal_property_string_get(ret, "storage.bus", &err);
> - if (err) goto error;
> - s->bus = eina_stringshare_add(s->bus);
> - s->drive_type = e_hal_property_string_get(ret, "storage.drive_type",
> &err);
> - if (err) goto error;
> - s->drive_type = eina_stringshare_add(s->drive_type);
> - s->model = e_hal_property_string_get(ret, "storage.model", &err);
> - if (err) goto error;
> - s->model = eina_stringshare_add(s->model);
> - s->vendor = e_hal_property_string_get(ret, "storage.vendor", &err);
> - if (err) goto error;
> - s->vendor = eina_stringshare_add(s->vendor);
> - s->serial = e_hal_property_string_get(ret, "storage.serial", &err);
> -// if (err) goto error;
> - if (err) printf("Error getting serial for %s\n", s->udi);
> - s->serial = eina_stringshare_add(s->serial);
> -
> - s->removable = e_hal_property_bool_get(ret, "storage.removable", &err);
> -
> - if (s->removable)
> - {
> - s->media_available = e_hal_property_bool_get(ret,
> "storage.removable.media_available", &err);
> - s->media_size = e_hal_property_uint64_get(ret,
> "storage.removable.media_size", &err);
> - }
> -
> - s->requires_eject = e_hal_property_bool_get(ret,
> "storage.requires_eject", &err);
> - s->hotpluggable = e_hal_property_bool_get(ret, "storage.hotpluggable",
> &err);
> - s->media_check_enabled = e_hal_property_bool_get(ret,
> "storage.media_check_enabled", &err);
> -
> - s->icon.drive = e_hal_property_string_get(ret, "storage.icon.drive",
> &err);
> - s->icon.drive = eina_stringshare_add(s->icon.drive);
> - s->icon.volume = e_hal_property_string_get(ret, "storage.icon.volume",
> &err);
> - s->icon.volume = eina_stringshare_add(s->icon.volume);
> -
> -// printf("++STO:\n udi: %s\n bus: %s\n drive_type: %s\n model: %s\n
> vendor: %s\n serial: %s\n icon.drive: %s\n icon.volume: %s\n\n", s->udi,
> s->bus, s->drive_type, s->model, s->vendor, s->serial, s->icon.drive,
> s->icon.volume);
> - s->validated = EINA_TRUE;
> - {
> - void *msg_data;
> - int msg_size;
> -
> - msg_data = eet_data_descriptor_encode(_e_storage_edd, s, &msg_size);
> - if (msg_data)
> - {
> - ecore_ipc_server_send(_e_fm_ipc_server,
> - 6/*E_IPC_DOMAIN_FM*/,
> - E_FM_OP_STORAGE_ADD,
> - 0, 0, 0, msg_data, msg_size);
> - free(msg_data);
> - }
> - }
> - return;
> -
> - error:
> -// printf("ERR %s\n", s->udi);
> - e_storage_del(s->udi);
> -}
> -
> -static Eina_List *_e_stores = NULL;
> -
> -EAPI E_Storage *
> -e_storage_add(const char *udi)
> -{
> - E_Storage *s;
> -
> - if (!udi) return NULL;
> - if (e_storage_find(udi)) return NULL;
> - s = calloc(1, sizeof(E_Storage));
> - if (!s) return NULL;
> - s->udi = eina_stringshare_add(udi);
> - _e_stores = eina_list_append(_e_stores, s);
> - e_hal_device_get_all_properties(_e_dbus_conn, s->udi,
> - _e_dbus_cb_store_prop, s);
> - return s;
> -}
> -
> EAPI void
> -e_storage_del(const char *udi)
> +e_volume_unmount(E_Volume *v)
> {
> - E_Storage *s;
> -
> - s = e_storage_find(udi);
> - if (!s) return;
> - if (s->validated)
> - {
> -// printf("--STO %s\n", s->udi);
> - ecore_ipc_server_send(_e_fm_ipc_server,
> - 6/*E_IPC_DOMAIN_FM*/,
> - E_FM_OP_STORAGE_DEL,
> - 0, 0, 0, s->udi, strlen(s->udi) + 1);
> - }
> - _e_stores = eina_list_remove(_e_stores, s);
> - _e_storage_free(s);
> + _E_FM(volume_unmount)(v);
> }
>
> -E_Storage *
> -e_storage_find(const char *udi)
> -{
> - Eina_List *l;
> - E_Storage *s;
> -
> - EINA_LIST_FOREACH(_e_stores, l, s)
> - {
> - if (!strcmp(udi, s->udi)) return s;
> - }
> - return NULL;
> -}
> -
> -static void
> -_e_dbus_cb_vol_prop(void *data, void *reply_data, DBusError *error)
> -{
> - E_Volume *v = data;
> - E_Storage *s = NULL;
> - E_Hal_Device_Get_All_Properties_Return *ret = reply_data;
> - int err = 0;
> - const char *str = NULL;
> -
> - if (!ret) goto error;
> - if (dbus_error_is_set(error))
> - {
> - dbus_error_free(error);
> - goto error;
> - }
> -
> - /* skip volumes with volume.ignore set */
> - if (e_hal_property_bool_get(ret, "volume.ignore", &err) || err)
> - goto error;
> -
> - /* skip volumes that aren't filesystems */
> - str = e_hal_property_string_get(ret, "volume.fsusage", &err);
> - if (err || !str) goto error;
> - if (strcmp(str, "filesystem")) goto error;
> - str = NULL;
> -
> - v->uuid = e_hal_property_string_get(ret, "volume.uuid", &err);
> - if (err) goto error;
> - v->uuid = eina_stringshare_add(v->uuid);
> -
> - v->label = e_hal_property_string_get(ret, "volume.label", &err);
> -// if (err) goto error;
> - v->label = eina_stringshare_add(v->label);
> -
> - v->fstype = e_hal_property_string_get(ret, "volume.fstype", &err);
> -// if (err) goto error;
> - v->fstype = eina_stringshare_add(v->fstype);
> -
> - v->size = e_hal_property_uint64_get(ret, "volume.size", &err);
> -
> - v->mounted = e_hal_property_bool_get(ret, "volume.is_mounted", &err);
> - if (err) goto error;
> -
> - v->partition = e_hal_property_bool_get(ret, "volume.is_partition", &err);
> - if (err) goto error;
> -
> - v->mount_point = e_hal_property_string_get(ret, "volume.mount_point",
> &err);
> - if (err) goto error;
> - v->mount_point = eina_stringshare_add(v->mount_point);
> -
> - if (v->partition)
> - {
> - v->partition_number = e_hal_property_int_get(ret,
> "volume.partition.number", NULL);
> - v->partition_label = e_hal_property_string_get(ret,
> "volume.partition.label", NULL);
> - v->partition_label = eina_stringshare_add(v->partition_label);
> - }
> -
> - v->parent = e_hal_property_string_get(ret, "info.parent", &err);
> - if ((!err) && (v->parent))
> - {
> - s = e_storage_find(v->parent);
> - if (s)
> - {
> - v->storage = s;
> - s->volumes = eina_list_append(s->volumes, v);
> - }
> - }
> - v->parent = eina_stringshare_add(v->parent);
> -
> -// printf("++VOL:\n udi: %s\n uuid: %s\n fstype: %s\n size: %llu\n
> label: %s\n partition: %d\n partition_number: %d\n partition_label: %s\n
> mounted: %d\n mount_point: %s\n", v->udi, v->uuid, v->fstype, v->size,
> v->label, v->partition, v->partition_number, v->partition ?
> v->partition_label : "(not a partition)", v->mounted, v->mount_point); -//
> if (s) printf(" for storage: %s\n", s->udi); -// else printf(" storage
> unknown\n");
> - v->validated = EINA_TRUE;
> - {
> - void *msg_data;
> - int msg_size;
> -
> - msg_data = eet_data_descriptor_encode(_e_volume_edd, v, &msg_size);
> - if (msg_data)
> - {
> - ecore_ipc_server_send(_e_fm_ipc_server,
> - 6/*E_IPC_DOMAIN_FM*/,
> - E_FM_OP_VOLUME_ADD,
> - 0, 0, 0, msg_data, msg_size);
> - free(msg_data);
> - }
> - }
> - return;
> -
> - error:
> - e_volume_del(v->udi);
> - return;
> -}
> -
> -static int
> -_e_dbus_format_error_msg(char **buf, E_Volume *v, DBusError *error)
> -{
> - int size, vu, vm, en;
> - char *tmp;
> -
> - vu = strlen(v->udi) + 1;
> - vm = strlen(v->mount_point) + 1;
> - en = strlen(error->name) + 1;
> - size = vu + vm + en + strlen(error->message) + 1;
> - tmp = *buf = malloc(size);
> -
> - strcpy(tmp, v->udi);
> - tmp += vu;
> - strcpy(tmp, v->mount_point);
> - tmp += vm;
> - strcpy(tmp, error->name);
> - tmp += en;
> - strcpy(tmp, error->message);
> -
> - return size;
> -}
> -
> -static void
> -_e_dbus_cb_vol_prop_mount_modified(void *data, void *reply_data, DBusError
> *error) -{
> - E_Volume *v = data;
> - E_Hal_Device_Get_All_Properties_Return *ret = reply_data;
> - int err = 0;
> -
> - if (!ret) return;
> - if (dbus_error_is_set(error))
> - {
> - char *buf;
> - int size;
> -
> - size = _e_dbus_format_error_msg(&buf, v, error);
> - if (v->mounted)
> - ecore_ipc_server_send(_e_fm_ipc_server, 6/*E_IPC_DOMAIN_FM*/,
> E_FM_OP_UNMOUNT_ERROR,
> - 0, 0, 0, buf, size);
> - else
> - ecore_ipc_server_send(_e_fm_ipc_server, 6/*E_IPC_DOMAIN_FM*/,
> E_FM_OP_MOUNT_ERROR,
> - 0, 0, 0, buf, size);
> - dbus_error_free(error);
> - free(buf);
> - return;
> - }
> -
> - v->mounted = e_hal_property_bool_get(ret, "volume.is_mounted", &err);
> - if (err) printf("HAL Error : can't get volume.is_mounted property");
> -
> - if (v->mount_point) eina_stringshare_del(v->mount_point);
> - v->mount_point = e_hal_property_string_get(ret, "volume.mount_point",
> &err);
> - if (err) printf("HAL Error : can't get volume.is_mount_point property");
> - v->mount_point = eina_stringshare_add(v->mount_point);
> -
> -// printf("**VOL udi: %s mount_point: %s mounted: %d\n", v->udi,
> v->mount_point, v->mounted);
> - {
> - char *buf;
> - int size;
> -
> - size = strlen(v->udi) + 1 + strlen(v->mount_point) + 1;
> - buf = alloca(size);
> - strcpy(buf, v->udi);
> - strcpy(buf + strlen(buf) + 1, v->mount_point);
> - if (v->mounted)
> - ecore_ipc_server_send(_e_fm_ipc_server,
> - 6/*E_IPC_DOMAIN_FM*/,
> - E_FM_OP_MOUNT_DONE,
> - 0, 0, 0, buf, size);
> - else
> - ecore_ipc_server_send(_e_fm_ipc_server,
> - 6/*E_IPC_DOMAIN_FM*/,
> - E_FM_OP_UNMOUNT_DONE,
> - 0, 0, 0, buf, size);
> - }
> - return;
> -}
> -
> -static Eina_List *_e_vols = NULL;
> -
> -EAPI E_Volume *
> -e_volume_add(const char *udi, char first_time)
> -{
> - E_Volume *v;
> -
> - if (!udi) return NULL;
> - if (e_volume_find(udi)) return NULL;
> - v = calloc(1, sizeof(E_Volume));
> - if (!v) return NULL;
> -// printf("VOL+ %s\n", udi);
> - v->udi = eina_stringshare_add(udi);
> - v->icon = NULL;
> - v->first_time = first_time;
> - _e_vols = eina_list_append(_e_vols, v);
> - e_hal_device_get_all_properties(_e_dbus_conn, v->udi,
> - _e_dbus_cb_vol_prop, v);
> - v->prop_handler = e_dbus_signal_handler_add(_e_dbus_conn, E_HAL_SENDER,
> - udi,
> - E_HAL_DEVICE_INTERFACE,
> - "PropertyModified",
> _e_dbus_cb_prop_modified, v);
> - v->guard = NULL;
> -
> - return v;
> -}
> -
> EAPI void
> -e_volume_del(const char *udi)
> +e_volume_eject(E_Volume *v)
> {
> - E_Volume *v;
> -
> - v = e_volume_find(udi);
> - if (!v) return;
> - if (v->guard)
> - {
> - ecore_timer_del(v->guard);
> - v->guard = NULL;
> - }
> - if (v->prop_handler) e_dbus_signal_handler_del(_e_dbus_conn,
> v->prop_handler);
> - if (v->validated)
> - {
> -// printf("--VOL %s\n", v->udi);
> - /* FIXME: send event of storage volume (disk) removed */
> - ecore_ipc_server_send(_e_fm_ipc_server,
> - 6/*E_IPC_DOMAIN_FM*/,
> - E_FM_OP_VOLUME_DEL,
> - 0, 0, 0, v->udi, strlen(v->udi) + 1);
> - }
> - _e_vols = eina_list_remove(_e_vols, v);
> - _e_volume_free(v);
> + _E_FM(volume_eject)(v);
> }
>
> EAPI E_Volume *
> e_volume_find(const char *udi)
> {
> - Eina_List *l;
> - E_Volume *v;
> -
> - EINA_LIST_FOREACH(_e_vols, l, v)
> - {
> - if (!strcmp(udi, v->udi)) return v;
> - }
> - return NULL;
> + return _E_FM(volume_find)(udi);
> }
>
> -static Eina_Bool
> -_e_dbus_vol_mount_timeout(void *data)
> -{
> - E_Volume *v = data;
> - DBusError error;
> - char *buf;
> - int size;
> -
> - v->guard = NULL;
> - dbus_pending_call_cancel(v->op);
> - error.name = "org.enlightenment.fm2.MountTimeout";
> - error.message = "Unable to mount the volume with specified time-out.";
> - size = _e_dbus_format_error_msg(&buf, v, &error);
> - ecore_ipc_server_send(_e_fm_ipc_server, 6/*E_IPC_DOMAIN_FM*/,
> E_FM_OP_MOUNT_ERROR,
> - 0, 0, 0, buf, size);
> - free(buf);
> -
> - return ECORE_CALLBACK_CANCEL;
> -}
> -
> -static void
> -_e_dbus_cb_vol_mounted(void *user_data, void *method_return __UNUSED__,
> DBusError *error) -{
> - E_Volume *v = user_data;
> - char *buf;
> - int size;
> -
> - if (v->guard)
> - {
> - ecore_timer_del(v->guard);
> - v->guard = NULL;
> - }
> -
> - if (dbus_error_is_set(error))
> - {
> - size = _e_dbus_format_error_msg(&buf, v, error);
> - ecore_ipc_server_send(_e_fm_ipc_server, 6/*E_IPC_DOMAIN_FM*/,
> E_FM_OP_MOUNT_ERROR,
> - 0, 0, 0, buf, size);
> - dbus_error_free(error);
> - free(buf);
> - return;
> - }
> -
> -#if 0
> - v->mounted = EINA_TRUE;
> -// printf("MOUNT: %s from %s\n", v->udi, v->mount_point);
> - size = strlen(v->udi) + 1 + strlen(v->mount_point) + 1;
> - buf = alloca(size);
> - strcpy(buf, v->udi);
> - strcpy(buf + strlen(buf) + 1, v->mount_point);
> - ecore_ipc_server_send(_e_fm_ipc_server,
> - 6/*E_IPC_DOMAIN_FM*/,
> - E_FM_OP_MOUNT_DONE,
> - 0, 0, 0, buf, size);
> -#endif
> -}
> -
> EAPI void
> -e_volume_mount(E_Volume *v)
> +e_storage_del(const char *udi)
> {
> - char buf[256];
> - char buf2[256];
> - const char *mount_point;
> - Eina_List *opt = NULL;
> -
> - if (!v || v->guard || !v->mount_point || strncmp(v->mount_point,
> "/media/", 7))
> - return;
> -
> - mount_point = v->mount_point + 7;
> -// printf("mount %s %s [fs type = %s]\n", v->udi, v->mount_point,
> v->fstype); -
> - if ((!strcmp(v->fstype, "vfat")) ||
> - (!strcmp(v->fstype, "ntfs"))
> - )
> - {
> -#if !defined(__FreeBSD__)
> - snprintf(buf, sizeof(buf), "uid=%i", (int)getuid());
> - opt = eina_list_append(opt, buf);
> -#endif
> - }
> -
> - if ((!strcmp(v->fstype, "vfat")) ||
> - (!strcmp(v->fstype, "ntfs")) ||
> - (!strcmp(v->fstype, "iso9660"))
> - )
> - {
> - snprintf(buf2, sizeof(buf2), "utf8");
> - opt = eina_list_append(opt, buf2);
> - }
> - else if ((!strcmp(v->fstype, "fat")) ||
> - (!strcmp(v->fstype, "jfs"))
> -// (!strcmp(v->fstype, "udf"))
> - )
> - {
> - snprintf(buf2, sizeof(buf2), "iocharset=utf8");
> - opt = eina_list_append(opt, buf2);
> - }
> -
> - v->guard = ecore_timer_add(E_FM_MOUNT_TIMEOUT, _e_dbus_vol_mount_timeout,
> v);
> - v->op = e_hal_device_volume_mount(_e_dbus_conn, v->udi, mount_point,
> - v->fstype, opt, _e_dbus_cb_vol_mounted,
> v);
> - eina_list_free(opt);
> + _E_FM(storage_del)(udi);
> }
>
> -static Eina_Bool
> -_e_dbus_vol_unmount_timeout(void *data)
> +EAPI E_Storage *
> +e_storage_find(const char *udi)
> {
> - E_Volume *v = data;
> - DBusError error;
> - char *buf;
> - int size;
> -
> - v->guard = NULL;
> - dbus_pending_call_cancel(v->op);
> - error.name = "org.enlightenment.fm2.UnmountTimeout";
> - error.message = "Unable to unmount the volume with specified time-out.";
> - size = _e_dbus_format_error_msg(&buf, v, &error);
> - ecore_ipc_server_send(_e_fm_ipc_server, 6/*E_IPC_DOMAIN_FM*/,
> E_FM_OP_UNMOUNT_ERROR,
> - 0, 0, 0, buf, size);
> - free(buf);
> -
> - return ECORE_CALLBACK_CANCEL;
> + return _E_FM(storage_find)(udi);
> }
>
> -static void
> -_e_dbus_cb_vol_unmounted(void *user_data, void *method_return __UNUSED__,
> DBusError *error) +void
> +_e_storage_free(E_Storage *s)
> {
> - E_Volume *v = user_data;
> - char *buf;
> - int size;
> -
> - if (v->guard)
> - {
> - ecore_timer_del(v->guard);
> - v->guard = NULL;
> - }
> -
> - if (dbus_error_is_set(error))
> - {
> - size = _e_dbus_format_error_msg(&buf, v, error);
> - ecore_ipc_server_send(_e_fm_ipc_server, 6/*E_IPC_DOMAIN_FM*/,
> E_FM_OP_UNMOUNT_ERROR,
> - 0, 0, 0, buf, size);
> - dbus_error_free(error);
> - free(buf);
> - return;
> - }
> -
> -#if 0
> - v->mounted = EINA_FALSE;
> -// printf("UNMOUNT: %s from %s\n", v->udi, v->mount_point);
> - size = strlen(v->udi) + 1 + strlen(v->mount_point) + 1;
> - buf = alloca(size);
> - strcpy(buf, v->udi);
> - strcpy(buf + strlen(buf) + 1, v->mount_point);
> - ecore_ipc_server_send(_e_fm_ipc_server,
> - 6/*E_IPC_DOMAIN_FM*/,
> - E_FM_OP_UNMOUNT_DONE,
> - 0, 0, 0, buf, size);
> -#endif
> + _E_FM_SHARED(storage_free)(s);
> }
>
> -EAPI void
> -e_volume_unmount(E_Volume *v)
> +void
> +_e_volume_free(E_Volume *v)
> {
> -// printf("unmount %s %s\n", v->udi, v->mount_point);
> - if (!v || v->guard) return;
> -
> - v->guard = ecore_timer_add(E_FM_UNMOUNT_TIMEOUT,
> _e_dbus_vol_unmount_timeout, v);
> - v->op = e_hal_device_volume_unmount(_e_dbus_conn, v->udi, NULL,
> - _e_dbus_cb_vol_unmounted, v);
> + _E_FM_SHARED(volume_free)(v);
> }
> -
> -static Eina_Bool
> -_e_dbus_vol_eject_timeout(void *data)
> -{
> - E_Volume *v = data;
> - DBusError error;
> - char *buf;
> - int size;
> -
> - v->guard = NULL;
> - dbus_pending_call_cancel(v->op);
> - error.name = "org.enlightenment.fm2.EjectTimeout";
> - error.message = "Unable to eject the media with specified time-out.";
> - size = _e_dbus_format_error_msg(&buf, v, &error);
> - ecore_ipc_server_send(_e_fm_ipc_server, 6/*E_IPC_DOMAIN_FM*/,
> E_FM_OP_EJECT_ERROR,
> - 0, 0, 0, buf, size);
> - free(buf);
> -
> - return ECORE_CALLBACK_CANCEL;
> -}
> -
> -static Eina_Bool
> -_e_dbus_vb_vol_ejecting_after_unmount(void *data)
> -{
> - E_Volume *v = data;
> -
> - v->guard = ecore_timer_add(E_FM_EJECT_TIMEOUT, _e_dbus_vol_eject_timeout,
> v);
> - v->op = e_hal_device_volume_eject(_e_dbus_conn, v->udi, NULL,
> - _e_dbus_cb_vol_ejected, v);
> -
> - return ECORE_CALLBACK_CANCEL;
> -}
> -
> -static void
> -_e_dbus_cb_vol_unmounted_before_eject(void *user_data, void *method_return,
> DBusError *error) -{
> - E_Volume *v = user_data;
> - char err;
> -
> - err = dbus_error_is_set(error) ? 1 : 0;
> - _e_dbus_cb_vol_unmounted(user_data, method_return, error);
> -
> - // delay is required for all message handlers were executed after unmount
> - if (!err)
> - ecore_timer_add(1.0, _e_dbus_vb_vol_ejecting_after_unmount, v);
> -}
> -
> -static void
> -_e_dbus_cb_vol_ejected(void *user_data, void *method_return __UNUSED__,
> DBusError *error) -{
> - E_Volume *v = user_data;
> - char *buf;
> - int size;
> -
> - if (v->guard)
> - {
> - ecore_timer_del(v->guard);
> - v->guard = NULL;
> - }
> -
> - if (dbus_error_is_set(error))
> - {
> - size = _e_dbus_format_error_msg(&buf, v, error);
> - ecore_ipc_server_send(_e_fm_ipc_server, 6/*E_IPC_DOMAIN_FM*/,
> E_FM_OP_EJECT_ERROR,
> - 0, 0, 0, buf, size);
> - dbus_error_free(error);
> - free(buf);
> - return;
> - }
> -
> - size = strlen(v->udi) + 1;
> - buf = alloca(size);
> - strcpy(buf, v->udi);
> - ecore_ipc_server_send(_e_fm_ipc_server,
> - 6/*E_IPC_DOMAIN_FM*/,
> - E_FM_OP_EJECT_DONE,
> - 0, 0, 0, buf, size);
> -}
> -
> -EAPI void
> -e_volume_eject(E_Volume *v)
> -{
> - if (!v || v->guard) return;
> -
> - if (v->mounted)
> - {
> - v->guard = ecore_timer_add(E_FM_UNMOUNT_TIMEOUT,
> _e_dbus_vol_unmount_timeout, v);
> - v->op = e_hal_device_volume_unmount(_e_dbus_conn, v->udi, NULL,
> -
> _e_dbus_cb_vol_unmounted_before_eject, v);
> - }
> - else
> - {
> - v->guard = ecore_timer_add(E_FM_EJECT_TIMEOUT,
> _e_dbus_vol_eject_timeout, v);
> - v->op = e_hal_device_volume_eject(_e_dbus_conn, v->udi, NULL,
> - _e_dbus_cb_vol_ejected, v);
> - }
> -}
>
> Modified: trunk/e/src/bin/e_fm.c
> ===================================================================
> --- trunk/e/src/bin/e_fm.c 2010-10-05 06:33:19 UTC (rev 53050)
> +++ trunk/e/src/bin/e_fm.c 2010-10-05 06:33:23 UTC (rev 53051)
> @@ -449,10 +449,9 @@
> * _e_storage_volume_edd_init()
> * _e_storage_volume_edd_shutdown()
> */
> -#define E_FM_SHARED_CODEC
> -#include "e_fm_shared.h"
> -#undef E_FM_SHARED_CODEC
>
> +#include "e_fm_shared_codec.h"
> +
> static inline Eina_Bool
> _e_fm2_icon_realpath(const E_Fm2_Icon *ic, char *buf, int buflen)
> {
> @@ -2914,7 +2913,7 @@
> {
> E_Storage *s;
>
> - s = eet_data_descriptor_decode(_e_storage_edd, e->data,
> e->size);
> + s = _e_fm_shared_codec_storage_decode(e->data, e->size);
> if (s) e_fm2_dbus_storage_add(s);
> }
> break;
> @@ -2936,7 +2935,7 @@
> {
> E_Volume *v;
>
> - v = eet_data_descriptor_decode(_e_volume_edd, e->data, e->size);
> + v = _e_fm_shared_codec_volume_decode(e->data, e->size);
> if (v)
> {
> e_fm2_dbus_volume_add(v);
>
> Modified: trunk/e/src/bin/e_fm.h
> ===================================================================
> --- trunk/e/src/bin/e_fm.h 2010-10-05 06:33:19 UTC (rev 53050)
> +++ trunk/e/src/bin/e_fm.h 2010-10-05 06:33:23 UTC (rev 53051)
> @@ -47,9 +47,7 @@
> typedef struct _E_Fm2_Icon E_Fm2_Icon;
> typedef struct _E_Fm2_Icon_Info E_Fm2_Icon_Info;
>
> -#define E_FM_SHARED_DATATYPES
> -#include "e_fm_shared.h"
> -#undef E_FM_SHARED_DATATYPES
> +#include "e_fm_shared_types.h"
>
> #else
> #ifndef E_FM_H
>
> Modified: trunk/e/src/bin/e_fm_dbus.c
> ===================================================================
> --- trunk/e/src/bin/e_fm_dbus.c 2010-10-05 06:33:19 UTC (rev 53050)
> +++ trunk/e/src/bin/e_fm_dbus.c 2010-10-05 06:33:23 UTC (rev 53051)
> @@ -1,9 +1,7 @@
> #include "e_fm_dbus.h"
> +#include "e_fm_shared_codec.h"
> +#include "e_fm_shared_dbus.h"
>
> -#define E_FM_SHARED_CODEC
> -#include "e_fm_shared.h"
> -#undef E_FM_SHARED_CODEC
> -
> static void _e_fm2_volume_write(E_Volume *v) EINA_ARG_NONNULL(1);
> static void _e_fm2_volume_erase(E_Volume *v) EINA_ARG_NONNULL(1);
> static void _e_fm2_dbus_mount_free(E_Fm2_Mount *m); EINA_ARG_NONNULL(1);
> @@ -74,7 +72,7 @@
> {
> // printf("STO- %s\n", s->udi);
> _e_stores = eina_list_remove(_e_stores, s);
> - _e_storage_free(s);
> + _e_fm_shared_dbus_storage_free(s);
> }
>
> EAPI E_Storage *
> @@ -279,7 +277,7 @@
> _e_fm2_dbus_unmount_ok(m);
> _e_fm2_dbus_mount_free(m);
> }
> - _e_volume_free(v);
> + _e_fm_shared_dbus_volume_free(v);
> }
>
> static void
>
>
> ------------------------------------------------------------------------------
> Beautiful is writing same markup. Internet Explorer 9 supports
> standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3.
> Spend less time writing and rewriting code and more time creating great
> experiences on the web. Be a part of the beta today.
> http://p.sf.net/sfu/beautyoftheweb
> _______________________________________________
> enlightenment-svn mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/enlightenment-svn
>
--
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler) [email protected]
------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3.
Spend less time writing and rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel