fpdf_formfill.h 79.5 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef PUBLIC_FPDF_FORMFILL_H_
#define PUBLIC_FPDF_FORMFILL_H_

// clang-format off
// NOLINTNEXTLINE(build/include)
#include "fpdfview.h"

// These values are return values for a public API, so should not be changed
// other than the count when adding new values.
#define FORMTYPE_NONE 0            // Document contains no forms
#define FORMTYPE_ACRO_FORM 1       // Forms are specified using AcroForm spec
#define FORMTYPE_XFA_FULL 2        // Forms are specified using entire XFA spec
#define FORMTYPE_XFA_FOREGROUND 3  // Forms are specified using the XFAF subset
                                   // of XFA spec
#define FORMTYPE_COUNT 4           // The number of form types

#define JSPLATFORM_ALERT_BUTTON_OK 0           // OK button
#define JSPLATFORM_ALERT_BUTTON_OKCANCEL 1     // OK & Cancel buttons
#define JSPLATFORM_ALERT_BUTTON_YESNO 2        // Yes & No buttons
#define JSPLATFORM_ALERT_BUTTON_YESNOCANCEL 3  // Yes, No & Cancel buttons
#define JSPLATFORM_ALERT_BUTTON_DEFAULT JSPLATFORM_ALERT_BUTTON_OK

#define JSPLATFORM_ALERT_ICON_ERROR 0     // Error
#define JSPLATFORM_ALERT_ICON_WARNING 1   // Warning
#define JSPLATFORM_ALERT_ICON_QUESTION 2  // Question
#define JSPLATFORM_ALERT_ICON_STATUS 3    // Status
#define JSPLATFORM_ALERT_ICON_ASTERISK 4  // Asterisk
#define JSPLATFORM_ALERT_ICON_DEFAULT JSPLATFORM_ALERT_ICON_ERROR

#define JSPLATFORM_ALERT_RETURN_OK 1      // OK
#define JSPLATFORM_ALERT_RETURN_CANCEL 2  // Cancel
#define JSPLATFORM_ALERT_RETURN_NO 3      // No
#define JSPLATFORM_ALERT_RETURN_YES 4     // Yes

#define JSPLATFORM_BEEP_ERROR 0           // Error
#define JSPLATFORM_BEEP_WARNING 1         // Warning
#define JSPLATFORM_BEEP_QUESTION 2        // Question
#define JSPLATFORM_BEEP_STATUS 3          // Status
#define JSPLATFORM_BEEP_DEFAULT 4         // Default

// Exported Functions
#ifdef __cplusplus
extern "C" {
#endif

typedef struct _IPDF_JsPlatform {
  /*
   * Version number of the interface. Currently must be 2.
   */
  int version;

  /* Version 1. */

  /*
   * Method: app_alert
   *       Pop up a dialog to show warning or hint.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       Msg         -   A string containing the message to be displayed.
   *       Title       -   The title of the dialog.
   *       Type        -   The type of button group, one of the
   *                       JSPLATFORM_ALERT_BUTTON_* values above.
   *       nIcon       -   The type of the icon, one of the
   *                       JSPLATFORM_ALERT_ICON_* above.
   * Return Value:
   *       Option selected by user in dialogue, one of the
   *       JSPLATFORM_ALERT_RETURN_* values above.
   */
  int (*app_alert)(struct _IPDF_JsPlatform* pThis,
                   FPDF_WIDESTRING Msg,
                   FPDF_WIDESTRING Title,
                   int Type,
                   int Icon);

  /*
   * Method: app_beep
   *       Causes the system to play a sound.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   *       nType       -   The sound type, see JSPLATFORM_BEEP_TYPE_*
   *                       above.
   * Return Value:
   *       None
   */
  void (*app_beep)(struct _IPDF_JsPlatform* pThis, int nType);

  /*
   * Method: app_response
   *       Displays a dialog box containing a question and an entry field for
   *       the user to reply to the question.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   *       Question    -   The question to be posed to the user.
   *       Title       -   The title of the dialog box.
   *       Default     -   A default value for the answer to the question. If
   *                       not specified, no default value is presented.
   *       cLabel      -   A short string to appear in front of and on the
   *                       same line as the edit text field.
   *       bPassword   -   If true, indicates that the user's response should
   *                       be shown as asterisks (*) or bullets (?) to mask
   *                       the response, which might be sensitive information.
   *       response    -   A string buffer allocated by PDFium, to receive the
   *                       user's response.
   *       length      -   The length of the buffer in bytes. Currently, it is
   *                       always 2048.
   * Return Value:
   *       Number of bytes the complete user input would actually require, not
   *       including trailing zeros, regardless of the value of the length
   *       parameter or the presence of the response buffer.
   * Comments:
   *       No matter on what platform, the response buffer should be always
   *       written using UTF-16LE encoding. If a response buffer is
   *       present and the size of the user input exceeds the capacity of the
   *       buffer as specified by the length parameter, only the
   *       first "length" bytes of the user input are to be written to the
   *       buffer.
   */
  int (*app_response)(struct _IPDF_JsPlatform* pThis,
                      FPDF_WIDESTRING Question,
                      FPDF_WIDESTRING Title,
                      FPDF_WIDESTRING Default,
                      FPDF_WIDESTRING cLabel,
                      FPDF_BOOL bPassword,
                      void* response,
                      int length);

  /*
   * Method: Doc_getFilePath
   *       Get the file path of the current document.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   *       filePath    -   The string buffer to receive the file path. Can
   *                       be NULL.
   *       length      -   The length of the buffer, number of bytes. Can
   *                       be 0.
   * Return Value:
   *       Number of bytes the filePath consumes, including trailing zeros.
   * Comments:
   *       The filePath should always be provided in the local encoding.
   *       The return value always indicated number of bytes required for
   *       the buffer, even when there is no buffer specified, or the buffer
   *       size is less than required. In this case, the buffer will not
   *       be modified.
   */
  int (*Doc_getFilePath)(struct _IPDF_JsPlatform* pThis,
                         void* filePath,
                         int length);

  /*
   * Method: Doc_mail
   *       Mails the data buffer as an attachment to all recipients, with or
   *       without user interaction.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   *       mailData    -   Pointer to the data buffer to be sent. Can be NULL.
   *       length      -   The size,in bytes, of the buffer pointed by
   *                       mailData parameter. Can be 0.
   *       bUI         -   If true, the rest of the parameters are used in a
   *                       compose-new-message window that is displayed to the
   *                       user. If false, the cTo parameter is required and
   *                       all others are optional.
   *       To          -   A semicolon-delimited list of recipients for the
   *                       message.
   *       Subject     -   The subject of the message. The length limit is
   *                       64 KB.
   *       CC          -   A semicolon-delimited list of CC recipients for
   *                       the message.
   *       BCC         -   A semicolon-delimited list of BCC recipients for
   *                       the message.
   *       Msg         -   The content of the message. The length limit is
   *                       64 KB.
   * Return Value:
   *       None.
   * Comments:
   *       If the parameter mailData is NULL or length is 0, the current
   *       document will be mailed as an attachment to all recipients.
   */
  void (*Doc_mail)(struct _IPDF_JsPlatform* pThis,
                   void* mailData,
                   int length,
                   FPDF_BOOL bUI,
                   FPDF_WIDESTRING To,
                   FPDF_WIDESTRING Subject,
                   FPDF_WIDESTRING CC,
                   FPDF_WIDESTRING BCC,
                   FPDF_WIDESTRING Msg);

  /*
   * Method: Doc_print
   *       Prints all or a specific number of pages of the document.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis         -   Pointer to the interface structure itself.
   *       bUI           -   If true, will cause a UI to be presented to the
   *                         user to obtain printing information and confirm
   *                         the action.
   *       nStart        -   A 0-based index that defines the start of an
   *                         inclusive range of pages.
   *       nEnd          -   A 0-based index that defines the end of an
   *                         inclusive page range.
   *       bSilent       -   If true, suppresses the cancel dialog box while
   *                         the document is printing. The default is false.
   *       bShrinkToFit  -   If true, the page is shrunk (if necessary) to
   *                         fit within the imageable area of the printed page.
   *       bPrintAsImage -   If true, print pages as an image.
   *       bReverse      -   If true, print from nEnd to nStart.
   *       bAnnotations  -   If true (the default), annotations are
   *                         printed.
   * Return Value:
   *       None.
   */
  void (*Doc_print)(struct _IPDF_JsPlatform* pThis,
                    FPDF_BOOL bUI,
                    int nStart,
                    int nEnd,
                    FPDF_BOOL bSilent,
                    FPDF_BOOL bShrinkToFit,
                    FPDF_BOOL bPrintAsImage,
                    FPDF_BOOL bReverse,
                    FPDF_BOOL bAnnotations);

  /*
   * Method: Doc_submitForm
   *       Send the form data to a specified URL.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   *       formData    -   Pointer to the data buffer to be sent.
   *       length      -   The size,in bytes, of the buffer pointed by
   *                       formData parameter.
   *       URL         -   The URL to send to.
   * Return Value:
   *       None.
   */
  void (*Doc_submitForm)(struct _IPDF_JsPlatform* pThis,
                         void* formData,
                         int length,
                         FPDF_WIDESTRING URL);

  /*
   * Method: Doc_gotoPage
   *       Jump to a specified page.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   *       nPageNum    -   The specified page number, zero for the first page.
   * Return Value:
   *       None.
   *
   */
  void (*Doc_gotoPage)(struct _IPDF_JsPlatform* pThis, int nPageNum);

  /*
   * Method: Field_browse
   *       Show a file selection dialog, and return the selected file path.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       filePath    -   Pointer to the data buffer to receive the file
   *                       path. Can be NULL.
   *       length      -   The length of the buffer, in bytes. Can be 0.
   * Return Value:
   *       Number of bytes the filePath consumes, including trailing zeros.
   * Comments:
   *       The filePath shoule always be provided in local encoding.
   */
  int (*Field_browse)(struct _IPDF_JsPlatform* pThis,
                      void* filePath,
                      int length);

  /*
   * Pointer to FPDF_FORMFILLINFO interface.
   */
  void* m_pFormfillinfo;

  /* Version 2. */

  void* m_isolate;               /* Unused in v3, retain for compatibility. */
  unsigned int m_v8EmbedderSlot; /* Unused in v3, retain for compatibility. */

  /* Version 3. */
  /* Version 3 moves m_Isolate and m_v8EmbedderSlot to FPDF_LIBRARY_CONFIG. */
} IPDF_JSPLATFORM;

// Flags for Cursor type
#define FXCT_ARROW 0
#define FXCT_NESW 1
#define FXCT_NWSE 2
#define FXCT_VBEAM 3
#define FXCT_HBEAM 4
#define FXCT_HAND 5

/*
 * Function signature for the callback function passed to the FFI_SetTimer
 * method.
 * Parameters:
 *          idEvent     -   Identifier of the timer.
 * Return value:
 *          None.
 */
typedef void (*TimerCallback)(int idEvent);

/*
 * Declares of a struct type to the local system time.
 */
typedef struct _FPDF_SYSTEMTIME {
  unsigned short wYear;         /* years since 1900 */
  unsigned short wMonth;        /* months since January - [0,11] */
  unsigned short wDayOfWeek;    /* days since Sunday - [0,6] */
  unsigned short wDay;          /* day of the month - [1,31] */
  unsigned short wHour;         /* hours since midnight - [0,23] */
  unsigned short wMinute;       /* minutes after the hour - [0,59] */
  unsigned short wSecond;       /* seconds after the minute - [0,59] */
  unsigned short wMilliseconds; /* milliseconds after the second - [0,999] */
} FPDF_SYSTEMTIME;

#ifdef PDF_ENABLE_XFA

// Pageview event flags
#define FXFA_PAGEVIEWEVENT_POSTADDED 1    // After a new pageview is added.
#define FXFA_PAGEVIEWEVENT_POSTREMOVED 3  // After a pageview is removed.

// Definitions for Right Context Menu Features Of XFA Fields
#define FXFA_MENU_COPY 1
#define FXFA_MENU_CUT 2
#define FXFA_MENU_SELECTALL 4
#define FXFA_MENU_UNDO 8
#define FXFA_MENU_REDO 16
#define FXFA_MENU_PASTE 32

// Definitions for File Type.
#define FXFA_SAVEAS_XML 1
#define FXFA_SAVEAS_XDP 2

#endif  // PDF_ENABLE_XFA

typedef struct _FPDF_FORMFILLINFO {
  /*
   * Version number of the interface.
   * Version 1 contains stable interfaces. Version 2 has additional
   * experimental interfaces.
   * When PDFium is built without the XFA module, version can be 1 or 2.
   * With version 1, only stable interfaces are called. With version 2,
   * additional experimental interfaces are also called.
   * When PDFium is built with the XFA module, version must be 2.
   * All the XFA related interfaces are experimental. If PDFium is built with
   * the XFA module and version 1 then none of the XFA related interfaces
   * would be called. When PDFium is built with XFA module then the version
   * must be 2.
   */
  int version;

  /* Version 1. */
  /*
   * Method: Release
   *       Give the implementation a chance to release any resources after the
   *       interface is no longer used.
   * Interface Version:
   *       1
   * Implementation Required:
   *       No
   * Comments:
   *       Called by PDFium during the final cleanup process.
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   * Return Value:
   *       None
   */
  void (*Release)(struct _FPDF_FORMFILLINFO* pThis);

  /*
   * Method: FFI_Invalidate
   *       Invalidate the client area within the specified rectangle.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       page        -   Handle to the page. Returned by FPDF_LoadPage().
   *       left        -   Left position of the client area in PDF page
   *                       coordinates.
   *       top         -   Top position of the client area in PDF page
   *                       coordinates.
   *       right       -   Right position of the client area in PDF page
   *                       coordinates.
   *       bottom      -   Bottom position of the client area in PDF page
   *                       coordinates.
   * Return Value:
   *       None.
   * Comments:
   *       All positions are measured in PDF "user space".
   *       Implementation should call FPDF_RenderPageBitmap() for repainting
   *       the specified page area.
   */
  void (*FFI_Invalidate)(struct _FPDF_FORMFILLINFO* pThis,
                         FPDF_PAGE page,
                         double left,
                         double top,
                         double right,
                         double bottom);

  /*
   * Method: FFI_OutputSelectedRect
   *       When the user selects text in form fields with the mouse, this
   *       callback function will be invoked with the selected areas.
   * Interface Version:
   *       1
   * Implementation Required:
   *       No
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       page        -   Handle to the page. Returned by FPDF_LoadPage()/
   *       left        -   Left position of the client area in PDF page
   *                       coordinates.
   *       top         -   Top position of the client area in PDF page
   *                       coordinates.
   *       right       -   Right position of the client area in PDF page
   *                       coordinates.
   *       bottom      -   Bottom position of the client area in PDF page
   *                       coordinates.
   * Return Value:
   *       None.
   * Comments:
   *       This callback function is useful for implementing special text
   *       selection effects. An implementation should first record the
   *       returned rectangles, then draw them one by one during the next
   *       painting period. Lastly, it should remove all the recorded
   *       rectangles when finished painting.
   */
  void (*FFI_OutputSelectedRect)(struct _FPDF_FORMFILLINFO* pThis,
                                 FPDF_PAGE page,
                                 double left,
                                 double top,
                                 double right,
                                 double bottom);

  /*
   * Method: FFI_SetCursor
   *       Set the Cursor shape.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       nCursorType -   Cursor type, see Flags for Cursor type for details.
   * Return value:
   *       None.
   */
  void (*FFI_SetCursor)(struct _FPDF_FORMFILLINFO* pThis, int nCursorType);

  /*
   * Method: FFI_SetTimer
   *       This method installs a system timer. An interval value is specified,
   *       and every time that interval elapses, the system must call into the
   *       callback function with the timer ID as returned by this function.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       uElapse     -   Specifies the time-out value, in milliseconds.
   *       lpTimerFunc -   A pointer to the callback function-TimerCallback.
   * Return value:
   *       The timer identifier of the new timer if the function is successful.
   *       An application passes this value to the FFI_KillTimer method to kill
   *       the timer. Nonzero if it is successful; otherwise, it is zero.
   */
  int (*FFI_SetTimer)(struct _FPDF_FORMFILLINFO* pThis,
                      int uElapse,
                      TimerCallback lpTimerFunc);

  /*
   * Method: FFI_KillTimer
   *       This method uninstalls a system timer, as set by an earlier call to
   *       FFI_SetTimer.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       nTimerID    -   The timer ID returned by FFI_SetTimer function.
   * Return value:
   *       None.
   */
  void (*FFI_KillTimer)(struct _FPDF_FORMFILLINFO* pThis, int nTimerID);

  /*
   * Method: FFI_GetLocalTime
   *       This method receives the current local time on the system.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   * Return value:
   *       The local time. See FPDF_SYSTEMTIME above for details.
   * Note: Unused.
   */
  FPDF_SYSTEMTIME (*FFI_GetLocalTime)(struct _FPDF_FORMFILLINFO* pThis);

  /*
   * Method: FFI_OnChange
   *       This method will be invoked to notify the implementation when the
   *       value of any FormField on the document had been changed.
   * Interface Version:
   *       1
   * Implementation Required:
   *       no
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   * Return value:
   *       None.
   */
  void (*FFI_OnChange)(struct _FPDF_FORMFILLINFO* pThis);

  /*
   * Method: FFI_GetPage
   *       This method receives the page handle associated with a specified
   *       page index.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       document    -   Handle to document. Returned by FPDF_LoadDocument().
   *       nPageIndex  -   Index number of the page. 0 for the first page.
   * Return value:
   *       Handle to the page, as previously returned to the implementation by
   *       FPDF_LoadPage().
   * Comments:
   *       The implementation is expected to keep track of the page handles it
   *       receives from PDFium, and their mappings to page numbers. In some
   *       cases, the document-level JavaScript action may refer to a page
   *       which hadn't been loaded yet. To successfully run the Javascript
   *       action, the implementation needs to load the page.
   */
  FPDF_PAGE (*FFI_GetPage)(struct _FPDF_FORMFILLINFO* pThis,
                           FPDF_DOCUMENT document,
                           int nPageIndex);

  /*
   * Method: FFI_GetCurrentPage
   *       This method receives the handle to the current page.
   * Interface Version:
   *       1
   * Implementation Required:
   *       Yes when V8 support is present, otherwise unused.
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       document    -   Handle to document. Returned by FPDF_LoadDocument().
   * Return value:
   *       Handle to the page. Returned by FPDF_LoadPage().
   * Comments:
   *       PDFium doesn't keep keep track of the "current page" (e.g. the one
   *       that is most visible on screen), so it must ask the embedder for
   *       this information.
   */
  FPDF_PAGE (*FFI_GetCurrentPage)(struct _FPDF_FORMFILLINFO* pThis,
                                  FPDF_DOCUMENT document);

  /*
   * Method: FFI_GetRotation
   *       This method receives currently rotation of the page view.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       page        -   Handle to page, as returned by FPDF_LoadPage().
   * Return value:
   *       A number to indicate the page rotation in 90 degree increments
   *       in a clockwise direction:
   *         0 - 0 degrees
   *         1 - 90 degrees
   *         2 - 180 degrees
   *         3 - 270 degrees
   * Note: Unused.
   */
  int (*FFI_GetRotation)(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page);

  /*
   * Method: FFI_ExecuteNamedAction
   *       This method will execute a named action.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       namedAction     -   A byte string which indicates the named action,
   *                           terminated by 0.
   * Return value:
   *       None.
   * Comments:
   *       See the named actions description of <<PDF Reference, version 1.7>>
   *       for more details.
   */
  void (*FFI_ExecuteNamedAction)(struct _FPDF_FORMFILLINFO* pThis,
                                 FPDF_BYTESTRING namedAction);
  /*
   * Method: FFI_SetTextFieldFocus
   *       Called when a text field is getting or losing focus.
   * Interface Version:
   *       1
   * Implementation Required:
   *       no
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       value           -   The string value of the form field, in UTF-16LE
   *                           format.
   *       valueLen        -   The length of the string value. This is the
   *                           number of characters, not bytes.
   *       is_focus        -   True if the form field is getting focus, false
   *                           if the form field is losing focus.
   * Return value:
   *       None.
   * Comments:
   *       Only supports text fields and combobox fields.
   */
  void (*FFI_SetTextFieldFocus)(struct _FPDF_FORMFILLINFO* pThis,
                                FPDF_WIDESTRING value,
                                FPDF_DWORD valueLen,
                                FPDF_BOOL is_focus);

  /*
   * Method: FFI_DoURIAction
   *       Ask the implementation to navigate to a uniform resource identifier.
   * Interface Version:
   *       1
   * Implementation Required:
   *       No
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       bsURI           -   A byte string which indicates the uniform
   *                           resource identifier, terminated by 0.
   * Return value:
   *       None.
   * Comments:
   *       If the embedder is version 2 or higher and have implementation for
   *       FFI_DoURIActionWithKeyboardModifier, then
   *       FFI_DoURIActionWithKeyboardModifier takes precedence over
   *       FFI_DoURIAction.
   *       See the URI actions description of <<PDF Reference, version 1.7>>
   *       for more details.
   */
  void (*FFI_DoURIAction)(struct _FPDF_FORMFILLINFO* pThis,
                          FPDF_BYTESTRING bsURI);

  /*
   * Method: FFI_DoGoToAction
   *       This action changes the view to a specified destination.
   * Interface Version:
   *       1
   * Implementation Required:
   *       No
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       nPageIndex      -   The index of the PDF page.
   *       zoomMode        -   The zoom mode for viewing page. See below.
   *       fPosArray       -   The float array which carries the position info.
   *       sizeofArray     -   The size of float array.
   * PDFZoom values:
   *         - XYZ = 1
   *         - FITPAGE = 2
   *         - FITHORZ = 3
   *         - FITVERT = 4
   *         - FITRECT = 5
   *         - FITBBOX = 6
   *         - FITBHORZ = 7
   *         - FITBVERT = 8
   * Return value:
   *       None.
   * Comments:
   *       See the Destinations description of <<PDF Reference, version 1.7>>
   *       in 8.2.1 for more details.
   */
  void (*FFI_DoGoToAction)(struct _FPDF_FORMFILLINFO* pThis,
                           int nPageIndex,
                           int zoomMode,
                           float* fPosArray,
                           int sizeofArray);

  /*
   * Pointer to IPDF_JSPLATFORM interface.
   * Unused if PDFium is built without V8 support. Otherwise, if NULL, then
   * JavaScript will be prevented from executing while rendering the document.
   */
  IPDF_JSPLATFORM* m_pJsPlatform;

  /* Version 2 - Experimental. */
  /*
   * Whether the XFA module is disabled when built with the XFA module.
   * Interface Version:
   *       Ignored if |version| < 2.
   */
  FPDF_BOOL xfa_disabled;

  /*
   * Method: FFI_DisplayCaret
   *       This method will show the caret at specified position.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       page            -   Handle to page. Returned by FPDF_LoadPage().
   *       left            -   Left position of the client area in PDF page
   *                           coordinates.
   *       top             -   Top position of the client area in PDF page
   *                           coordinates.
   *       right           -   Right position of the client area in PDF page
   *                           coordinates.
   *       bottom          -   Bottom position of the client area in PDF page
   *                           coordinates.
   * Return value:
   *       None.
   */
  void (*FFI_DisplayCaret)(struct _FPDF_FORMFILLINFO* pThis,
                           FPDF_PAGE page,
                           FPDF_BOOL bVisible,
                           double left,
                           double top,
                           double right,
                           double bottom);

  /*
   * Method: FFI_GetCurrentPageIndex
   *       This method will get the current page index.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       document        -   Handle to document from FPDF_LoadDocument().
   * Return value:
   *       The index of current page.
   */
  int (*FFI_GetCurrentPageIndex)(struct _FPDF_FORMFILLINFO* pThis,
                                 FPDF_DOCUMENT document);

  /*
   * Method: FFI_SetCurrentPage
   *       This method will set the current page.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       document        -   Handle to document from FPDF_LoadDocument().
   *       iCurPage        -   The index of the PDF page.
   * Return value:
   *       None.
   */
  void (*FFI_SetCurrentPage)(struct _FPDF_FORMFILLINFO* pThis,
                             FPDF_DOCUMENT document,
                             int iCurPage);

  /*
  * Method: FFI_GotoURL
  *       This method will navigate to the specified URL.
  * Interface Version:
  *       Ignored if |version| < 2.
  * Implementation Required:
  *       Required for XFA, otherwise set to NULL.
  * Parameters:
  *       pThis            -   Pointer to the interface structure itself.
  *       document         -   Handle to document from FPDF_LoadDocument().
  *       wsURL            -   The string value of the URL, in UTF-16LE format.
  * Return value:
  *       None.
  */
  void (*FFI_GotoURL)(struct _FPDF_FORMFILLINFO* pThis,
                      FPDF_DOCUMENT document,
                      FPDF_WIDESTRING wsURL);

  /*
   * Method: FFI_GetPageViewRect
   *       This method will get the current page view rectangle.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       page            -   Handle to page. Returned by FPDF_LoadPage().
   *       left            -   The pointer to receive left position of the page
   *                           view area in PDF page coordinates.
   *       top             -   The pointer to receive top position of the page
   *                           view area in PDF page coordinates.
   *       right           -   The pointer to receive right position of the
   *                           page view area in PDF page coordinates.
   *       bottom          -   The pointer to receive bottom position of the
   *                           page view area in PDF page coordinates.
   * Return value:
   *     None.
   */
  void (*FFI_GetPageViewRect)(struct _FPDF_FORMFILLINFO* pThis,
                              FPDF_PAGE page,
                              double* left,
                              double* top,
                              double* right,
                              double* bottom);

  /*
   * Method: FFI_PageEvent
   *       This method fires when pages have been added to or deleted from
   *       the XFA document.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       page_count      -   The number of pages to be added or deleted.
   *       event_type      -   See FXFA_PAGEVIEWEVENT_* above.
   * Return value:
   *       None.
   * Comments:
   *       The pages to be added or deleted always start from the last page
   *       of document. This means that if parameter page_count is 2 and
   *       event type is FXFA_PAGEVIEWEVENT_POSTADDED, 2 new pages have been
   *       appended to the tail of document; If page_count is 2 and
   *       event type is FXFA_PAGEVIEWEVENT_POSTREMOVED, the last 2 pages
   *       have been deleted.
   */
  void (*FFI_PageEvent)(struct _FPDF_FORMFILLINFO* pThis,
                        int page_count,
                        FPDF_DWORD event_type);

  /*
   * Method: FFI_PopupMenu
   *       This method will track the right context menu for XFA fields.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       page            -   Handle to page. Returned by FPDF_LoadPage().
   *       hWidget         -   Always null, exists for compatibility.
   *       menuFlag        -   The menu flags. Please refer to macro definition
   *                           of FXFA_MENU_XXX and this can be one or a
   *                           combination of these macros.
   *       x               -   X position of the client area in PDF page
   *                           coordinates.
   *       y               -   Y position of the client area in PDF page
   *                           coordinates.
   * Return value:
   *       TRUE indicates success; otherwise false.
   */
  FPDF_BOOL (*FFI_PopupMenu)(struct _FPDF_FORMFILLINFO* pThis,
                             FPDF_PAGE page,
                             FPDF_WIDGET hWidget,
                             int menuFlag,
                             float x,
                             float y);

  /*
   * Method: FFI_OpenFile
   *       This method will open the specified file with the specified mode.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       fileFlag        -   The file flag. Please refer to macro definition
   *                           of FXFA_SAVEAS_XXX and use one of these macros.
   *       wsURL           -   The string value of the file URL, in UTF-16LE
   *                           format.
   *       mode            -   The mode for open file, e.g. "rb" or "wb".
   * Return value:
   *       The handle to FPDF_FILEHANDLER.
   */
  FPDF_FILEHANDLER* (*FFI_OpenFile)(struct _FPDF_FORMFILLINFO* pThis,
                                    int fileFlag,
                                    FPDF_WIDESTRING wsURL,
                                    const char* mode);

  /*
   * Method: FFI_EmailTo
   *       This method will email the specified file stream to the specified
   *       contact.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       pFileHandler    -   Handle to the FPDF_FILEHANDLER.
   *       pTo             -   A semicolon-delimited list of recipients for the
   *                           message,in UTF-16LE format.
   *       pSubject        -   The subject of the message,in UTF-16LE format.
   *       pCC             -   A semicolon-delimited list of CC recipients for
   *                           the message,in UTF-16LE format.
   *       pBcc            -   A semicolon-delimited list of BCC recipients for
   *                           the message,in UTF-16LE format.
   *       pMsg            -   Pointer to the data buffer to be sent.Can be
   *                           NULL,in UTF-16LE format.
   * Return value:
   *       None.
   */
  void (*FFI_EmailTo)(struct _FPDF_FORMFILLINFO* pThis,
                      FPDF_FILEHANDLER* fileHandler,
                      FPDF_WIDESTRING pTo,
                      FPDF_WIDESTRING pSubject,
                      FPDF_WIDESTRING pCC,
                      FPDF_WIDESTRING pBcc,
                      FPDF_WIDESTRING pMsg);

  /*
   * Method: FFI_UploadTo
   *       This method will upload the specified file stream to the
   *       specified URL.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       pFileHandler    -   Handle to the FPDF_FILEHANDLER.
   *       fileFlag        -   The file flag. Please refer to macro definition
   *                           of FXFA_SAVEAS_XXX and use one of these macros.
   *       uploadTo        -   Pointer to the URL path, in UTF-16LE format.
   * Return value:
   *       None.
   */
  void (*FFI_UploadTo)(struct _FPDF_FORMFILLINFO* pThis,
                       FPDF_FILEHANDLER* fileHandler,
                       int fileFlag,
                       FPDF_WIDESTRING uploadTo);

  /*
   * Method: FFI_GetPlatform
   *       This method will get the current platform.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       platform        -   Pointer to the data buffer to receive the
   *                           platform,in UTF-16LE format. Can be NULL.
   *       length          -   The length of the buffer in bytes. Can be
   *                           0 to query the required size.
   * Return value:
   *       The length of the buffer, number of bytes.
   */
  int (*FFI_GetPlatform)(struct _FPDF_FORMFILLINFO* pThis,
                         void* platform,
                         int length);

  /*
   * Method: FFI_GetLanguage
   *       This method will get the current language.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       language        -   Pointer to the data buffer to receive the
   *                           current language. Can be NULL.
   *       length          -   The length of the buffer in bytes. Can be
   *                           0 to query the required size.
   * Return value:
   *       The length of the buffer, number of bytes.
   */
  int (*FFI_GetLanguage)(struct _FPDF_FORMFILLINFO* pThis,
                         void* language,
                         int length);

  /*
  * Method: FFI_DownloadFromURL
  *       This method will download the specified file from the URL.
  * Interface Version:
  *       Ignored if |version| < 2.
  * Implementation Required:
  *       Required for XFA, otherwise set to NULL.
  * Parameters:
  *       pThis           -   Pointer to the interface structure itself.
  *       URL             -   The string value of the file URL, in UTF-16LE
  *                           format.
  * Return value:
  *       The handle to FPDF_FILEHANDLER.
  */
  FPDF_FILEHANDLER* (*FFI_DownloadFromURL)(struct _FPDF_FORMFILLINFO* pThis,
                                           FPDF_WIDESTRING URL);
  /*
   * Method: FFI_PostRequestURL
   *       This method will post the request to the server URL.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       wsURL           -   The string value of the server URL, in UTF-16LE
   *                           format.
   *       wsData          -   The post data,in UTF-16LE format.
   *       wsContentType   -   The content type of the request data, in
   *                           UTF-16LE format.
   *       wsEncode        -   The encode type, in UTF-16LE format.
   *       wsHeader        -   The request header,in UTF-16LE format.
   *       response        -   Pointer to the FPDF_BSTR to receive the response
   *                           data from the server, in UTF-16LE format.
   * Return value:
   *       TRUE indicates success, otherwise FALSE.
   */
  FPDF_BOOL (*FFI_PostRequestURL)(struct _FPDF_FORMFILLINFO* pThis,
                                  FPDF_WIDESTRING wsURL,
                                  FPDF_WIDESTRING wsData,
                                  FPDF_WIDESTRING wsContentType,
                                  FPDF_WIDESTRING wsEncode,
                                  FPDF_WIDESTRING wsHeader,
                                  FPDF_BSTR* response);

  /*
   * Method: FFI_PutRequestURL
   *       This method will put the request to the server URL.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       wsURL           -   The string value of the server URL, in UTF-16LE
   *                           format.
   *       wsData          -   The put data, in UTF-16LE format.
   *       wsEncode        -   The encode type, in UTR-16LE format.
   * Return value:
   *       TRUE indicates success, otherwise FALSE.
   */
  FPDF_BOOL (*FFI_PutRequestURL)(struct _FPDF_FORMFILLINFO* pThis,
                                 FPDF_WIDESTRING wsURL,
                                 FPDF_WIDESTRING wsData,
                                 FPDF_WIDESTRING wsEncode);

  /*
   * Method: FFI_OnFocusChange
   *     Called when the focused annotation is updated.
   * Interface Version:
   *     Ignored if |version| < 2.
   * Implementation Required:
   *     No
   * Parameters:
   *     param           -   Pointer to the interface structure itself.
   *     annot           -   The focused annotation.
   *     page_index      -   Index number of the page which contains the
   *                         focused annotation. 0 for the first page.
   * Return value:
   *     None.
   * Comments:
   *     This callback function is useful for implementing any view based
   *     action such as scrolling the annotation rect into view. The
   *     embedder should not copy and store the annot as its scope is
   *     limited to this call only.
   */
  void (*FFI_OnFocusChange)(struct _FPDF_FORMFILLINFO* param,
                            FPDF_ANNOTATION annot,
                            int page_index);

  /**
   * Method: FFI_DoURIActionWithKeyboardModifier
   *       Ask the implementation to navigate to a uniform resource identifier
   *       with the specified modifiers.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       No
   * Parameters:
   *       param           -   Pointer to the interface structure itself.
   *       uri             -   A byte string which indicates the uniform
   *                           resource identifier, terminated by 0.
   *       modifiers       -   Keyboard modifier that indicates which of
   *                           the virtual keys are down, if any.
   * Return value:
   *       None.
   * Comments:
   *       If the embedder who is version 2 and does not implement this API,
   *       then a call will be redirected to FFI_DoURIAction.
   *       See the URI actions description of <<PDF Reference, version 1.7>>
   *       for more details.
   */
  void(*FFI_DoURIActionWithKeyboardModifier)(struct _FPDF_FORMFILLINFO* param,
      FPDF_BYTESTRING uri,
      int modifiers);
} FPDF_FORMFILLINFO;

/*
 * Function: FPDFDOC_InitFormFillEnvironment
 *       Initialize form fill environment.
 * Parameters:
 *       document        -   Handle to document from FPDF_LoadDocument().
 *       pFormFillInfo   -   Pointer to a FPDF_FORMFILLINFO structure.
 * Return Value:
 *       Handle to the form fill module, or NULL on failure.
 * Comments:
 *       This function should be called before any form fill operation.
 */
FPDF_EXPORT FPDF_FORMHANDLE FPDF_CALLCONV
FPDFDOC_InitFormFillEnvironment(FPDF_DOCUMENT document,
                                FPDF_FORMFILLINFO* formInfo);

/*
 * Function: FPDFDOC_ExitFormFillEnvironment
 *       Take ownership of |hHandle| and exit form fill environment.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *       None.
 * Comments:
 *       This function is a no-op when |hHandle| is null.
 */
FPDF_EXPORT void FPDF_CALLCONV
FPDFDOC_ExitFormFillEnvironment(FPDF_FORMHANDLE hHandle);

/*
 * Function: FORM_OnAfterLoadPage
 *       This method is required for implementing all the form related
 *       functions. Should be invoked after user successfully loaded a
 *       PDF page, and FPDFDOC_InitFormFillEnvironment() has been invoked.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *       None.
 */
FPDF_EXPORT void FPDF_CALLCONV FORM_OnAfterLoadPage(FPDF_PAGE page,
                                                    FPDF_FORMHANDLE hHandle);

/*
 * Function: FORM_OnBeforeClosePage
 *       This method is required for implementing all the form related
 *       functions. Should be invoked before user closes the PDF page.
 * Parameters:
 *        page        -   Handle to the page, as returned by FPDF_LoadPage().
 *        hHandle     -   Handle to the form fill module, as returned by
 *                        FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *        None.
 */
FPDF_EXPORT void FPDF_CALLCONV FORM_OnBeforeClosePage(FPDF_PAGE page,
                                                      FPDF_FORMHANDLE hHandle);

/*
 * Function: FORM_DoDocumentJSAction
 *       This method is required for performing document-level JavaScript
 *       actions. It should be invoked after the PDF document has been loaded.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *       None.
 * Comments:
 *       If there is document-level JavaScript action embedded in the
 *       document, this method will execute the JavaScript action. Otherwise,
 *       the method will do nothing.
 */
FPDF_EXPORT void FPDF_CALLCONV
FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle);

