Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto
Dir : e17/proto/etk_server/src/bin Modified Files: Makefile.am etk_server.c etk_server.h Removed Files: etk_server_valid_funcs.c etk_server_valid_signals.c Log Message: - remove fifo model, now we use ecore_con - add async communication mode, this requires a bit more work on the client side but it sure beats the hell out of having sync communication all over - add perl code that parses etk's header files and source so it can gather information about types, protypes, signals, callbacks, and (soon) structs. parsed code is placed in .c files and compiled with etk_server - deprecate examples for now except for etk.php =================================================================== RCS file: /cvs/e/e17/proto/etk_server/src/bin/Makefile.am,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- Makefile.am 28 Mar 2006 07:40:53 -0000 1.2 +++ Makefile.am 31 Mar 2006 10:34:16 -0000 1.3 @@ -1,5 +1,8 @@ ## Process this file with automake to produce Makefile.in +MAINTAINERCLEANFILES = Makefile.in etk_server_valid_funcs.c \ + etk_server_valid_signals.c + INCLUDES = \ -Wall -export-dynamic \ -I/usr/local/include \ =================================================================== RCS file: /cvs/e/e17/proto/etk_server/src/bin/etk_server.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- etk_server.c 28 Mar 2006 07:40:53 -0000 1.5 +++ etk_server.c 31 Mar 2006 10:34:16 -0000 1.6 @@ -4,307 +4,349 @@ static void *etk_server_function_exists(char *func_name, char **args, int arg_num); static int _etk_server_signal_exit_cb(void *data, int type, void *event); static int is_number(char *buffer); +static char *etk_server_iterate(); + Evas_Hash *_etk_server_valid_funcs = NULL; Evas_Hash *_etk_server_valid_signals = NULL; static Evas_Hash *_etk_server_vars = NULL; static Ecore_Hash *_etk_server_rev_vars = NULL; static Evas_Hash *_etk_server_callbacks = NULL; -static int _etk_server_var_num = 0; -static int _etk_server_continue = 1; +static int _etk_server_continue = 0; static char *_etk_server_callback_id = NULL; static char *_etk_server_callback_data = NULL; static int _etk_server_main_loop = 1; -int main(int argc, char **argv) +#define DELIM_CHR '|' +#define BUF_SIZE 512 + +static Ecore_Con_Event_Client_Data *e; +static Ecore_Con_Server *server; +char buf[BUF_SIZE]; +int pos = 0; +char *args[64]; + +int +e_client_add(void *data, int type, void *ev) { - char *fifo_path = NULL; - int i, pid = 0; - - if(argc <= 1) - { - printf(_("etk_server error: no fifo file provided\n")); - return -1; - } + Ecore_Con_Event_Client_Add *e; + Ecore_Con_Server *server; - for(i = 1; i < argc; i++) - { - if(!strcmp(argv[i], "-d")) - pid = 1; - else fifo_path = argv[i]; - } + e = ev; + server = data; - if(pid == 1) - { - pid = fork(); - if(pid) - exit(EXIT_SUCCESS); - } - - if(fifo_path == NULL) - { - printf(_("etk_server error: no fifo file provided\n")); - return -1; - } - - if(ecore_file_exists(fifo_path)) - if(!ecore_file_unlink(fifo_path)) - { - fprintf(stderr, "etk_server error: cant remove old fifo %s! (error %d)", fifo_path, errno); - return 1; - } + printf("new client added!\n"); - if(mkfifo(fifo_path, 0644)) - { - fprintf(stderr, "etk_server error: cant create fifo %s! (error %d)", fifo_path, errno); - return 1; - } + return 1; +} + +int +e_client_del(void *data, int type, void *ev) +{ + Ecore_Con_Event_Client_Del *e; + Ecore_Con_Server *server; - ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, _etk_server_signal_exit_cb, NULL); + e = ev; + server = data; + + printf("client deleted!\n"); + + return 1; +} - _etk_server_valid_funcs_populate(); - _etk_server_valid_signals_populate(); - _etk_server_rev_vars = ecore_hash_new(ecore_direct_hash, ecore_direct_compare); - while(_etk_server_main_loop) +void process_cmd(char *cmd); + +void etk_server_job_cb2(void *data) +{ + process_cmd((char*)data); + free(data); +} + +int etk_server_timer_cb(void *data) +{ + ecore_job_add(etk_server_job_cb2, data); + return 0; +} + +int +e_client_data(void *data, int type, void *ev) +{ + Ecore_Con_Server *server; + int i; + char *d; + char *last_d; + + e = ev; + server = data; + d = e->data; + + last_d = d; + + if(_etk_server_continue == 1) + return 1; + + for(i = 0; i < e->size; i++) { - FILE *fifo; - int len; - char input[256]; + if(d[i] == '\0') + { + char cmd[1024]; + + memset(cmd, '\0', 1024); + memcpy(cmd, buf, pos); + process_cmd(cmd); + pos = 0; + memset(buf, '\0', BUF_SIZE); + } + else + buf[pos++] = d[i]; + } + + return 1; +} + +void etk_server_object_destroyed_cb(Etk_Object *object, void *data) +{ + //char *varname = NULL; + + //varname = etk_object_data_get(object, "varname"); + //if(!varname) + // return; + + //_etk_server_vars = evas_hash_del(_etk_server_vars, varname, object); + ecore_hash_remove(_etk_server_rev_vars, object); +} - if((fifo = fopen(fifo_path, "r")) == NULL) +void process_cmd(char *cmd) +{ + int len; + char input[256]; + int i; + + len = 256; + snprintf(input, sizeof(input), "%s", cmd); + if(len > 0) + { + int cur; + int spaces = 0; + int laststate; + int state; + char *start; + char *end; + void *(*func)(void *, ...); + + for(i = 0; input[i] != '\0'; i++) { - fprintf(stderr, "etk_server error: cant open fifo %s! (error %d)\n", fifo_path, errno); - return 1; + if(input[i] == ' ') + ++spaces; + if(input[i] == '\n') + input[i] = '\0'; + if(input[i] == '\0' && i < len - 1) + input[i] = ' '; } - - if((len = fread(&input, sizeof(char), 255, fifo)) > 0) + + for(i = 0; i < sizeof(args) / sizeof(char*); i++) + args[i] = NULL; + +#define out 0 +#define in 1 + + cur = 0; + state = laststate = out; + start = end = &input[0]; + + for(i = 0; i <= len; i++) { - int cur; - int spaces = 0; - int laststate; - int state; - char *start; - char *end; - char *args[64]; - void *(*func)(void *, ...); - - //if(input[len - 1] == '\n') - // input[len - 1] = '\0'; - - for(i = 0; i < len; i++) - { - if(input[i] == ' ') - ++spaces; - if(input[i] == '\n') - input[i] = '\0'; - if(input[i] == '\0' && i < len - 1) - input[i] = ' '; + if(input[i] == '\0') + { + args[cur] = calloc(end - start + 1, sizeof(char)); + snprintf(args[cur], (end - start + 1) * sizeof(char), "%s", start); + ++cur; + break; } - if(spaces == 0) + if(input[i] != ' ' && input[i] != '"') { - if((func = etk_server_function_exists(input, NULL, 0)) != NULL) - { - void *ret = NULL; - char varname[32]; - - ret = func(NULL); - - if(ret != NULL && strncmp(input, "etk_server", 10)) - { - char *name = NULL; - - snprintf(varname, sizeof(varname), "var%d", _etk_server_var_num); - - if((name = ecore_hash_get(_etk_server_rev_vars, ret)) != NULL) - { - printf("DEBUG: variable already found: %s\n", name); - } - else - { - ecore_hash_set(_etk_server_rev_vars, ret, varname); - - printf("%p (%s)\n", ret, varname); - ++_etk_server_var_num; - _etk_server_vars = evas_hash_add(_etk_server_vars, varname, ret); - } - } - else if(ret != NULL) - { - snprintf(varname, sizeof(varname), "%s", (char*)ret); - } - - fclose(fifo); - - if((fifo = fopen(fifo_path, "w")) == NULL) - { - fprintf(stderr, "etk_server error: cant open fifo %s! (error %d)\n", fifo_path, errno); - return 1; - } - - if(ret != NULL) - fwrite(varname, sizeof(char), strlen(varname), fifo); - else - fwrite("\0", sizeof(char), strlen("\0"), fifo); - - fclose(fifo); - } - else - { - fprintf(stderr, "etk_server warning: can't find function %s\n", input); - fclose(fifo); - } + ++end; continue; } - - for(i = 0; i < sizeof(args) / sizeof(char*); i++) - args[i] = NULL; - -#define out 0 -#define in 1 - - cur = 0; - state = laststate = out; - start = end = &input[0]; - - for(i = 0; i <= len; i++) + + if(input[i] == ' ' && state == out) { - if(input[i] == '\0') - { - args[cur] = calloc(end - start + 1, sizeof(char)); - snprintf(args[cur], (end - start + 1) * sizeof(char), "%s", start); - ++cur; - break; - } - - if(input[i] != ' ' && input[i] != '"') + args[cur] = calloc(end - start + 1, sizeof(char)); + snprintf(args[cur], (end - start + 1) * sizeof(char), "%s", start); + ++cur; + if(i + 1 < strlen(input)) { - ++end; - continue; - } - - if(input[i] == ' ' && state == out) - { - args[cur] = calloc(end - start + 1, sizeof(char)); - snprintf(args[cur], (end - start + 1) * sizeof(char), "%s", start); - ++cur; - if(i + 1 < strlen(input)) - { - start = &input[i + 1]; - end = start; - } - else - break; - continue; - } - - if(input[i] == '"' && state == out) - { - if(i + 1 >= strlen(input)) - break; - start = &input[i + 1]; end = start; - laststate = out; - state = in; - continue; - } - - if(input[i] == ' ' && state == in) - { - ++end; - continue; } - - if(input[i] == '"' && state == in && input[i - 1] != '\\') - { + else + break; + continue; + } + + if(input[i] == '"' && state == out) + { + if(i + 1 >= strlen(input)) + break; + + start = &input[i + 1]; + end = start; + laststate = out; + state = in; + continue; + } + + if(input[i] == ' ' && state == in) + { + ++end; + continue; + } + + if(input[i] == '"' && state == in && input[i - 1] != '\\') + { args[cur] = calloc(end - start + 1, sizeof(char)); - snprintf(args[cur], (end - start + 1) * sizeof(char), "%s", start); - ++cur; - if(i + 2 < strlen(input)) - { - start = &input[i + 2]; - ++i; - laststate = in; - state = out; - end = start; - } - else - break; - continue; - } - - if(input[i] == '"' && state == in && input[i - 1] == '\\') - { - ++end; - continue; + snprintf(args[cur], (end - start + 1) * sizeof(char), "%s", start); + ++cur; + if(i + 2 < strlen(input)) + { + start = &input[i + 2]; + ++i; + laststate = in; + state = out; + end = start; } + else + break; + continue; + } + + if(input[i] == '"' && state == in && input[i - 1] == '\\') + { + ++end; + continue; } - + } + #undef out -#undef in - if((func = etk_server_function_exists(args[0], args + 1, cur - 1)) != NULL) +#undef in + + if((func = etk_server_function_exists(args[2], args + 3, cur - 3)) != NULL) + { + void *ret; + char varname[32]; + + /* special case where we dont want to convert args */ + if(!strcmp(args[2], "etk_server_var_get")) { - void *ret; - char varname[32]; - - /* special case where we dont want to convert args */ - if(!strcmp(args[0], "etk_server_var_get")) - { - ret = func(args[1]); - snprintf(varname, sizeof(varname), "%s", (char*)ret); - } + ret = func(args[3]); + snprintf(varname, sizeof(varname), "%s", (char*)ret); + } + else + { + if(args[3] != NULL) + ret = func(etk_server_arg_convert(args[3]),etk_server_arg_convert(args[4]),etk_server_arg_convert(args[5]),etk_server_arg_convert(args[6]),etk_server_arg_convert(args[7]),etk_server_arg_convert(args[8]),etk_server_arg_convert(args[9]),etk_server_arg_convert(args[10]),etk_server_arg_convert(args[11]),etk_server_arg_convert(args[12]),etk_server_arg_convert(args[13]),etk_server_arg_convert(args[14]),etk_server_arg_convert(args[15]),etk_server_arg_convert(args[16]),etk_server_arg_convert(args[17]),etk_server_arg_convert(args[18]),etk_server_arg_convert(args[19]),etk_server_arg_convert(args[20]),etk_server_arg_convert(args[21]),etk_server_arg_convert(args[22]),etk_server_arg_convert(args[23]),etk_server_arg_convert(args[24]),etk_server_arg_convert(args[25]),etk_server_arg_convert(args[26]),etk_server_arg_convert(args[27]),etk_server_arg_convert(args[28]),etk_server_arg_convert(args[29]),etk_server_arg_convert(args[30]),etk_server_arg_convert(args[31]),etk_server_arg_convert (args[32]),etk_server_arg_convert(args[33]),etk_server_arg_convert(args[34]),etk_server_arg_convert(args[35]),etk_server_arg_convert(args[36]),etk_server_arg_convert(args[37]),etk_server_arg_convert(args[38]),etk_server_arg_convert(args[39]),etk_server_arg_convert(args[40]),etk_server_arg_convert(args[41]),etk_server_arg_convert(args[42]),etk_server_arg_convert(args[43]),etk_server_arg_convert(args[44]),etk_server_arg_convert(args[45]),etk_server_arg_convert(args[46]),etk_server_arg_convert(args[47]),etk_server_arg_convert(args[48]),etk_server_arg_convert(args[49]),etk_server_arg_convert(args[50]),etk_server_arg_convert(args[51]),etk_server_arg_convert(args[52]),etk_server_arg_convert(args[53]),etk_server_arg_convert(args[54]),etk_server_arg_convert(args[55]),etk_server_arg_convert(args[56]),etk_server_arg_convert(args[57]),etk_server_arg_convert(args[58]),etk_server_arg_convert(args[59]),etk_server_arg_convert(args[60]),etk_server_arg_convert(args[61]),etk_server_arg_conver t(args[62]),etk_server_arg_convert(args[63])); else + ret = func(NULL); + + if(!strcmp(args[2], "etk_server_callback")) + return; + + /* todo: fixme, length of args[0] */ + if(ret != NULL && strncmp(args[2], "etk_server", 10)) { + char *name = NULL; - ret = func(etk_server_arg_convert(args[1]),etk_server_arg_convert(args[2]),etk_server_arg_convert(args[3]),etk_server_arg_convert(args[4]),etk_server_arg_convert(args[5]),etk_server_arg_convert(args[6]),etk_server_arg_convert(args[7]),etk_server_arg_convert(args[8]),etk_server_arg_convert(args[9]),etk_server_arg_convert(args[10]),etk_server_arg_convert(args[11]),etk_server_arg_convert(args[12]),etk_server_arg_convert(args[13]),etk_server_arg_convert(args[14]),etk_server_arg_convert(args[15]),etk_server_arg_convert(args[16]),etk_server_arg_convert(args[17]),etk_server_arg_convert(args[18]),etk_server_arg_convert(args[19]),etk_server_arg_convert(args[20]),etk_server_arg_convert(args[21]),etk_server_arg_convert(args[22]),etk_server_arg_convert(args[23]),etk_server_arg_convert(args[24]),etk_server_arg_convert(args[25]),etk_server_arg_convert(args[26]),etk_server_arg_convert(args[27]),etk_server_arg_convert(args[28]),etk_server_arg_convert(args[29]),etk_server_arg_conver t(args[30]),etk_server_arg_convert(args[31]),etk_server_arg_convert(args[32]),etk_server_arg_convert(args[33]),etk_server_arg_convert(args[34]),etk_server_arg_convert(args[35]),etk_server_arg_convert(args[36]),etk_server_arg_convert(args[37]),etk_server_arg_convert(args[38]),etk_server_arg_convert(args[39]),etk_server_arg_convert(args[40]),etk_server_arg_convert(args[41]),etk_server_arg_convert(args[42]),etk_server_arg_convert(args[43]),etk_server_arg_convert(args[44]),etk_server_arg_convert(args[45]),etk_server_arg_convert(args[46]),etk_server_arg_convert(args[47]),etk_server_arg_convert(args[48]),etk_server_arg_convert(args[49]),etk_server_arg_convert(args[50]),etk_server_arg_convert(args[51]),etk_server_arg_convert(args[52]),etk_server_arg_convert(args[53]),etk_server_arg_convert(args[54]),etk_server_arg_convert(args[55]),etk_server_arg_convert(args[56]),etk_server_arg_convert(args[57]),etk_server_arg_convert(args[58]),etk_server_arg_convert(args[59]),etk_server_arg_conve rt(args[60]),etk_server_arg_convert(args[61]),etk_server_arg_convert(args[62]),etk_server_arg_convert(args[63])); + snprintf(varname, sizeof(varname), "%s", args[1]); - /* todo: fixme, length of args[0] */ - if(ret != NULL && strncmp(args[0], "etk_server", 10)) + //if((name = ecore_hash_get(_etk_server_rev_vars, ret)) != NULL) + // { + // printf("DEBUG: variable already found: %s in (%s)\n", name, args[2]); + // } + //else { - char *name = NULL; - - snprintf(varname, sizeof(varname), "var%d", _etk_server_var_num); - - if((name = ecore_hash_get(_etk_server_rev_vars, ret)) != NULL) - { - printf("DEBUG: variable already found: %s\n", name); - } - else + if(!strncmp("etk_", args[2], 4) && strstr(args[2], "_new\0")) { - ecore_hash_set(_etk_server_rev_vars, ret, varname); - - printf("%p (%s)\n", ret, varname); - ++_etk_server_var_num; - _etk_server_vars = evas_hash_add(_etk_server_vars, varname, ret); + if(ETK_IS_OBJECT(ret)) + { + //etk_signal_connect("destroyed", ETK_OBJECT(ret), ETK_CALLBACK(etk_server_object_destroyed_cb), NULL); + //etk_object_data_set(ETK_OBJECT(ret), "varname", strdup(varname)); + } } + ecore_hash_set(_etk_server_rev_vars, ret, strdup(varname)); + _etk_server_vars = evas_hash_add(_etk_server_vars, varname, ret); } - else if(ret != NULL) - snprintf(varname, sizeof(varname), "%s", (char*)ret); } + else if(ret != NULL) + snprintf(varname, sizeof(varname), "%s", (char*)ret); + } + + if(ret != NULL && !strcmp(args[0], "s")) + { + /* attach app_id to client */ + if(!strcmp(args[2], "etk_server_init")) + ecore_con_client_data_set(e->client, strdup(varname)); - fclose(fifo); - - if((fifo = fopen(fifo_path, "w")) == NULL) - { - fprintf(stderr, "etk_server error: cant open fifo %s! (error %d)\n", fifo_path, errno); - return 1; - } - - if(ret != NULL) - fwrite(varname, sizeof(char), strlen(varname), fifo); - else - fwrite("\0", sizeof(char), strlen("\0"), fifo); - - fclose(fifo); + ecore_con_client_send(e->client, varname, strlen(varname)); } - else - fclose(fifo); } - else - fprintf(stderr, "etk_server error: cant read from fifo!\n"); } + else + { + fprintf(stderr, "etk_server error: cant read from fifo!\n"); + } +} + +int main(int argc, char **argv) +{ + char *fifo_path = NULL; + int i, pid = 0; + + ecore_init(); + ecore_con_init(); + evas_init(); + +// if(argc <= 1) +// { +// printf(_("etk_server error: no fifo file provided\n")); +// return -1; +// } + + for(i = 1; i < argc; i++) + { + if(!strcmp(argv[i], "-d")) + pid = 1; + else fifo_path = argv[i]; + } + + if(pid == 1) + { + pid = fork(); + if(pid) + exit(EXIT_SUCCESS); + } + + server = ecore_con_server_add(ECORE_CON_REMOTE_SYSTEM, + "webserver", 8080, NULL); + + ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD, + e_client_add, server); + ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL, + e_client_del, server); + ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA, + e_client_data, server); + + ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, _etk_server_signal_exit_cb, NULL); + _etk_server_valid_funcs_populate(); + _etk_server_valid_signals_populate(); + _etk_server_rev_vars = ecore_hash_new(ecore_direct_hash, ecore_direct_compare); + + etk_init(); + + ecore_main_loop_begin(); + ecore_con_shutdown(); + ecore_shutdown(); return 0; } @@ -441,11 +483,29 @@ return func; } +static void etk_server_server_foreach(void *value, void *user_data) +{ + Ecore_Con_Client *client; + char *app_id; + + client = value; + + app_id = ecore_con_client_data_get(client); + if(!strncmp(app_id, user_data, strlen(app_id))) + { + char *ret; + + ret = etk_server_iterate(); + ecore_con_client_send(client, ret, strlen(ret)); + } +} + static void _etk_server_internal_callback(Etk_Object *object, ...) { Etk_Type *type; Evas_List *sigs = NULL; char *sig = NULL; + char *app_id = NULL; va_list args; va_start(args, object); @@ -453,6 +513,7 @@ _etk_server_continue = 0; E_FREE(_etk_server_callback_data); sig = etk_object_data_get(object, "signal"); + app_id = etk_object_data_get(object, "app_id"); if(!sig) return; if((sigs = evas_hash_find(_etk_server_valid_signals, sig)) != NULL) @@ -489,14 +550,40 @@ } va_end(args); + + { +/* + Evas_List *l; + + for(l = _etk_server_clients; l; l = l->next); + { + Ecore_Con_Client *client; + char *c_app_id; + + client = _etk_server_clients->data; + c_app_id = ecore_con_client_data_get(client); + if(!strcmp(app_id, c_app_id)) + { + char *ret; + + ret = etk_server_iterate(); + ecore_con_client_send(client, ret, strlen(ret)); + } + return; + } +*/ + ecore_list_for_each(ecore_con_server_clients_get(server), etk_server_server_foreach, app_id); + + } + } static char *etk_server_iterate() { - while (_etk_server_continue) +// while (_etk_server_continue) { - ecore_main_loop_iterate(); - usleep(100); +// ecore_main_loop_iterate(); +// usleep(100); } if(_etk_server_callback_data) @@ -521,6 +608,11 @@ return 0; } +char *etk_server_init() +{ + return strdup("app1"); +} + void etk_server_shutdown() { _etk_server_main_loop = 0; @@ -547,8 +639,9 @@ if(!object) return; - etk_object_data_set(object, "callback", id); - etk_object_data_set(object, "signal", sig); + etk_object_data_set(object, "app_id", strdup(args[1])); + etk_object_data_set(object, "callback", strdup(id)); + etk_object_data_set(object, "signal", strdup(sig)); etk_signal_connect(sig, object, ETK_CALLBACK(_etk_server_internal_callback), NULL); if((sigs = evas_hash_find(_etk_server_valid_signals, sig)) != NULL) =================================================================== RCS file: /cvs/e/e17/proto/etk_server/src/bin/etk_server.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- etk_server.h 28 Mar 2006 07:40:53 -0000 1.2 +++ etk_server.h 31 Mar 2006 10:34:16 -0000 1.3 @@ -16,6 +16,8 @@ #include <Evas.h> #include <Ecore.h> #include <Ecore_File.h> +#include <Ecore_Con.h> +#include <Ecore_Job.h> #include <Ecore_Data.h> #define ETK_SERVER_LIBETK "libetk.so" ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs