summaryrefslogtreecommitdiff
path: root/src/bin/ethumb/ethumbd.c
diff options
context:
space:
mode:
authorGustavo Sverzut Barbieri <barbieri@gmail.com>2013-01-12 01:15:45 +0000
committerGustavo Sverzut Barbieri <barbieri@gmail.com>2013-01-12 01:15:45 +0000
commit34f53151414bcdf44ec81e582b007f74da595694 (patch)
tree863058f0d94e9d39998774a375aa6d242d8714a4 /src/bin/ethumb/ethumbd.c
parentae51833bac7ba5f72bd40a96beb13081c8d573f6 (diff)
merge ethumb.
This one was a painful bitch. The edbus2 port was quite broken, mainly leaking eina_stringshare and also not adding the '\0' to the strings that are represented as bytearray (paths cannot be utf8 to avoid translations). Emotion plugin was also quite bogus and the video thumbnail as edje (animated) is not working yet due bug in Edje_Edit api -- someone needs to investigate this, seems strange. Emotion plugin also had a bug that it was deleting the object from inside object callback. Now it seems to work. Please report if it does not. SVN revision: 82675
Diffstat (limited to '')
-rw-r--r--src/bin/ethumb/ethumbd.c (renamed from legacy/ethumb/src/bin/ethumbd.c)91
1 files changed, 57 insertions, 34 deletions
diff --git a/legacy/ethumb/src/bin/ethumbd.c b/src/bin/ethumb/ethumbd.c
index cebde0f4bb..f0f0d9b44a 100644
--- a/legacy/ethumb/src/bin/ethumbd.c
+++ b/src/bin/ethumb/ethumbd.c
@@ -57,6 +57,7 @@ static const char _ethumb_dbus_interface[] = "org.enlightenment.Ethumb";
57static const char _ethumb_dbus_objects_interface[] = "org.enlightenment.Ethumb.objects"; 57static const char _ethumb_dbus_objects_interface[] = "org.enlightenment.Ethumb.objects";
58static const char _ethumb_dbus_path[] = "/org/enlightenment/Ethumb"; 58static const char _ethumb_dbus_path[] = "/org/enlightenment/Ethumb";
59 59
60static Eina_Prefix *_pfx = NULL;
60static int _log_domain = -1; 61static int _log_domain = -1;
61 62
62typedef struct _Ethumbd_Setup Ethumbd_Setup; 63typedef struct _Ethumbd_Setup Ethumbd_Setup;
@@ -453,7 +454,7 @@ _ethumbd_slave_alloc_cmd(Ethumbd *ed, int ssize, char *sdata)
453} 454}
454 455
455static Eina_Bool 456static Eina_Bool
456_ethumbd_slave_data_read_cb(void *data, int type __UNUSED__, void *event) 457_ethumbd_slave_data_read_cb(void *data, int type EINA_UNUSED, void *event)
457{ 458{
458 Ethumbd *ed = data; 459 Ethumbd *ed = data;
459 Ecore_Exe_Event_Data *ev = event; 460 Ecore_Exe_Event_Data *ev = event;
@@ -499,7 +500,7 @@ _ethumbd_slave_data_read_cb(void *data, int type __UNUSED__, void *event)
499} 500}
500 501
501static Eina_Bool 502static Eina_Bool
502_ethumbd_slave_del_cb(void *data, int type __UNUSED__, void *event) 503_ethumbd_slave_del_cb(void *data, int type EINA_UNUSED, void *event)
503{ 504{
504 Ethumbd *ed = data; 505 Ethumbd *ed = data;
505 Ecore_Exe_Event_Del *ev = event; 506 Ecore_Exe_Event_Del *ev = event;
@@ -885,7 +886,6 @@ _name_owner_changed_cb(void *context, const char *bus, const char *old_id, const
885{ 886{
886 Ethumbd_Object_Data *odata = context; 887 Ethumbd_Object_Data *odata = context;
887 Ethumbd *ed = odata->ed; 888 Ethumbd *ed = odata->ed;
888 Ethumbd_Queue *q = &ed->queue;
889 889
890 DBG("NameOwnerChanged: name = %s, from = %s, to = %s", bus, old_id, new_id); 890 DBG("NameOwnerChanged: name = %s, from = %s, to = %s", bus, old_id, new_id);
891 if (new_id[0]) 891 if (new_id[0])
@@ -963,7 +963,8 @@ _ethumb_dbus_get_bytearray(EDBus_Message_Iter *iter)
963 if (!edbus_message_iter_fixed_array_get(iter, 'y', &result, 963 if (!edbus_message_iter_fixed_array_get(iter, 'y', &result,
964 &length)) 964 &length))
965 { 965 {
966 ERR("not an byte array element."); 966 ERR("not byte array element. Signature: %s",
967 edbus_message_iter_signature_get(iter));
967 return NULL; 968 return NULL;
968 } 969 }
969 970
@@ -981,7 +982,7 @@ _ethumb_dbus_append_bytearray(EDBus_Message_Iter *parent, EDBus_Message_Iter *ar
981 if (!string) 982 if (!string)
982 string = ""; 983 string = "";
983 984
984 size = strlen(string); 985 size = strlen(string) + 1;
985 for (i = 0; i < size; i++) 986 for (i = 0; i < size; i++)
986 edbus_message_iter_basic_append(array, 'y', string[i]); 987 edbus_message_iter_basic_append(array, 'y', string[i]);
987 edbus_message_iter_container_close(parent, array); 988 edbus_message_iter_container_close(parent, array);
@@ -1012,6 +1013,9 @@ _ethumb_dbus_queue_add_cb(const EDBus_Service_Interface *iface, const EDBus_Mess
1012 1013
1013 if (!file) 1014 if (!file)
1014 { 1015 {
1016 eina_stringshare_del(key);
1017 eina_stringshare_del(thumb);
1018 eina_stringshare_del(thumb_key);
1015 ERR("no filename given."); 1019 ERR("no filename given.");
1016 goto end; 1020 goto end;
1017 } 1021 }
@@ -1019,6 +1023,10 @@ _ethumb_dbus_queue_add_cb(const EDBus_Service_Interface *iface, const EDBus_Mess
1019 odata = edbus_service_object_data_get(iface, ODATA); 1023 odata = edbus_service_object_data_get(iface, ODATA);
1020 if (!odata) 1024 if (!odata)
1021 { 1025 {
1026 eina_stringshare_del(file);
1027 eina_stringshare_del(key);
1028 eina_stringshare_del(thumb);
1029 eina_stringshare_del(thumb_key);
1022 ERR("could not get dbus_object data."); 1030 ERR("could not get dbus_object data.");
1023 goto end; 1031 goto end;
1024 } 1032 }
@@ -1159,7 +1167,7 @@ _ethumb_dbus_delete_cb(const EDBus_Service_Interface *iface, const EDBus_Message
1159} 1167}
1160 1168
1161static int 1169static int
1162_ethumb_dbus_fdo_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1170_ethumb_dbus_fdo_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1163{ 1171{
1164 int fdo; 1172 int fdo;
1165 1173
@@ -1177,7 +1185,7 @@ _ethumb_dbus_fdo_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *var
1177} 1185}
1178 1186
1179static int 1187static int
1180_ethumb_dbus_size_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1188_ethumb_dbus_size_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1181{ 1189{
1182 EDBus_Message_Iter *st; 1190 EDBus_Message_Iter *st;
1183 int w, h; 1191 int w, h;
@@ -1198,7 +1206,7 @@ _ethumb_dbus_size_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *va
1198} 1206}
1199 1207
1200static int 1208static int
1201_ethumb_dbus_format_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1209_ethumb_dbus_format_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1202{ 1210{
1203 int format; 1211 int format;
1204 1212
@@ -1216,7 +1224,7 @@ _ethumb_dbus_format_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *
1216} 1224}
1217 1225
1218static int 1226static int
1219_ethumb_dbus_aspect_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1227_ethumb_dbus_aspect_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1220{ 1228{
1221 int aspect; 1229 int aspect;
1222 1230
@@ -1234,7 +1242,7 @@ _ethumb_dbus_aspect_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *
1234} 1242}
1235 1243
1236static int 1244static int
1237_ethumb_dbus_orientation_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1245_ethumb_dbus_orientation_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1238{ 1246{
1239 int orientation; 1247 int orientation;
1240 1248
@@ -1252,7 +1260,7 @@ _ethumb_dbus_orientation_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_I
1252} 1260}
1253 1261
1254static int 1262static int
1255_ethumb_dbus_crop_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1263_ethumb_dbus_crop_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1256{ 1264{
1257 EDBus_Message_Iter *st; 1265 EDBus_Message_Iter *st;
1258 double x, y; 1266 double x, y;
@@ -1273,7 +1281,7 @@ _ethumb_dbus_crop_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *va
1273} 1281}
1274 1282
1275static int 1283static int
1276_ethumb_dbus_quality_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1284_ethumb_dbus_quality_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1277{ 1285{
1278 int quality; 1286 int quality;
1279 1287
@@ -1292,7 +1300,7 @@ _ethumb_dbus_quality_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter
1292 1300
1293 1301
1294static int 1302static int
1295_ethumb_dbus_compress_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1303_ethumb_dbus_compress_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1296{ 1304{
1297 int compress; 1305 int compress;
1298 1306
@@ -1310,7 +1318,7 @@ _ethumb_dbus_compress_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter
1310} 1318}
1311 1319
1312static int 1320static int
1313_ethumb_dbus_frame_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1321_ethumb_dbus_frame_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1314{ 1322{
1315 EDBus_Message_Iter *_struct, *file_iter, *group_iter, *swallow_iter; 1323 EDBus_Message_Iter *_struct, *file_iter, *group_iter, *swallow_iter;
1316 const char *file, *group, *swallow; 1324 const char *file, *group, *swallow;
@@ -1328,15 +1336,15 @@ _ethumb_dbus_frame_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *v
1328 swallow = _ethumb_dbus_get_bytearray(swallow_iter); 1336 swallow = _ethumb_dbus_get_bytearray(swallow_iter);
1329 DBG("setting frame to \"%s:%s:%s\"", file, group, swallow); 1337 DBG("setting frame to \"%s:%s:%s\"", file, group, swallow);
1330 request->setup.flags.frame = 1; 1338 request->setup.flags.frame = 1;
1331 request->setup.theme_file = eina_stringshare_add(file); 1339 request->setup.theme_file = file;
1332 request->setup.group = eina_stringshare_add(group); 1340 request->setup.group = group;
1333 request->setup.swallow = eina_stringshare_add(swallow); 1341 request->setup.swallow = swallow;
1334 1342
1335 return 1; 1343 return 1;
1336} 1344}
1337 1345
1338static int 1346static int
1339_ethumb_dbus_directory_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1347_ethumb_dbus_directory_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1340{ 1348{
1341 const char *directory; 1349 const char *directory;
1342 EDBus_Message_Iter *array; 1350 EDBus_Message_Iter *array;
@@ -1350,13 +1358,13 @@ _ethumb_dbus_directory_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Ite
1350 directory = _ethumb_dbus_get_bytearray(array); 1358 directory = _ethumb_dbus_get_bytearray(array);
1351 DBG("setting directory to: %s", directory); 1359 DBG("setting directory to: %s", directory);
1352 request->setup.flags.directory = 1; 1360 request->setup.flags.directory = 1;
1353 request->setup.directory = eina_stringshare_add(directory); 1361 request->setup.directory = directory;
1354 1362
1355 return 1; 1363 return 1;
1356} 1364}
1357 1365
1358static int 1366static int
1359_ethumb_dbus_category_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1367_ethumb_dbus_category_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1360{ 1368{
1361 const char *category; 1369 const char *category;
1362 EDBus_Message_Iter *array; 1370 EDBus_Message_Iter *array;
@@ -1370,13 +1378,13 @@ _ethumb_dbus_category_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter
1370 category = _ethumb_dbus_get_bytearray(array); 1378 category = _ethumb_dbus_get_bytearray(array);
1371 DBG("setting category to: %s", category); 1379 DBG("setting category to: %s", category);
1372 request->setup.flags.category = 1; 1380 request->setup.flags.category = 1;
1373 request->setup.category = eina_stringshare_add(category); 1381 request->setup.category = category;
1374 1382
1375 return 1; 1383 return 1;
1376} 1384}
1377 1385
1378static int 1386static int
1379_ethumb_dbus_video_time_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1387_ethumb_dbus_video_time_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1380{ 1388{
1381 double video_time; 1389 double video_time;
1382 1390
@@ -1394,7 +1402,7 @@ _ethumb_dbus_video_time_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_It
1394} 1402}
1395 1403
1396static int 1404static int
1397_ethumb_dbus_video_start_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1405_ethumb_dbus_video_start_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1398{ 1406{
1399 double video_start; 1407 double video_start;
1400 1408
@@ -1412,7 +1420,7 @@ _ethumb_dbus_video_start_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_I
1412} 1420}
1413 1421
1414static int 1422static int
1415_ethumb_dbus_video_interval_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1423_ethumb_dbus_video_interval_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1416{ 1424{
1417 double video_interval; 1425 double video_interval;
1418 1426
@@ -1429,7 +1437,7 @@ _ethumb_dbus_video_interval_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Messag
1429} 1437}
1430 1438
1431static int 1439static int
1432_ethumb_dbus_video_ntimes_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1440_ethumb_dbus_video_ntimes_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1433{ 1441{
1434 unsigned int video_ntimes; 1442 unsigned int video_ntimes;
1435 1443
@@ -1447,7 +1455,7 @@ _ethumb_dbus_video_ntimes_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_
1447} 1455}
1448 1456
1449static int 1457static int
1450_ethumb_dbus_video_fps_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1458_ethumb_dbus_video_fps_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1451{ 1459{
1452 unsigned int video_fps; 1460 unsigned int video_fps;
1453 1461
@@ -1465,7 +1473,7 @@ _ethumb_dbus_video_fps_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Ite
1465} 1473}
1466 1474
1467static int 1475static int
1468_ethumb_dbus_document_page_set(Ethumbd_Object *eobject __UNUSED__, EDBus_Message_Iter *variant, Ethumbd_Request *request) 1476_ethumb_dbus_document_page_set(Ethumbd_Object *eobject EINA_UNUSED, EDBus_Message_Iter *variant, Ethumbd_Request *request)
1469{ 1477{
1470 unsigned int document_page; 1478 unsigned int document_page;
1471 1479
@@ -1542,7 +1550,6 @@ _ethumb_dbus_ethumb_setup_cb(const EDBus_Service_Interface *iface, const EDBus_M
1542 Ethumbd_Object *eobject; 1550 Ethumbd_Object *eobject;
1543 Ethumbd_Request *request; 1551 Ethumbd_Request *request;
1544 Eina_Bool r = EINA_FALSE; 1552 Eina_Bool r = EINA_FALSE;
1545 int atype;
1546 EDBus_Message_Iter *array; 1553 EDBus_Message_Iter *array;
1547 EDBus_Message_Iter *data; 1554 EDBus_Message_Iter *data;
1548 1555
@@ -1568,7 +1575,7 @@ _ethumb_dbus_ethumb_setup_cb(const EDBus_Service_Interface *iface, const EDBus_M
1568 r = EINA_TRUE; 1575 r = EINA_TRUE;
1569 while (edbus_message_iter_get_and_next(array, 'r', &data) && r) 1576 while (edbus_message_iter_get_and_next(array, 'r', &data) && r)
1570 { 1577 {
1571 if (!_ethumb_dbus_ethumb_setup_parse_element(eobject, data, request)); 1578 if (!_ethumb_dbus_ethumb_setup_parse_element(eobject, data, request))
1572 r = EINA_FALSE; 1579 r = EINA_FALSE;
1573 } 1580 }
1574 1581
@@ -1610,12 +1617,11 @@ static const EDBus_Service_Interface_Desc server_desc = {
1610}; 1617};
1611 1618
1612static void 1619static void
1613_ethumb_dbus_request_name_cb(void *data, const EDBus_Message *msg, EDBus_Pending *pending) 1620_ethumb_dbus_request_name_cb(void *data, const EDBus_Message *msg, EDBus_Pending *pending EINA_UNUSED)
1614{ 1621{
1615 EDBus_Service_Interface *iface; 1622 EDBus_Service_Interface *iface;
1616 const char *errname, *errmsg; 1623 const char *errname, *errmsg;
1617 Ethumbd *ed = data; 1624 Ethumbd *ed = data;
1618 int r;
1619 1625
1620 if (edbus_message_error_get(msg, &errname, &errmsg)) 1626 if (edbus_message_error_get(msg, &errname, &errmsg))
1621 { 1627 {
@@ -1654,11 +1660,15 @@ _ethumb_dbus_finish(Ethumbd *ed)
1654static Eina_Bool 1660static Eina_Bool
1655_ethumbd_slave_spawn(Ethumbd_Slave *slave, Ethumbd *ed) 1661_ethumbd_slave_spawn(Ethumbd_Slave *slave, Ethumbd *ed)
1656{ 1662{
1663 char buf[PATH_MAX];
1664
1657 slave->bufcmd = NULL; 1665 slave->bufcmd = NULL;
1658 slave->scmd = 0; 1666 slave->scmd = 0;
1659 1667
1660 slave->exe = ecore_exe_pipe_run( 1668 snprintf(buf, sizeof(buf), "%s/ethumb/utils/"MODULE_ARCH"/ethumbd_slave",
1661 ETHUMB_LIBEXEC_DIR"/ethumbd_slave", 1669 eina_prefix_lib_get(_pfx));
1670
1671 slave->exe = ecore_exe_pipe_run(buf,
1662 ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_WRITE, ed); 1672 ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_WRITE, ed);
1663 if (!slave->exe) 1673 if (!slave->exe)
1664 { 1674 {
@@ -1691,11 +1701,22 @@ main(int argc, char *argv[])
1691 if (_log_domain < 0) 1701 if (_log_domain < 0)
1692 { 1702 {
1693 EINA_LOG_CRIT("could not register log domain 'ethumbd'"); 1703 EINA_LOG_CRIT("could not register log domain 'ethumbd'");
1694 exit_value = -7; 1704 exit_value = -8;
1695 goto finish; 1705 goto finish;
1696 } 1706 }
1697 } 1707 }
1698 1708
1709 _pfx = eina_prefix_new(argv[0], ethumb_init,
1710 "ETHUMB", "ethumb", "checkme",
1711 PACKAGE_BIN_DIR, PACKAGE_LIB_DIR,
1712 PACKAGE_DATA_DIR, PACKAGE_DATA_DIR);
1713 if (!_pfx)
1714 {
1715 ERR("Could not get ethumb installation prefix.");
1716 exit_value = -7;
1717 goto finish;
1718 }
1719
1699 ed.data_cb = ecore_event_handler_add(ECORE_EXE_EVENT_DATA, 1720 ed.data_cb = ecore_event_handler_add(ECORE_EXE_EVENT_DATA,
1700 _ethumbd_slave_data_read_cb, &ed); 1721 _ethumbd_slave_data_read_cb, &ed);
1701 ed.del_cb = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, 1722 ed.del_cb = ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
@@ -1773,6 +1794,8 @@ main(int argc, char *argv[])
1773 finish: 1794 finish:
1774 if (ed.slave.exe) 1795 if (ed.slave.exe)
1775 ecore_exe_quit(ed.slave.exe); 1796 ecore_exe_quit(ed.slave.exe);
1797
1798 if (_pfx) eina_prefix_free(_pfx);
1776 ethumb_shutdown(); 1799 ethumb_shutdown();
1777 eina_init(); 1800 eina_init();
1778 ecore_shutdown(); 1801 ecore_shutdown();