/*
 * Function: FORM_DoDocumentOpenAction
 *       This method is required for performing open-action when the document
 *       is opened.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *       None.
 * Comments:
 *       This method will do nothing if there are no open-actions embedded
 *       in the document.
 */
FPDF_EXPORT void FPDF_CALLCONV
FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle);

// Additional actions type of document:
//   WC, before closing document, JavaScript action.
//   WS, before saving document, JavaScript action.
//   DS, after saving document, JavaScript action.
//   WP, before printing document, JavaScript action.
//   DP, after printing document, JavaScript action.
#define FPDFDOC_AACTION_WC 0x10
#define FPDFDOC_AACTION_WS 0x11
#define FPDFDOC_AACTION_DS 0x12
#define FPDFDOC_AACTION_WP 0x13
#define FPDFDOC_AACTION_DP 0x14

/*
 * Function: FORM_DoDocumentAAction
 *       This method is required for performing the document's
 *       additional-action.
 * Parameters:
 *       hHandle     -   Handle to the form fill module. Returned by
 *                       FPDFDOC_InitFormFillEnvironment.
 *       aaType      -   The type of the additional-actions which defined
 *                       above.
 * Return Value:
 *       None.
 * Comments:
 *       This method will do nothing if there is no document
 *       additional-action corresponding to the specified |aaType|.
 */
FPDF_EXPORT void FPDF_CALLCONV FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle,
                                                      int aaType);

// Additional-action types of page object:
//   OPEN (/O) -- An action to be performed when the page is opened
//   CLOSE (/C) -- An action to be performed when the page is closed
#define FPDFPAGE_AACTION_OPEN 0
#define FPDFPAGE_AACTION_CLOSE 1

/*
 * Function: FORM_DoPageAAction
 *       This method is required for performing the page object's
 *       additional-action when opened or closed.
 * Parameters:
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       aaType      -   The type of the page object's additional-actions
 *                       which defined above.
 * Return Value:
 *       None.
 * Comments:
 *       This method will do nothing if no additional-action corresponding
 *       to the specified |aaType| exists.
 */
FPDF_EXPORT void FPDF_CALLCONV FORM_DoPageAAction(FPDF_PAGE page,
                                                  FPDF_FORMHANDLE hHandle,
                                                  int aaType);

/*
 * Function: FORM_OnMouseMove
 *       Call this member function when the mouse cursor moves.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       modifier    -   Indicates whether various virtual keys are down.
 *       page_x      -   Specifies the x-coordinate of the cursor in PDF user
 *                       space.
 *       page_y      -   Specifies the y-coordinate of the cursor in PDF user
 *                       space.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnMouseMove(FPDF_FORMHANDLE hHandle,
                                                     FPDF_PAGE page,
                                                     int modifier,
                                                     double page_x,
                                                     double page_y);

/*
 * Experimental API
 * Function: FORM_OnMouseWheel
 *       Call this member function when the user scrolls the mouse wheel.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       modifier    -   Indicates whether various virtual keys are down.
 *       page_coord  -   Specifies the coordinates of the cursor in PDF user
 *                       space.
 *       delta_x     -   Specifies the amount of wheel movement on the x-axis,
 *                       in units of platform-agnostic wheel deltas. Negative
 *                       values mean left.
 *       delta_y     -   Specifies the amount of wheel movement on the y-axis,
 *                       in units of platform-agnostic wheel deltas. Negative
 *                       values mean down.
 * Return Value:
 *       True indicates success; otherwise false.
 * Comments:
 *       For |delta_x| and |delta_y|, the caller must normalize
 *       platform-specific wheel deltas. e.g. On Windows, a delta value of 240
 *       for a WM_MOUSEWHEEL event normalizes to 2, since Windows defines
 *       WHEEL_DELTA as 120.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnMouseWheel(
    FPDF_FORMHANDLE hHandle,
    FPDF_PAGE page,
    int modifier,
    const FS_POINTF* page_coord,
    int delta_x,
    int delta_y);

/*
 * Function: FORM_OnFocus
 *       This function focuses the form annotation at a given point. If the
 *       annotation at the point already has focus, nothing happens. If there
 *       is no annotation at the point, removes form focus.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       modifier    -   Indicates whether various virtual keys are down.
 *       page_x      -   Specifies the x-coordinate of the cursor in PDF user
 *                       space.
 *       page_y      -   Specifies the y-coordinate of the cursor in PDF user
 *                       space.
 * Return Value:
 *       True if there is an annotation at the given point and it has focus.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnFocus(FPDF_FORMHANDLE hHandle,
                                                 FPDF_PAGE page,
                                                 int modifier,
                                                 double page_x,
                                                 double page_y);

/*
 * Function: FORM_OnLButtonDown
 *       Call this member function when the user presses the left
 *       mouse button.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       modifier    -   Indicates whether various virtual keys are down.
 *       page_x      -   Specifies the x-coordinate of the cursor in PDF user
 *                       space.
 *       page_y      -   Specifies the y-coordinate of the cursor in PDF user
 *                       space.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle,
                                                       FPDF_PAGE page,
                                                       int modifier,
                                                       double page_x,
                                                       double page_y);

/*
 * Function: FORM_OnRButtonDown
 *       Same as above, execpt for the right mouse button.
 * Comments:
 *       At the present time, has no effect except in XFA builds, but is
 *       included for the sake of symmetry.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnRButtonDown(FPDF_FORMHANDLE hHandle,
                                                       FPDF_PAGE page,
                                                       int modifier,
                                                       double page_x,
                                                       double page_y);
/*
 * Function: FORM_OnLButtonUp
 *       Call this member function when the user releases the left
 *       mouse button.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       modifier    -   Indicates whether various virtual keys are down.
 *       page_x      -   Specifies the x-coordinate of the cursor in device.
 *       page_y      -   Specifies the y-coordinate of the cursor in device.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle,
                                                     FPDF_PAGE page,
                                                     int modifier,
                                                     double page_x,
                                                     double page_y);

/*
 * Function: FORM_OnRButtonUp
 *       Same as above, execpt for the right mouse button.
 * Comments:
 *       At the present time, has no effect except in XFA builds, but is
 *       included for the sake of symmetry.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnRButtonUp(FPDF_FORMHANDLE hHandle,
                                                     FPDF_PAGE page,
                                                     int modifier,
                                                     double page_x,
                                                     double page_y);

/*
 * Function: FORM_OnLButtonDoubleClick
 *       Call this member function when the user double clicks the
 *       left mouse button.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       modifier    -   Indicates whether various virtual keys are down.
 *       page_x      -   Specifies the x-coordinate of the cursor in PDF user
 *                       space.
 *       page_y      -   Specifies the y-coordinate of the cursor in PDF user
 *                       space.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_OnLButtonDoubleClick(FPDF_FORMHANDLE hHandle,
                          FPDF_PAGE page,
                          int modifier,
                          double page_x,
                          double page_y);

/*
 * Function: FORM_OnKeyDown
 *       Call this member function when a nonsystem key is pressed.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, aseturned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       nKeyCode    -   Indicates whether various virtual keys are down.
 *       modifier    -   Contains the scan code, key-transition code,
 *                       previous key state, and context code.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnKeyDown(FPDF_FORMHANDLE hHandle,
                                                   FPDF_PAGE page,
                                                   int nKeyCode,
                                                   int modifier);

/*
 * Function: FORM_OnKeyUp
 *       Call this member function when a nonsystem key is released.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       nKeyCode    -   The virtual-key code of the given key.
 *       modifier    -   Contains the scan code, key-transition code,
 *                       previous key state, and context code.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnKeyUp(FPDF_FORMHANDLE hHandle,
                                                 FPDF_PAGE page,
                                                 int nKeyCode,
                                                 int modifier);

/*
 * Function: FORM_OnChar
 *       Call this member function when a keystroke translates to a
 *       nonsystem character.
 * Parameters:
 *        hHandle    -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *        page       -   Handle to the page, as returned by FPDF_LoadPage().
 *        nChar      -   The character code value of the key.
 *        modifier   -   Contains the scan code, key-transition code,
 *                       previous key state, and context code.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnChar(FPDF_FORMHANDLE hHandle,
                                                FPDF_PAGE page,
                                                int nChar,
                                                int modifier);

/*
 * Experimental API
 * Function: FORM_GetFocusedText
 *       Call this function to obtain the text within the current focused
 *       field, if any.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       buffer      -   Buffer for holding the form text, encoded in
 *                       UTF-16LE. If NULL, |buffer| is not modified.
 *       buflen      -   Length of |buffer| in bytes. If |buflen| is less
 *                       than the length of the form text string, |buffer| is
 *                       not modified.
 * Return Value:
 *       Length in bytes for the text in the focused field.
 */
