Commit 04548e41fa30b4e00357171e3fb5cc20d37e8485
1 parent
cc8c8904
Exists in
master
and in
5 other branches
Melhorando plugin hllapi
Showing
8 changed files
with
294 additions
and
93 deletions
Show diff stats
src/include/lib3270.h
src/include/pw3270/v3270.h
| ... | ... | @@ -186,7 +186,7 @@ |
| 186 | 186 | LIB3270_EXPORT void v3270_popup_message(GtkWidget *widget, LIB3270_NOTIFY type, const gchar *title, const gchar *message, const gchar *text); |
| 187 | 187 | LIB3270_EXPORT const gchar * v3270_get_session_name(GtkWidget *widget); |
| 188 | 188 | LIB3270_EXPORT void v3270_set_session_name(GtkWidget *widget, const gchar *name); |
| 189 | - LIB3270_EXPORT int v3270_set_script(GtkWidget *widget, const gchar id, unsigned char on); | |
| 189 | + LIB3270_EXPORT int v3270_set_script(GtkWidget *widget, const gchar id, gboolean on); | |
| 190 | 190 | LIB3270_EXPORT void v3270_set_scaled_fonts(GtkWidget *widget, gboolean on); |
| 191 | 191 | |
| 192 | 192 | LIB3270_EXPORT void v3270_set_host(GtkWidget *widget, const gchar *uri); | ... | ... |
src/lib3270/iocalls.c
| ... | ... | @@ -726,6 +726,9 @@ LIB3270_EXPORT int lib3270_wait_for_ready(H3270 *hSession, int seconds) |
| 726 | 726 | { |
| 727 | 727 | time_t end = time(0)+seconds; |
| 728 | 728 | |
| 729 | + if(hSession->oia_status == LIB3270_STATUS_BLANK) | |
| 730 | + return 0; | |
| 731 | + | |
| 729 | 732 | while(time(0) < end) |
| 730 | 733 | { |
| 731 | 734 | event_dispatcher(hSession,1); | ... | ... |
src/plugins/remotectl/hllapi.c
| ... | ... | @@ -79,7 +79,7 @@ |
| 79 | 79 | } |
| 80 | 80 | |
| 81 | 81 | |
| 82 | - static char * run_query(unsigned long func, const char *arg, size_t length, unsigned short *rc) | |
| 82 | + static char * run_query(unsigned long func, const char *arg, size_t *length, unsigned short *rc) | |
| 83 | 83 | { |
| 84 | 84 | char *outBuffer = NULL; |
| 85 | 85 | |
| ... | ... | @@ -93,7 +93,7 @@ |
| 93 | 93 | else |
| 94 | 94 | { |
| 95 | 95 | HLLAPI_DATA *buffer = malloc(HLLAPI_MAXLENGTH+1); |
| 96 | - DWORD cbSize = sizeof(HLLAPI_DATA) + length; | |
| 96 | + DWORD cbSize = sizeof(HLLAPI_DATA) + *length; | |
| 97 | 97 | HLLAPI_DATA *data = malloc(cbSize+1); |
| 98 | 98 | |
| 99 | 99 | memset(buffer,0,HLLAPI_MAXLENGTH); |
| ... | ... | @@ -101,10 +101,10 @@ |
| 101 | 101 | data->id = HLLAPI_REQUEST_ID; |
| 102 | 102 | data->func = func; |
| 103 | 103 | data->rc = *rc; |
| 104 | - data->len = length; | |
| 104 | + data->len = *length; | |
| 105 | 105 | |
| 106 | - if(arg && length > 0) | |
| 107 | - memcpy(data->string,arg,length); | |
| 106 | + if(arg && *length > 0) | |
| 107 | + memcpy(data->string,arg,*length); | |
| 108 | 108 | |
| 109 | 109 | memset(buffer,0,HLLAPI_MAXLENGTH); |
| 110 | 110 | |
| ... | ... | @@ -115,7 +115,8 @@ |
| 115 | 115 | } |
| 116 | 116 | else |
| 117 | 117 | { |
| 118 | - *rc = buffer->rc; | |
| 118 | + *rc = buffer->rc; | |
| 119 | + *length = buffer->len; | |
| 119 | 120 | |
| 120 | 121 | trace("buffer->len=%d rc=%d",buffer->len,buffer->rc); |
| 121 | 122 | |
| ... | ... | @@ -162,6 +163,7 @@ |
| 162 | 163 | { |
| 163 | 164 | char * inBuffer = NULL; |
| 164 | 165 | char * outBuffer = NULL; |
| 166 | + size_t szOutBuffer; | |
| 165 | 167 | |
| 166 | 168 | if(*length < 0 || *length > HLLAPI_MAXLENGTH) |
| 167 | 169 | { |
| ... | ... | @@ -169,6 +171,8 @@ |
| 169 | 171 | return 0; |
| 170 | 172 | } |
| 171 | 173 | |
| 174 | + szOutBuffer = (size_t) *length; | |
| 175 | + | |
| 172 | 176 | // Copy input argument |
| 173 | 177 | if(*length) |
| 174 | 178 | { |
| ... | ... | @@ -187,7 +191,7 @@ |
| 187 | 191 | *rc = cmd_connect_ps(inBuffer); |
| 188 | 192 | if(!*rc) |
| 189 | 193 | { |
| 190 | - outBuffer = run_query(*func, inBuffer, *length, rc); | |
| 194 | + outBuffer = run_query(*func, inBuffer, &szOutBuffer, rc); | |
| 191 | 195 | if(*rc) |
| 192 | 196 | { |
| 193 | 197 | trace("Closing pipe rc=%d",*rc); |
| ... | ... | @@ -205,7 +209,7 @@ |
| 205 | 209 | } |
| 206 | 210 | else |
| 207 | 211 | { |
| 208 | - outBuffer = run_query(*func, inBuffer, *length, rc); | |
| 212 | + outBuffer = run_query(*func, inBuffer, &szOutBuffer, rc); | |
| 209 | 213 | CloseHandle(hPipe); |
| 210 | 214 | hPipe = INVALID_HANDLE_VALUE; |
| 211 | 215 | } |
| ... | ... | @@ -214,14 +218,18 @@ |
| 214 | 218 | |
| 215 | 219 | default: |
| 216 | 220 | trace("Calling function %d",(int) *func); |
| 217 | - outBuffer = run_query(*func, inBuffer, *length, rc); | |
| 221 | + outBuffer = run_query(*func, inBuffer, &szOutBuffer, rc); | |
| 218 | 222 | } |
| 219 | 223 | |
| 220 | 224 | if(*rc) |
| 221 | 225 | copyString(buffer,length,strerror(*rc)); |
| 222 | 226 | else if(outBuffer) |
| 223 | - copyString(buffer,length,outBuffer); | |
| 227 | + { | |
| 228 | + if(szOutBuffer < *length) | |
| 229 | + *length = szOutBuffer; | |
| 224 | 230 | |
| 231 | + copyString(buffer,length,outBuffer); | |
| 232 | + } | |
| 225 | 233 | if(outBuffer) |
| 226 | 234 | free(outBuffer); |
| 227 | 235 | ... | ... |
src/plugins/remotectl/pipesource.c
| ... | ... | @@ -66,7 +66,7 @@ |
| 66 | 66 | |
| 67 | 67 | static void wait_for_client(pipe_source *source) |
| 68 | 68 | { |
| 69 | - v3270_set_script(pw3270_get_terminal_widget(NULL),'H',0); | |
| 69 | + set_active(FALSE); | |
| 70 | 70 | if(ConnectNamedPipe(source->hPipe,&source->overlap)) |
| 71 | 71 | { |
| 72 | 72 | popup_lasterror("%s",_( "Error in ConnectNamedPipe" )); |
| ... | ... | @@ -84,7 +84,7 @@ static void wait_for_client(pipe_source *source) |
| 84 | 84 | // Client is already connected, so signal an event. |
| 85 | 85 | case ERROR_PIPE_CONNECTED: |
| 86 | 86 | trace("%s: ERROR_PIPE_CONNECTED",__FUNCTION__); |
| 87 | - v3270_set_script(pw3270_get_terminal_widget(NULL),'H',1); | |
| 87 | + set_active(TRUE); | |
| 88 | 88 | if(SetEvent(source->overlap.hEvent)) |
| 89 | 89 | break; |
| 90 | 90 | |
| ... | ... | @@ -137,21 +137,101 @@ static void wait_for_client(pipe_source *source) |
| 137 | 137 | |
| 138 | 138 | static void process_input(pipe_source *source, DWORD cbRead) |
| 139 | 139 | { |
| 140 | - HLLAPI_DATA *data = (HLLAPI_DATA *) source->buffer; | |
| 140 | + HLLAPI_DATA * data = (HLLAPI_DATA *) source->buffer; | |
| 141 | + QUERY * qry = g_malloc0(sizeof(QUERY)+cbRead+1); | |
| 141 | 142 | |
| 142 | - source->buffer[cbRead] = 0; | |
| 143 | + qry->hPipe = source->hPipe; | |
| 144 | + qry->text = (const gchar *) (qry+1); | |
| 143 | 145 | |
| 144 | 146 | if(data->id == 0x01) |
| 145 | 147 | { |
| 146 | - DWORD wrote; | |
| 147 | - data->rc = run_hllapi(data->func,data->string,data->len,data->rc); | |
| 148 | - wrote = sizeof(HLLAPI_DATA)+data->len; | |
| 148 | + // HLLAPI query | |
| 149 | + qry->cmd = (int) data->func; | |
| 150 | + qry->pos = (int) data->rc; | |
| 151 | + qry->length = data->len; | |
| 152 | + memcpy((gchar *)(qry->text),data->string,qry->length); | |
| 153 | + } | |
| 154 | + else | |
| 155 | + { | |
| 156 | + qry->cmd = -1; | |
| 157 | + } | |
| 158 | + | |
| 159 | + enqueue_request(qry); | |
| 160 | + } | |
| 161 | + | |
| 162 | + void request_complete(QUERY *qry, int rc, const gchar *text) | |
| 163 | + { | |
| 164 | + request_buffer(qry,rc,strlen(text),(const gpointer) text); | |
| 165 | + } | |
| 166 | + | |
| 167 | + void request_status(QUERY *qry, int rc) | |
| 168 | + { | |
| 169 | + if(rc) | |
| 170 | + { | |
| 171 | + const gchar *msg = strerror(rc); | |
| 172 | + request_buffer(qry, rc, strlen(msg), (const gpointer) msg); | |
| 173 | + } | |
| 174 | + else | |
| 175 | + { | |
| 176 | + request_buffer(qry, rc, 0, NULL); | |
| 177 | + } | |
| 178 | +/* | |
| 179 | + HLLAPI_DATA data; | |
| 180 | + | |
| 181 | + memset(&data,0,sizeof(data)); | |
| 182 | + | |
| 183 | + data.id = 0x01; | |
| 184 | + data.func = qry->cmd; | |
| 185 | + data.rc = rc; | |
| 186 | + | |
| 187 | + trace("rc=%d",rc); | |
| 188 | + | |
| 189 | +#ifdef WIN32 | |
| 190 | + { | |
| 191 | + DWORD wrote = sizeof(data); | |
| 192 | + WriteFile(qry->hPipe,&data,wrote,&wrote,NULL); | |
| 193 | + } | |
| 194 | +#endif // WIN32 | |
| 195 | + | |
| 196 | + g_free(qry); | |
| 197 | +*/ | |
| 198 | + } | |
| 149 | 199 | |
| 150 | - trace("%s rc=%d",__FUNCTION__,(int) data->rc); | |
| 200 | + void request_buffer(QUERY *qry, int rc, size_t szBuffer, const gpointer buffer) | |
| 201 | + { | |
| 202 | + size_t sz; | |
| 203 | + HLLAPI_DATA *data; | |
| 151 | 204 | |
| 152 | - WriteFile(source->hPipe,data,wrote,&wrote,NULL); | |
| 205 | + if(buffer) | |
| 206 | + { | |
| 207 | + sz = sizeof(HLLAPI_DATA)+szBuffer; | |
| 208 | + data = g_malloc0(sz); | |
| 209 | + data->len = szBuffer; | |
| 210 | + memcpy(data->string,buffer,szBuffer); | |
| 211 | + } | |
| 212 | + else | |
| 213 | + { | |
| 214 | + sz = sizeof(HLLAPI_DATA); | |
| 215 | + data = g_malloc0(sz); | |
| 153 | 216 | } |
| 154 | 217 | |
| 218 | + data->id = 0x01; | |
| 219 | + data->func = qry->cmd; | |
| 220 | + data->rc = rc; | |
| 221 | + | |
| 222 | + trace("rc=%d data->len=%d",rc,(int) data->len); | |
| 223 | + | |
| 224 | +#ifdef WIN32 | |
| 225 | + { | |
| 226 | + DWORD wrote = sz; | |
| 227 | + WriteFile(qry->hPipe,data,wrote,&wrote,NULL); | |
| 228 | + trace("Wrote=%d len=%d",(int) wrote, (int) sz); | |
| 229 | + } | |
| 230 | +#endif // WIN32 | |
| 231 | + | |
| 232 | + g_free(data); | |
| 233 | + g_free(qry); | |
| 234 | + | |
| 155 | 235 | } |
| 156 | 236 | |
| 157 | 237 | static void read_input_pipe(pipe_source *source) |
| ... | ... | @@ -179,9 +259,10 @@ static void wait_for_client(pipe_source *source) |
| 179 | 259 | |
| 180 | 260 | case ERROR_BROKEN_PIPE: |
| 181 | 261 | trace("%s: ERROR_BROKEN_PIPE",__FUNCTION__); |
| 262 | + | |
| 182 | 263 | if(!DisconnectNamedPipe(source->hPipe)) |
| 183 | 264 | { |
| 184 | - v3270_set_script(pw3270_get_terminal_widget(NULL),'H',0); | |
| 265 | + set_active(FALSE); | |
| 185 | 266 | popup_lasterror("%s",_( "Error in DisconnectNamedPipe" )); |
| 186 | 267 | } |
| 187 | 268 | else |
| ... | ... | @@ -192,7 +273,7 @@ static void wait_for_client(pipe_source *source) |
| 192 | 273 | |
| 193 | 274 | case ERROR_PIPE_NOT_CONNECTED: |
| 194 | 275 | trace("%s: ERROR_PIPE_NOT_CONNECTED",__FUNCTION__); |
| 195 | - v3270_set_script(pw3270_get_terminal_widget(NULL),'H',0); | |
| 276 | + set_active(FALSE); | |
| 196 | 277 | break; |
| 197 | 278 | |
| 198 | 279 | default: |
| ... | ... | @@ -227,7 +308,7 @@ static void wait_for_client(pipe_source *source) |
| 227 | 308 | if(fSuccess) |
| 228 | 309 | { |
| 229 | 310 | trace("Pipe connected (cbRet=%d)",(int) cbRead); |
| 230 | - v3270_set_script(pw3270_get_terminal_widget(NULL),'H',1); | |
| 311 | + set_active(TRUE); | |
| 231 | 312 | ((pipe_source *) source)->state = PIPE_STATE_READ; |
| 232 | 313 | } |
| 233 | 314 | else | ... | ... |
src/plugins/remotectl/remotectl.c
| ... | ... | @@ -41,7 +41,7 @@ |
| 41 | 41 | |
| 42 | 42 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 43 | 43 | |
| 44 | - static const gchar control_char = '@'; | |
| 44 | + static const gchar control_char = '@'; | |
| 45 | 45 | |
| 46 | 46 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 47 | 47 | |
| ... | ... | @@ -137,55 +137,64 @@ |
| 137 | 137 | #error Nao implementado |
| 138 | 138 | |
| 139 | 139 | #endif // WIN32 |
| 140 | + | |
| 141 | + set_active(FALSE); | |
| 142 | + | |
| 140 | 143 | return 0; |
| 141 | 144 | } |
| 142 | 145 | |
| 143 | - static int cmd_connectps(H3270 *hSession, unsigned short rc, char *string, unsigned short length) | |
| 146 | + static void cmd_connectps(QUERY *qry) | |
| 144 | 147 | { |
| 145 | 148 | g_message("%s","HLLAPI ConnectPS request received"); |
| 146 | - return v3270_set_script(pw3270_get_terminal_widget(NULL),'H',1); | |
| 149 | + request_status(qry,v3270_set_script(pw3270_get_terminal_widget(NULL),'H',TRUE)); | |
| 147 | 150 | } |
| 148 | 151 | |
| 149 | - static int cmd_disconnectps(H3270 *hSession, unsigned short rc, char *string, unsigned short length) | |
| 152 | + static void cmd_disconnectps(QUERY *qry) | |
| 150 | 153 | { |
| 151 | 154 | g_message("%s","HLLAPI DisconnectPS request received"); |
| 152 | - return 0; | |
| 155 | + request_status(qry,0); | |
| 153 | 156 | } |
| 154 | 157 | |
| 155 | - static int cmd_getrevision(H3270 *hSession, unsigned short rc, char *string, unsigned short length) | |
| 158 | + static void cmd_getrevision(QUERY *qry) | |
| 156 | 159 | { |
| 157 | - strncpy(string,lib3270_get_revision(),length); | |
| 158 | - return 0; | |
| 160 | + request_complete(qry,0,lib3270_get_revision()); | |
| 159 | 161 | } |
| 160 | 162 | |
| 161 | - static int cmd_setcursor(H3270 *hSession, unsigned short rc, char *string, unsigned short length) | |
| 163 | + static void cmd_setcursor(QUERY *qry) | |
| 162 | 164 | { |
| 163 | - if(!lib3270_connected(hSession)) | |
| 164 | - return ENOTCONN; | |
| 165 | + int rc = ENOTCONN; | |
| 165 | 166 | |
| 166 | - trace("%s: pos=%d row=%d col=%d",__FUNCTION__,rc,rc/80,rc%80); | |
| 167 | - lib3270_set_cursor_address(hSession,((int) rc) -1); | |
| 168 | - return 0; | |
| 167 | + if(lib3270_connected(qry->hSession)) | |
| 168 | + { | |
| 169 | + trace("%s: pos=%d row=%d col=%d",__FUNCTION__,rc,rc/80,rc%80); | |
| 170 | + lib3270_set_cursor_address(qry->hSession,qry->pos -1); | |
| 171 | + rc = 0; | |
| 172 | + } | |
| 173 | + | |
| 174 | + request_status(qry,rc); | |
| 169 | 175 | } |
| 170 | 176 | |
| 171 | - static int cmd_sendstring(H3270 *hSession, unsigned short dunno, char *buffer, unsigned short length) | |
| 177 | + static void cmd_sendstring(QUERY *qry) | |
| 172 | 178 | { |
| 173 | 179 | gchar * text; |
| 174 | 180 | GError * error = NULL; |
| 175 | 181 | gsize bytes_read; |
| 176 | 182 | gsize bytes_written; |
| 177 | 183 | const gchar * charset; |
| 178 | - int rc = -1; | |
| 179 | 184 | |
| 180 | - if(!lib3270_connected(hSession)) | |
| 181 | - return ENOTCONN; | |
| 185 | + if(!lib3270_connected(qry->hSession)) | |
| 186 | + { | |
| 187 | + request_status(qry,ENOTCONN); | |
| 188 | + return; | |
| 189 | + } | |
| 182 | 190 | |
| 183 | 191 | g_get_charset(&charset); |
| 184 | 192 | |
| 185 | - text = g_convert(buffer,length,lib3270_get_charset(hSession),charset,&bytes_read,&bytes_written,&error); | |
| 193 | + text = g_convert(qry->text,qry->length,lib3270_get_charset(qry->hSession),charset,&bytes_read,&bytes_written,&error); | |
| 186 | 194 | if(text) |
| 187 | 195 | { |
| 188 | - rc = 0; | |
| 196 | + int rc = 0; | |
| 197 | + | |
| 189 | 198 | if(strchr(text,control_char)) |
| 190 | 199 | { |
| 191 | 200 | // Convert control char |
| ... | ... | @@ -196,7 +205,7 @@ |
| 196 | 205 | { |
| 197 | 206 | *(ptr++) = 0; |
| 198 | 207 | |
| 199 | - lib3270_emulate_input(hSession,buffer,-1,0); | |
| 208 | + lib3270_emulate_input(qry->hSession,buffer,-1,0); | |
| 200 | 209 | |
| 201 | 210 | switch(*(ptr++)) |
| 202 | 211 | { |
| ... | ... | @@ -205,112 +214,160 @@ |
| 205 | 214 | break; |
| 206 | 215 | |
| 207 | 216 | case 'E': // Enter |
| 208 | - lib3270_enter(hSession); | |
| 217 | + lib3270_enter(qry->hSession); | |
| 209 | 218 | break; |
| 210 | 219 | |
| 211 | 220 | case 'F': // Erase EOF |
| 212 | - lib3270_eraseeof(hSession); | |
| 221 | + lib3270_eraseeof(qry->hSession); | |
| 213 | 222 | break; |
| 214 | 223 | |
| 215 | 224 | case '1': // PF1 |
| 216 | - lib3270_pfkey(hSession,1); | |
| 225 | + lib3270_pfkey(qry->hSession,1); | |
| 217 | 226 | break; |
| 218 | 227 | |
| 219 | 228 | case '2': // PF2 |
| 220 | - lib3270_pfkey(hSession,2); | |
| 229 | + lib3270_pfkey(qry->hSession,2); | |
| 221 | 230 | break; |
| 222 | 231 | |
| 223 | 232 | case '3': // PF3 |
| 224 | - lib3270_pfkey(hSession,3); | |
| 233 | + lib3270_pfkey(qry->hSession,3); | |
| 225 | 234 | break; |
| 226 | 235 | |
| 227 | 236 | case '4': // PF4 |
| 228 | - lib3270_pfkey(hSession,4); | |
| 237 | + lib3270_pfkey(qry->hSession,4); | |
| 229 | 238 | break; |
| 230 | 239 | |
| 231 | 240 | case '5': // PF5 |
| 232 | - lib3270_pfkey(hSession,5); | |
| 241 | + lib3270_pfkey(qry->hSession,5); | |
| 233 | 242 | break; |
| 234 | 243 | |
| 235 | 244 | case '6': // PF6 |
| 236 | - lib3270_pfkey(hSession,6); | |
| 245 | + lib3270_pfkey(qry->hSession,6); | |
| 237 | 246 | break; |
| 238 | 247 | |
| 239 | 248 | case '7': // PF7 |
| 240 | - lib3270_pfkey(hSession,7); | |
| 249 | + lib3270_pfkey(qry->hSession,7); | |
| 241 | 250 | break; |
| 242 | 251 | |
| 243 | 252 | case '8': // PF8 |
| 244 | - lib3270_pfkey(hSession,8); | |
| 253 | + lib3270_pfkey(qry->hSession,8); | |
| 245 | 254 | break; |
| 246 | 255 | |
| 247 | 256 | case '9': // PF9 |
| 248 | - lib3270_pfkey(hSession,9); | |
| 257 | + lib3270_pfkey(qry->hSession,9); | |
| 249 | 258 | break; |
| 250 | 259 | |
| 251 | 260 | case 'a': // PF10 |
| 252 | - lib3270_pfkey(hSession,10); | |
| 261 | + lib3270_pfkey(qry->hSession,10); | |
| 253 | 262 | break; |
| 254 | 263 | |
| 255 | 264 | case 'b': // PF11 |
| 256 | - lib3270_pfkey(hSession,11); | |
| 265 | + lib3270_pfkey(qry->hSession,11); | |
| 257 | 266 | break; |
| 258 | 267 | |
| 259 | 268 | case 'c': // PF12 |
| 260 | - lib3270_pfkey(hSession,12); | |
| 269 | + lib3270_pfkey(qry->hSession,12); | |
| 261 | 270 | break; |
| 262 | 271 | } |
| 263 | 272 | |
| 264 | 273 | } |
| 265 | 274 | |
| 266 | - lib3270_emulate_input(hSession,buffer,-1,0); | |
| 275 | + lib3270_emulate_input(qry->hSession,buffer,-1,0); | |
| 267 | 276 | |
| 268 | 277 | } |
| 269 | 278 | else |
| 270 | 279 | { |
| 271 | - lib3270_emulate_input(hSession,text,strlen(text),0); | |
| 280 | + lib3270_emulate_input(qry->hSession,text,strlen(text),0); | |
| 272 | 281 | } |
| 273 | 282 | g_free(text); |
| 283 | + | |
| 284 | + request_status(qry,rc); | |
| 285 | + | |
| 286 | + return; | |
| 274 | 287 | } |
| 275 | - else | |
| 288 | + | |
| 289 | + request_complete(qry, error->code, error->message); | |
| 290 | + g_error_free(error); | |
| 291 | + | |
| 292 | + } | |
| 293 | + | |
| 294 | + struct wait | |
| 295 | + { | |
| 296 | + QUERY * qry; | |
| 297 | + time_t end; | |
| 298 | + }; | |
| 299 | + | |
| 300 | + static gboolean do_wait(struct wait *w) | |
| 301 | + { | |
| 302 | + if(lib3270_get_program_message(w->qry->hSession) == LIB3270_MESSAGE_NONE) | |
| 276 | 303 | { |
| 277 | - strncpy(buffer,error->message,length); | |
| 278 | - rc = error->code; | |
| 279 | - g_error_free(error); | |
| 304 | + request_status(w->qry,0); | |
| 305 | + return FALSE; | |
| 280 | 306 | } |
| 281 | 307 | |
| 282 | - return rc; | |
| 308 | + if(time(0) > w->end) | |
| 309 | + { | |
| 310 | + trace("%s: TIMEOUT",__FUNCTION__); | |
| 311 | + request_status(w->qry,ETIMEDOUT); | |
| 312 | + return FALSE; | |
| 313 | + } | |
| 314 | + | |
| 315 | + return TRUE; | |
| 283 | 316 | } |
| 284 | 317 | |
| 285 | - static int cmd_wait(H3270 *hSession, unsigned short rc, char *text, unsigned short length) | |
| 318 | + static void cmd_wait(QUERY *qry) | |
| 286 | 319 | { |
| 287 | - return lib3270_wait_for_ready(hSession,pw3270_get_integer(pw3270_get_toplevel(),"hllapi","wait",2)); | |
| 320 | + struct wait *w; | |
| 321 | + | |
| 322 | + if(lib3270_get_program_message(qry->hSession) == LIB3270_MESSAGE_NONE) | |
| 323 | + { | |
| 324 | + request_status(qry,0); | |
| 325 | + return; | |
| 326 | + } | |
| 327 | + | |
| 328 | + w = g_malloc0(sizeof(struct wait)); | |
| 329 | + w->qry = qry; | |
| 330 | + w->end = time(0)+pw3270_get_integer(pw3270_get_toplevel(),"hllapi","wait",2); | |
| 331 | + | |
| 332 | + g_timeout_add_full(G_PRIORITY_DEFAULT, (guint) 300, (GSourceFunc) do_wait, w, g_free); | |
| 288 | 333 | } |
| 289 | 334 | |
| 290 | - static int cmd_copypstostr(H3270 *hSession, unsigned short pos, char *outBuff, unsigned short length) | |
| 335 | + static void cmd_copypstostr(QUERY *qry) | |
| 291 | 336 | { |
| 292 | 337 | int rows; |
| 293 | 338 | int cols; |
| 294 | 339 | unsigned short * attr; |
| 295 | 340 | unsigned char * text; |
| 296 | 341 | int rc; |
| 342 | + unsigned char * buffer; | |
| 343 | + size_t length; | |
| 297 | 344 | |
| 298 | - lib3270_get_screen_size(hSession,&rows,&cols); | |
| 345 | + if(!lib3270_connected(qry->hSession)) | |
| 346 | + { | |
| 347 | + request_status(qry,ENOTCONN); | |
| 348 | + return; | |
| 349 | + } | |
| 299 | 350 | |
| 300 | - if(pos < 1 || (pos+length) >= (rows*cols)) | |
| 301 | - return EINVAL; | |
| 351 | + lib3270_get_screen_size(qry->hSession,&rows,&cols); | |
| 352 | + | |
| 353 | + if(qry->pos < 1 || (qry->pos+qry->length) >= (rows*cols)) | |
| 354 | + { | |
| 355 | + request_status(qry,EINVAL); | |
| 356 | + return; | |
| 357 | + } | |
| 302 | 358 | |
| 303 | - pos--; | |
| 359 | + qry->pos--; | |
| 304 | 360 | |
| 305 | - attr = g_new0(unsigned short, length+0); | |
| 306 | - text = g_new0(unsigned char, length+1); | |
| 361 | + length = (qry->length * sizeof(unsigned short)) + qry->length + 2; | |
| 362 | + text = buffer = g_malloc0(length+1); | |
| 363 | + attr = (unsigned short *) (text+qry->length+1); | |
| 307 | 364 | |
| 308 | - trace("%s: pos=%d length=%d",__FUNCTION__,pos,length); | |
| 309 | - rc = lib3270_get_contents(hSession,pos,pos+(length-1),text,attr); | |
| 365 | + trace("%s: pos=%d length=%d",__FUNCTION__,qry->pos,qry->length); | |
| 366 | + rc = lib3270_get_contents(qry->hSession,qry->pos,qry->pos+(qry->length-1),text,attr); | |
| 310 | 367 | |
| 311 | 368 | if(rc) |
| 312 | 369 | { |
| 313 | - strncpy(outBuff,strerror(rc),length); | |
| 370 | + request_status(qry,rc); | |
| 314 | 371 | } |
| 315 | 372 | else |
| 316 | 373 | { |
| ... | ... | @@ -324,44 +381,66 @@ |
| 324 | 381 | |
| 325 | 382 | g_get_charset(&charset); |
| 326 | 383 | |
| 327 | - local = g_convert((const gchar *) text,length,charset,lib3270_get_charset(hSession),&bytes_read,&bytes_written,&error); | |
| 328 | - | |
| 329 | - g_free(attr); | |
| 330 | - g_free(text); | |
| 384 | + local = g_convert((const gchar *) text,-1,charset,lib3270_get_charset(qry->hSession),&bytes_read,&bytes_written,&error); | |
| 331 | 385 | |
| 332 | 386 | if(!local) |
| 333 | 387 | { |
| 334 | - rc = error->code; | |
| 335 | - strncpy(outBuff,error->message,length); | |
| 388 | + request_complete(qry,error->code,error->message); | |
| 336 | 389 | g_error_free(error); |
| 337 | 390 | } |
| 338 | 391 | else |
| 339 | 392 | { |
| 340 | - strncpy(outBuff,(const char *) local,length); | |
| 393 | + strncpy((char *) text,(const char *) local,qry->length); | |
| 394 | + | |
| 395 | + trace("response: [%s] len=%d",buffer,length); | |
| 396 | + request_buffer(qry,0,length,buffer); | |
| 341 | 397 | g_free(local); |
| 342 | 398 | } |
| 343 | 399 | } |
| 344 | - return rc; | |
| 400 | + | |
| 401 | + g_free(buffer); | |
| 345 | 402 | } |
| 346 | 403 | |
| 347 | - int run_hllapi(unsigned long function, char *string, unsigned short length, unsigned short rc) | |
| 404 | + void enqueue_request(QUERY *qry) | |
| 348 | 405 | { |
| 349 | 406 | static const struct _cmd |
| 350 | 407 | { |
| 351 | - unsigned long function; | |
| 352 | - int (*exec)(H3270 *hSession, unsigned short rc, char *string, unsigned short length); | |
| 408 | + int cmd; | |
| 409 | + void (*exec)(QUERY *qry); | |
| 353 | 410 | } cmd[] = |
| 354 | 411 | { |
| 355 | 412 | { HLLAPI_CMD_CONNECTPS, cmd_connectps }, |
| 356 | 413 | { HLLAPI_CMD_DISCONNECTPS, cmd_disconnectps }, |
| 357 | 414 | { HLLAPI_CMD_INPUTSTRING, cmd_sendstring }, |
| 358 | - { HLLAPI_CMD_WAIT, cmd_wait }, | |
| 359 | 415 | { HLLAPI_CMD_SETCURSOR, cmd_setcursor }, |
| 360 | 416 | { HLLAPI_CMD_GETREVISION, cmd_getrevision }, |
| 361 | - { HLLAPI_CMD_COPYPSTOSTR, cmd_copypstostr } | |
| 417 | + { HLLAPI_CMD_COPYPSTOSTR, cmd_copypstostr }, | |
| 418 | + { HLLAPI_CMD_WAIT, cmd_wait }, | |
| 362 | 419 | }; |
| 420 | + | |
| 363 | 421 | int f; |
| 364 | 422 | |
| 423 | + trace("HLLAPI function %d",(int) qry->cmd); | |
| 424 | + | |
| 425 | + qry->hSession = lib3270_get_default_session_handle(); | |
| 426 | + | |
| 427 | + for(f=0;f<G_N_ELEMENTS(cmd);f++) | |
| 428 | + { | |
| 429 | + if(cmd[f].cmd == qry->cmd) | |
| 430 | + { | |
| 431 | + cmd[f].exec(qry); | |
| 432 | + return; | |
| 433 | + } | |
| 434 | + } | |
| 435 | + | |
| 436 | + g_warning("Unexpected HLLAPI function %d",(int) qry->cmd); | |
| 437 | + request_status(qry,EINVAL); | |
| 438 | + } | |
| 439 | + | |
| 440 | +/* | |
| 441 | + int run_hllapi(unsigned long function, char *string, unsigned short length, unsigned short rc) | |
| 442 | + { | |
| 443 | + | |
| 365 | 444 | trace("HLLAPI function %d",(int) function); |
| 366 | 445 | |
| 367 | 446 | for(f=0;f<G_N_ELEMENTS(cmd);f++) |
| ... | ... | @@ -373,4 +452,11 @@ |
| 373 | 452 | g_warning("Unexpected HLLAPI function %d",(int) function); |
| 374 | 453 | return EINVAL; |
| 375 | 454 | } |
| 455 | +*/ | |
| 456 | + | |
| 457 | + G_GNUC_INTERNAL void set_active(gboolean on) | |
| 458 | + { | |
| 459 | + v3270_set_script(pw3270_get_terminal_widget(NULL),'H',on); | |
| 460 | + } | |
| 461 | + | |
| 376 | 462 | ... | ... |
src/plugins/remotectl/remotectl.h
| ... | ... | @@ -42,7 +42,30 @@ |
| 42 | 42 | #include <lib3270/log.h> |
| 43 | 43 | #include <pw3270/hllapi.h> |
| 44 | 44 | |
| 45 | - int run_hllapi(unsigned long function, char *string, unsigned short length, unsigned short rc); | |
| 45 | + typedef struct _remotequery | |
| 46 | + { | |
| 47 | +#ifdef WIN32 | |
| 48 | + HANDLE hPipe; /**< Pipe handle (for response) */ | |
| 49 | +#endif // WIN32 | |
| 50 | + | |
| 51 | + H3270 * hSession; /**< 3270 Session */ | |
| 52 | + int cmd; /**< Command */ | |
| 53 | + int rc; /**< Response status */ | |
| 54 | + | |
| 55 | + int pos; | |
| 56 | + unsigned short length; /**< Query string length */ | |
| 57 | + const gchar * text; /**< Query string */ | |
| 58 | + | |
| 59 | + } QUERY; | |
| 60 | + | |
| 61 | + G_GNUC_INTERNAL void set_active(gboolean on); | |
| 62 | + G_GNUC_INTERNAL void enqueue_request(QUERY *qry); | |
| 63 | + G_GNUC_INTERNAL void request_complete(QUERY *qry, int rc, const gchar *text); | |
| 64 | + G_GNUC_INTERNAL void request_status(QUERY *qry, int rc); | |
| 65 | + G_GNUC_INTERNAL void request_buffer(QUERY *qry, int rc, size_t sz, const gpointer buffer); | |
| 66 | + | |
| 67 | +// int run_hllapi(unsigned long function, char *string, unsigned short length, unsigned short rc); | |
| 68 | + | |
| 46 | 69 | |
| 47 | 70 | #ifdef WIN32 |
| 48 | 71 | ... | ... |
src/pw3270/v3270/oia.c
| ... | ... | @@ -1087,7 +1087,7 @@ static void release_script(v3270 *widget) |
| 1087 | 1087 | widget->script.id = 0; |
| 1088 | 1088 | } |
| 1089 | 1089 | |
| 1090 | -LIB3270_EXPORT int v3270_set_script(GtkWidget *widget, const gchar id, unsigned char on) | |
| 1090 | +LIB3270_EXPORT int v3270_set_script(GtkWidget *widget, const gchar id, gboolean on) | |
| 1091 | 1091 | { |
| 1092 | 1092 | v3270 *terminal; |
| 1093 | 1093 | g_return_val_if_fail(GTK_IS_V3270(widget),EINVAL); | ... | ... |