gt: Add setting command parsing
authorPawel Szewczyk <p.szewczyk@samsung.com>
Wed, 20 Aug 2014 13:48:41 +0000 (15:48 +0200)
committerPawel Szewczyk <p.szewczyk@samsung.com>
Wed, 27 Aug 2014 10:39:04 +0000 (12:39 +0200)
Change-Id: Ib1e5a484934b0e08977305d7824aa46399d3da01
Signed-off-by: Pawel Szewczyk <p.szewczyk@samsung.com>
source/settings/src/settings.c

index 9f7d200..fffe4c6 100644 (file)
  */
 
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 
 #include "settings.h"
+#include "common.h"
+#include "parser.h"
+
+static int gt_check_settings_var(const char *name)
+{
+       static const char *vars[] = {
+               "default-udc",
+               "config-fs-path",
+               "lookup-path",
+               "default-template-path",
+               "default-gadget",
+               NULL
+       };
+       int i = 0;
+
+       for (i = 0; vars[i]; i++) {
+               if (strcmp(name, vars[i]) == 0)
+                       return 0;
+       }
+
+       return -1;
+}
 
 int gt_settings_help(void *data)
 {
@@ -24,14 +48,220 @@ int gt_settings_help(void *data)
        return -1;
 }
 
+static int gt_settings_get_func(void *data)
+{
+       const char **dt;
+
+       dt = (const char **)data;
+
+       printf("Settings get called successfully. Not implemented yet.\n");
+       while (*dt) {
+               printf("%s, ", *dt);
+               dt++;
+       }
+
+       putchar('\n');
+       return 0;
+}
+
+static int gt_settings_get_help(void *data)
+{
+       printf("Settings get help function\n");
+       return -1;
+}
+
+void gt_settings_parse_get(const Command *cmd, int argc, char **argv,
+               ExecutableCommand *exec, void *data)
+{
+       const char **dt = NULL;
+       int i;
+
+       dt = calloc(argc + 1, sizeof(*dt));
+       if (dt == NULL)
+               goto out;
+
+       for (i = 0; i < argc; i++){
+               if (gt_check_settings_var(argv[i]) < 0) {
+                       printf("Unrecognized variable name\n");
+                       goto out;
+               }
+               dt[i] = argv[i];
+       }
+
+       executable_command_set(exec, gt_settings_get_func, (void *)dt, free);
+       return;
+out:
+       free(dt);
+       executable_command_set(exec, cmd->printHelp, data, NULL);
+}
+
+static int gt_settings_set_func(void *data)
+{
+       struct gt_setting *ptr;
+
+       ptr = (struct gt_setting *)data;
+       printf("Settings set called successfully. Not implemented yet.\n");
+       while (ptr->variable) {
+               printf("%s = %s, ", ptr->variable, ptr->value);
+               ptr++;
+       }
+       putchar('\n');
+       return 0;
+}
+
+static int gt_settings_set_help(void *data)
+{
+       printf("Settings set help.\n");
+       return -1;
+}
+
+void gt_settings_parse_set(const Command *cmd, int argc, char **argv,
+               ExecutableCommand *exec, void *data)
+{
+       struct gt_setting *dt = NULL;
+       struct gt_setting *ptr = NULL;
+       int tmp;
+
+       if (argc == 0)
+               goto out;
+
+       tmp = gt_parse_setting_list(&dt, argc, argv);
+       if (tmp < 0)
+               goto out;
+
+       ptr = dt;
+       while (ptr->variable) {
+               if (gt_check_settings_var(ptr->variable) < 0) {
+                       printf("Unrecognized variable name: %s\n",
+                               ptr->variable);
+                       goto out;
+               }
+               ptr++;
+
+       executable_command_set(exec, gt_settings_set_func,
+                       (void *)dt, gt_setting_list_cleanup);
+       }
+       return;
+out:
+       gt_setting_list_cleanup((void *)dt);
+       executable_command_set(exec, cmd->printHelp, data, NULL);
+}
+
+static int gt_settings_append_func(void *data)
+{
+       struct gt_setting *dt;
+
+       dt = (struct gt_setting *)data;
+       printf("Settings append called successfully. Not implemented,\n");
+       printf("var = %s, val = %s\n", dt->variable, dt->value);
+       return 0;
+}
+
+static int gt_settings_append_help(void *data)
+{
+       printf("Settings append help.\n");
+       return -1;
+}
+
+void gt_settings_parse_append(const Command *cmd, int argc, char **argv,
+               ExecutableCommand *exec, void *data)
+{
+       struct gt_setting *dt;
+
+       dt = zalloc(sizeof(*dt));
+       if (dt == NULL)
+               goto out;
+
+       switch (argc) {
+       case 0:
+               goto out;
+       case 1:
+               printf("Expected value after '%s'\n", argv[0]);
+               goto out;
+       case 2:
+               dt->variable = argv[0];
+               if (gt_check_settings_var(dt->variable) < 0) {
+                       printf("Unrecognized variable name\n");
+                       goto out;
+               }
+               dt->value = argv[1];
+               executable_command_set(exec, gt_settings_append_func,
+                       (void *)dt, free);
+               break;
+       default:
+               printf("Too many arguments\n");
+               goto out;
+       }
+       return;
+out:
+       free(dt);
+       executable_command_set(exec, cmd->printHelp, data, NULL);
+}
+
+static int gt_settings_detach_func(void *data)
+{
+       struct gt_setting *dt;
+
+       dt = (struct gt_setting *)data;
+       printf("Settings detach called successfully. Not implemented.\n");
+       printf("var = %s, val = %s\n", dt->variable, dt->value);
+       return 0;
+}
+
+static int gt_settings_detach_help(void *data)
+{
+       printf("Settings detach help.\n");
+       return -1;
+}
+
+void gt_settings_parse_detach(const Command *cmd, int argc, char **argv,
+               ExecutableCommand *exec, void *data)
+{
+       struct gt_setting *dt;
+
+       dt = zalloc(sizeof(*dt));
+       if (dt == NULL)
+               goto out;
+
+       switch (argc) {
+       case 0:
+               goto out;
+       case 1:
+               printf("Expected value after '%s'\n", argv[0]);
+               goto out;
+       case 2:
+               dt->variable = argv[0];
+               if (gt_check_settings_var(dt->variable) < 0) {
+                       printf("Unrecognized variable name\n");
+                       goto out;
+               }
+               dt->value = argv[1];
+               executable_command_set(exec, gt_settings_detach_func,
+                       (void *)dt, free);
+               break;
+       default:
+               printf("Too many arguments\n");
+               goto out;
+       }
+       return;
+out:
+       free(dt);
+       executable_command_set(exec, cmd->printHelp, data, NULL);
+}
+
 const Command *gt_settings_get_children(const Command *cmd)
 {
        static Command commands[] = {
-               //      {"get", NEXT, settings_parse_get, get_gt_root_children, global_help_func},
-               //      {"set", NEXT, settings_parse_set, get_gt_root_children, global_help_func},
-               //      {"append", NEXT, settings_parse_append, get_gt_root_children, global_help_func},
-               //      {"detach", NEXT, settings_parse_detach, get_gt_root_children, global_help_func},
-                       {NULL, AGAIN, NULL, NULL, NULL}
+               {"get", NEXT, gt_settings_parse_get, NULL,
+                       gt_settings_get_help},
+               {"set", NEXT, gt_settings_parse_set, NULL,
+                       gt_settings_set_help},
+               {"append", NEXT, gt_settings_parse_append, NULL,
+                       gt_settings_append_help},
+               {"detach", NEXT, gt_settings_parse_detach, NULL,
+                       gt_settings_detach_help},
+               CMD_LIST_END
        };
+
        return commands;
 }