[e_info] add the id suboption for the kill
authorKonstantin Drabeniuk <k.drabeniuk@samsung.com>
Wed, 26 Apr 2017 10:06:41 +0000 (13:06 +0300)
committerSooChan Lim <sc1.lim@samsung.com>
Thu, 25 May 2017 23:24:58 +0000 (08:24 +0900)
Change-Id: I62d6fff095e4a412a5d9e709692ef8be14c6a73d
Signed-off-by: Konstantin Drabeniuk <k.drabeniuk@samsung.com>
src/bin/e_info_client.c
src/bin/e_info_server.c

index 649daf7be5f5b5e04ff8589e4fecb2990aa894a0..1c593a630f8e44b4e912dde090cddfd63db9eb8d 100644 (file)
@@ -71,6 +71,8 @@ typedef struct _E_Pending_Commit_Info
 #define VALUE_TYPE_REPLY_RESLIST "ssi"
 #define VALUE_TYPE_FOR_INPUTDEV "ssi"
 #define VALUE_TYPE_FOR_PENDING_COMMIT "uiuu"
+#define VALUE_TYPE_REQUEST_FOR_KILL "t"
+#define VALUE_TYPE_REPLY_KILL "s"
 
 static E_Info_Client e_info_client;
 
@@ -150,6 +152,27 @@ _util_string_to_double(const char *str, double *num)
    return EINA_TRUE;
 }
 