FPDF_EXPORT unsigned long FPDF_CALLCONV
FORM_GetFocusedText(FPDF_FORMHANDLE hHandle,
                    FPDF_PAGE page,
                    void* buffer,
                    unsigned long buflen);

/*
 * Function: FORM_GetSelectedText
 *       Call this function to obtain selected text within a form text
 *       field or form combobox text field.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       buffer      -   Buffer for holding the selected text, encoded in
 *                       UTF-16LE. If NULL, |buffer| is not modified.
 *       buflen      -   Length of |buffer| in bytes. If |buflen| is less
 *                       than the length of the selected text string,
 *                       |buffer| is not modified.
 * Return Value:
 *       Length in bytes of selected text in form text field or form combobox
 *       text field.
 */
FPDF_EXPORT unsigned long FPDF_CALLCONV
FORM_GetSelectedText(FPDF_FORMHANDLE hHandle,
                     FPDF_PAGE page,
                     void* buffer,
                     unsigned long buflen);

/*
 * Function: FORM_ReplaceSelection
 *       Call this function to replace the selected text in a form
 *       text field or user-editable form combobox text field with another
 *       text string (which can be empty or non-empty). If there is no
 *       selected text, this function will append the replacement text after
 *       the current caret position.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as Returned by FPDF_LoadPage().
 *       wsText      -   The text to be inserted, in UTF-16LE format.
 * Return Value:
 *       None.
 */
