Commit 5d70e80ba1ee6504e8de77ac6e3233420905b384

Authored by Perry Werneck
1 parent 649883fc

Adding method to set field and jump to next.

src/core/keyboard/kybd.c
@@ -1631,17 +1631,17 @@ int lib3270_get_field_end(H3270 *hSession, int baddr) @@ -1631,17 +1631,17 @@ int lib3270_get_field_end(H3270 *hSession, int baddr)
1631 #if defined(X3270_ANSI) /*[*/ 1631 #if defined(X3270_ANSI) /*[*/
1632 if (IN_ANSI) 1632 if (IN_ANSI)
1633 { 1633 {
1634 - return errno = EINVAL; 1634 + return -(errno = ENOTSUP);
1635 } 1635 }
1636 #endif /*]*/ 1636 #endif /*]*/
1637 1637
1638 if (!hSession->formatted) 1638 if (!hSession->formatted)
1639 - return errno = EINVAL; 1639 + return -(errno = ENOTSUP);
1640 1640
1641 faddr = lib3270_field_addr(hSession,baddr); 1641 faddr = lib3270_field_addr(hSession,baddr);
1642 fa = hSession->ea_buf[faddr].fa; 1642 fa = hSession->ea_buf[faddr].fa;
1643 if (faddr == baddr || FA_IS_PROTECTED(fa)) 1643 if (faddr == baddr || FA_IS_PROTECTED(fa))
1644 - return errno = EPERM; 1644 + return -(errno = EPERM);
1645 1645
1646 baddr = faddr; 1646 baddr = faddr;
1647 while (True) 1647 while (True)
src/core/paste.c
@@ -295,6 +295,59 @@ LIB3270_EXPORT int lib3270_set_string_at_address(H3270 *hSession, int baddr, con @@ -295,6 +295,59 @@ LIB3270_EXPORT int lib3270_set_string_at_address(H3270 *hSession, int baddr, con
295 return rc; 295 return rc;
296 } 296 }
297 297
  298 +LIB3270_EXPORT int lib3270_set_field(H3270 *hSession, const char *text, int length)
  299 +{
  300 + int addr;
  301 + int numchars = 0;
  302 +
  303 + if(!text)
  304 + return - (errno = EINVAL);
  305 +
  306 + if(check_online_session(hSession))
  307 + return - errno;
  308 +
  309 + if(hSession->kybdlock)
  310 + return - (errno = EPERM);
  311 +
  312 + if (!hSession->formatted)
  313 + return - (errno = ENOTSUP);
  314 +
  315 + if(length < 0)
  316 + length = (int) strlen((const char *) text);
  317 +
  318 + addr = lib3270_field_addr(hSession,hSession->cursor_addr);
  319 + if(addr < 0)
  320 + return addr;
  321 +
  322 + if(hSession->selected && !lib3270_get_toggle(hSession,LIB3270_TOGGLE_KEEP_SELECTED))
  323 + lib3270_unselect(hSession);
  324 +
  325 + hSession->cbk.suspend(hSession);
  326 + hSession->cursor_addr = addr;
  327 + numchars = set_string(hSession, (const unsigned char *) text, length);
  328 + hSession->cbk.resume(hSession);
  329 +
  330 + if(numchars < 0)
  331 + return numchars;
  332 +
  333 + // Find the end of the field.
  334 + addr = lib3270_get_field_end(hSession,addr);
  335 + if(addr < 0)
  336 + return addr;
  337 +
  338 + addr = lib3270_get_next_unprotected(hSession, addr);
  339 +
  340 + if(addr > 0) {
  341 + addr = lib3270_set_cursor_address(hSession,addr);
  342 + if(addr < 0)
  343 + return addr;
  344 + }
  345 +
  346 + return hSession->cursor_addr;
  347 +
  348 +}
  349 +
  350 +
298 LIB3270_EXPORT int lib3270_set_string(H3270 *hSession, const unsigned char *str, int length) 351 LIB3270_EXPORT int lib3270_set_string(H3270 *hSession, const unsigned char *str, int length)
299 { 352 {
300 int rc; 353 int rc;
src/include/lib3270.h
@@ -660,6 +660,26 @@ @@ -660,6 +660,26 @@
660 LIB3270_EXPORT int lib3270_translate_to_address(const H3270 *hSession, unsigned int row, unsigned int col); 660 LIB3270_EXPORT int lib3270_translate_to_address(const H3270 *hSession, unsigned int row, unsigned int col);
661 661
662 /** 662 /**
  663 + * @brief Set field contents, jump to the next one.
  664 + *
  665 + * Set the string inside the corrent field, jump to the next one.
  666 + *
  667 + * @param hSession Session handle.
  668 + * @param text String to input.
  669 + * @param length Length of the string (-1 for auto-detect).
  670 + *
  671 + * @return address of the cursor, negative if failed.
  672 + *
  673 + * @retval 0 No next field.
  674 + * @retval -EPERM The keyboard is locked.
  675 + * @retval -ENOTCONN Disconnected from host.
  676 + * @retval -ENODATA No field at the current cursor position.
  677 + * @retval -ENOTSUP The screen is not formatted.
  678 + *
  679 + */
  680 + LIB3270_EXPORT int lib3270_set_field(H3270 *hSession, const char *text, int length);
  681 +
  682 + /**
663 * @brief Set string at current cursor position. 683 * @brief Set string at current cursor position.
664 * 684 *
665 * Returns are ignored; newlines mean "move to beginning of next line"; 685 * Returns are ignored; newlines mean "move to beginning of next line";
@@ -1178,7 +1198,10 @@ @@ -1178,7 +1198,10 @@
1178 * @param hSession Session handle. 1198 * @param hSession Session handle.
1179 * @param baddr Field address. 1199 * @param baddr Field address.
1180 * 1200 *
1181 - * @return address of the first blank or -1 if invalid. 1201 + * @return address of the first blank or negative if invalid.
  1202 + *
  1203 + * @retval -ENOTSUP Screen is not formatted.
  1204 + * @retval -EPERM Current cursor position is protected.
1182 */ 1205 */
1183 LIB3270_EXPORT int lib3270_get_field_end(H3270 *hSession, int baddr); 1206 LIB3270_EXPORT int lib3270_get_field_end(H3270 *hSession, int baddr);
1184 1207
@@ -1190,10 +1213,10 @@ @@ -1190,10 +1213,10 @@
1190 * 1213 *
1191 * @return field address or negative if the screen isn't formatted (sets errno). 1214 * @return field address or negative if the screen isn't formatted (sets errno).
1192 * 1215 *
1193 - * @exception -ENOTCONN Not connected to host.  
1194 - * @exception -EOVERFLOW Invalid position.  
1195 - * @exception -ENOTSUP Screen is not formatted.  
1196 - * @exception -ENODATA No field at the address. 1216 + * @retval -ENOTCONN Not connected to host.
  1217 + * @retval -EOVERFLOW Invalid position.
  1218 + * @retval -ENOTSUP Screen is not formatted.
  1219 + * @retval -ENODATA No field at the address.
1197 * 1220 *
1198 */ 1221 */
1199 LIB3270_EXPORT int lib3270_field_addr(const H3270 *hSession, int baddr); 1222 LIB3270_EXPORT int lib3270_field_addr(const H3270 *hSession, int baddr);