Commit 3ec6fb96766c4182b93d39a9ae1a6fb13e02dddd
1 parent
770f6a8e
Exists in
master
and in
5 other branches
Incluindo suporte multi-sessão em mais métodos
Showing
8 changed files
with
521 additions
and
462 deletions
Show diff stats
src/include/lib3270/filetransfer.h
... | ... | @@ -91,6 +91,10 @@ |
91 | 91 | const char * local; /**< Local filename */ |
92 | 92 | const char * remote; /**< Remote filename */ |
93 | 93 | |
94 | + // ft_dft.c | |
95 | + char * abort_string; | |
96 | + | |
97 | + // Callbacks | |
94 | 98 | void (*complete)(struct _h3270ft *ft,unsigned long length,double kbytes_sec,const char *mode); |
95 | 99 | void (*message)(struct _h3270ft *ft, const char *msg); |
96 | 100 | void (*update)(struct _h3270ft *ft, unsigned long current, unsigned long length, double kbytes_sec); |
... | ... | @@ -117,12 +121,12 @@ |
117 | 121 | * @return Filetransfer handle if ok, NULL if failed |
118 | 122 | * |
119 | 123 | */ |
120 | - LIB3270_EXPORT H3270FT * lib3270_ft_new(H3270 *session, LIB3270_FT_OPTION flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft, const char **msg); | |
124 | + LIB3270_EXPORT H3270FT * lib3270_ft_new(H3270 *hSession, LIB3270_FT_OPTION flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft, const char **msg); | |
121 | 125 | |
122 | - LIB3270_EXPORT int lib3270_ft_start(H3270FT *ft); | |
123 | - LIB3270_EXPORT void lib3270_ft_destroy(H3270FT *ft); | |
126 | + LIB3270_EXPORT int lib3270_ft_start(H3270 *hSession); | |
127 | + LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession); | |
124 | 128 | |
125 | - LIB3270_EXPORT int lib3270_ft_cancel(H3270FT *ft, int force); | |
129 | + LIB3270_EXPORT int lib3270_ft_cancel(H3270 *hSession, int force); | |
126 | 130 | |
127 | 131 | |
128 | 132 | LIB3270_EXPORT LIB3270_FT_STATE lib3270_get_ft_state(H3270 *session); | ... | ... |
src/lib3270/ctlr.c
... | ... | @@ -484,7 +484,7 @@ enum pds process_ds(H3270 *hSession, unsigned char *buf, int buflen) |
484 | 484 | case CMD_WSF: /* write structured field */ |
485 | 485 | case SNA_CMD_WSF: |
486 | 486 | trace_ds(hSession,"WriteStructuredField"); |
487 | - return write_structured_field(buf, buflen); | |
487 | + return write_structured_field(hSession,buf, buflen); | |
488 | 488 | break; |
489 | 489 | |
490 | 490 | case CMD_NOP: /* no-op */ | ... | ... |
src/lib3270/ft.c
... | ... | @@ -113,39 +113,24 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
113 | 113 | |
114 | 114 | } |
115 | 115 | |
116 | - void ft_init(H3270 *session) | |
116 | + void ft_init(H3270 *hSession) | |
117 | 117 | { |
118 | 118 | /* Register for state changes. */ |
119 | - lib3270_register_schange(session, LIB3270_STATE_CONNECT, ( void (*)(H3270 *, int, void *)) ft_connected, NULL); | |
120 | - lib3270_register_schange(session, LIB3270_STATE_3270_MODE, ( void (*)(H3270 *, int, void *)) ft_in3270, NULL); | |
119 | + lib3270_register_schange(hSession, LIB3270_STATE_CONNECT, ( void (*)(H3270 *, int, void *)) ft_connected, NULL); | |
120 | + lib3270_register_schange(hSession, LIB3270_STATE_3270_MODE, ( void (*)(H3270 *, int, void *)) ft_in3270, NULL); | |
121 | 121 | } |
122 | 122 | |
123 | -// enum ft_state QueryFTstate(void) | |
124 | -// { | |
125 | -// return ft_state; | |
126 | -// } | |
127 | - | |
128 | -/* | |
129 | - int RegisterFTCallbacks(const struct filetransfer_callbacks *cbk) | |
123 | + LIB3270_EXPORT int lib3270_ft_cancel(H3270 *hSession, int force) | |
130 | 124 | { |
131 | - if(!(cbk && cbk->sz == sizeof(struct filetransfer_callbacks)) ) | |
132 | - return EINVAL; | |
125 | + H3270FT *ft; | |
133 | 126 | |
134 | - callbacks = cbk; | |
127 | + CHECK_SESSION_HANDLE(hSession); | |
135 | 128 | |
136 | - return 0; | |
137 | - } | |
138 | -*/ | |
129 | + ft = (H3270FT *) hSession->ft; | |
130 | + if(!ft) | |
131 | + return EINVAL; | |
139 | 132 | |
140 | -/* | |
141 | - enum ft_state GetFileTransferState(void) | |
142 | - { | |
143 | - return ft_state; | |
144 | - } | |
145 | -*/ | |
146 | 133 | |
147 | - LIB3270_EXPORT int lib3270_ft_cancel(H3270FT *ft, int force) | |
148 | - { | |
149 | 134 | if (ft->state == LIB3270_FT_STATE_RUNNING) |
150 | 135 | { |
151 | 136 | set_ft_state(ft,LIB3270_FT_STATE_ABORT_WAIT); |
... | ... | @@ -276,7 +261,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
276 | 261 | return ftsession = ftHandle; |
277 | 262 | } |
278 | 263 | |
279 | - LIB3270_EXPORT int lib3270_ft_start(H3270FT *ft) | |
264 | + LIB3270_EXPORT int lib3270_ft_start(H3270 *hSession) | |
280 | 265 | { |
281 | 266 | static const char * rec = "fvu"; |
282 | 267 | static const char * un[] = { "tracks", "cylinders", "avblock" }; |
... | ... | @@ -286,8 +271,13 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
286 | 271 | unsigned int flen; |
287 | 272 | unsigned short recfm; |
288 | 273 | unsigned short units; |
274 | + H3270FT * ft; | |
289 | 275 | |
290 | - CHECK_FT_HANDLE(ft); | |
276 | + CHECK_SESSION_HANDLE(hSession); | |
277 | + | |
278 | + ft = (H3270FT *) hSession->ft; | |
279 | + if(!ft) | |
280 | + return EINVAL; | |
291 | 281 | |
292 | 282 | recfm = (ft->flags & FT_RECORD_FORMAT_MASK) >> 8; |
293 | 283 | units = (ft->flags & FT_ALLOCATION_UNITS_MASK) >> 12; |
... | ... | @@ -438,12 +428,18 @@ void ft_complete(H3270FT *session, const char *errmsg) |
438 | 428 | |
439 | 429 | } |
440 | 430 | |
441 | -LIB3270_EXPORT void lib3270_ft_destroy(H3270FT *session) | |
431 | +LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession) | |
442 | 432 | { |
443 | - CHECK_FT_HANDLE(session); | |
433 | + H3270FT *session; | |
434 | + | |
435 | + CHECK_SESSION_HANDLE(hSession); | |
436 | + | |
437 | + session = (H3270FT *) hSession->ft; | |
438 | + if(!session) | |
439 | + return EINVAL; | |
444 | 440 | |
445 | 441 | if (session->state != LIB3270_FT_STATE_NONE) |
446 | - lib3270_ft_cancel(session,1); | |
442 | + lib3270_ft_cancel(hSession,1); | |
447 | 443 | |
448 | 444 | if(session->local_file) |
449 | 445 | { |
... | ... | @@ -454,11 +450,11 @@ LIB3270_EXPORT void lib3270_ft_destroy(H3270FT *session) |
454 | 450 | if(session == ftsession) |
455 | 451 | ftsession = NULL; |
456 | 452 | |
457 | - if(session->host) | |
458 | - session->host->ft = NULL; | |
453 | + hSession->ft = NULL; | |
459 | 454 | |
460 | 455 | free(session); |
461 | 456 | |
457 | + return 0; | |
462 | 458 | } |
463 | 459 | |
464 | 460 | // Update the bytes-transferred count on the progress pop-up. | ... | ... |
src/lib3270/ft_dft.c
... | ... | @@ -83,20 +83,20 @@ struct data_buffer { |
83 | 83 | static Boolean message_flag = False; /* Open Request for msg received */ |
84 | 84 | static int dft_eof; |
85 | 85 | static unsigned long recnum; |
86 | -static char *abort_string = CN; | |
86 | +// static char *abort_string = CN; | |
87 | 87 | static unsigned char *dft_savebuf = NULL; |
88 | 88 | static int dft_savebuf_len = 0; |
89 | 89 | static int dft_savebuf_max = 0; |
90 | 90 | |
91 | -static void dft_abort(unsigned short code, const char *fmt, ...); | |
91 | +static void dft_abort(H3270 *hSession, unsigned short code, const char *fmt, ...); | |
92 | 92 | |
93 | -static void dft_close_request(void); | |
94 | -static void dft_data_insert(struct data_buffer *data_bufr); | |
95 | -static void dft_get_request(void); | |
96 | -static void dft_insert_request(void); | |
97 | -static void dft_open_request(unsigned short len, unsigned char *cp); | |
98 | -static void dft_set_cur_req(void); | |
99 | -static int filter_len(char *s, register int len); | |
93 | +static void dft_close_request(H3270 *hSession); | |
94 | +static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr); | |
95 | +static void dft_get_request(H3270 *hSession); | |
96 | +static void dft_insert_request(H3270 *hSession); | |
97 | +static void dft_open_request(H3270 *hSession, unsigned short len, unsigned char *cp); | |
98 | +static void dft_set_cur_req(H3270 *hSession); | |
99 | +static int filter_len(char *s, register int len); | |
100 | 100 | |
101 | 101 | /** |
102 | 102 | * Process a Transfer Data structured field from the host. |
... | ... | @@ -108,9 +108,9 @@ void ft_dft_data(H3270 *hSession, unsigned char *data, int length unused) |
108 | 108 | unsigned short data_length, data_type; |
109 | 109 | unsigned char *cp; |
110 | 110 | |
111 | - if (lib3270_get_ft_state(&h3270) == FT_NONE) | |
111 | + if (lib3270_get_ft_state(hSession) == FT_NONE) | |
112 | 112 | { |
113 | - trace_ds(&h3270," (no transfer in progress)\n"); | |
113 | + trace_ds(hSession," (no transfer in progress)\n"); | |
114 | 114 | return; |
115 | 115 | } |
116 | 116 | |
... | ... | @@ -123,104 +123,120 @@ void ft_dft_data(H3270 *hSession, unsigned char *data, int length unused) |
123 | 123 | GET16(data_type, cp); |
124 | 124 | |
125 | 125 | /* Handle the requests */ |
126 | - switch (data_type) { | |
127 | - case TR_OPEN_REQ: | |
128 | - dft_open_request(data_length, cp); | |
126 | + switch (data_type) | |
127 | + { | |
128 | + case TR_OPEN_REQ: | |
129 | + dft_open_request(hSession,data_length, cp); | |
129 | 130 | break; |
130 | - case TR_INSERT_REQ: /* Insert Request */ | |
131 | - dft_insert_request(); | |
131 | + | |
132 | + case TR_INSERT_REQ: /* Insert Request */ | |
133 | + dft_insert_request(hSession); | |
132 | 134 | break; |
133 | - case TR_DATA_INSERT: | |
134 | - dft_data_insert(data_bufr); | |
135 | + | |
136 | + case TR_DATA_INSERT: | |
137 | + dft_data_insert(hSession,data_bufr); | |
135 | 138 | break; |
136 | - case TR_SET_CUR_REQ: | |
137 | - dft_set_cur_req(); | |
139 | + | |
140 | + case TR_SET_CUR_REQ: | |
141 | + dft_set_cur_req(hSession); | |
138 | 142 | break; |
139 | - case TR_GET_REQ: | |
140 | - dft_get_request(); | |
143 | + | |
144 | + case TR_GET_REQ: | |
145 | + dft_get_request(hSession); | |
141 | 146 | break; |
142 | - case TR_CLOSE_REQ: | |
143 | - dft_close_request(); | |
147 | + | |
148 | + case TR_CLOSE_REQ: | |
149 | + dft_close_request(hSession); | |
144 | 150 | break; |
145 | - default: | |
146 | - trace_ds(&h3270," Unsupported(0x%04x)\n", data_type); | |
151 | + | |
152 | + default: | |
153 | + trace_ds(hSession," Unsupported(0x%04x)\n", data_type); | |
147 | 154 | break; |
148 | 155 | } |
149 | 156 | } |
150 | 157 | |
151 | 158 | /* Process an Open request. */ |
152 | -static void | |
153 | -dft_open_request(unsigned short len, unsigned char *cp) | |
159 | +static void dft_open_request(H3270 *hSession, unsigned short len, unsigned char *cp) | |
154 | 160 | { |
155 | 161 | char *name = "?"; |
156 | 162 | char namebuf[8]; |
157 | 163 | char *s; |
158 | 164 | unsigned short recsz = 0; |
159 | 165 | |
160 | - if (len == 0x23) { | |
166 | + if (len == 0x23) | |
167 | + { | |
161 | 168 | name = (char *)cp + 25; |
162 | - } else if (len == 0x29) { | |
169 | + } | |
170 | + else if (len == 0x29) | |
171 | + { | |
163 | 172 | unsigned char *recszp; |
164 | 173 | |
165 | 174 | recszp = cp + 27; |
166 | 175 | GET16(recsz, recszp); |
167 | 176 | name = (char *)cp + 31; |
168 | - } else { | |
169 | - dft_abort(TR_OPEN_REQ, "%s", _("Uknown DFT Open type from host") ); | |
177 | + } | |
178 | + else | |
179 | + { | |
180 | + dft_abort(hSession,TR_OPEN_REQ, "%s", _("Uknown DFT Open type from host") ); | |
170 | 181 | return; |
171 | 182 | } |
172 | 183 | |
173 | 184 | (void) memcpy(namebuf, name, 7); |
174 | 185 | namebuf[7] = '\0'; |
175 | 186 | s = &namebuf[6]; |
176 | - while (s >= namebuf && *s == ' ') { | |
187 | + while (s >= namebuf && *s == ' ') | |
188 | + { | |
177 | 189 | *s-- = '\0'; |
178 | 190 | } |
179 | - if (recsz) { | |
180 | - trace_ds(&h3270," Open('%s',recsz=%u)\n", namebuf, recsz); | |
181 | - } else { | |
182 | - trace_ds(&h3270," Open('%s')\n", namebuf); | |
191 | + | |
192 | + if (recsz) | |
193 | + { | |
194 | + trace_ds(hSession," Open('%s',recsz=%u)\n", namebuf, recsz); | |
195 | + } | |
196 | + else | |
197 | + { | |
198 | + trace_ds(hSession," Open('%s')\n", namebuf); | |
183 | 199 | } |
184 | 200 | |
185 | 201 | if (!strcmp(namebuf, OPEN_MSG)) |
186 | 202 | message_flag = True; |
187 | - else { | |
203 | + else | |
204 | + { | |
188 | 205 | message_flag = False; |
189 | - ft_running(NULL,False); | |
206 | + ft_running(hSession->ft,False); | |
190 | 207 | } |
208 | + | |
191 | 209 | dft_eof = False; |
192 | 210 | recnum = 1; |
193 | 211 | |
194 | 212 | /* Acknowledge the Open. */ |
195 | - trace_ds(&h3270,"> WriteStructuredField FileTransferData OpenAck\n"); | |
196 | - h3270.obptr = h3270.obuf; | |
197 | - space3270out(&h3270,6); | |
198 | - *h3270.obptr++ = AID_SF; | |
199 | - SET16(h3270.obptr, 5); | |
200 | - *h3270.obptr++ = SF_TRANSFER_DATA; | |
201 | - SET16(h3270.obptr, 9); | |
202 | - net_output(&h3270); | |
213 | + trace_ds(hSession,"> WriteStructuredField FileTransferData OpenAck\n"); | |
214 | + hSession->obptr = hSession->obuf; | |
215 | + space3270out(hSession,6); | |
216 | + *hSession->obptr++ = AID_SF; | |
217 | + SET16(hSession->obptr, 5); | |
218 | + *hSession->obptr++ = SF_TRANSFER_DATA; | |
219 | + SET16(hSession->obptr, 9); | |
220 | + net_output(hSession); | |
203 | 221 | } |
204 | 222 | |
205 | 223 | /* Process an Insert request. */ |
206 | -static void | |
207 | -dft_insert_request(void) | |
224 | +static void dft_insert_request(H3270 *hSession) | |
208 | 225 | { |
209 | - trace_ds(&h3270," Insert\n"); | |
226 | + trace_ds(hSession," Insert\n"); | |
210 | 227 | /* Doesn't currently do anything. */ |
211 | 228 | } |
212 | 229 | |
213 | 230 | /* Process a Data Insert request. */ |
214 | -static void | |
215 | -dft_data_insert(struct data_buffer *data_bufr) | |
231 | +static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | |
216 | 232 | { |
217 | 233 | /* Received a data buffer, get the length and process it */ |
218 | 234 | int my_length; |
219 | 235 | unsigned char *cp; |
220 | 236 | |
221 | - if(!message_flag && lib3270_get_ft_state(&h3270) == FT_ABORT_WAIT) | |
237 | + if(!message_flag && lib3270_get_ft_state(hSession) == FT_ABORT_WAIT) | |
222 | 238 | { |
223 | - dft_abort(TR_DATA_INSERT, "%s", _("Transfer cancelled by user") ); | |
239 | + dft_abort(hSession,TR_DATA_INSERT, "%s", _("Transfer cancelled by user") ); | |
224 | 240 | return; |
225 | 241 | } |
226 | 242 | |
... | ... | @@ -232,13 +248,14 @@ dft_data_insert(struct data_buffer *data_bufr) |
232 | 248 | /* Adjust for 5 extra count */ |
233 | 249 | my_length -= 5; |
234 | 250 | |
235 | - trace_ds(&h3270," Data(rec=%lu) %d bytes\n", recnum, my_length); | |
251 | + trace_ds(hSession," Data(rec=%lu) %d bytes\n", recnum, my_length); | |
236 | 252 | |
237 | 253 | /* |
238 | 254 | * First, check to see if we have message data or file data. |
239 | 255 | * Message data will result in a popup. |
240 | 256 | */ |
241 | - if (message_flag) { | |
257 | + if (message_flag) | |
258 | + { | |
242 | 259 | /* Data is from a message */ |
243 | 260 | unsigned char *msgp; |
244 | 261 | unsigned char *dollarp; |
... | ... | @@ -259,13 +276,17 @@ dft_data_insert(struct data_buffer *data_bufr) |
259 | 276 | /* If transfer completed ok, use our msg. */ |
260 | 277 | if (memcmp(msgp, END_TRANSFER, strlen(END_TRANSFER)) == 0) { |
261 | 278 | lib3270_free(msgp); |
262 | - ft_complete(NULL,NULL); | |
263 | - } else if (lib3270_get_ft_state(&h3270) == FT_ABORT_SENT && abort_string != CN) { | |
279 | + ft_complete(hSession->ft,NULL); | |
280 | + } | |
281 | + else if (lib3270_get_ft_state(hSession) == FT_ABORT_SENT && ((H3270FT *) hSession->ft)->abort_string != CN) | |
282 | + { | |
264 | 283 | lib3270_free(msgp); |
265 | - ft_complete(NULL,abort_string); | |
266 | - Replace(abort_string, CN); | |
267 | - } else { | |
268 | - ft_complete(NULL,(char *)msgp); | |
284 | + ft_complete(hSession->ft,((H3270FT *) hSession->ft)->abort_string); | |
285 | + lib3270_free(((H3270FT *) hSession->ft)->abort_string); | |
286 | + } | |
287 | + else | |
288 | + { | |
289 | + ft_complete(hSession->ft,(char *)msgp); | |
269 | 290 | lib3270_free(msgp); |
270 | 291 | } |
271 | 292 | } else if (my_length > 0) { |
... | ... | @@ -309,56 +330,56 @@ dft_data_insert(struct data_buffer *data_bufr) |
309 | 330 | |
310 | 331 | if (!rv) { |
311 | 332 | /* write failed */ |
312 | - dft_abort(TR_DATA_INSERT, _( "Error \"%s\" writing to local file (rc=%d)" ) , strerror(errno), errno); | |
333 | + dft_abort(hSession,TR_DATA_INSERT, _( "Error \"%s\" writing to local file (rc=%d)" ) , strerror(errno), errno); | |
313 | 334 | } |
314 | 335 | |
315 | 336 | /* Add up amount transferred. */ |
316 | - ft_update_length((H3270FT *) h3270.ft); | |
337 | + ft_update_length((H3270FT *) hSession->ft); | |
317 | 338 | } |
318 | 339 | |
319 | 340 | /* Send an acknowledgement frame back. */ |
320 | - trace_ds(&h3270,"> WriteStructuredField FileTransferData DataAck(rec=%lu)\n", recnum); | |
321 | - h3270.obptr = h3270.obuf; | |
322 | - space3270out(&h3270,12); | |
323 | - *h3270.obptr++ = AID_SF; | |
324 | - SET16(h3270.obptr, 11); | |
325 | - *h3270.obptr++ = SF_TRANSFER_DATA; | |
326 | - SET16(h3270.obptr, TR_NORMAL_REPLY); | |
327 | - SET16(h3270.obptr, TR_RECNUM_HDR); | |
328 | - SET32(h3270.obptr, recnum); | |
341 | + trace_ds(hSession,"> WriteStructuredField FileTransferData DataAck(rec=%lu)\n", recnum); | |
342 | + hSession->obptr = hSession->obuf; | |
343 | + space3270out(hSession,12); | |
344 | + *hSession->obptr++ = AID_SF; | |
345 | + SET16(hSession->obptr, 11); | |
346 | + *hSession->obptr++ = SF_TRANSFER_DATA; | |
347 | + SET16(hSession->obptr, TR_NORMAL_REPLY); | |
348 | + SET16(hSession->obptr, TR_RECNUM_HDR); | |
349 | + SET32(hSession->obptr, recnum); | |
329 | 350 | recnum++; |
330 | - net_output(&h3270); | |
351 | + net_output(hSession); | |
331 | 352 | } |
332 | 353 | |
333 | 354 | /* Process a Set Cursor request. */ |
334 | -static void | |
335 | -dft_set_cur_req(void) | |
355 | +static void dft_set_cur_req(H3270 *hSession) | |
336 | 356 | { |
337 | - trace_ds(&h3270," SetCursor\n"); | |
357 | + trace_ds(hSession," SetCursor\n"); | |
338 | 358 | /* Currently doesn't do anything. */ |
339 | 359 | } |
340 | 360 | |
341 | 361 | /* Process a Get request. */ |
342 | -static void | |
343 | -dft_get_request(void) | |
362 | +static void dft_get_request(H3270 *hSession) | |
344 | 363 | { |
345 | 364 | int numbytes; |
346 | 365 | size_t numread; |
347 | 366 | size_t total_read = 0; |
348 | 367 | unsigned char *bufptr; |
349 | 368 | |
350 | - trace_ds(&h3270," Get\n"); | |
369 | + trace_ds(hSession," Get\n"); | |
351 | 370 | |
352 | - if (!message_flag && lib3270_get_ft_state(&h3270) == FT_ABORT_WAIT) { | |
353 | - dft_abort(TR_GET_REQ, _( "Transfer cancelled by user" ) ); | |
371 | + if (!message_flag && lib3270_get_ft_state(hSession) == FT_ABORT_WAIT) | |
372 | + { | |
373 | + dft_abort(hSession,TR_GET_REQ, _( "Transfer cancelled by user" ) ); | |
354 | 374 | return; |
355 | 375 | } |
356 | 376 | |
357 | 377 | /* Read a buffer's worth. */ |
358 | - set_dft_buffersize(&h3270); | |
359 | - space3270out(&h3270,h3270.dft_buffersize); | |
378 | + set_dft_buffersize(hSession); | |
379 | + space3270out(hSession,h3270.dft_buffersize); | |
360 | 380 | numbytes = h3270.dft_buffersize - 27; /* always read 5 bytes less than we're allowed */ |
361 | 381 | bufptr = h3270.obuf + 17; |
382 | + | |
362 | 383 | while (!dft_eof && numbytes) { |
363 | 384 | if (ascii_flag && cr_flag) { |
364 | 385 | int c; |
... | ... | @@ -411,9 +432,9 @@ dft_get_request(void) |
411 | 432 | } |
412 | 433 | |
413 | 434 | /* Check for read error. */ |
414 | - if (ferror(((H3270FT *) h3270.ft)->local_file)) | |
435 | + if (ferror(((H3270FT *) hSession->ft)->local_file)) | |
415 | 436 | { |
416 | - dft_abort(TR_GET_REQ, _( "Error \"%s\" reading from local file (rc=%d)" ), strerror(errno), errno); | |
437 | + dft_abort(hSession,TR_GET_REQ, _( "Error \"%s\" reading from local file (rc=%d)" ), strerror(errno), errno); | |
417 | 438 | return; |
418 | 439 | } |
419 | 440 | |
... | ... | @@ -424,7 +445,7 @@ dft_get_request(void) |
424 | 445 | *h3270.obptr++ = SF_TRANSFER_DATA; |
425 | 446 | |
426 | 447 | if (total_read) { |
427 | - trace_ds(&h3270,"> WriteStructuredField FileTransferData Data(rec=%lu) %d bytes\n",(unsigned long) recnum, (int) total_read); | |
448 | + trace_ds(hSession,"> WriteStructuredField FileTransferData Data(rec=%lu) %d bytes\n",(unsigned long) recnum, (int) total_read); | |
428 | 449 | SET16(h3270.obptr, TR_GET_REPLY); |
429 | 450 | SET16(h3270.obptr, TR_RECNUM_HDR); |
430 | 451 | SET32(h3270.obptr, recnum); |
... | ... | @@ -442,7 +463,7 @@ dft_get_request(void) |
442 | 463 | } |
443 | 464 | |
444 | 465 | } else { |
445 | - trace_ds(&h3270,"> WriteStructuredField FileTransferData EOF\n"); | |
466 | + trace_ds(hSession,"> WriteStructuredField FileTransferData EOF\n"); | |
446 | 467 | *h3270.obptr++ = HIGH8(TR_GET_REQ); |
447 | 468 | *h3270.obptr++ = TR_ERROR_REPLY; |
448 | 469 | SET16(h3270.obptr, TR_ERROR_HDR); |
... | ... | @@ -465,56 +486,55 @@ dft_get_request(void) |
465 | 486 | h3270.aid = AID_SF; |
466 | 487 | |
467 | 488 | /* Write the data. */ |
468 | - net_output(&h3270); | |
489 | + net_output(hSession); | |
469 | 490 | ft_update_length((H3270FT *) h3270.ft); |
470 | 491 | } |
471 | 492 | |
472 | 493 | /* Process a Close request. */ |
473 | -static void | |
474 | -dft_close_request(void) | |
494 | +static void dft_close_request(H3270 *hSession) | |
475 | 495 | { |
476 | 496 | /* |
477 | 497 | * Recieved a close request from the system. |
478 | 498 | * Return a close acknowledgement. |
479 | 499 | */ |
480 | - trace_ds(&h3270," Close\n"); | |
481 | - trace_ds(&h3270,"> WriteStructuredField FileTransferData CloseAck\n"); | |
482 | - h3270.obptr = h3270.obuf; | |
483 | - space3270out(&h3270,6); | |
484 | - *h3270.obptr++ = AID_SF; | |
485 | - SET16(h3270.obptr, 5); /* length */ | |
486 | - *h3270.obptr++ = SF_TRANSFER_DATA; | |
487 | - SET16(h3270.obptr, TR_CLOSE_REPLY); | |
488 | - net_output(&h3270); | |
500 | + trace_ds(hSession," Close\n"); | |
501 | + trace_ds(hSession,"> WriteStructuredField FileTransferData CloseAck\n"); | |
502 | + hSession->obptr = hSession->obuf; | |
503 | + space3270out(hSession,6); | |
504 | + *hSession->obptr++ = AID_SF; | |
505 | + SET16(hSession->obptr, 5); /* length */ | |
506 | + *hSession->obptr++ = SF_TRANSFER_DATA; | |
507 | + SET16(hSession->obptr, TR_CLOSE_REPLY); | |
508 | + net_output(hSession); | |
489 | 509 | } |
490 | 510 | |
491 | 511 | /* Abort a transfer. */ |
492 | -static void dft_abort(unsigned short code, const char *fmt, ...) | |
512 | +static void dft_abort(H3270 *hSession, unsigned short code, const char *fmt, ...) | |
493 | 513 | { |
514 | + H3270FT *ft = (H3270FT *) hSession->ft; | |
494 | 515 | va_list args; |
495 | 516 | |
496 | - if(abort_string) | |
497 | - lib3270_free(abort_string); | |
517 | + lib3270_free(ft->abort_string); | |
498 | 518 | |
499 | 519 | va_start(args, fmt); |
500 | - abort_string = lib3270_vsprintf(fmt, args); | |
520 | + ft->abort_string = lib3270_vsprintf(fmt, args); | |
501 | 521 | va_end(args); |
502 | 522 | |
503 | - trace_ds(&h3270,"> WriteStructuredField FileTransferData Error\n"); | |
523 | + trace_ds(hSession,"> WriteStructuredField FileTransferData Error\n"); | |
504 | 524 | |
505 | - h3270.obptr = h3270.obuf; | |
506 | - space3270out(&h3270,10); | |
507 | - *h3270.obptr++ = AID_SF; | |
508 | - SET16(h3270.obptr, 9); /* length */ | |
509 | - *h3270.obptr++ = SF_TRANSFER_DATA; | |
510 | - *h3270.obptr++ = HIGH8(code); | |
511 | - *h3270.obptr++ = TR_ERROR_REPLY; | |
512 | - SET16(h3270.obptr, TR_ERROR_HDR); | |
513 | - SET16(h3270.obptr, TR_ERR_CMDFAIL); | |
514 | - net_output(&h3270); | |
525 | + hSession->obptr = hSession->obuf; | |
526 | + space3270out(hSession,10); | |
527 | + *hSession->obptr++ = AID_SF; | |
528 | + SET16(hSession->obptr, 9); /* length */ | |
529 | + *hSession->obptr++ = SF_TRANSFER_DATA; | |
530 | + *hSession->obptr++ = HIGH8(code); | |
531 | + *hSession->obptr++ = TR_ERROR_REPLY; | |
532 | + SET16(hSession->obptr, TR_ERROR_HDR); | |
533 | + SET16(hSession->obptr, TR_ERR_CMDFAIL); | |
534 | + net_output(hSession); | |
515 | 535 | |
516 | 536 | /* Update the pop-up and state. */ |
517 | - ft_aborting((H3270FT *) h3270.ft); | |
537 | + ft_aborting(ft); | |
518 | 538 | } |
519 | 539 | |
520 | 540 | /* Returns the number of bytes in s, limited by len, that aren't CRs or ^Zs. */ | ... | ... |
src/lib3270/rpq.c
... | ... | @@ -119,10 +119,10 @@ static struct rpq_keyword { |
119 | 119 | |
120 | 120 | static char *x3270rpq; |
121 | 121 | |
122 | -/* | |
122 | +/** | |
123 | 123 | * RPQNAMES query reply. |
124 | 124 | */ |
125 | -void do_qr_rpqnames(void) | |
125 | +void do_qr_rpqnames(H3270 *hSession) | |
126 | 126 | { |
127 | 127 | #define TERM_PREFIX_SIZE 2 /* Each term has 1 byte length and 1 |
128 | 128 | byte id */ |
... | ... | @@ -132,14 +132,14 @@ void do_qr_rpqnames(void) |
132 | 132 | int remaining = 254; /* maximum data area for rpqname reply */ |
133 | 133 | Boolean omit_due_space_limit; |
134 | 134 | |
135 | - trace_ds(&h3270,"> QueryReply(RPQNames)\n"); | |
135 | + trace_ds(hSession,"> QueryReply(RPQNames)\n"); | |
136 | 136 | |
137 | 137 | /* |
138 | 138 | * Allocate enough space for the maximum allowed item. |
139 | 139 | * By pre-allocating the space I don't have to worry about the |
140 | 140 | * possibility of addresses changing. |
141 | 141 | */ |
142 | - space3270out(&h3270,4+4+1+remaining); /* Maximum space for an RPQNAME item */ | |
142 | + space3270out(hSession,4+4+1+remaining); /* Maximum space for an RPQNAME item */ | |
143 | 143 | |
144 | 144 | SET32(h3270.obptr, 0); /* Device number, 0 = All */ |
145 | 145 | SET32(h3270.obptr, 0); /* Model number, 0 = All */ |
... | ... | @@ -188,7 +188,7 @@ void do_qr_rpqnames(void) |
188 | 188 | |
189 | 189 | case RPQ_ADDRESS: /* Workstation address */ |
190 | 190 | #if !defined(_WIN32) /*[*/ |
191 | - h3270.obptr += get_rpq_address(h3270.obptr, remaining); | |
191 | + hSession->obptr += get_rpq_address(hSession->obptr, remaining); | |
192 | 192 | #endif /*]*/ |
193 | 193 | break; |
194 | 194 | |
... | ... | @@ -197,7 +197,7 @@ void do_qr_rpqnames(void) |
197 | 197 | omit_due_space_limit = (x > remaining); |
198 | 198 | if (!omit_due_space_limit) { |
199 | 199 | for (i = 0; i < x; i++) { |
200 | - *h3270.obptr++ = asc2ebc[(int)(*(build_rpq_version+i) & 0xff)]; | |
200 | + *hSession->obptr++ = asc2ebc[(int)(*(build_rpq_version+i) & 0xff)]; | |
201 | 201 | } |
202 | 202 | } |
203 | 203 | break; |
... | ... | @@ -207,7 +207,7 @@ void do_qr_rpqnames(void) |
207 | 207 | omit_due_space_limit = ((x+1)/2 > remaining); |
208 | 208 | if (!omit_due_space_limit) { |
209 | 209 | for (i=0; i < x; i+=2) { |
210 | - *h3270.obptr++ = ((*(build_rpq_timestamp+i) - '0') << 4) | |
210 | + *hSession->obptr++ = ((*(build_rpq_timestamp+i) - '0') << 4) | |
211 | 211 | + (*(build_rpq_timestamp+i+1) - '0'); |
212 | 212 | } |
213 | 213 | } |
... | ... | @@ -254,7 +254,7 @@ void do_qr_rpqnames(void) |
254 | 254 | } |
255 | 255 | |
256 | 256 | /* Fill in overall length of RPQNAME info */ |
257 | - *rpql = (h3270.obptr - rpql); | |
257 | + *rpql = (hSession->obptr - rpql); | |
258 | 258 | |
259 | 259 | rpq_dump_warnings(); |
260 | 260 | } | ... | ... |
src/lib3270/sf.c
... | ... | @@ -18,7 +18,7 @@ |
18 | 18 | * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin |
19 | 19 | * St, Fifth Floor, Boston, MA 02110-1301 USA |
20 | 20 | * |
21 | - * Este programa está nomeado como sf.c e possui 964 linhas de código. | |
21 | + * Este programa está nomeado como sf.c e possui - linhas de código. | |
22 | 22 | * |
23 | 23 | * Contatos: |
24 | 24 | * |
... | ... | @@ -26,7 +26,6 @@ |
26 | 26 | * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) |
27 | 27 | * licinio@bb.com.br (Licínio Luis Branco) |
28 | 28 | * kraucer@bb.com.br (Kraucer Fernandes Mazuco) |
29 | - * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda) | |
30 | 29 | * |
31 | 30 | */ |
32 | 31 | |
... | ... | @@ -85,16 +84,16 @@ Boolean * standard_font = &sfont; |
85 | 84 | |
86 | 85 | /* Statics */ |
87 | 86 | static Boolean qr_in_progress = False; |
88 | -static enum pds sf_read_part(unsigned char buf[], unsigned buflen); | |
89 | -static enum pds sf_erase_reset(unsigned char buf[], int buflen); | |
90 | -static enum pds sf_set_reply_mode(unsigned char buf[], int buflen); | |
91 | -static enum pds sf_create_partition(unsigned char buf[], int buflen); | |
87 | +static enum pds sf_read_part(H3270 *hSession, unsigned char buf[], unsigned buflen); | |
88 | +static enum pds sf_erase_reset(H3270 *hSession, unsigned char buf[], int buflen); | |
89 | +static enum pds sf_set_reply_mode(H3270 *hSession, unsigned char buf[], int buflen); | |
90 | +static enum pds sf_create_partition(H3270 *hSession, unsigned char buf[], int buflen); | |
92 | 91 | static enum pds sf_outbound_ds(unsigned char buf[], int buflen); |
93 | -static void query_reply_start(void); | |
92 | +static void query_reply_start(H3270 *hSession); | |
94 | 93 | static void do_query_reply(unsigned char code); |
95 | -static void query_reply_end(void); | |
94 | +static void query_reply_end(H3270 *hSession); | |
96 | 95 | |
97 | -typedef Boolean qr_multi_fn_t(unsigned *subindex, Boolean *more); | |
96 | +typedef Boolean qr_multi_fn_t(H3270 *hSession, unsigned *subindex, Boolean *more); | |
98 | 97 | |
99 | 98 | static qr_single_fn_t do_qr_summary, do_qr_usable_area, do_qr_alpha_part, |
100 | 99 | do_qr_charsets, do_qr_color, do_qr_highlighting, do_qr_reply_modes, |
... | ... | @@ -145,12 +144,10 @@ static struct reply { |
145 | 144 | #define NSR_ALL (sizeof(replies)/sizeof(struct reply)) |
146 | 145 | #define NSR (NSR_ALL - 1) |
147 | 146 | |
148 | - | |
149 | -/* | |
147 | +/** | |
150 | 148 | * Process a 3270 Write Structured Field command |
151 | 149 | */ |
152 | -enum pds | |
153 | -write_structured_field(unsigned char buf[], int buflen) | |
150 | +enum pds write_structured_field(H3270 *hSession, unsigned char buf[], int buflen) | |
154 | 151 | { |
155 | 152 | unsigned short fieldlen; |
156 | 153 | unsigned char *cp = buf; |
... | ... | @@ -164,61 +161,72 @@ write_structured_field(unsigned char buf[], int buflen) |
164 | 161 | buflen--; |
165 | 162 | |
166 | 163 | /* Interpret fields. */ |
167 | - while (buflen > 0) { | |
164 | + while (buflen > 0) | |
165 | + { | |
168 | 166 | |
169 | 167 | if (first) |
170 | - trace_ds(&h3270," "); | |
168 | + trace_ds(hSession," "); | |
171 | 169 | else |
172 | - trace_ds(&h3270,"< WriteStructuredField "); | |
170 | + trace_ds(hSession,"< WriteStructuredField "); | |
173 | 171 | first = False; |
174 | 172 | |
175 | 173 | /* Pick out the field length. */ |
176 | - if (buflen < 2) { | |
177 | - trace_ds(&h3270,"error: single byte at end of message\n"); | |
174 | + if (buflen < 2) | |
175 | + { | |
176 | + trace_ds(hSession,"error: single byte at end of message\n"); | |
178 | 177 | return rv ? rv : PDS_BAD_CMD; |
179 | 178 | } |
180 | 179 | fieldlen = (cp[0] << 8) + cp[1]; |
181 | 180 | if (fieldlen == 0) |
182 | 181 | fieldlen = buflen; |
183 | - if (fieldlen < 3) { | |
184 | - trace_ds(&h3270,"error: field length %d too small\n",fieldlen); | |
182 | + if (fieldlen < 3) | |
183 | + { | |
184 | + trace_ds(hSession,"error: field length %d too small\n",fieldlen); | |
185 | 185 | return rv ? rv : PDS_BAD_CMD; |
186 | 186 | } |
187 | - if ((int)fieldlen > buflen) { | |
188 | - trace_ds(&h3270,"error: field length %d exceeds remaining message length %d\n",fieldlen, buflen); | |
187 | + if ((int)fieldlen > buflen) | |
188 | + { | |
189 | + trace_ds(hSession,"error: field length %d exceeds remaining message length %d\n",fieldlen, buflen); | |
189 | 190 | return rv ? rv : PDS_BAD_CMD; |
190 | 191 | } |
191 | 192 | |
192 | 193 | /* Dispatch on the ID. */ |
193 | - switch (cp[2]) { | |
194 | - case SF_READ_PART: | |
195 | - trace_ds(&h3270,"ReadPartition"); | |
196 | - rv_this = sf_read_part(cp, (int)fieldlen); | |
194 | + switch (cp[2]) | |
195 | + { | |
196 | + case SF_READ_PART: | |
197 | + trace_ds(hSession,"ReadPartition"); | |
198 | + rv_this = sf_read_part(hSession, cp, (int)fieldlen); | |
197 | 199 | break; |
198 | - case SF_ERASE_RESET: | |
199 | - trace_ds(&h3270,"EraseReset"); | |
200 | - rv_this = sf_erase_reset(cp, (int)fieldlen); | |
200 | + | |
201 | + case SF_ERASE_RESET: | |
202 | + trace_ds(hSession,"EraseReset"); | |
203 | + rv_this = sf_erase_reset(hSession, cp, (int)fieldlen); | |
201 | 204 | break; |
202 | - case SF_SET_REPLY_MODE: | |
203 | - trace_ds(&h3270,"SetReplyMode"); | |
204 | - rv_this = sf_set_reply_mode(cp, (int)fieldlen); | |
205 | + | |
206 | + case SF_SET_REPLY_MODE: | |
207 | + trace_ds(hSession,"SetReplyMode"); | |
208 | + rv_this = sf_set_reply_mode(hSession, cp, (int)fieldlen); | |
205 | 209 | break; |
206 | - case SF_CREATE_PART: | |
207 | - trace_ds(&h3270,"CreatePartition"); | |
208 | - rv_this = sf_create_partition(cp, (int)fieldlen); | |
210 | + | |
211 | + case SF_CREATE_PART: | |
212 | + trace_ds(hSession,"CreatePartition"); | |
213 | + rv_this = sf_create_partition(hSession, cp, (int)fieldlen); | |
209 | 214 | break; |
210 | - case SF_OUTBOUND_DS: | |
211 | - trace_ds(&h3270,"OutboundDS"); | |
215 | + | |
216 | + case SF_OUTBOUND_DS: | |
217 | + trace_ds(hSession,"OutboundDS"); | |
212 | 218 | rv_this = sf_outbound_ds(cp, (int)fieldlen); |
213 | 219 | break; |
214 | -#if defined(X3270_FT) /*[*/ | |
215 | - case SF_TRANSFER_DATA: /* File transfer data */ | |
216 | - trace_ds(&h3270,"FileTransferData"); | |
217 | - ft_dft_data(&h3270,cp, (int)fieldlen); | |
220 | + | |
221 | +#if defined(X3270_FT) | |
222 | + case SF_TRANSFER_DATA: /* File transfer data */ | |
223 | + trace_ds(hSession,"FileTransferData"); | |
224 | + ft_dft_data(hSession, cp, (int)fieldlen); | |
218 | 225 | break; |
219 | -#endif /*]*/ | |
220 | - default: | |
221 | - trace_ds(&h3270,"unsupported ID 0x%02x\n", cp[2]); | |
226 | +#endif | |
227 | + | |
228 | + default: | |
229 | + trace_ds(hSession,"unsupported ID 0x%02x\n", cp[2]); | |
222 | 230 | rv_this = PDS_BAD_CMD; |
223 | 231 | break; |
224 | 232 | } |
... | ... | @@ -240,7 +248,7 @@ write_structured_field(unsigned char buf[], int buflen) |
240 | 248 | buflen -= fieldlen; |
241 | 249 | } |
242 | 250 | if (first) |
243 | - trace_ds(&h3270," (null)\n"); | |
251 | + trace_ds(hSession," (null)\n"); | |
244 | 252 | |
245 | 253 | if (bad_cmd && !rv) |
246 | 254 | return PDS_BAD_CMD; |
... | ... | @@ -248,8 +256,7 @@ write_structured_field(unsigned char buf[], int buflen) |
248 | 256 | return rv; |
249 | 257 | } |
250 | 258 | |
251 | -static enum pds | |
252 | -sf_read_part(unsigned char buf[], unsigned buflen) | |
259 | +static enum pds sf_read_part(H3270 *hSession, unsigned char buf[], unsigned buflen) | |
253 | 260 | { |
254 | 261 | unsigned char partition; |
255 | 262 | unsigned i; |
... | ... | @@ -258,53 +265,53 @@ sf_read_part(unsigned char buf[], unsigned buflen) |
258 | 265 | |
259 | 266 | if (buflen < 5) |
260 | 267 | { |
261 | - trace_ds(&h3270," error: field length %d too small\n", buflen); | |
268 | + trace_ds(hSession," error: field length %d too small\n", buflen); | |
262 | 269 | return PDS_BAD_CMD; |
263 | 270 | } |
264 | 271 | |
265 | 272 | partition = buf[3]; |
266 | - trace_ds(&h3270,"(0x%02x)", partition); | |
273 | + trace_ds(hSession,"(0x%02x)", partition); | |
267 | 274 | |
268 | 275 | switch (buf[4]) { |
269 | 276 | case SF_RP_QUERY: |
270 | - trace_ds(&h3270," Query"); | |
277 | + trace_ds(hSession," Query"); | |
271 | 278 | if (partition != 0xff) { |
272 | - trace_ds(&h3270," error: illegal partition\n"); | |
279 | + trace_ds(hSession," error: illegal partition\n"); | |
273 | 280 | return PDS_BAD_CMD; |
274 | 281 | } |
275 | - trace_ds(&h3270,"\n"); | |
276 | - query_reply_start(); | |
282 | + trace_ds(hSession,"\n"); | |
283 | + query_reply_start(hSession); | |
277 | 284 | for (i = 0; i < NSR; i++) { |
278 | 285 | #if defined(X3270_DBCS) /*[*/ |
279 | 286 | if (dbcs || replies[i].code != QR_DBCS_ASIA) |
280 | 287 | #endif /*]*/ |
281 | 288 | do_query_reply(replies[i].code); |
282 | 289 | } |
283 | - query_reply_end(); | |
290 | + query_reply_end(hSession); | |
284 | 291 | break; |
285 | 292 | case SF_RP_QLIST: |
286 | - trace_ds(&h3270," QueryList "); | |
293 | + trace_ds(hSession," QueryList "); | |
287 | 294 | if (partition != 0xff) { |
288 | - trace_ds(&h3270,"error: illegal partition\n"); | |
295 | + trace_ds(hSession,"error: illegal partition\n"); | |
289 | 296 | return PDS_BAD_CMD; |
290 | 297 | } |
291 | 298 | if (buflen < 6) { |
292 | - trace_ds(&h3270,"error: missing request type\n"); | |
299 | + trace_ds(hSession,"error: missing request type\n"); | |
293 | 300 | return PDS_BAD_CMD; |
294 | 301 | } |
295 | - query_reply_start(); | |
302 | + query_reply_start(hSession); | |
296 | 303 | switch (buf[5]) { |
297 | 304 | case SF_RPQ_LIST: |
298 | - trace_ds(&h3270,"List("); | |
305 | + trace_ds(hSession,"List("); | |
299 | 306 | if (buflen < 7) { |
300 | - trace_ds(&h3270,")\n"); | |
307 | + trace_ds(hSession,")\n"); | |
301 | 308 | do_query_reply(QR_NULL); |
302 | 309 | } else { |
303 | 310 | for (i = 6; i < buflen; i++) { |
304 | - trace_ds(&h3270,"%s%s", comma,see_qcode(buf[i])); | |
311 | + trace_ds(hSession,"%s%s", comma,see_qcode(buf[i])); | |
305 | 312 | comma = ","; |
306 | 313 | } |
307 | - trace_ds(&h3270,")\n"); | |
314 | + trace_ds(hSession,")\n"); | |
308 | 315 | for (i = 0; i < NSR; i++) { |
309 | 316 | if (memchr((char *)&buf[6], |
310 | 317 | (char)replies[i].code, |
... | ... | @@ -324,12 +331,12 @@ sf_read_part(unsigned char buf[], unsigned buflen) |
324 | 331 | } |
325 | 332 | break; |
326 | 333 | case SF_RPQ_EQUIV: |
327 | - trace_ds(&h3270,"Equivlent+List("); | |
334 | + trace_ds(hSession,"Equivlent+List("); | |
328 | 335 | for (i = 6; i < buflen; i++) { |
329 | - trace_ds(&h3270,"%s%s", comma, see_qcode(buf[i])); | |
336 | + trace_ds(hSession,"%s%s", comma, see_qcode(buf[i])); | |
330 | 337 | comma = ","; |
331 | 338 | } |
332 | - trace_ds(&h3270,")\n"); | |
339 | + trace_ds(hSession,")\n"); | |
333 | 340 | for (i = 0; i < NSR; i++) |
334 | 341 | #if defined(X3270_DBCS) /*[*/ |
335 | 342 | if (dbcs || replies[i].code != QR_DBCS_ASIA) |
... | ... | @@ -337,7 +344,7 @@ sf_read_part(unsigned char buf[], unsigned buflen) |
337 | 344 | do_query_reply(replies[i].code); |
338 | 345 | break; |
339 | 346 | case SF_RPQ_ALL: |
340 | - trace_ds(&h3270,"All\n"); | |
347 | + trace_ds(hSession,"All\n"); | |
341 | 348 | for (i = 0; i < NSR; i++) |
342 | 349 | #if defined(X3270_DBCS) /*[*/ |
343 | 350 | if (dbcs || replies[i].code != QR_DBCS_ASIA) |
... | ... | @@ -345,254 +352,277 @@ sf_read_part(unsigned char buf[], unsigned buflen) |
345 | 352 | do_query_reply(replies[i].code); |
346 | 353 | break; |
347 | 354 | default: |
348 | - trace_ds(&h3270,"unknown request type 0x%02x\n", buf[5]); | |
355 | + trace_ds(hSession,"unknown request type 0x%02x\n", buf[5]); | |
349 | 356 | return PDS_BAD_CMD; |
350 | 357 | } |
351 | - query_reply_end(); | |
358 | + query_reply_end(hSession); | |
352 | 359 | break; |
353 | 360 | case SNA_CMD_RMA: |
354 | - trace_ds(&h3270," ReadModifiedAll"); | |
361 | + trace_ds(hSession," ReadModifiedAll"); | |
355 | 362 | if (partition != 0x00) { |
356 | - trace_ds(&h3270," error: illegal partition\n"); | |
363 | + trace_ds(hSession," error: illegal partition\n"); | |
357 | 364 | return PDS_BAD_CMD; |
358 | 365 | } |
359 | - trace_ds(&h3270,"\n"); | |
360 | - ctlr_read_modified(&h3270, AID_QREPLY, True); | |
366 | + trace_ds(hSession,"\n"); | |
367 | + ctlr_read_modified(hSession, AID_QREPLY, True); | |
361 | 368 | break; |
362 | 369 | case SNA_CMD_RB: |
363 | - trace_ds(&h3270," ReadBuffer"); | |
370 | + trace_ds(hSession," ReadBuffer"); | |
364 | 371 | if (partition != 0x00) { |
365 | - trace_ds(&h3270," error: illegal partition\n"); | |
372 | + trace_ds(hSession," error: illegal partition\n"); | |
366 | 373 | return PDS_BAD_CMD; |
367 | 374 | } |
368 | - trace_ds(&h3270,"\n"); | |
369 | - ctlr_read_buffer(&h3270,AID_QREPLY); | |
375 | + trace_ds(hSession,"\n"); | |
376 | + ctlr_read_buffer(hSession,AID_QREPLY); | |
370 | 377 | break; |
371 | 378 | case SNA_CMD_RM: |
372 | - trace_ds(&h3270," ReadModified"); | |
379 | + trace_ds(hSession," ReadModified"); | |
373 | 380 | if (partition != 0x00) { |
374 | - trace_ds(&h3270," error: illegal partition\n"); | |
381 | + trace_ds(hSession," error: illegal partition\n"); | |
375 | 382 | return PDS_BAD_CMD; |
376 | 383 | } |
377 | - trace_ds(&h3270,"\n"); | |
378 | - ctlr_read_modified(&h3270, AID_QREPLY, False); | |
384 | + trace_ds(hSession,"\n"); | |
385 | + ctlr_read_modified(hSession, AID_QREPLY, False); | |
379 | 386 | break; |
380 | 387 | default: |
381 | - trace_ds(&h3270," unknown type 0x%02x\n", buf[4]); | |
388 | + trace_ds(hSession," unknown type 0x%02x\n", buf[4]); | |
382 | 389 | return PDS_BAD_CMD; |
383 | 390 | } |
384 | 391 | return PDS_OKAY_OUTPUT; |
385 | 392 | } |
386 | 393 | |
387 | -static enum pds | |
388 | -sf_erase_reset(unsigned char buf[], int buflen) | |
394 | +static enum pds sf_erase_reset(H3270 *hSession, unsigned char buf[], int buflen) | |
389 | 395 | { |
390 | 396 | if (buflen != 4) |
391 | 397 | { |
392 | - trace_ds(&h3270," error: wrong field length %d\n", buflen); | |
398 | + trace_ds(hSession," error: wrong field length %d\n", buflen); | |
393 | 399 | return PDS_BAD_CMD; |
394 | 400 | } |
395 | 401 | |
396 | 402 | switch (buf[3]) |
397 | 403 | { |
398 | 404 | case SF_ER_DEFAULT: |
399 | - trace_ds(&h3270," Default\n"); | |
400 | - ctlr_erase(&h3270,False); | |
405 | + trace_ds(hSession," Default\n"); | |
406 | + ctlr_erase(hSession,False); | |
401 | 407 | break; |
402 | 408 | |
403 | 409 | case SF_ER_ALT: |
404 | - trace_ds(&h3270," Alternate\n"); | |
405 | - ctlr_erase(&h3270,True); | |
410 | + trace_ds(hSession," Alternate\n"); | |
411 | + ctlr_erase(hSession,True); | |
406 | 412 | break; |
407 | 413 | |
408 | 414 | default: |
409 | - trace_ds(&h3270," unknown type 0x%02x\n", buf[3]); | |
415 | + trace_ds(hSession," unknown type 0x%02x\n", buf[3]); | |
410 | 416 | return PDS_BAD_CMD; |
411 | 417 | } |
412 | 418 | return PDS_OKAY_NO_OUTPUT; |
413 | 419 | } |
414 | 420 | |
415 | -static enum pds | |
416 | -sf_set_reply_mode(unsigned char buf[], int buflen) | |
421 | +static enum pds sf_set_reply_mode(H3270 *hSession, unsigned char buf[], int buflen) | |
417 | 422 | { |
418 | 423 | unsigned char partition; |
419 | 424 | int i; |
420 | 425 | const char *comma = "("; |
421 | 426 | |
422 | - if (buflen < 5) { | |
423 | - trace_ds(&h3270," error: wrong field length %d\n", buflen); | |
427 | + if (buflen < 5) | |
428 | + { | |
429 | + trace_ds(hSession," error: wrong field length %d\n", buflen); | |
424 | 430 | return PDS_BAD_CMD; |
425 | 431 | } |
426 | 432 | |
427 | 433 | partition = buf[3]; |
428 | - trace_ds(&h3270,"(0x%02x)", partition); | |
429 | - if (partition != 0x00) { | |
430 | - trace_ds(&h3270," error: illegal partition\n"); | |
434 | + trace_ds(hSession,"(0x%02x)", partition); | |
435 | + if (partition != 0x00) | |
436 | + { | |
437 | + trace_ds(hSession," error: illegal partition\n"); | |
431 | 438 | return PDS_BAD_CMD; |
432 | 439 | } |
433 | 440 | |
434 | - switch (buf[4]) { | |
435 | - case SF_SRM_FIELD: | |
436 | - trace_ds(&h3270," Field\n"); | |
441 | + switch (buf[4]) | |
442 | + { | |
443 | + case SF_SRM_FIELD: | |
444 | + trace_ds(hSession," Field\n"); | |
437 | 445 | break; |
438 | - case SF_SRM_XFIELD: | |
439 | - trace_ds(&h3270," ExtendedField\n"); | |
446 | + | |
447 | + case SF_SRM_XFIELD: | |
448 | + trace_ds(hSession," ExtendedField\n"); | |
440 | 449 | break; |
441 | - case SF_SRM_CHAR: | |
442 | - trace_ds(&h3270," Character"); | |
450 | + | |
451 | + case SF_SRM_CHAR: | |
452 | + trace_ds(hSession," Character"); | |
443 | 453 | break; |
444 | - default: | |
445 | - trace_ds(&h3270," unknown mode 0x%02x\n", buf[4]); | |
454 | + | |
455 | + default: | |
456 | + trace_ds(hSession," unknown mode 0x%02x\n", buf[4]); | |
446 | 457 | return PDS_BAD_CMD; |
447 | 458 | } |
448 | - h3270.reply_mode = buf[4]; | |
449 | - if (buf[4] == SF_SRM_CHAR) { | |
450 | - h3270.crm_nattr = buflen - 5; | |
451 | - for (i = 5; i < buflen; i++) { | |
452 | - h3270.crm_attr[i - 5] = buf[i]; | |
453 | - trace_ds(&h3270,"%s%s", comma, see_efa_only(buf[i])); | |
459 | + | |
460 | + hSession->reply_mode = buf[4]; | |
461 | + | |
462 | + if (buf[4] == SF_SRM_CHAR) | |
463 | + { | |
464 | + hSession->crm_nattr = buflen - 5; | |
465 | + for (i = 5; i < buflen; i++) | |
466 | + { | |
467 | + hSession->crm_attr[i - 5] = buf[i]; | |
468 | + trace_ds(hSession,"%s%s", comma, see_efa_only(buf[i])); | |
454 | 469 | comma = ","; |
455 | 470 | } |
456 | - trace_ds(&h3270,"%s\n", h3270.crm_nattr ? ")" : ""); | |
471 | + trace_ds(hSession,"%s\n", hSession->crm_nattr ? ")" : ""); | |
457 | 472 | } |
458 | 473 | return PDS_OKAY_NO_OUTPUT; |
459 | 474 | } |
460 | 475 | |
461 | -static enum pds | |
462 | -sf_create_partition(unsigned char buf[], int buflen) | |
476 | +static enum pds sf_create_partition(H3270 *hSession, unsigned char buf[], int buflen) | |
463 | 477 | { |
464 | 478 | unsigned char pid; |
465 | - unsigned char uom; /* unit of measure */ | |
479 | + unsigned char uom; /* unit of measure */ | |
466 | 480 | unsigned char am; /* addressing mode */ |
467 | 481 | unsigned char flags; /* flags */ |
468 | 482 | unsigned short h; /* height of presentation space */ |
469 | 483 | unsigned short w; /* width of presentation space */ |
470 | - unsigned short rv; /* viewport origin row */ | |
471 | - unsigned short cv; /* viewport origin column */ | |
472 | - unsigned short hv; /* viewport height */ | |
473 | - unsigned short wv; /* viewport width */ | |
474 | - unsigned short rw; /* window origin row */ | |
475 | - unsigned short cw; /* window origin column */ | |
476 | - unsigned short rs; /* scroll rows */ | |
484 | + unsigned short rv; /* viewport origin row */ | |
485 | + unsigned short cv; /* viewport origin column */ | |
486 | + unsigned short hv; /* viewport height */ | |
487 | + unsigned short wv; /* viewport width */ | |
488 | + unsigned short rw; /* window origin row */ | |
489 | + unsigned short cw; /* window origin column */ | |
490 | + unsigned short rs; /* scroll rows */ | |
477 | 491 | /* hole */ |
478 | - unsigned short pw; /* character cell point width */ | |
479 | - unsigned short ph; /* character cell point height */ | |
492 | + unsigned short pw; /* character cell point width */ | |
493 | + unsigned short ph; /* character cell point height */ | |
480 | 494 | |
481 | -#if defined(X3270_TRACE) /*[*/ | |
482 | - static const char *bit4[16] = { | |
495 | +#if defined(X3270_TRACE) | |
496 | + static const char *bit4[16] = | |
497 | + { | |
483 | 498 | "0000", "0001", "0010", "0011", |
484 | 499 | "0100", "0101", "0110", "0111", |
485 | 500 | "1000", "1001", "1010", "1011", |
486 | 501 | "1100", "1101", "1110", "1111" |
487 | 502 | }; |
488 | -#endif /*]*/ | |
503 | +#endif | |
489 | 504 | |
490 | - if (buflen > 3) { | |
491 | - trace_ds(&h3270,"("); | |
505 | + if (buflen > 3) | |
506 | + { | |
507 | + trace_ds(hSession,"("); | |
492 | 508 | |
493 | 509 | /* Partition. */ |
494 | 510 | pid = buf[3]; |
495 | - trace_ds(&h3270,"pid=0x%02x", pid); | |
496 | - if (pid != 0x00) { | |
497 | - trace_ds(&h3270,") error: illegal partition\n"); | |
511 | + trace_ds(hSession,"pid=0x%02x", pid); | |
512 | + if (pid != 0x00) | |
513 | + { | |
514 | + trace_ds(hSession,") error: illegal partition\n"); | |
498 | 515 | return PDS_BAD_CMD; |
499 | 516 | } |
500 | - } else | |
517 | + } | |
518 | + else | |
501 | 519 | pid = 0x00; |
502 | 520 | |
503 | - if (buflen > 4) { | |
521 | + if (buflen > 4) | |
522 | + { | |
504 | 523 | uom = (buf[4] & 0xf0) >> 4; |
505 | - trace_ds(&h3270,",uom=B'%s'", bit4[uom]); | |
524 | + trace_ds(hSession,",uom=B'%s'", bit4[uom]); | |
506 | 525 | if (uom != 0x0 && uom != 0x02) { |
507 | - trace_ds(&h3270,") error: illegal units\n"); | |
526 | + trace_ds(hSession,") error: illegal units\n"); | |
508 | 527 | return PDS_BAD_CMD; |
509 | 528 | } |
510 | 529 | am = buf[4] & 0x0f; |
511 | - trace_ds(&h3270,",am=B'%s'", bit4[am]); | |
512 | - if (am > 0x2) { | |
513 | - trace_ds(&h3270,") error: illegal a-mode\n"); | |
530 | + trace_ds(hSession,",am=B'%s'", bit4[am]); | |
531 | + if (am > 0x2) | |
532 | + { | |
533 | + trace_ds(hSession,") error: illegal a-mode\n"); | |
514 | 534 | return PDS_BAD_CMD; |
515 | 535 | } |
516 | - } else { | |
536 | + } | |
537 | + else | |
538 | + { | |
517 | 539 | uom = 0; |
518 | 540 | am = 0; |
519 | 541 | } |
520 | 542 | |
521 | - if (buflen > 5) { | |
543 | + if (buflen > 5) | |
544 | + { | |
522 | 545 | flags = buf[5]; |
523 | - trace_ds(&h3270,",flags=0x%02x", flags); | |
546 | + trace_ds(hSession,",flags=0x%02x", flags); | |
524 | 547 | } else |
525 | 548 | flags = 0; |
526 | 549 | |
527 | - if (buflen > 7) { | |
550 | + if (buflen > 7) | |
551 | + { | |
528 | 552 | GET16(h, &buf[6]); |
529 | - trace_ds(&h3270,",h=%d", h); | |
553 | + trace_ds(hSession,",h=%d", h); | |
530 | 554 | } else |
531 | - h = h3270.maxROWS; | |
555 | + h = hSession->maxROWS; | |
532 | 556 | |
533 | - if (buflen > 9) { | |
557 | + if (buflen > 9) | |
558 | + { | |
534 | 559 | GET16(w, &buf[8]); |
535 | - trace_ds(&h3270,",w=%d", w); | |
560 | + trace_ds(hSession,",w=%d", w); | |
536 | 561 | } else |
537 | - w = h3270.maxCOLS; | |
562 | + w = hSession->maxCOLS; | |
538 | 563 | |
539 | - if (buflen > 11) { | |
564 | + if (buflen > 11) | |
565 | + { | |
540 | 566 | GET16(rv, &buf[10]); |
541 | - trace_ds(&h3270,",rv=%d", rv); | |
567 | + trace_ds(hSession,",rv=%d", rv); | |
542 | 568 | } else |
543 | 569 | rv = 0; |
544 | 570 | |
545 | - if (buflen > 13) { | |
571 | + if (buflen > 13) | |
572 | + { | |
546 | 573 | GET16(cv, &buf[12]); |
547 | - trace_ds(&h3270,",cv=%d", cv); | |
574 | + trace_ds(hSession,",cv=%d", cv); | |
548 | 575 | } else |
549 | 576 | cv = 0; |
550 | 577 | |
551 | 578 | if (buflen > 15) { |
552 | 579 | GET16(hv, &buf[14]); |
553 | - trace_ds(&h3270,",hv=%d", hv); | |
580 | + trace_ds(hSession,",hv=%d", hv); | |
554 | 581 | } else |
555 | - hv = (h > h3270.maxROWS)? h3270.maxROWS: h; | |
582 | + hv = (h > hSession->maxROWS)? hSession->maxROWS: h; | |
556 | 583 | |
557 | - if (buflen > 17) { | |
584 | + if (buflen > 17) | |
585 | + { | |
558 | 586 | GET16(wv, &buf[16]); |
559 | - trace_ds(&h3270,",wv=%d", wv); | |
587 | + trace_ds(hSession,",wv=%d", wv); | |
560 | 588 | } else |
561 | - wv = (w > h3270.maxCOLS)? h3270.maxCOLS: w; | |
589 | + wv = (w > hSession->maxCOLS)? hSession->maxCOLS: w; | |
562 | 590 | |
563 | - if (buflen > 19) { | |
591 | + if (buflen > 19) | |
592 | + { | |
564 | 593 | GET16(rw, &buf[18]); |
565 | - trace_ds(&h3270,",rw=%d", rw); | |
594 | + trace_ds(hSession,",rw=%d", rw); | |
566 | 595 | } else |
567 | 596 | rw = 0; |
568 | 597 | |
569 | - if (buflen > 21) { | |
598 | + if (buflen > 21) | |
599 | + { | |
570 | 600 | GET16(cw, &buf[20]); |
571 | - trace_ds(&h3270,",cw=%d", cw); | |
601 | + trace_ds(hSession,",cw=%d", cw); | |
572 | 602 | } else |
573 | 603 | cw = 0; |
574 | 604 | |
575 | 605 | if (buflen > 23) { |
576 | 606 | GET16(rs, &buf[22]); |
577 | - trace_ds(&h3270,",rs=%d", rs); | |
607 | + trace_ds(hSession,",rs=%d", rs); | |
578 | 608 | } else |
579 | 609 | rs = (h > hv)? 1: 0; |
580 | 610 | |
581 | 611 | if (buflen > 27) { |
582 | 612 | GET16(pw, &buf[26]); |
583 | - trace_ds(&h3270,",pw=%d", pw); | |
613 | + trace_ds(hSession,",pw=%d", pw); | |
584 | 614 | } else |
585 | 615 | pw = *char_width; |
586 | 616 | |
587 | 617 | if (buflen > 29) { |
588 | 618 | GET16(ph, &buf[28]); |
589 | - trace_ds(&h3270,",ph=%d", ph); | |
619 | + trace_ds(hSession,",ph=%d", ph); | |
590 | 620 | } else |
591 | 621 | ph = *char_height; |
592 | - trace_ds(&h3270,")\n"); | |
622 | + trace_ds(hSession,")\n"); | |
593 | 623 | |
594 | - cursor_move(&h3270,0); | |
595 | - h3270.buffer_addr = 0; | |
624 | + cursor_move(hSession,0); | |
625 | + hSession->buffer_addr = 0; | |
596 | 626 | |
597 | 627 | return PDS_OKAY_NO_OUTPUT; |
598 | 628 | } |
... | ... | @@ -651,12 +681,11 @@ sf_outbound_ds(unsigned char buf[], int buflen) |
651 | 681 | return PDS_OKAY_NO_OUTPUT; |
652 | 682 | } |
653 | 683 | |
654 | -static void | |
655 | -query_reply_start(void) | |
684 | +static void query_reply_start(H3270 *hSession) | |
656 | 685 | { |
657 | - h3270.obptr = h3270.obuf; | |
658 | - space3270out(&h3270,1); | |
659 | - *h3270.obptr++ = AID_SF; | |
686 | + hSession->obptr = hSession->obuf; | |
687 | + space3270out(hSession,1); | |
688 | + *hSession->obptr++ = AID_SF; | |
660 | 689 | qr_in_progress = True; |
661 | 690 | } |
662 | 691 | |
... | ... | @@ -692,9 +721,9 @@ do_query_reply(unsigned char code) |
692 | 721 | |
693 | 722 | more = False; |
694 | 723 | if (replies[i].single_fn) |
695 | - replies[i].single_fn(); | |
724 | + replies[i].single_fn(&h3270); | |
696 | 725 | else |
697 | - full = replies[i].multi_fn(&subindex, &more); | |
726 | + full = replies[i].multi_fn(&h3270,&subindex, &more); | |
698 | 727 | |
699 | 728 | if (full) { |
700 | 729 | int len; |
... | ... | @@ -711,88 +740,89 @@ do_query_reply(unsigned char code) |
711 | 740 | } while (more); |
712 | 741 | } |
713 | 742 | |
714 | -static void | |
715 | -do_qr_null(void) | |
743 | +static void do_qr_null(H3270 *hSession) | |
716 | 744 | { |
717 | - trace_ds(&h3270,"> QueryReply(Null)\n"); | |
745 | + trace_ds(hSession,"> QueryReply(Null)\n"); | |
718 | 746 | } |
719 | 747 | |
720 | -static void | |
721 | -do_qr_summary(void) | |
748 | +static void do_qr_summary(H3270 *hSession) | |
722 | 749 | { |
723 | 750 | int i; |
724 | 751 | const char *comma = ""; |
725 | 752 | |
726 | - trace_ds(&h3270,"> QueryReply(Summary("); | |
727 | - space3270out(&h3270,NSR); | |
728 | - for (i = 0; i < NSR; i++) { | |
753 | + trace_ds(hSession,"> QueryReply(Summary("); | |
754 | + space3270out(hSession,NSR); | |
755 | + for (i = 0; i < NSR; i++) | |
756 | + { | |
729 | 757 | #if defined(X3270_DBCS) /*[*/ |
730 | - if (dbcs || replies[i].code != QR_DBCS_ASIA) { | |
758 | + if (dbcs || replies[i].code != QR_DBCS_ASIA) | |
759 | + { | |
731 | 760 | #endif /*]*/ |
732 | - trace_ds(&h3270,"%s%s", comma, see_qcode(replies[i].code)); | |
761 | + trace_ds(hSession,"%s%s", comma, see_qcode(replies[i].code)); | |
733 | 762 | comma = ","; |
734 | - *h3270.obptr++ = replies[i].code; | |
763 | + *hSession->obptr++ = replies[i].code; | |
735 | 764 | #if defined(X3270_DBCS) /*[*/ |
736 | 765 | } |
737 | 766 | #endif /*]*/ |
738 | 767 | } |
739 | - trace_ds(&h3270,"))\n"); | |
768 | + trace_ds(hSession,"))\n"); | |
740 | 769 | } |
741 | 770 | |
742 | -static void | |
743 | -do_qr_usable_area(void) | |
771 | +static void do_qr_usable_area(H3270 *hSession) | |
744 | 772 | { |
745 | 773 | unsigned short num, denom; |
746 | 774 | |
747 | - trace_ds(&h3270,"> QueryReply(UsableArea)\n"); | |
748 | - space3270out(&h3270,19); | |
749 | - *h3270.obptr++ = 0x01; /* 12/14-bit addressing */ | |
750 | - *h3270.obptr++ = 0x00; /* no special character features */ | |
751 | - SET16(h3270.obptr, h3270.maxCOLS); /* usable width */ | |
752 | - SET16(h3270.obptr, h3270.maxROWS); /* usable height */ | |
753 | - *h3270.obptr++ = 0x01; /* units (mm) */ | |
775 | + trace_ds(hSession,"> QueryReply(UsableArea)\n"); | |
776 | + space3270out(hSession,19); | |
777 | + *hSession->obptr++ = 0x01; /* 12/14-bit addressing */ | |
778 | + *hSession->obptr++ = 0x00; /* no special character features */ | |
779 | + SET16(hSession->obptr, hSession->maxCOLS); /* usable width */ | |
780 | + SET16(hSession->obptr, hSession->maxROWS); /* usable height */ | |
781 | + *hSession->obptr++ = 0x01; /* units (mm) */ | |
754 | 782 | num = display_widthMM(); |
755 | 783 | denom = display_width(); |
756 | - while (!(num %2) && !(denom % 2)) { | |
784 | + while (!(num %2) && !(denom % 2)) | |
785 | + { | |
757 | 786 | num /= 2; |
758 | 787 | denom /= 2; |
759 | 788 | } |
760 | - SET16(h3270.obptr, (int)num); /* Xr numerator */ | |
761 | - SET16(h3270.obptr, (int)denom); /* Xr denominator */ | |
789 | + SET16(hSession->obptr, (int)num); /* Xr numerator */ | |
790 | + SET16(hSession->obptr, (int)denom); /* Xr denominator */ | |
762 | 791 | num = display_heightMM(); |
763 | 792 | denom = display_height(); |
764 | - while (!(num %2) && !(denom % 2)) { | |
793 | + while (!(num %2) && !(denom % 2)) | |
794 | + { | |
765 | 795 | num /= 2; |
766 | 796 | denom /= 2; |
767 | 797 | } |
768 | - SET16(h3270.obptr, (int)num); /* Yr numerator */ | |
769 | - SET16(h3270.obptr, (int)denom); /* Yr denominator */ | |
770 | - *h3270.obptr++ = *char_width; /* AW */ | |
771 | - *h3270.obptr++ = *char_height;/* AH */ | |
772 | - SET16(h3270.obptr, h3270.maxCOLS * h3270.maxROWS); /* buffer, questionable */ | |
798 | + SET16(hSession->obptr, (int)num); /* Yr numerator */ | |
799 | + SET16(hSession->obptr, (int)denom); /* Yr denominator */ | |
800 | + *hSession->obptr++ = *char_width; /* AW */ | |
801 | + *hSession->obptr++ = *char_height; /* AH */ | |
802 | + SET16(hSession->obptr, hSession->maxCOLS * hSession->maxROWS); /* buffer, questionable */ | |
773 | 803 | } |
774 | 804 | |
775 | -static void | |
776 | -do_qr_color(void) | |
805 | +static void do_qr_color(H3270 *hSession) | |
777 | 806 | { |
778 | 807 | int i; |
779 | 808 | int color_max; |
780 | 809 | |
781 | - trace_ds(&h3270,"> QueryReply(Color)\n"); | |
810 | + trace_ds(hSession,"> QueryReply(Color)\n"); | |
782 | 811 | |
783 | - color_max = h3270.color8 ? 8: 16; /* report on 8 or 16 colors */ | |
812 | + color_max = hSession->color8 ? 8: 16; /* report on 8 or 16 colors */ | |
784 | 813 | |
785 | - space3270out(&h3270,4 + 2*15); | |
786 | - *h3270.obptr++ = 0x00; /* no options */ | |
787 | - *h3270.obptr++ = color_max; /* report on 8 or 16 colors */ | |
788 | - *h3270.obptr++ = 0x00; /* default color: */ | |
789 | - *h3270.obptr++ = 0xf0 + COLOR_GREEN; /* green */ | |
790 | - for (i = 0xf1; i < 0xf1 + color_max - 1; i++) { | |
791 | - *h3270.obptr++ = i; | |
792 | - if (h3270.m3279) | |
793 | - *h3270.obptr++ = i; | |
814 | + space3270out(hSession,4 + 2*15); | |
815 | + *hSession->obptr++ = 0x00; /* no options */ | |
816 | + *hSession->obptr++ = color_max; /* report on 8 or 16 colors */ | |
817 | + *hSession->obptr++ = 0x00; /* default color: */ | |
818 | + *hSession->obptr++ = 0xf0 + COLOR_GREEN; /* green */ | |
819 | + for (i = 0xf1; i < 0xf1 + color_max - 1; i++) | |
820 | + { | |
821 | + *hSession->obptr++ = i; | |
822 | + if (hSession->m3279) | |
823 | + *hSession->obptr++ = i; | |
794 | 824 | else |
795 | - *h3270.obptr++ = 0x00; | |
825 | + *hSession->obptr++ = 0x00; | |
796 | 826 | } |
797 | 827 | |
798 | 828 | /* |
... | ... | @@ -809,63 +839,58 @@ do_qr_color(void) |
809 | 839 | */ |
810 | 840 | } |
811 | 841 | |
812 | -static void | |
813 | -do_qr_highlighting(void) | |
842 | +static void do_qr_highlighting(H3270 *hSession) | |
814 | 843 | { |
815 | - trace_ds(&h3270,"> QueryReply(Highlighting)\n"); | |
816 | - space3270out(&h3270,11); | |
817 | - *h3270.obptr++ = 5; /* report on 5 pairs */ | |
818 | - *h3270.obptr++ = XAH_DEFAULT; /* default: */ | |
819 | - *h3270.obptr++ = XAH_NORMAL; /* normal */ | |
820 | - *h3270.obptr++ = XAH_BLINK; /* blink: */ | |
821 | - *h3270.obptr++ = XAH_BLINK; /* blink */ | |
822 | - *h3270.obptr++ = XAH_REVERSE; /* reverse: */ | |
823 | - *h3270.obptr++ = XAH_REVERSE; /* reverse */ | |
824 | - *h3270.obptr++ = XAH_UNDERSCORE; /* underscore: */ | |
825 | - *h3270.obptr++ = XAH_UNDERSCORE; /* underscore */ | |
826 | - *h3270.obptr++ = XAH_INTENSIFY; /* intensify: */ | |
827 | - *h3270.obptr++ = XAH_INTENSIFY; /* intensify */ | |
844 | + trace_ds(hSession,"> QueryReply(Highlighting)\n"); | |
845 | + space3270out(hSession,11); | |
846 | + *hSession->obptr++ = 5; /* report on 5 pairs */ | |
847 | + *hSession->obptr++ = XAH_DEFAULT; /* default: */ | |
848 | + *hSession->obptr++ = XAH_NORMAL; /* normal */ | |
849 | + *hSession->obptr++ = XAH_BLINK; /* blink: */ | |
850 | + *hSession->obptr++ = XAH_BLINK; /* blink */ | |
851 | + *hSession->obptr++ = XAH_REVERSE; /* reverse: */ | |
852 | + *hSession->obptr++ = XAH_REVERSE; /* reverse */ | |
853 | + *hSession->obptr++ = XAH_UNDERSCORE; /* underscore: */ | |
854 | + *hSession->obptr++ = XAH_UNDERSCORE; /* underscore */ | |
855 | + *hSession->obptr++ = XAH_INTENSIFY; /* intensify: */ | |
856 | + *hSession->obptr++ = XAH_INTENSIFY; /* intensify */ | |
828 | 857 | } |
829 | 858 | |
830 | -static void | |
831 | -do_qr_reply_modes(void) | |
859 | +static void do_qr_reply_modes(H3270 *hSession) | |
832 | 860 | { |
833 | - trace_ds(&h3270,"> QueryReply(ReplyModes)\n"); | |
834 | - space3270out(&h3270,3); | |
835 | - *h3270.obptr++ = SF_SRM_FIELD; | |
836 | - *h3270.obptr++ = SF_SRM_XFIELD; | |
837 | - *h3270.obptr++ = SF_SRM_CHAR; | |
861 | + trace_ds(hSession,"> QueryReply(ReplyModes)\n"); | |
862 | + space3270out(hSession,3); | |
863 | + *hSession->obptr++ = SF_SRM_FIELD; | |
864 | + *hSession->obptr++ = SF_SRM_XFIELD; | |
865 | + *hSession->obptr++ = SF_SRM_CHAR; | |
838 | 866 | } |
839 | 867 | |
840 | 868 | #if defined(X3270_DBCS) /*[*/ |
841 | -static void | |
842 | -do_qr_dbcs_asia(void) | |
869 | +static void do_qr_dbcs_asia(H3270 *hSession) | |
843 | 870 | { |
844 | 871 | /* XXX: Should we support this, even when not in DBCS mode? */ |
845 | - trace_ds(&h3270,"> QueryReply(DbcsAsia)\n"); | |
846 | - space3270out(7); | |
847 | - *obptr++ = 0x00; /* flags (none) */ | |
848 | - *obptr++ = 0x03; /* field length 3 */ | |
849 | - *obptr++ = 0x01; /* SI/SO supported */ | |
850 | - *obptr++ = 0x80; /* character set ID 0x80 */ | |
851 | - *obptr++ = 0x03; /* field length 3 */ | |
852 | - *obptr++ = 0x02; /* input control */ | |
853 | - *obptr++ = 0x01; /* creation supported */ | |
872 | + trace_ds(hSession,"> QueryReply(DbcsAsia)\n"); | |
873 | + space3270out(hSession,7); | |
874 | + *hSession->obptr++ = 0x00; /* flags (none) */ | |
875 | + *hSession->obptr++ = 0x03; /* field length 3 */ | |
876 | + *hSession->obptr++ = 0x01; /* SI/SO supported */ | |
877 | + *hSession->obptr++ = 0x80; /* character set ID 0x80 */ | |
878 | + *hSession->obptr++ = 0x03; /* field length 3 */ | |
879 | + *hSession->obptr++ = 0x02; /* input control */ | |
880 | + *hSession->obptr++ = 0x01; /* creation supported */ | |
854 | 881 | } |
855 | 882 | #endif /*]*/ |
856 | 883 | |
857 | -static void | |
858 | -do_qr_alpha_part(void) | |
884 | +static void do_qr_alpha_part(H3270 *hSession) | |
859 | 885 | { |
860 | - trace_ds(&h3270,"> QueryReply(AlphanumericPartitions)\n"); | |
861 | - space3270out(&h3270,4); | |
862 | - *h3270.obptr++ = 0; /* 1 partition */ | |
863 | - SET16(h3270.obptr, h3270.maxROWS * h3270.maxCOLS); /* buffer space */ | |
864 | - *h3270.obptr++ = 0; /* no special features */ | |
886 | + trace_ds(hSession,"> QueryReply(AlphanumericPartitions)\n"); | |
887 | + space3270out(hSession,4); | |
888 | + *hSession->obptr++ = 0; /* 1 partition */ | |
889 | + SET16(hSession->obptr, hSession->maxROWS * hSession->maxCOLS); /* buffer space */ | |
890 | + *hSession->obptr++ = 0; /* no special features */ | |
865 | 891 | } |
866 | 892 | |
867 | -static void | |
868 | -do_qr_charsets(void) | |
893 | +static void do_qr_charsets(H3270 *hSession) | |
869 | 894 | { |
870 | 895 | trace_ds(&h3270,"> QueryReply(CharacterSets)\n"); |
871 | 896 | space3270out(&h3270,64); |
... | ... | @@ -948,39 +973,36 @@ do_qr_charsets(void) |
948 | 973 | } |
949 | 974 | |
950 | 975 | #if defined(X3270_FT) /*[*/ |
951 | -static void | |
952 | -do_qr_ddm(void) | |
976 | +static void do_qr_ddm(H3270 *hSession) | |
953 | 977 | { |
954 | - set_dft_buffersize(&h3270); | |
955 | - | |
956 | - trace_ds(&h3270,"> QueryReply(DistributedDataManagement)\n"); | |
957 | - space3270out(&h3270,8); | |
958 | - SET16(h3270.obptr,0); /* set reserved field to 0 */ | |
959 | - SET16(h3270.obptr, h3270.dft_buffersize); /* set inbound length limit INLIM */ | |
960 | - SET16(h3270.obptr, h3270.dft_buffersize); /* set outbound length limit OUTLIM */ | |
961 | - SET16(h3270.obptr, 0x0101); /* NSS=01, DDMSS=01 */ | |
978 | + set_dft_buffersize(hSession); | |
979 | + | |
980 | + trace_ds(hSession,"> QueryReply(DistributedDataManagement)\n"); | |
981 | + space3270out(hSession,8); | |
982 | + SET16(hSession->obptr,0); /* set reserved field to 0 */ | |
983 | + SET16(hSession->obptr, hSession->dft_buffersize); /* set inbound length limit INLIM */ | |
984 | + SET16(hSession->obptr, hSession->dft_buffersize); /* set outbound length limit OUTLIM */ | |
985 | + SET16(hSession->obptr, 0x0101); /* NSS=01, DDMSS=01 */ | |
962 | 986 | } |
963 | 987 | #endif /*]*/ |
964 | 988 | |
965 | -static void | |
966 | -do_qr_imp_part(void) | |
989 | +static void do_qr_imp_part(H3270 *hSession) | |
967 | 990 | { |
968 | - trace_ds(&h3270,"> QueryReply(ImplicitPartition)\n"); | |
969 | - space3270out(&h3270,13); | |
970 | - *h3270.obptr++ = 0x0; /* reserved */ | |
971 | - *h3270.obptr++ = 0x0; | |
972 | - *h3270.obptr++ = 0x0b; /* length of display size */ | |
973 | - *h3270.obptr++ = 0x01; /* "implicit partition size" */ | |
974 | - *h3270.obptr++ = 0x00; /* reserved */ | |
975 | - SET16(h3270.obptr, 80); /* implicit partition width */ | |
976 | - SET16(h3270.obptr, 24); /* implicit partition height */ | |
977 | - SET16(h3270.obptr, h3270.maxCOLS); /* alternate height */ | |
978 | - SET16(h3270.obptr, h3270.maxROWS); /* alternate width */ | |
991 | + trace_ds(hSession,"> QueryReply(ImplicitPartition)\n"); | |
992 | + space3270out(hSession,13); | |
993 | + *hSession->obptr++ = 0x0; /* reserved */ | |
994 | + *hSession->obptr++ = 0x0; | |
995 | + *hSession->obptr++ = 0x0b; /* length of display size */ | |
996 | + *hSession->obptr++ = 0x01; /* "implicit partition size" */ | |
997 | + *hSession->obptr++ = 0x00; /* reserved */ | |
998 | + SET16(hSession->obptr, 80); /* implicit partition width */ | |
999 | + SET16(hSession->obptr, 24); /* implicit partition height */ | |
1000 | + SET16(hSession->obptr, hSession->maxCOLS); /* alternate height */ | |
1001 | + SET16(hSession->obptr, hSession->maxROWS); /* alternate width */ | |
979 | 1002 | } |
980 | 1003 | |
981 | -static void | |
982 | -query_reply_end(void) | |
1004 | +static void query_reply_end(H3270 *hSession) | |
983 | 1005 | { |
984 | - net_output(&h3270); | |
985 | - kybd_inhibit(&h3270,True); | |
1006 | + net_output(hSession); | |
1007 | + kybd_inhibit(hSession,True); | |
986 | 1008 | } | ... | ... |
src/lib3270/sf.h
1 | 1 | /* |
2 | - * Copyright 1995, 1999, 2000 by Paul Mattes. | |
3 | - * Permission to use, copy, modify, and distribute this software and its | |
4 | - * documentation for any purpose and without fee is hereby granted, | |
5 | - * provided that the above copyright notice appear in all copies and that | |
6 | - * both that copyright notice and this permission notice appear in | |
7 | - * supporting documentation. | |
8 | - * | |
9 | - * x3270, c3270, s3270, tcl3270 and pr3287 are distributed in the hope that | |
10 | - * they will be useful, but WITHOUT ANY WARRANTY; without even the implied | |
11 | - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | - * file LICENSE for more details. | |
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
5 | + * | |
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
7 | + * | |
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
10 | + * Free Software Foundation. | |
11 | + * | |
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
15 | + * obter mais detalhes. | |
16 | + * | |
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
20 | + * | |
21 | + * Este programa está nomeado como sf.h e possui - linhas de código. | |
22 | + * | |
23 | + * Contatos: | |
24 | + * | |
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
27 | + * licinio@bb.com.br (Licínio Luis Branco) | |
28 | + * kraucer@bb.com.br (Kraucer Fernandes Mazuco) | |
29 | + * | |
13 | 30 | */ |
14 | 31 | |
15 | -typedef void qr_single_fn_t(void); | |
32 | +typedef void qr_single_fn_t(H3270 *hSession); | |
16 | 33 | |
17 | 34 | LIB3270_INTERNAL qr_single_fn_t do_qr_rpqnames; |
18 | 35 | |
19 | -LIB3270_INTERNAL enum pds write_structured_field(unsigned char buf[], int buflen); | |
36 | +LIB3270_INTERNAL enum pds write_structured_field(H3270 *hSession, unsigned char buf[], int buflen); | ... | ... |
src/pw3270/filetransfer.c
... | ... | @@ -605,13 +605,13 @@ static void run_ft_dialog(GObject *action, GtkWidget *widget, struct ftdialog *d |
605 | 605 | ft->message = ft_message; |
606 | 606 | |
607 | 607 | gtk_widget_show_all(ftdialog); |
608 | - lib3270_ft_start(ft); | |
608 | + lib3270_ft_start(v3270_get_session(widget)); | |
609 | 609 | |
610 | 610 | trace("%s: Running dialog %p",__FUNCTION__,ftdialog); |
611 | 611 | gtk_dialog_run(GTK_DIALOG(ftdialog)); |
612 | 612 | trace("%s: Dialog %p ends",__FUNCTION__,ftdialog); |
613 | 613 | |
614 | - lib3270_ft_destroy(ft); | |
614 | + lib3270_ft_destroy(v3270_get_session(widget)); | |
615 | 615 | |
616 | 616 | gtk_widget_destroy(ftdialog); |
617 | 617 | } | ... | ... |