diff options
author | Carsten Haitzler <raster@rasterman.com> | 2004-11-26 12:20:38 +0000 |
---|---|---|
committer | Carsten Haitzler <raster@rasterman.com> | 2004-11-26 12:20:38 +0000 |
commit | e0cdc11f4896c667534c7efd132dabec6df4128f (patch) | |
tree | 1dac8eac3ad330cdd2843aeb73e241007f5461e5 | |
parent | 94c79d788a155362b9f6b2ee2486eafda09ff49e (diff) | |
download | enlightenment-e0cdc11f4896c667534c7efd132dabec6df4128f.tar.gz |
some ACTUAL ipc!!!! wow! you can load, unload, enable, disable and list
modules now via enlightenment_remote (or any app that speaks the protocol
over ipc - INCLUDING apps that want to go insert modules into e when ther
execute)
SVN revision: 12276
-rw-r--r-- | src/bin/e_ipc.c | 106 | ||||
-rw-r--r-- | src/bin/e_ipc.h | 22 | ||||
-rw-r--r-- | src/bin/e_remote_main.c | 185 |
3 files changed, 299 insertions, 14 deletions
diff --git a/src/bin/e_ipc.c b/src/bin/e_ipc.c index df1c3a28d0..e05e44de47 100644 --- a/src/bin/e_ipc.c +++ b/src/bin/e_ipc.c @@ -68,7 +68,111 @@ _e_ipc_cb_client_data(void *data, int type, void *event) e = event; if (ecore_ipc_client_server_get(e->client) != _e_ipc_server) return 1; - printf("E-IPC: client sent: [%i] [%i] (%i) \"%s\"\n", e->major, e->minor, e->size, e->data); + switch (e->minor) + { + case E_IPC_OP_MODULE_LOAD: + if (e->data) + { + char *name; + + name = malloc(e->size + 1); + name[e->size] = 0; + memcpy(name, e->data, e->size); + if (!e_module_find(name)) + { + e_module_new(name); + } + free(name); + } + break; + case E_IPC_OP_MODULE_UNLOAD: + if (e->data) + { + char *name; + E_Module *m; + + name = malloc(e->size + 1); + name[e->size] = 0; + memcpy(name, e->data, e->size); + if ((m = e_module_find(name))) + { + if (e_module_enabled_get(m)) + e_module_disable(m); + e_object_del(E_OBJECT(m)); + } + free(name); + } + break; + case E_IPC_OP_MODULE_ENABLE: + { + char *name; + E_Module *m; + + name = malloc(e->size + 1); + name[e->size] = 0; + memcpy(name, e->data, e->size); + if ((m = e_module_find(name))) + { + if (!e_module_enabled_get(m)) + e_module_enable(m); + } + free(name); + } + break; + case E_IPC_OP_MODULE_DISABLE: + { + char *name; + E_Module *m; + + name = malloc(e->size + 1); + name[e->size] = 0; + memcpy(name, e->data, e->size); + if ((m = e_module_find(name))) + { + if (e_module_enabled_get(m)) + e_module_disable(m); + } + free(name); + } + break; + case E_IPC_OP_MODULE_LIST: + { + Evas_List *modules, *l; + int bytes; + E_Module *m; + char *data, *p; + + bytes = 0; + modules = e_module_list(); + for (l = modules; l; l = l->next) + { + m = l->data; + bytes += strlen(m->name) + 1 + 1; + } + data = malloc(bytes); + p = data; + for (l = modules; l; l = l->next) + { + m = l->data; + strcpy(p, m->name); + p += strlen(m->name); + *p = 0; + p++; + *p = e_module_enabled_get(m); + p++; + } + ecore_ipc_client_send(e->client, + E_IPC_DOMAIN_REPLY, + E_IPC_OP_MODULE_LIST_REPLY, + 0/*ref*/, 0/*ref_to*/, 0/*response*/, + data, bytes); + free(data); + } + break; + default: + break; + } + printf("E-IPC: client sent: [%i] [%i] (%i) \"%p\"\n", e->major, e->minor, e->size, e->data); /* ecore_ipc_client_send(e->client, 1, 2, 7, 77, 0, "ABC", 4); */ /* we can disconnect a client like this: */ /* ecore_ipc_client_del(e->client); */ diff --git a/src/bin/e_ipc.h b/src/bin/e_ipc.h index cc87b1fcaa..17b1cc945b 100644 --- a/src/bin/e_ipc.h +++ b/src/bin/e_ipc.h @@ -1,7 +1,27 @@ #ifndef E_IPC_H #define E_IPC_H +typedef enum _E_Ipc_Domain { + E_IPC_DOMAIN_NONE, + E_IPC_DOMAIN_SETUP, + E_IPC_DOMAIN_REQUEST, + E_IPC_DOMAIN_REPLY, + E_IPC_DOMAIN_EVENT, + E_IPC_DOMAIN_LAST +} E_Ipc_Domain; + +typedef enum _E_Ipc_Op { + E_IPC_OP_NONE, + E_IPC_OP_MODULE_LOAD, + E_IPC_OP_MODULE_UNLOAD, + E_IPC_OP_MODULE_ENABLE, + E_IPC_OP_MODULE_DISABLE, + E_IPC_OP_MODULE_LIST, + E_IPC_OP_MODULE_LIST_REPLY, + E_IPC_OP_LAST +} E_Ipc_Op; + EAPI int e_ipc_init(void); EAPI void e_ipc_shutdown(void); - + #endif diff --git a/src/bin/e_remote_main.c b/src/bin/e_remote_main.c index d7438d4dac..240b314198 100644 --- a/src/bin/e_remote_main.c +++ b/src/bin/e_remote_main.c @@ -1,10 +1,19 @@ #include "e.h" /* local subsystem functions */ -static int _e_cb_signal_exit(void *data, int ev_type, void *ev); -static int _e_ipc_init(void); +static int _e_cb_signal_exit(void *data, int ev_type, void *ev); +static int _e_ipc_init(void); +static void _e_ipc_shutdown(void); + +static int _e_ipc_cb_server_add(void *data, int type, void *event); +static int _e_ipc_cb_server_del(void *data, int type, void *event); +static int _e_ipc_cb_server_data(void *data, int type, void *event); /* local subsystem globals */ +static Ecore_Ipc_Server *_e_ipc_server = NULL; +static const char *display_name = NULL; +static int reply_count = 0; +static int reply_expect = 0; /* externally accessible functions */ int @@ -13,18 +22,20 @@ main(int argc, char **argv) int i; /* handle some command-line parameters */ + display_name = (const char *)getenv("DISPLAY"); for (i = 1; i < argc; i++) { - if ((!strcmp(argv[i], "-instance")) && (i < (argc - 1))) + if ((!strcmp(argv[i], "-display")) && (i < (argc - 1))) { i++; + display_name = argv[i]; } } /* basic ecore init */ if (!ecore_init()) { - printf("Enlightenment cannot Initialize Ecore!\n" + printf("ERROR: Enlightenment_remote cannot Initialize Ecore!\n" "Perhaps you are out of memory?\n"); exit(-1); } @@ -32,14 +43,14 @@ main(int argc, char **argv) /* setup a handler for when e is asked to exit via a system signal */ if (!ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, _e_cb_signal_exit, NULL)) { - printf("Enlightenment cannot set up an exit signal handler.\n" + printf("ERROR: Enlightenment_remote cannot set up an exit signal handler.\n" "Perhaps you are out of memory?\n"); exit(-1); } /* init ipc */ if (!ecore_ipc_init()) { - printf("Enlightenment cannot initialize the ipc system.\n" + printf("ERROR: Enlightenment_remote cannot initialize the ipc system.\n" "Perhaps you are out of memory?\n"); exit(-1); } @@ -47,17 +58,18 @@ main(int argc, char **argv) /* setup e ipc service */ if (!_e_ipc_init()) { - printf("Enlightenment cannot set up the IPC socket.\n" - "It likely is already in use by an exisiting copy of Enlightenment.\n" - "Double check to see if Enlightenment is not already on this display,\n" - "but if that fails try deleting all files in ~/.ecore/enlightenment-*\n" - "and try running again.\n"); + printf("ERROR: Enlightenment_remote cannot set up the IPC socket.\n" + "Maybe try the '-display :0' option?\n"); exit(-1); } /* start our main loop */ ecore_main_loop_begin(); + _e_ipc_shutdown(); + ecore_ipc_shutdown(); + ecore_shutdown(); + /* just return 0 to keep the compiler quiet */ return 0; } @@ -74,5 +86,154 @@ _e_cb_signal_exit(void *data, int ev_type, void *ev) static int _e_ipc_init(void) { - return 0; + char buf[1024]; + char *disp; + + disp = (char *)display_name; + if (!disp) disp = ":0"; + snprintf(buf, sizeof(buf), "enlightenment-(%s)", disp); + _e_ipc_server = ecore_ipc_server_connect(ECORE_IPC_LOCAL_USER, buf, 0, NULL); + /* FIXME: we shoudl also try the generic ":0" if the display is ":0.0" */ + /* similar... */ + if (!_e_ipc_server) return 0; + + ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD, _e_ipc_cb_server_add, NULL); + ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL, _e_ipc_cb_server_del, NULL); + ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA, _e_ipc_cb_server_data, NULL); + + return 1; +} + +static void +_e_ipc_shutdown(void) +{ + if (_e_ipc_server) + { + ecore_ipc_server_del(_e_ipc_server); + _e_ipc_server = NULL; + } +} + +static int +_e_ipc_cb_server_add(void *data, int type, void *event) +{ + Ecore_Ipc_Event_Server_Add *e; + int argc; + char **argv; + int i; + + e = event; + ecore_app_args_get(&argc, &argv); + for (i = 1; i < argc; i++) + { + char *v; + + if ((!strcmp(argv[i], "-load-module")) && (i < (argc - 1))) + { + i++; + v = argv[i]; + ecore_ipc_server_send(_e_ipc_server, + E_IPC_DOMAIN_REQUEST, + E_IPC_OP_MODULE_LOAD, + 0/*ref*/, 0/*ref_to*/, 0/*response*/, + v, strlen(v)); + } + else if ((!strcmp(argv[i], "-unload-module")) && (i < (argc - 1))) + { + i++; + v = argv[i]; + ecore_ipc_server_send(_e_ipc_server, + E_IPC_DOMAIN_REQUEST, + E_IPC_OP_MODULE_UNLOAD, + 0/*ref*/, 0/*ref_to*/, 0/*response*/, + v, strlen(v)); + } + else if ((!strcmp(argv[i], "-enable-module")) && (i < (argc - 1))) + { + i++; + v = argv[i]; + ecore_ipc_server_send(_e_ipc_server, + E_IPC_DOMAIN_REQUEST, + E_IPC_OP_MODULE_ENABLE, + 0/*ref*/, 0/*ref_to*/, 0/*response*/, + v, strlen(v)); + } + else if ((!strcmp(argv[i], "-disable-module")) && (i < (argc - 1))) + { + i++; + v = argv[i]; + ecore_ipc_server_send(_e_ipc_server, + E_IPC_DOMAIN_REQUEST, + E_IPC_OP_MODULE_DISABLE, + 0/*ref*/, 0/*ref_to*/, 0/*response*/, + v, strlen(v)); + } + else if ((!strcmp(argv[i], "-list-modules"))) + { + reply_expect++; + ecore_ipc_server_send(_e_ipc_server, + E_IPC_DOMAIN_REQUEST, + E_IPC_OP_MODULE_LIST, + 0/*ref*/, 0/*ref_to*/, 0/*response*/, + NULL, 0); + } + } + if (reply_count >= reply_expect) ecore_main_loop_quit(); + return 1; +} + +static int +_e_ipc_cb_server_del(void *data, int type, void *event) +{ + Ecore_Ipc_Event_Server_Del *e; + + e = event; + return 1; +} + +static int +_e_ipc_cb_server_data(void *data, int type, void *event) +{ + Ecore_Ipc_Event_Server_Data *e; + + e = event; + printf("REPLY: BEGIN\n"); + switch (e->minor) + { + case E_IPC_OP_MODULE_LIST_REPLY: + if (e->data) + { + char *p; + + p = e->data; + while (p < (e->data + e->size)) + { + char *name; + char enabled; + + name = p; + p += strlen(name); + if (p < (e->data + e->size)) + { + p++; + if (p < (e->data + e->size)) + { + enabled = *p; + p++; + printf("REPLY: MODULE NAME=\"%s\" ENABLED=%i\n", + name, (int)enabled); + } + } + } + } + else + printf("REPLY: MODULE NONE\n"); + break; + default: + break; + } + printf("REPLY: END\n"); + reply_count++; + if (reply_count >= reply_expect) ecore_main_loop_quit(); + return 1; } |