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,7 +186,7 @@ | ||
| 186 | LIB3270_EXPORT void v3270_popup_message(GtkWidget *widget, LIB3270_NOTIFY type, const gchar *title, const gchar *message, const gchar *text); | 186 | LIB3270_EXPORT void v3270_popup_message(GtkWidget *widget, LIB3270_NOTIFY type, const gchar *title, const gchar *message, const gchar *text); |
| 187 | LIB3270_EXPORT const gchar * v3270_get_session_name(GtkWidget *widget); | 187 | LIB3270_EXPORT const gchar * v3270_get_session_name(GtkWidget *widget); |
| 188 | LIB3270_EXPORT void v3270_set_session_name(GtkWidget *widget, const gchar *name); | 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 | LIB3270_EXPORT void v3270_set_scaled_fonts(GtkWidget *widget, gboolean on); | 190 | LIB3270_EXPORT void v3270_set_scaled_fonts(GtkWidget *widget, gboolean on); |
| 191 | 191 | ||
| 192 | LIB3270_EXPORT void v3270_set_host(GtkWidget *widget, const gchar *uri); | 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,6 +726,9 @@ LIB3270_EXPORT int lib3270_wait_for_ready(H3270 *hSession, int seconds) | ||
| 726 | { | 726 | { |
| 727 | time_t end = time(0)+seconds; | 727 | time_t end = time(0)+seconds; |
| 728 | 728 | ||
| 729 | + if(hSession->oia_status == LIB3270_STATUS_BLANK) | ||
| 730 | + return 0; | ||
| 731 | + | ||
| 729 | while(time(0) < end) | 732 | while(time(0) < end) |
| 730 | { | 733 | { |
| 731 | event_dispatcher(hSession,1); | 734 | event_dispatcher(hSession,1); |
src/plugins/remotectl/hllapi.c
| @@ -79,7 +79,7 @@ | @@ -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 | char *outBuffer = NULL; | 84 | char *outBuffer = NULL; |
| 85 | 85 | ||
| @@ -93,7 +93,7 @@ | @@ -93,7 +93,7 @@ | ||
| 93 | else | 93 | else |
| 94 | { | 94 | { |
| 95 | HLLAPI_DATA *buffer = malloc(HLLAPI_MAXLENGTH+1); | 95 | HLLAPI_DATA *buffer = malloc(HLLAPI_MAXLENGTH+1); |
| 96 | - DWORD cbSize = sizeof(HLLAPI_DATA) + length; | 96 | + DWORD cbSize = sizeof(HLLAPI_DATA) + *length; |
| 97 | HLLAPI_DATA *data = malloc(cbSize+1); | 97 | HLLAPI_DATA *data = malloc(cbSize+1); |
| 98 | 98 | ||
| 99 | memset(buffer,0,HLLAPI_MAXLENGTH); | 99 | memset(buffer,0,HLLAPI_MAXLENGTH); |
| @@ -101,10 +101,10 @@ | @@ -101,10 +101,10 @@ | ||
| 101 | data->id = HLLAPI_REQUEST_ID; | 101 | data->id = HLLAPI_REQUEST_ID; |
| 102 | data->func = func; | 102 | data->func = func; |
| 103 | data->rc = *rc; | 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 | memset(buffer,0,HLLAPI_MAXLENGTH); | 109 | memset(buffer,0,HLLAPI_MAXLENGTH); |
| 110 | 110 | ||
| @@ -115,7 +115,8 @@ | @@ -115,7 +115,8 @@ | ||
| 115 | } | 115 | } |
| 116 | else | 116 | else |
| 117 | { | 117 | { |
| 118 | - *rc = buffer->rc; | 118 | + *rc = buffer->rc; |
| 119 | + *length = buffer->len; | ||
| 119 | 120 | ||
| 120 | trace("buffer->len=%d rc=%d",buffer->len,buffer->rc); | 121 | trace("buffer->len=%d rc=%d",buffer->len,buffer->rc); |
| 121 | 122 | ||
| @@ -162,6 +163,7 @@ | @@ -162,6 +163,7 @@ | ||
| 162 | { | 163 | { |
| 163 | char * inBuffer = NULL; | 164 | char * inBuffer = NULL; |
| 164 | char * outBuffer = NULL; | 165 | char * outBuffer = NULL; |
| 166 | + size_t szOutBuffer; | ||
| 165 | 167 | ||
| 166 | if(*length < 0 || *length > HLLAPI_MAXLENGTH) | 168 | if(*length < 0 || *length > HLLAPI_MAXLENGTH) |
| 167 | { | 169 | { |
| @@ -169,6 +171,8 @@ | @@ -169,6 +171,8 @@ | ||
| 169 | return 0; | 171 | return 0; |
| 170 | } | 172 | } |
| 171 | 173 | ||
| 174 | + szOutBuffer = (size_t) *length; | ||
| 175 | + | ||
| 172 | // Copy input argument | 176 | // Copy input argument |
| 173 | if(*length) | 177 | if(*length) |
| 174 | { | 178 | { |
| @@ -187,7 +191,7 @@ | @@ -187,7 +191,7 @@ | ||
| 187 | *rc = cmd_connect_ps(inBuffer); | 191 | *rc = cmd_connect_ps(inBuffer); |
| 188 | if(!*rc) | 192 | if(!*rc) |
| 189 | { | 193 | { |
| 190 | - outBuffer = run_query(*func, inBuffer, *length, rc); | 194 | + outBuffer = run_query(*func, inBuffer, &szOutBuffer, rc); |
| 191 | if(*rc) | 195 | if(*rc) |
| 192 | { | 196 | { |
| 193 | trace("Closing pipe rc=%d",*rc); | 197 | trace("Closing pipe rc=%d",*rc); |
| @@ -205,7 +209,7 @@ | @@ -205,7 +209,7 @@ | ||
| 205 | } | 209 | } |
| 206 | else | 210 | else |
| 207 | { | 211 | { |
| 208 | - outBuffer = run_query(*func, inBuffer, *length, rc); | 212 | + outBuffer = run_query(*func, inBuffer, &szOutBuffer, rc); |
| 209 | CloseHandle(hPipe); | 213 | CloseHandle(hPipe); |
| 210 | hPipe = INVALID_HANDLE_VALUE; | 214 | hPipe = INVALID_HANDLE_VALUE; |
| 211 | } | 215 | } |
| @@ -214,14 +218,18 @@ | @@ -214,14 +218,18 @@ | ||
| 214 | 218 | ||
| 215 | default: | 219 | default: |
| 216 | trace("Calling function %d",(int) *func); | 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 | if(*rc) | 224 | if(*rc) |
| 221 | copyString(buffer,length,strerror(*rc)); | 225 | copyString(buffer,length,strerror(*rc)); |
| 222 | else if(outBuffer) | 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 | if(outBuffer) | 233 | if(outBuffer) |
| 226 | free(outBuffer); | 234 | free(outBuffer); |
| 227 | 235 |
src/plugins/remotectl/pipesource.c
| @@ -66,7 +66,7 @@ | @@ -66,7 +66,7 @@ | ||
| 66 | 66 | ||
| 67 | static void wait_for_client(pipe_source *source) | 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 | if(ConnectNamedPipe(source->hPipe,&source->overlap)) | 70 | if(ConnectNamedPipe(source->hPipe,&source->overlap)) |
| 71 | { | 71 | { |
| 72 | popup_lasterror("%s",_( "Error in ConnectNamedPipe" )); | 72 | popup_lasterror("%s",_( "Error in ConnectNamedPipe" )); |
| @@ -84,7 +84,7 @@ static void wait_for_client(pipe_source *source) | @@ -84,7 +84,7 @@ static void wait_for_client(pipe_source *source) | ||
| 84 | // Client is already connected, so signal an event. | 84 | // Client is already connected, so signal an event. |
| 85 | case ERROR_PIPE_CONNECTED: | 85 | case ERROR_PIPE_CONNECTED: |
| 86 | trace("%s: ERROR_PIPE_CONNECTED",__FUNCTION__); | 86 | trace("%s: ERROR_PIPE_CONNECTED",__FUNCTION__); |
| 87 | - v3270_set_script(pw3270_get_terminal_widget(NULL),'H',1); | 87 | + set_active(TRUE); |
| 88 | if(SetEvent(source->overlap.hEvent)) | 88 | if(SetEvent(source->overlap.hEvent)) |
| 89 | break; | 89 | break; |
| 90 | 90 | ||
| @@ -137,21 +137,101 @@ static void wait_for_client(pipe_source *source) | @@ -137,21 +137,101 @@ static void wait_for_client(pipe_source *source) | ||
| 137 | 137 | ||
| 138 | static void process_input(pipe_source *source, DWORD cbRead) | 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 | if(data->id == 0x01) | 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 | static void read_input_pipe(pipe_source *source) | 237 | static void read_input_pipe(pipe_source *source) |
| @@ -179,9 +259,10 @@ static void wait_for_client(pipe_source *source) | @@ -179,9 +259,10 @@ static void wait_for_client(pipe_source *source) | ||
| 179 | 259 | ||
| 180 | case ERROR_BROKEN_PIPE: | 260 | case ERROR_BROKEN_PIPE: |
| 181 | trace("%s: ERROR_BROKEN_PIPE",__FUNCTION__); | 261 | trace("%s: ERROR_BROKEN_PIPE",__FUNCTION__); |
| 262 | + | ||
| 182 | if(!DisconnectNamedPipe(source->hPipe)) | 263 | if(!DisconnectNamedPipe(source->hPipe)) |
| 183 | { | 264 | { |
| 184 | - v3270_set_script(pw3270_get_terminal_widget(NULL),'H',0); | 265 | + set_active(FALSE); |
| 185 | popup_lasterror("%s",_( "Error in DisconnectNamedPipe" )); | 266 | popup_lasterror("%s",_( "Error in DisconnectNamedPipe" )); |
| 186 | } | 267 | } |
| 187 | else | 268 | else |
| @@ -192,7 +273,7 @@ static void wait_for_client(pipe_source *source) | @@ -192,7 +273,7 @@ static void wait_for_client(pipe_source *source) | ||
| 192 | 273 | ||
| 193 | case ERROR_PIPE_NOT_CONNECTED: | 274 | case ERROR_PIPE_NOT_CONNECTED: |
| 194 | trace("%s: ERROR_PIPE_NOT_CONNECTED",__FUNCTION__); | 275 | trace("%s: ERROR_PIPE_NOT_CONNECTED",__FUNCTION__); |
| 195 | - v3270_set_script(pw3270_get_terminal_widget(NULL),'H',0); | 276 | + set_active(FALSE); |
| 196 | break; | 277 | break; |
| 197 | 278 | ||
| 198 | default: | 279 | default: |
| @@ -227,7 +308,7 @@ static void wait_for_client(pipe_source *source) | @@ -227,7 +308,7 @@ static void wait_for_client(pipe_source *source) | ||
| 227 | if(fSuccess) | 308 | if(fSuccess) |
| 228 | { | 309 | { |
| 229 | trace("Pipe connected (cbRet=%d)",(int) cbRead); | 310 | trace("Pipe connected (cbRet=%d)",(int) cbRead); |
| 230 | - v3270_set_script(pw3270_get_terminal_widget(NULL),'H',1); | 311 | + set_active(TRUE); |
| 231 | ((pipe_source *) source)->state = PIPE_STATE_READ; | 312 | ((pipe_source *) source)->state = PIPE_STATE_READ; |
| 232 | } | 313 | } |
| 233 | else | 314 | else |
src/plugins/remotectl/remotectl.c
| @@ -41,7 +41,7 @@ | @@ -41,7 +41,7 @@ | ||
| 41 | 41 | ||
| 42 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 42 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 43 | 43 | ||
| 44 | - static const gchar control_char = '@'; | 44 | + static const gchar control_char = '@'; |
| 45 | 45 | ||
| 46 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 46 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 47 | 47 | ||
| @@ -137,55 +137,64 @@ | @@ -137,55 +137,64 @@ | ||
| 137 | #error Nao implementado | 137 | #error Nao implementado |
| 138 | 138 | ||
| 139 | #endif // WIN32 | 139 | #endif // WIN32 |
| 140 | + | ||
| 141 | + set_active(FALSE); | ||
| 142 | + | ||
| 140 | return 0; | 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 | g_message("%s","HLLAPI ConnectPS request received"); | 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 | g_message("%s","HLLAPI DisconnectPS request received"); | 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 | gchar * text; | 179 | gchar * text; |
| 174 | GError * error = NULL; | 180 | GError * error = NULL; |
| 175 | gsize bytes_read; | 181 | gsize bytes_read; |
| 176 | gsize bytes_written; | 182 | gsize bytes_written; |
| 177 | const gchar * charset; | 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 | g_get_charset(&charset); | 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 | if(text) | 194 | if(text) |
| 187 | { | 195 | { |
| 188 | - rc = 0; | 196 | + int rc = 0; |
| 197 | + | ||
| 189 | if(strchr(text,control_char)) | 198 | if(strchr(text,control_char)) |
| 190 | { | 199 | { |
| 191 | // Convert control char | 200 | // Convert control char |
| @@ -196,7 +205,7 @@ | @@ -196,7 +205,7 @@ | ||
| 196 | { | 205 | { |
| 197 | *(ptr++) = 0; | 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 | switch(*(ptr++)) | 210 | switch(*(ptr++)) |
| 202 | { | 211 | { |
| @@ -205,112 +214,160 @@ | @@ -205,112 +214,160 @@ | ||
| 205 | break; | 214 | break; |
| 206 | 215 | ||
| 207 | case 'E': // Enter | 216 | case 'E': // Enter |
| 208 | - lib3270_enter(hSession); | 217 | + lib3270_enter(qry->hSession); |
| 209 | break; | 218 | break; |
| 210 | 219 | ||
| 211 | case 'F': // Erase EOF | 220 | case 'F': // Erase EOF |
| 212 | - lib3270_eraseeof(hSession); | 221 | + lib3270_eraseeof(qry->hSession); |
| 213 | break; | 222 | break; |
| 214 | 223 | ||
| 215 | case '1': // PF1 | 224 | case '1': // PF1 |
| 216 | - lib3270_pfkey(hSession,1); | 225 | + lib3270_pfkey(qry->hSession,1); |
| 217 | break; | 226 | break; |
| 218 | 227 | ||
| 219 | case '2': // PF2 | 228 | case '2': // PF2 |
| 220 | - lib3270_pfkey(hSession,2); | 229 | + lib3270_pfkey(qry->hSession,2); |
| 221 | break; | 230 | break; |
| 222 | 231 | ||
| 223 | case '3': // PF3 | 232 | case '3': // PF3 |
| 224 | - lib3270_pfkey(hSession,3); | 233 | + lib3270_pfkey(qry->hSession,3); |
| 225 | break; | 234 | break; |
| 226 | 235 | ||
| 227 | case '4': // PF4 | 236 | case '4': // PF4 |
| 228 | - lib3270_pfkey(hSession,4); | 237 | + lib3270_pfkey(qry->hSession,4); |
| 229 | break; | 238 | break; |
| 230 | 239 | ||
| 231 | case '5': // PF5 | 240 | case '5': // PF5 |
| 232 | - lib3270_pfkey(hSession,5); | 241 | + lib3270_pfkey(qry->hSession,5); |
| 233 | break; | 242 | break; |
| 234 | 243 | ||
| 235 | case '6': // PF6 | 244 | case '6': // PF6 |
| 236 | - lib3270_pfkey(hSession,6); | 245 | + lib3270_pfkey(qry->hSession,6); |
| 237 | break; | 246 | break; |
| 238 | 247 | ||
| 239 | case '7': // PF7 | 248 | case '7': // PF7 |
| 240 | - lib3270_pfkey(hSession,7); | 249 | + lib3270_pfkey(qry->hSession,7); |
| 241 | break; | 250 | break; |
| 242 | 251 | ||
| 243 | case '8': // PF8 | 252 | case '8': // PF8 |
| 244 | - lib3270_pfkey(hSession,8); | 253 | + lib3270_pfkey(qry->hSession,8); |
| 245 | break; | 254 | break; |
| 246 | 255 | ||
| 247 | case '9': // PF9 | 256 | case '9': // PF9 |
| 248 | - lib3270_pfkey(hSession,9); | 257 | + lib3270_pfkey(qry->hSession,9); |
| 249 | break; | 258 | break; |
| 250 | 259 | ||
| 251 | case 'a': // PF10 | 260 | case 'a': // PF10 |
| 252 | - lib3270_pfkey(hSession,10); | 261 | + lib3270_pfkey(qry->hSession,10); |
| 253 | break; | 262 | break; |
| 254 | 263 | ||
| 255 | case 'b': // PF11 | 264 | case 'b': // PF11 |
| 256 | - lib3270_pfkey(hSession,11); | 265 | + lib3270_pfkey(qry->hSession,11); |
| 257 | break; | 266 | break; |
| 258 | 267 | ||
| 259 | case 'c': // PF12 | 268 | case 'c': // PF12 |
| 260 | - lib3270_pfkey(hSession,12); | 269 | + lib3270_pfkey(qry->hSession,12); |
| 261 | break; | 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 | else | 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 | g_free(text); | 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 | int rows; | 337 | int rows; |
| 293 | int cols; | 338 | int cols; |
| 294 | unsigned short * attr; | 339 | unsigned short * attr; |
| 295 | unsigned char * text; | 340 | unsigned char * text; |
| 296 | int rc; | 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 | if(rc) | 368 | if(rc) |
| 312 | { | 369 | { |
| 313 | - strncpy(outBuff,strerror(rc),length); | 370 | + request_status(qry,rc); |
| 314 | } | 371 | } |
| 315 | else | 372 | else |
| 316 | { | 373 | { |
| @@ -324,44 +381,66 @@ | @@ -324,44 +381,66 @@ | ||
| 324 | 381 | ||
| 325 | g_get_charset(&charset); | 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 | if(!local) | 386 | if(!local) |
| 333 | { | 387 | { |
| 334 | - rc = error->code; | ||
| 335 | - strncpy(outBuff,error->message,length); | 388 | + request_complete(qry,error->code,error->message); |
| 336 | g_error_free(error); | 389 | g_error_free(error); |
| 337 | } | 390 | } |
| 338 | else | 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 | g_free(local); | 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 | static const struct _cmd | 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 | } cmd[] = | 410 | } cmd[] = |
| 354 | { | 411 | { |
| 355 | { HLLAPI_CMD_CONNECTPS, cmd_connectps }, | 412 | { HLLAPI_CMD_CONNECTPS, cmd_connectps }, |
| 356 | { HLLAPI_CMD_DISCONNECTPS, cmd_disconnectps }, | 413 | { HLLAPI_CMD_DISCONNECTPS, cmd_disconnectps }, |
| 357 | { HLLAPI_CMD_INPUTSTRING, cmd_sendstring }, | 414 | { HLLAPI_CMD_INPUTSTRING, cmd_sendstring }, |
| 358 | - { HLLAPI_CMD_WAIT, cmd_wait }, | ||
| 359 | { HLLAPI_CMD_SETCURSOR, cmd_setcursor }, | 415 | { HLLAPI_CMD_SETCURSOR, cmd_setcursor }, |
| 360 | { HLLAPI_CMD_GETREVISION, cmd_getrevision }, | 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 | int f; | 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 | trace("HLLAPI function %d",(int) function); | 444 | trace("HLLAPI function %d",(int) function); |
| 366 | 445 | ||
| 367 | for(f=0;f<G_N_ELEMENTS(cmd);f++) | 446 | for(f=0;f<G_N_ELEMENTS(cmd);f++) |
| @@ -373,4 +452,11 @@ | @@ -373,4 +452,11 @@ | ||
| 373 | g_warning("Unexpected HLLAPI function %d",(int) function); | 452 | g_warning("Unexpected HLLAPI function %d",(int) function); |
| 374 | return EINVAL; | 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,7 +42,30 @@ | ||
| 42 | #include <lib3270/log.h> | 42 | #include <lib3270/log.h> |
| 43 | #include <pw3270/hllapi.h> | 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 | #ifdef WIN32 | 70 | #ifdef WIN32 |
| 48 | 71 |
src/pw3270/v3270/oia.c
| @@ -1087,7 +1087,7 @@ static void release_script(v3270 *widget) | @@ -1087,7 +1087,7 @@ static void release_script(v3270 *widget) | ||
| 1087 | widget->script.id = 0; | 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 | v3270 *terminal; | 1092 | v3270 *terminal; |
| 1093 | g_return_val_if_fail(GTK_IS_V3270(widget),EINVAL); | 1093 | g_return_val_if_fail(GTK_IS_V3270(widget),EINVAL); |