[Spice-devel] [PATCH spice] controller: Make menu text utf-8

Arnon Gilboa agilboa at redhat.com
Mon Oct 25 02:33:55 PDT 2010


Ack, and also revealed another bug for which I'll send a patch in a few 
moments.

Hans de Goede wrote:
> We are making all text send over the controller socket utf-8, rather then
> having somethings as 8 bit (hostname) and others (title, menu) unicode16,
> this patch completes this change by converting the menu handling.
> ---
>  client/controller.cpp |   39 ++++++++++++++++++---------------------
>  client/controller.h   |    2 +-
>  2 files changed, 19 insertions(+), 22 deletions(-)
>
> diff --git a/client/controller.cpp b/client/controller.cpp
> index 6d1272c..eabbcd4 100644
> --- a/client/controller.cpp
> +++ b/client/controller.cpp
> @@ -326,7 +326,7 @@ bool ControllerConnection::handle_message(ControllerMsg *hdr)
>          _handler->hide_me();
>          break;
>      case CONTROLLER_CREATE_MENU:
> -        return create_menu((wchar_t*)data);
> +        return create_menu((char*)data);
>      case CONTROLLER_DELETE_MENU:
>          _handler->delete_menu();
>          break;
> @@ -339,18 +339,18 @@ bool ControllerConnection::handle_message(ControllerMsg *hdr)
>  }
>  
>  #ifdef WIN32
> -#define next_tok(str, delim, state) wcstok(str, delim)
> +#define next_tok(str, delim, state) strtok(str, delim)
>  #else
> -#define next_tok(str, delim, state) wcstok(str, delim, state)
> +#define next_tok(str, delim, state) strtok_r(str, delim, state)
>  #endif
>  
> -bool ControllerConnection::create_menu(wchar_t* resource)
> +bool ControllerConnection::create_menu(char* resource)
>  {
>      bool ret = true;
> -    wchar_t* item_state = 0;
> -    wchar_t* item_dup;
> -    wchar_t* param;
> -    std::string text;
> +    char* item_state = 0;
> +    char* item_dup;
> +    const char* param;
> +    const char* text;
>      int parent_id;
>      int flags;
>      int state;
> @@ -359,30 +359,27 @@ bool ControllerConnection::create_menu(wchar_t* resource)
>      ASSERT(_handler);
>      AutoRef<Menu> app_menu(_handler->get_app_menu());
>      AutoRef<Menu> menu(new Menu((*app_menu)->get_target(), ""));
> -    wchar_t* item = next_tok(resource, CONTROLLER_MENU_ITEM_DELIMITER, &item_state);
> +    char* item = next_tok(resource, CONTROLLER_MENU_ITEM_DELIMITER, &item_state);
>      while (item != NULL) {
> -        item_dup = wcsdup(item);
> +        item_dup = strdup(item);
>          ret = ret && (param = next_tok(item_dup, CONTROLLER_MENU_PARAM_DELIMITER, &item_state)) &&
> -              swscanf(param, L"%d", &parent_id);
> +              sscanf(param, "%d", &parent_id);
>          ret = ret && (param = next_tok(NULL, CONTROLLER_MENU_PARAM_DELIMITER, &item_state)) &&
> -              swscanf(param, L"%d", &id);
> -        ret = ret && (param = next_tok(NULL, CONTROLLER_MENU_PARAM_DELIMITER, &item_state));
> -        if (ret) {
> -            string_printf(text, "%S", param);
> -        }
> +              sscanf(param, "%d", &id);
> +        ret = ret && (text = next_tok(NULL, CONTROLLER_MENU_PARAM_DELIMITER, &item_state));
>          ret = ret && (param = next_tok(NULL, CONTROLLER_MENU_PARAM_DELIMITER, &item_state)) &&
> -              swscanf(param, L"%d", &flags);
> +              sscanf(param, "%d", &flags);
>          free(item_dup);
>  
>          if (!ret) {
> -            DBG(0, "item parsing failed %S", item);
> +            DBG(0, "item parsing failed %s", item);
>              break;
>          }
> -        DBG(0, "parent_id=%d, id=%d, text=%s, flags=%d", parent_id, id, text.c_str(), flags);
> +        DBG(0, "parent_id=%d, id=%d, text=%s, flags=%d", parent_id, id, text, flags);
>  
>          AutoRef<Menu> sub_menu((*menu)->find_sub(parent_id));
>          if (!(ret = !!*sub_menu)) {
> -            DBG(0, "submenu not found %S", item);
> +            DBG(0, "submenu not found %s", item);
>              break;
>          }
>  
> @@ -406,7 +403,7 @@ bool ControllerConnection::create_menu(wchar_t* resource)
>              }
>              (*sub_menu)->add_command(text, id, state);
>          }
> -        item = next_tok(item + wcslen(item) + 1, CONTROLLER_MENU_ITEM_DELIMITER, &item_state);
> +        item = next_tok(item + strlen(item) + 1, CONTROLLER_MENU_ITEM_DELIMITER, &item_state);
>      }
>      if (ret) {
>          _handler->set_menu(*menu);
> diff --git a/client/controller.h b/client/controller.h
> index 924f351..bf92707 100644
> --- a/client/controller.h
> +++ b/client/controller.h
> @@ -90,7 +90,7 @@ private:
>      bool read_msgs();
>      bool handle_init(ControllerInit *init);
>      bool handle_message(ControllerMsg *hdr);
> -    bool create_menu(wchar_t* resource);
> +    bool create_menu(char* resource);
>      bool set_multi_val(uint32_t op, char* multi_val);
>  
>  private:
>   



More information about the Spice-devel mailing list