FPDF_EXPORT void FPDF_CALLCONV FORM_ReplaceSelection(FPDF_FORMHANDLE hHandle,
                                                     FPDF_PAGE page,
                                                     FPDF_WIDESTRING wsText);

/*
 * Experimental API
 * Function: FORM_SelectAllText
 *       Call this function to select all the text within the currently focused
 *       form text field or form combobox text field.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 * Return Value:
 *       Whether the operation succeeded or not.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_SelectAllText(FPDF_FORMHANDLE hHandle, FPDF_PAGE page);

/*
 * Function: FORM_CanUndo
 *       Find out if it is possible for the current focused widget in a given
 *       form to perform an undo operation.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 * Return Value:
 *       True if it is possible to undo.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_CanUndo(FPDF_FORMHANDLE hHandle,
                                                 FPDF_PAGE page);

/*
 * Function: FORM_CanRedo
 *       Find out if it is possible for the current focused widget in a given
 *       form to perform a redo operation.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 * Return Value:
 *       True if it is possible to redo.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_CanRedo(FPDF_FORMHANDLE hHandle,
                                                 FPDF_PAGE page);

/*
 * Function: FORM_Undo
 *       Make the current focussed widget perform an undo operation.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 * Return Value:
 *       True if the undo operation succeeded.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_Undo(FPDF_FORMHANDLE hHandle,
                                              FPDF_PAGE page);

/*
 * Function: FORM_Redo
 *       Make the current focussed widget perform a redo operation.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 * Return Value:
 *       True if the redo operation succeeded.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_Redo(FPDF_FORMHANDLE hHandle,
                                              FPDF_PAGE page);

/*
 * Function: FORM_ForceToKillFocus.
 *       Call this member function to force to kill the focus of the form
 *       field which has focus. If it would kill the focus of a form field,
 *       save the value of form field if was changed by theuser.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle);

/*
 * Experimental API.
 * Function: FORM_GetFocusedAnnot.
 *       Call this member function to get the currently focused annotation.
 * Parameters:
 *       handle      -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page_index  -   Buffer to hold the index number of the page which
 *                       contains the focused annotation. 0 for the first page.
 *                       Can't be NULL.
 *       annot       -   Buffer to hold the focused annotation. Can't be NULL.
 * Return Value:
 *       On success, return true and write to the out parameters. Otherwise return
 *       false and leave the out parameters unmodified.
 * Comments:
 *       Not currently supported for XFA forms - will report no focused
 *       annotation.
 *       Must call FPDFPage_CloseAnnot() when the annotation returned in |annot|
 *       by this function is no longer needed.
 *       This will return true and set |page_index| to -1 and |annot| to NULL, if
 *       there is no focused annotation.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_GetFocusedAnnot(FPDF_FORMHANDLE handle,
                     int* page_index,
                     FPDF_ANNOTATION* annot);

/*
 * Experimental API.
 * Function: FORM_SetFocusedAnnot.
 *       Call this member function to set the currently focused annotation.
 * Parameters:
 *       handle      -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       annot       -   Handle to an annotation.
 * Return Value:
 *       True indicates success; otherwise false.
 * Comments:
 *       |annot| can't be NULL. To kill focus, use FORM_ForceToKillFocus()
 *       instead.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_SetFocusedAnnot(FPDF_FORMHANDLE handle, FPDF_ANNOTATION annot);

// Form Field Types
// The names of the defines are stable, but the specific values associated with
// them are not, so do not hardcode their values.
#define FPDF_FORMFIELD_UNKNOWN 0      // Unknown.
#define FPDF_FORMFIELD_PUSHBUTTON 1   // push button type.
#define FPDF_FORMFIELD_CHECKBOX 2     // check box type.
#define FPDF_FORMFIELD_RADIOBUTTON 3  // radio button type.
#define FPDF_FORMFIELD_COMBOBOX 4     // combo box type.
#define FPDF_FORMFIELD_LISTBOX 5      // list box type.
#define FPDF_FORMFIELD_TEXTFIELD 6    // text field type.
#define FPDF_FORMFIELD_SIGNATURE 7    // text field type.
#ifdef PDF_ENABLE_XFA
#define FPDF_FORMFIELD_XFA 8              // Generic XFA type.
#define FPDF_FORMFIELD_XFA_CHECKBOX 9     // XFA check box type.
#define FPDF_FORMFIELD_XFA_COMBOBOX 10    // XFA combo box type.
#define FPDF_FORMFIELD_XFA_IMAGEFIELD 11  // XFA image field type.
#define FPDF_FORMFIELD_XFA_LISTBOX 12     // XFA list box type.
#define FPDF_FORMFIELD_XFA_PUSHBUTTON 13  // XFA push button type.
#define FPDF_FORMFIELD_XFA_SIGNATURE 14   // XFA signture field type.
#define FPDF_FORMFIELD_XFA_TEXTFIELD 15   // XFA text field type.
#endif                                    // PDF_ENABLE_XFA

#ifdef PDF_ENABLE_XFA
#define FPDF_FORMFIELD_COUNT 16
#else  // PDF_ENABLE_XFA
#define FPDF_FORMFIELD_COUNT 8
#endif  // PDF_ENABLE_XFA

#ifdef PDF_ENABLE_XFA
#define IS_XFA_FORMFIELD(type)                  \
  (((type) == FPDF_FORMFIELD_XFA) ||            \
   ((type) == FPDF_FORMFIELD_XFA_CHECKBOX) ||   \
   ((type) == FPDF_FORMFIELD_XFA_COMBOBOX) ||   \
   ((type) == FPDF_FORMFIELD_XFA_IMAGEFIELD) || \
   ((type) == FPDF_FORMFIELD_XFA_LISTBOX) ||    \
   ((type) == FPDF_FORMFIELD_XFA_PUSHBUTTON) || \
   ((type) == FPDF_FORMFIELD_XFA_SIGNATURE) ||  \
   ((type) == FPDF_FORMFIELD_XFA_TEXTFIELD))
#endif  // PDF_ENABLE_XFA

/*
 * Function: FPDFPage_HasFormFieldAtPoint
 *     Get the form field type by point.
 * Parameters:
 *     hHandle     -   Handle to the form fill module. Returned by
 *                     FPDFDOC_InitFormFillEnvironment().
 *     page        -   Handle to the page. Returned by FPDF_LoadPage().
 *     page_x      -   X position in PDF "user space".
 *     page_y      -   Y position in PDF "user space".
 * Return Value:
 *     Return the type of the form field; -1 indicates no field.
 *     See field types above.
 */
