| Index: client/deps/ibusclient/src/ibusclient.cc | 
| diff --git a/client/deps/ibusclient/src/ibusclient.cc b/client/deps/ibusclient/src/ibusclient.cc | 
| index aee7f0a25f4274afd9642f3ed1aa9d926e3ae588..6c14069fae1c441856cd329a50d50eaf81780905 100644 | 
| --- a/client/deps/ibusclient/src/ibusclient.cc | 
| +++ b/client/deps/ibusclient/src/ibusclient.cc | 
| @@ -8,6 +8,102 @@ | 
| #include <stdio.h> | 
| #include <string> | 
|  | 
| +namespace { | 
| + | 
| +const gchar kDummySection[] = "aaa/bbb"; | 
| +const gchar kDummyConfigName[] = "ccc"; | 
| + | 
| +const gboolean kDummyValueBoolean = TRUE; | 
| +const gint kDummyValueInt = 12345; | 
| +const gdouble kDummyValueDouble = 12345.54321; | 
| +const gchar kDummyValueString[] = "dummy value"; | 
| + | 
| +// Unsets a dummy value from ibus config service. | 
| +void UnsetConfigAndPrintResult(IBusConfig* ibus_config) { | 
| +  if (ibus_config_unset(ibus_config, kDummySection, kDummyConfigName)) { | 
| +    printf("OK\n"); | 
| +  } else { | 
| +    printf("FAIL\n"); | 
| +  } | 
| +} | 
| + | 
| +// Sets a dummy value to ibus config service. You can specify a type of the | 
| +// dummy value by |type_string|. "boolean", "int", "double", or "string" are | 
| +// allowed. | 
| +void SetConfigAndPrintResult( | 
| +    IBusConfig* ibus_config, const std::string& type_string) { | 
| +  GValue gvalue = {0}; | 
| + | 
| +  if (type_string == "boolean") { | 
| +    g_value_init(&gvalue, G_TYPE_BOOLEAN); | 
| +    g_value_set_boolean(&gvalue, kDummyValueBoolean); | 
| +  } else if (type_string == "int") { | 
| +    g_value_init(&gvalue, G_TYPE_INT); | 
| +    g_value_set_int(&gvalue, kDummyValueInt); | 
| +  } else if (type_string == "double") { | 
| +    g_value_init(&gvalue, G_TYPE_DOUBLE); | 
| +    g_value_set_double(&gvalue, kDummyValueDouble); | 
| +  } else if (type_string == "string") { | 
| +    g_value_init(&gvalue, G_TYPE_STRING); | 
| +    g_value_set_string(&gvalue, kDummyValueString); | 
| +  } else { | 
| +    printf("FAIL (unknown type: %s)\n", type_string.c_str()); | 
| +    return; | 
| +  } | 
| + | 
| +  if (ibus_config_set_value( | 
| +          ibus_config, kDummySection, kDummyConfigName, &gvalue)) { | 
| +    printf("OK\n"); | 
| +  } else { | 
| +    printf("FAIL\n"); | 
| +  } | 
| +} | 
| + | 
| +// Gets a dummy value from ibus config service. This function checks if the | 
| +// dummy value is |type_string| type. | 
| +void GetConfigAndPrintResult( | 
| +    IBusConfig* ibus_config, const std::string& type_string) { | 
| +  GValue gvalue = {0}; | 
| +  if (!ibus_config_get_value( | 
| +          ibus_config, kDummySection, kDummyConfigName, &gvalue)) { | 
| +    printf("FAIL (not found)\n"); | 
| +    return; | 
| +  } | 
| + | 
| +  if (type_string == "boolean") { | 
| +    if ((G_VALUE_TYPE(&gvalue) != G_TYPE_BOOLEAN) || | 
| +        (g_value_get_boolean(&gvalue) != kDummyValueBoolean)) { | 
| +      printf("FAIL (type/value mismatch)\n"); | 
| +      return; | 
| +    } | 
| +  } else if (type_string == "int") { | 
| +    if ((G_VALUE_TYPE(&gvalue) != G_TYPE_INT) || | 
| +        (g_value_get_int(&gvalue) != kDummyValueInt)) { | 
| +      printf("FAIL (type/value mismatch)\n"); | 
| +      return; | 
| +    } | 
| +  } else if (type_string == "double") { | 
| +    if ((G_VALUE_TYPE(&gvalue) != G_TYPE_DOUBLE) || | 
| +        // We allow errors for double values. | 
| +        (g_value_get_double(&gvalue) < kDummyValueDouble - 0.001) || | 
| +        (g_value_get_double(&gvalue) > kDummyValueDouble + 0.001)) { | 
| +      printf("FAIL (type/value mismatch)\n"); | 
| +      return; | 
| +    } | 
| +  } else if (type_string == "string") { | 
| +    if ((G_VALUE_TYPE(&gvalue) != G_TYPE_STRING) || | 
| +        (g_value_get_string(&gvalue) != std::string(kDummyValueString))) { | 
| +      printf("FAIL (type/value mismatch)\n"); | 
| +      return; | 
| +    } | 
| +  } else { | 
| +    printf("FAIL (unknown type: %s)\n", type_string.c_str()); | 
| +    return; | 
| +  } | 
| + | 
| +  printf("OK\n"); | 
| +} | 
| + | 
| // Prints the names of the given engines. Takes the ownership of |engines|. | 
| void PrintEngineNames(GList* engines) { | 
| for (GList* cursor = engines; cursor; cursor = g_list_next(cursor)) { | 
| @@ -19,12 +115,27 @@ void PrintEngineNames(GList* engines) { | 
| g_list_free(engines); | 
| } | 
|  | 
| +void PrintUsage(const char* argv0) { | 
| +  printf("Usage: %s COMMAND\n", argv0); | 
| +  printf("check_reachable      Check if ibus-daemon is reachable\n"); | 
| +  printf("list_engines         List engine names (all engines)\n"); | 
| +  printf("list_active_engines  List active engine names\n"); | 
| +  // TODO(yusukes): Add tests for array of {bool, int, double, string}. | 
| +  // TODO(yusukes): Add 2 parameters, config_key and config_value, to | 
| +  // set_config and get_config commands. | 
| +  printf("set_config (boolean|int|double|string)\n" | 
| +         "                     Set a dummy value to ibus config service\n"); | 
| +  printf("get_config (boolean|int|double|string)\n" | 
| +         "                     Get a dummy value from ibus config service\n"); | 
| +  // TODO(yusukes): Add config_key parameter. | 
| +  printf("unset_config         Unset a dummy value from ibus config service\n"); | 
| +} | 
| + | 
| +}  // namespace | 
| + | 
| int main(int argc, char **argv) { | 
| if (argc == 1) { | 
| -    printf("Usage: %s COMMAND\n", argv[0]); | 
| -    printf("check_reachable      Check if ibus-daemon is reachable\n"); | 
| -    printf("list_engines         List engine names (all engines)\n"); | 
| -    printf("list_active_engines  List active engine names\n"); | 
| +    PrintUsage(argv[0]); | 
| return 1; | 
| } | 
|  | 
| @@ -38,15 +149,35 @@ int main(int argc, char **argv) { | 
| const std::string command = argv[1]; | 
| if (command == "check_reachable") { | 
| printf("%s\n", connected ? "YES" : "NO"); | 
| +    return 0; | 
| } | 
|  | 
| // Other commands need the bus to be connected. | 
| assert(ibus); | 
| assert(connected); | 
| +  IBusConnection* ibus_connection = ibus_bus_get_connection(ibus); | 
| +  assert(ibus_connection); | 
| +  IBusConfig* ibus_config = ibus_config_new(ibus_connection); | 
| +  assert(ibus_config); | 
| + | 
| if (command == "list_engines") { | 
| PrintEngineNames(ibus_bus_list_engines(ibus)); | 
| } else if (command == "list_active_engines") { | 
| PrintEngineNames(ibus_bus_list_active_engines(ibus)); | 
| +  } else if (command == "set_config") { | 
| +    if (argc != 3) { | 
| +      PrintUsage(argv[0]); | 
| +      return 1; | 
| +    } | 
| +    SetConfigAndPrintResult(ibus_config, argv[2]); | 
| +  } else if (command == "get_config") { | 
| +    if (argc != 3) { | 
| +      PrintUsage(argv[0]); | 
| +      return 1; | 
| +    } | 
| +    GetConfigAndPrintResult(ibus_config, argv[2]); | 
| +  } else if (command == "unset_config") { | 
| +    UnsetConfigAndPrintResult(ibus_config); | 
| } | 
|  | 
| return 0; | 
|  |