Commit c47c54666f731c3f68e8eeb8426a99d9dcf41b38
1 parent
cf18786f
Exists in
master
and in
1 other branch
Fixing D-Bus method returns.
Showing
1 changed file
with
26 additions
and
40 deletions
Show diff stats
src/linux/methods.c
| ... | ... | @@ -39,6 +39,25 @@ |
| 39 | 39 | #include <dbus/dbus-glib.h> |
| 40 | 40 | #include <dbus/dbus-glib-bindings.h> |
| 41 | 41 | |
| 42 | +/// @brief Converts lib3270 string to UTF-8 sets the method response. | |
| 43 | +void g_dbus_method_invocation_return_tn3270_string(ipc3270 *obj, GDBusMethodInvocation *invocation, char *string) { | |
| 44 | + | |
| 45 | + if(!string) { | |
| 46 | + g_autoptr (GError) error = NULL; | |
| 47 | + g_set_error(&error,obj->error_domain,errno,"%s",strerror(errno)); | |
| 48 | + g_dbus_method_invocation_return_gerror(invocation, error); | |
| 49 | + return; | |
| 50 | + } | |
| 51 | + | |
| 52 | + gchar * utftext = g_convert_with_fallback(string,-1,"UTF-8",lib3270_get_display_charset(obj->hSession),"?",NULL,NULL,NULL); | |
| 53 | + | |
| 54 | + g_dbus_method_invocation_return_value(invocation, g_variant_new ("(s)", utftext)); | |
| 55 | + | |
| 56 | + lib3270_free(string); | |
| 57 | + g_free(utftext); | |
| 58 | + | |
| 59 | +} | |
| 60 | + | |
| 42 | 61 | void |
| 43 | 62 | ipc3270_method_call (GDBusConnection *connection, |
| 44 | 63 | const gchar *sender, |
| ... | ... | @@ -54,21 +73,11 @@ ipc3270_method_call (GDBusConnection *connection, |
| 54 | 73 | size_t ix; |
| 55 | 74 | g_autoptr (GError) error = NULL; |
| 56 | 75 | |
| 76 | + debug("%s(%s)",__FUNCTION__,method_name); | |
| 77 | + | |
| 57 | 78 | if(!g_ascii_strcasecmp(method_name,"getString")) |
| 58 | 79 | { |
| 59 | - char * text = lib3270_get_string_at_address(IPC3270(user_data)->hSession,0,-1,'\n'); | |
| 60 | - | |
| 61 | - if(!text) | |
| 62 | - { | |
| 63 | - g_set_error(&error,IPC3270(user_data)->error_domain,errno,"%s: %s",method_name,strerror(errno)); | |
| 64 | - g_dbus_method_invocation_return_gerror(invocation, error); | |
| 65 | - } | |
| 66 | - else | |
| 67 | - { | |
| 68 | - g_dbus_method_invocation_return_value (invocation, g_variant_new_string(text)); | |
| 69 | - lib3270_free(text); | |
| 70 | - } | |
| 71 | - | |
| 80 | + g_dbus_method_invocation_return_tn3270_string(IPC3270(user_data), invocation, lib3270_get_string_at_address(IPC3270(user_data)->hSession,0,-1,'\n')); | |
| 72 | 81 | return; |
| 73 | 82 | } |
| 74 | 83 | else if(!g_ascii_strcasecmp(method_name,"setString")) |
| ... | ... | @@ -116,20 +125,9 @@ ipc3270_method_call (GDBusConnection *connection, |
| 116 | 125 | guchar lf; |
| 117 | 126 | g_variant_get(parameters, "(iiy)", &row, &col, &len,&lf); |
| 118 | 127 | |
| 119 | - char * text = lib3270_get_string_at(IPC3270(user_data)->hSession, row, col, len, lf); | |
| 120 | - | |
| 121 | - if(!text) | |
| 122 | - { | |
| 123 | - g_set_error(&error,IPC3270(user_data)->error_domain,errno,"%s: %s",method_name,strerror(errno)); | |
| 124 | - g_dbus_method_invocation_return_gerror(invocation, error); | |
| 125 | - } | |
| 126 | - else | |
| 127 | - { | |
| 128 | - g_dbus_method_invocation_return_value (invocation, g_variant_new_string(text)); | |
| 129 | - lib3270_free(text); | |
| 130 | - } | |
| 131 | - | |
| 128 | + g_dbus_method_invocation_return_tn3270_string(IPC3270(user_data), invocation, lib3270_get_string_at(IPC3270(user_data)->hSession, row, col, len, lf)); | |
| 132 | 129 | return; |
| 130 | + | |
| 133 | 131 | } |
| 134 | 132 | else if(!g_ascii_strcasecmp(method_name,"setStringAtAddress")) |
| 135 | 133 | { |
| ... | ... | @@ -157,19 +155,7 @@ ipc3270_method_call (GDBusConnection *connection, |
| 157 | 155 | guchar lf; |
| 158 | 156 | g_variant_get(parameters, "(iiy)", &addr, &len, &lf); |
| 159 | 157 | |
| 160 | - char * text = lib3270_get_string_at_address(IPC3270(user_data)->hSession, addr, len, lf); | |
| 161 | - | |
| 162 | - if(!text) | |
| 163 | - { | |
| 164 | - g_set_error(&error,IPC3270(user_data)->error_domain,errno,"%s: %s",method_name,strerror(errno)); | |
| 165 | - g_dbus_method_invocation_return_gerror(invocation, error); | |
| 166 | - } | |
| 167 | - else | |
| 168 | - { | |
| 169 | - g_dbus_method_invocation_return_value (invocation, g_variant_new_string(text)); | |
| 170 | - lib3270_free(text); | |
| 171 | - } | |
| 172 | - | |
| 158 | + g_dbus_method_invocation_return_tn3270_string(IPC3270(user_data), invocation, lib3270_get_string_at_address(IPC3270(user_data)->hSession, addr, len, lf)); | |
| 173 | 159 | return; |
| 174 | 160 | |
| 175 | 161 | } |
| ... | ... | @@ -200,7 +186,7 @@ ipc3270_method_call (GDBusConnection *connection, |
| 200 | 186 | // Check int methods |
| 201 | 187 | const IPC_METHOD_INT_ARG * int_methods = ipc3270_get_int_arg_methods(); |
| 202 | 188 | |
| 203 | - for(ix = 0; ix < G_N_ELEMENTS(int_methods); ix++) | |
| 189 | + for(ix = 0; int_methods[ix].name; ix++) | |
| 204 | 190 | { |
| 205 | 191 | if(!g_ascii_strcasecmp(int_methods[ix].name,method_name)) { |
| 206 | 192 | ... | ... |