FPDF_EXPORT int FPDF_CALLCONV
FPDFPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle,
                             FPDF_PAGE page,
                             double page_x,
                             double page_y);

/*
 * Function: FPDFPage_FormFieldZOrderAtPoint
 *     Get the form field z-order by point.
 * Parameters:
 *     hHandle     -   Handle to the form fill module. Returned by
 *                     FPDFDOC_InitFormFillEnvironment().
 *     page        -   Handle to the page. Returned by FPDF_LoadPage().
 *     page_x      -   X position in PDF "user space".
 *     page_y      -   Y position in PDF "user space".
 * Return Value:
 *     Return the z-order of the form field; -1 indicates no field.
 *     Higher numbers are closer to the front.
 */
FPDF_EXPORT int FPDF_CALLCONV
FPDFPage_FormFieldZOrderAtPoint(FPDF_FORMHANDLE hHandle,
                                FPDF_PAGE page,
                                double page_x,
                                double page_y);

/*
 * Function: FPDF_SetFormFieldHighlightColor
 *       Set the highlight color of the specified (or all) form fields
 *       in the document.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       doc         -   Handle to the document, as returned by
 *                       FPDF_LoadDocument().
 *       fieldType   -   A 32-bit integer indicating the type of a form
 *                       field (defined above).
 *       color       -   The highlight color of the form field. Constructed by
 *                       0xxxrrggbb.
 * Return Value:
 *       None.
 * Comments:
 *       When the parameter fieldType is set to FPDF_FORMFIELD_UNKNOWN, the
 *       highlight color will be applied to all the form fields in the
 *       document.
 *       Please refresh the client window to show the highlight immediately
 *       if necessary.
 */
