Commit e80e008a94a7248cf6baad861f3f21ecda38cdc2

Authored by Perry Werneck
1 parent ea4bb503
Exists in master and in 1 other branch develop

Working on IPC module for windows.

client/src/core/windows/request.cc
@@ -36,7 +36,7 @@ @@ -36,7 +36,7 @@
36 * 36 *
37 */ 37 */
38 38
39 - #include "../private.h" 39 + #include <ipc-client-internals.h>
40 40
41 using std::string; 41 using std::string;
42 42
client/src/core/windows/session.cc
@@ -36,7 +36,7 @@ @@ -36,7 +36,7 @@
36 * 36 *
37 */ 37 */
38 38
39 - #include "../private.h" 39 + #include <ipc-client-internals.h>
40 #include <cstring> 40 #include <cstring>
41 #include <lib3270/trace.h> 41 #include <lib3270/trace.h>
42 #include <algorithm> 42 #include <algorithm>
client/src/session/local/events.cc
@@ -36,8 +36,9 @@ @@ -36,8 +36,9 @@
36 * 36 *
37 */ 37 */
38 38
  39 + #include <config.h>
  40 + #include <cstdio>
39 #include <ipc-client-internals.h> 41 #include <ipc-client-internals.h>
40 - #include <stdio.h>  
41 #include <cstring> 42 #include <cstring>
42 #include <malloc.h> 43 #include <malloc.h>
43 44
@@ -50,17 +51,17 @@ @@ -50,17 +51,17 @@
50 51
51 /*---[ Implement ]----------------------------------------------------------------------------------*/ 52 /*---[ Implement ]----------------------------------------------------------------------------------*/
52 53
53 -#ifndef HAVE_VASPRINTF  
54 - int vasprintf(char **strp, const char *fmt, va_list ap) { 54 +#ifdef _WIN32
  55 + int win32_vasprintf(char **strp, const char *fmt, va_list ap) {
55 char buf[1024]; 56 char buf[1024];
56 57
57 int nc = vsnprintf(buf, sizeof(buf), fmt, ap); 58 int nc = vsnprintf(buf, sizeof(buf), fmt, ap);
58 59
59 if(nc < 0) { 60 if(nc < 0) {
60 61
61 - *strp = strdup(_("Error in vasprintf")); 62 + return nc;
62 63
63 - } else if (nc < sizeof(buf)) { 64 + } else if (nc < ((int) sizeof(buf))) {
64 65
65 *strp = (char *) malloc(nc+1); 66 *strp = (char *) malloc(nc+1);
66 strcpy(*strp, buf); 67 strcpy(*strp, buf);
@@ -77,7 +78,7 @@ @@ -77,7 +78,7 @@
77 78
78 return nc; 79 return nc;
79 } 80 }
80 -#endif // !HAVE_VASPRINTF 81 +#endif // _WIN32
81 82
82 namespace TN3270 { 83 namespace TN3270 {
83 84
@@ -105,10 +106,17 @@ @@ -105,10 +106,17 @@
105 this->msg = msg; 106 this->msg = msg;
106 107
107 char * buffer = NULL; 108 char * buffer = NULL;
  109 +#ifdef _WIN32
  110 + if(win32_vasprintf(&buffer,fmt,arg) != -1) {
  111 + this->description = buffer;
  112 + free(buffer);
  113 + }
  114 +#else
108 if(vasprintf(&buffer,fmt,arg) != -1) { 115 if(vasprintf(&buffer,fmt,arg) != -1) {
109 this->description = buffer; 116 this->description = buffer;
110 free(buffer); 117 free(buffer);
111 } 118 }
  119 +#endif
112 120
113 #ifdef DEBUG 121 #ifdef DEBUG
114 std::cerr << "Popup:" << std::endl 122 std::cerr << "Popup:" << std::endl
common/src/include/lib3270/ipc-glib.h
@@ -85,6 +85,8 @@ @@ -85,6 +85,8 @@
85 const gchar * ipc3270_get_display_charset(GObject *object); 85 const gchar * ipc3270_get_display_charset(GObject *object);
86 H3270 * ipc3270_get_session(GObject *object); 86 H3270 * ipc3270_get_session(GObject *object);
87 87
  88 + GQuark ipc3270_get_error_domain(GObject *object);
  89 +
88 void ipc3270_set_error(GObject *object, int errcode, GError **error); 90 void ipc3270_set_error(GObject *object, int errcode, GError **error);
89 91
90 GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *parameters, GError **error); 92 GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *parameters, GError **error);
server/src/core/linux/gobject.c
@@ -225,3 +225,8 @@ H3270 * ipc3270_get_session(GObject *object) { @@ -225,3 +225,8 @@ H3270 * ipc3270_get_session(GObject *object) {
225 void ipc3270_set_error(GObject *object, int errcode, GError **error) { 225 void ipc3270_set_error(GObject *object, int errcode, GError **error) {
226 g_set_error(error,IPC3270(object)->error_domain,errcode,"%s",strerror(errcode)); 226 g_set_error(error,IPC3270(object)->error_domain,errcode,"%s",strerror(errcode));
227 } 227 }
  228 +
  229 +GQuark ipc3270_get_error_domain(GObject *object) {
  230 + return IPC3270(object)->error_domain;
  231 +}
  232 +
server/src/core/methods.c
@@ -72,7 +72,7 @@ GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVaria @@ -72,7 +72,7 @@ GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVaria
72 72
73 // Suceeded 73 // Suceeded
74 debug("%s Suceeds",method_name); 74 debug("%s Suceeds",method_name);
75 - return g_variant_new("(i)", (gint) 0); 75 + return g_variant_new_int32(0);
76 76
77 } 77 }
78 else if(!g_ascii_strcasecmp(method_name,"setStringAt")) 78 else if(!g_ascii_strcasecmp(method_name,"setStringAt"))
@@ -90,7 +90,7 @@ GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVaria @@ -90,7 +90,7 @@ GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVaria
90 } 90 }
91 91
92 // Suceeded 92 // Suceeded
93 - return g_variant_new("(i)", (gint) 0); 93 + return g_variant_new_int32(0);
94 94
95 } 95 }
96 else if(!g_ascii_strcasecmp(method_name,"getStringAt")) 96 else if(!g_ascii_strcasecmp(method_name,"getStringAt"))
@@ -117,7 +117,7 @@ GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVaria @@ -117,7 +117,7 @@ GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVaria
117 } 117 }
118 118
119 // Suceeded 119 // Suceeded
120 - return g_variant_new("(i)", (gint) 0); 120 + return g_variant_new_int32(0);
121 121
122 } 122 }
123 else if(!g_ascii_strcasecmp(method_name,"getStringAtAddress")) 123 else if(!g_ascii_strcasecmp(method_name,"getStringAtAddress"))
@@ -134,8 +134,10 @@ GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVaria @@ -134,8 +134,10 @@ GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVaria
134 else if(!g_ascii_strcasecmp(method_name,"waitforready")) 134 else if(!g_ascii_strcasecmp(method_name,"waitforready"))
135 { 135 {
136 guint timeout = 1; 136 guint timeout = 1;
137 - g_variant_get(parameters, "(u)", &timeout);  
138 - return g_variant_new("(i)", (gint) lib3270_wait_for_ready(hSession,timeout)); 137 + if(parameters) {
  138 + g_variant_get(parameters, "(u)", &timeout);
  139 + }
  140 + return g_variant_new_int32((gint) lib3270_wait_for_ready(hSession,timeout));
139 } 141 }
140 142
141 // Check action table. 143 // Check action table.
@@ -153,7 +155,7 @@ GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVaria @@ -153,7 +155,7 @@ GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVaria
153 } 155 }
154 156
155 // Suceeded 157 // Suceeded
156 - return g_variant_new("(i)", (gint) 0); 158 + return g_variant_new_int32(0);
157 159
158 } 160 }
159 } 161 }
@@ -177,7 +179,7 @@ GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVaria @@ -177,7 +179,7 @@ GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVaria
177 } 179 }
178 180
179 // Suceeded 181 // Suceeded
180 - return g_variant_new("(i)", (gint) 0); 182 + return g_variant_new_int32(0);
181 183
182 } 184 }
183 185
server/src/core/setproperties.c
@@ -44,6 +44,11 @@ gboolean ipc3270_set_property(GObject *object, const gchar *property_name, GVari @@ -44,6 +44,11 @@ gboolean ipc3270_set_property(GObject *object, const gchar *property_name, GVari
44 size_t ix; 44 size_t ix;
45 H3270 * hSession = ipc3270_get_session(object); 45 H3270 * hSession = ipc3270_get_session(object);
46 46
  47 + if(!value) {
  48 + g_set_error(&error,ipc3270_get_error_domain(object),EINVAL,"Set property method requires an argument");
  49 + return FALSE;
  50 + }
  51 +
47 lib3270_trace_event(hSession,"SetProperty(%s) called on session %c\n",property_name,lib3270_get_session_id(hSession)); 52 lib3270_trace_event(hSession,"SetProperty(%s) called on session %c\n",property_name,lib3270_get_session_id(hSession));
48 53
49 // Boolean properties 54 // Boolean properties
server/src/core/windows/gobject.c
@@ -90,3 +90,7 @@ void ipc3270_set_error(GObject *object, int errcode, GError **error) { @@ -90,3 +90,7 @@ void ipc3270_set_error(GObject *object, int errcode, GError **error) {
90 g_set_error(error,IPC3270(object)->error_domain,errcode,"%s",strerror(errcode)); 90 g_set_error(error,IPC3270(object)->error_domain,errcode,"%s",strerror(errcode));
91 } 91 }
92 92
  93 +GQuark ipc3270_get_error_domain(GObject *object) {
  94 + return IPC3270(object)->error_domain;
  95 +}
  96 +
server/src/core/windows/inout.c
@@ -85,65 +85,70 @@ static unsigned char * setup_header(unsigned char *txtptr, const gchar *name, in @@ -85,65 +85,70 @@ static unsigned char * setup_header(unsigned char *txtptr, const gchar *name, in
85 85
86 unsigned char * pack_value(unsigned char *txtptr, GVariant *value) { 86 unsigned char * pack_value(unsigned char *txtptr, GVariant *value) {
87 87
88 - unsigned char type = (unsigned char) g_variant_get_type_string(value)[0]; 88 + const GVariantType *type = g_variant_get_type(value);
89 89
90 - debug("%s type=%c",__FUNCTION__,type); 90 + if(g_variant_type_equal(type,G_VARIANT_TYPE_STRING)) {
91 91
92 - *(txtptr++) = type;  
93 -  
94 - switch(type) {  
95 - // https://developer.gnome.org/glib/stable/gvariant-format-strings.html  
96 - case 's': 92 + *(txtptr++) = 's';
97 strcpy((char *) txtptr,g_variant_get_string(value,NULL)); 93 strcpy((char *) txtptr,g_variant_get_string(value,NULL));
98 txtptr += (strlen((char *) txtptr)+1); 94 txtptr += (strlen((char *) txtptr)+1);
99 - break;  
100 95
101 - case 'b': // gboolean 96 + } else if(g_variant_type_equal(type,G_VARIANT_TYPE_BOOLEAN)) {
  97 +
  98 + *(txtptr++) = 'b';
102 *(txtptr++) = g_variant_get_boolean(value) ? 1 : 0; 99 *(txtptr++) = g_variant_get_boolean(value) ? 1 : 0;
103 - break;  
104 100
105 - case 'y': // guchar 101 + } else if(g_variant_type_equal(type,G_VARIANT_TYPE_BYTE)) {
  102 +
  103 + *(txtptr++) = 'y';
106 *(txtptr++) = g_variant_get_byte(value); 104 *(txtptr++) = g_variant_get_byte(value);
107 - break;  
108 105
109 - case 'n': // gint16 106 + } else if(g_variant_type_equal(type,G_VARIANT_TYPE_INT16)) {
  107 +
  108 + *(txtptr++) = 'n';
110 *((gint16 *) txtptr) = g_variant_get_int16(value); 109 *((gint16 *) txtptr) = g_variant_get_int16(value);
111 txtptr += sizeof(gint16); 110 txtptr += sizeof(gint16);
112 - break;  
113 111
114 - case 'q': // guint16 112 + } else if(g_variant_type_equal(type,G_VARIANT_TYPE_UINT16)) {
  113 +
  114 + *(txtptr++) = 'q';
115 *((guint16 *) txtptr) = g_variant_get_uint16(value); 115 *((guint16 *) txtptr) = g_variant_get_uint16(value);
116 txtptr += sizeof(guint16); 116 txtptr += sizeof(guint16);
117 - break;  
118 117
119 - case 'i': // gint32  
120 - case 'h': // gint32 118 + } else if(g_variant_type_is_subtype_of(type,G_VARIANT_TYPE_INT32)) {
  119 +
  120 + *(txtptr++) = 'i';
121 *((gint32 *) txtptr) = g_variant_get_int32(value); 121 *((gint32 *) txtptr) = g_variant_get_int32(value);
122 txtptr += sizeof(gint32); 122 txtptr += sizeof(gint32);
123 - break;  
124 123
125 - case 'u': // guint32 124 + } else if(g_variant_type_equal(type,G_VARIANT_TYPE_UINT32)) {
  125 +
  126 + *(txtptr++) = 'u';
126 *((guint32 *) txtptr) = g_variant_get_uint32(value); 127 *((guint32 *) txtptr) = g_variant_get_uint32(value);
127 txtptr += sizeof(guint32); 128 txtptr += sizeof(guint32);
128 - break;  
129 129
130 - case 'x': // gint64 130 + } else if(g_variant_type_equal(type,G_VARIANT_TYPE_INT64)) {
  131 +
  132 + *(txtptr++) = 'x';
131 *((gint64 *) txtptr) = g_variant_get_int64(value); 133 *((gint64 *) txtptr) = g_variant_get_int64(value);
132 txtptr += sizeof(gint64); 134 txtptr += sizeof(gint64);
133 - break;  
134 135
135 - case 't': // guint64 136 + } else if(g_variant_type_equal(type,G_VARIANT_TYPE_UINT64)) {
  137 +
  138 + *(txtptr++) = 't';
136 *((guint64 *) txtptr) = g_variant_get_uint64(value); 139 *((guint64 *) txtptr) = g_variant_get_uint64(value);
137 txtptr += sizeof(guint64); 140 txtptr += sizeof(guint64);
138 - break;  
139 141
140 - default: 142 + } else {
  143 +
141 errno = EINVAL; 144 errno = EINVAL;
  145 + g_message("Invalid IPC value type \"%s\"", g_variant_get_type_string(value));
142 return NULL; 146 return NULL;
143 147
144 } 148 }
145 149
146 return txtptr; 150 return txtptr;
  151 +
147 } 152 }
148 153
149 unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket) { 154 unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket) {
server/src/core/windows/pipesource.c
@@ -108,10 +108,6 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { @@ -108,10 +108,6 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) {
108 g_autoptr (GVariant) parameters = ipc3270_unpack(source->buffer, &request_type); 108 g_autoptr (GVariant) parameters = ipc3270_unpack(source->buffer, &request_type);
109 g_autoptr (GVariant) response = NULL; 109 g_autoptr (GVariant) response = NULL;
110 110
111 - if(!parameters) {  
112 - g_message("Rejecting invalid request \"%s\"", request_name);  
113 - }  
114 -  
115 // Process query 111 // Process query
116 switch(request_type) { 112 switch(request_type) {
117 case 1: // getProperty 113 case 1: // getProperty
server/src/testprogram/testprogram.c
@@ -40,6 +40,8 @@ @@ -40,6 +40,8 @@
40 #include <lib3270/ipc-glib.h> 40 #include <lib3270/ipc-glib.h>
41 #include <string.h> 41 #include <string.h>
42 #include <stdlib.h> 42 #include <stdlib.h>
  43 + #include <glib.h>
  44 + #include <glib/gstdio.h>
43 45
44 /*---[ Globals ]------------------------------------------------------------------------------------*/ 46 /*---[ Globals ]------------------------------------------------------------------------------------*/
45 47
@@ -158,6 +160,32 @@ @@ -158,6 +160,32 @@
158 160
159 gtk_widget_set_name(window,session_name); 161 gtk_widget_set_name(window,session_name);
160 162
  163 +#ifdef _WIN32
  164 + {
  165 + // WIN32 path settings.
  166 + static const char * sep = "\\/.";
  167 +
  168 + TCHAR szPath[MAX_PATH];
  169 +
  170 + if(GetModuleFileName(NULL, szPath, MAX_PATH ) ) {
  171 +
  172 + for(const char *p = sep; *p; p++) {
  173 +
  174 + char *ptr = strrchr(szPath,*p);
  175 + if(ptr) {
  176 + *(ptr+1) = 0;
  177 + break;
  178 + }
  179 +
  180 + }
  181 +
  182 + }
  183 +
  184 + g_chdir(szPath);
  185 +
  186 + }
  187 +#endif // _WIN32
  188 +
161 // Setup tabs 189 // Setup tabs
162 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),terminal,gtk_label_new(v3270_get_session_name(terminal))); 190 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),terminal,gtk_label_new(v3270_get_session_name(terminal)));
163 191