From: Pawel Szewczyk Date: Wed, 6 Aug 2014 14:29:15 +0000 (+0200) Subject: gt: Add gadget load and save commands parsing X-Git-Tag: accepted/tizen/3.0/common/20161114.110810~100 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c42a2b3335b1f8b5258e6dd05bd3fd20320d53a2;p=platform%2Fupstream%2Fgt.git gt: Add gadget load and save commands parsing Change-Id: Iad7cbadb16830d417089656ddf3ee370d95ec7f3 Signed-off-by: Pawel Szewczyk --- diff --git a/source/gadget/src/gadget.c b/source/gadget/src/gadget.c index 6d6266e..2842120 100644 --- a/source/gadget/src/gadget.c +++ b/source/gadget/src/gadget.c @@ -475,6 +475,235 @@ out: executable_command_set(exec, cmd->printHelp, data, NULL); } +struct gt_gadget_load_data { + const char *name; + const char *gadget_name; + const char *file; + const char *path; + int opts; +}; + +static int gt_gadget_load_func(void *data) +{ + struct gt_gadget_load_data *dt; + + dt = (struct gt_gadget_load_data *)data; + printf("Gadget load called successfully. Not implemented.\n"); + if (dt->name) + printf("name = %s, ", dt->name); + if (dt->gadget_name) + printf("gadget = %s, ", dt->gadget_name); + if (dt->file) + printf("file %s, ", dt->file); + if (dt->path) + printf("path = %s, ", dt->path); + + printf("off = %d, stdin = %d\n", + !!(dt->opts & GT_OFF), !!(dt->opts & GT_STDIN)); + + return 0; +} + +static int gt_gadget_load_help(void *data) +{ + printf("Gadget load help\n"); + return -1; +} + +static void gt_parse_gadget_load(const Command *cmd, int argc, + char **argv, ExecutableCommand *exec, void * data) +{ + char c; + struct gt_gadget_load_data *dt; + struct option opts[] = { + {"off", no_argument, 0, 'o'}, + {"file", required_argument, 0, 1}, + {"stdin", no_argument, 0, 2}, + {"path", required_argument, 0, 3}, + {0, 0, 0, 0} + }; + + dt = zalloc(sizeof(*dt)); + if (dt == NULL) + goto out; + argv--; + argc++; + while (1) { + int opt_index = 0; + c = getopt_long(argc, argv, "o", opts, &opt_index); + if (c == -1) + break; + switch (c) { + case 'o': + dt->opts |= GT_OFF; + break; + case 1: + if (dt->path || dt->opts & GT_STDIN) + goto out; + dt->file = optarg; + break; + case 2: + if (dt->path || dt->file) + goto out; + dt->opts |= GT_STDIN; + break; + case 3: + if (dt->file || dt->opts & GT_STDIN) + goto out; + dt->path = optarg; + break; + default: + goto out; + } + } + + if (optind == argc || optind < argc - 2) + goto out; + + dt->name = argv[optind++]; + if (dt->opts & GT_STDIN || dt->file) { + dt->gadget_name = dt->name; + dt->name = NULL; + if (optind < argc) + goto out; + } + + if (optind < argc) + dt->gadget_name = argv[optind++]; + + executable_command_set(exec, gt_gadget_load_func, (void *)dt, free); + return; +out: + free(dt); + executable_command_set(exec, cmd->printHelp, data, NULL); +} + +struct gt_gadget_save_data { + const char *gadget; + const char *name; + const char *file; + const char *path; + struct gt_setting *attrs; + int opts; +}; + +static void gt_gadget_save_destructor(void *data) +{ + struct gt_gadget_save_data *dt; + + if (data == NULL) + return; + dt = (struct gt_gadget_save_data *)data; + gt_setting_list_cleanup(dt->attrs); + free(dt); +} + +static int gt_gadget_save_func(void *data) +{ + struct gt_gadget_save_data *dt; + struct gt_setting *ptr; + + dt = (struct gt_gadget_save_data *)data; + printf("Gadget save called successfully. Not implemented\n"); + if (dt->gadget) + printf("gadget = %s, ", dt->gadget); + if (dt->name) + printf("name = %s, ", dt->name); + if (dt->file) + printf("file = %s, ", dt->file); + if (dt->path) + printf("path = %s, ", dt->path); + printf("force = %d, stdout = %d", + !!(dt->opts & GT_FORCE), !!(dt->opts & GT_STDOUT)); + + ptr = dt->attrs; + while (ptr->variable) { + printf(", %s = %s", ptr->variable, ptr->value); + ptr++; + } + + putchar('\n'); + return 0; +} + +static int gt_gadget_save_help(void *data) +{ + printf("Gadget save help.\n"); + return -1; +} + +static void gt_parse_gadget_save(const Command *cmd, int argc, + char **argv, ExecutableCommand *exec, void * data) +{ + int c; + struct gt_gadget_save_data *dt; + struct option opts[] = { + {"force", no_argument, 0, 'f'}, + {"file", required_argument, 0, 1}, + {"stdout", no_argument, 0, 2}, + {"path", required_argument, 0, 3}, + {0, 0, 0, 0} + }; + + dt = zalloc(sizeof(*dt)); + if (dt == NULL) + goto out; + argv--; + argc++; + while (1) { + int opt_index = 0; + c = getopt_long(argc, argv, "f", opts, &opt_index); + if (c == -1) + break; + switch (c) { + case 'f': + dt->opts |= GT_FORCE; + break; + case 1: + if (dt->path || dt->opts & GT_STDOUT) + goto out; + dt->file = optarg; + break; + case 2: + if (dt->file || dt->path) + goto out; + dt->opts |= GT_STDOUT; + break; + case 3: + if (dt->file || dt->opts & GT_STDOUT) + goto out; + dt->path = optarg; + break; + default: + goto out; + } + } + + if (optind == argc) + goto out; + + dt->gadget = argv[optind++]; + + if(optind < argc + && !dt->file + && !(dt->opts & GT_STDOUT) + && strchr(argv[optind], '=') == NULL) + dt->name = argv[optind++]; + + c = gt_parse_setting_list(&dt->attrs, argc - optind, + argv + optind); + if (c < 0) + goto out; + + executable_command_set(exec, gt_gadget_save_func, (void *)dt, + gt_gadget_save_destructor); + + return; +out: + gt_gadget_save_destructor((void *)dt); + executable_command_set(exec, cmd->printHelp, data, NULL); +} + const Command *get_gadget_children(const Command *cmd) { static Command commands[] = { @@ -489,9 +718,12 @@ const Command *get_gadget_children(const Command *cmd) gt_gadget_disable_help}, {"gadget", NEXT, gt_parse_gadget_gadget, NULL, gt_gadget_gadget_help}, -// {"template", parse_gadget_template, NULL, gadget_template_help_func}, -// {"load", parse_gadget_load, NULL, gadget_load_help_func}, -// {"save", parse_gadget_save, NULL, gadget_load_help_func}, +// {"template", AGAIN, gt_parse_gadget_template, NULL, +// gt_gadget_template_help}, + {"load", NEXT, gt_parse_gadget_load, NULL, + gt_gadget_load_help}, + {"save", NEXT, gt_parse_gadget_save, NULL, + gt_gadget_save_help}, CMD_LIST_END };