FPDF_EXPORT void FPDF_CALLCONV
FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle,
                                int fieldType,
                                unsigned long color);

/*
 * Function: FPDF_SetFormFieldHighlightAlpha
 *       Set the transparency of the form field highlight color in the
 *       document.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       doc         -   Handle to the document, as returaned by
 *                       FPDF_LoadDocument().
 *       alpha       -   The transparency of the form field highlight color,
 *                       between 0-255.
 * Return Value:
 *       None.
 */
FPDF_EXPORT void FPDF_CALLCONV
FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, unsigned char alpha);

/*
 * Function: FPDF_RemoveFormFieldHighlight
 *       Remove the form field highlight color in the document.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *       None.
 * Comments:
 *       Please refresh the client window to remove the highlight immediately
 *       if necessary.
 */
FPDF_EXPORT void FPDF_CALLCONV
FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle);

/*
* Function: FPDF_FFLDraw
*       Render FormFields and popup window on a page to a device independent
*       bitmap.
* Parameters:
*       hHandle      -   Handle to the form fill module, as returned by
*                        FPDFDOC_InitFormFillEnvironment().
*       bitmap       -   Handle to the device independent bitmap (as the
*                        output buffer). Bitmap handles can be created by
*                        FPDFBitmap_Create().
*       page         -   Handle to the page, as returned by FPDF_LoadPage().
*       start_x      -   Left pixel position of the display area in the
*                        device coordinates.
*       start_y      -   Top pixel position of the display area in the device
*                        coordinates.
*       size_x       -   Horizontal size (in pixels) for displaying the page.
*       size_y       -   Vertical size (in pixels) for displaying the page.
*       rotate       -   Page orientation: 0 (normal), 1 (rotated 90 degrees
*                        clockwise), 2 (rotated 180 degrees), 3 (rotated 90
*                        degrees counter-clockwise).
*       flags        -   0 for normal display, or combination of flags
*                        defined above.
* Return Value:
*       None.
* Comments:
*       This function is designed to render annotations that are
*       user-interactive, which are widget annotations (for FormFields) and
*       popup annotations.
*       With the FPDF_ANNOT flag, this function will render a popup annotation
*       when users mouse-hover on a non-widget annotation. Regardless of
*       FPDF_ANNOT flag, this function will always render widget annotations
*       for FormFields.
*       In order to implement the FormFill functions, implementation should
*       call this function after rendering functions, such as
*       FPDF_RenderPageBitmap() or FPDF_RenderPageBitmap_Start(), have
*       finished rendering the page contents.
*/
FPDF_EXPORT void FPDF_CALLCONV FPDF_FFLDraw(FPDF_FORMHANDLE hHandle,
                                            FPDF_BITMAP bitmap,
                                            FPDF_PAGE page,
                                            int start_x,
                                            int start_y,
                                            int size_x,
                                            int size_y,
                                            int rotate,
                                            int flags);

#if defined(_SKIA_SUPPORT_)
FPDF_EXPORT void FPDF_CALLCONV FPDF_FFLRecord(FPDF_FORMHANDLE hHandle,
                                              FPDF_RECORDER recorder,
                                              FPDF_PAGE page,
                                              int start_x,
                                              int start_y,
                                              int size_x,
                                              int size_y,
                                              int rotate,
                                              int flags);
#endif

/*
 * Experimental API
 * Function: FPDF_GetFormType
 *           Returns the type of form contained in the PDF document.
 * Parameters:
 *           document - Handle to document.
 * Return Value:
 *           Integer value representing one of the FORMTYPE_ values.
 * Comments:
 *           If |document| is NULL, then the return value is FORMTYPE_NONE.
 */
FPDF_EXPORT int FPDF_CALLCONV FPDF_GetFormType(FPDF_DOCUMENT document);

/*
 * Experimental API
 * Function: FORM_SetIndexSelected
 *           Selects/deselects the value at the given |index| of the focused
 *           annotation.
 * Parameters:
 *           hHandle     -   Handle to the form fill module. Returned by
 *                           FPDFDOC_InitFormFillEnvironment.
 *           page        -   Handle to the page. Returned by FPDF_LoadPage
 *           index       -   0-based index of value to be set as
 *                           selected/unselected
 *           selected    -   true to select, false to deselect
 * Return Value:
 *           TRUE if the operation succeeded.
 *           FALSE if the operation failed or widget is not a supported type.
 * Comments:
 *           Intended for use with listbox/combobox widget types. Comboboxes
 *           have at most a single value selected at a time which cannot be
 *           deselected. Deselect on a combobox is a no-op that returns false.
 *           Default implementation is a no-op that will return false for
 *           other types.
 *           Not currently supported for XFA forms - will return false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_SetIndexSelected(FPDF_FORMHANDLE hHandle,
                      FPDF_PAGE page,
                      int index,
                      FPDF_BOOL selected);

/*
 * Experimental API
 * Function: FORM_IsIndexSelected
 *           Returns whether or not the value at |index| of the focused
 *           annotation is currently selected.
 * Parameters:
 *           hHandle     -   Handle to the form fill module. Returned by
 *                           FPDFDOC_InitFormFillEnvironment.
 *           page        -   Handle to the page. Returned by FPDF_LoadPage
 *           index       -   0-based Index of value to check
 * Return Value:
 *           TRUE if value at |index| is currently selected.
 *           FALSE if value at |index| is not selected or widget is not a
 *           supported type.
 * Comments:
 *           Intended for use with listbox/combobox widget types. Default
 *           implementation is a no-op that will return false for other types.
 *           Not currently supported for XFA forms - will return false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_IsIndexSelected(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int index);

/*
 * Function: FPDF_LoadXFA
 *          If the document consists of XFA fields, call this method to
 *          attempt to load XFA fields.
 * Parameters:
 *          document     -   Handle to document from FPDF_LoadDocument().
 * Return Value:
 *          TRUE upon success, otherwise FALSE. If XFA support is not built
 *          into PDFium, performs no action and always returns FALSE.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_LoadXFA(FPDF_DOCUMENT document);

#ifdef __cplusplus
}
#endif

#endif  // PUBLIC_FPDF_FORMFILL_H_