+static Eina_Bool
+_util_string_to_ulong(const char *str, unsigned long *num, int base)
+{
+   char *end;
+   int errsv;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(str, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(num, EINA_FALSE);
+
+   const long sul = strtoul(str, &end, base);
+   errsv = errno;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((end == str), EINA_FALSE); /* given string is not a decimal number */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(('\0' != *end), EINA_FALSE); /* given string has extra characters */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(((ULONG_MAX == sul) && (ERANGE == errsv)), EINA_FALSE); /* out of range of type unsigned long */
+
+   *num = (int)sul;
+
+   return EINA_TRUE;
+}
+
 static void
 _e_signal_get_window_under_touch(void *data, const Eldbus_Message *msg)
 {
@@ -2605,6 +2628,14 @@ arg_err:
 
 }
 
+#define KILL_USAGE \
+  "[COMMAND] [ARG]...\n" \
+  "\t-id                  : the identifier for the resource whose creator is to be killed. (Usage: enlightenment_info -kill -id [id])\n" \
+  "\t-name(no implement)  : the name for the resource whose creator is to be killed. (Usage: enlightenment_info -kill -name [name])\n" \
+  "\t-pid(no implement)   : the pid for the resource whose creator is to be killed. (Usage: enlightenment_info -kill -pid [pid])\n" \
+  "\t-all(no implement)   : kill all clients with top level windows\n" \
+  "\t-help\n" \
+
 static void
 _e_info_client_proc_screen_rotation(int argc, char **argv)
 {
@@ -2637,7 +2668,7 @@ _e_info_client_cb_kill_client(const Eldbus_Message *msg)
    res = eldbus_message_error_get(msg, &name, &text);
    EINA_SAFETY_ON_TRUE_GOTO(res, finish);
 
-   res = eldbus_message_arguments_get(msg, "s", &result);
+   res = eldbus_message_arguments_get(msg, VALUE_TYPE_REPLY_KILL, &result);
    EINA_SAFETY_ON_FALSE_GOTO(res, finish);
 
    printf("%s\n", result);
@@ -2654,21 +2685,43 @@ static void
 _e_info_client_proc_kill_client(int argc, char **argv)
 {
    Eina_Bool res;
-   Ecore_Window win;
+   uint64_t win;
 
-   printf("Select the window whose client you wish to kill\n");
-   if (_e_get_window_under_touch(&win))
+   if (argc == 2)
      {
-        printf("Error: cannot get window under touch\n");
-        return;
+        printf("Select the window whose client you wish to kill\n");
+        if (_e_get_window_under_touch((Ecore_Window)&win))
+          {
+             printf("Error: cannot get window under touch\n");
+             return;
+          }
+     }
+   else if (argc == 4)
+     {
+        if (eina_streq(argv[2], "-id"))
+          {
+             if (strlen(argv[3]) >= 2 && argv[3][0] == '0' && argv[3][1] == 'x')
+               res = _util_string_to_ulong(argv[3], (unsigned long *)&win, 16);
+             else
+               res = _util_string_to_ulong(argv[3], (unsigned long *)&win, 10);
+
+             EINA_SAFETY_ON_FALSE_RETURN(res);
+          }
+        else
+          goto arg_err;
      }
+   else
+     goto arg_err;
 
    res = _e_info_client_eldbus_message_with_args("kill_client",
                                                  _e_info_client_cb_kill_client,
-                                                 "t", (uint64_t)win);
+                                                 VALUE_TYPE_REQUEST_FOR_KILL,
+                                                 win);
    EINA_SAFETY_ON_FALSE_RETURN(res);
 
    return;
+arg_err:
+   printf("Usage: enlightenment_info %s", KILL_USAGE);
 }
 
 static struct
@@ -2867,7 +2920,7 @@ static struct
    {
 
       "kill",
-       NULL,
+      KILL_USAGE,
       "kill a client",
       _e_info_client_proc_kill_client
    }
index 8abf388c3bf1d89ca900ff45826c07c75a963e43..0ea10be7a62ac718db8da5d9a0fe371998e2a277 100755 (executable)
@@ -86,6 +86,8 @@ static Eina_List *module_hook = NULL;
 #define VALUE_TYPE_REPLY_RESLIST "ssi"
 #define VALUE_TYPE_FOR_INPUTDEV "ssi"
 #define VALUE_TYPE_FOR_PENDING_COMMIT "uiuu"
+#define VALUE_TYPE_REQUEST_FOR_KILL "t"
+#define VALUE_TYPE_REPLY_KILL "s"
 
 enum
 {
@@ -3077,7 +3079,7 @@ _e_info_server_cb_kill_client(const Eldbus_Service_Interface *iface EINA_UNUSED,
    E_Client *ec;
    uint64_t win;
 
-   res = eldbus_message_arguments_get(msg, "t", &win);
+   res = eldbus_message_arguments_get(msg, VALUE_TYPE_REQUEST_FOR_KILL, &win);
    if (res != EINA_TRUE)
      {
         snprintf(result, sizeof(result),
@@ -3099,7 +3101,7 @@ _e_info_server_cb_kill_client(const Eldbus_Service_Interface *iface EINA_UNUSED,
            "[Server] killing creator(%s) of resource 0x%lx", e_client_util_name_get(ec) ?: "NO NAME", (unsigned long)win);
 
 finish:
-   eldbus_message_arguments_append(reply, "s", result);
+   eldbus_message_arguments_append(reply, VALUE_TYPE_REPLY_KILL, result);
 
    return reply;
 }
@@ -3145,7 +3147,7 @@ static const Eldbus_Method methods[] = {
    { "frender", ELDBUS_ARGS({"i", "frender"}), ELDBUS_ARGS({"s", "force_render_result"}), _e_info_server_cb_force_render, 0},
    { "screen_rotation", ELDBUS_ARGS({"i", "value"}), NULL, _e_info_server_cb_screen_rotation, 0},
    { "get_win_under_touch", NULL, ELDBUS_ARGS({"i", "result"}), _e_info_server_cb_get_win_under_touch, 0 },
-   { "kill_client", ELDBUS_ARGS({"t", "window"}), ELDBUS_ARGS({"s", "kill result"}), _e_info_server_cb_kill_client, 0 },
+   { "kill_client", ELDBUS_ARGS({VALUE_TYPE_REQUEST_FOR_KILL, "window"}), ELDBUS_ARGS({VALUE_TYPE_REPLY_KILL, "kill result"}), _e_info_server_cb_kill_client, 0 },
    { NULL, NULL, NULL, NULL, 0 }
 };