home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / ODOORS60.ZIP / OPENDOOR.TXT < prev    next >
Text File  |  1996-02-27  |  731KB  |  14,806 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.     ██████████                         ███████▄
  14.     ███▀▀▀▀███                         ███▀▀▀███
  15.     ███    ███ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ███   ███ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄▄▄▄
  16.     ███    ███ ███▀███ ███▀███ ███▀███ ███   ███ ███▀███ ███▀███ ███▀▀▀ ███▀▀▀▀
  17.     ███▄▄▄▄███ ███ ███ ███▀▀▀▀ ███ ███ ███▄▄▄███ ███ ███ ███ ███ ███    ▀▀▀▀███
  18.     ██████████ ███████ ███████ ███ ███ ███████▀  ███████ ███████ ███    ███████
  19.                ███
  20.                ███
  21.                ▀▀▀                          Online Software Programming Toolkit
  22.     ───────────────────────────────────────────────────────────────────────────
  23.  
  24.                                                             Programmer's Manual
  25.  
  26.  
  27.                                                                    Version 6.00
  28.  
  29.  
  30.                                                          DOS and Win32 Editions
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.           NOTE: Since you will likely want to refer to this manual while
  46.                 working with OpenDoors, it is highly recommended that you take
  47.                 the time to print it out. Simply type COPY OPENDOOR.TXT PRN
  48.                 from your DOS prompt. With the exception of this title page,
  49.                 this document contains only 7-bit ASCII characters.
  50.  
  51.  
  52.  
  53.  
  54.         (C) Copyright 1991 - 1996 by Brian Pirie. All Rights Reserved.
  55.  
  56.                               TABLE OF CONTENTS
  57.  
  58.  
  59. CHAPTER 1 - INTRODUCTION TO OPENDOORS.......................................5
  60.     WELCOME! ...............................................................5
  61.     FEATURES OF THE OPENDOORS TOOLKIT ......................................6
  62.  
  63. CHAPTER 2 - ABOUT THIS EVALUATION COPY AND ORDERING.........................9
  64.     THE EVALUATION COPY & BENEFITS OF REGISTERING ..........................9
  65.     HOW TO ORDER ...........................................................10
  66.     HOW TO ORDER BY MAIL ...................................................11
  67.     SENDING YOUR ORDER FEE IN THE MAIL .....................................12
  68.     ORDERING BY CREDIT CARD ................................................14
  69.     HOW YOU CAN RECEIVE YOUR ORDER .........................................15
  70.     ORDERING THE SOURCE CODE ...............................................17
  71.     OPENDOORS 6.00 ORDER FORM ..............................................18
  72.     OPENDOORS 6.00 FEEDBACK FORM ...........................................19
  73.     TERMS OF REGISTRATION AND SOURCE CODE USE ..............................20
  74.  
  75. CHAPTER 3 - OPENDOORS TUTORIAL..............................................21
  76.     ABOUT THIS MANUAL ......................................................21
  77.     COMPILING A PROGRAM WITH OPENDOORS .....................................22
  78.     LINKING WITH OPENDOORS USING A DOS COMPILER ............................23
  79.     LINKING WITH OPENDOORS USING A WINDOWS COMPILER ........................24
  80.     RUNNING A DOOR PROGRAM WRITTEN WITH OPENDOORS ..........................26
  81.     RUNNING DOS-BASED DOOR PROGRAMS ........................................26
  82.     RUNNING WINDOWS 95/NT DOOR PROGRAMS ....................................26
  83.     BASICS OF DOOR PROGRAMMING WITH OPENDOORS ..............................29
  84.     TOUR OF A SAMPLE DOOR PROGRAM: "EX_VOTE" ...............................33
  85.     OTHER EXAMPLE PROGRAMS INCLUDED WITH OPENDOORS .........................38
  86.  
  87. CHAPTER 4 - THE OPENDOORS API FUNCTIONS.....................................40
  88.     OVERVIEW ...............................................................40
  89.     TABLE OF MOST COMMONLY USED FUNCTIONS ..................................41
  90.     TABLE OF ALL FUNCTIONS .................................................42
  91.     OD_ADD_PERSONALITY() ...................................................47
  92.     OD_AUTODETECT() ........................................................48
  93.     OD_CHAT() ..............................................................50
  94.     OD_CARRIER() ...........................................................51
  95.     OD_CLEAR_KEYBUFFER() ...................................................53
  96.     OD_CLR_LINE() ..........................................................55
  97.     OD_CLR_SCR() ...........................................................57
  98.     OD_COLOR_CONFIG() ......................................................59
  99.     OD_DISP() ..............................................................60
  100.     OD_DISP_EMU() ..........................................................62
  101.     OD_DISP_STR() ..........................................................63
  102.     OD_DRAW_BOX() ..........................................................65
  103.     OD_EDIT_STR() ..........................................................68
  104.     OD_EXIT() ..............................................................79
  105.     OD_GET_ANSWER() ........................................................81
  106.     OD_GET_INPUT() .........................................................82
  107.     OD_GET_KEY() ...........................................................85
  108. ===============================================================================
  109. OpenDoors 6.00 Manual                                            End of Page 2
  110.  
  111.     OD_GETTEXT() ...........................................................89
  112.     OD_HOTKEY_MENU() .......................................................90
  113.     OD_INIT() ..............................................................92
  114.     OD_INPUT_STR() .........................................................95
  115.     OD_KERNEL() ............................................................97
  116.     OD_LIST_FILES() ........................................................98
  117.     OD_LOG_WRITE() .........................................................100
  118.     OD_MULTILINE_EDIT() ....................................................101
  119.     OD_PAGE() ..............................................................104
  120.     OD_PARSE_CMD_LINE() ....................................................105
  121.     OD_POPUP_MENU() ........................................................107
  122.     OD_PRINTF() ............................................................110
  123.     OD_PUTCH() .............................................................115
  124.     OD_PUTTEXT() ...........................................................116
  125.     OD_REPEAT() ............................................................118
  126.     OD_RESTORE_SCREEN() ....................................................120
  127.     OD_SAVE_SCREEN() .......................................................121
  128.     OD_SCROLL() ............................................................123
  129.     OD_SEND_FILE() .........................................................124
  130.     OD_SET_ATTRIB() ........................................................128
  131.     OD_SET_COLOR() .........................................................131
  132.     OD_SET_CURSOR() ........................................................134
  133.     OD_SET_DTR() ...........................................................135
  134.     OD_SET_PERSONALITY() ...................................................136
  135.     OD_SET_STATUSLINE() ....................................................137
  136.     OD_SLEEP() .............................................................139
  137.     OD_SPAWN() .............................................................141
  138.     OD_SPAWNVPE() ..........................................................143
  139.     OD_WINDOW_CREATE() .....................................................145
  140.     OD_WINDOW_REMOVE() .....................................................147
  141.  
  142. CHAPTER 5 - THE OPENDOORS CONTROL STRUCTURE.................................148
  143.     INTRODUCTION TO THE CONTROL STRUCTURE ..................................148
  144.     CONTROL STRUCTURE - DOOR INFO FILE STATS ...............................150
  145.     CONTROL STRUCTURE - SERIAL PORT SETTINGS ...............................153
  146.     CONTROL STRUCTURE - BBS AND CALLER INFORMATION .........................158
  147.     CONTROL STRUCTURE - DOOR SETTINGS ......................................182
  148.     CONTROL STRUCTURE - DIAGNOSTICS ........................................185
  149.     CONTROL STRUCTURE - OPENDOORS CUSTOMIZATION ............................187
  150.     CONTROL STRUCTURE - FUNCTION KEYS ......................................212
  151.     CONTROL STRUCTURE - COLOR CUSTOMIZATION ................................216
  152.     CONTROL STRUCTURE - TEXT CUSTOMIZATION .................................217
  153.  
  154. CHAPTER 6 - SPECIAL TOPICS..................................................220
  155.     ADDITIONAL INFORMATION ON THE WIN32 VERSION ............................220
  156.     CONFIGURATION FILE SYSTEM ..............................................225
  157.     DEFINING CUSTOM DOOR INFORMATION FILE FORMATS ..........................230
  158.     MULTIPLE PERSONALITY SYSTEM ............................................233
  159.     LOG FILE SYSTEM ........................................................235
  160.     MAKING DOORS MULTI-NODE-AWARE ..........................................237
  161.  
  162. CHAPTER 7 - TROUBLESHOOTING AND GETTING ASSISTANCE WITH OPENDOORS...........242
  163. ===============================================================================
  164. OpenDoors 6.00 Manual                                            End of Page 3
  165.  
  166.     ABOUT THIS CHAPTER .....................................................242
  167.     TROUBLESHOOTING PROBLEMS ...............................................242
  168.     SOLUTIONS TO COMMON PROBLEMS ...........................................244
  169.     OPENDOORS SUPPORT ......................................................245
  170.     THE OPENDOORS SUPPORT BBS ..............................................245
  171.     THE OPENDOORS WORD WIDE WEB SITE .......................................246
  172.     THE OPENDOORS CONFERENCE ...............................................246
  173.     GETTING IN TOUCH WITH ME ...............................................247
  174.  
  175. APPENDIX A - CONTENTS OF PACKAGE............................................249
  176.  
  177. APPENDIX B - CHANGES FOR THIS VERSION.......................................250
  178.  
  179. APPENDIX C - FUTURE VERSIONS................................................254
  180.  
  181. APPENDIX D - SPECIAL THANKS.................................................255
  182.  
  183. GLOSSARY....................................................................256
  184.  
  185. INDEX.......................................................................267
  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. OpenDoors 6.00 Manual                                            End of Page 4
  220.  
  221.   11
  222.  111
  223.   11
  224.   11
  225.   11
  226.   11
  227.  1111
  228. -------------------------------------------------------------------------------
  229. CHAPTER 1 - INTRODUCTION TO OPENDOORS
  230.  
  231.  
  232.  
  233.  
  234. WELCOME!
  235. -------------------------------------------------------------------------------
  236.  
  237.                Welcome to OpenDoors! OpenDoors is a POWERFUL and EASY TO USE
  238.                online software programming toolkit for C and C++. While
  239.                OpenDoors is most often used to create add-on "door" programs
  240.                that run under BBS systems, it can also be used for many other
  241.                online software applications. By using OpenDoors, you are
  242.                joining over 500 other programmers from around the world who
  243.                have used it since it was first released to the public in 1991.
  244.                Over the years, OpenDoors has grown from a simple BBS door
  245.                programming library to what is perhaps the most sophisticated,
  246.                widely used and supported package of its type.
  247.  
  248.                What exactly is OpenDoors? OpenDoors provides a complete system
  249.                that allows you to quickly and easily write spectacular,
  250.                professional quality interactive online software. With
  251.                OpenDoors, you can write software such as BBS door programs just
  252.                as you would write any other program - without having to worry
  253.                about the many of the internal details of door programming.
  254.                OpenDoors looks after communicating through the modem, providing
  255.                ANSI/AVATAR/RIP terminal support and interfacing with a wide
  256.                variety of BBS packages through door information files (such as
  257.                DOOR.SYS, DORINFO1.DEF, etc.). OpenDoors also looks after status
  258.                lines and sysop function keys for DOS shells, chatting, hanging
  259.                up, and so on. In addition, OpenDoors carries out all the work
  260.                involved in keeping track of carrier detection, user timeouts
  261.                and much, much more. OpenDoors is also highly flexible, allowing
  262.                you to take as little or as much control of your program's
  263.                behavior as you wish.
  264.  
  265.                This package includes both DOS and Win32 versions of OpenDoors.
  266.                This allows you to build a plain-DOS version of your program to
  267.                run under a variety of platforms (DOS, DesqView, Windows 3.x,
  268.                NT, 95 and OS/2), to build a Win32 version that takes special
  269.                advantage of Windows 95 / NT, or build both versions of your
  270.                program - the choice is yours. The DOS version of OpenDoors
  271.                performs its serial I/O using either a FOSSIL driver, or built-
  272.                in serial I/O capabilities, making the use of a FOSSIL driver
  273. ===============================================================================
  274. OpenDoors 6.00 Manual                                            End of Page 5
  275.  
  276.                optional. The  Win32 version takes special advantage of 32-bit
  277.                programming, multithreading and the Windows GUI, and allows you
  278.                to access many services that are provided by Windows, such as
  279.                ODBC (for database access) and MAPI (for email and messaging).
  280.                Both the DOS and Win32 versions of OpenDoors can be run under
  281.                both DOS and Windows-based BBS packages. The DOS version of
  282.                OpenDoors can also be run under OS/2-based BBS packages.
  283.  
  284.                The following section provides more detailed information on the
  285.                features and capabilities that OpenDoors provides.
  286.  
  287.  
  288.  
  289.  
  290. FEATURES OF THE OPENDOORS TOOLKIT
  291. -------------------------------------------------------------------------------
  292.  
  293.                You will find that OpenDoors provides a solid platform to build
  294.                BBS door programs and other online software on top of. You may
  295.                want to write simple utility door programs, on-line games or
  296.                sophisticated applications. Perhaps you are interested in
  297.                getting into the market of selling online software, or perhaps
  298.                you just wish to write some custom door programs for a
  299.                particular BBS system. With OpenDoors, you can accomplish all of
  300.                these things - and do it much more easily than ever before. Some
  301.                of the features that OpenDoors provides to :
  302.  
  303.                - OpenDoors handles all the "dirty" work involved in writing
  304.                  BBS door programs. Since OpenDoors looks after all the door-
  305.                  related operations for you, you need do next to nothing
  306.                  different when writing door programs than you would when
  307.                  writing any other program. You simply call OpenDoor's simple
  308.                  functions to input, output and control door operation. In
  309.                  fact, many people have converted non-door programs to door
  310.                  programs in only a matter of minutes using OpenDoors. One of
  311.                  the most common comments I receive about OpenDoors is how
  312.                  easy it is to use.
  313.  
  314.                -  OpenDoors allows you to write software that DIRECTLY support
  315.                  a wide variety of BBS systems, including RemoteAccess,
  316.                  QuickBBS, PC-Board, Maximus,  Opus, Wildcat!, WWIV, Spitfire,
  317.                  SuperBBS, Telegard, TriBBS, GAP, and others.
  318.  
  319.                - As you would expect, OpenDoors flawlessly monitors the
  320.                  modem's carrier detect signal, to automatically recover when
  321.                  a user hangs up - without your having to do anything extra in
  322.                  your program. OpenDoors also monitors how much time the user
  323.                  has left in the door, and provides a fully adjustable
  324.                  inactivity timeout monitor.
  325.  
  326.                - OpenDoors takes care of all the work involved in reading and
  327.                  writing BBS door information files, such as DORINFO1.DEF,
  328. ===============================================================================
  329. OpenDoors 6.00 Manual                                            End of Page 6
  330.  
  331.                  EXITINFO.BBS, CHAIN.TXT, DOOR.SYS, etc.  If the particular
  332.                  information is available to OpenDoors, it will provide you
  333.                  with just about everything you could ever want to know about
  334.                  the user on-line, the system your door is running under, and
  335.                  so on. In addition to the many door information file formats
  336.                  supported by OpenDoors, you are also able to define your own
  337.                  custom formats.
  338.  
  339.                - OpenDoors also does all the work involved in displaying and
  340.                  automatically updating the door's status line, with
  341.                  information available to the sysop such as user name,
  342.                  location, baud rate, time left, function keys,
  343.                  ANSI/AVATAR/RIP settings, and so on. Using OpenDoors, you can
  344.                  choose from a number of different "personalities". These
  345.                  personalities allows OpenDoors to mimic the status lines and
  346.                  sysop function keys used in various BBS packages. OpenDoors
  347.                  includes personalities that mimic RemoteAccess, PC-Board and
  348.                  Wildcat! OpenDoors also allows you to create your own
  349.                  personalities to mimic any other BBS system.
  350.  
  351.                - OpenDoors automatically provides the sysop with all the
  352.                  standard function keys for adjusting user time, hanging up on
  353.                  or even locking out the user, and so on. OpenDoors also
  354.                  provides you with a chat mode, which is available to the
  355.                  sysop by pressing Alt-C. In addition, OpenDoors has full
  356.                  support for sysop shell to DOS, activated by the Alt-J key.
  357.  
  358.                - What's more, OpenDoors is designed to be very easy to use.
  359.                  Even the most novice 'C' programmers are able to write
  360.                  professional-quality doors with OpenDoors. It takes care of
  361.                  just about every detail for you, yet still gives you the
  362.                  ability to completely control and customize every detail of
  363.                  your door's behavior. There are even people who begin door
  364.                  programming with OpenDoors, having never programmed in C in
  365.                  the past.
  366.  
  367.                - OpenDoors supports both FOSSIL-based and built-in serial I/O
  368.                  capabilities. FOSSIL-based serial I/O can be used for maximum
  369.                  compatibility with various systems and serial ports,
  370.                  including multiple-port serial cards such as DigiBoard.
  371.                  OpenDoors can also operate without a FOSSIL driver, using
  372.                  it's own serial I/O capabilities. OpenDoor's built-in
  373.                  asynchronous communications supports baud rates of up to
  374.                  115,200 and non-standard serial port configurations.
  375.                  OpenDoors also has the ability to automatically detect which
  376.                  of the two serial I/O methods should be used on a particular
  377.                  system.
  378.  
  379.                - OpenDoors also automatically detects when the BBS system is
  380.                  operating in local mode, and supports full local mode
  381.                  operations itself.
  382.  
  383. ===============================================================================
  384. OpenDoors 6.00 Manual                                            End of Page 7
  385.  
  386.                - Other OpenDoors functions include a built in sysop-page
  387.                  function that will ask the user why they wish to chat, and
  388.                  then proceed to page the sysop, just as any BBS package
  389.                  would. OpenDoors also provides screen clearing functions
  390.                  (which will detect whether the user has screen clearing
  391.                  turned on), and various ANSI/AVATAR/RIP control functions
  392.                  (which again detect if the user has graphics mode turned on).
  393.  
  394.                - In addition to the basic display features of OpenDoors there
  395.                  are also a number of advanced screen control functions. These
  396.                  include functions to save and restore the entire screen,
  397.                  along with functions to save, restore or scroll portions of
  398.                  the screen. Other functions allow you to provide overlapping
  399.                  windows and pop-up menus with highlighted selection bars.
  400.  
  401.                - OpenDoors provides a multi-line text editor that you can use
  402.                  to allow the user to enter or edit text files, email
  403.                  messages, or any other text that spans multiple lines. You
  404.                  can customize many of the editor's settings to suit your
  405.                  needs.
  406.  
  407.                - OpenDoors has a number of special sub-systems that you may
  408.                  elect to include in your doors. Among these, is a log-file
  409.                  system that allows you to add log file support to your doors
  410.                  with only a single line of programming.
  411.  
  412.                - Another valuable OpenDoors sub-system is the configuration
  413.                  file system. Again using only a single line of code, you can
  414.                  add configuration file support to your doors. OpenDoors
  415.                  configuration files permit the sysop using the door to
  416.                  customize the door's behavior to their own preferences.
  417.  
  418.                - OpenDoors can also be fully customized in order that you may
  419.                  write door programs that use languages other than English.
  420.  
  421.                - Among the ANSI/AVATAR/RIP features found in OpenDoors is the
  422.                  ability to send ANSI/AVATAR/RIP files from disk. This allows
  423.                  you to easily design program screens, and incorporate them
  424.                  into your doors.
  425.  
  426.                - OpenDoors also comes with the source code for a number of
  427.                  example doors, which you can modify, or simply extract bits
  428.                  and pieces for use in your own doors. Plus, this manual
  429.                  contains many examples of C source code, to help you in
  430.                  writing nearly any door program you might wish to build.
  431.  
  432.                - You may also elect to purchase the source code for OpenDoors,
  433.                  which will permit you to make modifications to any portion of
  434.                  OpenDoors, use any portions of the OpenDoors source code in
  435.                  other programs you write, or merely learn how communications-
  436.                  type programs are written.
  437.  
  438. ===============================================================================
  439. OpenDoors 6.00 Manual                                            End of Page 8
  440.  
  441.   2222
  442.  22  22
  443.      22
  444.     22
  445.    22
  446.   22
  447.  222222
  448. -------------------------------------------------------------------------------
  449. CHAPTER 2 - ABOUT THIS EVALUATION COPY AND ORDERING
  450.  
  451.  
  452.  
  453.  
  454. THE EVALUATION COPY & BENEFITS OF REGISTERING
  455. -------------------------------------------------------------------------------
  456.  
  457.                OpenDoors is distributed and sold using the conventional
  458.                "shareware" approach. This complete package can be freely
  459.                distributed, both online (through BBS systems and the Internet)
  460.                and on CD-ROMs or other media. This gives you the chance to try
  461.                OpenDoors before you buy it. Unlike traditional commercial
  462.                software, you have the opportunity to see OpenDoors first-hand,
  463.                and determine whether it meets your needs without first paying
  464.                for it. However, before registering you are only permitted to
  465.                use it under the following conditions:
  466.  
  467.                1.)You may only use this package for a one month period, and
  468.                   for evaluation purposes only.
  469.  
  470.                2.) Programs written with this package may not be distributed.
  471.  
  472.                Also, before registering, any program written with OpenDoors
  473.                will display a message to the user indicating that OpenDoors is
  474.                not registered. Of course, this message is removed once you have
  475.                registered.
  476.  
  477.                If you decided to register OpenDoors, you will become the
  478.                licensed owner of a powerful tool for creating BBS door programs
  479.                and other online software. Registered (licensed) owners of
  480.                OpenDoors are entitled to:
  481.  
  482.                1.)Virtually unlimited use of OpenDoors. You may write as many
  483.                   programs as you wish using OpenDoors, and do what you please
  484.                   with these programs. They may be freely distributed, or even
  485.                   sold. What's more, there are no additional royalty fees.
  486.                   Your one time purchase of OpenDoors entitles you to use it
  487.                   as you please.
  488.  
  489.                2.)Your registration entitles you to use both the DOS and Win32
  490.                   versions of OpenDoors.
  491.  
  492.  
  493. ===============================================================================
  494. OpenDoors 6.00 Manual                                            End of Page 9
  495.  
  496.                3.)You will also be entitled to free upgrades to newer versions
  497.                   of OpenDoors. In addition to the great many features and the
  498.                   quality that this version of OpenDoors has to offer, I am
  499.                   currently working on a great many additions and enhancements
  500.                   for the next version. (See the end of this document for an
  501.                   outline of features currently "in the works".) Any programs
  502.                   you write using this version will also automatically take on
  503.                   many of these new features when you upgrade to the new
  504.                   version.
  505.  
  506.  
  507.                Perhaps the best news of all is the price of OpenDoors. Similar
  508.                packages sell for $50, $75, or even more. However, this version
  509.                of OpenDoors will only cost you $28 US Dollars, $34 Canadian
  510.                Dollars, or the equivalent in your country's currency! (Note
  511.                that this price will increase in future versions. By registering
  512.                now, you will save by being able to upgrade to all future
  513.                versions at no additional charge.)
  514.  
  515.                Also, the source code for OpenDoors is now available to licensed
  516.                users for an additional $28US / $34CDN / equivalent. Ordering a
  517.                copy of the source code will allow you to customize OpenDoors
  518.                for your own use, making any changes or additions that you wish.
  519.                It also gives you the opportunity to see how OpenDoors works,
  520.                and to use any portions of the OpenDoors code in any other
  521.                programs you wish to write. If you think you might be interested
  522.                in ordering the OpenDoors source code, please be sure to read
  523.                the section entitled "Ordering The Source Code", located on page
  524.                20.
  525.  
  526.  
  527.  
  528. HOW TO ORDER
  529. -------------------------------------------------------------------------------
  530.  
  531.                There are to ways of ordering and OpenDoors license
  532.                (registration):
  533.  
  534.                -The most common way to order is by mailing the OpenDoors order
  535.                 form along with a cheque, money order or cash to the address
  536.                 on this order form.
  537.  
  538.                - You may order using a major credit card. OpenDoors credit card
  539.                 orders are handled by a third-party credit card order service,
  540.                 named PsL.
  541.  
  542.                The following sections provide more information on how to order
  543.                using each of these options.
  544.  
  545.  
  546.  
  547.  
  548. ===============================================================================
  549. OpenDoors 6.00 Manual                                           End of Page 10
  550.  
  551. HOW TO ORDER BY MAIL
  552. -------------------------------------------------------------------------------
  553.  
  554.                To order OpenDoors by mailing a cheque, money order or cash,
  555.                simply follow these three steps:
  556.  
  557.                1.)  Fill out the registration form. Information on filling out
  558.                     the form is located on page 15.
  559.  
  560.                2.)  Send the appropriate payment, $28US/$34CDN/equivalent for
  561.                     the registration or $56US/$68CDN/equivalent for both the
  562.                     registration and source code. If you wish more detailed
  563.                     instructions on sending the registration fee, see the
  564.                     section that begins page on 12. Included in that section is
  565.                     a list of equivalent prices for a number of other
  566.                     countries.
  567.  
  568.                3.)  Send the above two items to me at:
  569.  
  570.                               Brian Pirie
  571.                               117 Cedarock Drive
  572.                               Kanata ON  K2M 2H5
  573.                               Canada
  574.  
  575.  
  576.                Many people who register OpenDoors also order the source code
  577.                package. You may wish to consider the benefits of having the
  578.                OpenDoors source code - it allows you to learn how OpenDoors and
  579.                communications software is written, it allows you to modify and
  580.                customize OpenDoors to suit your own preferences, and it also
  581.                allows you to use portions of OpenDoors for other non-door
  582.                programming projects. If you think you might also be interested
  583.                in the OpenDoors source code, be sure to read the section on the
  584.                source code, which begins on page 20.
  585.  
  586.                Also, you may wish to send the OpenDoors feedback form (located
  587.                on page 19), along with your registration. The feedback form
  588.                gives you a chance to tell me what you think of OpenDoors, and
  589.                what changes you would like to see in future versions. In fact,
  590.                the majority of suggestions made on these forms in the past have
  591.                already been implemented in the current version of OpenDoors.
  592.  
  593.                If you have printed the OpenDoors manual, you can simply remove
  594.                and mail the forms on pages 18 and 19. If you have not already
  595.                printed a copy of the manual, and you have a printer, you can
  596.                quickly print these forms by printing the ORDER.FRM file
  597.                included in the OpenDoors distribution archive. (Type COPY
  598.                ORDER.FRM PRN from your DOS prompt.)
  599.  
  600. NO PRINTER?    Alternatively, if you do not have a printer, simply send a hand-
  601.                written version of the order form.
  602.  
  603. ===============================================================================
  604. OpenDoors 6.00 Manual                                           End of Page 11
  605.  
  606.                If you have any special instructions for me, or anything that
  607.                you would like to say when you register, feel free to write this
  608.                on the back of the registration form, or on a separate piece of
  609.                paper.
  610.  
  611.                When filling out the OpenDoors registration form, be sure to
  612.                indicate how you would prefer to receive your OpenDoors
  613.                registration key and/or source code. The following options are
  614.                available:
  615.  
  616.                          - Having me send the registration and/or source code
  617.                           by conventional mail
  618.                          - Internet E-Mail (the fastest option)
  619.                          - By Fax
  620.                          - Having me call to your BBS
  621.                          - You calling the OpenDoors support BBS
  622.                          - FidoNet "CrashMail"
  623.  
  624.                Once you have decided which means you would prefer to receive
  625.                your order by, please read the detailed instructions on your
  626.                order method, below. Also, if you are ordering the source code,
  627.                please be sure to read the section on ordering the source code,
  628.                which begins on page 20.
  629.  
  630.  
  631.  
  632.  
  633. SENDING YOUR ORDER FEE IN THE MAIL
  634. -------------------------------------------------------------------------------
  635.  
  636.                The price of OpenDoors is 34 Canadian Dollars, 28 U.S. Dollars,
  637.                or equivalent for the registration. The source code costs an
  638.                additional 34 Canadian Dollars, 28 U.S. Dollars, or equivalent.
  639.                For your convenience, the equivalent value in a number of other
  640.                country's currencies, at the time of this writing, is as
  641.                follows:
  642.  
  643.                        -----------------------------------------------
  644.                                                 REGISTRATION
  645.                        REGISTRATION ONLY        AND SOURCE CODE
  646.                        -----------------------------------------------
  647.                        34 Canadian Dollars      68 Canadian Dollars
  648.                        28 US Dollars            56 US Dollars
  649.                        18 British Pounds        36 British Pounds
  650.                        150 French Francs        300 French Francs
  651.                        44 German Marks          88 German Marks
  652.                        50 Netherland Gilders    100 Netherland Gilders
  653.                        39 Australian Dollars    78 Australian Dollars
  654.                        -----------------------------------------------
  655.  
  656.                If you are ordering by mail, this order fee may be paid using
  657.                any of the following methods:
  658. ===============================================================================
  659. OpenDoors 6.00 Manual                                           End of Page 12
  660.  
  661.  
  662.                -Cheque or Money Order in Canadian currency, drawn upon a
  663.                 Canadian bank. In this case, your order fee will be either
  664.                 $34CDN for just the registration, or $68CDN for both the
  665.                 registration and source code.
  666.  
  667.                -Cheque or Money Order in U.S. currency, drawn upon a U.S. bank.
  668.                 In this case, your order fee will be either $28US for just the
  669.                 registration, or $56US for both the registration and source
  670.                 code.
  671.  
  672.                -An International Money Order or International Bank Draft
  673.                 (available from your bank, post office or companies such as
  674.                 American Express), in Canadian currency. Depending on the
  675.                 particular case, your order fee MAY be sent to me by the postal
  676.                 service, and you will mail your order form by itself. You
  677.                 should have the money order drawn in either $34CDN for just the
  678.                 registration, or $68CDN for both the registration and source
  679.                 code.
  680.  
  681.                -A cheque drawn on any bank in the world, IN THAT COUNTRY'S
  682.                 CURRENCY, equivalent to 34 Canadian dollars. For instance, a
  683.                 cheque for the appropriate number of British Pounds, drawn on a
  684.                 British bank, is perfectly acceptable. However, I am unable to
  685.                 accept a cheque for $34 Canadian dollars, drawn on a British
  686.                 Bank. UNFORTUNATELY, THE BANKS IN CANADA ARE CURRENTLY
  687.                 UNWILLING TO ACCEPT EUROCHEQUES.
  688.  
  689.                -Cash. Please note that it is not usually recommended that cash
  690.                 be sent in the mail, and that I cannot be responsible for any
  691.                 cash lost in the mail. Simply put, if you wish to order by
  692.                 cash, it is your responsibility to get the cash to me. However,
  693.                 if I do receive your order in the form of cash, it will be
  694.                 perfectly acceptable to me. I would like to mention that many
  695.                 people have already ordered OpenDoors by sending cash, and I
  696.                 have yet to run across any case of cash being lost in the mail.
  697.                 Nonetheless, if you wish to send cash, you may wish to consider
  698.                 doing so by registered mail, for your added security.
  699.  
  700.  
  701.                If you are ordering OpenDoors from within Canada, you will most
  702.                likely choose the first option (a Canadian cheque or money
  703.                order). If you are ordering OpenDoors from within the United
  704.                States, you will most likely choose the second option (an
  705.                American cheque or money order). If you are ordering from
  706.                outside Canada and the U.S., it would be ideal if you could send
  707.                your fee by an international money order. However, it should be
  708.                noted that any of the above order methods will be acceptable
  709.                from any location. Also, it is quite possible that I may be able
  710.                to accept other means of sending your order fee. If you are
  711.                unsure about sending your order fee, please feel free to get in
  712.                touch with me by any of the means listed on page 247.
  713. ===============================================================================
  714. OpenDoors 6.00 Manual                                           End of Page 13
  715.  
  716. ORDERING BY CREDIT CARD
  717. -------------------------------------------------------------------------------
  718.  
  719.                This information applies to CREDIT CARD ORDERS ONLY. Please read
  720.                this entire section before ordering OpenDoors by credit card.
  721.  
  722.                In order to cover the additional costs of processing credit card
  723.                orders, an $8 shipping and handling fee applies to all OpenDoors
  724.                orders made through PsL. As such, the total prices you will pay
  725.                are:
  726.  
  727.                - Just registration ($28 + $8 Handling) = $36 U.S.
  728.                - Registration and Source Code ($56 + $8 Handling) = $64 U.S.
  729.                  (All prices will be charged to your credit card in U.S.
  730.                Dollars.)
  731.  
  732.                You can order OpenDoors with MC, Visa, Amex, or Discover from
  733.                Public (software) Library by calling 800-2424-PsL or 713-524-6394
  734.                or by FAX to 713-524-6398 or by CIS Email to 71355,470. You can
  735.                also order online through the World Wide Web. For more
  736.                information on how to do this, visit the OpenDoors Web site.
  737.                (Information on the OpenDoors web site is provided on page 246.)
  738.                You can also mail credit card orders to PsL at P.O.Box 35705,
  739.                Houston, TX 77235-5705. When ordering by phone, you must call
  740.                between 6:00am and 6:00pm CST on Monday to Thursday, or between
  741.                6:00am and 12:30pm on Fridays.
  742.  
  743.                THE ABOVE NUMBERS ARE FOR CREDIT CARD ORDERS ONLY.
  744.                THE AUTHOR OF THIS PROGRAM CANNOT BE REACHED AT THESE NUMBERS.
  745.  
  746.                Any questions about the status of the shipment of the order,
  747.                refunds, registration options, product details, technical
  748.                support, volume discounts, dealer pricing, site licenses, non-
  749.                credit card orders, etc., must be directed to:
  750.  
  751.                               Brian Pirie
  752.                               117 Cedarock Drive
  753.                               Kanata ON  K2M 2H5
  754.                               Canada
  755.  
  756.                To insure that you get the latest version, PsL will notify me the
  757.                day of your order and I will ship OpenDoors directly to you. I
  758.                will send OpenDoors by conventional mail unless I have previously
  759.                heard from you, asking me to send your order by some other means.
  760.  
  761.                When ordering by credit card through PsL, please be sure to
  762.                indicate whether you wish to order just the OpenDoors
  763.                registration, or both the registration and source code. Also,
  764.                please be sure to include your credit card billing address.
  765.                Without this information, PsL will be unable to process your
  766.                order.
  767.  
  768. ===============================================================================
  769. OpenDoors 6.00 Manual                                           End of Page 14
  770.  
  771. HOW YOU CAN RECEIVE YOUR ORDER
  772. -------------------------------------------------------------------------------
  773.  
  774.                For your convenience, I can send your OpenDoors registration key
  775.                and/or source code by any of the following methods. If you are
  776.                ordering OpenDoors by mail, simply check one of these options on
  777.                your order form. If you are ordering through the third-party
  778.                credit card service, I will automatically send your order by
  779.                Internet email or conventional mail unless I receive a message
  780.                from you before you order, asking me to send it by some other
  781.                means.
  782.  
  783.  
  784. -------------------------------------------------------------------------------
  785. RECEIVING      If you wish to receive your OpenDoors registration key by
  786. ORDER BY       Internet E-Mail (including Internet E-Mail to a CompuServe
  787. INTERNET       account), fill out the order form and mail it along with your
  788. E-MAIL         payment as described below. Be sure to include your e-mail
  789.                address on your order form. Note that the source code cannot be
  790.                sent via Internet e-mail.
  791.  
  792.  
  793. -------------------------------------------------------------------------------
  794. RECEIVING      In order to receive your OpenDoors registration key and/or
  795. ORDER          source code by conventional mail, simply fill out the order
  796. BY MAIL        form and mail it along with your payment as described below. I
  797.                will cover the cost of postage. If your address contains non-
  798.                Roman characters, also enclose a self-addressed envelope or
  799.                mailing label.
  800.  
  801.  
  802. -------------------------------------------------------------------------------
  803. RECEIVING      If you wish to receive your OpenDoors registration key by
  804. ORDER BY       FAX, fill out the order form and mail it along with your payment
  805. FAX            as described below. Be sure to include your fax number on your
  806.                order form. Do to choose this method if you are ordering the
  807.                source code.
  808.  
  809.  
  810. -------------------------------------------------------------------------------
  811. RECEIVING      You may choose to receive your OpenDoors registration and/or
  812. ORDER BY       source code by calling the OpenDoors BBS after your registration
  813. CALLING        form and order fee have been received here. If you are unable to
  814. OPENDOORS      receive your order by any other electronic means (such as a call
  815. BBS            to your BBS, or by electronic mail), this may be the quickest
  816.                way for you to receive your registration information and/or
  817.                source code. The obvious disadvantage with to option is the fact
  818.                that you will have to estimate when your order will arrive here
  819.                in order to receive it as quickly as possible. You may end up
  820.                calling the OpenDoors BBS more than once before your order has
  821.                arrived. After your order form has arrived, your registration
  822.                key and/or source code will be placed on hold for you, and you
  823. ===============================================================================
  824. OpenDoors 6.00 Manual                                           End of Page 15
  825.  
  826.                will be able to receive it on your first call to the BBS. The
  827.                phone number of the BBS is:
  828.  
  829.                          +1 (613) 599-5554
  830.  
  831.  
  832. -------------------------------------------------------------------------------
  833. RECEIVING      In order to receive your OpenDoors registration key and/or
  834. ORDER BY       source code by a message and/or upload to your BBS, fill out
  835. CALL TO        the order form and mail it along with your payment as described
  836. YOUR BBS       below. Be sure to include the phone number, baud rate, and my
  837.                login and password for the BBS to which you would like me to
  838.                call. As always, I will cover any long distance costs. If, for
  839.                some reason, I am unable to connect to your BBS (not because it
  840.                is busy, but, for example, if your BBS is no longer online), I
  841.                will send your order by conventional mail instead.
  842.  
  843.  
  844. -------------------------------------------------------------------------------
  845. RECEIVING      In order to receive your OpenDoors registration key and/or
  846. ORDER BY       source code by FidoNet CrashMail, simply fill out the order
  847. FIDONET        form and mail it along with your payment as described below.
  848. CRASHMAIL      Be sure to include the FidoNet node address to which you wish to
  849.                have your registration key and/or source code sent to (via
  850.                CrashMail). Again I will cover any long distance costs. If, for
  851.                some reason, I am unable to connect to your FidoNet system, I
  852.                will send your order by conventional mail instead.
  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. OpenDoors 6.00 Manual                                           End of Page 16
  880.  
  881. ORDERING THE SOURCE CODE
  882. -----------------------------------------------------------------------------
  883.  
  884.                Many people also choose to order the source code along with
  885.                their OpenDoors registration. Ordering the source code will
  886.                allow you to customize OpenDoors for your own use, use parts of
  887.                the OpenDoors source code in other programs, and learn more
  888.                about how OpenDoors works. If you have any ideas for changes
  889.                that you would like to see in OpenDoors, either large or small,
  890.                ordering the source code will allow you to makes these changes
  891.                yourself, creating your own customized version of OpenDoors. You
  892.                will be able to remove copyright notices, change the way certain
  893.                OpenDoors functions work, or add new capabilities to OpenDoors
  894.                in surprisingly little time. You will also be able to use any of
  895.                the OpenDoors source code, be it the DesqView-aware code,
  896.                EMS/disk swapping routines, configuration file system,
  897.                communications routines, or anything else, in any other programs
  898.                that you write. Also, ordering the OpenDoors source code will
  899.                allow you to learn more about how OpenDoors works, and how to
  900.                program communications software and BBS door programs.
  901.  
  902.                When you order the OpenDoors source code, you will receive the
  903.                source code package. The source code package also includes a
  904.                short "Source Code Manual", with a description of how the
  905.                OpenDoors source code is organized, instructions on how to
  906.                recompile the source code, and more. If you choose to receive
  907.                the source code package electronically, you will receive it in
  908.                the form of a single .ZIP file. If you choose to receive the
  909.                source code package by mail, you will receive it on a 3-1/2"
  910.                diskette.
  911.  
  912. REQUIREMENTS   Due to the wide variety of compilers that are available, and the
  913.                differences between them, I have been unable to test the
  914.                OpenDoors source code with every compiler. This means that you
  915.                may need to make some changes to the source code in order to
  916.                compile it with certain compilers.
  917.  
  918.                In order to compile the DOS version of OpenDoors, you must be
  919.                using a compiler that supports inline assembly language
  920.                keywords. This includes all Borland compilers released since
  921.                1991, and many other compilers. The one notable exception is
  922.                Watcom's compiler, which does not support inline assembly
  923.                language at the time of this writing.
  924.  
  925.                For your information, the DOS OpenDoors libraries included with
  926.                this package were compiled using Turbo C++ 1.0 Professional. The
  927.                Win32 libraries included with this package were compiled using
  928.                Microsoft Visual C++ 2.0. This means that you can be reasonably
  929.                certain that OpenDoors will compile with these compilers and any
  930.                more recent compilers by these companies without any changes.
  931.  
  932.  
  933. ===============================================================================
  934. OpenDoors 6.00 Manual                                           End of Page 17
  935.  
  936. --------------------------------------------------------------------------
  937.                        OPENDOORS 6.00 ORDER FORM
  938. --------------------------------------------------------------------------
  939.  
  940.  REGISTRATION NAME : _______________________________   (AS SHOULD APPEAR IN
  941.                                                         REGISTRATION)
  942.          YOUR NAME : _______________________________   (IF DIFFERENT)
  943.  
  944.     POSTAL ADDRESS : ______________________________________________________
  945.  
  946.                      ______________________________________________________
  947.  
  948.                      ______________________________________________________
  949.  
  950.   E-MAIL ADDRESSES : ____________________________________   (IF APPLICABLE)
  951.  
  952.    ADDITIONAL INFO : ______________________________________________________
  953.                      (EG FAX/BBS PHONE NUMBER & BRIAN'S PASSWORD, IF NEEDED)
  954.  
  955. I WISH TO RECEIVE MY ORDER BY:
  956.           ___                                ___
  957.          |   | - INTERNET E-MAIL (FASTEST)  |   | - I WILL CALL BRIAN'S BBS
  958.          |___|                              |___|
  959.           ___                                ___
  960.          |   | - CONVENTIONAL MAIL          |   | - CALL TO MY BBS
  961.          |___|                              |___|   (INCLUDE LOGIN INFO)
  962.           ___                                ___
  963.          |   | - FAX (INCLUDE FAX #)        |   | - FIDONET "CRASHMAIL"
  964.          |___|                              |___|
  965.  
  966.                         ___
  967. I WOULD LIKE TO ORDER: |   | - BOTH REGISTRATION KEY AND SOURCE CODE
  968.                        |___|   ($56 US, $68 CANADIAN, OR EQUIVALENT FUNDS)
  969.                         ___
  970.                        |   | - JUST MY REGISTRATION KEY
  971.                        |___|   ($28 US, $34 CANADIAN, OR EQUIVALENT FUNDS)
  972.                         ___
  973.                        |   | - UPGRADE TO SOURCE CODE (ONLY IF ALREADY
  974.                        |___|   REGISTERED) ($28 US, $34 CANADIAN OR EQUIV.)
  975.  
  976.  
  977. I AGREE TO THE REGISTRATION TERMS,             ____________________________
  978. SET FORTH ON PAGE 20 OF THE MANUAL             (SIGNATURE)
  979.  
  980. MAKE CHEQUES PAYABLE TO:   BRIAN PIRIE
  981.                            117 CEDAROCK DRIVE
  982.                            KANATA ON  K2M 2H5
  983.                            CANADA
  984. +-- OFFICIAL USE ONLY ----------------------------------------------------+
  985. |                                                                         |
  986. | S.N. : _____________  SENT : _________________________________________  |
  987. +-------------------------------------------------------------------------+
  988. ===============================================================================
  989. OpenDoors 6.00 Manual                                           End of Page 18
  990.  
  991. --------------------------------------------------------------------------
  992.                          OPENDOORS 6.00 FEEDBACK FORM
  993. --------------------------------------------------------------------------
  994.  
  995. YOUR NAME :  _______________________________
  996.  
  997.  
  998. WHICH OPENDOORS LIBRARY(S) DO YOU EXPECT TO USE:
  999.              ___
  1000.             |   | - DOS VERSION, MEMORY MODELS: _________________________
  1001.             |___|
  1002.              ___
  1003.             |   | - WINDOWS (WIN32) VERSION
  1004.             |___|
  1005.  
  1006.  
  1007. HOW DID YOU FIRST LEARN OF OPENDOORS?
  1008.  
  1009.              ____________________________________________________________
  1010.  
  1011.  
  1012. WHICH COMPILER(S) AND VERSION(S) ARE YOU USING?
  1013.  
  1014.              ____________________________________________________________
  1015.  
  1016.  
  1017. WHAT DO YOU LIKE MOST ABOUT OPENDOORS?
  1018.  
  1019.              ____________________________________________________________
  1020.  
  1021.              ____________________________________________________________
  1022.  
  1023.  
  1024. WHAT CHANGES OR ADDITIONS WOULD YOU LIKE TO SEE IN FUTURE VERSIONS?
  1025.  
  1026.              ____________________________________________________________
  1027.  
  1028.              ____________________________________________________________
  1029.  
  1030.  
  1031. DO YOU HAVE ANY ADDITIONAL COMMENTS?
  1032.  
  1033.              ____________________________________________________________
  1034.  
  1035.              ____________________________________________________________
  1036.  
  1037.              ____________________________________________________________
  1038.  
  1039.  
  1040. -----------------------------------------------------------------------------
  1041.  
  1042.  
  1043. ===============================================================================
  1044. OpenDoors 6.00 Manual                                           End of Page 19
  1045.  
  1046. TERMS OF REGISTRATION AND SOURCE CODE USE
  1047. -----------------------------------------------------------------------------
  1048.  
  1049.                When you purchase an OpenDoors registration and/or source code
  1050.                license, you are entitled to almost unlimited use of all
  1051.                versions of OpenDoors. However, in order to protect my
  1052.                investment of time and effort in developing OpenDoors, you must
  1053.                also agree to the terms outlined below when licensing OpenDoors
  1054.                and/or the source code. These terms are intended to be very
  1055.                reasonable, and are in no way intended to limit your use of
  1056.                OpenDoors. The primary intent of these terms is that you are not
  1057.                permitted to disclose your OpenDoors registration information,
  1058.                or the OpenDoors source code, to other individuals. The terms of
  1059.                registration and source code use are as follows:
  1060.  
  1061.                For the purpose of these terms, "OpenDoors" is defined to be the
  1062.                library files, header files, example programs and programmer's
  1063.                manual of all versions, past and present, for all languages and
  1064.                platforms of the OpenDoors online software programming toolkit.
  1065.                In the case of a source code license, OpenDoors also refers to
  1066.                the source code that is used to build OpenDoors. Upon licensing
  1067.                OpenDoors, the individual or organization named on the order
  1068.                form (the licensee) is entitled to use of all versions of
  1069.                OpenDoors, within the terms set forth below. Violation of these
  1070.                terms will be considered copyright infringement, and grounds for
  1071.                the termination of the registration agreement. The licensee is
  1072.                entitled, at no additional cost, to use, distribute or sell the
  1073.                executable (.EXE or .COM) files that are built from OpenDoors.
  1074.                The licensee is also entitled to use, distribute or sell the
  1075.                example programs, example configuration files and portions of
  1076.                the manual. If licensing the source code, the licensee is also
  1077.                entitled to distribute or sell any executable files that result
  1078.                from using altered versions of the source code, or portions
  1079.                thereof, provided that it is not possible for other programmers
  1080.                to access the OpenDoors API functions through this executable
  1081.                file. The licensee is NOT entitled to distribute the
  1082.                registration key number that is provided by Brian Pirie, nor any
  1083.                portions of the OpenDoors source code. For the purposes of these
  1084.                terms, an organization is considered to be a company or non-
  1085.                profit organization. If the licensee is an organization, the
  1086.                registration key and source code may be shared among members of
  1087.                the organization, under the condition that these individuals are
  1088.                using the registration and/or source code only for official
  1089.                activities of that organization. These terms in no way suggest
  1090.                an agreement on the part of Brian Pirie to develop any future
  1091.                versions of OpenDoors, or fix any bugs in current versions of
  1092.                OpenDoors. OpenDoors is offered "as is", and no warrantees are
  1093.                expressed or implied. In no event shall Brian Pirie be liable
  1094.                for any loss of profit or any other damage, including but not
  1095.                limited to special, incidental, consequential or other damages.
  1096.  
  1097.  
  1098. ===============================================================================
  1099. OpenDoors 6.00 Manual                                           End of Page 20
  1100.  
  1101.   3333
  1102.  33  33
  1103.      33
  1104.    333
  1105.      33
  1106.  33  33
  1107.   3333
  1108. -------------------------------------------------------------------------------
  1109. CHAPTER 3 - OPENDOORS TUTORIAL
  1110.  
  1111.  
  1112.  
  1113.  
  1114. ABOUT THIS MANUAL
  1115. -------------------------------------------------------------------------------
  1116.  
  1117.                The OpenDoors programmer's manual is intended to serve as a
  1118.                complete tutorial, guide and reference to writing programs with
  1119.                OpenDoors. Chapter 1 of this manual, beginning on page 5,
  1120.                provides an introduction and overview of the features of
  1121.                OpenDoors. If you are unsure of what OpenDoors will do for you,
  1122.                begin with Chapter 1. Chapter 2, beginning on page 9, provides
  1123.                important information related to this evaluation copy of
  1124.                OpenDoors, and how to register your copy. Chapter 3 serves as a
  1125.                tutorial on OpenDoors and BBS door programming in general.
  1126.                Chapter 4 provides a reference to the OpenDoors API functions
  1127.                which you can use in your programs. Chapter 5 provides a
  1128.                reference to the "OpenDoors control structure", which gives you
  1129.                access to a wide array of information, and allows you to
  1130.                customize OpenDoor's appearance and behavior. Chapter 6 provides
  1131.                information on special OpenDoors features and advanced door
  1132.                programming topics. Among the subjects discussed in chapter 6
  1133.                are the Win32 version of OpenDoors, configuration files, multi-
  1134.                node operation, RIP graphics, logfile support, defining custom
  1135.                door information file formats, and more.
  1136.  
  1137.                Chapter 7 (which begins on page 242) gives instructions on
  1138.                troubleshooting programs written with OpenDoors, lists solutions
  1139.                to common difficulties, and has information about the many
  1140.                sources for OpenDoors support. If at any time you are having
  1141.                difficulty with OpenDoors, be sure to refer to this chapter for
  1142.                complete step-by-step instruction on tracing the source of your
  1143.                problem, and for solutions to common difficulties with
  1144.                OpenDoors. This chapter also directs you to some of the major
  1145.                sources of support, including information on the OpenDoors email
  1146.                conference, the OpenDoors support BBS, and how to get in touch
  1147.                with me.
  1148.  
  1149.                You will also find many useful tools in this manual, which will
  1150.                no doubt come in useful while working with OpenDoors. Beginning
  1151.                on page 2 is a basic table of contents, showing you how the
  1152.                manual is organized, and helping you to locate general topics.
  1153. ===============================================================================
  1154. OpenDoors 6.00 Manual                                           End of Page 21
  1155.  
  1156.                At the end of the manual, beginning on page 267, is an index to
  1157.                help you locate more information on specific topics. The manual
  1158.                also includes a glossary, on page 256, which will help you in
  1159.                understanding new terms that you may come across while reading
  1160.                the manual. At the end of the manual, you will also find several
  1161.                useful sections, such as information on what is new in this
  1162.                version, information on how to contact me, and information about
  1163.                new OpenDoors features currently in the works.
  1164.  
  1165.                You will likely want to print this manual, to make reading and
  1166.                reference while programming easier. To print this manual, simply
  1167.                type the following line from your DOS prompt. If you are worried
  1168.                about the size of this manual, you might consider using a
  1169.                utility that can print multiple pages of a text file on a single
  1170.                sheet of paper. Printing two manual pages per side of paper
  1171.                should certainly be legible, and even four-up would give you
  1172.                text about the size of average newspaper text. Printing on both
  1173.                sides, you should be able to fit the manual on about 34 sheets
  1174.                of paper (269/8 < 34).
  1175.  
  1176.  
  1177.  
  1178.  
  1179. COMPILING A PROGRAM WITH OPENDOORS
  1180. -------------------------------------------------------------------------------
  1181.  
  1182.                The process of compiling a program written with OpenDoors is
  1183.                very similar to that of compiling any other program. However,
  1184.                there are two additional steps which you must be sure to
  1185.                remember:
  1186.  
  1187.                1.)  You must include the OPENDOOR.H header file.
  1188.  
  1189.                2.)  You must link your program with the appropriate OpenDoors
  1190.                     library file.
  1191.  
  1192.  
  1193.                All programs written with OpenDoors, must "include" the
  1194.                OPENDOOR.H header file. If you have placed the OPENDOOR.H header
  1195.                file in the same directory as your program's source code, place
  1196.                the following line at the beginning of your .C or .CPP file(s):
  1197.  
  1198.                     #include "opendoor.h"
  1199.  
  1200.                If you have placed the OPENDOOR.H header file in the same
  1201.                directory as other standard header files (such as stdio.h),
  1202.                place the following line at the beginning of your .C or .CPP
  1203.                file(s):
  1204.  
  1205.                     #include <opendoor.h>
  1206.  
  1207.  
  1208. ===============================================================================
  1209. OpenDoors 6.00 Manual                                           End of Page 22
  1210.  
  1211.                In addition to including the OpenDoors header file in your
  1212.                source code modules, you must also "link" the appropriate
  1213.                OpenDoors library file with your program. The procedure for
  1214.                doing this depends upon which compiler you are using. The
  1215.                following sections describe how to link with the OpenDoors
  1216.                libraries using various compilers.
  1217.  
  1218.  
  1219.  
  1220. LINKING WITH OPENDOORS USING A DOS COMPILER
  1221. -------------------------------------------------------------------------------
  1222.  
  1223.                This section describes how to link with the provided OpenDoors
  1224.                library files under a variety of DOS compilers. If you are using
  1225.                a compiler other than those described here, refer to your
  1226.                compiler's manual for information on how to link with third-
  1227.                party libraries.
  1228.  
  1229.                If you are using Borland Turbo C 2.00 or earlier, you can cause
  1230.                your compiler to link your program with the OpenDoors library by
  1231.                creating a text file with a .PRJ extension. In this text file,
  1232.                you should list the names of your program's .C modules, along
  1233.                with the name of the appropriate OpenDoors library file, as
  1234.                listed in the table at the end of this section. You should then
  1235.                select this Project file from within the Turbo C IDE prior to
  1236.                compiling your program.
  1237.  
  1238.                If you are using Turbo C++ or Borland C++, you can set your
  1239.                compiler to link your program with the OpenDoors library by
  1240.                creating a project file from within the IDE. To do this, choose
  1241.                the Open Project command from the Project menu, and enter the
  1242.                name for your new project file in the Load Project dialog box.
  1243.                Then add the names of your program's .C/.CPP modules, along with
  1244.                the name of the appropriate OpenDoors library file, by pressing
  1245.                [Insert] in the project window. When you return to Turbo C++ or
  1246.                Borland C++ again, you can work with the same project file by
  1247.                using the Open command from the Project menu.
  1248.  
  1249.                If you are using any Microsoft C compiler, such as Quick C,
  1250.                Microsoft C or Visual C++, you can set your compiler to link
  1251.                your program with the OpenDoors library by creating a makefile.
  1252.                You can create a new project file from within Quick C by using
  1253.                the Set Program List option from the Make menu. You can do this
  1254.                from within Visual C++ by using the New command from the Project
  1255.                menu. You should add the names of your program's .C/.CPP source
  1256.                files, along with the name of the appropriate OpenDoors library
  1257.                file, to the newly create makefile.
  1258.  
  1259.                There are several different DOS library files included with
  1260.                OpenDoors, each one for use with a different memory model. The
  1261.                following chart lists the library file names, along with their
  1262.                corresponding memory model. It is important that you use the
  1263. ===============================================================================
  1264. OpenDoors 6.00 Manual                                           End of Page 23
  1265.  
  1266.                library file which corresponds to the memory model you are
  1267.                using. Whenever you change your compiler to use a different
  1268.                memory model, it is important to rebuild all of your source
  1269.                files (using the "Build All" or "Rebuild All" command) in
  1270.                addition to changing the library that your program is being
  1271.                linked with. If you are unfamiliar with the concept of memory
  1272.                models, you should refer to your compiler's manuals. If you are
  1273.                unsure as to what memory model your compiler is currently using,
  1274.                check this setting in the compile options dialog box or command
  1275.                line reference information.
  1276.  
  1277.                  +------------------------------------------------+
  1278.                  | Library     | Memory                           |
  1279.                  | Filename    | Model                            |
  1280.                  |-------------|----------------------------------|
  1281.                  | ODOORS.LIB  | DOS small memory model library   |
  1282.                  |             |                                  |
  1283.                  | ODOORM.LIB  | DOS medium memory model library  |
  1284.                  |             | (Available separately)           |
  1285.                  |             |                                  |
  1286.                  | ODOORC.LIB  | DOS compact memory model library |
  1287.                  |             | (Available separately)           |
  1288.                  |             |                                  |
  1289.                  | ODOORL.LIB  | DOS large memory model library   |
  1290.                  |             |                                  |
  1291.                  | ODOORH.LIB  | DOS huge memory model library    |
  1292.                  +------------------------------------------------+
  1293.  
  1294.                To understand how to compile a program written with OpenDoors,
  1295.                it is a good idea to try compiling one of the example programs,
  1296.                such as ex_hello.c, that are included in the OpenDoors package.
  1297.  
  1298.  
  1299.  
  1300.  
  1301. LINKING WITH OPENDOORS USING A WINDOWS COMPILER
  1302. -------------------------------------------------------------------------------
  1303.  
  1304.                The Win32 version of OpenDoors resides in a DLL, ODOORS60.DLL.
  1305.                In order to use OpenDoors from a Win32 program, you will
  1306.                typically link to an import library (although it is also
  1307.                possible to use load-time dynamic linking through the use of
  1308.                LoadLibrary() and GetProcAddress()). The OpenDoors package
  1309.                includes a COFF-format import library for use Microsoft
  1310.                compilers, named ODOORW.LIB. If you are using a compiler that
  1311.                uses OMF-format object files, such as a Borland compiler, you
  1312.                will need to create your own version of the odoorw.lib import
  1313.                library, by using the implib utility provided with your
  1314.                compiler.
  1315.  
  1316.                When compiling an OpenDoors program with a Windows compiler, be
  1317.                sure that either the WIN32 or __WIN32__ constant is defined.
  1318. ===============================================================================
  1319. OpenDoors 6.00 Manual                                           End of Page 24
  1320.  
  1321.                Microsoft and Borland compilers define one of these constants by
  1322.                default. However, if you are using a compiler from another
  1323.                company, you may need to explicitly configure your compiler to
  1324.                define one of these preprocessor constants.
  1325.  
  1326.                If you are using Microsoft Visual C++ 2.0 or later, you can
  1327.                setup your compiler to link with the OpenDoors import library by
  1328.                creating a makefile (choose File|New|Project) and adding both
  1329.                your program's .C/.CPP source file(s) and the odoorw.lib import
  1330.                library to the project. When prompted for the Project type,
  1331.                choose "Application", not a "MFC AppWizard". If you are using
  1332.                Visual C++ 2.0, then you must manually edit the .mak file using
  1333.                a text editor. In this file, replace all occurrences of
  1334.                "/SUBSYSTEM:windows" with "/SUBSYSTEM:windows,4.0". This
  1335.                instructs the linker to create an executable file that is
  1336.                targeted for Windows 95. If you do not do this, some of the
  1337.                OpenDoors visual elements will not appear correctly. Later
  1338.                versions of Microsoft's compiler default to using
  1339.                "/SUBSYSTEM:windows,4.0", and so this step is no longer
  1340.                necessary with those compilers.
  1341.  
  1342.                If you are using Borland C++ 4.50 or later, you must create an
  1343.                OpenDoors import library for ODOORS60.DLL before you can compile
  1344.                your first OpenDoors program. To do this, go to the directory
  1345.                where ODOORS60.DLL is located, move the original odoorw.lib to a
  1346.                backup location, and issue the command:
  1347.  
  1348.                     IMPLIB ODOORW.LIB ODOORS60.DLL
  1349.  
  1350.                This will create a new import library (ODOORW.LIB) which you can
  1351.                then use with your compiler. To compile an OpenDoors program
  1352.                from the command line, issue the command:
  1353.  
  1354.                     BCC32 -tW your_program.c ODOORW.LIB
  1355.  
  1356.                To compile an OpenDoors program from within the IDE, create a
  1357.                new project file, and add both your program's source file(s) and
  1358.                the OpenDoors import library to that project. If you are
  1359.                compiling from within the IDE, check the TargetExpert and be
  1360.                sure that you are using the multithreaded version of the the
  1361.                runtime libraries. By default, the Borland IDE compiles single-
  1362.                threaded, which will not work with OpenDoors.
  1363.  
  1364.                Additional information on the Win32 version of OpenDoors is
  1365.                provided in chapter 6.
  1366.  
  1367.  
  1368.  
  1369.  
  1370.  
  1371.  
  1372.  
  1373. ===============================================================================
  1374. OpenDoors 6.00 Manual                                           End of Page 25
  1375.  
  1376. RUNNING A DOOR PROGRAM WRITTEN WITH OPENDOORS
  1377. -------------------------------------------------------------------------------
  1378.  
  1379.                This section provides information on how to run a BBS door
  1380.                program that has been written with OpenDoors. If you are using
  1381.                OpenDoors to write some other form of online software, the
  1382.                information provided here will apply to different degrees,
  1383.                depending on the nature of your program.
  1384.  
  1385.                OpenDoors supports both local and remote modes. In the normal
  1386.                mode of operation, remote mode, your program's output will be
  1387.                displayed to both the local screen and the remote user's screen.
  1388.                To run your program in remote mode, you will usually set it up
  1389.                to run under some BBS package. However, for testing purposes, it
  1390.                is often convenient to run your program in local mode.
  1391.  
  1392.                There are several ways to start your program in local mode. The
  1393.                first method is to place the example DORINFO1.DEF file in the
  1394.                same directory as your program. If your program uses the
  1395.                OpenDoors command line processing function, od_parse_cmd_line(),
  1396.                then you can start your program in local mode by simply
  1397.                specifying -local on your program's command line. For example,
  1398.                you can try the example program include with OpenDoors by
  1399.                issuing the command VOTEDOS -LOCAL (for the DOS version) or
  1400.                VOTEWIN -LOCAL (for the Windows 95/NT version). OpenDoors will
  1401.                also run in local mode if you set it up to run under a BBS
  1402.                package, and log into the BBS in local mode. When the BBS runs
  1403.                your door program, OpenDoors will automatically run in local
  1404.                mode.
  1405.  
  1406.                To run your program in remote mode, you will probably want to
  1407.                run it under a BBS system. If you don't have a BBS package for
  1408.                testing purposes, you might want to obtain a popular BBS package
  1409.                such as Wildcat!, Maximus (which is free) or RemoteAccess.
  1410.  
  1411.  
  1412.  
  1413. RUNNING DOS-BASED DOOR PROGRAMS
  1414. -------------------------------------------------------------------------------
  1415.  
  1416.                DOS BBS packages typically run door programs using one of two
  1417.                methods. Either the BBS package directly loads and executes the
  1418.                program, or it exits to a DOS batch file, which in turn executes
  1419.                the door program. In either case, the BBS package produces a
  1420.                door information file, common called a "drop file", which
  1421.                provides information to the door program such as the name of the
  1422.                current user. OpenDoors automatically supports the common drop
  1423.                file formats, including DORINFOx.DEF and DOOR.SYS.
  1424.  
  1425.  
  1426.  
  1427. RUNNING WINDOWS 95/NT DOOR PROGRAMS
  1428. ===============================================================================
  1429. OpenDoors 6.00 Manual                                           End of Page 26
  1430.  
  1431. -------------------------------------------------------------------------------
  1432.  
  1433.                This section provides information specific to running door
  1434.                programs that are compiled with the Win32 version of OpenDoors.
  1435.                Please feel free to include this information in your program's
  1436.                manual.
  1437.  
  1438.                Since the Win32 version of OpenDoors resides in a DLL,
  1439.                ODOORS60.DLL, this file must be present on any system where your
  1440.                program will be run. Although Windows 95/NT will find this file
  1441.                if it is located in the same directory as your program's
  1442.                executable file, it is a good idea to install this DLL into the
  1443.                Windows system directory. This way, all programs using the Win32
  1444.                version of OpenDoors can share the same copy of the DLL,
  1445.                reducing the amount of disk space that is used.
  1446.  
  1447.                The required setup for a Windows 95/NT door will depend upon
  1448.                what BBS system it is being run under. If you the program is
  1449.                being run under a native Windows 95/NT BBS system, then ideally
  1450.                that BBS system will provide the ability to pass a live serial
  1451.                port handle to the door program, on the program's command line.
  1452.                Otherwise, you should run the door from a batch file, following
  1453.                the instructions provided below for running the program under a
  1454.                DOS-based BBS system. If the BBS system is able to pass a live
  1455.                Window communications handle on the door's command line, and you
  1456.                are using the OpenDoors standard command-line processing
  1457.                function (od_parse_cmd_line()), then you can just setup the BBS
  1458.                to run the program directly, using the command line:
  1459.  
  1460.                     YourProgramName.exe -handle xxxxxxxxxx
  1461.  
  1462.                where xxxxxxxxx is the serial port handle, in decimal format.
  1463.                You do not need to use the start command, nor the DTRON utility,
  1464.                and you do not have to change the COM<n>AutoAssign setting in
  1465.                the system.ini file.
  1466.  
  1467.                If you are running the Win32 door program under a DOS-based BBS
  1468.                system, or a Windows-based BBS system that is unable to pass a
  1469.                live serial port handle to the door program, then follow these
  1470.                steps:
  1471.  
  1472.                1.Add a line of the form "COM<n>AutoAssign=<x>" to the [386Enh]
  1473.                  section of your system.ini file. Here, <n> specifies the
  1474.                  serial port number that the BBS's modem is connected to, and
  1475.                  <x> will usually be 0. For example, if your modem is
  1476.                  connected to COM1, you would add a line such as
  1477.                  "COM1AutoAssign=0" (sans quotes). You will then have to re-
  1478.                  start your computer for this change to take effect. If you do
  1479.                  not do this, the Windows-based door program will not be able
  1480.                  to access the modem.
  1481.  
  1482.  
  1483. ===============================================================================
  1484. OpenDoors 6.00 Manual                                           End of Page 27
  1485.  
  1486.                2.Setup the BBS software to run the Windows-based door program
  1487.                  just as you would any other door program. You will probably
  1488.                  want to do this from a batch file. The command line that runs
  1489.                  the Windows program should be of the form:
  1490.  
  1491.                     start /w /m YourProgramName.exe [any command line
  1492.                  parameters]
  1493.  
  1494.                  This will cause the Windows-based door program to start in
  1495.                  minimized mode, and cause the calling MS-DOS session to wait
  1496.                  until the Windows program exits before continuing. If you do
  1497.                  not wish the program to be started in minimized mode, remove
  1498.                  the /m from the command line. If you attempt to start the
  1499.                  door program by calling it directly, rather than using the
  1500.                  "start /w" command, the BBS software will immediately start
  1501.                  again, cause it to attempt to run simultaneously with the
  1502.                  door program.
  1503.  
  1504.                3.After running the start command, use DTRON.EXE or a similar
  1505.                  utility to re-enable DTR detection by the modem. Normally,
  1506.                  this command line will be of the form:
  1507.  
  1508.                     dtron /port x /bps y
  1509.  
  1510.                  Where x is the serial port number (0 for COM1, 1 for COM2,
  1511.                  etc.) and y is the locked bps rate. For example, if your
  1512.                  serial port is locked at 38400 bps and is connected to COM2,
  1513.                  you would use:
  1514.  
  1515.                     dtron /port 1 /bps 38400
  1516.  
  1517.                  For full information on the DTRON utility, simply type the
  1518.                  command line:
  1519.  
  1520.                     dtron /help
  1521.  
  1522.                  You may freely redistribute the DTRON utility that is
  1523.                  included in this package with your program.
  1524.  
  1525.                Additional information on the Win32 version of OpenDoors, and
  1526.                further explanation of some of these steps, is provided in
  1527.                chapter 6.
  1528.  
  1529.  
  1530.  
  1531.  
  1532.  
  1533.  
  1534.  
  1535.  
  1536.  
  1537.  
  1538. ===============================================================================
  1539. OpenDoors 6.00 Manual                                           End of Page 28
  1540.  
  1541. BASICS OF DOOR PROGRAMMING WITH OPENDOORS
  1542. -------------------------------------------------------------------------------
  1543.  
  1544.                This section provides a complete tutorial to the basics of
  1545.                writing BBS door programs using OpenDoors. If you are using
  1546.                OpenDoors to write other online software, much of this
  1547.                information will still be relevant.
  1548.  
  1549.                In addition to reading this section, I would encourage you to
  1550.                look at the example programs included int the OpenDoors
  1551.                packages. These programs, which are described beginning on page
  1552.                38, will give you a much better idea of what an OpenDoors
  1553.                program will look like. These programs can also serve as a great
  1554.                starting point for writing your own programs using OpenDoors.
  1555.  
  1556.                Probably the best means of introduction to door programming with
  1557.                OpenDoors is by doing it yourself. As such, I strongly encourage
  1558.                you to try compiling and running the simple introduction program
  1559.                below. For instructions on compiling programs written with
  1560.                OpenDoors, see page 22.
  1561.  
  1562.                DOS version:
  1563.  
  1564.                     #include "opendoor.h"
  1565.  
  1566.                     main()
  1567.                     {
  1568.                        od_printf("Welcome to my first door program!\n\r");
  1569.                        od_printf("Press a key to return to BBS!\n\r");
  1570.                        od_get_key(TRUE);
  1571.                        od_exit(0, FALSE);
  1572.                     }
  1573.  
  1574.                Win32 version:
  1575.  
  1576.                     #include "opendoor.h"
  1577.  
  1578.                     int WINAPI WinMain(HINSTANCE hInstance,
  1579.                        HINSTANCE hPrevInstance,LPSTR lpszCmdLine,int nCmdShow)
  1580.                     {
  1581.                        od_printf("Welcome to my first door program!\n\r");
  1582.                        od_printf("Press a key to return to BBS!\n\r");
  1583.                        od_get_key(TRUE);
  1584.                        od_exit(0, FALSE);
  1585.                     }
  1586.  
  1587.                Keep in mind that even this simple program will automatically
  1588.                have all of the door capabilities we have already mentioned.
  1589.                Notice the line that reads #include "opendoor.h". All programs
  1590.                written with OpenDoors must include the OPENDOOR.H header file
  1591.                in order to compile correctly. The first two lines in the
  1592.                main/WinMain function simply call the OpenDoors od_printf()
  1593. ===============================================================================
  1594. OpenDoors 6.00 Manual                                           End of Page 29
  1595.  
  1596.                function. od_printf() is similar to the printf() function that C
  1597.                programmers will already be familiar with. However, unlike
  1598.                printf(), the od_printf() function sends the output to both the
  1599.                modem and the local screen. Notice that the lines of text
  1600.                displayed by the od_printf() function end with a "\n\r"
  1601.                sequence, instead of the normal "\n". This is because the
  1602.                terminal emulation software that is running on the remote user's
  1603.                system usually requires both a carriage return and a line feed
  1604.                to correctly begin a new line. The next line in our example
  1605.                program is the OpenDoors single-key input function,
  1606.                od_get_key(). The TRUE value causes OpenDoors to wait for a key
  1607.                to be pressed (again, either from remote or local keyboard)
  1608.                before returning. The last line of the main/WinMain function is
  1609.                a call to od_exit(). Any program using OpenDoors should call
  1610.                this function. For the time being, you can always use the (0,
  1611.                FALSE) parameters.
  1612.  
  1613.                Once again, you are encouraged to try compiling and running this
  1614.                program, as described above. Congratulations, you have written
  1615.                your first door program! Feel free to make any changes to this
  1616.                program, and see what effects your changes have.
  1617.  
  1618.                To simplify this example, separate versions of this program are
  1619.                shown for the DOS and Win32 versions of OpenDoors. However, you
  1620.                would typically write your program so that it could be compiled
  1621.                using either the DOS or Win32 versions of OpenDoors, by
  1622.                beginning the mainline function as follows:
  1623.  
  1624.                     #ifdef ODPLAT_WIN32
  1625.                     int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE
  1626.                     hPrevInstance,
  1627.                        LPSTR lpszCmdLine, int nCmdShow)
  1628.                     #else
  1629.                     int main(int argc, char *argv[])
  1630.                     #endif
  1631.  
  1632.                In case you are not entirely familiar with the operation of door
  1633.                programs, we will now provide an introduction to the internals
  1634.                of a door's operation. Keep in mind that OpenDoors automatically
  1635.                carries out most of these tasks for you. When any door program
  1636.                starts up, one of the first things it must do is to read the
  1637.                door information file(s) (sometimes called a "drop file") passed
  1638.                to it by the BBS. When a user is on-line, and wishes to run a
  1639.                door, they will most likely select a command from a menu. At
  1640.                this point, the BBS system (such as RemoteAccess, Maximus, PC-
  1641.                Board or whatever), will create a file of information about the
  1642.                system, who is currently on-line, and so on. Various BBS
  1643.                packages produce various styles of door information files.
  1644.                OpenDoors automatically recognizes and reads a wide variety of
  1645.                door information file formats. As a result, your doors will be
  1646.                able to run on a almost any BBS system.
  1647.  
  1648. ===============================================================================
  1649. OpenDoors 6.00 Manual                                           End of Page 30
  1650.  
  1651.                Fortunately, OpenDoors takes care of all the work involved in
  1652.                detecting and reading the door information file, and then
  1653.                initializing and communicating with the serial port for you. In
  1654.                order to carry out these tasks, along with setting up the status
  1655.                line, and so on, OpenDoors provides a function called od_init().
  1656.                If you do not explicitly call this function, the first call to
  1657.                any other OpenDoors function (such as the first time your door
  1658.                program outputs anything) will automatically cause the od_init()
  1659.                function to be called. As a result, upon the first call to an
  1660.                OpenDoors function, all of the initialization tasks for the door
  1661.                will automatically be carried out. However, there may be times
  1662.                when you will want your program to have access information about
  1663.                the user who is on-line, or carry out other actions which
  1664.                require od_init() to have been executed - prior to the point
  1665.                where you call any other OpenDoors functions. In this case, you
  1666.                will have to call od_init() yourself before you do any of these
  1667.                things.
  1668.  
  1669.                OpenDoors provides you with a C/C++ structure, by the name of
  1670.                od_control, which allows you to access all the available
  1671.                information about the user who is on-line, the system your door
  1672.                is running on, and also allows you to adjust various OpenDoors
  1673.                parameters. Depending on what BBS system your door is running
  1674.                under, the actual information available from the od_control
  1675.                structure will vary. For more information on the od_control
  1676.                structure, see the section on the control structure, beginning
  1677.                on page 148.
  1678.  
  1679.                Once the door has initialized itself, it will then begin
  1680.                communications with the user who is online. OpenDoors takes care
  1681.                of all communications, through its various input and display
  1682.                functions. When the door has finished, it will then write any
  1683.                information that has changed back to the door information file
  1684.                (if applicable), finish communicating with the modem, and return
  1685.                to the BBS. In OpenDoors, these shut-down operations are
  1686.                automatically performed you call the od_exit() function. This
  1687.                function will terminate the door's activity, OPTIONALLY hang up
  1688.                on the user (allowing you to provide either return to BBS or
  1689.                logoff options for exiting), and then exit with the specified
  1690.                errorlevel.
  1691.  
  1692.                One other important OpenDoors function that you should be aware
  1693.                of is the od_kernel() function. od_kernel() is the central
  1694.                OpenDoors control function, and is responsible for much of
  1695.                OpenDoor's updating of the status line, monitoring the carrier
  1696.                detect and user timeout status, responding to sysop function
  1697.                keys, and so on. The od_kernel() function is called
  1698.                automatically by OpenDoors, within the other OpenDoors
  1699.                functions. As a result, since most door programs will call some
  1700.                OpenDoors function on a regular basis, you will most often have
  1701.                no need to call the od_kernel() function yourself. However, if
  1702.                your door is going to perform some action, such as updating data
  1703. ===============================================================================
  1704. OpenDoors 6.00 Manual                                           End of Page 31
  1705.  
  1706.                files, during which it will not call any OpenDoors function for
  1707.                more than a few seconds, you should then call the od_kernel()
  1708.                function yourself. For more information on the od_kernel()
  1709.                function, see page 97.
  1710.  
  1711.                For more information on the functions available from OpenDoors,
  1712.                or the control structure, see the corresponding sections in this
  1713.                manual.
  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. OpenDoors 6.00 Manual                                           End of Page 32
  1760.  
  1761. TOUR OF A SAMPLE DOOR PROGRAM: "EX_VOTE"
  1762. ------------------------------------------------------------------------------
  1763.  
  1764.                One of the best ways to see how OpenDoors works, and the
  1765.                potential that it has, is to look at the example programs
  1766.                included in the OpenDoors package. A brief description of each
  1767.                of these programs can be found on page 38. This section takes a
  1768.                closer look at one of the example programs, EX_VOTE.C. Unlike
  1769.                our simple example in the previous section, EX_VOTE.C is a much
  1770.                more complicated program, taking advantage of many of the
  1771.                advanced features of OpenDoors. Even if you do not understand
  1772.                everything that EX_VOTE.C does, you should be able to make use
  1773.                of various elements demonstrated here, in your own programs.
  1774.  
  1775.                The OpenDoors package includes a two compiled versions of
  1776.                EX_VOTE. VOTEDOS.EXE is a plain-DOS program which can run under
  1777.                DOS, Windows or OS/2. VOTEWIN.EXE was compiled using the Win32
  1778.                version of OpenDoors, and so it runs only on Windows 95/NT. The
  1779.                OpenDoors package also contains a sample door information file,
  1780.                DORINFO1.DEF. You can use this file to test any doors in local
  1781.                mode. If you wish to manually create your own DORINFO1.DEF file,
  1782.                you can do so very easily. The DORINFO1.DEF door information
  1783.                file is a simple text file which lists a different piece of
  1784.                information on each line, in the following format:
  1785.  
  1786.                +----------------------------------------------------------+
  1787.                | LINE NUMBER | DESCRIPTION            | EXAMPLE           |
  1788.                +-------------+------------------------+-------------------|
  1789.                |     1       | Name of the BBS        | MY OWN BBS        |
  1790.                |     2       | Sysop's first name     | BRIAN             |
  1791.                |     3       | Sysop's last name      | PIRIE             |
  1792.                |     4       | Com Port modem is on   | COM0              |
  1793.                |     5       | Baud rate, etc.        | 0 BAUD,N,8,1      |
  1794.                |     6       | Unused                 | 0                 |
  1795.                |     7       | User's first name      | JOHN              |
  1796.                |     8       | User's last name       | PUBLIC            |
  1797.                |     9       | Caller's location      | OTTAWA, ON        |
  1798.                |     10      | ANSI mode (0=off, 1=on)| 1                 |
  1799.                |     11      | User's security level  | 32000             |
  1800.                |     12      | User's time left       | 60                |
  1801.                +----------------------------------------------------------+
  1802.  
  1803.  
  1804.                Feel free to make any changes you wish to EX_VOTE.C, and
  1805.                recompile it. One of the most effective and enjoyable ways to
  1806.                learn OpenDoors is by experimenting. If you are a registered
  1807.                owner of OpenDoors, you may even distribute your own versions of
  1808.                this door. Also, you may find that EX_VOTE.C serves as a good
  1809.                framework for building your own door programs.
  1810.  
  1811.                The EX_VOTE.C door behaves similarly to most other door
  1812.                programs, and will have a fair bit in common with any other door
  1813. ===============================================================================
  1814. OpenDoors 6.00 Manual                                           End of Page 33
  1815.  
  1816.                you write in OpenDoors. What you see in the output window is
  1817.                identical to what a remote user will be seeing. If the user has
  1818.                ANSI, AVATAR or RIP mode turned on, you will see the same colors
  1819.                as they do, and if they have screen clearing turned on, your
  1820.                screen will be cleared when theirs is. The status line at the
  1821.                bottom of the window will list the name of the user currently
  1822.                on-line (if you are using the sample DORINFO1.DEF file, the
  1823.                user's name will be "The Sysop"), the user's location, and the
  1824.                user's baud rate (0 if the door is operating in local mode). The
  1825.                local display also shows how much time the user has left,
  1826.                whether the user has paged the system operator for a chat, and
  1827.                other information.
  1828.  
  1829.                There are a number of special commands that are only available
  1830.                to the system operator on the local keyboard. These commands
  1831.                allow the system operator to hang up on the user, adjust the
  1832.                amount of time the user may remain online, enter chat mode with
  1833.                the user, enter a DOS shell (in the DOS version), and so on. In
  1834.                the DOS version, help on these commands is available on the
  1835.                status line by pressing the [F9] key. In the Windows version,
  1836.                these commands are listed on the menu that appears at the top of
  1837.                the window.
  1838.  
  1839.                Now, let us take a closer look at the actual source code for the
  1840.                EX_VOTE.C door. If you have not already printed out a copy of
  1841.                this manual, and possibly the EX_VOTE.C file as well, it would
  1842.                probably be a good idea to do so now.
  1843.  
  1844.                Notice that near the top of the program, along with all the
  1845.                standard header files, the OPENDOOR.H file is included. This
  1846.                file must be included in all programs written under OpenDoors.
  1847.                If you are placing the OPENDOOR.H file in the same directory as
  1848.                the door you are compiling, simply include the line:
  1849.  
  1850.                                     #include "opendoor.h"
  1851.  
  1852.                in your program.
  1853.  
  1854.                The main()/WinMain() function of the EX_VOTE.C program has a
  1855.                for(;;) loop that repeatedly displays the main menu, obtains a
  1856.                choice from the user and responds to the command, until the user
  1857.                chooses to exit the program. Before the main menu is displayed,
  1858.                the screen is cleared by calling od_clr_scr(). The od_clr_scr()
  1859.                function will clear both the local and remote screens, but only
  1860.                if the user has screen clearing enabled. Refer to page 57 for
  1861.                information on how to force the screen to be cleared, regardless
  1862.                of the user's screen clearing setting. The main menu is
  1863.                displayed using the od_printf() function, one of the most common
  1864.                OpenDoors functions you will use. Next, od_get_answer() is used
  1865.                to obtain a menu choice from the user from the specified set of
  1866.                keys. Next, a switch() statement is used to respond to the
  1867.                user's command appropriately. If the user presses the P key to
  1868. ===============================================================================
  1869. OpenDoors 6.00 Manual                                           End of Page 34
  1870.  
  1871.                page the system operator, od_page() is called. If the user
  1872.                chooses to return to the BBS, od_exit() is called to terminate
  1873.                OpenDoor's activities and return control to the BBS. The FALSE
  1874.                parameter passed to od_exit() indicates that OpenDoors should
  1875.                not disconnect (hangup) before exiting. If the user chooses to
  1876.                log off, EX_VOTE.C first confirms this action with the user, and
  1877.                then calls od_exit() with the TRUE parameter. The numerical
  1878.                parameter passed to od_exit() sets the errorlevel that OpenDoors
  1879.                will exit with.
  1880.  
  1881.                In its ChooseQuestion() function, EX_VOTE.C uses the OpenDoors
  1882.                function od_get_key(). This function is similar to the
  1883.                od_get_answer() function that we have already seen. However,
  1884.                unlike od_get_answer() which will wait until the user presses
  1885.                some key from the list of possibilities you provide,
  1886.                od_get_key() will allow the user to press any key. od_get_key()
  1887.                accepts a single parameter. If this parameter is TRUE,
  1888.                od_get_key() will wait for the user to press a key before
  1889.                returning. If this parameter is FALSE, od_get_key() will return
  1890.                immediately with a value of 0 if there are no keys waiting in
  1891.                the inbound buffer, and returning the next key if there are
  1892.                characters waiting.
  1893.  
  1894.                In a number of places, EX_VOTE.C also uses the od_input_str()
  1895.                function. Unlike od_get_key() and od_get_answer() which return a
  1896.                single character, od_input_str() allows the user to input and
  1897.                edit a string of many characters. You will only receive the
  1898.                string entered by the user after they press the enter key.
  1899.                od_input_str() accepts four parameters: the string where the
  1900.                user's input should be stored, the maximum number of characters
  1901.                to input, the minimum character value to accept and the maximum
  1902.                character value to accept.
  1903.  
  1904.                Another new feature of OpenDoors that is used by EX_VOTE.C is
  1905.                the OpenDoors control structure, od_control. This global
  1906.                structure is documented in chapter 5 of this manual. The
  1907.                OpenDoors control structure allows you to access a wide variety
  1908.                of information about the user who is currently online, the BBS
  1909.                system your program is running on, and also allows you to
  1910.                control various OpenDoors settings. For example, EX_VOTE.C
  1911.                compares the current user name (od_control.od_user_name) with
  1912.                the name of the system operator (od_control.od_sysop_name) to
  1913.                determine whether it is the system operator who using the
  1914.                program.
  1915.  
  1916.                EX_VOTE.C uses two data files, the first of which contains a
  1917.                record for every user, and the second of which contains a record
  1918.                for every question. EX_VOTE.C accesses these data files in a
  1919.                controlled manner in order to permit the program to be running
  1920.                simultaneously on multiple lines on a multi-node BBS system.
  1921.                When EX_VOTE.C needs to update a data file, it opens it for
  1922.                exclusive access, so that only one node can access the file at
  1923. ===============================================================================
  1924. OpenDoors 6.00 Manual                                           End of Page 35
  1925.  
  1926.                any given time. Since the data file could have been changed by
  1927.                another node since the time that EX_VOTE.C last read the file,
  1928.                it always reads a record, makes changes to it and then re-writes
  1929.                the record while it has the file open for exclusive access. It
  1930.                then closes the file as soon as possible after opening the file,
  1931.                in order to permit other nodes to once again access the file.
  1932.                Because EX_VOTE.C keeps track of which questions each user has
  1933.                voted on, along with the questions and results of voting on each
  1934.                question, its data file format is more complex than many door
  1935.                programs (although not as complex as others).
  1936.  
  1937.                EX_VOTE.C also uses color. One of the easiest ways to use
  1938.                different colors in an OpenDoors program is to use the
  1939.                OpenDoor's print color-setting extensions. You can change the
  1940.                color of text display at any point in an od_printf() format
  1941.                string using by enclosing the name of new display color in back
  1942.                quote characters (`, not '). For example:
  1943.  
  1944.                     od_printf("`red`This is in red `green`This is green\n\r");
  1945.  
  1946.                Would cause the words "This is in red" to be displayed in red,
  1947.                and the words "This is in green" to be displayed in green.
  1948.  
  1949.                EX_VOTE.C also takes advantage of a number of OpenDoors
  1950.                capabilities that you can optionally choose to include in your
  1951.                door programs. You will notice that there are a number of new
  1952.                lines at the beginning of the main() function, all of which
  1953.                change settings in the OpenDoors control structure. The line:
  1954.  
  1955.                     od_control.od_config_file = INCLUDE_CONFIG_FILE;
  1956.  
  1957.                causes the OpenDoors configuration file system to be included in
  1958.                your program. Using this system, OpenDoors automatically reads a
  1959.                configuration file that can be used by the system operator to
  1960.                change various program settings. Refer to the included door.cfg
  1961.                file for an example OpenDoors configuration file. In addition to
  1962.                the configuration file settings automatically supported by the
  1963.                configuration file system, you can also add your own
  1964.                configuration file settings. To do this, you simply supply
  1965.                OpenDoors with a callback function that it will call whenever it
  1966.                encounters an unrecognized keyword in the configuration file.
  1967.                The line:
  1968.  
  1969.                     od_control.od_config_function = CustomConfigFunction;
  1970.  
  1971.                Causes OpenDoors to call the function CustomConfigFunction() in
  1972.                EX_VOTE.C for this purpose. You will notice that the
  1973.                CustomConfigFunction() receives two parameters - the first is
  1974.                the unrecognized keyword, and the second is any parameters that
  1975.                follow the keyword in the configuration file. EX_VOTE.C checks
  1976.                for two special configuration file lines - one to set whether or
  1977.  
  1978. ===============================================================================
  1979. OpenDoors 6.00 Manual                                           End of Page 36
  1980.  
  1981.                not users can add questions, and one to set whether or not users
  1982.                can view the results of a question before voting on it.
  1983.  
  1984.                The next line in the main() function,
  1985.  
  1986.                     od_control.od_mps = INCLUDE_MPS;
  1987.  
  1988.                causes the OpenDoors "Multiple Personality System" to be
  1989.                included in program. This allows the sysop to choose from a
  1990.                number of status line / sysop function key "personalities" that
  1991.                mimic a number of different BBS systems, using the Personality
  1992.                setting in the configuration file.
  1993.  
  1994.  
  1995.                The line:
  1996.  
  1997.                     od_control.od_logfile = INCLUDE_LOGFILE;
  1998.  
  1999.                causes the OpenDoors log file system to be included in the
  2000.                program. The OpenDoors log file system automatically records the
  2001.                date and time of program startup, exit and other major actions
  2002.                in the specified file. EX_VOTE.C also writes its own log file
  2003.                entries by calling the od_log_write() function.
  2004.  
  2005.                EX_VOTE.C also provides the ability for the sysop to provide
  2006.                their own ASCII/ANSI/AVATAR/RIP files to be displayed in place
  2007.                of the normal main menu. EX_VOTE.C uses the od_hotkey_menu()
  2008.                function to display a VOTE.ASC/.ANS/.AVT/.RIP file for the main
  2009.                menu, if such a file exists. If the file is not available, the
  2010.                normal EX_VOTE.C menu is used instead. The od_hotkey_menu()
  2011.                function will automatically select the appropriate file
  2012.                (.ASC/.ANS/.AVT/.RIP) for the current display mode, and the user
  2013.                is able to make a menu choice at any time. If a menu choice is
  2014.                made before the menu is entirely displayed, the function will
  2015.                stop displaying the menu and return immediately.
  2016.  
  2017.  
  2018.  
  2019.  
  2020.  
  2021.  
  2022.  
  2023.  
  2024.  
  2025.  
  2026.  
  2027.  
  2028.  
  2029.  
  2030.  
  2031.  
  2032.  
  2033. ===============================================================================
  2034. OpenDoors 6.00 Manual                                           End of Page 37
  2035.  
  2036. OTHER EXAMPLE PROGRAMS INCLUDED WITH OPENDOORS
  2037. ------------------------------------------------------------------------------
  2038.  
  2039.                In addition to the EX_VOTE.C program, which is discussed in
  2040.                detail in the previous section, a number of other example
  2041.                programs are included with OpenDoors. These programs help to
  2042.                demonstrate what is possible with OpenDoors. They can also serve
  2043.                as excellent tools to help you learn OpenDoors. In addition, you
  2044.                are free to include any portions of any of these example
  2045.                programs in your own programs. Below is a summary of each of
  2046.                these example programs:
  2047.  
  2048.  
  2049. -------------------------------------------------------------------------------
  2050. EX_HELLO.C     This an example of a very simple door program that displays a
  2051.                short message and prompts for the user to press a key. After the
  2052.                user presses a key, the door exits and control is returned to
  2053.                the main BBS software. Despite the fact that it only consists of
  2054.                a few lines of code, EX_HELLO remains a fully functional door
  2055.                program. For information on compiling an OpenDoors door program,
  2056.                see the section that begins on page 22.
  2057.  
  2058.  
  2059. -------------------------------------------------------------------------------
  2060. EX_CHAT.C      This program is an example of a multi-window full-screen chat
  2061.                door written with OpenDoors. EX_CHAT demonstrates the ease of
  2062.                using sophisticated ANSI / AVATAR / RIP terminal features within
  2063.                OpenDoors programs. For instructions on how to compile this
  2064.                program, see the section that begins on page 22.
  2065.  
  2066.                This program create two windows on the screen, separated by a
  2067.                bar with user name / sysop name information. This program
  2068.                permits communication between the local sysop and remote user by
  2069.                displaying the text typed by the user in one window, and the
  2070.                text typed by the sysop in the other window. When either
  2071.                person's typing reaches the bottom of the window, the contents
  2072.                of the window is scrolled up to provide more room for typing.
  2073.                Words are also wrapped when either typist reaches the end of a
  2074.                line. The advantage of a split-screen chat program is that it
  2075.                permits both sysop and user to type at the same time without
  2076.                difficulty. The chat function automatically invokes OpenDoor's
  2077.                internal chat mode if ANSI, AVATAR or RIP modes are not
  2078.                available. The display colors, window sizes and locations, and
  2079.                distance to scroll a window's contents are configurable by
  2080.                setting the appropriate variables, below. When the Sysop invokes
  2081.                a DOS shell, a pop-up window is displayed to indicate to the
  2082.                user that the door program has been suspended.
  2083.  
  2084.                The chat feature of this program can also be easily integrated
  2085.                into other doors you write, and may be used to replace the
  2086.                existing OpenDoors line-oriented chat system.
  2087.  
  2088. ===============================================================================
  2089. OpenDoors 6.00 Manual                                           End of Page 38
  2090.  
  2091.  
  2092. -------------------------------------------------------------------------------
  2093. EX_MUSIC.C     This example door demonstrates how to play "ANSI" music and
  2094.                sound effects in an OpenDoors door. Included in this program is
  2095.                a function to send "ANSI" music to the remote system, and a
  2096.                function to text the remote system's ability to play "ANSI"
  2097.                music. You may use both of these functions in your own doors, if
  2098.                you wish to add music or sound effect capabilities. This program
  2099.                can be compiled by following the instructions that begin on page
  2100.                22.
  2101.  
  2102.  
  2103. -------------------------------------------------------------------------------
  2104. EX_SKI.C       This is a simple but addictive online game that is written using
  2105.                OpenDoors. In this action game, the player must control a skier
  2106.                through a downhill slalom course. The user may turn the skier
  2107.                left or right, and the game ends as soon as the player skis
  2108.                outside the marked course. The game begins at an easy level, but
  2109.                quickly becomes more and more difficult as the course to be
  2110.                navigated becomes more and more narrow. The game maintains a
  2111.                list of players with high scores, and this list may be viewed
  2112.                from the main menu.
  2113.  
  2114.  
  2115. -------------------------------------------------------------------------------
  2116. EX_VOTE.C      The EX_VOTE.C file contain the source code for the Vote example
  2117.                door, as is described beginning on page 38. The Vote example
  2118.                door allows users to vote on up to 200 different "polls", view
  2119.                the results of voting on each question, and optionally add their
  2120.                own questions for other users to answer.
  2121.  
  2122.  
  2123.  
  2124.  
  2125.  
  2126.  
  2127.  
  2128.  
  2129.  
  2130.  
  2131.  
  2132.  
  2133.  
  2134.  
  2135.  
  2136.  
  2137.  
  2138.  
  2139.  
  2140.  
  2141.  
  2142.  
  2143. ===============================================================================
  2144. OpenDoors 6.00 Manual                                           End of Page 39
  2145.  
  2146.     444
  2147.    4444
  2148.   44 44
  2149.  44444444
  2150.      44
  2151.      44
  2152.      44
  2153. -------------------------------------------------------------------------------
  2154. CHAPTER 4 - THE OPENDOORS API FUNCTIONS
  2155.  
  2156.  
  2157.  
  2158.  
  2159. OVERVIEW
  2160. ------------------------------------------------------------------------------
  2161.  
  2162.                OpenDoors provides a wide set of features that you can take
  2163.                advantage of in your program. You control these features and
  2164.                access OpenDoors from your program using two facilities - the
  2165.                OpenDoors API functions, and the OpenDoors control structure. In
  2166.                general, the API functions are used to actually accomplish a
  2167.                task, such as displaying something to the user, or retrieving
  2168.                input from the user. The OpenDoors control structure, on the
  2169.                other hand, is used to alter OpenDoors settings or retrieve
  2170.                specific information.
  2171.  
  2172.                Any program written with OpenDoors makes use of the OpenDoors
  2173.                API functions for all of its door-related input and output. In
  2174.                addition to the common input and output tasks, the OpenDoors API
  2175.                functions provide access to many special capabilities, such as
  2176.                displaying ASCII/ANSI/AVATAR/RIP files, providing pop-up windows
  2177.                and menus, and much more. Much of the information about the user
  2178.                who is online, information about the system your door is running
  2179.                on, and settings which customize OpenDoor's behavior are
  2180.                controlled through the OpenDoors control structure. The control
  2181.                structure is described in the section beginning on page 148.
  2182.  
  2183.                This chapter is divided into the following sections:
  2184.  
  2185.                     i.)   TABLE OF MOST COMMONLY USED FUNCTIONS (Page 41)
  2186.                    ii.)  TABLE OF ALL OPENDOORS FUNCTIONS (Page 42)
  2187.                   iii.) DETAILED INFORMATION ON EACH FUNCTION (Pages 47 - 147)
  2188.  
  2189.                The two tables list the names of the OpenDoors functions, along
  2190.                with a brief description of the task performed by each function,
  2191.                and the page number on which the detailed description of that
  2192.                function can be found. The first table lists only the most
  2193.                commonly used OpenDoors functions, to allow you to quickly find
  2194.                the function you are most likely looking for. The second table
  2195.                lists all of the OpenDoors functions, grouped according to
  2196.                general categories of functionality.
  2197.  
  2198. ===============================================================================
  2199. OpenDoors 6.00 Manual                                           End of Page 40
  2200.  
  2201.                The section containing detailed information lists all of the
  2202.                functions in alphabetical order, with the information about each
  2203.                function beginning on a new page. This section includes a brief
  2204.                description of each function's purpose, a detailed description
  2205.                of how to use the function, the function call format, a list of
  2206.                related functions, and in many cases example source code showing
  2207.                you a typical use of the function.
  2208.  
  2209.  
  2210.  
  2211.  
  2212. TABLE OF MOST COMMONLY USED FUNCTIONS
  2213. ------------------------------------------------------------------------------
  2214.  
  2215.                od_printf()         Displays text, with the ability to change
  2216.                                    display color. (page 110)
  2217.  
  2218.                od_clr_scr()        Clears the screen. (Page 57)
  2219.  
  2220.                od_input_str()      Inputs a string of one or more characters
  2221.                                    from the user. (Page 95)
  2222.  
  2223.                od_get_answer()     Inputs a single key from a list of possible
  2224.                                    choices ignoring upper/lower case. (Page 81)
  2225.  
  2226.                od_get_key()        Inputs any single key from the user.
  2227.                                    (Page 82)
  2228.  
  2229.                od_set_cursor()     Positions the cursor in ANSI/AVATAR/RIP
  2230.                                    modes. (Page 134)
  2231.  
  2232.                od_hotkey_menu()    Displays an ASCII/ANSI/AVATAR/RIP file, with
  2233.                                    the option of watching for a keypress from
  2234.                                    the user. (Page 90)
  2235.  
  2236.                od_popup_menu()     Displays a popup menu in ANSI/AVATAR/RIP
  2237.                                    modes. (Page 105)
  2238.  
  2239.                od_window_create()  Creates a popup window in ANSI/AVATAR/RIP
  2240.                                    modes. (Page 145)
  2241.  
  2242.                od_window_remove()  Removes a popup window in, restoring screen
  2243.                                    contents "underneath" window. (Page 147)
  2244.  
  2245.  
  2246.  
  2247.  
  2248.  
  2249.  
  2250.  
  2251.  
  2252.  
  2253. ===============================================================================
  2254. OpenDoors 6.00 Manual                                           End of Page 41
  2255.  
  2256. TABLE OF ALL FUNCTIONS
  2257. -------------------------------------------------------------------------------
  2258. OUTPUT         TEXT DISPLAY FUNCTIONS
  2259. FUNCTIONS      ----------------------
  2260.                od_disp_str()            Displays a normal, NULL-terminated
  2261.                                         string. (page 63)
  2262.  
  2263.                od_disp()                Sends the specified number of
  2264.                                         characters to the modem, with or
  2265.                                         without local echo. (page 60)
  2266.  
  2267.                od_printf()              Performs formatted output, as the
  2268.                                         printf() function does. Also allows
  2269.                                         imbedded codes to change display color.
  2270.                                         (page 110)
  2271.  
  2272.                od_putch()               Displays a single character. (page 115)
  2273.  
  2274.                od_disp_emu()            Displays a string, interpreting
  2275.                                         imbedded ANSI/AVATAR terminal emulation
  2276.                                         codes. (page 62)
  2277.  
  2278.                od_repeat()              Displays the same character any number
  2279.                                         of times, using AVATAR optimization, if
  2280.                                         possible. (page 118)
  2281.  
  2282.                COLOR AND CURSOR CONTROL
  2283.                ------------------------
  2284.                od_set_color()           Sets current color to specified
  2285.                                         foreground and background settings.
  2286.                                         (page 131)
  2287.  
  2288.                od_set_attrib()          Sets current color to specified IBM-PC
  2289.                                         display attribute. (page 128)
  2290.  
  2291.                od_set_cursor()          Sets the position of the cursor, if
  2292.                                         ANSI/AVATAR/RIP mode is enabled. (page
  2293.                                         134)
  2294.  
  2295.                SCREEN MANIPULATION
  2296.                -------------------
  2297.                od_clr_scr()             Clears the screen, if user has screen
  2298.                                         clearing enabled. (page 57)
  2299.  
  2300.                od_save_screen()         Stores the current contents of the
  2301.                                         screen, to be later redisplayed using
  2302.                                         od_restore_screen(). Works in all
  2303.                                         display modes. (page 121)
  2304.  
  2305.                od_restore_screen()      Restores the contents of the screen, as
  2306.                                         previously stored using
  2307.  
  2308. ===============================================================================
  2309. OpenDoors 6.00 Manual                                           End of Page 42
  2310.  
  2311.                                         od_save_screen(). Works in all display
  2312.                                         modes. (page 120)
  2313.  
  2314.                BLOCK MANIPULATION
  2315.                ------------------
  2316.                od_clr_line()            Clears the remainder of current line.
  2317.                                         (page 55)
  2318.  
  2319.                od_gettext()             Stores any area of the screen, to later
  2320.                                         be displayed by od_puttext(). Requires
  2321.                                         ANSI/AVATAR/RIP graphics mode. (page
  2322.                                         89)
  2323.  
  2324.                od_puttext()             Displays text with color information,
  2325.                                         as previously stored using
  2326.                                         od_gettext(). Requires ANSI/AVATAR/RIP
  2327.                                         graphics mode. (page 116)
  2328.  
  2329.                od_scroll()              Scrolls a portion of the screen in
  2330.                                         ANSI/AVATAR/RIP graphics modes. (page
  2331.                                         123)
  2332.  
  2333.                POPUP WINDOWS AND MENUS
  2334.                -----------------------
  2335.                od_draw_box()            Draws a box on the screen in
  2336.                                         ANSI/AVATAR/RIP graphics mode. (page
  2337.                                         65)
  2338.  
  2339.                od_window_create()       Displays a popup window, storing the
  2340.                                         screen contents "under" the window.
  2341.                                         Requires ANSI/AVATAR/RIP graphics mode.
  2342.                                         (page 145)
  2343.  
  2344.                od_window_remove()       Removes a popup window displayed with
  2345.                                         od_window_create(), restoring the
  2346.                                         original screen contents "under" the
  2347.                                         window. Requires ANSI/AVATAR/RIP
  2348.                                         graphics mode. (page 147)
  2349.  
  2350.                od_popup_menu()          Displays a menu in a popup window,
  2351.                                         allowing the user to choose menu items
  2352.                                         either by pressing a "hot" key, or
  2353.                                         moving a highlighted selection bar.
  2354.                                         After menu selection, the menu may be
  2355.                                         removed, restoring the original screen
  2356.                                         contents "under" the window. Requires
  2357.                                         ANSI/AVATAR/RIP graphics mode. (page
  2358.                                         105)
  2359.  
  2360.  
  2361.  
  2362.  
  2363. ===============================================================================
  2364. OpenDoors 6.00 Manual                                           End of Page 43
  2365.  
  2366.                FILE DISPLAY FUNCTIONS
  2367.                ----------------------
  2368.                od_send_file()           Displays an ASCII/ANSI/AVATAR/RIP file
  2369.                                         (for instance, an .ANS file created by
  2370.                                         a program such as "TheDraw" (page 124)
  2371.  
  2372.                od_hotkey_menu()         Displays an ASCII/ANSI/AVATAR/RIP menu
  2373.                                         file, with hotkeys active. (page 90)
  2374.  
  2375.                od_list_files()          Lists the files available for download
  2376.                                         in an area, using a FILES.BBS file.
  2377.                                         (page 98)
  2378.  
  2379.  
  2380. -------------------------------------------------------------------------------
  2381. INPUT          od_get_answer()          Inputs a single key from the keyboard,
  2382. FUNCTIONS                               allowing only particular responses.
  2383.                                         (page 81)
  2384.  
  2385.                od_get_input()           A more flexible version of
  2386.                                         od_get_key(), that also supports
  2387.                                         extended keys such as arrow keys,
  2388.                                         insert, etc. (page 82)
  2389.  
  2390.                od_get_key()             Inputs a single key from the keyboard,
  2391.                                         optionally waiting if a key is not
  2392.                                         available. (page 82)
  2393.  
  2394.                od_input_str()           Inputs a string of specified length,
  2395.                                         from the keyboard. (page 95)
  2396.  
  2397.                od_edit_str()            Formatted string editing function,
  2398.                                         requiring ANSI/AVATAR/RIP graphics.
  2399.                                         (page 68)
  2400.  
  2401.                od_multiline_edit()      Provides a text editor that allows the
  2402.                                         user to enter or edit text that spans
  2403.                                         multiple lines, such as email messages
  2404.                                         or text files. (page 101)
  2405.  
  2406.                od_clear_keybuffer()     Removes any waiting keys from the
  2407.                                         keyboard input queue. (page 53)
  2408.  
  2409.  
  2410. -------------------------------------------------------------------------------
  2411. COMMON         od_page()                Allows the user to page the sysop.
  2412. DOOR                                    (page 101)
  2413. ACTIVITY
  2414. FUNCTIONS      od_spawn()                    OpenDoors "quick" spawn function.
  2415.                                         Executes an external program (eg. file
  2416.                                         compressor, external protocol, etc.) on
  2417.  
  2418. ===============================================================================
  2419. OpenDoors 6.00 Manual                                           End of Page 44
  2420.  
  2421.                                         a separate screen, restoring the
  2422.                                         OpenDoors screen afterwards. (page 139)
  2423.  
  2424.                od_spawnvpe()            OpenDoors full-featured spawn function.
  2425.                                         Executes an external program on a
  2426.                                         separate screen, searching the path for
  2427.                                         the program, allowing you to specify an
  2428.                                         environment to pass to the child
  2429.                                         process, and returning the errorlevel
  2430.                                         returned by the child process. (page
  2431.                                         143)
  2432.  
  2433.                od_log_write()           Adds an entry to the end of the log
  2434.                                         file. (page 100)
  2435.  
  2436.                od_parse_cmd_line()      Handle standard command line options.
  2437.                                         (page 105)
  2438.  
  2439.  
  2440. -------------------------------------------------------------------------------
  2441. SPECIAL        od_init()                Begins door operation by setting up
  2442. CONTROL                                 the OpenDoors control structure,
  2443. FUNCTIONS                               setting up the local screen,
  2444.                                         initializing the serial port (if
  2445.                                         applicable), and reading the door
  2446.                                         information file. (page 92)
  2447.  
  2448.                od_color_config()        Transfers a color configuration line to
  2449.                                         a color attribute value. (page 59)
  2450.  
  2451.                od_add_personality()     Adds a custom status line/control key
  2452.                                         personality to OpenDoors. (page 47)
  2453.  
  2454.                od_set_statusline()      Temporarily alters the setting of the
  2455.                                         current OpenDoors status line. (page
  2456.                                         137)
  2457.  
  2458.                od_autodetect()          Automatically determines the remote
  2459.                                         terminal software's graphical
  2460.                                         capabilities. (page 48)
  2461.  
  2462.                od_kernel()              The central OpenDoors control function,
  2463.                                         which should be executed every few
  2464.                                         seconds. (page 97)
  2465.  
  2466.                od_exit()                Ends door operations, closing the
  2467.                                         serial port driver, re-writing the door
  2468.                                         information file, and optionally
  2469.                                         returning control to the BBS. (page 79)
  2470.  
  2471.  
  2472.  
  2473. ===============================================================================
  2474. OpenDoors 6.00 Manual                                           End of Page 45
  2475.  
  2476.                od_carrier()             Allows detection of carrier signal in
  2477.                                         programs that have disabled OpenDoors
  2478.                                         internal checking. (page 51)
  2479.  
  2480.                od_set_dtr()             Controls the DTR signal to the modem.
  2481.                                         Can be used to manually disconnect a
  2482.                                         remote user, in order to perform
  2483.                                         activities such as call back
  2484.                                         verification. (page 135)
  2485.  
  2486.                od_chat()                Forces OpenDoors to enter chat mode,
  2487.                                         even if sysop did not press the "chat"
  2488.                                         key. (page 50)
  2489.  
  2490.                od_sleep()               Suspends program execution, yielding
  2491.                                         control to other tasks in a
  2492.                                         multitasking environment. (page 139)
  2493.  
  2494.  
  2495.  
  2496.  
  2497.  
  2498.  
  2499.  
  2500.  
  2501.  
  2502.  
  2503.  
  2504.  
  2505.  
  2506.  
  2507.  
  2508.  
  2509.  
  2510.  
  2511.  
  2512.  
  2513.  
  2514.  
  2515.  
  2516.  
  2517.  
  2518.  
  2519.  
  2520.  
  2521.  
  2522.  
  2523.  
  2524.  
  2525.  
  2526.  
  2527.  
  2528. ===============================================================================
  2529. OpenDoors 6.00 Manual                                           End of Page 46
  2530.  
  2531. OD_ADD_PERSONALITY()
  2532. -------------------------------------------------------------------------------
  2533.  
  2534. PURPOSE        Installs a custom status line / sysop function key personality
  2535.                into OpenDoors.
  2536.  
  2537.  
  2538. FORMAT         BOOL od_add_personality(char *pszName, BYTE btOutputTop,
  2539.                    BYTE btOutputBottom, OD_PERSONALITY_PROC *pfPerFunc);
  2540.  
  2541.  
  2542. RETURNS        TRUE on success
  2543.                FALSE on failure
  2544.  
  2545.  
  2546. DESCRIPTION    If used, this function should be called before any other
  2547.                OpenDoors API functions. This function installs a new
  2548.                personality into OpenDoors. The first parameter specifies the
  2549.                string that will be used to identify the personality. This is
  2550.                the string that the user will be able to supply in the
  2551.                configuration file to select this personality, and is also the
  2552.                string that can be passed to od_set_personality() to manually
  2553.                switch to this personality. The second and third parameters
  2554.                specify the 1-based to and bottom line numbers of the output
  2555.                window to be used with this personality. For instance, a top
  2556.                value of 1 and bottom value of 23 would cause all door output to
  2557.                be displayed on the first 23 lines of the screen, leaving the
  2558.                bottom two lines for use by the personality's status line. The
  2559.                last parameter is a pointer to the personality function, which
  2560.                OpenDoors will call to perform various operations with that
  2561.                involve the personality. For more information on personalities
  2562.                and the OpenDoors Multiple Personality System, see the section
  2563.                which begins on page 233.
  2564.  
  2565.                This function only has an effect under the DOS version of
  2566.                OpenDoors.
  2567.  
  2568. SEE ALSO       od_set_personality(), od_set_statusline()
  2569.  
  2570.  
  2571.  
  2572.  
  2573.  
  2574.  
  2575.  
  2576.  
  2577.  
  2578.  
  2579.  
  2580.  
  2581.  
  2582.  
  2583. ===============================================================================
  2584. OpenDoors 6.00 Manual                                           End of Page 47
  2585.  
  2586. OD_AUTODETECT()
  2587. -------------------------------------------------------------------------------
  2588.  
  2589. PURPOSE        Attempts to automatically determine the terminal capabilities of
  2590.                the remote system.
  2591.  
  2592.  
  2593. FORMAT         void od_autodetect(int nFlags);
  2594.  
  2595.  
  2596. RETURNS        N/A
  2597.  
  2598.  
  2599. DESCRIPTION    This function can be used to determine whether or not the remote
  2600.                terminal supports ANSI and/or RIP (Remote Imaging Protocol)
  2601.                graphics modes. This information is usually supplied to the door
  2602.                by the BBS software, through the door information file. For this
  2603.                reason, most door programs do not need to make used of this
  2604.                function. However, if your door will be running under any BBS
  2605.                software that does not report the ANSI or RIP capabilities of
  2606.                the remote system, you may wish to use this function.
  2607.                od_autodetect() will set either of the following OpenDoors
  2608.                control structure variables to TRUE if the corresponding
  2609.                graphics mode is detected:
  2610.  
  2611.                     od_control.user_ansi     - TRUE if ANSI mode is available
  2612.                     od_control.user_rip      - TRUE if RIP mode is available
  2613.  
  2614.                However, if either of these variables have previously been set
  2615.                to TRUE (either explicitly by your program, or due to the
  2616.                corresponding modes being enabled in the door information file),
  2617.                and od_autodetect() does not detect the corresponding graphics
  2618.                mode, they will not be set to FALSE. Not all terminal software
  2619.                that supports ANSI or RIP graphics mode will necessarily have
  2620.                the ability to report their graphics mode capabilities to the
  2621.                door. For this reason, failure to detect either of these modes
  2622.                does not necessarily indicate that they are not available.
  2623.                However, if these modes are detected by od_autodetect(), it is
  2624.                safe to assume that the remote system does support the detected
  2625.                mode.
  2626.  
  2627.                The nFlags parameter is reserved for future use, and should
  2628.                always be set to DETECT_NORMAL.
  2629.  
  2630.                This function cannot auto-detect AVATAR mode, because there is
  2631.                no standard means of determining whether a remote system
  2632.                supports AVATAR mode.
  2633.  
  2634.  
  2635. EXAMPLE        Below is an example of using od_autodetect() in determining the
  2636.                remote terminal's graphics capabilities. Since not all terminal
  2637.                software supports auto-detection, this example will also prompt
  2638. ===============================================================================
  2639. OpenDoors 6.00 Manual                                           End of Page 48
  2640.  
  2641.                the user to determine their software's capabilities if
  2642.                od_autodetect() fails to detect ANSI mode. This code assumes
  2643.                that if the terminal software supports the autodetection of ANSI
  2644.                mode, that it will also support the autodetection of RIP mode.
  2645.                OpenDoors assumes that ANSI mode is always available in
  2646.                conjunction with RIP mode.
  2647.  
  2648.                     /* Call the automatic terminal detection function */
  2649.                     od_autodetect();
  2650.  
  2651.                     /* If ANSI mode was not detected, ask the user about
  2652.                     if(!od_control.user_ansi)
  2653.                     {
  2654.                        /* Prompt the user for ANSI capabilities */
  2655.                        od_clr_scr();
  2656.                        od_printf("Does your system support ANSI graphics?");
  2657.                        od_printf(" (Y/N)");
  2658.  
  2659.                        /* If the user chooses [Y]es */
  2660.                        if(od_get_answer("YN") == 'Y')
  2661.                        {
  2662.                           /* Turn on ANSI mode */
  2663.                           od_control.user_ansi = TRUE;
  2664.  
  2665.                           /* Since ANSI mode is present, RIP mode may also */
  2666.                           /* be available. Prompt the user for RIP. */
  2667.                           od_printf("\r\n\n");
  2668.                           od_printf("Does your system support RIP graphics?");
  2669.                           od_printf(" (Y/N)");
  2670.  
  2671.                           /* If the user chooses [Y]es */
  2672.                           if(od_get_answer("YN") == 'Y')
  2673.                              /* Turn on RIP mode */
  2674.                              od_control.user_rip = TRUE;
  2675.  
  2676.                           /* Since ANSI mode is present, AVATAR mode may  */
  2677.                           /* also be available. Prompt the user for AVATAR. */
  2678.                           od_printf("\r\n\n");
  2679.                           od_printf("Does your system support AVATAR ");
  2680.                           od_printf("graphics? (Y/N)");
  2681.  
  2682.                           /* If the user chooses [Y]es */
  2683.                           if(od_get_answer("YN") == 'Y')
  2684.                              /* Turn on AVATAR mode */
  2685.                              od_control.user_avatar = TRUE;
  2686.                        }
  2687.  
  2688.                        od_printf("\r\n\n");
  2689.                     }
  2690.  
  2691.  
  2692.  
  2693. ===============================================================================
  2694. OpenDoors 6.00 Manual                                           End of Page 49
  2695.  
  2696. OD_CHAT()
  2697. -------------------------------------------------------------------------------
  2698.  
  2699. PURPOSE        Manually invokes sysop chat mode.
  2700.  
  2701.  
  2702. FORMAT         void od_chat(void);
  2703.  
  2704.  
  2705. RETURNS        N/A
  2706.  
  2707.  
  2708. DESCRIPTION    Normally, the OpenDoors sysop chat mode will only be invoked
  2709.                when the sysop explicitly requests it using the sysop chat key.
  2710.                However, there may be some cases where you wish to manually
  2711.                invoke the sysop chat mode. One example is when you are
  2712.                replacing the OpenDoors built-in chat mode with your own, but
  2713.                still wish to use the OpenDoors chat mode under some
  2714.                circumstances. For instance, you may wish to use your own split-
  2715.                screen chat routine if ANSI, AVATAR or RIP graphics mode is
  2716.                available, and use the OpenDoors line-oriented chat mode if only
  2717.                ASCII mode is available.
  2718.  
  2719.  
  2720. SEE ALSO       od_page()
  2721.  
  2722.  
  2723. EXAMPLE        For an example of using the od_chat() function, see the
  2724.                ex_chat.c example door, which is described on page 38.
  2725.  
  2726.  
  2727.  
  2728.  
  2729.  
  2730.  
  2731.  
  2732.  
  2733.  
  2734.  
  2735.  
  2736.  
  2737.  
  2738.  
  2739.  
  2740.  
  2741.  
  2742.  
  2743.  
  2744.  
  2745.  
  2746.  
  2747.  
  2748. ===============================================================================
  2749. OpenDoors 6.00 Manual                                           End of Page 50
  2750.  
  2751. OD_CARRIER()
  2752. -------------------------------------------------------------------------------
  2753.  
  2754. PURPOSE        To determine the status of the carrier detect signal, in
  2755.                programs where OpenDoors' internal carrier detection has been
  2756.                disabled.
  2757.  
  2758.  
  2759. FORMAT         BOOL od_carrier(void);
  2760.  
  2761.  
  2762. RETURNS        TRUE if a carrier is present, or
  2763.                FALSE if no carrier is present, or in local mode.
  2764.  
  2765.  
  2766. DESCRIPTION    Usually, you will not have any use for the od_carrier()
  2767.                function, as OpenDoors automatically monitor's the carrier
  2768.                detect signal, and will correctly recover if the carrier detect
  2769.                signal is lost while the door is operating in remote mode.
  2770.                However, in some programs, you may wish to disable OpenDoors'
  2771.                internal carrier detection routines, using the
  2772.                od_control.od_disable variable. Two such cases in which you
  2773.                might want to do this, are a call-back verification door, which
  2774.                disconnects the user and attempts to call them back, or in a
  2775.                terminal program, which is in fact not a door at all (and as
  2776.                such you would not want to have OpenDoors exit when the carrier
  2777.                detect signal is lost). In cases like these, you will then be
  2778.                able to use the od_carrier() function in order to determine the
  2779.                state of the carrier detect signal.
  2780.  
  2781.                This function will return a Boolean value (for more information
  2782.                on Boolean values, see the Glossary which begins on page 256),
  2783.                of either TRUE or FALSE. If a carrier detect signal is present
  2784.                when the function is called, it will return TRUE, and if no
  2785.                carrier detect signal is detected, it will return FALSE. Since
  2786.                there is no remote connection, and thus no carrier when
  2787.                OpenDoors is operating in local mode, this function will always
  2788.                return a value of FALSE in local mode.
  2789.  
  2790.  
  2791. SEE ALSO       od_set_dtr()
  2792.  
  2793.  
  2794. EXAMPLE        As an example of the use of this function, let us consider a
  2795.                call back verification door, which hangs up on the user, and
  2796.                then calls the user back at their entered phone number, in order
  2797.                to verify the correctness of that number. This program would
  2798.                probably contain a function that is responsible for
  2799.                disconnecting the user, waiting for the connection to be broken,
  2800.                and then phoning the user. At some point in this function,
  2801.                likely just prior to the point where the function hangs up on
  2802.  
  2803. ===============================================================================
  2804. OpenDoors 6.00 Manual                                           End of Page 51
  2805.  
  2806.                the user, you would disable OpenDoors' internal carrier
  2807.                detection, using the line:
  2808.  
  2809.                     od_control.od_disable |= DIS_CARRIERDETECT;
  2810.  
  2811.                You would then want to have a piece of code which would simply
  2812.                wait up to a given amount of time for the carrier signal to
  2813.                drop. If this occurs, you would continue to place the call, and
  2814.                if it does not occur, you would probably try your hangup
  2815.                procedure one or two more times. In this example, the function
  2816.                will return with a value of FALSE if the carrier signal does not
  2817.                drop, and will return a value of TRUE if it does.
  2818.  
  2819.                     char hangup(void)
  2820.                     {
  2821.                        clock_t timer;
  2822.                        char to_return = FALSE;
  2823.  
  2824.                        od_set_dtr(FALSE);                    /* Hangup modem */
  2825.  
  2826.                                                         /* Wait up to 30secs */
  2827.                        timer = clock() + CLOCKS_PER_SEC * 30;
  2828.                        while(timer >= clock())
  2829.                        {    /* If carrier has been lost, return with success */
  2830.                           if(!od_carrier())
  2831.                           {
  2832.                              to_return = TRUE;
  2833.                              break;
  2834.                           }
  2835.                        }
  2836.  
  2837.                        od_set_dtr(TRUE);             /* Re-enable DTR signal */
  2838.                        return(to_return);
  2839.                     }
  2840.  
  2841.  
  2842.  
  2843.  
  2844.  
  2845.  
  2846.  
  2847.  
  2848.  
  2849.  
  2850.  
  2851.  
  2852.  
  2853.  
  2854.  
  2855.  
  2856.  
  2857.  
  2858. ===============================================================================
  2859. OpenDoors 6.00 Manual                                           End of Page 52
  2860.  
  2861. OD_CLEAR_KEYBUFFER()
  2862. -------------------------------------------------------------------------------
  2863.  
  2864. PURPOSE        Function to clear the input keyboard buffer
  2865.  
  2866.  
  2867. FORMAT         void od_clear_keybuffer(void);
  2868.  
  2869.  
  2870. RETURNS        N/A
  2871.  
  2872.  
  2873. DESCRIPTION    OpenDoors maintains its own keyboard input buffer, in order to
  2874.                permit the user to "type ahead" - to send input to the door
  2875.                prior to the time when it is ready to process those key presses.
  2876.                For example, the user could begin to type a command while a menu
  2877.                is still being displayed, and when your door reaches the point
  2878.                of inputting the menu command, the characters already typed by
  2879.                the user will already be waiting for the OpenDoors input
  2880.                functions. Note that the keyboard input buffer will include both
  2881.                the keys hit by the user on-line, and the non-function keys (ie,
  2882.                Alt-C will not appear in the OpenDoors keyboard buffer), hit by
  2883.                the sysop. This allows both the user on-line and the sysop to
  2884.                control the door at any time. If the sysop wishes to temporarily
  2885.                prevent the user from having any control over the door, the
  2886.                sysop may use the Alt-K (user-keyboard off) key. The key strokes
  2887.                placed in the OpenDoors type-ahead buffer will be retrieved by
  2888.                the od_get_key() and od_input_str() functions. The keyboard
  2889.                buffer can contain a maximum of 64 user keystrokes in this
  2890.                version of OpenDoors, after which any additional keystrokes will
  2891.                simply be discarded by OpenDoors.
  2892.  
  2893.                There are times, however, when you will want to erase any keys
  2894.                that have been hit by the user, to prevent them from typing
  2895.                ahead. For example, if your door has been busy doing some
  2896.                processing for a few moments, they user may have been pressing
  2897.                keys on their keyboard - perhaps in the hope that doing so will
  2898.                speed things up. These keys will be waiting in the type-ahead
  2899.                buffer, and if one of the keys the user entered was a valid
  2900.                response to the next prompt in your door, the user may find that
  2901.                they have accidentally made a choice they did not wish to. A
  2902.                well designed door will simply erase the contents of the type-
  2903.                ahead buffer after any long period of internal processing, etc.
  2904.                Keep in mind that too much use of the od_clear_keybuffer()
  2905.                function can be just as undesirable as not using it all, as
  2906.                there are times when the presence of the keyboard buffer can
  2907.                prove to be very useful for the user of a door.
  2908.  
  2909.                To erase the contents of the type-ahead buffer, you simply call
  2910.                the od_clear_keybuffer() function. This function takes no
  2911.                parameters, and does not return any value.
  2912.  
  2913. ===============================================================================
  2914. OpenDoors 6.00 Manual                                           End of Page 53
  2915.  
  2916.  
  2917.  
  2918. SEE ALSO       od_get_key(), od_input_str(), od_edit_str()
  2919.  
  2920.  
  2921. EXAMPLE        For one example of the use of the od_clear_keybuffer() function,
  2922.                see the example program EX_VOTE.C, which is described beginning
  2923.                on page 38. Below is another example of using this function. In
  2924.                this case, we present a simple function, wait_for_return(),
  2925.                which simply pauses for the user to press their [Enter]/[Return]
  2926.                key. The function begins by displaying a prompt asking for the
  2927.                [Enter] or [Return] key to be pressed. The function then clears
  2928.                the keyboard input buffer, and waits until the user presses the
  2929.                carriage return key, using the od_get_key() function. Note also
  2930.                that this function will only continue if the user has pressed
  2931.                the correct key. This is a good idea in all door programs, as it
  2932.                allows your door to distinguish between a character pressed by
  2933.                the user, and a "line noise" character.
  2934.  
  2935.                     void wait_for_return(void)
  2936.                     {                                      /* Display prompt */
  2937.                        od_disp_str("Please Press [Enter] to continue...\n\r");
  2938.                        od_clear_keybuffer();        /* Clear keyboard buffer */
  2939.                        while(od_get_key(TRUE) != 13);  /* Wait for Enter key */
  2940.                     }
  2941.  
  2942.  
  2943.  
  2944.  
  2945.  
  2946.  
  2947.  
  2948.  
  2949.  
  2950.  
  2951.  
  2952.  
  2953.  
  2954.  
  2955.  
  2956.  
  2957.  
  2958.  
  2959.  
  2960.  
  2961.  
  2962.  
  2963.  
  2964.  
  2965.  
  2966.  
  2967.  
  2968. ===============================================================================
  2969. OpenDoors 6.00 Manual                                           End of Page 54
  2970.  
  2971. OD_CLR_LINE()
  2972. -------------------------------------------------------------------------------
  2973.  
  2974. PURPOSE        Clears the rest of the current display line
  2975.  
  2976.  
  2977. FORMAT         void od_clr_line(void);
  2978.  
  2979.  
  2980. RETURNS        N/A
  2981.  
  2982.  
  2983. DESCRIPTION    This function clears the line that the cursor is on, from the
  2984.                cursor position to the end of the line. After the rest of the
  2985.                line is cleared, the cursor is automatically returned to the
  2986.                position it was at prior to issuing the command. Hence, if the
  2987.                display line the cursor was located on looked as follows, with
  2988.                the underscore (_) character representing the cursor position:
  2989.  
  2990.                         This is a_line of text!
  2991.  
  2992.                With the cursor between the words "a" and "line", after the
  2993.                od_clr_line command is issued, the line would appear as follows:
  2994.  
  2995.                         This is a_
  2996.  
  2997.                With the cursor directly following the word "a". Note that this
  2998.                function places a space character at the cursor location, and
  2999.                every location up to the end of the line.
  3000.  
  3001.                When the door is running in plain ASCII mode, this command will
  3002.                simply clear the rest of the line by manually sending a series
  3003.                of space and backspace characters. When ANSI, AVATAR or RIP
  3004.                modes are active, the corresponding ANSI/AVATAR control sequence
  3005.                will be sent in order to accomplish the line clear. Since the
  3006.                graphics mode sequences are much shorter than the sequence that
  3007.                would be required to clear the line manually, the use of this
  3008.                function will cause your door's graphics to display much more
  3009.                quickly when ANSI, AVATAR or RIP modes are active. Also note
  3010.                that in ANSI, AVATAR or RIP graphics modes, the line will be
  3011.                cleared with the currently selected color attribute. Thus, if
  3012.                you wanted to place a blue background on a particular line, you
  3013.                would use the od_set_color() (or od_set_attrib()) function, then
  3014.                use the od_set_cursor() function to locate the cursor at the
  3015.                beginning of the desired line, followed by the od_clr_line()
  3016.                function. Just such a procedure is demonstrated in the example,
  3017.                below.
  3018.  
  3019.  
  3020. SEE ALSO       od_clr_scr(), od_set_cursor()
  3021.  
  3022.  
  3023. ===============================================================================
  3024. OpenDoors 6.00 Manual                                           End of Page 55
  3025.  
  3026. EXAMPLE        Below, is an example of a function that clears an entire line
  3027.                with a specified color. Since this function performs operations
  3028.                that require ANSI, AVATAR or RIP graphics mode, it should only
  3029.                be used in a case where these modes are known to be available.
  3030.                For example, this function would be useful in a full-screen
  3031.                editor or viewer, or when performing ANSI animations. The
  3032.                function accepts three parameters: the line to be cleared (where
  3033.                1 is the first line, 2 the second, and so on), the foreground
  3034.                color of this line, and the background color of this line.
  3035.  
  3036.                This function differs from the od_clr_line() function itself in
  3037.                several important manners. First of all, this function clears
  3038.                the entire line, whereas the od_clr_line() function can be used
  3039.                to clear only the remaining characters of the line, after any
  3040.                particular location. Also, as mentioned before, this function
  3041.                selects a color to clear the line to, and moves the cursor to
  3042.                the line which is to be cleared - neither of which is done by
  3043.                the od_clr_line() function.
  3044.  
  3045.  
  3046.                void clear_line(char line_number,char foreground,char
  3047.                background)
  3048.                {
  3049.                   od_set_cursor(line_number,1);      /* move to correct line */
  3050.                   od_set_color(foreground,background);          /* set color */
  3051.                   od_clr_line();                        /* clear entire line */
  3052.                }
  3053.  
  3054.  
  3055.  
  3056.  
  3057.  
  3058.  
  3059.  
  3060.  
  3061.  
  3062.  
  3063.  
  3064.  
  3065.  
  3066.  
  3067.  
  3068.  
  3069.  
  3070.  
  3071.  
  3072.  
  3073.  
  3074.  
  3075.  
  3076.  
  3077.  
  3078. ===============================================================================
  3079. OpenDoors 6.00 Manual                                           End of Page 56
  3080.  
  3081. OD_CLR_SCR()
  3082. ------------------------------------------------------------------------------
  3083.  
  3084. PURPOSE        The OpenDoors clear screen function
  3085.  
  3086.  
  3087. FORMAT         void od_clr_scr(void);
  3088.  
  3089.  
  3090. RETURNS        N/A
  3091.  
  3092.  
  3093. DESCRIPTION    The od_clr_scr() function can be used to clear the output
  3094.                screen. (ie, the user's screen and local screen with the
  3095.                exception of the status line are cleared.) This function will
  3096.                only clear the screen if screen clearing is enabled. If your
  3097.                program will be running under BBS systems that do not pass the
  3098.                user's screen clearing setting to the door, you may wish to
  3099.                determine yourself whether or not the user's system supports
  3100.                screen clearing codes, during the first time the user uses the
  3101.                door. You will then be able to store this setting in a data
  3102.                file. The example below demonstrates how to detect whether or
  3103.                not the user's system supports screen clearing.
  3104.  
  3105.                You should note that the ability for the user's terminal to
  3106.                support screen clearing codes is independent of the user's ANSI
  3107.                / AVATAR / RIP graphics mode settings.
  3108.  
  3109.                For more information on the user's screen clearing setting,
  3110.                please refer to the user_attrib variable in the OpenDoors
  3111.                Control Structure chapter of this manual. If you wish to force a
  3112.                screen clear, regardless of the user's screen clearing setting,
  3113.                simply use the function call:
  3114.  
  3115.                          od_disp_emu("\xc", TRUE);
  3116.  
  3117.  
  3118. SEE ALSO       od_clr_line()
  3119.  
  3120.  
  3121. EXAMPLE        Below is an example of a function which determines whether or
  3122.                not the user's system supports screen clearing. This function
  3123.                will return a value of TRUE if screen clearing is supported, and
  3124.                will return a value of FALSE if screen clearing is not
  3125.                supported:
  3126.  
  3127.                int user_supports_screen_clearing(void)
  3128.                {
  3129.                   char answer;
  3130.                                              /* display instructions to user */
  3131.                   od_disp_str("In order for this door to function\n\r");
  3132.                   od_disp_str("correctly, we must know whether or not\n\r");
  3133. ===============================================================================
  3134. OpenDoors 6.00 Manual                                           End of Page 57
  3135.  
  3136.                   od_disp_str("your system supports screen clearing.\n\r");
  3137.                   od_disp_str("In a moment, we will attempt to clear\n\r");
  3138.                   od_disp_str(
  3139.                      "your screen in order to test your system's\n\r");
  3140.                   od_disp_str("capabilities.\n\r\n\r");
  3141.  
  3142.                   od_disp_str("Please press [Enter]/[Return] when you\n\r");
  3143.                   od_disp_str("are ready to perform this test.\n\r");
  3144.                   while(od_get_key(TRUE)!=13);      /* wait for [Return] key */
  3145.  
  3146.                   od_clr_scr();                   /* attempt to clear screen */
  3147.                                          /* ask user if their screen cleared */
  3148.                   od_disp_str("Did your screen just clear? (Y/N)\n\r");
  3149.                   for(;;)           /* loop until user chooses [Y]es or [N]o */
  3150.                   {
  3151.                      answer=od_get_key(TRUE);           /* Get user's answer */
  3152.                      if(answer=='y' || answer=='Y') return(TRUE);
  3153.                      if(answer=='n' || answer=='N') return(FALSE);
  3154.                   }
  3155.                }
  3156.  
  3157.  
  3158.  
  3159.  
  3160.  
  3161.  
  3162.  
  3163.  
  3164.  
  3165.  
  3166.  
  3167.  
  3168.  
  3169.  
  3170.  
  3171.  
  3172.  
  3173.  
  3174.  
  3175.  
  3176.  
  3177.  
  3178.  
  3179.  
  3180.  
  3181.  
  3182.  
  3183.  
  3184.  
  3185.  
  3186.  
  3187.  
  3188. ===============================================================================
  3189. OpenDoors 6.00 Manual                                           End of Page 58
  3190.  
  3191. OD_COLOR_CONFIG()
  3192. -------------------------------------------------------------------------------
  3193.  
  3194. PURPOSE        Parses a color configuration line from the configuration file,
  3195.                generating a color attribute value.
  3196.  
  3197.  
  3198. FORMAT         BYTE od_color_config(char *pszColorDesc);
  3199.  
  3200.  
  3201. RETURNS        Color attribute value
  3202.  
  3203.  
  3204. DESCRIPTION    This function will be of use if you are using the configuration
  3205.                file system of OpenDoors, and wish to allow the sysop to specify
  3206.                text colors to be used in your door. While OpenDoors
  3207.                automatically recognizes color configuration settings for things
  3208.                such as sysop chat mode and FILES.BBS listings, you may wish to
  3209.                add additional color configuration options. In this case, you
  3210.                could call the od_color_config() function from your custom line
  3211.                function. For more information on the custom line function, see
  3212.                the section on the OpenDoors configuration file system, which
  3213.                begins on page 224.
  3214.  
  3215.                To use this function, simply pass the configuration file line
  3216.                you wish to have parsed to the function in it's single
  3217.                parameter. The function will then return a color attribute value
  3218.                in the same format that is used but the od_set_attrib()
  3219.                function. Colors are specified using a string of the format:
  3220.  
  3221.                     {Flashing} {Bright} [foreground] on [background]
  3222.  
  3223.                Where "Flashing" is an optional keyword indicating that the text
  3224.                should be flashing. "Bright" is an optional keyword indicating
  3225.                that the foreground color should be bright. Foreground is the
  3226.                name of a foreground color, and background is the name of a
  3227.                background color. Case (upper or lower) is not significant.
  3228.  
  3229.                The color keywords are language configurable, using the array
  3230.                od_control.od_color_names.
  3231.  
  3232.  
  3233. EXAMPLE        See the example accompanying in the section on the OpenDoors
  3234.                configuration file system, which begins on page 224.
  3235.  
  3236.  
  3237.  
  3238.  
  3239.  
  3240.  
  3241.  
  3242.  
  3243. ===============================================================================
  3244. OpenDoors 6.00 Manual                                           End of Page 59
  3245.  
  3246. OD_DISP()
  3247. ------------------------------------------------------------------------------
  3248.  
  3249. PURPOSE        Sends a buffer of text with optional local echo
  3250.  
  3251.  
  3252. FORMAT         void od_disp(char *pachBuffer, INT nSize, BOOL bLocalEcho);
  3253.  
  3254.  
  3255. RETURNS        N/A
  3256.  
  3257.  
  3258. DESCRIPTION    This function allows you to send a buffer of text of any
  3259.                specified length, with the option of enabling or disabling local
  3260.                echo. You will probably have little use for this function -
  3261.                instead you will most likely display strings using either the
  3262.                od_disp_str() or od_printf() functions, depending on whether or
  3263.                not you wish to use printf()'s formatting options. For a
  3264.                breakdown of the uses of the various OpenDoors display
  3265.                functions, see the description of the od_disp_str() function, on
  3266.                page 63.
  3267.  
  3268.                There are two cases when this function will come in useful:
  3269.  
  3270.                     1.)If you wish to display a buffer of characters of known
  3271.                        length, which may contain null (ASCII 0) characters.
  3272.                        Since this character is used by the C language to
  3273.                        indicate the end of a string, the other two string
  3274.                        display functions (od_disp_str() and od_printf()) will
  3275.                        not send this character to the remote system.
  3276.  
  3277.                     2.)If you wish to send text to the remote system without
  3278.                        having it displayed on the local screen, or if you wish
  3279.                        to send strings to the modem when it is in command
  3280.                        mode, without having these characters displayed on the
  3281.                        local screen.
  3282.  
  3283.                The od_disp() function is called with three parameters. The
  3284.                first parameter, pachBuffer, is a pointer to a buffer of
  3285.                characters you wish to have displayed. The second parameter,
  3286.                nSize, is simply the number of characters in the buffer to be
  3287.                displayed. If the third parameter, bLocalEcho, is set to TRUE,
  3288.                then all characters sent to the modem will also be displayed on
  3289.                the local screen. If the third parameter is set to FALSE, then
  3290.                the buffer will be sent to the modem without being echoed to the
  3291.                sysop's screen.
  3292.  
  3293.  
  3294. SEE ALSO       od_disp_str(), od_printf(), od_putch(), od_repeat(),
  3295.                od_disp_emu()
  3296.  
  3297.  
  3298. ===============================================================================
  3299. OpenDoors 6.00 Manual                                           End of Page 60
  3300.  
  3301. EXAMPLES       The following are a few examples of the use of the od_disp()
  3302.                function:
  3303.  
  3304.                In order to display a single character, contained in the
  3305.                variable "character", without echo to the local screen:
  3306.  
  3307.                     od_disp(&character,1,FALSE);
  3308.  
  3309.  
  3310.                In order to send a command to the modem (only if you know that
  3311.                the modem is in command mode), with the command contained in the
  3312.                null-terminated string "string":
  3313.  
  3314.                     od_disp(string,strlen(string),FALSE);
  3315.  
  3316.  
  3317.                In order to send exactly 5 characters from the buffer "buffer",
  3318.                WITH echo to the local screen:
  3319.  
  3320.                     od_disp(buffer,5,TRUE);
  3321.  
  3322.  
  3323.  
  3324.  
  3325.  
  3326.  
  3327.  
  3328.  
  3329.  
  3330.  
  3331.  
  3332.  
  3333.  
  3334.  
  3335.  
  3336.  
  3337.  
  3338.  
  3339.  
  3340.  
  3341.  
  3342.  
  3343.  
  3344.  
  3345.  
  3346.  
  3347.  
  3348.  
  3349.  
  3350.  
  3351.  
  3352.  
  3353. ===============================================================================
  3354. OpenDoors 6.00 Manual                                           End of Page 61
  3355.  
  3356. OD_DISP_EMU()
  3357. -------------------------------------------------------------------------------
  3358.  
  3359. PURPOSE        Displays a string with ANSI/AVATAR terminal emulation
  3360.  
  3361.  
  3362. FORMAT         void od_disp_emu(char *pszToDisplay, BOOL bRemoteEcho);
  3363.  
  3364.  
  3365. RETURNS        N/A
  3366.  
  3367.  
  3368. DESCRIPTION    The od_disp_emu() function allows you to display your own ANSI /
  3369.                AVATAR graphics sequences. This function passes the characters
  3370.                you wish to display to the OpenDoors terminal emulator, which is
  3371.                fully documented in the description of the od_send_file()
  3372.                function, on page 124. This function can be used to send these
  3373.                control sequences to the user's terminal, and also have them
  3374.                displayed on the local screen as they will appear to the user.
  3375.  
  3376.                The string passed to od_disp_emu() contains any stream of text
  3377.                to display, and may include both normal text and terminal
  3378.                emulation control sequences. If the bRemoteEcho parameter is set
  3379.                to TRUE, the string passed to od_disp_emu() will be sent to the
  3380.                remote terminal in addition to being displayed locally. If this
  3381.                parameter is set to FALSE, the string will only be displayed
  3382.                locally.
  3383.  
  3384.                Note that if you wish to display an entire file containing
  3385.                ANSI/AVATAR/RIP graphics sequences (perhaps as your program's
  3386.                menu or title screen), you can use the od_send_file() function.
  3387.  
  3388.  
  3389. SEE ALSO       od_send_file(), od_disp(), od_disp_str() od_printf().
  3390.  
  3391.                For a breakdown of the uses of the various OpenDoors display
  3392.                functions, see the od_disp_str() function, on page 63.
  3393.  
  3394.  
  3395. EXAMPLE        For an example of the use of the od_disp_emu() function, see the
  3396.                SpaceRight() and MoveLeft() functions included in the example
  3397.                program ex_ski.c.
  3398.  
  3399.  
  3400.  
  3401.  
  3402.  
  3403.  
  3404.  
  3405.  
  3406.  
  3407.  
  3408. ===============================================================================
  3409. OpenDoors 6.00 Manual                                           End of Page 62
  3410.  
  3411. OD_DISP_STR()
  3412. -------------------------------------------------------------------------------
  3413.  
  3414. PURPOSE        Displays a string to the screen (remote and local)
  3415.  
  3416.  
  3417. FORMAT         od_disp_str(char *pszToDisplay);
  3418.  
  3419.  
  3420. RETURNS        N/A
  3421.  
  3422.  
  3423. DESCRIPTION    The two functions most often used for displaying strings within
  3424.                a door are the od_disp_str() and od_printf() functions. The
  3425.                od_printf() function allows for formatted output, whereas the
  3426.                od_disp_str function simply displays the actual contents of the
  3427.                string passed to it. If you wish to display a single character,
  3428.                use the od_putch() function. If you wish to send a string or
  3429.                buffer to the modem without local echo, use the od_disp()
  3430.                function. If you wish to send a sequence of the same character
  3431.                to the modem, the od_repeat() function will use graphics control
  3432.                codes, if available to display the sequence much faster than
  3433.                simply sending the same character in repetition. Also, if you
  3434.                wish to send ANSI, AVATAR or RIP graphics control codes, and
  3435.                have them emulated on the local screen, use the od_disp_emu()
  3436.                function.
  3437.  
  3438.                The od_disp_str() function displays the contents of the null-
  3439.                terminated string pointed to by *string. Display is sent to both
  3440.                the local screen and modem (presuming the door is not running in
  3441.                local mode).
  3442.  
  3443.                An important thing to keep in mind when using the od_disp_str()
  3444.                function, is that you should use "/n/r" instead of simply "/n"
  3445.                for a new line. This is due to the fact that terminal programs
  3446.                usually require a carriage-return line-feed sequence (/n/r),
  3447.                instead of just a line-feed (/n). For example, instead of using:
  3448.  
  3449.                               od_disp_str("Hello world!\n");
  3450.  
  3451.                You should use:
  3452.  
  3453.                               od_disp_str("Hello world!\n\r");
  3454.  
  3455.                To change the cursor color or location of output with the
  3456.                od_disp_str() function, refer to the od_set_cursor() and the
  3457.                od_set_attrib() functions.
  3458.  
  3459.  
  3460. SEE ALSO       od_disp(), od_printf(), od_putch(), od_repeat(), od_disp_emu()
  3461.  
  3462.  
  3463. ===============================================================================
  3464. OpenDoors 6.00 Manual                                           End of Page 63
  3465.  
  3466. EXAMPLES       Below are a few examples of various uses of the od_disp_str()
  3467.                function:
  3468.  
  3469.                Displaying three string constants on separate lines:
  3470.  
  3471.                          od_disp_str("This is an example\n\r");
  3472.                          od_disp_str("of the OpenDoors\n\r");
  3473.                          od_disp_str("od_disp_str() function\n\r");
  3474.  
  3475.  
  3476.                Displaying three string constants on the same line:
  3477.  
  3478.                          od_disp_str("Another ");
  3479.                          od_disp_str("od_disp_str() ");
  3480.                          od_disp_str("example\n\r");
  3481.  
  3482.  
  3483.                Displaying a string variable:
  3484.  
  3485.                          char string[80];
  3486.  
  3487.                          strcpy(string,"This is a string!\n\r");
  3488.                          od_disp_str(string);
  3489.  
  3490.  
  3491.  
  3492.  
  3493.  
  3494.  
  3495.  
  3496.  
  3497.  
  3498.  
  3499.  
  3500.  
  3501.  
  3502.  
  3503.  
  3504.  
  3505.  
  3506.  
  3507.  
  3508.  
  3509.  
  3510.  
  3511.  
  3512.  
  3513.  
  3514.  
  3515.  
  3516.  
  3517.  
  3518. ===============================================================================
  3519. OpenDoors 6.00 Manual                                           End of Page 64
  3520.  
  3521. OD_DRAW_BOX()
  3522. -------------------------------------------------------------------------------
  3523.  
  3524. PURPOSE        Draws a box on the screen in ANSI, AVATAR or RIP graphics modes.
  3525.  
  3526.  
  3527. FORMAT         BOOL od_draw_box(BYTE btLeft, BYTE btTop, BYTE btRight, BYTE
  3528.                   btBottom);
  3529.  
  3530.  
  3531. RETURNS        TRUE on success, FALSE on failure
  3532.  
  3533.  
  3534. DESCRIPTION    This function is for use in ANSI, AVATAR or RIP graphics modes.
  3535.                This function will draw a box in the current display attribute,
  3536.                at the specified location on the screen. The boarder of the box
  3537.                is made up of the characters specified in the od_control.
  3538.                od_box_chars[] array. If AVATAR graphics mode is available, this
  3539.                function uses AVATAR control codes to display the box in less
  3540.                than 1/10 the length of time required to display the box in ANSI
  3541.                mode.
  3542.  
  3543.                The first two parameters of this function, btLeft and btTop,
  3544.                specify the coordinates of the top, left-hand corner of the box
  3545.                to be draw. The third and fourth parameters, btRight and
  3546.                btBottom, specify the coordinates of the bottom, left-hand
  3547.                corner of the box. Like the values passed to the od_set_cursor()
  3548.                function, these coordinates are relative to the upper left-hand
  3549.                corner of the screen, with the position (1,1) being this corner.
  3550.  
  3551.                As mentioned above, this function will display the window in the
  3552.                current text color. Thus, before calling this function, you
  3553.                should use either the od_set_color() or the od_set_attrib()
  3554.                function to specify the color in which you would like to have
  3555.                the window displayed.
  3556.  
  3557.                Normally, the boarder of the window will be displayed using the
  3558.                IBM extended ASCII characters which produce a single line
  3559.                boarder. However, you may wish to have the boarder displayed
  3560.                using different characters. In this case, the characters used to
  3561.                display the boarder can be specified by the od_control.
  3562.                od_box_chars variable, described in the OpenDoors control
  3563.                structure section of this manual.
  3564.  
  3565. SEE ALSO       od_set_color(), od_set_attrib(), od_clr_scr(), od_edit_str(),
  3566.                od_set_cursor()
  3567.  
  3568.  
  3569. EXAMPLE        As an example of the use of the od_draw_box() function in
  3570.                conjunction with the od_edit_str() function, we show a portion
  3571.                of a program which displays a window, and allows the user to
  3572.                input the name of a file they would like to upload, a
  3573. ===============================================================================
  3574. OpenDoors 6.00 Manual                                           End of Page 65
  3575.  
  3576.                description of the file, and whether they want it to be a
  3577.                private upload. The user is able to move among fields using the
  3578.                tab key, and select a "continue" button when they are finished.
  3579.                The function returns TRUE if the user selects continue, and
  3580.                FALSE if the user presses [ESCape].
  3581.  
  3582.                                                   // Main "dialog box" function
  3583.                int get_information(char *filename, char *description,
  3584.                                     char *private)
  3585.                {
  3586.                   char current_field=1;             // Currently selected field
  3587.                   int choice;                                  // User's choice
  3588.  
  3589.                   od_set_color(L_WHITE,D_BLUE);               // Display window
  3590.                   od_draw_box(10,5,70,13);
  3591.  
  3592.                   od_set_cursor(5,25);                  // Display window title
  3593.                   od_set_color(L_GREEN,D_BLUE);
  3594.                   od_disp_str(" ENTER FILENAME INFORMATION ");
  3595.  
  3596.                   od_set_color(L_CYAN,D_BLUE);     // Display fields and titles
  3597.                   od_set_cursor(6,15);
  3598.                   od_disp_str("FILENAME : ");
  3599.                   od_repeat(176,13);
  3600.                   od_set_cursor(7,12);
  3601.                   od_disp_str("DESCRIPTION : ");
  3602.                   od_repeat(176,43);
  3603.                   od_set_cursor(8,16);
  3604.                   od_disp_str("PRIVATE : ");
  3605.                   od_repeat(176,2);
  3606.                   draw_button();
  3607.  
  3608.                   filename[0]='\0';    // Blank out contents of input variables
  3609.                   description[0]='\0';
  3610.                   private[0]='\0';
  3611.  
  3612.                   for(;;)                               // Main dialog box loop
  3613.                   {
  3614.                      if(current_field==4)             // If field is the button
  3615.                      {
  3616.                         od_set_color(L_GREEN,D_BLUE);       // Highlight button
  3617.                         draw_button();
  3618.  
  3619.                         do  // Loop until user presses [TAB], [ENTER], or [ESC]
  3620.                         {
  3621.                            choice=od_get_key(TRUE);
  3622.                         } while(choice!=9 && choice!=13 && choice!=27);
  3623.  
  3624.                         od_set_color(L_CYAN,D_BLUE);     // Un-highlight button
  3625.                         draw_button();
  3626.  
  3627.                         if(choice==13) return(TRUE);  // If [ENTER] was pressed
  3628. ===============================================================================
  3629. OpenDoors 6.00 Manual                                           End of Page 66
  3630.  
  3631.                         if(choice==27) return(FALSE);   // If [ESC] was pressed
  3632.                         current_field=1;        // Otherwise, [TAB] was pressed
  3633.                      }
  3634.  
  3635.                     switch(current_field)        // According to selected field
  3636.                      {                       // Input from the appropriate line
  3637.                         case 1:
  3638.                            choice=od_edit_str(filename,"FFFFFFFFFFFF",6,26,
  3639.                                               0x1b,0x1a,176,
  3640.                                               EDIT_FLAG_EDIT_STRING|
  3641.                                               EDIT_FLAG_ALLOW_CANCEL|
  3642.                                               EDIT_FLAG_FIELD_MODE|
  3643.                                               EDIT_FLAG_KEEP_BLANK);
  3644.                            break;
  3645.                         case 2:
  3646.                            choice=od_edit_str(description,
  3647.                                               "*******************",
  3648.                                               7,26,0x1b,0x1a,176,
  3649.                                               EDIT_FLAG_EDIT_STRING|
  3650.                                               EDIT_FLAG_ALLOW_CANCEL|
  3651.                                               EDIT_FLAG_FIELD_MODE|
  3652.                                               EDIT_FLAG_KEEP_BLANK);
  3653.  
  3654.                            break;
  3655.                         case 3:
  3656.                            choice=od_edit_str(private,"Y",8,26,
  3657.                                               0x1b,0x1a,176,
  3658.                                               EDIT_FLAG_EDIT_STRING|
  3659.                                               EDIT_FLAG_ALLOW_CANCEL|
  3660.                                               EDIT_FLAG_FIELD_MODE);
  3661.                      }
  3662.                                                     // If user pressed [ESCape]
  3663.                      if(choice==EDIT_RETURN_CANCEL) return(FALSE);
  3664.                                       // If user choice to go to previous field
  3665.                      if(choice==EDIT_RETURN_PREVIOUS)
  3666.                      {
  3667.                         if(current_field==1)               // If at first field
  3668.                            current_field=4;                 // Go to last field
  3669.                         else                           // If not at first field
  3670.                            --current_field;             // Go to previous field
  3671.                      }
  3672.                      else                           // If user chose next field
  3673.                         ++current_field;                    // Go to next field
  3674.                   }
  3675.                }
  3676.  
  3677.                void draw_button(void)         // Function to display the button
  3678.                {
  3679.                   od_draw_box(12,10,23,12);              // Draw box for button
  3680.                   od_set_cursor(11,14);
  3681.                   od_disp_str("Continue");            // Display text in button
  3682.                }
  3683. ===============================================================================
  3684. OpenDoors 6.00 Manual                                           End of Page 67
  3685.  
  3686. OD_EDIT_STR()
  3687. -------------------------------------------------------------------------------
  3688.  
  3689. PURPOSE        Allows you to perform formatted input with full line editing
  3690.                features, etc., in ANSI/AVATAR/RIP graphics mode.
  3691.  
  3692.  
  3693. FORMAT         WORD od_edit_str(char *pszInput, char *pszFormat, INT nRow,
  3694.                   INT nColumn, BYTE btNormalColor, BYTE btHighlightColor,
  3695.                   char chBlank, WORD nFlags);
  3696.  
  3697.  
  3698. RETURNS        This function will return one of the following values:
  3699.  
  3700.                EDIT_RETURN_ERROR        Indicates that an error has occurred,
  3701.                                         and the edit function was unable to
  3702.                                         run. This will occur if there is an
  3703.                                         error in one of the parameters, or if
  3704.                                         ANSI/AVATAR/RIP graphics is not
  3705.                                         available
  3706.  
  3707.                EDIT_RETURN_CANCEL       Indicates that the user pressed the
  3708.                                         cancel key [ESC], and that the string
  3709.                                         was left unaltered.
  3710.  
  3711.                EDIT_RETURN_ACCEPT       Indicates that the user pressed the
  3712.                                         accept key [Enter], or that the auto-
  3713.                                         enter feature was activated.
  3714.  
  3715.                EDIT_RETURN_PREVIOUS     Indicates that the user wishes to move
  3716.                                         to the previous field, by pressing [UP
  3717.                                         ARROW], [SHIFT]-[TAB], etc.
  3718.  
  3719.                EDIT_RETURN_NEXT         Indicates that the user wishes to move
  3720.                                         to the next field, by pressing [DOWN
  3721.                                         ARROW], [TAB], etc.
  3722.  
  3723.  
  3724. DESCRIPTION    To perform string input within OpenDoors, one of two functions
  3725.                can be used, od_input_str() and od_edit_str(). The first
  3726.                function, od_input_str(), allows simple line input and editing,
  3727.                and can be used in ASCII, ANSI, AVATAR and RIP modes. The second
  3728.                function, od_edit_str(), allows many formatted input options,
  3729.                advanced line editing, and other features, but requires the use
  3730.                of ANSI, AVATAR or RIP terminal modes.
  3731.  
  3732.                As mentioned above, the od_edit_str() function allows for
  3733.                advanced line editing, such as inputting and deleting text from
  3734.                the middle of the string (whereas the od_input_str() function
  3735.                only allows editing from the end of the string, such as
  3736.                backspacing to erase a mistake). The edit functions available
  3737.                from the od_edit_str() are listed below. Note that some of these
  3738. ===============================================================================
  3739. OpenDoors 6.00 Manual                                           End of Page 68
  3740.  
  3741.                functions may or may not be available, depending upon the
  3742.                capabilities of the user's terminal program. While there is no
  3743.                single standard used for the transmission of special edit keys
  3744.                such as the arrow keys, the od_edit_str() function makes as much
  3745.                effort as possible to make all of the edit features available to
  3746.                most terminal programs. Many of the edit functions can be
  3747.                accesses using either [CONTROL]-key combinations or special keys
  3748.                such as the arrow keys, delete key, and so on. OpenDoors will
  3749.                recognize most of these special control keys when sent as either
  3750.                an ANSI control sequence (which is sent by most terminal
  3751.                programs), or as a DoorWay style scan code / ASCII code sequence
  3752.                (which is also available from many terminal programs, but is not
  3753.                usually required). The od_edit_str() edit functions are as
  3754.                follows. Note that all edit functions are always available from
  3755.                the local keyboard.
  3756.  
  3757.                HOME - Moves the cursor to the beginning of the line being
  3758.                          edited. Press the [HOME] key, either in DoorWay mode
  3759.                          or from the local keyboard.
  3760.  
  3761.                END - Moves the cursor to the end of the line being edited.
  3762.                          Press the [END] key, either in DoorWay mode or from
  3763.                          the local keyboard.
  3764.  
  3765.                DELETE CHARACTER - Deletes the character under the cursor. Press
  3766.                          [DELete] on the local keyboard, in DoorWay mode, and
  3767.                          under many terminal programs without DoorWay mode.
  3768.                          Alternatively, press [CONTROL]-[G].
  3769.  
  3770.                BACKSPACE - Deletes the character left of the cursor. Press
  3771.                          [BACKSPACE] or [CONTROL]-[H].
  3772.  
  3773.                TOGGLE INSERT MODE - Switches the od_edit_str() function between
  3774.                          insert mode and overwrite mode. Press [INSert], either
  3775.                          in DoorWay mode, or from the local keyboard.
  3776.                          Alternatively, press [CONTROL]-[V].
  3777.  
  3778.                CURSOR LEFT - Moves the cursor left one character. Press [LEFT
  3779.                          ARROW] on the local keyboard, in DoorWay mode, and
  3780.                          under many terminal programs without DoorWay mode.
  3781.                          Alternatively, press [CONTROL]-[S].
  3782.  
  3783.                CURSOR RIGHT - Moves the cursor right one character. Press
  3784.                          [RIGHT ARROW] on the local keyboard, in DoorWay mode,
  3785.                          and under many terminal programs without DoorWay mode.
  3786.                          Alternatively, press [CONTROL]-[D].
  3787.  
  3788.                ERASE ENTIRE LINE - Press [CONTROL]-[Y].
  3789.  
  3790.                ACCEPT INPUT - Press the [ENTER] / [RETURN] line to accept the
  3791.                          input. Alternatively, press [CONTROL]-[Z]. Note that
  3792.                          this key will only work when the current input is
  3793. ===============================================================================
  3794. OpenDoors 6.00 Manual                                           End of Page 69
  3795.  
  3796.                          "valid" (ie, it conforms to the format string, which
  3797.                          is described below)
  3798.  
  3799.                CANCEL INPUT - Only available if specifically enabled on the
  3800.                          od_edit_str() command line. Press [ESCape].
  3801.  
  3802.                NEXT FIELD - If enabled, allows the user to move to the next
  3803.                          field in a dialog box / form. Press [DOWN ARROW] in
  3804.                          DoorWay mode and under many terminal programs without
  3805.                          DoorWay mode. Alternatively, press [TAB]. Note that
  3806.                          the [DOWN ARROW] key is NOT usually available from the
  3807.                          local keyboard, as it is usually used to adjust the
  3808.                          user's remaining time.
  3809.  
  3810.                PREVIOUS FIELD - If enabled, allows the user to move to the
  3811.                          previous field in a dialog box / form. Press [UP
  3812.                          ARROW] in DoorWay mode and under many terminal
  3813.                          programs without DoorWay mode. Alternatively, press
  3814.                          [SHIFT]-[TAB] on the local keyboard or in DoorWay
  3815.                          mode. Again, note that the [UP ARROW] key is NOT
  3816.                          usually available from the local keyboard, as it is
  3817.                          usually used to adjust the user's remaining time.
  3818.  
  3819.  
  3820.                Let us now look at the parameters which the od_edit_str()
  3821.                function accepts. The first parameter, pszInput, is a pointer to
  3822.                the string where the user's input should be stored. It is
  3823.                important that this string be long enough to accommodate the
  3824.                longest input your format string will permit, including the '\0'
  3825.                C string terminator (ie, the string should be one character
  3826.                greater than the length of the format string, not including the
  3827.                format string's ' and " characters).
  3828.  
  3829.                The second parameter, pszFormat, is a pointer to a string which
  3830.                specifies the format and maximum length of the input the
  3831.                od_edit_str() function should accept. Using the format string,
  3832.                not only do you specify the length of the input field, but you
  3833.                can also force the user's input into certain formats. For
  3834.                example, if you wished to input a North American style phone
  3835.                number, you could use a format string of "###-###-####". Then
  3836.                regardless of whether the user typed any dash character or not,
  3837.                their input would be converted, as they type, to the format of
  3838.                the phone number 613-599-5554. You could also specify a format
  3839.                string such of "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", which would
  3840.                permit the user to enter a name of up to 30 characters. Note
  3841.                that since the cursor can be moved to the position immediately
  3842.                following the last character, a the input field for a 30
  3843.                character string will occupy 31 columns on the screen. The
  3844.                od_edit_str() function would then automatically capitalize the
  3845.                name, so that the first character of each word is capitalized,
  3846.                and the remain characters of the word is in lower case. Even if
  3847.                the user were to move the cursor to the middle of the string
  3848. ===============================================================================
  3849. OpenDoors 6.00 Manual                                           End of Page 70
  3850.  
  3851.                they had entered, and add or delete a space (and thus either
  3852.                make one work two or two words one), od_edit_str() would re-
  3853.                format the string to reflect the change. The valid characters
  3854.                for the format sting, along with their meanings, are listed
  3855.                below. Note that the format string is NOT case sensitive (except
  3856.                for literal strings delimited by the '' or "" characters), and
  3857.                space characters can be added at any point to increase
  3858.                legibility.
  3859.  
  3860.                #    Indicates that numeric characters from '0' to '9' are valid
  3861.                     for this position
  3862.  
  3863.                %    Indicates that numeric characters from '0' to '9', and the
  3864.                     space character (' ') are valid for this position.
  3865.  
  3866.                9    Indicates that numeric characters from '0' to '9', along
  3867.                     with '.', '-' and '+' are valid for this position. This
  3868.                     format style is intended for floating-point numeric input.
  3869.  
  3870.                ?    Indicates that any character is valid for this position.
  3871.  
  3872.                *    Indicates that any printable character, from ASCII 32 to
  3873.                     ASCII 127, is valid for this position.
  3874.  
  3875.                A    Indicates that alphabetical characters 'A' to 'Z', 'a' to
  3876.                     'z' and space (' ') are valid for this position.
  3877.  
  3878.                C    Indicates that city name characters are valid for this
  3879.                     position. As with the 'M' format character, words are
  3880.                     automatically capitalized so that the first letter is in
  3881.                     upper case, and all subsequent letters are in lower case.
  3882.                     In addition to permitting alphabetical characters and the
  3883.                     space (' ') character, the ',' and '.' characters are also
  3884.                     accepted in this position.
  3885.  
  3886.                D    Indicates that date characters '0' to '9', '-' and '/' are
  3887.                     valid for this position.
  3888.  
  3889.                F    Indicates that MS-DOS filename characters are valid for
  3890.                     this position.
  3891.  
  3892.                H    Indicates that hexidecimal character '0' to '9', 'A' to 'F'
  3893.                     and 'a' to 'f' are valid for this position.
  3894.  
  3895.                L    Indicates that only lower case alphabetical characters 'a'
  3896.                     to 'z', and the space (' ') character is valid for this
  3897.                     position. However, if the user attempts to enter an upper
  3898.                     case alphabetical character in this position, it will
  3899.                     automatically be converted to the lower case equivalent.
  3900.  
  3901.                M    Indicates that name characters are valid for this position.
  3902.                     These characters are the alphabetical characters 'A' to
  3903. ===============================================================================
  3904. OpenDoors 6.00 Manual                                           End of Page 71
  3905.  
  3906.                     'Z', 'a' to 'z', and the space character (' '). A
  3907.                     character's case is converted such that the first character
  3908.                     of a word is in upper case, and all other letters are in
  3909.                     lower case.
  3910.  
  3911.                T    Indicates that telephone number character '0' to '9', '(',
  3912.                     ')', '-' and ' ' are valid for this position.
  3913.  
  3914.                U    Indicates that only upper case alphabetical characters 'A'
  3915.                     to 'Z', and the space (' ') character is valid for this
  3916.                     position. However, if the user attempts to enter a lower
  3917.                     case alphabetical character in this position, it will
  3918.                     automatically be converted to the upper case equivalent.
  3919.  
  3920.                W    Indicates that MS-DOS filename characters are permitted in
  3921.                     this position, including the '*' and '?' wildcard
  3922.                     characters.
  3923.  
  3924.                X    Indicates that alphanumeric characters 'A' to 'Z', 'a' to
  3925.                     'z', '0' to '9' and ' ' are valid for this position.
  3926.  
  3927.                Y    Indicates that yes/no characters 'Y', 'N', 'y', 'n' are
  3928.                     valid for this position. The characters are automatically
  3929.                     converted to upper case.
  3930.  
  3931.                '/"  Single or double quotes can be used to specify sequences of
  3932.                     characters that should appear at the same location in the
  3933.                     input string (referred to elsewhere as "literal strings").
  3934.                     When the user is entering the string, these characters are
  3935.                     automatically supplied, and the user is not required to
  3936.                     type them. Literal strings must begin and end with the same
  3937.                     quote character. Remember that the double quote (")
  3938.                     character must be imbedded in C strings by preceding the
  3939.                     quote character with a \ (backslash) character.
  3940.  
  3941.                The third and fourth parameters, nRow and nColumn specify the
  3942.                location on the screen where the first (left most) character of
  3943.                the input field should be located. These parameters are
  3944.                identical to the nRow and nColumn parameters passed to the
  3945.                od_set_cursor() function. In other words, nRow specifies the
  3946.                line number on the screen, where 1 is the first line, and
  3947.                nColumn specifies the column across the screen, where 1 is the
  3948.                first column.
  3949.  
  3950.                The fifth and sixth parameters, btNormalColor and
  3951.                btHighlightColor, allow you to specify the color of the input
  3952.                field. The fifth parameter, btNormalColor, specifies the color
  3953.                of the input field when input is not taking place and the sixth
  3954.                parameter, btHighlightColor, specifies the color of the field
  3955.                while input is taking place. Thus, if you had several input
  3956.                fields on the screen at one time, you would be able to make is
  3957.                easier for the user to identify the currently active field by
  3958. ===============================================================================
  3959. OpenDoors 6.00 Manual                                           End of Page 72
  3960.  
  3961.                having the field currently accepting input highlighted in a
  3962.                color distinct from the other fields. When the od_edit_str()
  3963.                function begins, it will change the current color of the field
  3964.                from the normal color to the highlighted color. Then, when the
  3965.                od_edit_str() function exits, it will change the current color
  3966.                of the field back to its normal color. If you do not wish to
  3967.                have the field highlighted, you can set both of these parameters
  3968.                to the same value, and disable field re-drawing by using the
  3969.                eighth parameter, flags.
  3970.  
  3971.                The seventh parameter accepted by the od_edit_str() function,
  3972.                chBlank, will serve one of two purposes. Normally, this
  3973.                parameter will specify a background character to display in the
  3974.                unfilled portion at the end of the input field. This can be set
  3975.                to a character, such as the ASCII 177 grey block character, to
  3976.                produce a visual background to the field. Doing this will show
  3977.                the user visually how long the field is, and how many character
  3978.                they will be permitted to type into the field. Normally, this
  3979.                field will be displayed during input, and removed when the
  3980.                od_edit_str() function exits. However, you may cause the
  3981.                background to remain in place using the eighth parameter, flags.
  3982.                If you do not wish to have this "background" visual field
  3983.                effect, simply set the character parameter to a space (ASCII
  3984.                32). In password input mode, this parameter will instead specify
  3985.                the character to display in place of characters typed by the
  3986.                user. In this case, the background display character defaults to
  3987.                the space (ASCII 32) character.
  3988.  
  3989.                The eighth, and last, parameter accepted by the od_edit_str()
  3990.                function is the nFlags parameter. This parameter is a bit-mapped
  3991.                flags variable which allows you to control special features of
  3992.                the od_edit_str() function. More than one of these settings may
  3993.                be specified by listing a chain of the values, separated by the
  3994.                bitwise-or (|) operator. If you do not wish to turn on any of
  3995.                these modes, simply pass the EDIT_FLAG_NORMAL value as the flags
  3996.                parameter.
  3997.  
  3998.                EDIT_FLAG_NORMAL - Default setting, use this value of none of
  3999.                          the other flags below are active.
  4000.  
  4001.                EDIT_FLAG_NO_REDRAW - When set, prevents the od_edit_str()
  4002.                          function from re-drawing the input string and field
  4003.                          when it starts up and exits. If you set this flag, the
  4004.                          normal color and highlight color should contain the
  4005.                          same value. If background character (the character
  4006.                          parameter) is not a space (ASCII 32) character, you
  4007.                          must draw the field background prior to calling
  4008.                          od_edit_str(). Also, if you are calling od_edit_str()
  4009.                          with the EDIT_FLAG_EDIT_STRING flag set, you must
  4010.                          display the existing string in the field prior to
  4011.                          calling od_edit_str().
  4012.  
  4013. ===============================================================================
  4014. OpenDoors 6.00 Manual                                           End of Page 73
  4015.  
  4016.                EDIT_FLAG_FIELD_MODE - Setting this flag specifies that
  4017.                          od_edit_str() should operate in field input mode. In
  4018.                          field input mode, the user may finish entering their
  4019.                          input by pressing the previous field or next field
  4020.                          button (arrow keys, tab keys, etc.), as described
  4021.                          above. If the user chooses to finish and accept their
  4022.                          input by pressing one of these keys, the od_edit_str()
  4023.                          return value will reflect which choice they made. This
  4024.                          will allow you to make it possible for the user to
  4025.                          move between a number of input fields in a form /
  4026.                          dialog box, as demonstrated in the example
  4027.                          accompanying the od_draw_box() function.
  4028.  
  4029.                EDIT_FLAG_EDIT_STRING - Setting this flag specifies that
  4030.                          od_edit_str() should edit a pre-existing string,
  4031.                          instead of starting with a blank string. In this case,
  4032.                          the input_string parameter MUST point to an
  4033.                          initialized string. This string may either contain
  4034.                          some text, or be empty, but od_edit_str() will expect
  4035.                          to find a string terminator ('\0') character, and will
  4036.                          begin editing the contents of the string prior to that
  4037.                          character. If you do not set the EDIT_FLAG_EDIT_STRING
  4038.                          flag, the previous contents of the input_string
  4039.                          parameter is not significant, as od_edit_str() will
  4040.                          automatically start with a blank string.
  4041.  
  4042.                EDIT_FLAG_STRICT_INPUT - Setting this flag causes the
  4043.                          od_edit_str() function to operate in "strict" input
  4044.                          mode, which may be desirable if your input format
  4045.                          contains more than one type of input. Normally, if you
  4046.                          were inputting such a string, the user would be able
  4047.                          to move to the middle of the string, and insert any
  4048.                          text. Doing so would cause the rest of the input line
  4049.                          to shift right. However, in cases where your format
  4050.                          string specifies different types of character to be
  4051.                          permitted in different positions, this can cause the
  4052.                          input to be changed so that it no longer conforms to
  4053.                          the format string. In this case, the user's input will
  4054.                          no longer be valid, and the user will not be able to
  4055.                          exit the function by pressing [ENTER] (although
  4056.                          [ESCAPE] will still be available, if you activated it)
  4057.                          until they change their input. However, when strict
  4058.                          input mode is turned on, od_edit_str() will restrict
  4059.                          the ways in which the user is permitted to edit the
  4060.                          string, to prevent just such a case from occurring.
  4061.  
  4062.                EDIT_FLAG_PASSWORD_MODE - Setting this flag causes the
  4063.                          od_edit_str() function to operate in "password" mode.
  4064.                          In password mode, the characters typed by the user
  4065.                          will be hidden, displayed instead as the blank
  4066.                          character specified in the "character" parameter.
  4067.  
  4068. ===============================================================================
  4069. OpenDoors 6.00 Manual                                           End of Page 74
  4070.  
  4071.                EDIT_FLAG_ALLOW_CANCEL - When this flag is set, the user will be
  4072.                          able to cancel their current input and abort the
  4073.                          editing process by pressing their [ESCAPE] key. When
  4074.                          they do so, any changes they have made to the input
  4075.                          field will be canceled, and replaced by the original
  4076.                          contents of the string. The od_edit_str() function
  4077.                          will then exit, indicating that the user has canceled
  4078.                          their input.
  4079.  
  4080.                EDIT_FLAG_FILL_STRING - When set, this flag will force the user
  4081.                          to enter a string that fills the entire length of the
  4082.                          format string. Normally, the user will be able to
  4083.                          enter a string of any length up to the maximum length
  4084.                          specified by the format string. However in some cases,
  4085.                          such as when inputting a date, you will want to have
  4086.                          the input field filled. (Otherwise, the user would be
  4087.                          able to enter only the first part of the date.)
  4088.  
  4089.                EDIT_FLAG_AUTO_ENTER - When set, this flag will cause the
  4090.                          od_edit_str() function to automatically simulate
  4091.                          pressing of the [ENTER] key when the string is filled.
  4092.                          This can be used to cause the od_edit_str() function
  4093.                          to finish inputting as soon as a valid string is
  4094.                          entered, instead of having to wait for the user to
  4095.                          press [ENTER] / [RETURN].
  4096.  
  4097.                EDIT_FLAG_AUTO_DELETE - When set, along with the
  4098.                          EDIT_FLAG_EDIT_STRING flag, this flag will activate
  4099.                          the auto-delete feature of the od_edit_str() function.
  4100.                          When auto-delete is active, if the first key pressed
  4101.                          by the user is not an edit control key, the existing
  4102.                          text will automatically be deleted, and a totally new
  4103.                          string accepted from the user. This could be useful
  4104.                          when you are allowing the user to go back to edit a
  4105.                          previous input. If the user wishes to only change part
  4106.                          of the old string, they can move the cursor to the
  4107.                          location where they wish to make the change, and
  4108.                          perform their editing. However, if the user wishes to
  4109.                          completely replace the old string with a new one, they
  4110.                          can simply begin to type, and the old string will
  4111.                          automatically be deleted, and the new string accepted.
  4112.  
  4113.                EDIT_FLAG_KEEP_BLANK - Normally, OpenDoors will only display the
  4114.                          input field background (as passed in the "character"
  4115.                          parameter) while the user is editing the string, and
  4116.                          will remove it when the od_edit_str() function exits.
  4117.                          However, you may wish to continue having this field
  4118.                          displayed after input has taken place, and the
  4119.                          od_edit_str() function has exited. In this case,
  4120.                          setting this flag will cause the background characters
  4121.                          to remain visible after input has finished.
  4122.  
  4123. ===============================================================================
  4124. OpenDoors 6.00 Manual                                           End of Page 75
  4125.  
  4126.                EDIT_FLAG_PERMALITERAL - When the format string contains literal
  4127.                          characters (such as forcing a ':' character to be
  4128.                          added to a time input by using the format string
  4129.                          "##':'##':'##"), the od_edit_str() function can
  4130.                          operate in one of two modes. In the default mode, the
  4131.                          literal characters will only be displayed when they
  4132.                          have been automatically added to the string. For
  4133.                          instance, if you were inputting the current time using
  4134.                          the above format string, this mode would result in the
  4135.                          input field initially being blank. When the user types
  4136.                          the first digit of the time, that number would appear.
  4137.                          When the user types the second digit of the time, that
  4138.                          number will appear, and then the colon character will
  4139.                          automatically be added by OpenDoors. However, you can
  4140.                          also set the od_edit_str() function to operate in
  4141.                          "PermaLiteral" mode, by setting this flag. When the
  4142.                          EDIT_FLAG_PERMALITERAL flag is set, the input field
  4143.                          will initially contain the literal characters (ie, the
  4144.                          colons in our example), with the cursor still located
  4145.                          at the leftmost position in the input field. In this
  4146.                          mode, the literal character become a permanent part of
  4147.                          the input field, and can not be moved or deleted by
  4148.                          the user - instead the cursor simply skips over the
  4149.                          literal character's position.
  4150.  
  4151.                EDIT_FLAG_LEAVE_BLANK - This flag applies to the special case
  4152.                          where the first character or characters of the format
  4153.                          string are literals. By default, the od_edit_str()
  4154.                          function will always return a string containing at
  4155.                          least these first literal characters. However, you can
  4156.                          alter this behaviors by setting this flag. When set,
  4157.                          if no non-literal characters have been entered in the
  4158.                          string, od_edit_str() will return an empty string.
  4159.  
  4160.                EDIT_FLAG_SHOW_SIZE - Normally, od_edit() adds an extra blank to
  4161.                          the end of the input field, to give the cursor a space
  4162.                          to move into when the field is full. However, you may
  4163.                          prefer to have the input field be shown as exactly the
  4164.                          maximum size of input that is permitted. Setting
  4165.                          EDIT_FLAG_SHOW_SIZE does just this. In this case, the
  4166.                          cursor will be positioned immediately past the end of
  4167.                          the input field when the maximum number of characters
  4168.                          have been entered.
  4169.  
  4170.  
  4171. SEE ALSO       od_input_str(), od_get_char(), od_clear_keybuffer()
  4172.  
  4173.  
  4174. EXAMPLE        Below are several examples of typical uses of the od_edit_str()
  4175.                function. For the sake of simplicity, all of these examples
  4176.                perform their input beginning at the top, left hand corner of
  4177.                the screen, and store the user's input in the string variable
  4178. ===============================================================================
  4179. OpenDoors 6.00 Manual                                           End of Page 76
  4180.  
  4181.                named "string". For an example of the user of the od_edit_str()
  4182.                function in a dialog-box / form entry application, see the
  4183.                example accompanying the od_draw_box() function.
  4184.  
  4185.                To input a name with a maximum of 25 characters, having the
  4186.                first letter of each word automatically capitalized:
  4187.  
  4188.                         od_edit_str(string, "MMMMMMMMMMMMMMMMMMMMMMMMM", 1, 1,
  4189.                                     0x03, 0x21, 176, EDIT_FLAG_NORMAL);
  4190.  
  4191.                To input a North American style phone number, requiring that all
  4192.                digits be filled, and running in "strict input" mode:
  4193.  
  4194.                         od_edit_str(string, "###'-'###'-'####",
  4195.                                     1, 1, 0x03, 0x21, 176,
  4196.                                     EDIT_FLAG_FILL_STRING|
  4197.                                     EDIT_FLAG_STRICT_INPUT);
  4198.  
  4199.                To allow the user to edit a previously entered 20 character
  4200.                string, with auto-delete mode on. Any characters will be
  4201.                permitted in the string. Remember that when the
  4202.                EDIT_FLAG_EDIT_STRING flag is set, the string must be
  4203.                initialized prior to calling the od_edit_str() function.
  4204.  
  4205.                         od_edit_str(string, "????????????????????",
  4206.                                     1, 1, 0x03, 0x21, 176,
  4207.                                     EDIT_FLAG_EDIT_STRING|
  4208.                                     EDIT_FLAG_AUTO_DELETE);
  4209.  
  4210.  
  4211.                To input a password of up to 16 characters from the user. Here,
  4212.                the password will only be permitted to contain upper case
  4213.                characters, and the od_edit_str() password mode is used, with a
  4214.                small block displayed in place of any characters typed:
  4215.  
  4216.                          od_edit_str(string, "UUUUUUUUUUUUUUUU",
  4217.                                      1, 1, 0x03, 0x21, 254,
  4218.                                      EDIT_FLAG_PASSWORD_MODE);
  4219.  
  4220.                To input a two-digit number from the user, requiring that both
  4221.                digits be filled, and automatically accepting the input after
  4222.                the two digits have been entered (not requiring the user to
  4223.                press [ENTER]):
  4224.  
  4225.                         od_edit_str(string, "##", 1, 1, 0x03, 0x21, 176,
  4226.                                     EDIT_FLAG_FILL_STRING|
  4227.                                     EDIT_FLAG_AUTO_ENTER);
  4228.  
  4229.                To input a filename to download, as a field in a dialog box.
  4230.                Here, the filename will be permitted to contain valid filename
  4231.                characters, and the od_input_str() function will operate in
  4232.                field mode, with the cancel [ESCape] key enabled. Also, string
  4233. ===============================================================================
  4234. OpenDoors 6.00 Manual                                           End of Page 77
  4235.  
  4236.                edit mode will be enabled, allowing the user to edit a
  4237.                previously entered line, and the EDIT_FLAG_KEEP_BLANK flag will
  4238.                be set, causing the field background to remain displayed after
  4239.                the user exits. This time, however, auto-delete mode will not be
  4240.                used. Note that this combination of parameters expects that the
  4241.                field and it's contents will have already been displayed, prior
  4242.                to calling the od_edit_str() function.
  4243.  
  4244.                         od_edit_str(string, "WWWWWWWWWWWW",
  4245.                                     1, 1, 0x03, 0x21, 176,
  4246.                                     EDIT_FLAG_EDIT_STRING|
  4247.                                     EDIT_FLAG_FIELD_MODE|
  4248.                                     EDIT_FLAG_ALLOW_CANCEL|
  4249.                                     EDIT_FLAG_KEEP_BLANK);
  4250.  
  4251.                To input a string without the field background and line
  4252.                redrawing before and after input takes place:
  4253.  
  4254.                         od_edit_str(string, "******************************",
  4255.                                     1, 1, 0x07, 0x07, ' ',
  4256.                                     EDIT_FLAG_NO_REDRAW);
  4257.  
  4258.                To input a date, using PermaLiteral mode. Here, the month is
  4259.                entered by a three digit short form ("JAN", "FEB", etc.), and
  4260.                the literal characters such as the '-' and the "19" are a
  4261.                permanent part of the input field:
  4262.  
  4263.                         od_edit_str(string,"UUU'-'##'-19'##",
  4264.                                     1, 1, 0x03, 0x21, 176,
  4265.                                     EDIT_FLAG_PERMALITERAL|
  4266.                                     EDIT_FLAG_FILL_STRING);
  4267.  
  4268.  
  4269.  
  4270.  
  4271.  
  4272.  
  4273.  
  4274.  
  4275.  
  4276.  
  4277.  
  4278.  
  4279.  
  4280.  
  4281.  
  4282.  
  4283.  
  4284.  
  4285.  
  4286.  
  4287.  
  4288. ===============================================================================
  4289. OpenDoors 6.00 Manual                                           End of Page 78
  4290.  
  4291. OD_EXIT()
  4292. -------------------------------------------------------------------------------
  4293.  
  4294. PURPOSE        The OpenDoors program termination function
  4295.  
  4296.  
  4297. FORMAT         void od_exit(INT nErrorLevel, BOOL bTermCall);
  4298.  
  4299.  
  4300. RETURNS        N/A
  4301.  
  4302.  
  4303. DESCRIPTION    You MUST USE THIS FUNCTION when you want your program to exit.
  4304.                This function will close the serial port, re-write changed
  4305.                information to the door information (drop), call your end-of-
  4306.                program function (if any), and then exit with the errorlevel
  4307.                specified in the first parameter.
  4308.  
  4309.                Also, if the second parameter, bTermCall, is set to TRUE,
  4310.                od_exit() will also log the user off (for options such as
  4311.                logging off within the door - as shown in the example below).
  4312.                This is accomplished by lowering the DTR line to the modem,
  4313.                causing the modem to hangup. When control is returned to the
  4314.                BBS, it will then detect that the user is no longer online, and
  4315.                will carry out its own logoff processing.
  4316.  
  4317.                If you wish for your program to always perform any activities
  4318.                prior to exiting, such as updating or closing data files, you
  4319.                should set a function to be executed from within the od_exit()
  4320.                function. This is accomplished by using the od_control.
  4321.                od_before_exit variable, as described in the section on the
  4322.                OpenDoors control structure in chapter 5. Use of this variable
  4323.                will allow your program to always carry out these activates,
  4324.                even if OpenDoors decides to call the od_exit() function itself,
  4325.                such as when a user hangs up on the door.
  4326.  
  4327.                Note that in special cases, you may use the
  4328.                od_control.od_disable variable to prevent the od_exit() function
  4329.                from re-writing the door information file. Also, you may use the
  4330.                od_control.od_noexit variable to shutdown door operations
  4331.                without actually exiting your program. Both of these variables
  4332.                are described in chapter 5.
  4333.  
  4334.  
  4335. SEE ALSO       od_init()
  4336.  
  4337.  
  4338. EXAMPLE        The example below demonstrates a function which a door could
  4339.                execute when the user chooses to exit the door. This function
  4340.                will ask the user whether they wish to exit the door and return
  4341.                to the BBS, simply logoff of the BBS, or continue using the
  4342.                door. The example function will then call od_exit() if the user
  4343. ===============================================================================
  4344. OpenDoors 6.00 Manual                                           End of Page 79
  4345.  
  4346.                wishes to exit the door, or return control to the function which
  4347.                called it, if the user does not wish to exit:
  4348.  
  4349.                void goodbye(void)
  4350.                {
  4351.                   char pressed;
  4352.                                                   /* Display choices to user */
  4353.                   od_disp_str("You have chosen to exit this door.\n\r");
  4354.                   od_disp_str("Do you wish to:\n\r");
  4355.                   od_disp_str("      [R]eturn to the BBS\n\r");
  4356.                   od_disp_str("      [L]ogoff of the BBS\n\r");
  4357.                   od_disp_str("      [C]ontinue using the door\n\r");
  4358.  
  4359.                   for(;;)              /* loop until user makes valid choice */
  4360.                   {
  4361.                      pressed=od_get_key(TRUE);          /* Get key from user */
  4362.  
  4363.                                /* If user selects R, exit without hanging up */
  4364.                      if(pressed=='R' || pressed=='r') od_exit(40,FALSE);
  4365.  
  4366.                                   /* If user selects L, hangup and then exit */
  4367.                      if(pressed=='L' || pressed=='l') od_exit(41,TRUE);
  4368.  
  4369.                      /* If user selects C, return and allow door to continue */
  4370.                      if(pressed=='C' || pressed=='c') return;
  4371.                   }
  4372.                }
  4373.  
  4374.  
  4375.  
  4376.  
  4377.  
  4378.  
  4379.  
  4380.  
  4381.  
  4382.  
  4383.  
  4384.  
  4385.  
  4386.  
  4387.  
  4388.  
  4389.  
  4390.  
  4391.  
  4392.  
  4393.  
  4394.  
  4395.  
  4396.  
  4397.  
  4398. ===============================================================================
  4399. OpenDoors 6.00 Manual                                           End of Page 80
  4400.  
  4401. OD_GET_ANSWER()
  4402. -------------------------------------------------------------------------------
  4403.  
  4404. PURPOSE        Function to allow the user to respond to a prompt using only
  4405.                certain keys.
  4406.  
  4407.  
  4408. FORMAT         char od_get_answer(char *pszOptions);
  4409.  
  4410.  
  4411. RETURNS        Character that user entered
  4412.  
  4413.  
  4414. DESCRIPTION    This function can be used to get a response from the user, when
  4415.                only particular responses should be accepted. The parameter to
  4416.                the od_get_answer() function is simply a string listing the
  4417.                valid responses. The function will wait until the user selects
  4418.                one of the valid responses, and then return that response. The
  4419.                function is case insensitive, and will return the character in
  4420.                the same case that was supplied to it in the string.
  4421.  
  4422.  
  4423. SEE ALSO       od_get_key(), od_hotkey_menu()
  4424.  
  4425.  
  4426. EXAMPLES       od_get_answer("YN");
  4427.                     - If the user presses 'y', will return 'Y'.
  4428.  
  4429.                od_get_answer("yn");
  4430.                     - If the user presses 'y', will return 'y'.
  4431.  
  4432.                od_get_answer("ABC 123\n\rZ");
  4433.                     - Valid responses will be: [A], [B], [C], [SPACE],
  4434.                       [1], [2], [3], [ENTER], [Z]
  4435.  
  4436.  
  4437.  
  4438.  
  4439.  
  4440.  
  4441.  
  4442.  
  4443.  
  4444.  
  4445.  
  4446.  
  4447.  
  4448.  
  4449.  
  4450.  
  4451.  
  4452.  
  4453. ===============================================================================
  4454. OpenDoors 6.00 Manual                                           End of Page 81
  4455.  
  4456. OD_GET_INPUT()
  4457. -------------------------------------------------------------------------------
  4458.  
  4459. PURPOSE        This function allows a single input event (e.g. keystroke) to be
  4460.                retrieved, optionally translating extended key sequences such as
  4461.                arrow keys and the insert key.
  4462.  
  4463.  
  4464. FORMAT         BOOL od_get_input(tODInputEvent *pInputEvent,
  4465.                   tODMilliSec TimeToWait, WORD wFlags);
  4466.  
  4467.  
  4468. RETURNS        TRUE on success, FALSE if no input event was retrieved.
  4469.  
  4470.  
  4471. DESCRIPTION    Like od_get_key(), od_get_input() can be used to retrieve a
  4472.                single key of input from the user. However, od_get_input() has
  4473.                been designed to be easily extended in future versions of
  4474.                OpenDoors. The information retrieved by this new function is
  4475.                placed in a structure, which contains information on whether the
  4476.                input event was generated by the remote user or the local
  4477.                console, and what type of input event it was. This function also
  4478.                has built-in the ability to recognize and translate the multiple-
  4479.                character sequences that are generated when the user presses
  4480.                extended keys such as arrow keys, insert, delete, etc.
  4481.  
  4482.                The first parameter points to a tODInputEvent structure, which is
  4483.                defined as follows:
  4484.  
  4485.                     typedef struct
  4486.                     {
  4487.                        tODInputEventType EventType;
  4488.                        BOOL bFromRemote;
  4489.                        char chKeyPress;
  4490.                     } tODInputEvent;
  4491.  
  4492.                When od_get_input() successfully retrieves an input event, this
  4493.                structure is filled with information about the input. The
  4494.                EventType member can be either EVENT_CHARACTER (indicating a
  4495.                single character keystroke) or EVENT_EXTENDED_KEY (indicating an
  4496.                extended key, such as an arrow key). In the case of
  4497.                EVENT_CHARACTER, chKeyPress is set to the character that was
  4498.                received. In the case of EVENT_EXTENDED_KEY, chKeyPress is set to
  4499.                one of the following values:
  4500.  
  4501.  
  4502.  
  4503.  
  4504.  
  4505.  
  4506.  
  4507.  
  4508. ===============================================================================
  4509. OpenDoors 6.00 Manual                                           End of Page 82
  4510.  
  4511.                +------------------+---------------+-------------------------+
  4512.                | chKeyPress Value | Meaning       | Control Key Alternative |
  4513.                +------------------+---------------+-------------------------+
  4514.                | OD_KEY_F1        | [F1]          | None                    |
  4515.                | OD_KEY_F2        | [F2]          | None                    |
  4516.                | OD_KEY_F3        | [F3]          | None                    |
  4517.                | OD_KEY_F4        | [F4]          | None                    |
  4518.                | OD_KEY_F5        | [F5]          | None                    |
  4519.                | OD_KEY_F6        | [F6]          | None                    |
  4520.                | OD_KEY_F7        | [F7]          | None                    |
  4521.                | OD_KEY_F8        | [F8]          | None                    |
  4522.                | OD_KEY_F9        | [F9]          | None                    |
  4523.                | OD_KEY_F10       | [F10]         | None                    |
  4524.                | OD_KEY_UP        | [UP ARROW]    | [CTRL]-[E]              |
  4525.                | OD_KEY_DOWN      | [DOWN ARROW]  | [CTRL]-[X]              |
  4526.                | OD_KEY_LEFT      | [LEFT ARROW]  | [CTRL]-[S]              |
  4527.                | OD_KEY_RIGHT     | [RIGHT ARROW] | [CTRL]-[D]              |
  4528.                | OD_KEY_INSERT    | [INSERT]      | [CTRL]-[V]              |
  4529.                | OD_KEY_DELETE    | [DELETE]      | [CTRL]-[G]              |
  4530.                | OD_KEY_HOME      | [HOME]        | None                    |
  4531.                | OD_KEY_END       | [END]         | None                    |
  4532.                | OD_KEY_PGUP      | [PAGE UP]     | None                    |
  4533.                | OD_KEY_PGDN      | [PAGE DOWN]   | None                    |
  4534.                | OD_KEY_SHIFTTAB  | [SHIFT]-[TAB] | None                    |
  4535.                +------------------+---------------+-------------------------+
  4536.  
  4537.                The bFromRemote member of the tODInputEvent structure will be set
  4538.                to TRUE if the input event originated from the remote system, or
  4539.                FALSE if the event originated from the local system.
  4540.  
  4541.                The second parameter, TimeToWait specifies how long the function
  4542.                should wait for input before returning, in milliseconds. A value
  4543.                of 0 causes the function to return immediately if no input is
  4544.                waiting in OpenDoor's internal input buffer. The is equivalent to
  4545.                a value of FALSE being passed to the od_get_key() function. A
  4546.                value of OD_NO_TIMEOUT causes this function to wait and only
  4547.                return after the next input event has been received. This is
  4548.                equivalent to a value of TRUE being passed to the od_get_key()
  4549.                function. An other value specifies the maximum number of
  4550.                milliseconds that od_get_input() should wait for input. If input
  4551.                is received before this time elapses, od_get_key() will return
  4552.                immediately with a value of TRUE, and the tODInputEvent structure
  4553.                will be fill accordingly. If no input is received before this
  4554.                time elapses, od_get_key() will return FALSE. The number of
  4555.                milliseconds to wait is rounded to the nearest 55 milliseconds in
  4556.                the DOS version of OpenDoors.
  4557.  
  4558.                The third parameter allows you to specify flags to further
  4559.                control the behavior of od_get_input(). Normally, this parameter
  4560.                will be set to GETIN_NORMAL. However, you can disable all
  4561.                translation of extended keystrokes by setting this value to
  4562.                GETIN_RAW. In this mode, od_get_input() works just like
  4563. ===============================================================================
  4564. OpenDoors 6.00 Manual                                           End of Page 83
  4565.  
  4566.                od_get_key(), returning every individual character received from
  4567.                the remote system.
  4568.  
  4569.                Since extended keys are not directly supported by all terminal
  4570.                programs, od_get_input() provides alternatives for some of the
  4571.                extended keys, in the form of control-key combinations. The
  4572.                control key combinations recognized by od_get_input() are listed
  4573.                in the table above. However, these control key alternatives can
  4574.                be ignored by setting the GETIN_RAWCTRL flag.
  4575.  
  4576.                The od_get_input() function is used internally by
  4577.                od_popup_menu(), od_edit_str() and od_multiline_edit().
  4578.  
  4579.  
  4580. SEE ALSO       od_get_key(), od_clear_keybuffer()
  4581.  
  4582.  
  4583. EXAMPLE        The following example shows the structure of how od_get_input()
  4584.                might be used in your program:
  4585.  
  4586.                     tODInputEvent InputEvent;
  4587.                     od_get_input(&InputEvent, OD_NO_TIMEOUT, GETIN_NORMAL);
  4588.                     if(InputEvent.EventType == EVENT_EXTENDED_KEY)
  4589.                     {
  4590.                        switch(InputEvent.chKeyPress)
  4591.                        {
  4592.                           case OD_KEY_UP:
  4593.                              /* The up arrow key has been pressed. */
  4594.                              break;
  4595.                           case OD_KEY_DOWN:
  4596.                              /* The down arrow key has been pressed. */
  4597.                              break;
  4598.                        }
  4599.                     }
  4600.                     else if(InputEvent.EventType == EVENT_CHARACTER)
  4601.                     {
  4602.                        /* A single character key has been pressed, and is  */
  4603.                        /* stored in InputEvent.chKeyPress.                 */
  4604.                     }
  4605.  
  4606.  
  4607.  
  4608.  
  4609.  
  4610.  
  4611.  
  4612.  
  4613.  
  4614.  
  4615.  
  4616.  
  4617.  
  4618. ===============================================================================
  4619. OpenDoors 6.00 Manual                                           End of Page 84
  4620.  
  4621. OD_GET_KEY()
  4622. -------------------------------------------------------------------------------
  4623.  
  4624. PURPOSE        Function to input a key from the user
  4625.  
  4626.  
  4627. FORMAT         char od_get_key(BOOL bWait);
  4628.  
  4629.  
  4630. RETURNS        The next key waiting from the keyboard, or 0 if none.
  4631.  
  4632.  
  4633. DESCRIPTION    This function retrieves the next key waiting in the OpenDoors
  4634.                keyboard buffer (see the description of the od_clear_keybuffer()
  4635.                function, on page 53, for more information on the OpenDoors
  4636.                keyboard buffer). The od_get_key() function allows your door to
  4637.                retrieve both those keystrokes pressed by the user, and the
  4638.                keystrokes pressed on the sysop keyboard (other than the sysop
  4639.                function keys), in the sequence they were pressed. Since input
  4640.                is accepted from both sources, it is possible for the sysop, as
  4641.                well as the remote user, to make selections and control the
  4642.                door.
  4643.  
  4644.                Door input with OpenDoors can be accomplished with this
  4645.                function, with the od_input_str() function or with the
  4646.                od_edit_str() function. The od_input_str() and od_edit_str()
  4647.                functions is used to input an entire sequence of characters from
  4648.                the user (a string), and requires the user to press the [Enter]
  4649.                key when they are finished typing their input. On the other
  4650.                hand, the od_get_key() function is used to input a single
  4651.                keystroke (one character) from the user, and allows the user to
  4652.                make choices without having to press the enter key.
  4653.  
  4654.                The od_get_key() function accepts a single parameter, which
  4655.                determines whether or not it should wait for the user to press a
  4656.                key, if they have not already done so. If you pass a FALSE value
  4657.                to od_get_key(), then the function will not wait for a key to be
  4658.                pressed at the keyboard, but instead return a 0 if there are no
  4659.                keys waiting in the buffer. If you pass a TRUE value to
  4660.                od_get_key(), then this function will instead wait for a key to
  4661.                be pressed. Also, while waiting for the user to press a key, the
  4662.                od_get_key() function will give up the processor to other
  4663.                waiting programs, if you door is running under DesqView.
  4664.  
  4665.                If you are waiting for the user to make a choice from a menu or
  4666.                list of options, you will most likely pass a TRUE to the
  4667.                od_get_key() function, indicating that you wish for it to wait
  4668.                until a key is pressed. However, if you wish to continue other
  4669.                processing if no key is yet available from the keyboard, you
  4670.                should pass a FALSE to the od_get_key() function. For example,
  4671.                if you are displaying a screen of text, and wish to allow the
  4672.                user to pause or abort the display, you would simply call the
  4673. ===============================================================================
  4674. OpenDoors 6.00 Manual                                           End of Page 85
  4675.  
  4676.                od_get_key() function every few moments, passing it a value of
  4677.                FALSE. You would then be able to check if any control keys have
  4678.                been pressed, and if not, continue displaying text.
  4679.  
  4680.                The od_get_key() function returns the ASCII value representing
  4681.                the keystroke that was made. If you are waiting for the user to
  4682.                make a particular choice, perhaps from a menu, you will most
  4683.                likely store the value returned by od_get_key() in a variable of
  4684.                type char. For example:
  4685.  
  4686.                       char key;
  4687.                       ...
  4688.                       key=od_get_key(TRUE);
  4689.  
  4690.                You would then be able to determine which key the user pressed
  4691.                by testing the value of key, either by comparing it's numerical
  4692.                ASCII value, or by comparing it to a character constant. If you
  4693.                are testing for a non-character key, such as [ESCape], [Tab] or
  4694.                [Return], you may wish to use the ASCII value of that key. For
  4695.                example, if you wished to take some action in the case that the
  4696.                user presses the [Enter]/[Return] key, who's ASCII value is 13,
  4697.                you could do:
  4698.  
  4699.                       key=od_get_key(TRUE);        /* Get keypress from user */
  4700.                       if(key==13)             /* If key was [Enter]/[Return] */
  4701.                       {
  4702.                          ...                      /* Whatever you want to do */
  4703.                       }
  4704.  
  4705.                If you wish, instead, to respond to the user pressing a
  4706.                character key (perhaps as a choice from a menu), you can do so
  4707.                by using character constants, such as 'c', '6', or 'F'. Also,
  4708.                when testing for an alphabetical character, you will probably
  4709.                want to check for the user pressing either the upper or lower-
  4710.                case version of the letter. For example, if you wished to have
  4711.                the user press the [Y] key to continue, you could test for
  4712.                either an upper or lower-case Y as follows:
  4713.  
  4714.                        key=od_get_key(TRUE);       /* Get keypress from user */
  4715.                        if(key=='y' || key=='Y')        /* If key was [y]/[Y] */
  4716.                        {
  4717.                           ...                     /* Whatever you want to do */
  4718.                        }
  4719.  
  4720.  
  4721.  
  4722.  
  4723.  
  4724. The charts on the following page lists the decimal value and corresponding
  4725. keystroke(s) of each of the ASCII values from 0 to 127.
  4726.  
  4727.  
  4728. ===============================================================================
  4729. OpenDoors 6.00 Manual                                           End of Page 86
  4730.  
  4731. ASCII  KEYSTROKE                       |  ASCII   KEYSTROKE
  4732. -----  ------------------------------  |  -----   ----------------------
  4733.   0    [Control]-[@]                   |   15     [Control]-[O]
  4734.   1    [Control]-[A]                   |   16     [Control]-[P]
  4735.   2    [Control]-[B]                   |   17     [Control]-[Q]
  4736.   3    [Control]-[C]                   |   18     [Control]-[R]
  4737.   4    [Control]-[D]                   |   19     [Control]-[S]
  4738.   5    [Control]-[E]                   |   20     [Control]-[T]
  4739.   6    [Control]-[F]                   |   21     [Control]-[U]
  4740.   7    [Control]-[G]                   |   22     [Control]-[V]
  4741.   8    [Control]-[H]/[Backspace]       |   23     [Control]-[W]
  4742.   9    [Control]-[I]/[Tab]             |   24     [Control]-[X]
  4743.  10    [Control]-[J]                   |   25     [Control]-[Y]
  4744.  11    [Control]-[K]                   |   26     [Control]-[Z]
  4745.  12    [Control]-[L]                   |   27     [ESCape]
  4746.  13    [Control]-[M]/[Enter]/[Return]  |   32     [SpaceBar]
  4747.  14    [Control]-[N]                   |
  4748.  
  4749.  
  4750.  
  4751. ASCII  KEYSTROKE | ASCII  KEYSTROKE | ASCII  KEYSTROKE | ASCII  KEYSTROKE
  4752. -----  --------- | -----  --------- | -----  --------- | -----  ---------
  4753.  33       '!'    |  57       '9'    |  80       'P'    |  104      'h'
  4754.  34       '"'    |  58       ':'    |  81       'Q'    |  105      'i'
  4755.  35       '#'    |  59       ';'    |  82       'R'    |  106      'j'
  4756.  36       '$'    |  60       '<'    |  83       'S'    |  107      'k'
  4757.  37       '%'    |  61       '='    |  84       'T'    |  108      'l'
  4758.  38       '&'    |  62       '>'    |  85       'U'    |  109      'm'
  4759.  39    '\''  (') |  63       '?'    |  86       'V'    |  110      'n'
  4760.  40       '('    |  64       '@'    |  87       'W'    |  111      'o'
  4761.  41       ')'    |  65       'A'    |  88       'X'    |  112      'p'
  4762.  42       '*'    |  66       'B'    |  89       'Y'    |  113      'q'
  4763.  43       '+'    |  67       'C'    |  90       'Z'    |  114      'r'
  4764.  44       ','    |  68       'D'    |  91       '['    |  115      's'
  4765.  45       '-'    |  69       'E'    |  92    '\\'  (\) |  116      't'
  4766.  46       '.'    |  70       'F'    |  93       ']'    |  117      'u'
  4767.  47       '/'    |  71       'G'    |  94       '^'    |  118      'v'
  4768.  48       '0'    |  72       'H'    |  95       '_'    |  119      'w'
  4769.  49       '1'    |  73       'I'    |  96       '`'    |  120      'x'
  4770.  50       '2'    |  74       'J'    |  98       'b'    |  121      'y'
  4771.  51       '3'    |  75       'K'    |  99       'c'    |  122      'z'
  4772.  52       '4'    |  76       'L'    |  100      'd'    |  123      '{'
  4773.  53       '5'    |  77       'M'    |  101      'e'    |  124      '|'
  4774.  54       '6'    |  78       'N'    |  102      'f'    |  125      '}'
  4775.  55       '7'    |  79       'O'    |  103      'g'    |  126      '~'
  4776.  56       '8'    |                  |                  |  127    [DELete]
  4777.  
  4778.  
  4779.  
  4780.  
  4781.  
  4782.  
  4783. ===============================================================================
  4784. OpenDoors 6.00 Manual                                           End of Page 87
  4785.  
  4786.  
  4787.  
  4788.  
  4789.  
  4790. SEE ALSO       od_get_input(), od_input_str(), od_edit_str(),
  4791.                od_clear_keybuffer()
  4792.  
  4793.  
  4794. EXAMPLE        For examples of the use of the od_get_key() function, see the
  4795.                examples in the description portion, above, and the examples for
  4796.                the od_exit() and od_clear_keybuffer() functions. For further
  4797.                examples of this function, see the example program EX_VOTE.C,
  4798.                described in the section beginning on page 38.
  4799.  
  4800.  
  4801.  
  4802.  
  4803.  
  4804.  
  4805.  
  4806.  
  4807.  
  4808.  
  4809.  
  4810.  
  4811.  
  4812.  
  4813.  
  4814.  
  4815.  
  4816.  
  4817.  
  4818.  
  4819.  
  4820.  
  4821.  
  4822.  
  4823.  
  4824.  
  4825.  
  4826.  
  4827.  
  4828.  
  4829.  
  4830.  
  4831.  
  4832.  
  4833.  
  4834.  
  4835.  
  4836.  
  4837.  
  4838. ===============================================================================
  4839. OpenDoors 6.00 Manual                                           End of Page 88
  4840.  
  4841. OD_GETTEXT()
  4842. -------------------------------------------------------------------------------
  4843.  
  4844. PURPOSE        Stores a rectangular region of the screen in an array, to later
  4845.                be redrawn using od_puttext(). Requires ANSI, AVATAR or RIP
  4846.                modes.
  4847.  
  4848.  
  4849. FORMAT         BOOL od_gettext(INT nLeft, INT nTop, INT nRight, INT nBottom,
  4850.                   void *pBlock);
  4851.  
  4852.  
  4853. RETURNS        TRUE on success
  4854.                FALSE on failure
  4855.  
  4856.  
  4857. DESCRIPTION    This function stores the contents (both text and color
  4858.                information) of the rectangular portion of the screen denoted by
  4859.                the variables nLeft, nTop, nRight and nBottom into the buffer
  4860.                pointed to by pBlock. The saved portion of the screen may then
  4861.                be restored using od_puttext(). The buffer must be large enough
  4862.                to store two bytes for every character in the specified
  4863.                rectangle. In other words, the required size of the buffer, in
  4864.                bytes, is:
  4865.  
  4866.                            length * width * 2
  4867.  
  4868.                The parameters nLeft and nRight are column numbers from 1 to 80,
  4869.                and the parameters nTop and nBottom are row numbers between 1
  4870.                and 23.
  4871.  
  4872.                This function has no effect on the current text color or cursor
  4873.                position. ANSI, AVATAR or RIP mode is required for this
  4874.                function. If you wish to save and restore the entire screen, you
  4875.                may use the od_save_screen() and od_restore_screen() functions,
  4876.                which can be used in all display modes.
  4877.  
  4878.                If this function fails for any reason, a value of FALSE is
  4879.                returned, and the od_control.od_error variable is set to
  4880.                indicate the reason for the failure. For more information on the
  4881.                od_control.od_error variable, see page 185.
  4882.  
  4883.  
  4884. SEE ALSO       od_puttext(), od_save_screen(), od_restore_screen(),
  4885.                od_scroll(), od_window_create(), od_window_remove()
  4886.  
  4887.  
  4888.  
  4889.  
  4890.  
  4891.  
  4892.  
  4893. ===============================================================================
  4894. OpenDoors 6.00 Manual                                           End of Page 89
  4895.  
  4896. OD_HOTKEY_MENU()
  4897. -------------------------------------------------------------------------------
  4898.  
  4899. PURPOSE        Function to display a menu file with hotkeys
  4900.  
  4901.  
  4902. FORMAT         char od_hotkey_menu(char *pszFileName, char *pszHotKeys, BOOL
  4903.                bWait);
  4904.  
  4905.  
  4906. RETURNS        Key pressed in response to menu, or '\0' if none.
  4907.  
  4908.  
  4909. DESCRIPTION    This function can be used to display a menu from an ASCII, ANSI,
  4910.                AVATAR or RIP file, allowing the user to select an option at any
  4911.                time while the menu is being displayed. The od_hotkey_menu()
  4912.                function is quite similar to the od_send_file() function, and
  4913.                you should probably familiarize yourself with that function if
  4914.                you are going to use od_hotkey_menu(). Like od_send_file(),
  4915.                od_hotkey_menu() will display the file specified by pszFileName,
  4916.                using the appropriate terminal emulation. If no extension is
  4917.                provided for the filename, OpenDoors will automatically search
  4918.                for matching files ending in .ASC, .ANS and .AVT extensions.
  4919.                OpenDoors will the select the appropriate file to display, based
  4920.                on the available files and available terminal emulation.
  4921.  
  4922.                The second parameter, pszHotKeys, is a string specifying the
  4923.                valid responses to the menu, in the same format as the string
  4924.                passed to the od_get_answer() function. If any of the characters
  4925.                listed in this string are pressed, either uppercase or lowercase
  4926.                versions, OpenDoors will immediately stop displaying the menu,
  4927.                and return with the value of the key pressed. The case (upper or
  4928.                lower) returned will always be identical to the case used in the
  4929.                hotkeys string. You can include the [ENTER] key as a valid hot
  4930.                key by including the \n character in the hotkey string.
  4931.  
  4932.                The third parameter passed to od_hotkey_menu(), bWait, specifies
  4933.                whether OpenDoors should wait after displaying the menu for the
  4934.                user to make a valid selection from the menu (TRUE), or if it
  4935.                should exit immediately (FALSE). Normally, you will want to use
  4936.                the TRUE value when calling this function. This will allow you
  4937.                to use a single function call that will display the menu and
  4938.                always return the user's selection. If you wish to gain control
  4939.                as soon as OpenDoors has displayed the menu, you may specify
  4940.                FALSE for this parameter. In this case, if the user does not
  4941.                press any of the valid hot keys while the menu is being sent,
  4942.                the function will return the character '\0'.
  4943.  
  4944.  
  4945. SEE ALSO       od_send_file(), od_get_answer()
  4946.  
  4947.  
  4948. ===============================================================================
  4949. OpenDoors 6.00 Manual                                           End of Page 90
  4950.  
  4951. EXAMPLE        As an example of the use of the od_hotkey_menu() function,
  4952.                consider the following code fragment:
  4953.  
  4954.  
  4955.                     for(;;)                             /* Main program loop */
  4956.                     {                  /* Display menu and get user's choice */
  4957.                          char choice=od_hotkey_menu("MAINMENU","123Q",TRUE");
  4958.  
  4959.                          switch(choice)    /* Perform the appropriate action */
  4960.                          {
  4961.                               case '1':
  4962.                                    od_printf("You selected one.\n\r");
  4963.                                    break;
  4964.  
  4965.                               case '2':
  4966.                                    od_printf("You selected two.\n\r");
  4967.                                    break;
  4968.  
  4969.                               case '3':
  4970.                                    od_printf("You selected three.\n\r");
  4971.                                    break;
  4972.  
  4973.                               case 'Q':
  4974.                                    od_exit(FALSE,10);
  4975.                          }
  4976.                     }
  4977.  
  4978.                This is an example of the main menu loop of a simple door that
  4979.                uses the od_hotkey_menu() function. The program will continue
  4980.                executing the for(;;) loop until the user chooses to exit the
  4981.                door. On each iteration of the loop, the od_hotkey_menu()
  4982.                function is called, to display the door's menu from the file
  4983.                MAINMENU.A??. The appropriate .ASC/.ANS/.AVT file will be chosen
  4984.                and displayed as the menu. The possible choices that may be made
  4985.                from the menu are specified by the string "123Q". Thus, whenever
  4986.                the user presses one of the keys [1], [2], [3] or [Q], the
  4987.                od_hotkey_menu() function will return immediately with the value
  4988.                of the key pressed. If the menu is still being displayed at the
  4989.                time when the key was pressed, menu display will cease at that
  4990.                moment. The program then executes a case statement, to respond
  4991.                to the user's key appropriately. If the user presses [1], [2] or
  4992.                [3] this door will output a simple message to the screen. If the
  4993.                user presses the [Q] key, the door will pass control back to the
  4994.                BBS.
  4995.  
  4996.  
  4997.  
  4998.  
  4999.  
  5000.  
  5001.  
  5002.  
  5003. ===============================================================================
  5004. OpenDoors 6.00 Manual                                           End of Page 91
  5005.  
  5006. OD_INIT()
  5007. -------------------------------------------------------------------------------
  5008.  
  5009. PURPOSE        To initialize OpenDoors activities
  5010.  
  5011.  
  5012. FORMAT         void od_init(void);
  5013.  
  5014.  
  5015. RETURNS        N/A
  5016.  
  5017.  
  5018. DESCRIPTION    This function initializes OpenDoors. This function must be
  5019.                called manually if you wish to access data about the user, etc.,
  5020.                before you call any other OpenDoors functions. However, if you
  5021.                do not explicitly call the od_init() function, it will be called
  5022.                automatically on the first call to most other OpenDoors
  5023.                functions. The only functions that should be called before
  5024.                od_init() are od_add_personality() and od_parse_cmd_line(). The
  5025.                od_init() function reads information from the door information
  5026.                file, initializes communications with the modem, displays the
  5027.                status line, and sets up OpenDoors' internal data structures.
  5028.                For more information on what data is and is not available before
  5029.                od_init() has been called, please refer to the chapter on the
  5030.                OpenDoors control structure, which begins on page 148.
  5031.  
  5032.                The od_init() function will read the door information file which
  5033.                is located in the directory specified by the variable
  5034.                od_control.info_path. If this variable has not been set prior to
  5035.                calling the od_init() function, OpenDoors will expect to find
  5036.                the door information file in the current directory. Thus, if you
  5037.                wish your door to be able to be run in a directory other than
  5038.                the BBS system directory, it would be a good idea to allow the
  5039.                sysop using your door to specify the location of the door
  5040.                information file. For an example of setting the
  5041.                od_control.info_path variable, please see the example program
  5042.                located on page 150.
  5043.  
  5044.                Also note that you can prevent the od_init() function from
  5045.                carrying out some of it's normal activities, such as attempting
  5046.                to read a door information file, by the use of the
  5047.                od_control.od_disable variable, as described in the section on
  5048.                the OpenDoors control structure, which begins on page 148.
  5049.  
  5050.  
  5051. SEE ALSO       od_exit()
  5052.  
  5053.  
  5054. EXAMPLE        At times, you may wish to write a door program which will
  5055.                require a maintenance utility to be run on a regular basis. For
  5056.                example, a game door may have to have its system files updated
  5057.                on a daily basis, by having a utility program run in a system
  5058. ===============================================================================
  5059. OpenDoors 6.00 Manual                                           End of Page 92
  5060.  
  5061.                event each day at midnight. One way of accomplishing this would
  5062.                be to have your door package include two .EXE files, one being
  5063.                the actual door program, and the other being a utility program.
  5064.                However, another option would be to have both the door and
  5065.                maintenance functions to be accessible from a single .EXE file,
  5066.                in order to simplify use of the door for the sysop. In this
  5067.                case, you would want to test the command line to determine
  5068.                whether your program should run in door mode or maintenance
  5069.                mode. You would then only execute the od_init() function, along
  5070.                with the rest of your door code, if you program were running in
  5071.                "door mode".
  5072.  
  5073.                The program below demonstrates one method of doing just this. In
  5074.                this case, the program would include two functions, door(),
  5075.                which would carry out all of the door-related activities, and
  5076.                maint(), which would carry out all of the maintenance-related
  5077.                activities. In this simple example, if the command line includes
  5078.                a "-M" or "/M", the program will run in maintenance mode,
  5079.                otherwise it will run in door mode. Also, if it is running in
  5080.                door mode, the program will take the first command-line
  5081.                parameter, if any, as a path to the location of the door
  5082.                information file.
  5083.  
  5084.  
  5085.                #include "opendoor.h"
  5086.  
  5087.                void door(void);
  5088.                void maint(void);
  5089.  
  5090.  
  5091.                int main(int argc, char *argv[])
  5092.                {
  5093.                   int counter;
  5094.  
  5095.                            /* Check any command line parameters for /M or -M */
  5096.                   for(counter=1;counter<argc;++counter)
  5097.                   {
  5098.                      if((argv[counter])[1]=='m' || (argv[counter])[1]=='M')
  5099.                      {
  5100.                         maint();               /* Then carry out maintenance */
  5101.                         exit(20);                                /* And exit */
  5102.                      }
  5103.                   }
  5104.                           /* If there was no -M or /M, then run in door mode */
  5105.  
  5106.                   /* If there are any command-line parameters take the first */
  5107.                                  /* as the path to the door information file */
  5108.                   if(argc>1) strncpy(od_control.info_path,argv[1],59);
  5109.  
  5110.                   od_init();                  /* call the od_init() function */
  5111.                   door();             /* Run the door portion of the program */
  5112.                   od_exit(30,FALSE);                    /* Shutdown the door */
  5113. ===============================================================================
  5114. OpenDoors 6.00 Manual                                           End of Page 93
  5115.  
  5116.                }
  5117.  
  5118.  
  5119.                void maint(void)
  5120.                {
  5121.                   ...               /* Carry out maintenance activities here */
  5122.                }
  5123.  
  5124.  
  5125.                void door(void)
  5126.                {
  5127.                   ...                      /* Carry out door activities here */
  5128.                }
  5129.  
  5130.  
  5131.  
  5132.  
  5133.  
  5134.  
  5135.  
  5136.  
  5137.  
  5138.  
  5139.  
  5140.  
  5141.  
  5142.  
  5143.  
  5144.  
  5145.  
  5146.  
  5147.  
  5148.  
  5149.  
  5150.  
  5151.  
  5152.  
  5153.  
  5154.  
  5155.  
  5156.  
  5157.  
  5158.  
  5159.  
  5160.  
  5161.  
  5162.  
  5163.  
  5164.  
  5165.  
  5166.  
  5167.  
  5168. ===============================================================================
  5169. OpenDoors 6.00 Manual                                           End of Page 94
  5170.  
  5171. OD_INPUT_STR()
  5172. -------------------------------------------------------------------------------
  5173.  
  5174. PURPOSE        Inputs a string from the user
  5175.  
  5176.  
  5177. FORMAT         void od_input_str(char *pszInput, INT nMaxLength,
  5178.                   unsigned char chMin, unsigned char chMax);
  5179.  
  5180.  
  5181. RETURNS        N/A
  5182.  
  5183.  
  5184. DESCRIPTION    To perform string input within OpenDoors, one of two functions
  5185.                can be used, od_input_str() and od_edit_str(). The first
  5186.                function, od_input_str(), allows simple line input and editing,
  5187.                and can be used in ASCII, ANSI, AVATAR and RIP modes. The second
  5188.                function, od_edit_str(), allows many formatted input options,
  5189.                advanced line editing, and other features, but requires the use
  5190.                of ANSI, AVATAR or RIP graphics modes.
  5191.  
  5192.                The od_input_str() function allows you to input a string from
  5193.                the user. The string will be permitted to have up to the number
  5194.                of characters specified by the max_len parameter, and all
  5195.                characters must be between the values of the min_char and
  5196.                max_char parameters. This function will wait until the user
  5197.                presses the [Enter] key to finish inputting the string.
  5198.  
  5199.                The first parameter passed to this function should be a pointer
  5200.                to the string where the user's input should be stored. So, if
  5201.                you wanted to store a string of up to 30 characters inputted by
  5202.                the user, you might define this string as follows:
  5203.  
  5204.                          char input_string[31];
  5205.  
  5206.                Notice here than the string must be long enough to hold the
  5207.                thirty characters which can be entered by the user, along with
  5208.                the additional "null" character which is used to indicate the
  5209.                end of a string in C. Hence, the length of the string should
  5210.                always be at least one greater than the total number of
  5211.                characters the user is permitted to enter, passed in the
  5212.                nMaxLength parameter.
  5213.  
  5214.                The second parameter passed to the od_input_str() function
  5215.                should be an integer value indicating the maximum number of
  5216.                characters which can be input by the user. For example, if this
  5217.                parameter had a value of 10, the user would be able to enter a
  5218.                string containing any number of characters up to and including
  5219.                10 characters. If this parameter had a value of 1, the user
  5220.                would only be able to enter a single character. However, the
  5221.                user would be able to backspace, change the character, and press
  5222.                [Enter] when they were satisfied with their entry. Note that
  5223. ===============================================================================
  5224. OpenDoors 6.00 Manual                                           End of Page 95
  5225.  
  5226.                even if you only ask the od_input_str() function to input a
  5227.                single character, it will still expect a STRING to be passed to
  5228.                it, and will return a string with either zero or one character,
  5229.                followed by a null (string terminator) character.
  5230.  
  5231.                The third and fourth parameters passed to this function allow
  5232.                you to control what characters the user will be permitted to
  5233.                enter as part of the string. For example, you could set the
  5234.                minimum character to the '0' character and the maximum character
  5235.                to the '9' character, permitting the user to only enter numeric
  5236.                characters. On the other hand, you could permit the user to
  5237.                enter all ASCII characters in the range from 32 to 127. The
  5238.                od_input_str() function will permit characters in the range
  5239.                beginning with the character passed as minchar, up to and
  5240.                including the character passed as maxchar.
  5241.  
  5242.  
  5243. SEE ALSO       od_edit_str(), od_get_key(), od_clear_keybuffer()
  5244.  
  5245.  
  5246. EXAMPLE        Below are a number of examples of the use of the od_input_str()
  5247.                function in various applications:
  5248.  
  5249.                  - To input a two character number (only digits from 0-9):
  5250.  
  5251.                         od_input_str(string, 2, '0', '9');
  5252.  
  5253.                  - To input a 35 character name (characters from Space to
  5254.                    ASCII 127):
  5255.  
  5256.                         od_input_str(string, 35, 32, 127);
  5257.  
  5258.  
  5259.  
  5260.  
  5261.  
  5262.  
  5263.  
  5264.  
  5265.  
  5266.  
  5267.  
  5268.  
  5269.  
  5270.  
  5271.  
  5272.  
  5273.  
  5274.  
  5275.  
  5276.  
  5277.  
  5278. ===============================================================================
  5279. OpenDoors 6.00 Manual                                           End of Page 96
  5280.  
  5281. OD_KERNEL()
  5282. -------------------------------------------------------------------------------
  5283.  
  5284. PURPOSE        The OpenDoors Central Control function.
  5285.  
  5286.  
  5287. FORMAT         void od_kernel(void);
  5288.  
  5289.  
  5290. RETURNS        N/A
  5291.  
  5292.  
  5293. DESCRIPTION    In the DOS version of OpenDoors, the od_kernel() function is
  5294.                responsible for many vital OpenDoors tasks, such as monitoring
  5295.                the carrier detect signal, monitoring the amount of time that
  5296.                the user has remaining, updating the status line, responding to
  5297.                sysop hotkeys, and reading characters which are received from
  5298.                the modem. The od_kernel() function is automatically called on a
  5299.                frequent basis by the other OpenDoors functions, so most often
  5300.                you will not need to be concerned with this function. However,
  5301.                in order that OpenDoors can carry out the activities mentioned
  5302.                above with a quick response, it is important that od_kernel(),
  5303.                or some other OpenDoors function be called at least once every
  5304.                second. Thus, if your program will be carrying out some
  5305.                processing, in which it will not be calling any OpenDoors
  5306.                functions for more than a second or so, you should call the
  5307.                od_kernel() function yourself. The example below demonstrates
  5308.                one method of doing just this.
  5309.  
  5310.                Note that if for some reason or other, it is not possible for
  5311.                your program to call the od_kernel() function, or any other
  5312.                OpenDoors functions for a period of several seconds, this will
  5313.                not cause your door to crash or fail in any way. The only
  5314.                problem will be that OpenDoors will not be able to respond to
  5315.                any action, such as the sysop pressing a function key, or the
  5316.                user dropping carrier, until such time as you next call
  5317.                od_kernel(), or some OpenDoors function. Hence, use of the
  5318.                od_kernel() function will improve the quality and response time
  5319.                of your program, but calling it or some OpenDoors function on a
  5320.                regular basis is not absolutely vital.
  5321.  
  5322.                This function has no effect in the Win32 version of OpenDoors.
  5323.  
  5324.  
  5325. SEE ALSO       od_sleep()
  5326.  
  5327.  
  5328.  
  5329.  
  5330.  
  5331.  
  5332.  
  5333. ===============================================================================
  5334. OpenDoors 6.00 Manual                                           End of Page 97
  5335.  
  5336. OD_LIST_FILES()
  5337. -------------------------------------------------------------------------------
  5338.  
  5339. PURPOSE        Lists files in a particular file area (using FILES.BBS)
  5340.  
  5341.  
  5342. FORMAT         BOOL od_list_files(char *pszFileSpec);
  5343.  
  5344.  
  5345. RETURNS        TRUE if successful, FALSE if unsuccessful
  5346.  
  5347.  
  5348. DESCRIPTION    This function allows you to display a list of files available
  5349.                for download from a particular file area, as any BBS system
  5350.                would. The file names and descriptions are taken from the
  5351.                FILES.BBS located in the directory pointed to by pszFileSpec.
  5352.                Thus, to list the files available for download in
  5353.                C:\BBS\FILES\UPLOADS, simply:
  5354.  
  5355.                       od_list_files("C:\\BBS\\FILES\\UPLOADS");
  5356.  
  5357.                OpenDoors uses a third-generation FILES.BBS format, that is
  5358.                compatible with other FILES.BBS formats, but adds some
  5359.                additional features. Each line in the FILES.BBS file lists a
  5360.                filename, along with it's description. Thus, a typical FILES.BBS
  5361.                file might look as follows:
  5362.  
  5363.                         PKZ110.EXE    PKZip file compressor, version 1.10
  5364.                         ODOORS60.ZIP  The newest version of OpenDoors
  5365.                         REC*.ZIP      A Record file
  5366.                         C:\BBS\*.*    All BBS files.
  5367.  
  5368.                When displayed, OpenDoors will list the size of each file found
  5369.                in the FILES.BBS file beside it's name, if the file is found. If
  5370.                the file does not exist, then a "[OFFLINE]" string is displayed
  5371.                in the file size column. Title lines may also be added to the
  5372.                FILES.BBS, by indenting them one or more columns. Thus, you
  5373.                could have something like:
  5374.  
  5375.                            NEWEST UPLOADS
  5376.                            ~~~~~~~~~~~~~~
  5377.                         PKZ110.EXE    PKZip file compressor, version 1.10
  5378.                         ODOORS60.ZIP  The newest version of OpenDoors
  5379.                         REC*.ZIP      A Record file
  5380.                         C:\BBS\*.*    All BBS files.
  5381.  
  5382.                In addition to this standard FILES.BBS format, OpenDoors will
  5383.                also permit wildcards to be used in FILES.BBS filenames (ie
  5384.                FNEWS???.*), or full directory paths to allow files from several
  5385.                different directories to be included in the same files area.
  5386.  
  5387.  
  5388. ===============================================================================
  5389. OpenDoors 6.00 Manual                                           End of Page 98
  5390.  
  5391.                You may alter the colors used to display the various portions of
  5392.                the files list using the od_control variables:
  5393.                          od_control.od_list_title_col
  5394.                          od_control.od_list_name_col
  5395.                          od_control.od_list_size_col
  5396.                          od_control.od_list_comment_col
  5397.                          od_control.od_list_offline_col
  5398.  
  5399.                which are documented in the OpenDoors control structure section
  5400.                on this manual, which begins on page 148.
  5401.  
  5402.  
  5403. SEE ALSO       od_send_file()
  5404.  
  5405.  
  5406.  
  5407.  
  5408.  
  5409.  
  5410.  
  5411.  
  5412.  
  5413.  
  5414.  
  5415.  
  5416.  
  5417.  
  5418.  
  5419.  
  5420.  
  5421.  
  5422.  
  5423.  
  5424.  
  5425.  
  5426.  
  5427.  
  5428.  
  5429.  
  5430.  
  5431.  
  5432.  
  5433.  
  5434.  
  5435.  
  5436.  
  5437.  
  5438.  
  5439.  
  5440.  
  5441.  
  5442.  
  5443. ===============================================================================
  5444. OpenDoors 6.00 Manual                                           End of Page 99
  5445.  
  5446. OD_LOG_WRITE()
  5447. -------------------------------------------------------------------------------
  5448.  
  5449. PURPOSE        Function to write an entry to the log file
  5450.  
  5451.  
  5452. FORMAT         BOOL od_log_write(char *pszMessage);
  5453.  
  5454.  
  5455. RETURNS        TRUE on success, or FALSE on failure
  5456.  
  5457.  
  5458. DESCRIPTION    This function can be used to write entries to the log file. If
  5459.                the logfile has not already been opened when you call this
  5460.                function for the first time, OpenDoors will automatically open
  5461.                the log file at that time.
  5462.  
  5463.                To create an entry in the log file, simply call the
  5464.                od_log_write() function, passing to it the string of the text
  5465.                you wish to write. You should not include any control characters
  5466.                in this string, simply the text that should appear on the line.
  5467.                OpenDoors will automatically format the log file, adding the
  5468.                time information and other control characters. It is recommended
  5469.                that the length of the string passed to od_log_write() not
  5470.                exceed 67 characters, in order that logfile lines will all be
  5471.                less than 80 characters in length.
  5472.  
  5473.                Log file entries do not usually contain periods or other
  5474.                punctuation at the end of the line. Also, log file entries are
  5475.                usually written in the present tense. The first character of the
  5476.                entry is usually upper-case, with all other entries in lower
  5477.                case. Also, since excessive numbers or lengths of log file
  5478.                entries can quickly use a lot of disk space, it is best to think
  5479.                carefully about what events should be recorded in the log file.
  5480.                It is also a good idea to minimize the number of words used in
  5481.                the entry, without being too cryptic. As an example, "User
  5482.                entering options menu" should be used instead of "user entered
  5483.                the options menu."
  5484.  
  5485.  
  5486. SEE ALSO       Page 224.
  5487.  
  5488.  
  5489. EXAMPLE        Calling the od_log_write() function is as simple as follows:
  5490.  
  5491.                     od_log_write("Awarding user with 5 minutes more time");
  5492.  
  5493.  
  5494.  
  5495.  
  5496.  
  5497.  
  5498. ===============================================================================
  5499. OpenDoors 6.00 Manual                                          End of Page 100
  5500.  
  5501. OD_MULTILINE_EDIT()
  5502. -------------------------------------------------------------------------------
  5503.  
  5504. PURPOSE        Provides a multiple line text editor which can be used for
  5505.                entering editing any text that spans more than one line, such as
  5506.                messages or text files.
  5507.  
  5508.  
  5509. FORMAT         INT od_multiline_edit(char *pszBufferToEdit, UINT unBufferSize,
  5510.                   tODEditOptions *pEditOptions);
  5511.  
  5512.  
  5513. RETURNS        OD_MULTIEDIT_SUCCESS on success, or OD_MULTIEDIT_ERROR on
  5514.                failure
  5515.  
  5516.  
  5517. DESCRIPTION    This function provides a text editor with optional word wrap
  5518.                capabilities. This editor can be used for entering or editing
  5519.                text files, messages or other information that spans multiple
  5520.                lines. The editor can be configured to operate in full-screen
  5521.                mode, or to occupy any smaller area of the screen that you
  5522.                specify. It provides the navigation (home / end / page up / arrow
  5523.                keys) features and editing features (insert / overwrite mode,
  5524.                Ctrl-Y to delete a line, etc.) that you would expect.
  5525.  
  5526.                The od_multiline_edit() function is designed to be both easy to
  5527.                use and very flexible. To that end, the function only takes three
  5528.                parameters. The first two parameters are required, and the third
  5529.                parameter is an optional options structure. The first parameter,
  5530.                pszBufferToEdit, is a pointer to the buffer of text to edit. This
  5531.                buffer must always be a '\0'-terminated string. This buffer must
  5532.                be initialized before calling od_multiline_edit(). The second
  5533.                parameter, unBufferSize, indicates the size of the buffer that is
  5534.                passed in pszBufferToEdit. Note that this should be the total
  5535.                amount of space that is available in the buffer for text entered
  5536.                by the user, not the length of data that is actually initially in
  5537.                the buffer. If you do not wish to customize any of the
  5538.                od_multiline_edit() options, then you may simply set the third
  5539.                parameter to 0. Hence, a simple example of how to use
  5540.                od_multiline_edit() is:
  5541.  
  5542.                     char szMyEditBuffer[4000] = "";
  5543.                     od_multiline_edit(szMyEditBuffer, sizeof(szMyEditBuffer),
  5544.                     NULL);
  5545.  
  5546.                If you wish to customize od_multiline_edit(), you should pass a
  5547.                pointer to a tODEditOptions structure as the third parameter. You
  5548.                should initialize this entire structure to zeros before
  5549.                attempting to use it. You can then set any values of this
  5550.                structure which you wish to change from their default. Any values
  5551.                that are left at 0 will automatically revert to their defaults.
  5552.                For example, if you wanted to specify a text format other than
  5553. ===============================================================================
  5554. OpenDoors 6.00 Manual                                          End of Page 101
  5555.  
  5556.                the default, you could create, initialize and pass in a
  5557.                tODEditOptions structure as follows:
  5558.  
  5559.                     char szMyEditBuffer[4000] = "";
  5560.                     tODEditOptions MyEditOptions;
  5561.                     memset(&MyEditOptions, 0, sizeof(MyEditOptions));
  5562.                     MyEditOptions.TextFormat = FORMAT_LINE_BREAKS;
  5563.                     od_multiline_edit(szMyEditBuffer, sizeof(szMyEditBuffer),
  5564.                          &MyEditOptions);
  5565.  
  5566.                The definition of the tODEditOptions structure is as follows:
  5567.  
  5568.                     typedef struct
  5569.                     {
  5570.                        INT nAreaLeft;
  5571.                        INT nAreaTop;
  5572.                        INT nAreaRight;
  5573.                        INT nAreaBottom;
  5574.                        tODEditTextFormat TextFormat;
  5575.                        tODEditMenuResult (*pfMenuCallback)(void *pUnused);
  5576.                        void * (*pfBufferRealloc)(void *pOriginalBuffer,
  5577.                           UINT unNewSize);
  5578.                        DWORD dwEditFlags;
  5579.                        char *pszFinalBuffer;
  5580.                        UINT unFinalBufferSize;
  5581.                     } tODEditOptions;
  5582.  
  5583.                nAreaLeft, nAreaTop, nAreaRight, nAreaBottom allows you to
  5584.                specify the portion of the screen that the text editor should
  5585.                use. This defaults to 1, 1 - 80, 23.
  5586.  
  5587.                TextFormat allows you to specify what format the text should be
  5588.                stored in the buffer using. The default is
  5589.                FORMAT_PARAGRAPH_BREAKS, which specifies that a line break only
  5590.                appears at the end of each paragraph, and that the contents of a
  5591.                paragraph are word wrapped. FORMAT_LINE_BREAKS specifies that a
  5592.                line break appears at the end of each line of text on the screen,
  5593.                and that newly entered text is word wrapped. FORMAT_NO_WORDWRAP
  5594.                is equivalent to FORMAT_LINE_BREAKS, except that newly entered
  5595.                text is not word wrapped. Instead, lines may be arbitrarily long.
  5596.                For each of these text formats, od_multiline_edit() automatically
  5597.                decides whether line breaks should take the form of a carriage
  5598.                return ('\r'), line feed ('\n'), or some combination of these,
  5599.                based on what it sees in the buffer that you supply. If no line
  5600.                breaks are found in the buffer, then the default is to use just a
  5601.                line feed ('\n') character. FORMAT_FTSC_MESSAGE specifies a FTSC-
  5602.                compliant message, such as is used in a *.MSG message file. Among
  5603.                other things, this specifies that carriage returns ('\r') end
  5604.                paragraphs, and that line feeds ('\n') should be ignored.
  5605.  
  5606.                pfMenuCallback allows you to provide a callback function that
  5607.                will be called when the user presses the escape (or control-Z)
  5608. ===============================================================================
  5609. OpenDoors 6.00 Manual                                          End of Page 102
  5610.  
  5611.                key. This allows you to provide a menu that can be accessed from
  5612.                within the text editor. This function should return
  5613.                EDIT_MENU_DO_NOTHING if the editor should continue normally, or
  5614.                EDIT_MENU_EXIT_EDITOR if the od_multiline_edit() should return.
  5615.                If no menu callback function is provided, then
  5616.                od_multiline_edit() always returns when the escape or control-z
  5617.                key is pressed.
  5618.  
  5619.                pfBufferRealloc allows you to provide a function which will
  5620.                attempt to reallocate a larger buffer if the user enters more
  5621.                text than will fit in the originally supplied buffer. You should
  5622.                only do this if you have dynamically allocated the buffer that
  5623.                you initially passed into od_multiline_edit(). If you allocated
  5624.                the buffer using malloc() or calloc(), then pfBufferRealloc can
  5625.                be set to point to the realloc() function. If you allocated the
  5626.                buffer using the C++ new operator, then you must write a your own
  5627.                reallocation function which obeys the same semantics as the C
  5628.                realloc() function. If no buffer reallocation function is
  5629.                provided, then od_multiline_edit() will never allow the user to
  5630.                enter more text than will fit in the buffer that you initially
  5631.                supply. If you are using the buffer reallocation option, you can
  5632.                obtain a pointer to the final buffer, and the size of the final
  5633.                buffer, from the pszFinalBuffer and unFinalBufferSize members.
  5634.  
  5635.  
  5636. SEE ALSO       od_input_str(), od_edit_str(), od_get_input()
  5637.  
  5638.  
  5639.  
  5640.  
  5641.  
  5642.  
  5643.  
  5644.  
  5645.  
  5646.  
  5647.  
  5648.  
  5649.  
  5650.  
  5651.  
  5652.  
  5653.  
  5654.  
  5655.  
  5656.  
  5657.  
  5658.  
  5659.  
  5660.  
  5661.  
  5662.  
  5663. ===============================================================================
  5664. OpenDoors 6.00 Manual                                          End of Page 103
  5665.  
  5666. OD_PAGE()
  5667. -------------------------------------------------------------------------------
  5668.  
  5669. PURPOSE        Function to allow user to page the sysop
  5670.  
  5671.  
  5672. FORMAT         void od_page(void);
  5673.  
  5674.  
  5675. RETURNS        N/A
  5676.  
  5677.  
  5678. DESCRIPTION    This function can be called to allow the user to page the sysop.
  5679.                This function will ask the user why they wish to chat with the
  5680.                sysop, and then page the sysop. The sysop will then be free to
  5681.                break into chat at any time. Sysop paging will also be aborted
  5682.                by the user, simply by pressing [Enter] when asked for a reason
  5683.                for chat. When the user pages the sysop, the [Wants-Chat]
  5684.                indicator will begin to flash on the main status line, and the
  5685.                status line will switch to show the user's reason for wanting to
  5686.                chat. Also, the user's total number of pages will be
  5687.                incremented.
  5688.  
  5689.                Depending upon the setting of the od_control.od_okaytopage
  5690.                variable, this function will also optionally check sysop paging
  5691.                hours, and only allow the user to page the sysop during valid
  5692.                paging hours. For information on the variables containing the
  5693.                user's total number of pages, the user's want-chat status, valid
  5694.                sysop paging hours, and the od_control.od_okaytopage variable,
  5695.                see the section on the OpenDoors control structure, which begins
  5696.                on page 148.
  5697.  
  5698.  
  5699. EXAMPLE        For an example of the use of the od_page() function, see the
  5700.                EX_VOTE.C example program, which is described beginning on page
  5701.                38.
  5702.  
  5703.  
  5704.  
  5705.  
  5706.  
  5707.  
  5708.  
  5709.  
  5710.  
  5711.  
  5712.  
  5713.  
  5714.  
  5715.  
  5716.  
  5717.  
  5718. ===============================================================================
  5719. OpenDoors 6.00 Manual                                          End of Page 104
  5720.  
  5721. OD_PARSE_CMD_LINE()
  5722. -------------------------------------------------------------------------------
  5723.  
  5724. PURPOSE        Handles standard command line options.
  5725.  
  5726.  
  5727. FORMAT         Under DOS Version:
  5728.                void od_parse_cmd_line(INT nArgCount, char *papszArguments[]);
  5729.  
  5730.                Under Win32 Version:
  5731.                void od_parse_cmd_line(LPSTR pszCmdLine);
  5732.  
  5733.  
  5734. RETURNS        N/A
  5735.  
  5736.  
  5737. DESCRIPTION    This is the only OpenDoors function that uses a different
  5738.                calling format in the DOS and Win32 versions of OpenDoors. The
  5739.                reason for this is that od_parse_cmd_line() always allows you to
  5740.                pass command line parameters in the same format that the
  5741.                operating system passes them to you. Under the DOS version of
  5742.                OpenDoors, you should pass the argc and argv values that were
  5743.                passed to your main function as the two parameters to
  5744.                od_parse_cmd_line(). Under the Win32 version of OpenDoors, you
  5745.                should pass the pszCmdLine values that were passed to your
  5746.                WinMain() function as the one parameter to od_parse_cmd_line().
  5747.  
  5748.                The od_parse_cmd_line() function should be called before your
  5749.                first call to any other OpenDoors function, with the possible
  5750.                exception of the od_add_personality() function.
  5751.  
  5752.                It is recommended that any program which uses OpenDoors call
  5753.                od_parse_cmd_line() as part of its startup procedure. This
  5754.                allows your program to automatically handle many common command
  5755.                line options that will make it easier to setup and run your
  5756.                program. Among the helpful command line options processed by
  5757.                od_parse_cmd_line() are options to set serial port information
  5758.                (including information on non-standard serial port setups),
  5759.                specify the location of configuration and drop files, force the
  5760.                program to run in silent mode (without no local display), pass
  5761.                in user information, and the ability to start the program in
  5762.                local mode without a drop file. For a complete list of the
  5763.                options supported by od_parse_cmd_line(), run the example Vote
  5764.                door that is included in the OpenDoors packages, specifying -
  5765.                help on the command line.
  5766.  
  5767.                If you wish to process your own command line parameters in
  5768.                addition to those supported by OpenDoors, simply check the
  5769.                command-line for your own parameters after calling
  5770.                od_parse_cmd_line(). You can do this in the same way that you
  5771.                would handle command line options if you weren't using
  5772.                od_parse_cmd_line(). The od_parse_cmd_line() function does not
  5773. ===============================================================================
  5774. OpenDoors 6.00 Manual                                          End of Page 105
  5775.  
  5776.                generate an error message if it encounters unrecognized command
  5777.                line options. You can supply your own text to display when the
  5778.                user chooses the /Help option by setting
  5779.                od_control.od_cmd_line_help to point to your own string. Separate
  5780.                lines in your string with the \n character, and align text using
  5781.                the \t character.
  5782.  
  5783.  
  5784. SEE ALSO       od_init()
  5785.  
  5786.  
  5787. EXAMPLE        The following example shows how a program that uses
  5788.                od_parse_cmd_line() should be structured in order to compile
  5789.                under either DOS or Win32 versions of OpenDoors:
  5790.  
  5791.                #include "opendoor.h"
  5792.  
  5793.                /* main() or WinMain() function - Program begins here. */
  5794.                #ifdef ODPLAT_WIN32
  5795.                int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  5796.                   LPSTR lpszCmdLine, int nCmdShow)
  5797.                #else
  5798.                int main(int argc, char *argv[])
  5799.                #endif
  5800.                {
  5801.                #ifdef ODPLAT_WIN32
  5802.                #endif
  5803.  
  5804.                   /* Set program's name for use by OpenDoors. */
  5805.                #ifdef ODPLAT_WIN32
  5806.                   /* In Windows, pass in nCmdShow value to OpenDoors. */
  5807.                   od_control.od_cmd_show = nCmdShow;
  5808.  
  5809.                   /* Call od_parse_cmd_line. */
  5810.                   od_parse_cmd_line(lpszCmdLine);
  5811.                #else
  5812.                   od_parse_cmd_line(argc, argv);
  5813.                #endif
  5814.  
  5815.  
  5816.                   /* Start the rest of your program here. */
  5817.  
  5818.  
  5819.                }
  5820.  
  5821.  
  5822.  
  5823.  
  5824.  
  5825.  
  5826.  
  5827.  
  5828. ===============================================================================
  5829. OpenDoors 6.00 Manual                                          End of Page 106
  5830.  
  5831. OD_POPUP_MENU()
  5832. -------------------------------------------------------------------------------
  5833.  
  5834. PURPOSE        Creates a popup menu which allows the user to make a selection
  5835.                by pressing a single key, or selecting the item with a highlight
  5836.                bar. After the user has made a selection, the menu may be
  5837.                removed from the screen, restoring the original screen contents
  5838.                "beneath" the window.
  5839.  
  5840.  
  5841. FORMAT         INT od_popup_menu(char *pszTitle, char *pszText, INT nLeft,
  5842.                   INT nTop, INT nLevel, WORD uFlags);
  5843.  
  5844.  
  5845. RETURNS        POPUP_ERROR    On error (od_control.od_error is set to
  5846.                               indicate type of error).
  5847.                POPUP_ESCAPE   If user exited menu by pressing [ESCape].
  5848.                POPUP_LEFT     If user exited menu by pressing the left arrow
  5849.                               key.
  5850.                POPUP_RIGHT    If user exited menu by pressing the right arrow
  5851.                               key.
  5852.  
  5853.                Or, a postive integer indicating the menu item that was chosen
  5854.                if a selection was made.
  5855.  
  5856.  
  5857. DESCRIPTION    od_popup_menu() creates a popup window with a menu of choices,
  5858.                for use in ANSI/AVATAR/RIP modes. The user is able to choose an
  5859.                item from the menu by moving the highlighted selection bar with
  5860.                the arrow keys, or by pressing a key associated with a
  5861.                particular menu item. The contents of the menu are defined by
  5862.                the string pointed to by the pszText parameter. This menu
  5863.                definition string contains each menu option, separated by a '|'
  5864.                (pipe) character. Keys associated with each menu entry can be
  5865.                defined by proceeding the letter with a '^' (carat) character.
  5866.                For example, the string:
  5867.  
  5868.                     "^Save|^Load|E^xit"
  5869.  
  5870.                would produce a menu with three options: Save, Load and Exit.
  5871.                The user would be able to select the Save option by pressing the
  5872.                [S] key, the Load option by pressing the [L] key, and the Exit
  5873.                option by pressing the [X] key. Furthermore, the characters
  5874.                corresponding to each menu item would be displayed in a
  5875.                highlighted color.
  5876.  
  5877.                Menus displayed with od_popup_menu() may optionally have a
  5878.                title, as specified by the pszTitle parameter. If this parameter
  5879.                is set to NULL, no title will be displayed. If this parameter is
  5880.                not NULL, the specified string will be displayed as a title on
  5881.                the window.
  5882.  
  5883. ===============================================================================
  5884. OpenDoors 6.00 Manual                                          End of Page 107
  5885.  
  5886.                The nLeft and nTop parameters specify the left and top locations
  5887.                of the menu window, were 1, 1 is the upper right corner of the
  5888.                screen. The bottom and right corners of the menu are
  5889.                automatically determined by the size and number of menu entries
  5890.                in the menu definition string.
  5891.  
  5892.                The nLevel parameter specifies the menu level, an integer from 0
  5893.                to 10. Unless you are using the MENU_KEEP flag, this parameter
  5894.                can always be 0.
  5895.  
  5896.                The uFlags parameter specifies one or more of the following
  5897.                options, joined by the bitwise-OR operator (|).
  5898.  
  5899.                     MENU_NORMAL         Has no effect.
  5900.                     MENU_ALLOW_CANCEL   Allow user to exit menu with [ESCape].
  5901.                     MENU_PULLDOWN       Allow exit with arrow keys.
  5902.                     MENU_KEEP           Leave menu active on selection.
  5903.                     MENU_DESTROY        Remove a currently active menu.
  5904.  
  5905.                If you are not using any of the other flags, you can use
  5906.                MENU_NORMAL as a place-holder for this parameter. If you specify
  5907.                MENU_ALLOW_CANCEL, the user will be able to exit the menu
  5908.                without making a selection by pressing the [ESCape] key. If the
  5909.                user presses [ESCape], od_popup_menu() returns POPUP_ESCAPE.
  5910.  
  5911.                You can use the MENU_PULLDOWN option with od_popup_menu() to
  5912.                implement a set of pulldown menus. In this case, if the user
  5913.                presses the left arrow key or right arrow key while the menu is
  5914.                being displayed, od_popup_menu() returns with POPUP_LEFT or
  5915.                POPUP_RIGHT, allowing you to display a different menu.
  5916.  
  5917.                Normally, od_popup_menu() will remove the menu from the screen
  5918.                as soon as the user makes a selection. However, there may be
  5919.                some cases when you want the menu to continue to be visible
  5920.                after the user makes a selection. For example, you may want some
  5921.                menu options to lead to further sub-menus, or you may wish to
  5922.                display a popup window, and return to this menu after the user
  5923.                has exited from the popup window. If the MENU_KEEP flag is
  5924.                specified, the menu will remain active (on-screen) after the
  5925.                user makes a selection. However, the menu will still be
  5926.                destroyed if the user cancels out of the menu (this will only
  5927.                happen if you have specified MENU_ALLOW_CANCEL), or if the user
  5928.                moves to another menu by pressing the left or right arrow keys
  5929.                (this will only happen if you have specified MENU_PULLDOWN). If
  5930.                MENU_KEEP has been specified, and the user makes a selection,
  5931.                you must eventually either return to the menu, or destroy it by
  5932.                calling MENU_DESTROY. If you want to return to the menu, simply
  5933.                call od_popup_menu() again with the same level value that was
  5934.                used to originally create the menu. The user will now be able to
  5935.                make another selection from the menu, and od_popup_menu() will
  5936.                once again return that selection to you. If you want to destroy
  5937.                the menu, simply call od_popup_menu() with the MENU_DESTROY flag
  5938. ===============================================================================
  5939. OpenDoors 6.00 Manual                                          End of Page 108
  5940.  
  5941.                set, and the same level value that was used to create the
  5942.                original menu. If you wish to create another popup menu while
  5943.                the first one is still active, simply call od_popup_menu()
  5944.                again, this time with a different level value. The colors used
  5945.                by the od_popup_menu() function are set by the following
  5946.                OpenDoors control structure settings:
  5947.  
  5948.                     char od_control.od_menu_title_col;
  5949.                     char od_control.od_menu_border_col;
  5950.                     char od_control.od_menu_text_col;
  5951.                     char od_control.od_menu_key_col;
  5952.                     char od_control.od_menu_highlight_col;
  5953.                     char od_control.od_menu_highkey_col;
  5954.  
  5955.  
  5956. SEE ALSO       od_window_create(), od_window_remove(), od_draw_box(),
  5957.                od_hotkey_menu()
  5958.  
  5959.  
  5960. EXAMPLE        The following example shows the use of multiple-level menus:
  5961.  
  5962.                #include <stdlib.h>
  5963.                #include "opendoor.h"
  5964.                main()
  5965.                {
  5966.                   for(;;)
  5967.                   {
  5968.                      switch(od_popup_menu("Main Menu",
  5969.                         "^Files|^Electronic Mail|^News|E^xit",
  5970.                         20, 5, 0, MENU_NORMAL | MENU_KEEP))
  5971.                      {
  5972.                         case 1:
  5973.                            od_popup_menu("Files Menu",
  5974.                               "^Search For Files|^Download|^Upload",
  5975.                               30, 7, 2, MENU_NORMAL | MENU_ALLOW_CANCEL);
  5976.                            break;
  5977.                         case 2:
  5978.                            od_popup_menu("EMail Menu",
  5979.                               "Get ^New Mail|^Send Mail|Send ^Fax",
  5980.                               30, 8, 1, MENU_NORMAL | MENU_ALLOW_CANCEL);
  5981.                            break;
  5982.                         case 3:
  5983.                            od_popup_menu("News Menu",
  5984.                               "Choose News^Group|^Read News|^Post News",
  5985.                               30, 9, 1, MENU_NORMAL | MENU_ALLOW_CANCEL);
  5986.                            break;
  5987.                         case 4:
  5988.                            od_popup_menu(NULL, NULL, 0, 0, 0, MENU_DESTROY);
  5989.                            return(0);
  5990.                      }
  5991.                   }
  5992.                }
  5993. ===============================================================================
  5994. OpenDoors 6.00 Manual                                          End of Page 109
  5995.  
  5996. OD_PRINTF()
  5997. -------------------------------------------------------------------------------
  5998.  
  5999. PURPOSE        Performs formatted output (remote & local), with the ability to
  6000.                change display colors.
  6001.  
  6002.  
  6003. FORMAT         void od_printf(char * pszFormat,...);
  6004.  
  6005.  
  6006. RETURNS        N/A
  6007.  
  6008.  
  6009. DESCRIPTION    This is one of two OpenDoors function which allows you to
  6010.                display a string of characters, the other being the
  6011.                od_disp_str() function. For a complete comparison of the various
  6012.                OpenDoors display function, see the description of the
  6013.                od_disp_str() function, on page 63. Like the od_disp_str()
  6014.                function, the od_printf() function will display its output both
  6015.                on the local screen, and on the remote user's screen (if the
  6016.                door is not operating in local mode). However, the od_printf()
  6017.                function also allows for formatted output, just as the printf()
  6018.                function does. In addition to providing all of the features of
  6019.                the normal C printf() function, the od_printf() function allows
  6020.                you to include codes to change the color of the display of text.
  6021.                This unique feature allows you to display multi-colored text,
  6022.                without having to use chains of alternating od_disp_str() and
  6023.                od_set_color() calls.
  6024.  
  6025.                As with the printf() function, the od_printf() function accepts
  6026.                one or more parameters, the first parameter being the format
  6027.                string to be displayed, and the additional parameters being data
  6028.                to be displayed within the string. The OpenDoors od_printf()
  6029.                function recognizes all of the control characters and options
  6030.                recognized by the normal printf() function. For example, to
  6031.                display the amount of time that a user has left online, the
  6032.                following line would be a valid use of the od_printf() function:
  6033.  
  6034.                     od_printf("Time Left:%d\n\r", od_control.user_timelimit);
  6035.  
  6036.                Note that a full discussion of the printf() function is beyond
  6037.                the scope of this manual. For more information on using
  6038.                printf(), please see your Turbo C(++) / Borland C++ manuals.
  6039.  
  6040.                In addition to the normal control sequences, such as "%s", "%d",
  6041.                or "%12.12s", the od_printf() function also allows you to
  6042.                include special color-setting codes within the format string.
  6043.                These color code sequences BEGIN and END with a delimiter
  6044.                character, which is used to indicate that the sequence is a
  6045.                color setting. Consider, for example, the following line of
  6046.                code, which displays text in various colors:
  6047.  
  6048. ===============================================================================
  6049. OpenDoors 6.00 Manual                                          End of Page 110
  6050.  
  6051.                        od_printf("`blue`Blue `green`Green `red`Red  \n\r");
  6052.  
  6053.                In this case (assuming of course that a color monitor is being
  6054.                used) the word "Blue" will be displayed in the color blue, the
  6055.                word "Green" will be displayed in the color green, and the word
  6056.                "Red" will be displayed in the color red. In this case, the
  6057.                sequence `blue` sets the display color to dark blue on black.
  6058.                Here, the back-quote (`) is the delimiter character which
  6059.                indicates the beginning and end of the color sequence. Be sure
  6060.                not to confuse the back-quote character (`) with the normal
  6061.                forward quote ('). THIS IS THE MOST COMMON DIFFICULTY
  6062.                EXPERIENCED WITH THE OD_PRINTF() FUNCTION. The text between the
  6063.                back-quote characters indicates the color that should be set.
  6064.                This text can include the name of the foreground color, the name
  6065.                of the background color, the "bright" keyword and the "flashing"
  6066.                keyword. The first color mentioned is taken to be the foreground
  6067.                color, and the second the background color. Case is not
  6068.                sensitive, additional words can be included for legibility.
  6069.                Thus:
  6070.  
  6071.                          `bright white cyan`
  6072.  
  6073.                is equivalent to:
  6074.  
  6075.                          `Bright white on a cyan background`.
  6076.  
  6077.                The "bright" keyword indicates that the foreground color should
  6078.                be displayed in high intensity, and the "flashing" keyword
  6079.                indicates that the text should be flashing. If no background is
  6080.                specified, the background color defaults to black. If no
  6081.                foreground or background colors are specified, the color
  6082.                defaults to white on black.
  6083.  
  6084.                The od_printf() function will automatically determine whether
  6085.                the user has ANSI, AVATAR or RIP graphics enabled, and will send
  6086.                the appropriate color codes to change the color of displayed
  6087.                text. If the user does not have either ANSI or AVATAR graphics
  6088.                modes turned on, then the od_printf() function will not send any
  6089.                color codes. Thus, a door program using color codes would work
  6090.                just as well when ANSI/AVATAR/RIP graphics are not available,
  6091.                except that all text will appear in the same color.
  6092.  
  6093.                You may prefer to set colors by using the od_set_color() or
  6094.                od_set_attrib() functions, instead of using these cryptic color
  6095.                codes imbedded in od_printf() functions. In some cases, however,
  6096.                it will be much more advantageous to place the color codes
  6097.                within your od_printf() strings. As a case in point, consider
  6098.                the single od_printf() statement in the example, above. To
  6099.                accomplish the same result using the od_disp_str() and
  6100.                od_set_color() functions, you would have to use the following
  6101.                SIX function calls:
  6102.  
  6103. ===============================================================================
  6104. OpenDoors 6.00 Manual                                          End of Page 111
  6105.  
  6106.                        od_set_color(D_BLUE,D_BLACK);
  6107.                        od_disp_str("Blue ");
  6108.                        od_set_color(D_GREEN,D_BLACK);
  6109.                        od_disp_str("Green ");
  6110.                        od_set_color(D_RED,D_BLACK);
  6111.                        od_disp_str("Red  \n\r");
  6112.  
  6113.                While this method MAY be easier understand, it certainly
  6114.                requires many more line of code to accomplish. However, either
  6115.                method will work, and the choice is up to you as to which method
  6116.                you prefer. Keep in mind, however, that if the color to be set
  6117.                is stored in a variable, instead of always being the same color,
  6118.                you must use either the od_set_color() or od_set_attrib()
  6119.                function to set the display color.
  6120.  
  6121.                While the back-quote (`) character is normally used to delimit a
  6122.                color sequence in the od_printf() function, you may wish to be
  6123.                able to print a back-quote character using the od_printf()
  6124.                function. In this case, you may configure OpenDoors to use a
  6125.                different character to represent color code sequences. To do
  6126.                this, simply use the od_control.od_color_delimiter variable,
  6127.                which is described in the OpenDoors control structure section,
  6128.                beginning on page 148. For example, if you wished to use the
  6129.                tilde (~) character instead of the back-quote character to
  6130.                change colors, simply place the following line within your
  6131.                program, at some point after having called od_init() or some
  6132.                OpenDoors function:
  6133.  
  6134.                        od_control.od_color_delimiter='~';
  6135.  
  6136.                Also, you may disable the color code interpretation within the
  6137.                od_printf() function altogether, by setting the
  6138.                od_control.od_color_delimiter variable to 0.
  6139.  
  6140.                Note that the od_printf() function interprets the color codes
  6141.                AFTER parsing the other control sequences, such as "%d" or "%s".
  6142.                Thus, if you used the command:
  6143.  
  6144.                        od_printf("%s",string);
  6145.  
  6146.                Any color codes contained in the string "string" would also be
  6147.                interpreted. If you did not wish to have any color code
  6148.                characters which might be contained in the string "string"
  6149.                treated as such, you could again disable od_printf()'s color
  6150.                code interpretation, by setting the od_control.od_color_char
  6151.                variable to 0.
  6152.  
  6153.                Note that the string to be displayed by od_printf() should not
  6154.                exceed 511 characters in size, including the size of color
  6155.                sequences and expanded % fields.
  6156.  
  6157.  
  6158. ===============================================================================
  6159. OpenDoors 6.00 Manual                                          End of Page 112
  6160.  
  6161. SEE ALSO       od_disp_str(), od_disp(), od_putch(), od_repeat(), od_disp_emu()
  6162.  
  6163.  
  6164. EXAMPLE        Below is a simple example of a user statistics door program,
  6165.                which displays various pieces of information to the user, by
  6166.                using the od_printf() function. Notice the use of color code
  6167.                sequences in order to display the titles in a different color
  6168.                from the information fields. Note that since the information
  6169.                available to this door will depend on the BBS system under which
  6170.                it is running, not all of the information displayed by this door
  6171.                will be available under all BBS systems. For a description of
  6172.                what information is available under what BBS systems, see the
  6173.                OpenDoors control structure portion of this manual, which begins
  6174.                on page 148.
  6175.  
  6176.  
  6177. #include "opendoor.h"
  6178.  
  6179. int main(int argc,char *argv[])
  6180.    {
  6181.    od_init();                                     /* Begin OpenDoors program */
  6182.  
  6183.    od_printf("`bright white` YOUR STATISTICS\n\r");         /* Display title */
  6184.    od_printf("---------------\n\r\n\r");
  6185.  
  6186.                                                        /* Display statistics */
  6187.    od_printf("`red`NAME :             `blue`%s\n\r",od_control.user_logintime);
  6188.    od_printf("`red`LOCATION :         `blue`%s\n\r",od_control.user_location);
  6189.    od_printf("`red`PHONE NUMBER :     `blue`%s\n\r",od_control.user_homephone);
  6190.    od_printf("`red`LAST CALL :        `blue`%s\n\r",od_control.user_lastdate);
  6191.    od_printf("`red`NUMBER OF CALLS :  `blue`%u\n\r",od_control.user_numcalls);
  6192.    od_printf("`red`NUMBER OF PAGES :  `blue`%u\n\r",od_control.user_numpages);
  6193.    od_printf("`red`REMAINING TIME :   `blue`%d\n\r",od_control.user_timelimit);
  6194.    od_printf("`red`# OF DOWNLOADS :   `blue`%u\n\r",od_control.user_downloads);
  6195.    od_printf("`red`# OF UPLOADS :     `blue`%u\n\r",od_control.user_uploads);
  6196.    od_printf("`red`KBYTES DL TODAY :  `blue`%u\n\r",od_control.user_todayk);
  6197.  
  6198.                                                 /* Ask user to press [Enter] */
  6199.    od_printf("`bright green on green`Press [Enter] to return to BBS...\n\r");
  6200.  
  6201.    while(od_get_key(TRUE)!=13);            /* Wait for user to press [Enter] */
  6202.  
  6203.    od_exit(20,FALSE);                                       /* Return to BBS */
  6204.    }
  6205.  
  6206.  
  6207. HELPFUL        This section demonstrates use of the od_printf() color
  6208. HINT           sequences imbedded directly in the printf() format string, such
  6209.                as:
  6210.  
  6211.                          od_printf("Hello `bright green` there!");
  6212.  
  6213. ===============================================================================
  6214. OpenDoors 6.00 Manual                                          End of Page 113
  6215.  
  6216.                However, there are also other ways that you can take advantage
  6217.                of this feature. For example, the C programming language
  6218.                concatenates string constants that are separated only by white
  6219.                space or carriage returns. For instance,
  6220.  
  6221.                          "Hello " "`bright green`" " there!"
  6222.  
  6223.                is equivalent to:
  6224.  
  6225.                          "Hello `bright green` there!"
  6226.  
  6227.                For this reason, you can create macros for common color
  6228.                sequences in your program, such as:
  6229.  
  6230.                          #define HIGHLIGHT "`bright green`"
  6231.  
  6232.                You can then use such constants when calling the od_printf()
  6233.                function, as follows:
  6234.  
  6235.                          od_printf("Hello " HIGHLIGHT " there!");
  6236.  
  6237.                You may find this method of setting the display color to be
  6238.                easier to read, and more easily configurable than including the
  6239.                color sequence directly in the format string. Below another use
  6240.                of the color sequences is describe, which allows the colors used
  6241.                by od_printf() not be "hard-wired".
  6242.  
  6243.  
  6244.                Since color control sequences are evaluated by od_printf() after
  6245.                it evaluates all format sequences (such as "%d"). For this
  6246.                reason, it is possible to change the display color using a
  6247.                string variable, instead of using a fixed color in the string.
  6248.                For example, if you program had the variable:
  6249.  
  6250.                          char highlight[40];
  6251.  
  6252.                which was set at some point to be equal to:
  6253.  
  6254.                          "`bright green`"
  6255.  
  6256.                you would be able to use od_printf() as follows:
  6257.  
  6258.                          od_printf("Hello %s there!", highlight);
  6259.  
  6260.                The display color would then be changed at the location where
  6261.                the "%s" appears in the od_printf() format string. The advantage
  6262.                of using this method to change display colors is that unlike
  6263.                other methods, the value of the highlight variable can be
  6264.                changed. This could be used, for example, to allow the sysop to
  6265.                configure the colors they wish your door to use. You would only
  6266.                need to change the value of the highlight variable in order to
  6267.                change the color set by od_printf().
  6268. ===============================================================================
  6269. OpenDoors 6.00 Manual                                          End of Page 114
  6270.  
  6271. OD_PUTCH()
  6272. -------------------------------------------------------------------------------
  6273.  
  6274. PURPOSE        Function to display a single character.
  6275.  
  6276.  
  6277. FORMAT         void od_putch(int chToDisplay);
  6278.  
  6279.  
  6280. RETURNS        N/A
  6281.  
  6282.  
  6283. DESCRIPTION    This function performs a similar function to the other OpenDoors
  6284.                display functions. For information on the uses of the various
  6285.                OpenDoors display functions, see the description of the
  6286.                od_disp_str() function, on page 63. This function is most
  6287.                similar to the od_disp() and od_disp_str() functions, except
  6288.                that it only displays a single character at a time.
  6289.  
  6290.                This function will display the character passed to it at the
  6291.                cursor position in the output window, and then advance the
  6292.                cursor to the next display position. If OpenDoors is not
  6293.                operating in local mode, the character will also be sent to the
  6294.                modem, and thus displayed on the user's screen in the same
  6295.                manner that it is displayed on the local screen. If ANSI, AVATAR
  6296.                or RIP graphics mode is activated the character will be
  6297.                displayed in the current color.
  6298.  
  6299.  
  6300. SEE ALSO       od_disp_str(), od_disp(), od_printf(), od_repeat(),
  6301.                od_disp_emu()
  6302.  
  6303.  
  6304. EXAMPLE        Below is an example of the use of the od_putch() function. This
  6305.                example is a function which you could use in place of the
  6306.                od_get_key() function. This function inputs a single character
  6307.                from the keyboard, just as the od_get_key() function does.
  6308.                However, if the character entered is a printable character, the
  6309.                function will also echo the character to the local screen, using
  6310.                the od_putch() function.
  6311.  
  6312.                char get_key_with_echo(int wait)
  6313.                {
  6314.                   char pressed=od_get_key(wait);        /* Get key from user */
  6315.  
  6316.                   if(pressed>=32 && pressed<=126)     /* If key is printable */
  6317.                   {
  6318.                      od_putch(pressed);             /* Display the character */
  6319.                   }
  6320.  
  6321.                   return(pressed);             /* Return key pressed by user */
  6322.                }
  6323. ===============================================================================
  6324. OpenDoors 6.00 Manual                                          End of Page 115
  6325.  
  6326. OD_PUTTEXT()
  6327. -------------------------------------------------------------------------------
  6328.  
  6329. PURPOSE        Displays a rectangular region of text and color information, as
  6330.                previously stored using od_gettext()
  6331.  
  6332.  
  6333. FORMAT         BOOL od_puttext(INT nLeft, INT nTop, INT nRight, INT nBottom,
  6334.                   void *pBlock);
  6335.  
  6336.  
  6337. RETURNS        TRUE on success
  6338.                FALSE on failure
  6339.  
  6340.  
  6341. DESCRIPTION    This function "pastes" a rectangular block of text and color
  6342.                information that has been previously retrieved using
  6343.                od_gettext(). The block is placed at the screen location
  6344.                indicated by the variables nLeft, nTop, nRight and nBottom,
  6345.                where nLeft and nRight are column numbers from 1 - 80, and nTop
  6346.                and nBottom are row numbers from 1 - 23. The length and width of
  6347.                the rectangle specified by nLeft, nTop, nRight and nBottom must
  6348.                be the same as the length and width of the rectangle passed to
  6349.                od_gettext() when storing the block of text.
  6350.  
  6351.                This function attempts to display the pasted block as quickly as
  6352.                possible, only transmitting information on portions of the block
  6353.                that are different than the original screen contents. When this
  6354.                function returns, it leaves the cursor at its original position,
  6355.                and the display color at its original setting. This function
  6356.                requires ANSI or AVATAR mode.
  6357.  
  6358.                The control structure variable od_control.od_full_put may be set
  6359.                to TRUE to force od_puttext() to always send all characters in
  6360.                the block to be displayed, instead of only displaying the
  6361.                portions of the block that differ from the original screen
  6362.                contents. If you wish to save and restore the entire screen, you
  6363.                can use od_save_screen() and od_restore_screen(), which work in
  6364.                all display modes.
  6365.  
  6366.                You may also use the od_puttext() to display a rectangular block
  6367.                of text that you generate manually, instead of retrieving using
  6368.                od_gettext(). To do this, you pass an array which contains the
  6369.                text and color information for the rectangular area to be
  6370.                painted, in the pBlock parameter. The array passed to
  6371.                od_puttext() contains a two-byte sequence of information for
  6372.                each character in the rectangle. The first byte contains the
  6373.                ASCII code of the character to be displayed. The second byte
  6374.                contains the color attribute value of the character, in the same
  6375.                format as used by the od_set_attrib() function (described on
  6376.                page 128). These two byte sequences are stored in the order in
  6377.                which English is written; the array begins with the two byte
  6378. ===============================================================================
  6379. OpenDoors 6.00 Manual                                          End of Page 116
  6380.  
  6381.                sequences for all of the characters on the first line, from left
  6382.                to right, followed by the characters for the second line, and so
  6383.                on. The length of each line must be exactly equal to the width
  6384.                of the rectangular region to be painted.
  6385.  
  6386.  
  6387. SEE ALSO       od_gettext(), od_save_screen(), od_restore_screen(),
  6388.                od_scroll(), od_window_create(), od_window_remove()
  6389.  
  6390.  
  6391.  
  6392.  
  6393.  
  6394.  
  6395.  
  6396.  
  6397.  
  6398.  
  6399.  
  6400.  
  6401.  
  6402.  
  6403.  
  6404.  
  6405.  
  6406.  
  6407.  
  6408.  
  6409.  
  6410.  
  6411.  
  6412.  
  6413.  
  6414.  
  6415.  
  6416.  
  6417.  
  6418.  
  6419.  
  6420.  
  6421.  
  6422.  
  6423.  
  6424.  
  6425.  
  6426.  
  6427.  
  6428.  
  6429.  
  6430.  
  6431.  
  6432.  
  6433. ===============================================================================
  6434. OpenDoors 6.00 Manual                                          End of Page 117
  6435.  
  6436. OD_REPEAT()
  6437. -------------------------------------------------------------------------------
  6438.  
  6439. PURPOSE        Repeatedly display the specified character any number of times,
  6440.                using special graphics codes for greater speed, if possible.
  6441.  
  6442.  
  6443. FORMAT         void od_repeat(char chValue, BYTE btTimes);
  6444.  
  6445.  
  6446. RETURNS        N/A
  6447.  
  6448.  
  6449. DESCRIPTION    This display function will repeatedly display the character
  6450.                chValue, btTimes times. For a complete breakdown of the various
  6451.                OpenDoors display functions, see the description of the
  6452.                od_disp_str() function, located on page 63.
  6453.  
  6454.                The advantage of using this function to display a series of
  6455.                identical characters is that this function will use special
  6456.                graphics-mode control sequences to display the repeated
  6457.                character very efficiently, if the required graphics mode is
  6458.                available. For example, in AVATAR mode, this function can
  6459.                display an entire line of one character, by sending a control
  6460.                sequence to the modem that is only three characters long. If
  6461.                graphics mode is not turned on, then the od_disp_str() function
  6462.                will simply send the specified character the appropriate number
  6463.                of times. As with the other display functions, the output of
  6464.                this function is sent to both the local and remote screens.
  6465.  
  6466.  
  6467. SEE ALSO       od_putch(), od_disp_str(), od_disp(), od_printf(), od_disp_emu()
  6468.  
  6469.  
  6470. EXAMPLE        The example function below demonstrates the use of the
  6471.                od_repeat() function in drawing a window (a square box) on the
  6472.                screen. This function is essentially a simplified version of the
  6473.                od_draw_box() function, which is described on page 65. Unlike
  6474.                this function, the od_draw_box() function allows the
  6475.                customization of the characters used to draw the box's boarder,
  6476.                and if possible uses additional AVATAR graphics codes to display
  6477.                the window even faster than this function does. Thus, the
  6478.                function below is really provided for demonstration purposes
  6479.                only.
  6480.  
  6481.                This function accepts four parameters, which indicate the
  6482.                location of the upper left and lower right corners of the window
  6483.                to be displayed. The function then displays the window with the
  6484.                current color attribute settings. Since this function uses the
  6485.                od_repeat() function, if AVATAR graphics are available, it can
  6486.                display the entire window in a fraction of a second, even if it
  6487.                is displaying a window the size of the entire screen at slow
  6488. ===============================================================================
  6489. OpenDoors 6.00 Manual                                          End of Page 118
  6490.  
  6491.                baud rates. Note that this window display function requires that
  6492.                the user has ANSI, AVATAR or RIP graphics mode enabled.
  6493.  
  6494.                void draw_window(char left, char top, char right, char bottom)
  6495.                {
  6496.                   char line_counter;   /* Number of current line being drawn */
  6497.                   char between_size=(right-left)-1;      /* X size of window */
  6498.  
  6499.                   od_set_cursor(top,left);             /* move to top corner */
  6500.                   od_putch(218);                 /* display corner character */
  6501.                   od_repeat(196,between_size);           /* display top line */
  6502.                   od_putch(191);                 /* display corner character */
  6503.                                       /* loop through middle lines of window */
  6504.                   for(line_counter=top+1;line_counter<bottom;++line_counter)
  6505.                   {
  6506.                      od_set_cursor(line_counter,left); /* move to line start */
  6507.                      od_putch(179);                /* display left line char */
  6508.                      od_repeat(' ',between_size);      /* display blank area */
  6509.                      od_putch(179);               /* display right line char */
  6510.                   }
  6511.  
  6512.                   od_set_cursor(bottom,left);       /* move to bottom corner */
  6513.                   od_putch(192);                 /* display corner character */
  6514.                   od_repeat(196,between_size);        /* display bottom line */
  6515.                   od_putch(217);                 /* display corner character */
  6516.                }
  6517.  
  6518.  
  6519.  
  6520.  
  6521.  
  6522.  
  6523.  
  6524.  
  6525.  
  6526.  
  6527.  
  6528.  
  6529.  
  6530.  
  6531.  
  6532.  
  6533.  
  6534.  
  6535.  
  6536.  
  6537.  
  6538.  
  6539.  
  6540.  
  6541.  
  6542.  
  6543. ===============================================================================
  6544. OpenDoors 6.00 Manual                                          End of Page 119
  6545.  
  6546. OD_RESTORE_SCREEN()
  6547. -------------------------------------------------------------------------------
  6548.  
  6549. PURPOSE        Restores the screen contents as previous saved using the
  6550.                od_save_screen() function. This function can be used in any
  6551.                display mode.
  6552.  
  6553.  
  6554. FORMAT         BOOL od_restore_screen(void *pBuffer);
  6555.  
  6556.  
  6557. RETURNS        TRUE on success
  6558.                FALSE on failure
  6559.  
  6560.  
  6561. DESCRIPTION    This function restores the entire contents of the screen, along
  6562.                with the current cursor position and display color, which was
  6563.                previously stored using the od_save_screen() function. Unlike
  6564.                the od_get_text() and od_put_text() functions, the
  6565.                od_save_screen() and od_restore_screen() functions will work in
  6566.                all display modes (ASCII, ANSI, AVATAR and RIP).
  6567.  
  6568.                The pBuffer parameter must point to the buffer previously passed
  6569.                to od_save_screen(). Note that the od_save_screen() and
  6570.                od_restore_screen() functions save the stored information in
  6571.                different formats than the od_getttext() and od_puttext()
  6572.                functions. For this reason, you cannot save the screen contents
  6573.                with od_gettext() and restore them with od_restore_screen(), or
  6574.                visa-versa.
  6575.  
  6576.                If this function fails for any reason, a value of FALSE is
  6577.                returned, and the od_control.od_error variable is set to
  6578.                indicate the reason for the failure. For more information on the
  6579.                od_control.od_error variable, see page 185.
  6580.  
  6581.  
  6582. SEE ALSO       od_save_screen(), od_gettext(), od_puttext(), od_clr_scr()
  6583.  
  6584.  
  6585. EXAMPLE        For an example of how to use the od_restore_screen() function,
  6586.                see the example which accompanies the od_save_screen() function,
  6587.                on page 121.
  6588.  
  6589.  
  6590.  
  6591.  
  6592.  
  6593.  
  6594.  
  6595.  
  6596.  
  6597.  
  6598. ===============================================================================
  6599. OpenDoors 6.00 Manual                                          End of Page 120
  6600.  
  6601. OD_SAVE_SCREEN()
  6602. -------------------------------------------------------------------------------
  6603.  
  6604. PURPOSE        Saves the contents of the screen, to later be restored using
  6605.                od_restore_screen(). Can be used in any display mode.
  6606.  
  6607.  
  6608. FORMAT         BOOL od_save_screen(void *pBuffer);
  6609.  
  6610.  
  6611. RETURNS        TRUE on success
  6612.                FALSE on failure
  6613.  
  6614.  
  6615. DESCRIPTION    This function saves the entire contents of the screen, along
  6616.                with the current cursor position and display color, to be later
  6617.                restored using the od_restore_screen() function. Unlike the
  6618.                od_get_text() and od_put_text() functions, the od_save_screen()
  6619.                and od_restore_screen() functions will work in all display modes
  6620.                (ASCII, ANSI, AVATAR and RIP).
  6621.  
  6622.                The pBuffer parameter should point to a buffer where the current
  6623.                screen information is to be stored. This buffer must be at least
  6624.                4004 bytes in size.
  6625.  
  6626.                Note that the od_save_screen() and od_restore_screen() functions
  6627.                save the stored screen information in different formats than the
  6628.                od_getttext() and od_puttext() functions. For this reason, you
  6629.                cannot save the screen contents with od_save_screen() and
  6630.                restore them with od_puttext(), or visa-versa.
  6631.  
  6632.                Also, note that when used in RIP graphics mode, this function
  6633.                only saves and restores textual information, and not bit-mapped
  6634.                graphical information.
  6635.  
  6636.                If this function fails for any reason, a value of FALSE is
  6637.                returned, and the od_control.od_error variable is set to
  6638.                indicate the reason for the failure. For more information on the
  6639.                od_control.od_error variable, see page 185.
  6640.  
  6641.  
  6642. SEE ALSO       od_restore_screen(), od_gettext(), od_puttext(), od_clr_scr()
  6643.  
  6644.  
  6645. EXAMPLE        One case where you might wish to save and restore the contents
  6646.                of the screen is when sysop chat mode is activated. This can be
  6647.                accomplished by using the od_control.od_cbefore_chat and
  6648.                od_control.od_cafter_chat variables. The following example
  6649.                causes the screen contents to be saved and the entire screen
  6650.                cleared, prior to entering sysop chat mode when the sysop
  6651.                presses the "chat key". When the sysop ends chat mode, the
  6652.  
  6653. ===============================================================================
  6654. OpenDoors 6.00 Manual                                          End of Page 121
  6655.  
  6656.                user's original screen is restored, and the user will be able to
  6657.                continue working in the door as though nothing had happened.
  6658.  
  6659.                Code to perform screen saving and restoring:
  6660.  
  6661.                     /* Function prototypes */
  6662.                     void before_chat_function(void);
  6663.                     void after_chat_function(void);
  6664.  
  6665.                     /* Buffer to hold contents of screen prior to chat */
  6666.                     char before_chat_buffer[4004];
  6667.                     /* Variable to store whether screen save was successful */
  6668.                     char before_chat_saved = FALSE;
  6669.  
  6670.                     /* Function which is called prior to entering chat mode */
  6671.                     void before_chat_function(void)
  6672.                        {
  6673.                        /* Store current screen contents */
  6674.                        before_chat_saved = od_save_screen(before_chat_buffer);
  6675.  
  6676.                        /* Present a blank screen for chat mode */
  6677.                        od_clr_scr();
  6678.                        }
  6679.  
  6680.                     /* Function which is called after exiting chat mode */
  6681.                     void after_chat_function(void)
  6682.                        {
  6683.                        /* If screen was successfully saved prior to chat */
  6684.                        if(before_chat_saved)
  6685.                           {
  6686.                           /* Restore original screen contents */
  6687.                           od_restore_screen(before_chat_buffer);
  6688.                           }
  6689.                        }
  6690.  
  6691.                Code included in main() function to enable screen saving and
  6692.                restoring code:
  6693.  
  6694.                     od_control.od_cbefore_chat = before_chat_function;
  6695.                     od_control.od_cafter_chat = after_chat_function;
  6696.  
  6697.  
  6698.  
  6699.  
  6700.  
  6701.  
  6702.  
  6703.  
  6704.  
  6705.  
  6706.  
  6707.  
  6708. ===============================================================================
  6709. OpenDoors 6.00 Manual                                          End of Page 122
  6710.  
  6711. OD_SCROLL()
  6712. -------------------------------------------------------------------------------
  6713.  
  6714. PURPOSE        Scrolls any rectangular area of the screen a specified number of
  6715.                lines upwards or downwards. Requires ANSI/AVATAR/RIP graphics
  6716.                mode to be active.
  6717.  
  6718.  
  6719. FORMAT         BOOL od_scroll(INT nLeft, INT nTop, INT nRight, INT nBottom,
  6720.                   INT nDistance, WORD nFlags);
  6721.  
  6722.  
  6723. RETURNS        TRUE on success
  6724.                FALSE on FAILURE
  6725.  
  6726.  
  6727. DESCRIPTION    This function scrolls a rectangular area of the screen described
  6728.                by the parameters nLeft, nTop, nRight and nBottom. The
  6729.                parameters nLeft and nRight are column numbers from 1 - 80, and
  6730.                the parameters nTop and nBottom are row numbers from 1 - 23.
  6731.  
  6732.                The parameter nDistance indicates the direction and number of
  6733.                lines to scroll the text in the specified area. Positive values
  6734.                denote moving the text upwards, and negative values denote
  6735.                moving the text downwards.
  6736.  
  6737.                The new lines created by scrolling text will appear in the
  6738.                current color. When this function returns, it leaves the cursor
  6739.                at its original position, and the display color at its original
  6740.                setting. This function requires ANSI or AVATAR modes. If ANSI
  6741.                mode is active, this function is equivalent to calling
  6742.                od_gettext(), od_puttext(), and then sending addition codes to
  6743.                the modem clear the newly created lines. In ANSI mode, scrolling
  6744.                can be accomplished more quickly if the area to be scrolled is
  6745.                equal in width to the entire screen. This is because the
  6746.                clearing of newly created lines is done by sending a simple
  6747.                control sequence, instead of a line of space characters. If
  6748.                AVATAR mode is active, scrolling of the window is accomplished
  6749.                by sending a single 6-byte control sequence.
  6750.  
  6751.                The last parameter to od_scroll(), nFlags, should normally be
  6752.                set to SCROLL_NORMAL. However, if you set nFlags to
  6753.                SCROLL_NO_CLEAR, the newly created lines at the top or bottom of
  6754.                the screen are not cleared if it would take longer to do so.
  6755.  
  6756.  
  6757. SEE ALSO       od_gettext(), od_puttext(), od_window_create(),
  6758.                od_window_remove()
  6759.  
  6760.  
  6761. EXAMPLE        For an example of a program which uses the od_scroll() function,
  6762.                see the ex_chat.c example program, described on page 38.
  6763. ===============================================================================
  6764. OpenDoors 6.00 Manual                                          End of Page 123
  6765.  
  6766. OD_SEND_FILE()
  6767. -------------------------------------------------------------------------------
  6768.  
  6769. PURPOSE        Sends an ASCII/ANSI/AVATAR/RIP file from disk, using terminal
  6770.                emulation.
  6771.  
  6772.  
  6773. FORMAT         BOOL od_send_file(char *pszFileName);
  6774.  
  6775.  
  6776. RETURNS        TRUE if the file was successfully sent
  6777.                FALSE if OpenDoors was unable to send the file
  6778.  
  6779.  
  6780. DESCRIPTION:   This powerful function will display any ASCII, ANSI, AVATAR or
  6781.                RIP file. The od_send_file() function can be used to display
  6782.                existing BBS text files, such as a "logoff screen", before your
  6783.                door hangs up on the user. You can also make use of the
  6784.                od_send_file() function to build many of your door screens as
  6785.                external files. This will allow you to easily create these
  6786.                screens in an ANSI editor program, such as "TheDraw". It will
  6787.                could also optionally allow sysops to customize your door for
  6788.                use on their own BBS.
  6789.  
  6790.                The od_send_file() function is called with the full path and
  6791.                filename of the file you wish to have displayed. Thus, if you
  6792.                wished to send the ANSI file MAINMENU.SCR, you would simply
  6793.                call:
  6794.  
  6795.                             od_send_file("MAINMENU.SCR");
  6796.  
  6797.                In many cases, instead of having just one file that you want
  6798.                displayed in particular, you will have several different files,
  6799.                and will want a different one displayed according to the user's
  6800.                graphics mode. For example, you might have the four files,
  6801.                MAINMENU.ASC, MAINMENU.ANS, MAINMENU.AVT and MAINMENU.RIP; the
  6802.                .ASC file containing no special control codes, the .ANS file
  6803.                containing ANSI control codes, the .AVT file containing AVATAR
  6804.                control codes, and the .RIP file containing RIP graphics control
  6805.                codes. In this case, you can have the od_send_file() function
  6806.                automatically select the appropriate file according to the
  6807.                user's current display mode, by omitting the extension
  6808.                altogether. Thus, a call to:
  6809.  
  6810.                             od_send_file("MAINMENU");
  6811.  
  6812.                would cause OpenDoors to automatically send the appropriate
  6813.                file, according to the user's graphics mode settings. When the
  6814.                od_send_file() function is used in this "automatic mode" (where
  6815.                you do not specify a filename extension), it will look for one
  6816.                of the four filename extensions listed below.
  6817.  
  6818. ===============================================================================
  6819. OpenDoors 6.00 Manual                                          End of Page 124
  6820.  
  6821.                +----------------------------------------------------------+
  6822.                | Extension| File type                                     |
  6823.                +----------+-----------------------------------------------|
  6824.                |   .ASC   | Does not require any graphics mode to display |
  6825.                |   .ANS   | Requires ANSI graphics mode to display        |
  6826.                |   .AVT   | Requires AVATAR graphics mode to display      |
  6827.                |   .RIP   | Requires RIP graphics mode to be displayed    |
  6828.                +----------------------------------------------------------+
  6829.  
  6830.  
  6831.                If the user has RIP graphics enabled, od_send_file() will first
  6832.                search for the .RIP file. If no file exists with the specified
  6833.                filename and a .RIP extension, od_send_file() will then search
  6834.                for .AVT, then .ANS, and if not found .ASC. If the user has only
  6835.                ANSI graphics enabled, od_send_file() will attempt first to
  6836.                display the .ANS file, and if not found will search for .ASC. In
  6837.                the case that the user is using plain-ASCII mode, this function
  6838.                will attempt only to display the .ASC file.
  6839.  
  6840.                When displaying a .RIP file to the remote system, OpenDoors will
  6841.                attempt to locate and display a corresponding .AVT/.ANS/.ASC
  6842.                file on the local system. If no such file can be found, a window
  6843.                will be displayed, indicating the name of the .RIP file that is
  6844.                being sent to the remote system. When a .RIP file is being
  6845.                displayed, page pausing is disabled.
  6846.  
  6847.                When displaying .AVT/.ANS/.ASC files, od_send_file() will send
  6848.                any ANSI or AVATAR codes in the file directly to the remote
  6849.                terminal, and interpret them to display on the local screen
  6850.                (regardless of the actual filename extension). This
  6851.                interpretation is accomplished by OpenDoor's built in terminal
  6852.                emulator. The terminal emulator fully supports all ANSI and
  6853.                AVATAR level 0 and level 0+ control codes. The terminal emulator
  6854.                will also translate Remote Access/QuickBBS style control codes,
  6855.                if enabled by setting od_control.od_no_ra_codes to FALSE. The
  6856.                control codes supported by OpenDoors are listed in the chart on
  6857.                the following pages. When these control codes are inserted into
  6858.                the file, OpenDoors will replace them with various pieces of
  6859.                user or system information.
  6860.  
  6861.  
  6862.  
  6863.  
  6864.  
  6865.  
  6866.  
  6867.  
  6868.  
  6869.  
  6870.  
  6871.  
  6872.  
  6873. ===============================================================================
  6874. OpenDoors 6.00 Manual                                          End of Page 125
  6875.  
  6876.                  +-----------------------------------------------------+
  6877.                  | CONTROL | ASCII |                                   |
  6878.                  |  CODE   | VALUE | DESCRIPTION                       |
  6879.                  +---------+-------+-----------------------------------|
  6880.                  |   ^FA   | 06,65 | Displays the user's full name     |
  6881.                  |   ^FB   | 06,66 | Location the user is calling from |
  6882.                  |   ^FC   | 06,67 | Displays the user's password      |
  6883.                  |   ^FD   | 06,68 | Business/data phone number        |
  6884.                  |   ^FE   | 06,69 | Home/voice phone number           |
  6885.                  |   ^FF   | 06,70 | Date of the user's last call      |
  6886.                  |   ^FG   | 06,71 | Time of day of the last call      |
  6887.                  |   ^FH   | 06,72 | The user's `A' flags settings     |
  6888.                  |   ^FI   | 06,73 | The user's `B' flags settings     |
  6889.                  |   ^FJ   | 06,74 | The user's `C' flags settings     |
  6890.                  |   ^FK   | 06,75 | The user's `D' flags settings     |
  6891.                  |   ^FL   | 06,76 | User's remaining netmail credit   |
  6892.                  |   ^FM   | 06,77 | Number of messages posted by user |
  6893.                  |   ^FN   | 06,78 | Last read message number by user  |
  6894.                  |   ^FO   | 06,79 | Displays security level of user   |
  6895.                  |   ^FP   | 06,80 | Number of times user has called   |
  6896.                  |   ^FQ   | 06,81 | Total # of uploads by user        |
  6897.                  |   ^FR   | 06,82 | Total KBytes uploaded by user     |
  6898.                  |   ^FS   | 06,83 | Total # of downloads by user      |
  6899.                  |   ^FT   | 06,84 | Total Kbytes downloaded by user   |
  6900.                  |   ^FU   | 06,85 | # of minute user has used today   |
  6901.                  |   ^FV   | 06,86 | User's screen length setting      |
  6902.                  |   ^FW   | 06,87 | User's first name only            |
  6903.                  |   ^FX   | 06,88 | User's ANSI setting               |
  6904.                  |   ^FY   | 06,89 | User's "continue?" prompt setting |
  6905.                  |   ^FZ   | 06,90 | Does user have screen clearing on |
  6906.                  |   ^F0   | 06,48 | User's Full-screen editor setting |
  6907.                  |   ^F1   | 06,49 | User's Quiet mode setting         |
  6908.                  |   ^F2   | 06,50 | User's hot-keys setting           |
  6909.                  |   ^F3   | 06,51 | Displays the user's alias         |
  6910.                  |   ^F4   | 06,52 | The date of the User's first call |
  6911.                  |   ^F5   | 06,53 | The user's date of birth          |
  6912.                  |   ^F6   | 06,54 | User's subscription expiry date   |
  6913.                  |   ^F7   | 06,55 | Number of days until expiry       |
  6914.                  |   ^F8   | 06,56 | User's AVATAR setting             |
  6915.                  |   ^F9   | 06,57 | The user's upload:download ratio  |
  6916.                  |   ^F:   | 06,58 | User's Upload K:download K ratio  |
  6917.                  +-----------------------------------------------------+
  6918.  
  6919.  
  6920.  
  6921.  
  6922.  
  6923.  
  6924.  
  6925.  
  6926.  
  6927.  
  6928. ===============================================================================
  6929. OpenDoors 6.00 Manual                                          End of Page 126
  6930.  
  6931.                  +-----------------------------------------------------+
  6932.                  | CONTROL | ASCII |                                   |
  6933.                  |  CODE   | VALUE | DESCRIPTION                       |
  6934.                  +---------+-------+-----------------------------------|
  6935.                  |   ^F;   | 06,59 | Full-screen message reader        |
  6936.                  |   ^KA   | 11,65 | Total # of calls BBS has received |
  6937.                  |   ^KB   | 11,66 | Name of the last caller to BBS    |
  6938.                  |   ^KC   | 11,67 | Total # of active messages on BBS |
  6939.                  |   ^KD   | 11,68 | Displays # of the first message   |
  6940.                  |   ^KE   | 11,69 | Displays # of the last message    |
  6941.                  |   ^KF   | 11,70 | # of times user has paged sysop   |
  6942.                  |   ^KG   | 11,71 | Full name of the current weekday  |
  6943.                  |   ^KH   | 11,72 | Displays total number of users    |
  6944.                  |   ^KI   | 11,73 | Displays the current time         |
  6945.                  |   ^KJ   | 11,74 | Displays the current date         |
  6946.                  |   ^KK   | 11,75 | Minutes the user has been online  |
  6947.                  |   ^KL   | 11,76 | Seconds the user has been online  |
  6948.                  |   ^KM   | 11,77 | Minutes the user has used today   |
  6949.                  |   ^KN   | 11,78 | Seconds the user has used today   |
  6950.                  |   ^KO   | 11,79 | Minutes remaining for user today  |
  6951.                  |   ^KP   | 11,80 | Seconds remaining for user today  |
  6952.                  |   ^KQ   | 11,81 | The user's daily time limit       |
  6953.                  |   ^KR   | 11,82 | Displays the current baud rate    |
  6954.                  |   ^KS   | 11,83 | The current weekday in short-form |
  6955.                  |   ^KT   | 11,84 | The user's daily download limit   |
  6956.                  |   ^KU   | 11,85 | # of minutes until the next event |
  6957.                  |   ^KV   | 11,86 | Time of the next system event     |
  6958.                  |   ^KW   | 11,87 | # of node user is currently on    |
  6959.                  |   ^KX   | 11,88 | Disconnects the user              |
  6960.                  +-----------------------------------------------------+
  6961.  
  6962.  
  6963. SEE ALSO       od_disp_emu(), od_list_files(), od_hotkey_menu()
  6964.  
  6965.  
  6966. EXAMPLE        For an example of the use of the od_send_file() function in
  6967.                displaying a custom door menu, see the EX_VOTE.C example
  6968.                program, which is described beginning on page 38.
  6969.  
  6970.  
  6971.  
  6972.  
  6973.  
  6974.  
  6975.  
  6976.  
  6977.  
  6978.  
  6979.  
  6980.  
  6981.  
  6982.  
  6983. ===============================================================================
  6984. OpenDoors 6.00 Manual                                          End of Page 127
  6985.  
  6986. OD_SET_ATTRIB()
  6987. -------------------------------------------------------------------------------
  6988.  
  6989. PURPOSE        Function to change the text color in ANSI or AVATAR mode, using
  6990.                a single IBM-PC color attribute value.
  6991.  
  6992.  
  6993. FORMAT         void od_set_attrib(INT nColor);
  6994.  
  6995.  
  6996. RETURNS        N/A
  6997.  
  6998.  
  6999. DESCRIPTION    od_set_attrib() is one of two functions which change the color
  7000.                of the currently displayed text. This function allows you to set
  7001.                the text color using a single IBM-PC style color attribute. On
  7002.                the other hand, the od_set_color() function allows you to set
  7003.                the display color by specifying a foreground and background text
  7004.                color. Generally speaking, which of these two functions you use
  7005.                will be only a matter of personal preference. You will, however,
  7006.                most likely find it more convenient to use the od_set_color()
  7007.                function for changing display color. However the od_set_attrib()
  7008.                offers the advantage of allowing you to manipulate the color to
  7009.                be displayed as a single value, instead of two separate values.
  7010.                This could be convenient, for example, when displaying text in a
  7011.                user configured color. Using a single byte to represent the
  7012.                color will likely be easier than using two. An alternative
  7013.                method of setting the color of displayed text is to include the
  7014.                color codes within a string displayed by the od_printf()
  7015.                function. The benefits of doing this, along with instructions on
  7016.                how to do this, are described in the section on the od_printf()
  7017.                function, which begins on page 110.
  7018.  
  7019.                This function will only have an effect if the user has ANSI,
  7020.                AVATAR or RIP modes enabled. As a result, you can use this
  7021.                function within your door program, and have your text
  7022.                automatically displayed in multiple colors if graphics mode is
  7023.                available, and displayed without colors if graphics mode is not
  7024.                available.
  7025.  
  7026.                Note that the color to be set is passed to this function as an
  7027.                IBM-style screen attribute. Hence, you can set the color of text
  7028.                to be displayed by a single hexidecimal value, encoded as
  7029.                follows:
  7030.  
  7031.                               +------------- Background color
  7032.                               |
  7033.                             0x7f
  7034.                                |
  7035.                                +------------ Foreground color
  7036.  
  7037.  
  7038. ===============================================================================
  7039. OpenDoors 6.00 Manual                                          End of Page 128
  7040.  
  7041.                Where the left digit (most significant nibble) of the
  7042.                hexidecimal number represents the background color, and the
  7043.                right digit (least significant nibble) represents the foreground
  7044.                color. Each of the possible colors, along with their
  7045.                corresponding hexidecimal values, are listed in the charts,
  7046.                below.
  7047.  
  7048.                +-----------------------+  +--------------------------+
  7049.                |   Foreground colors   |  |   Background  | Flashing |
  7050.                +-----------------------|  +---------------+----------|
  7051.                |  0  | Black           |  |  0  | Black   |   Off    |
  7052.                |  1  | Blue            |  |  1  | Blue    |   Off    |
  7053.                |  2  | Green           |  |  2  | Green   |   Off    |
  7054.                |  3  | Cyan            |  |  3  | Cyan    |   Off    |
  7055.                |  4  | Red             |  |  4  | Red     |   Off    |
  7056.                |  5  | Magenta         |  |  5  | Magenta |   Off    |
  7057.                |  6  | Brown           |  |  6  | Brown   |   Off    |
  7058.                |  7  | White (grey)    |  |  7  | White   |   Off    |
  7059.                |  8  | Bright Black    |  |  8  | Black   |    On    |
  7060.                |  9  | Bright Blue     |  |  9  | Blue    |    On    |
  7061.                |  a  | Bright Green    |  |  a  | Green   |    On    |
  7062.                |  b  | Bright Cyan     |  |  b  | Cyan    |    On    |
  7063.                |  c  | Bright Red      |  |  c  | Red     |    On    |
  7064.                |  d  | Bright Magenta  |  |  d  | Magenta |    On    |
  7065.                |  e  | Yellow          |  |  e  | Brown   |    On    |
  7066.                |  f  | White (bright)  |  |  f  | White   |    On    |
  7067.                +-----------------------+  +--------------------------+
  7068.  
  7069.  
  7070. SEE ALSO       od_set_color(), od_disp_emu(), od_clr_scr(), od_clr_line(),
  7071.                od_set_cursor()
  7072.  
  7073.  
  7074. EXAMPLE        At times, you may wish to allow the user to select the color of
  7075.                text they wish to have displayed, perhaps to configure your door
  7076.                for the ideal colors to be displayed on their system. To
  7077.                demonstrate the use of the od_set_attrib() function, we show
  7078.                another function, which shows the user all 256 possible colors
  7079.                that can be displayed, and allows the user to choose which color
  7080.                they prefer. The function will then return the color attribute
  7081.                value of the user's chosen color.
  7082.  
  7083.                unsigned char choose_color(void)
  7084.                {
  7085.                   register unsigned char counter;   /* for displaying colors */
  7086.                   char string[4];                    /* string input by user */
  7087.  
  7088.                   od_set_attrib(0x07);                      /* display title */
  7089.                   od_disp_str("Available colors:\n\r\n\r");
  7090.  
  7091.                   for(counter=0;counter<=255;)    /* loop through all colors */
  7092.                   {
  7093. ===============================================================================
  7094. OpenDoors 6.00 Manual                                          End of Page 129
  7095.  
  7096.                      od_set_attrib(counter);        /* set appropriate color */
  7097.                      od_printf("%03.3u",counter);  /* display color's number */
  7098.                      if(((++counter)%16)==0)    /* after every 16 colors ... */
  7099.                      {
  7100.                         od_set_attrib(0x07);  /* ... reset display color ... */
  7101.                         od_disp_str("\n\r");     /* ... and start a new line */
  7102.                      }
  7103.                   }
  7104.  
  7105.                   od_set_attrib(0x07);         /* Allow user to choose color */
  7106.                   od_disp_str("Which color do you prefer : ");
  7107.                   od_input_str(string,3,'0','9');
  7108.                   return(atoi(string));               /* Return chosen color */
  7109.                }
  7110.  
  7111.  
  7112.  
  7113.  
  7114.  
  7115.  
  7116.  
  7117.  
  7118.  
  7119.  
  7120.  
  7121.  
  7122.  
  7123.  
  7124.  
  7125.  
  7126.  
  7127.  
  7128.  
  7129.  
  7130.  
  7131.  
  7132.  
  7133.  
  7134.  
  7135.  
  7136.  
  7137.  
  7138.  
  7139.  
  7140.  
  7141.  
  7142.  
  7143.  
  7144.  
  7145.  
  7146.  
  7147.  
  7148. ===============================================================================
  7149. OpenDoors 6.00 Manual                                          End of Page 130
  7150.  
  7151. OD_SET_COLOR()
  7152. -------------------------------------------------------------------------------
  7153.  
  7154. PURPOSE        Function to change the current display color in ANSI, AVATAR or
  7155.                RIP modes, using foreground and background color values.
  7156.  
  7157.  
  7158. FORMAT         void od_set_color(INT nForeground, INT nBackground);
  7159.  
  7160.  
  7161. RETURNS        N/A
  7162.  
  7163.  
  7164. DESCRIPTION    od_set_color() is one of two functions which change the color of
  7165.                the currently displayed text. This function allows you to set
  7166.                the text color using separate foreground an background text
  7167.                colors, whereas od_set_attrib() allows you to set the text color
  7168.                using a single IBM-PC style color attribute. Generally speaking,
  7169.                which of these two functions you use is only a matter of
  7170.                personal preference. An alternative method of setting the color
  7171.                of displayed text is to include the color codes within a string
  7172.                displayed by the od_printf() function. The benefits of doing
  7173.                this, along with instructions on how to do this, are described
  7174.                in the section on the od_printf() function, which begins on page
  7175.                110.
  7176.  
  7177.                This function will only have an effect if the user has ANSI,
  7178.                AVATAR or RIP mode turned on. As a result, you can use this
  7179.                function within your door program, and have your text
  7180.                automatically displayed in multiple colors if graphics mode is
  7181.                available, and displayed without colors if graphics mode is not
  7182.                available.
  7183.  
  7184.                The od_set_color() function accepts two parameters, the first
  7185.                parameter being the foreground color to be used in displaying
  7186.                text, and the second parameter being the background color to be
  7187.                used in displaying text. For example,
  7188.  
  7189.                                od_set_color(L_WHITE,D_BLACK);
  7190.  
  7191.                would set the current color to Light White on Dark Black. The
  7192.                foreground and background text colors can be any one of the
  7193.                color values listed on the following page.
  7194.  
  7195.  
  7196.  
  7197.  
  7198.  
  7199.  
  7200.  
  7201.  
  7202.  
  7203. ===============================================================================
  7204. OpenDoors 6.00 Manual                                          End of Page 131
  7205.  
  7206.  
  7207.  
  7208.                +-------------------+-----------+
  7209.                | Foreground Color  | Value     |
  7210.                +-------------------+-----------+
  7211.                | Dark Black        | D_BLACK   |
  7212.                | Dark Blue         | D_BLUE    |
  7213.                | Dark Green        | D_GREEN   |
  7214.                | Dark Cyan         | D_CYAN    |
  7215.                | Dark Red          | D_RED     |
  7216.                | Dark Magenta      | D_MAGENTA |
  7217.                | Dark Brown        | D_BROWN   |
  7218.                | Grey (Dark White) | D_GREY    |
  7219.                | Light Black (Grey)| L_BLACK   |
  7220.                | Light Blue        | L_BLUE    |
  7221.                | Light Green       | L_GREEN   |
  7222.                | Light Cyan        | L_CYAN    |
  7223.                | Light Red         | L_RED     |
  7224.                | Light Magenta     | L_MAGENTA |
  7225.                | Yellow            | L_YELLOW  |
  7226.                | White             | L_WHITE   |
  7227.                +-------------------+-----------+
  7228.  
  7229.  
  7230.                +-------------------+-----------+
  7231.                | Background Color  | Value     |
  7232.                +-------------------+-----------+
  7233.                | Black             | D_BLACK   |
  7234.                | Blue              | D_BLUE    |
  7235.                | Green             | D_GREEN   |
  7236.                | Cyan              | D_CYAN    |
  7237.                | Red               | D_RED     |
  7238.                | Magenta           | D_MAGENTA |
  7239.                | Brown             | D_BROWN   |
  7240.                | Grey              | D_GREY    |
  7241.                | Blinking Black    | B_BLACK   |
  7242.                | Blinking Blue     | B_BLUE    |
  7243.                | Blinking Green    | B_GREEN   |
  7244.                | Blinking Cyan     | B_CYAN    |
  7245.                | Blinking Red      | B_RED     |
  7246.                | Blinking Magenta  | B_MAGENTA |
  7247.                | Blinking Brown    | B_BROWN   |
  7248.                | Blinking Grey     | B_WHITE   |
  7249.                +-------------------+-----------+
  7250.  
  7251.  
  7252. SEE ALSO       od_set_attrib(), od_disp_emu(), od_clr_scr(), od_clr_line(),
  7253.                od_set_cursor()
  7254.  
  7255. EXAMPLE        As an example of using the od_set_color() function to set the
  7256.                color of displayed text, we show a pair of two functions. These
  7257.                functions will allow a program to set the foreground OR
  7258. ===============================================================================
  7259. OpenDoors 6.00 Manual                                          End of Page 132
  7260.  
  7261.                background color of text, without setting the other. In
  7262.                contrast, the od_set_color() function sets both the foreground
  7263.                and background color at the same time. These function presume
  7264.                that they are the only functions used within the door to set the
  7265.                color of displayed text, and that the original text color prior
  7266.                to calling either of these functions is dark white on black.
  7267.                These function must also have access to the two global variables
  7268.                "current_foreground" and "current_background", as defined below.
  7269.  
  7270.  
  7271.                void set_foreground(char foreground);
  7272.                void set_background(char background);
  7273.                unsigned char current_foreground=D_BLACK;
  7274.                unsigned char current_background=D_GREY;
  7275.  
  7276.                void set_foreground(char foreground)
  7277.                {                                       /* set new text color */
  7278.                   od_set_color(foreground, current_background);
  7279.                   current_foreground=foreground;      /* save new foreground */
  7280.                }
  7281.  
  7282.                void set_background(char background)
  7283.                {                                       /* set new text color */
  7284.                   od_set_color(current_foreground, background);
  7285.                   current_background=background;      /* save new background */
  7286.                }
  7287.  
  7288.  
  7289.                Using these functions, you would then be able to set just the
  7290.                foreground text color by a function call like:
  7291.  
  7292.                          set_foreground(L_YELLOW);
  7293.  
  7294.                Or set just the background text color by a function call like:
  7295.  
  7296.                          set_background(D_GREY);
  7297.  
  7298.  
  7299.  
  7300.  
  7301.  
  7302.  
  7303.  
  7304.  
  7305.  
  7306.  
  7307.  
  7308.  
  7309.  
  7310.  
  7311.  
  7312.  
  7313. ===============================================================================
  7314. OpenDoors 6.00 Manual                                          End of Page 133
  7315.  
  7316. OD_SET_CURSOR()
  7317. -------------------------------------------------------------------------------
  7318.  
  7319. PURPOSE        Function to reposition the text cursor in ANSI, AVATAR or RIP
  7320.                mode
  7321.  
  7322.  
  7323. FORMAT         void od_set_cursor(INT nRow, INT nColumn);
  7324.  
  7325.  
  7326. RETURNS        N/A
  7327.  
  7328.  
  7329. DESCRIPTION    This function repositions the cursor to the specified row and
  7330.                column on the screen. nRow can have a value of 1 to 23, and
  7331.                nColumn can have a value of 1 to 80. ANSI, AVATAR or RIP mode
  7332.                must be active.
  7333.  
  7334.  
  7335. SEE ALSO       od_disp_emu(), od_clr_scr(), od_clr_line(), od_set_color(),
  7336.                od_set_attrib()
  7337.  
  7338.  
  7339. EXAMPLE        Below is a simple example that demonstrates the use of the
  7340.                od_set_cursor() function. Note that this example detects whether
  7341.                or not graphics mode is available, and if it is not, will carry
  7342.                out the same task without the use of od_set_cursor().
  7343.  
  7344.                             od_init();         /* Initialize door operations */
  7345.                             od_clr_scr();                /* Clear the screen */
  7346.                             if(od_control.user_ansi || od_control.user_avatar)
  7347.                             {               /* If graphics mode is available */
  7348.                                od_set_cursor(1,1);           /* Display demo */
  7349.                                od_disp_str("Top, Left Corner");
  7350.  
  7351.                                od_set_cursor(1,70);
  7352.                                od_disp_str("Top, Right Corner");
  7353.  
  7354.                                od_set_cursor(15,1);
  7355.                                od_disp_str("Fifteenth line\n\r");
  7356.                             }
  7357.                             else        /* If graphics mode is not available */
  7358.                             {                                /* Display demo */
  7359.                                od_disp_str("Top, Left Corner");
  7360.                                od_repeat(' ', 54);
  7361.                                od_disp_str("Top, Right Corner\n\r");
  7362.                                od_disp_str("\n\n\n\n\n\n\n\n\n\n\n\n\n");
  7363.                                od_disp_str("Fifteenth line\n\r");
  7364.                             }
  7365.                             od_get_key(TRUE);  /* Wait for user to press key */
  7366.  
  7367.  
  7368. ===============================================================================
  7369. OpenDoors 6.00 Manual                                          End of Page 134
  7370.  
  7371. OD_SET_DTR()
  7372. -------------------------------------------------------------------------------
  7373.  
  7374. PURPOSE        Controls the DTR (Data Terminal Ready) signal to the modem. Used
  7375.                primarily to cause the modem to "hang up".
  7376.  
  7377.  
  7378. FORMAT         void od_set_dtr(BOOL bHigh);
  7379.  
  7380.  
  7381. RETURNS        N/A
  7382.  
  7383.  
  7384. DESCRIPTION    In certain circumstances (such as call back verification doors),
  7385.                you may wish to "hang up" the modem without exiting your door
  7386.                program. This can be accomplished with most modems by
  7387.                controlling the DTR (Data Terminal Ready) signal to the modem.
  7388.                Passing a FALSE value to od_set_dtr() causes the DTR signal to
  7389.                be set low, and passing a TRUE value causes the DTR signal to be
  7390.                set high. Normally, OpenDoors maintains the DTR signal in its
  7391.                high state. Since most (but not all) modems are configured to
  7392.                disconnect from the remote modem when the DTR signal is set low,
  7393.                calling od_set_dtr(FALSE) can be used to hangup the modem. When
  7394.                hanging up by this method, you should be sure to set the DTR
  7395.                signal high again, after the carrier detect signal has
  7396.                disappeared. For more information on determining the state of
  7397.                the carrier detect signal, see the od_carrier() function, which
  7398.                is described on page 51. Note that not all modems will
  7399.                disconnect from the remote user in response to your lowering the
  7400.                DTR signal. If your software may be used with such modems, you
  7401.                may wish to also provide the option of disconnecting the modem
  7402.                by sending a "hang up" command sequence to the modem.
  7403.  
  7404.                Since OpenDoors normally monitors the carrier detect signal, and
  7405.                exits when this signal disappears, you will have to disable
  7406.                OpenDoor's carrier detection if you wish your program to
  7407.                continue executing after hanging up the modem. OpenDoor's
  7408.                automatic carrier detection can be disabled using the
  7409.                od_control.od_disable OpenDoors control structure variable, as
  7410.                follows:
  7411.  
  7412.                     od_control.od_disable |= DIS_CARRIERDETECT;
  7413.  
  7414. SEE ALSO       od_carrier(), od_exit()
  7415.  
  7416.  
  7417. EXAMPLE        For an example of using the od_set_dtr() function to "hang up"
  7418.                the modem, see the example that accompanies the od_carrier()
  7419.                function, which is described on page 52.
  7420.  
  7421.  
  7422.  
  7423. ===============================================================================
  7424. OpenDoors 6.00 Manual                                          End of Page 135
  7425.  
  7426. OD_SET_PERSONALITY()
  7427. -------------------------------------------------------------------------------
  7428.  
  7429. PURPOSE        Sets the current status line / sysop function key personality to
  7430.                be used.
  7431.  
  7432.  
  7433. FORMAT         BOOL od_set_personality(char *pszName);
  7434.  
  7435.  
  7436. RETURNS        TRUE on success
  7437.                FALSE on failure
  7438.  
  7439.  
  7440. DESCRIPTION    This function changes the current status line / sysop function
  7441.                key personality. The pszName parameter should contain the string
  7442.                which uniquely identifies the personality to be set. This
  7443.                function may only be used by OpenDoors programs which include
  7444.                the OpenDoors "Multiple Personality System". To enable use of
  7445.                the MPS, include the following line before your first call to
  7446.                any OpenDoors function:
  7447.  
  7448.                          od_control.od_mps=INCLUDE_MPS;
  7449.  
  7450.                OpenDoors includes a number of built-in personalities.
  7451.                Additional personalities may be added using the
  7452.                od_add_personality() function, which is described on page 47.
  7453.                The following personalities are included with this version of
  7454.                OpenDoors:
  7455.  
  7456.                     Name                Description
  7457.                     -----------------------------------------------------------
  7458.                     Standard            OpenDoors style, similar to RA 1.11
  7459.                     PCBoard             Similar to PC-Board
  7460.                     RemoteAccess        Similar to RemoteAccess 2.x
  7461.                     Wildcat             Similar to Wildcat!
  7462.  
  7463.                Personality names are not case sensitive. For more information
  7464.                on the OpenDoors Multiple Personality System, see the section
  7465.                which begins on page 233.
  7466.  
  7467.                This function returns TRUE on success, or FALSE on failure. In
  7468.                the case of a failure, the od_control.od_error variable is set
  7469.                to indicate the nature of the failure. For more information on
  7470.                the od_control.od_error variables, see page 185.
  7471.  
  7472.  
  7473. SEE ALSO       od_add_personality(), od_set_statusline()
  7474.  
  7475.  
  7476.  
  7477.  
  7478. ===============================================================================
  7479. OpenDoors 6.00 Manual                                          End of Page 136
  7480.  
  7481. OD_SET_STATUSLINE()
  7482. -------------------------------------------------------------------------------
  7483.  
  7484. PURPOSE        To set the currently displayed status line.
  7485.  
  7486.  
  7487. FORMAT         void od_set_statusline(INT nSetting);
  7488.  
  7489.  
  7490. RETURNS        N/A
  7491.  
  7492.  
  7493. DESCRIPTION    If you have the OpenDoors status line enabled within your door
  7494.                program (as is the default), the sysop will be able to control
  7495.                the setting of the status line using the F1 - F10 keys on the
  7496.                keyboard. These function keys are as follows:
  7497.  
  7498.                          [F1] -  Display basic door and user information
  7499.                          [F2] -  Display phone numbers and important dates
  7500.                          [F3] -  Display security flags and up/download info
  7501.                          [F4] -  Display system information and current time
  7502.                          [F5] -  Display message info and user's settings
  7503.                          [F6] -  Display chat reason and sysop's comment
  7504.                          [F9] -  Display help information for sysop
  7505.                          [F10] - Turn off the status line
  7506.  
  7507.                Using the od_set_statusline() function, you can manually set
  7508.                which of these status line settings is currently selected. The
  7509.                od_set_statusline() accepts a single parameter, which should be
  7510.                one of the values listed below, which indicates which status
  7511.                line you would like to have selected:
  7512.  
  7513.                +---------------+---------------+------------------------------+
  7514.                |               | Corresponding |                              |
  7515.                | Value         | Function Key  | Meaning                      |
  7516.                +---------------+---------------+------------------------------+
  7517.                | STATUS_NORMAL | [F1]          | Basic door and user info     |
  7518.                | STATUS_NONE   | [F10]         | Turn off status line         |
  7519.                | STATUS_HELP   | [F9]          | Displays help for the sysop  |
  7520.                | STATUS_USER1  | [F2]          | Phone Numbers and dates      |
  7521.                | STATUS_USER2  | [F3]          | Security flags & up/downloads|
  7522.                | STATUS_USER3  | [F5]          | Message info & user settings |
  7523.                | STATUS_USER4  | [F6]          | Chat reason and sysop comment|
  7524.                | STATUS_SYSTEM | [F4]          | System info & current time   |
  7525.                +---------------+---------------+------------------------------+
  7526.                (Note that these keys may be customized using variables in the
  7527.                 OpenDoors control structure.)
  7528.  
  7529.                Keep in mind that the od_set_statusline() function only
  7530.                temporarily changes the current status line setting, and that
  7531.                the sysop will still be able to change the status line to any of
  7532.                the other settings using the function keys. For instance, if you
  7533. ===============================================================================
  7534. OpenDoors 6.00 Manual                                          End of Page 137
  7535.  
  7536.                wished to allow the sysop to normally see all 25 lines of text
  7537.                displayed by your door, but at the same time to still allow the
  7538.                sysop to turn on the status line at any time, you could place
  7539.                the line
  7540.  
  7541.                          od_set_statusline(STATUS_NONE);
  7542.  
  7543.                at the beginning of your program. Similarly, when the user pages
  7544.                the sysop, OpenDoors itself calls
  7545.  
  7546.                          od_set_statusline(STATUS_USER4);
  7547.  
  7548.                in order to display the status line which shows the user's
  7549.                reason for chat, while still allowing the sysop to switch back
  7550.                to any of the other status lines.
  7551.  
  7552.                If you wish to permanently turn off the OpenDoor's status line,
  7553.                without allowing the sysop to be able to turn it back on using
  7554.                the sysop function keys, simply set the
  7555.                "od_control.od_status_on" variable to FALSE. This variable is
  7556.                described in the OpenDoors control structure section of this
  7557.                manual, which begins on page 148.
  7558.  
  7559.  
  7560.  
  7561.  
  7562.  
  7563.  
  7564.  
  7565.  
  7566.  
  7567.  
  7568.  
  7569.  
  7570.  
  7571.  
  7572.  
  7573.  
  7574.  
  7575.  
  7576.  
  7577.  
  7578.  
  7579.  
  7580.  
  7581.  
  7582.  
  7583.  
  7584.  
  7585.  
  7586.  
  7587.  
  7588. ===============================================================================
  7589. OpenDoors 6.00 Manual                                          End of Page 138
  7590.  
  7591. OD_SLEEP()
  7592. -------------------------------------------------------------------------------
  7593.  
  7594. PURPOSE        Suspends program execution, yielding control to other tasks in a
  7595.                multitasking environment.
  7596.  
  7597.  
  7598. FORMAT         void od_sleep(tODMilliSec Milliseconds);
  7599.  
  7600.  
  7601. RETURNS        N/A
  7602.  
  7603.  
  7604. DESCRIPTION    od_sleep() suspends execution of your program for the specified
  7605.                number of milliseconds. Note that under the DOS version of
  7606.                OpenDoors, this value is rounded to the nearest 55 milliseconds.
  7607.                While the program's execution is suspended, od_sleep() yields
  7608.                control of the processor to other tasks in a multitasking
  7609.                environment.
  7610.  
  7611.                Calling od_sleep() with a sleep time of 0 causes control to be
  7612.                yielded to other waiting processes without imposing a minimum
  7613.                sleep time. If no other processes are waiting to execute, the
  7614.                function returns immediately. OpenDoors automatically calls
  7615.                od_sleep(0) itself in most of the situations where there is a
  7616.                need to do so. However, there may be circumstances under which
  7617.                od_sleep(0) can be used to improve performance. In particular,
  7618.                od_sleep(0) can be used to improve the performance of other
  7619.                applications that are also running at the same time as yours. By
  7620.                calling od_sleep(0), you are essentially telling the operating
  7621.                system that your program doesn't currently need all of the
  7622.                processing time that has been allocated to it. While appropriate
  7623.                use of od_sleep(0) can improve overall system performance,
  7624.                overusing od_sleep(0) can dramatically degrade the performance
  7625.                of your own program. The only way to determine the optimal use
  7626.                of od_sleep(0)  is by trial and error.
  7627.  
  7628.                The most common situation where you might want to use
  7629.                od_sleep(0) is when your program cannot do anything useful until
  7630.                you receive input from the user, but for some reason you cannot
  7631.                call od_get_key(TRUE). Rather than sitting in a tight loop,
  7632.                repeatedly checking where the user has pressed a key yet, it is
  7633.                better to call od_sleep(0) to let other tasks run for a while
  7634.                before checking again. OpenDoors calls od_sleep(0) itself under
  7635.                any of the following circumstances:
  7636.  
  7637.                     - When transmitting characters, if the outbound serial
  7638.                       buffer is full, OpenDoors yields while waiting for some
  7639.                       of the characters in the buffer to be sent.
  7640.                     - During od_get_key(), if called with the wait parameter
  7641.                       set to TRUE.
  7642.  
  7643. ===============================================================================
  7644. OpenDoors 6.00 Manual                                          End of Page 139
  7645.  
  7646.                     - While waiting for input, during the execution of any of
  7647.                       the following input functions: od_get_answer(),
  7648.                       od_hotkey_menu() (after menu has been displayed),
  7649.                       od_popup_menu(), od_edit_str(), od_input_str().
  7650.                     - While pausing at the end of a screen during
  7651.                       od_send_file(), od_list_files(), od_hotkey_menu().
  7652.                     - During chat mode.
  7653.  
  7654.  
  7655. SEE ALSO       od_kernel()
  7656.  
  7657.  
  7658.  
  7659.  
  7660.  
  7661.  
  7662.  
  7663.  
  7664.  
  7665.  
  7666.  
  7667.  
  7668.  
  7669.  
  7670.  
  7671.  
  7672.  
  7673.  
  7674.  
  7675.  
  7676.  
  7677.  
  7678.  
  7679.  
  7680.  
  7681.  
  7682.  
  7683.  
  7684.  
  7685.  
  7686.  
  7687.  
  7688.  
  7689.  
  7690.  
  7691.  
  7692.  
  7693.  
  7694.  
  7695.  
  7696.  
  7697.  
  7698. ===============================================================================
  7699. OpenDoors 6.00 Manual                                          End of Page 140
  7700.  
  7701. OD_SPAWN()
  7702. -------------------------------------------------------------------------------
  7703.  
  7704. PURPOSE        To facilitate easy execution of child tasks from doors.
  7705.  
  7706.  
  7707. FORMAT         BOOL od_spawn(char *pszCommandLine);
  7708.  
  7709.  
  7710. RETURNS        TRUE on success,
  7711.                FALSE on failure
  7712.  
  7713.  
  7714. DESCRIPTION    This function allows you to easily run other programs from
  7715.                within your door programs, such as external file transfer
  7716.                utilities, compression utilities, and so on.
  7717.  
  7718.                This function will attempt to swap OpenDoors and your entire
  7719.                door to expanded memory or disk. OpenDoors swapping can be
  7720.                controlled by the OpenDoors control structure variables,
  7721.                od_swapping_disable, od_swapping_ems and od_swap_path. The
  7722.                od_spawn...() functions first attempt to swap OpenDoors to EMS
  7723.                memory. If enough EMS 3.2 or later memory is available, it will
  7724.                be used. If not, OpenDoors will swap to a disk file in the
  7725.                directory specified by the od_control.od_swap_path variable.
  7726.  
  7727.                Unlike the other Turbo C(++) / Borland C++ library functions
  7728.                such as system() or spawnf(), this function will automatically
  7729.                store the door screen prior to executing the sub-program, and
  7730.                will restore the screen upon return. This function will also
  7731.                store the current drive and directory settings prior to
  7732.                executing the program, and restore them after the program has
  7733.                returned.
  7734.  
  7735.                Normally, the user's time will continue to be decreased during
  7736.                the execution of the od_spawn() function. However, you can
  7737.                freeze the user's time during the spawn process by using the
  7738.                OpenDoors control structure variable od_spawn_freeze_time.
  7739.  
  7740.  
  7741. SEE ALSO       od_spawnvpe()
  7742.  
  7743.  
  7744. EXAMPLE        Below are a few examples of various uses of the od_spawn()
  7745.                function:
  7746.  
  7747.                To run the command processor from within your door program, to
  7748.                allow the sysop access to the DOS shell, simply use the
  7749.                following line of code:
  7750.  
  7751.                               od_spawn(getenv("COMSPEC"));
  7752.  
  7753. ===============================================================================
  7754. OpenDoors 6.00 Manual                                          End of Page 141
  7755.  
  7756.                The following function is an example of using the od_spawn()
  7757.                function to call DSZ, allowing the user to download a file. You
  7758.                pass the name of the file that you wish to send to the user.
  7759.                This function will then ask the user what transfer protocol they
  7760.                would like to use, generate the appropriate DSZ command line,
  7761.                and then transmit the file to the user. Note that in order to
  7762.                use a door which implements this function, the external file
  7763.                transfer program "DSZ" must be available in the current search
  7764.                path. As an alternative, you may want to allow the sysop to
  7765.                specify the location of the DSZ file from within a configuration
  7766.                program. If you wish to receive a file (allow the user to
  7767.                upload), instead of sending one, simply change the "s" in the
  7768.                command line to a "r".
  7769.  
  7770.                char download(char *filename)
  7771.                {
  7772.                   char commandline[80];/* string containing DSZ command line */
  7773.                   char protocol;   /* character representing chosen protocol */
  7774.  
  7775.                                                     /* display protocol menu */
  7776.                   od_printf("Select File Transfer Protocol:\n\r");
  7777.                   od_printf("   [X] XModem\n\r");
  7778.                   od_printf("   [Y] YModem\n\r");
  7779.                   od_printf("   [Z] ZModem\n\r");
  7780.                   od_printf("or press [A] to abort transfer\n\r");
  7781.  
  7782.                   do            /* loop until valid protocol has been chosen */
  7783.                   {
  7784.                      protocol=od_get_key();                       /* get key */
  7785.                                               /* abort if [A] key is pressed */
  7786.                      if(protocol=='a' || protocol=='A') return(FALSE);
  7787.                   } while(protocol!='x' && protocol!='y' && protocol!='z' &&
  7788.                           protocol!='X' && protocol!='Y' && protocol!='Z');
  7789.  
  7790.                   od_printf("Begin receiving file now or press [CTRL]-[X] to
  7791.                              abort\n\r");
  7792.                                                 /* generate DSZ command line */
  7793.                   sprintf(commandline,"dsz port %d s%c %s",
  7794.                           od_control.port+1,
  7795.                           protocol,
  7796.                           filename);
  7797.  
  7798.                   return(od_spawn(commandline));             /* spawn to DSZ */
  7799.                }
  7800.  
  7801.  
  7802.  
  7803.  
  7804.  
  7805.  
  7806.  
  7807.  
  7808. ===============================================================================
  7809. OpenDoors 6.00 Manual                                          End of Page 142
  7810.  
  7811.  
  7812. OD_SPAWNVPE()
  7813. -------------------------------------------------------------------------------
  7814.  
  7815. PURPOSE        To facilitate easy execution of child tasks from doors. Allows
  7816.                specification of child's environment, returns errorlevel
  7817.                returned by child task, and searches path for the executable
  7818.                file.
  7819.  
  7820.  
  7821. FORMAT         INT16 od_spawnvpe(INT16 nModeFlag, char *pszPath,
  7822.                   char *papszArg[], char *papszEnv[]);
  7823.  
  7824.  
  7825. RETURNS        -1 on failure
  7826.                errorlevel returned by child process on success
  7827.  
  7828.  
  7829. DESCRIPTION    This function behaves very similarly to the od_spawn() function.
  7830.                Thus, to save space in the manual, I will not recapitulate what
  7831.                is already said in the description of the od_spawn() function.
  7832.                Instead, this description concentrates on the additional
  7833.                features available through the od_spawnvpe() function. If you
  7834.                are not already familiar with the od_spawn() function, take a
  7835.                moment now to review the description of that function.
  7836.  
  7837.                The od_spawn() function (the OpenDoors "quick-spawn" function)
  7838.                is designed to be quick and easy to use, but does not have all
  7839.                of the features available in the od_spawnvpe() function. In
  7840.                addition to the features of the od_spawn() function, the
  7841.                od_spawnvpe() function also provides the following features:
  7842.  
  7843.                          - od_spawnvpe() will search the "path" for the file
  7844.                            to be executed.
  7845.  
  7846.                          - od_spawnvpe() allows you to pass an altered
  7847.                            environment to the child process.
  7848.  
  7849.                          - od_spawnvpe() returns the errorlevel returned by
  7850.                            the child process.
  7851.  
  7852.                The parameters passed to the od_spawnvpe() function are
  7853.                identical to those passed to the C spawnvpe() function. The
  7854.                first parameter should usually the be P_WAIT flag. The second
  7855.                parameter is the name of the child program to execute. If a full
  7856.                path to the child program is not specified, and the child
  7857.                program does not exist in the current directory, OpenDoors will
  7858.                search the directories listed by the PATH environment variable.
  7859.                Also, if the .EXE or .COM extension is not provide, OpenDoors
  7860.                will look first for a .COM file, and if not found, for a .EXE
  7861.                file. The third parameter is an array of arguments to pass to
  7862.                the child process, or NULL if no arguments are to be passed. The
  7863. ===============================================================================
  7864. OpenDoors 6.00 Manual                                          End of Page 143
  7865.  
  7866.                fourth parameter is the environment to be passed to the child
  7867.                process, or NULL if the a copy of the current environment should
  7868.                be used.
  7869.  
  7870.  
  7871. SEE ALSO       od_spawn()
  7872.  
  7873.  
  7874. EXAMPLE        For an example of the use of the od_spawn...() functions, see
  7875.                the example accompanying the od_spawn() function. As a specific
  7876.                example of the od_spawnvpe function, consider the following code
  7877.                which executes the "TEST.EXE" program.
  7878.  
  7879.                          od_spawnvpe(P_WAIT,"TEST.EXE",NULL,NULL);
  7880.  
  7881.  
  7882.  
  7883.  
  7884.  
  7885.  
  7886.  
  7887.  
  7888.  
  7889.  
  7890.  
  7891.  
  7892.  
  7893.  
  7894.  
  7895.  
  7896.  
  7897.  
  7898.  
  7899.  
  7900.  
  7901.  
  7902.  
  7903.  
  7904.  
  7905.  
  7906.  
  7907.  
  7908.  
  7909.  
  7910.  
  7911.  
  7912.  
  7913.  
  7914.  
  7915.  
  7916.  
  7917.  
  7918. ===============================================================================
  7919. OpenDoors 6.00 Manual                                          End of Page 144
  7920.  
  7921. OD_WINDOW_CREATE()
  7922. -------------------------------------------------------------------------------
  7923.  
  7924. PURPOSE        Creates a popup window of the specified size and color, storing
  7925.                the contents of the screen "under" the window. The window can
  7926.                later be removed from the screen, restoring the original
  7927.                contents of the screen "under" the window, using the
  7928.                od_window_remove() function. Requires ANSI, AVATAR or RIP mode.
  7929.  
  7930.  
  7931. FORMAT         void *od_window_create(INT nLeft, INT nTop, INT nRight, INT
  7932.                nBottom,
  7933.                     char *pszTitle, BYTE btBorderCol, BYTE btTitleCol,
  7934.                     BYTE btInsideCol, INT nReserved);
  7935.  
  7936.  
  7937. RETURNS        Pointer to newly allocated window structure on success
  7938.                NULL on failure
  7939.  
  7940.  
  7941. DESCRIPTION    This function creates a pop-up window on the remote and local
  7942.                screens. The contents of the screen beneath the window are
  7943.                stored, to allow the window to later be removed from the screen
  7944.                using the od_window_remove() function. The window is drawn using
  7945.                the boarder characters defined in the already existing
  7946.                od_control.od_box_chars[] array. The boarder is displayed using
  7947.                the color attribute specified in btBorderCol. The working area
  7948.                of the window is created in the color specified in btInsideCol.
  7949.                A title may optionally be displayed on the window by specifying
  7950.                a string in pszTitle. This title will be displayed in the color
  7951.                specified by btTitleCol. If you do not wish a title to be
  7952.                displayed, pass an empty string or NULL pointer in pszTitle. On
  7953.                success, od_window_create() will return a pointer to a buffer
  7954.                which was allocated to store information on the window and the
  7955.                contents of the screen "under" the window. This pointer should
  7956.                at some point be passed in a call to od_window_remove().
  7957.  
  7958.                This function requires ANSI, AVATAR or RIP graphics mode. If
  7959.                AVATAR mode is active, this function will take advantage of
  7960.                special AVATAR control sequences to display the window much
  7961.                faster than is possible in ANSI mode. In ANSI mode, window
  7962.                display will be slightly faster if btBorderCol and btTitleCol
  7963.                are equal. Note that the nReserved parameter of this function is
  7964.                not currently used. To preserve compatibility with future
  7965.                versions of OpenDoors, this parameter should always be set to 0.
  7966.                Currently, the size of the buffer allocated to store the window
  7967.                information will be (length*width*2) + 4 bytes in size.
  7968.  
  7969.                If od_window_create() fails for any reason, a value of NULL is
  7970.                returned, and the od_control.od_error variable is set to
  7971.                indicate the reason for the failure. For more information on the
  7972.                od_control.od_error variable, see page 185.
  7973. ===============================================================================
  7974. OpenDoors 6.00 Manual                                          End of Page 145
  7975.  
  7976.  
  7977.  
  7978. SEE ALSO       od_window_remove(), od_draw_box(), od_gettext(), od_puttext(),
  7979.                od_save_screen(), od_restore_screen(), od_scroll()
  7980.  
  7981.  
  7982. EXAMPLE        For an example of the use of the od_window_create() function,
  7983.                see the included ex_chat.c example program.
  7984.  
  7985.  
  7986.  
  7987.  
  7988.  
  7989.  
  7990.  
  7991.  
  7992.  
  7993.  
  7994.  
  7995.  
  7996.  
  7997.  
  7998.  
  7999.  
  8000.  
  8001.  
  8002.  
  8003.  
  8004.  
  8005.  
  8006.  
  8007.  
  8008.  
  8009.  
  8010.  
  8011.  
  8012.  
  8013.  
  8014.  
  8015.  
  8016.  
  8017.  
  8018.  
  8019.  
  8020.  
  8021.  
  8022.  
  8023.  
  8024.  
  8025.  
  8026.  
  8027.  
  8028. ===============================================================================
  8029. OpenDoors 6.00 Manual                                          End of Page 146
  8030.  
  8031. OD_WINDOW_REMOVE()
  8032. -------------------------------------------------------------------------------
  8033.  
  8034. PURPOSE        Removes a window previously created using od_window_create(),
  8035.                restoring the original screen background.
  8036.  
  8037.  
  8038. FORMAT         BOOL od_window_remove(void *pWinInfo);
  8039.  
  8040.  
  8041. RETURNS        TRUE on success
  8042.                FALSE on failure
  8043.  
  8044.  
  8045. DESCRIPTION    The od_window_remove() function removes a window from the screen
  8046.                which was previously created by od_window_create(), and
  8047.                deallocates the memory which was allocated to store the window
  8048.                information. The contents of the screen beneath the window is
  8049.                restored to appear as it did prior to the call to
  8050.                od_window_create(). pWinInfo must point to the value returned by
  8051.                od_window_create().
  8052.  
  8053.                Note that overlapping windows must be removed in the reverse
  8054.                order from which they were created for proper display results.
  8055.                The last window to be created must be the first window to be
  8056.                removed.
  8057.  
  8058.                If od_window_remove() fails for any reason, a value of FALSE is
  8059.                returned, and the od_control.od_error variable is set to
  8060.                indicate the reason for the failure. For more information on the
  8061.                od_control.od_error variable, see page 185.
  8062.  
  8063.  
  8064. SEE ALSO       od_window_create(), od_draw_box(), od_gettext(), od_puttext(),
  8065.                od_save_screen(), od_restore_screen(), od_scroll()
  8066.  
  8067.  
  8068. EXAMPLE        For an example of the use of the od_window_remove() function,
  8069.                see the included ex_chat.c example program.
  8070.  
  8071.  
  8072.  
  8073.  
  8074.  
  8075.  
  8076.  
  8077.  
  8078.  
  8079.  
  8080.  
  8081.  
  8082.  
  8083. ===============================================================================
  8084. OpenDoors 6.00 Manual                                          End of Page 147
  8085.  
  8086.  555555
  8087.  55
  8088.  55
  8089.  55555
  8090.      55
  8091.      55
  8092.  55555
  8093. -------------------------------------------------------------------------------
  8094. CHAPTER 5 - THE OPENDOORS CONTROL STRUCTURE
  8095.  
  8096.  
  8097.  
  8098.  
  8099. INTRODUCTION TO THE CONTROL STRUCTURE
  8100. -------------------------------------------------------------------------------
  8101.  
  8102.                The OpenDoors "Control Structure" is used by OpenDoors in order
  8103.                to provide you with a wide range of information about the system
  8104.                on which you door is running, and the user who is currently
  8105.                using the door, along with providing you a means by which to
  8106.                customize much of OpenDoor's behavior. Using the OpenDoors
  8107.                control structure, you can access or alter information about the
  8108.                user who is online, information about the system on which your
  8109.                door is running, and information about OpenDoors itself. You can
  8110.                also use the control structure to customize all of the text
  8111.                displayed by OpenDoors, the function keys to which it responds,
  8112.                and many other aspects of OpenDoor's behavior.
  8113.  
  8114.                The OpenDoors control structure is quite simply a normal C
  8115.                "struct", named od_control, and is defined in the OPENDOOR.H
  8116.                file. This "struct" contains many different variables, which
  8117.                provide you access to the information provided by the control
  8118.                structure. Hence, to access the contents of a control structure
  8119.                variable, for example the variable "system_name" which contains
  8120.                the name of the BBS the door is running under, you would use:
  8121.  
  8122.                                   od_control.system_name
  8123.  
  8124.                The following section of this chapter contains a complete
  8125.                reference to all of the variables which make up the OpenDoors
  8126.                control structure. This reference includes the name, type and
  8127.                complete description of the use of each variable. The reference
  8128.                is divided into the following categories of variables, with the
  8129.                reference to the variables in each section beginning on the
  8130.                listed page.
  8131.  
  8132.                          Door Information File Statistics..................150
  8133.                          Modem Settings....................................153
  8134.                          BBS and Caller Information........................158
  8135.                          Door Settings.....................................182
  8136.                          OpenDoors Behavior Customization..................187
  8137.                          Function Keys Customization.......................212
  8138. ===============================================================================
  8139. OpenDoors 6.00 Manual                                          End of Page 148
  8140.  
  8141.                          Color Customization...............................237
  8142.                          Text Customization................................217
  8143.  
  8144.                Within each section, variables are listed alphabetically by
  8145.                name.
  8146.  
  8147.                Also, in order to make use of some of the variables in the
  8148.                OpenDoors control structure, it is important to understand the
  8149.                concepts of Boolean (TRUE/FALSE), and bit-mapped flag variables.
  8150.                If you are not familiar with these two terms, they are described
  8151.                in detail in the glossary, located towards the end of this
  8152.                manual.
  8153.  
  8154.  
  8155.  
  8156.  
  8157.  
  8158.  
  8159.  
  8160.  
  8161.  
  8162.  
  8163.  
  8164.  
  8165.  
  8166.  
  8167.  
  8168.  
  8169.  
  8170.  
  8171.  
  8172.  
  8173.  
  8174.  
  8175.  
  8176.  
  8177.  
  8178.  
  8179.  
  8180.  
  8181.  
  8182.  
  8183.  
  8184.  
  8185.  
  8186.  
  8187.  
  8188.  
  8189.  
  8190.  
  8191.  
  8192.  
  8193. ===============================================================================
  8194. OpenDoors 6.00 Manual                                          End of Page 149
  8195.  
  8196. CONTROL STRUCTURE - DOOR INFO FILE STATS
  8197. -------------------------------------------------------------------------------
  8198.  
  8199.                The following OpenDoors control structure variables provide your
  8200.                program with information concerning the door information file
  8201.                from which OpenDoors obtained the BBS and caller information
  8202.                that is found elsewhere in the control structure. The following
  8203.                control structure items are listed in this section:
  8204.  
  8205.                info_path                Sets the location and, optionally, the
  8206.                                         name of the door information file
  8207.  
  8208.                od_info_type             Type of door information file that was
  8209.                                         found
  8210.  
  8211.                od_node                  Node number the door is running under
  8212.  
  8213.                user_timeofcreation      The time at which the door information
  8214.                                         file was created
  8215.  
  8216.  
  8217.  
  8218.  
  8219. -------------------------------------------------------------------------------
  8220. info_path      char od_control.info_path[60];
  8221.  
  8222.                If used, this variable should be set prior to calling od_init()
  8223.                or any other OpenDoors function. This variable allows you to
  8224.                control where OpenDoors will look for the door information (drop
  8225.                file). By default, OpenDoors searches for the door information
  8226.                file in the current directory. If this variable is set to the
  8227.                name of some other directory, OpenDoors will first search for
  8228.                any door information files in that directory. If you only wish
  8229.                OpenDoors to look for a particular type of door information file
  8230.                (for instance, you want OpenDoors to only read a DORINFO1.DEF,
  8231.                and ignore any DOOR.SYS file), you can specify the full path and
  8232.                filename of the file you wish OpenDoors to use.
  8233.  
  8234.                It is usually a good idea to design your door to allow the
  8235.                system operator to set the location of the door information
  8236.                file. This will allow the sysop to place your door in its own
  8237.                directory, and will facilitate the use of your door on multi-
  8238.                line BBS systems. If you are using the OpenDoors configuration
  8239.                file system, then the system operator can set the door
  8240.                information file location and/or name using the BBSDir keyword.
  8241.                However, you may also wish to allow the location of the door
  8242.                information file to be set on the command line. The following
  8243.                example illustrates a method of reading and setting the location
  8244.                of the door information file from the door's command line:
  8245.  
  8246.                #include "opendoor.h"
  8247.  
  8248. ===============================================================================
  8249. OpenDoors 6.00 Manual                                          End of Page 150
  8250.  
  8251.                main(int argc, char *argv[])
  8252.                   {
  8253.                   if(argc>1) strncpy(od_control.info_path,argv[1],59);
  8254.  
  8255.                   od_disp_str("This is a sample OpenDoors door.\n\r");
  8256.                   od_disp_str("Press any key to continue...\n\r");
  8257.                   od_get_key(TRUE);
  8258.                   od_exit(20);
  8259.                   }
  8260.  
  8261.  
  8262.  
  8263. -------------------------------------------------------------------------------
  8264. od_info_type   char od_control.od_info_type;
  8265.  
  8266.                This variable indicates the type of information file from which
  8267.                OpenDoors has obtained the BBS and caller information that is
  8268.                found elsewhere in the OpenDoors control structure. This
  8269.                variable will have one of the following values, indicating that
  8270.                the door information file was of the corresponding type:
  8271.  
  8272.                      +----------------+----------------------------+
  8273.                      |  od_info_type  | Door Information File Type |
  8274.                      |      Value     |                            |
  8275.                      +----------------+----------------------------+
  8276.                      | DORINFO1       | DORINFO?.DEF               |
  8277.                      | EXITINFO       | EXITINFO.BBS (Normal)      |
  8278.                      | RA1EXITINFO    | EXITINFO.BBS (Extended)    |
  8279.                      | RA2EXITINFO    | EXITINFO.BBS (RA 2.x)      |
  8280.                      | QBBS275EXITINFO| EXITINFO.BBS (QuickBBS)    |
  8281.                      | CHAINTXT       | CHAIN.TXT                  |
  8282.                      | SFDOORSDAT     | SFDOORS.DAT                |
  8283.                      | CALLINFO       | CALLINFO.BBS               |
  8284.                      | DOORSYS_GAP    | DOOR.SYS (GAP/PC-Board)    |
  8285.                      | DOORSYS_DRWY   | DOOR.SYS (Doorway style)   |
  8286.                      | DOORSYS_WILDCAT| DOOR.SYS (WildCat standard)|
  8287.                      | CUSTOM         | Custom door information    |
  8288.                      |                | file, defined in config    |
  8289.                      |                | file.                      |
  8290.                      | NO_DOOR_FILE   | No drop file was found.    |
  8291.                      +----------------+----------------------------+
  8292.  
  8293.                The value of this variable is only valid AFTER od_init() or some
  8294.                OpenDoors function has been called.
  8295.  
  8296.                Note that this variable should be treated as a read-only
  8297.                variable, and should not normally be altered by your program.
  8298.                Altering this variable may cause OpenDoors to re-write a
  8299.                different type of door information file upon exiting, than was
  8300.                read upon startup.
  8301.  
  8302.  
  8303. ===============================================================================
  8304. OpenDoors 6.00 Manual                                          End of Page 151
  8305.  
  8306.  
  8307. -------------------------------------------------------------------------------
  8308. od_node        char od_control.od_node;
  8309.  
  8310.                This variable indicates the node number that the door is running
  8311.                under. If this information is supplied by the BBS in the door
  8312.                information file, the node number will be automatically by
  8313.                OpenDoors. Specifically, the node number can be determined
  8314.                automatically from systems that produce an SFDOORS.DAT, PC-
  8315.                Board/GAP style DOOR.SYS or Wildcat style DOOR.SYS door
  8316.                information file. If this information is not supplied in the
  8317.                door information file, but is provided by the sysop in the
  8318.                door's configuration file, OpenDoors will use the value found
  8319.                there. Alternatively, you can set this variable manually.
  8320.  
  8321.                On systems that produce a DORINFO?.DEF file, OpenDoors will use
  8322.                this variable to determine which DORINFO?.DEF file to search
  8323.                for. For instance, if od_control.od_node is set to 3, OpenDoors
  8324.                will first search for a DORINFO3.DEF file. If this file is not
  8325.                found, OpenDoors will then default to the DORINFO1.DEF filename.
  8326.  
  8327.  
  8328.  
  8329.  
  8330. -------------------------------------------------------------------------------
  8331. user           char od_control.user_timeofcreation[6];
  8332. _timeof
  8333. creation       This variable contains the time of day at which the door
  8334.                information file was created. This variable is available only
  8335.                when the door is running under a system that produces an
  8336.                EXITINFO.BBS file. To determine what type of door information
  8337.                file your door is running under, see the od_control.od_info_type
  8338.                variable, below.
  8339.  
  8340.  
  8341.  
  8342.  
  8343.  
  8344.  
  8345.  
  8346.  
  8347.  
  8348.  
  8349.  
  8350.  
  8351.  
  8352.  
  8353.  
  8354.  
  8355.  
  8356.  
  8357.  
  8358. ===============================================================================
  8359. OpenDoors 6.00 Manual                                          End of Page 152
  8360.  
  8361. CONTROL STRUCTURE - SERIAL PORT SETTINGS
  8362. -------------------------------------------------------------------------------
  8363.  
  8364.                The following OpenDoors control structure items store the
  8365.                communications settings that OpenDoors uses to communicate with
  8366.                the modem. These values are normally set upon the first call to
  8367.                an OpenDoors function, during the od_init() procedure. However,
  8368.                you may need to manual set this variables if:
  8369.  
  8370.                     - you wish to allow greater configurability of your door
  8371.                     - you are reading the door information file yourself
  8372.                     - you are using the OpenDoors to write a non-door
  8373.                      program
  8374.  
  8375.                Some of these variables are always used by OpenDoors, while
  8376.                others are only relevant if OpenDoor's built-in serial
  8377.                communications code is being used instead of a FOSSIL driver.
  8378.                Those that are only used when no FOSSIL driver is present are
  8379.                denoted by an [*] in the list below.
  8380.  
  8381.                The control structure variables controlling OpenDoor's serial
  8382.                port settings are as follows:
  8383.  
  8384.                od_control.baud            Serial Port BPS rate
  8385.  
  8386.                od_control.od_connect_sppedThe modem connection BPS rate
  8387.  
  8388.                od_control.od_com_address  Serial Port address [*]
  8389.  
  8390.                 " " .od_com_fifo_trigger  16550A FIFO trigger size
  8391.  
  8392.                 " " .od_com_flow_control  Type of flow control to use.
  8393.  
  8394.                od_control.od_com_irq      Serial Port IRQ number [*}
  8395.  
  8396.                od_control.od_com_method   Is FOSSIL or built-in serial I/O
  8397.                                           being used
  8398.  
  8399.                od_control.od_com_no_fifo  Disables use of 16550A FIFOs [*]
  8400.  
  8401.                od_control.od_com_rx_buf   Size of receive buffer [*]
  8402.  
  8403.                od_control.od_com_tx_buf   Size of transmit buffer [*]
  8404.  
  8405.                od_control.od_no_fossil    Prevents OpenDoors from using a
  8406.                                           FOSSIL driver, even if one is
  8407.                                           available.
  8408.  
  8409.                od_control.od_open_handle  Allows a live serial port handle to
  8410.                                           be passed to OpenDoors.
  8411.  
  8412.                od_control.port            Serial port number, 0 based.
  8413. ===============================================================================
  8414. OpenDoors 6.00 Manual                                          End of Page 153
  8415.  
  8416.  
  8417.  
  8418.  
  8419. -------------------------------------------------------------------------------
  8420. baud           unsigned long od_control.baud;
  8421.  
  8422.                This variable contains the BPS rate at which the computer is
  8423.                communicating with the modem, not to be confused with the BPS
  8424.                rate at which the local modem is communicating with the remote
  8425.                modem.
  8426.  
  8427.                A value of 0 indicates that the program is operating in local
  8428.                mode.
  8429.  
  8430.                If a FOSSIL driver is being used for serial I/O, this value is
  8431.                ignored if it does not correspond to one of the baud rates that
  8432.                an application can directly set a FOSSIL driver to. The BPS
  8433.                rates recognized by FOSSIL drivers are: 300, 600, 1200, 2400,
  8434.                4800, 9600, 19200, 38400. If any other BPS rate is to be used,
  8435.                the FOSSIL driver must be locked at that BPS from the FOSSIL
  8436.                driver command-line. When locked, FOSSIL drivers ignore any
  8437.                attempt by an application to change the BPS rate of the locked
  8438.                port. For this reason, the od_control.baud setting has no effect
  8439.                on the FOSSIL driver if it is locked.
  8440.  
  8441.  
  8442.  
  8443. -------------------------------------------------------------------------------
  8444. od_com_        int od_control.od_com_address;
  8445. address
  8446.                This variable is only used when OpenDoors is NOT performing
  8447.                serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
  8448.                used, the serial port address can be set from the FOSSIL driver
  8449.                command line).
  8450.  
  8451.                This variable may optionally be set to specify the base address
  8452.                of the serial port to be used. For ports COM1: through COM4:,
  8453.                OpenDoors can normally determine the serial port address
  8454.                automatically. However, for other serial ports, the port address
  8455.                must be specified using this variable. If you are not specifying
  8456.                a serial port address with this variable, do not change it's
  8457.                default value of 0.
  8458.  
  8459.  
  8460.  
  8461. -------------------------------------------------------------------------------
  8462. od_com_        char od_control.od_com_fifo_trigger;
  8463. fifo_trigger
  8464.                This variable is only used when OpenDoors is NOT performing
  8465.                serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
  8466.                used, the IRQ line can be set from the FOSSIL driver command
  8467.                line).
  8468. ===============================================================================
  8469. OpenDoors 6.00 Manual                                          End of Page 154
  8470.  
  8471.  
  8472.                This variable sets the number of bytes that will be placed in
  8473.                the 16550A UART FIFO buffers before an interrupt is triggered,
  8474.                if the 16550A UART FIFOs are used. Valid values are 1, 4, 8 and
  8475.                14.
  8476.  
  8477.  
  8478.  
  8479. -------------------------------------------------------------------------------
  8480. od_com_        unsigned char od_control.od_com_flow_control;
  8481. flow_control
  8482.                This variable sets the type of serial I/O flow control to use.
  8483.                By default, this variable is set to COM_DEFAULT_FLOW, which
  8484.                specifies the default mode of flow control. Most often, this
  8485.                will be RTS/CTS flow control. A value of COM_RTSCTS_FLOW
  8486.                explicitly enables RTS/CTS flow control. A value of COM_NO_FLOW
  8487.                disables all flow control. If you are going to change the value
  8488.                of this variable, it should be set prior to your first call to
  8489.                any OpenDoors function.
  8490.  
  8491.  
  8492.  
  8493. -------------------------------------------------------------------------------
  8494. od_com_        unsigned char od_control.od_com_irq;
  8495. irq
  8496.                This variable is only used when OpenDoors is NOT performing
  8497.                serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
  8498.                used, the IRQ line can be set from the FOSSIL driver command
  8499.                line).
  8500.  
  8501.                This variable may optionally be set to specify the IRQ line to
  8502.                be used for the serial port. By default, OpenDoors uses the
  8503.                normal IRQ 4 line for ports COM1: and COM3:, and IRQ 3 for ports
  8504.                COM2: and COM4:. To override this default, the IRQ line can be
  8505.                set using this variable. If you are not specifying an IRQ line
  8506.                with this variable, do not change it's default value of 0.
  8507.  
  8508.  
  8509.  
  8510. -------------------------------------------------------------------------------
  8511. od_com_        char od_control.od_com_method;
  8512. method
  8513.                This read-only variable reports the method that OpenDoors is
  8514.                using for serial I/O. This variable is set during od_init() or
  8515.                the first call to an OpenDoors function. This variable can be
  8516.                one of the following values:
  8517.  
  8518.                COM_FOSSIL          - Indicates that a FOSSIL driver is being
  8519.                used
  8520.                COM_INTERNAL   - Indicates that OpenDoor's internal serial I/O
  8521.                                 code is being used.
  8522.                COM_WIN32      - Indicates that the Win32 communication system
  8523. ===============================================================================
  8524. OpenDoors 6.00 Manual                                          End of Page 155
  8525.  
  8526.                                 is being used.
  8527.  
  8528.  
  8529.  
  8530. -------------------------------------------------------------------------------
  8531. od_com_        char od_control.od_com_no_fifo;
  8532. no_fifo
  8533.                This variable is only used when OpenDoors is NOT performing
  8534.                serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
  8535.                used, the receive buffer size can be set from the FOSSIL driver
  8536.                command line).
  8537.  
  8538.                Normally, OpenDoors will use a 16550A FIFO buffer if a 16550A
  8539.                UART is installed. You can disable the use of the 16550A FIFO
  8540.                buffer by setting this variable to TRUE.
  8541.  
  8542.  
  8543.  
  8544. -------------------------------------------------------------------------------
  8545. od_com_        unsigned int od_control.od_com_rx_buf;
  8546. rx_buf
  8547.                This variable is only used when OpenDoors is NOT performing
  8548.                serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
  8549.                used, the receive buffer size can be set from the FOSSIL driver
  8550.                command line).
  8551.  
  8552.                This variable allows you to set the size of OpenDoor's serial
  8553.                I/O receive buffer. If you do not set this buffer size, a
  8554.                default value of 256 characters is used. Normally, this buffer
  8555.                size is more than large enough for door programs. However, if
  8556.                you find that inbound characters are lost before they can be
  8557.                processed by your program, you may wish to increase the size of
  8558.                this buffer.
  8559.  
  8560.                This variable should only be changed before your first call to
  8561.                od_init() or any other OpenDoors function.
  8562.  
  8563.  
  8564.  
  8565. -------------------------------------------------------------------------------
  8566. od_com_        unsigned int od_control.od_com_tx_buf;
  8567. tx_buf
  8568.                This variable is only used when OpenDoors is NOT performing
  8569.                serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
  8570.                used, the receive buffer size can be set from the FOSSIL driver
  8571.                command line).
  8572.  
  8573.                This variable allows you to set the size of OpenDoor's serial
  8574.                I/O transmit buffer. If you do not set this buffer size, a
  8575.                default value of 1024 characters is used.
  8576.  
  8577.  
  8578. ===============================================================================
  8579. OpenDoors 6.00 Manual                                          End of Page 156
  8580.  
  8581.                This variable should only be changed before your first call to
  8582.                od_init() or any other OpenDoors function.
  8583.  
  8584.  
  8585.  
  8586. -------------------------------------------------------------------------------
  8587. od_connect_    DWORD od_control.od_connect_speed;
  8588. speed
  8589.                This variable contains the best guess at the current modem
  8590.                connection speed. This information is currently only accurate if
  8591.                a DOOR.SYS file is being used. In other situations, it will
  8592.                always be set to be equal to od_control.baud.
  8593.  
  8594.  
  8595.  
  8596. -------------------------------------------------------------------------------
  8597. od_open_       DWORD od_control.od_open_handle;
  8598. handle
  8599.                Under platforms where this is supported (currently only the
  8600.                Win32 version of OpenDoors), this variable can be used to pass a
  8601.                live serial port handle to OpenDoors, which OpenDoors will use.
  8602.                OpenDoors will not close this handle when it exits. If this
  8603.                value is set to 0, OpenDoors will open and close the serial port
  8604.                itself.
  8605.  
  8606.  
  8607.  
  8608. -------------------------------------------------------------------------------
  8609. port           char od_control.port;
  8610.  
  8611.                This variable contains the serial port number that the modem is
  8612.                connected. This number is 0 based, so that a value of 0
  8613.                corresponds to COM1:, a value of 1 corresponds to COM2:, and so
  8614.                on. This value will normally be set by the od_init() function,
  8615.                when the door information file is read, and should not be
  8616.                changed after modem initialization has been carried out by the
  8617.                od_init() function.
  8618.  
  8619.  
  8620.  
  8621.  
  8622.  
  8623.  
  8624.  
  8625.  
  8626.  
  8627.  
  8628.  
  8629.  
  8630.  
  8631.  
  8632.  
  8633. ===============================================================================
  8634. OpenDoors 6.00 Manual                                          End of Page 157
  8635.  
  8636. CONTROL STRUCTURE - BBS AND CALLER INFORMATION
  8637. -------------------------------------------------------------------------------
  8638.  
  8639.                As we have already described, there are two types of variables
  8640.                in the OpenDoors control structure. Some of the variables are
  8641.                simply used to allow you to customize OpenDoor's various
  8642.                features, such as altering colors, prompts, timeouts, etc. Other
  8643.                variables in the OpenDoors control structure serve to provide
  8644.                you with information about the user who is online and the BBS
  8645.                system your door is running under. This section deals with those
  8646.                variables that provide you with information about the BBS and
  8647.                the user.
  8648.  
  8649.                The information in these variables is read from the door
  8650.                information file, a small file created by the BBS specifically
  8651.                for the purpose of communicating with door programs. Depending
  8652.                on what BBS system your door is running under, the type of door
  8653.                information file will vary. Since different door information
  8654.                files do not all provide the same pieces of information, some
  8655.                variables in this section will only be available when your door
  8656.                is running under particular BBS systems.  Other variables will
  8657.                be available with many or all BBS systems. In the description of
  8658.                each variable in this section, we indicate under which door
  8659.                information files the particular variable will be . So, if you
  8660.                wish to access a variable that is only under certain door
  8661.                information files, your program should test whether or not the
  8662.                required information is available under the particular door
  8663.                information file that was found. In order to determine which
  8664.                door information file your door is running under, you should use
  8665.                the od_control.od_info_type variable. This variable is described
  8666.                in the section which begins on page 150. If you test the value
  8667.                of the od_control.od_info_type variable, and find that the
  8668.                required information is not available, you may wish to simply
  8669.                use some sort of default value for the variable, or
  8670.                alternatively, not allow your door to run under certain BBS
  8671.                systems. Another possibility, if the required information is not
  8672.                available, is imply to obtain this information from the user
  8673.                yourself. For example, if you wished to know the length of the
  8674.                user's screen, when this information is not available from the
  8675.                door information file, you could simply prompt the user for
  8676.                their screen length the first time they use your door. This
  8677.                information could then be stored in your door's data files for
  8678.                future reference.
  8679.  
  8680.                As an example of testing what door information file your door is
  8681.                running under, consider the case where you wanted to display the
  8682.                user's birthday. The example below will display the user's
  8683.                birthday if it is known, and otherwise, print the string
  8684.                "unknown".
  8685.  
  8686.                          if(od_control.od_info_type == RA1EXITINFO
  8687.                             od_control.od_info_type == RA2EXITINFO)
  8688. ===============================================================================
  8689. OpenDoors 6.00 Manual                                          End of Page 158
  8690.  
  8691.                          {
  8692.                             od_disp_str(od_control.user_birthday);
  8693.                          }
  8694.                          else
  8695.                          {
  8696.                             od_disp_str("Unknown");
  8697.                          }
  8698.  
  8699.                The chart below lists the door information file formats that
  8700.                OpenDoors recognizes, along with example BBS systems that
  8701.                produce these files and a reference letter for each type. Thus,
  8702.                an OpenDoors door can run DIRECTLY under ANY BBS SYSTEM that
  8703.                produces one of these files formats, and under ANY OTHER BBS
  8704.                system when used in conjunction with a door information file
  8705.                conversion utility.
  8706.  
  8707. +--------------------------+----------------------------------------+
  8708. | FILE FORMAT              | EXAMPLE BBS SYSTEMS                    |
  8709. +--------------------------+----------------------------------------+
  8710. | CHAIN.TXT                | WWIV                                   |
  8711. +--------------------------+----------------------------------------+
  8712. | DORINFO1.DEF             | RBBS-PC                                |
  8713. +--------------------------+----------------------------------------+
  8714. | DORINFO1.DEF             | QuickBBS                               |
  8715. |      &                   | Remote Access (versions 0.01-0.04)     |
  8716. | EXITINFO.BBS (Std. Ver.) |                                        |
  8717. +--------------------------+----------------------------------------+
  8718. | DOOR.SYS (DoorWay Style) | Remote Access                          |
  8719. +--------------------------+----------------------------------------+
  8720. | DOOR.SYS (PCB/GAP Style) | PC-Board                               |
  8721. |                          | GAP                                    |
  8722. +--------------------------+----------------------------------------+
  8723. | DOOR.SYS (WildCat Style) | Wildcat 3.00 and above                 |
  8724. |                          | Telegard                               |
  8725. +--------------------------+----------------------------------------+
  8726. | SFDOORS.DAT              | Spitfire                               |
  8727. |                          | TriBBS                                 |
  8728. +--------------------------+----------------------------------------+
  8729. | CALLINFO.BBS             | WildCat 2.xx                           |
  8730. +--------------------------+----------------------------------------+
  8731. | DORINFO1.DEF             | Remote Access (versions 1.00 and later)|
  8732. |      &                   |                                        |
  8733. | EXITINFO.BBS (Ext. Ver.) |                                        |
  8734. +--------------------------+----------------------------------------+
  8735.  
  8736.  
  8737.  
  8738.                The chart on the following page lists all of the OpenDoors
  8739.                control structure variables in this section, along with a brief
  8740.                description of their use. The variables are then described in
  8741.                detail, below.
  8742.  
  8743. ===============================================================================
  8744. OpenDoors 6.00 Manual                                          End of Page 159
  8745.  
  8746. +-----------------------+-----------------------------------------------+
  8747. | VARIABLE NAME         | VARIABLE CONTENTS                             |
  8748. +-----------------------+-----------------------------------------------+
  8749. | EMSI INFORMATION      | Information on current IEMSI session          |
  8750. | event_status          | The status of the next system event           |
  8751. | event_starttime       | The start time of the next system event       |
  8752. | event_errorlevel      | The errorlevel of the next system event       |
  8753. | event_days            | The days of the week to execute the event     |
  8754. | event_force           | Whether the next system event is forced       |
  8755. | event_last_run        | When the next system event was last run       |
  8756. | sysop_name            | The name of the BBS's sysop                   |
  8757. | system_calls          | Total number of calls BBS has received        |
  8758. | system_last_caller    | The name of the last caller to the BBS        |
  8759. | system_last_handle    | The handle (alias) of the last caller         |
  8760. | system_name           | The name of the BBS                           |
  8761. | TIMELOG VARIABLES     | The times at which the BBS has been most busy |
  8762. | user_ansi             | Whether the user has ANSI graphics mode on    |
  8763. | user_attribute        | User attribute bit-mapped flags               |
  8764. | user_attrib2          | Second set of user attribute bit-mapped flags |
  8765. | user_attrib3          | Third set of user attribute flags             |
  8766. | user_avatar           | Whether the user has AVATAR graphics mode on  |
  8767. | user_birthday         | The date the user was born                    |
  8768. | user_callsign         | The user's amateur radio call sign            |
  8769. | user_combinedrecord   | The user's combined message areas settings    |
  8770. | user_comment          | Sysop's comment about the user                |
  8771. | user_credit           | Amount of NetMail credit the user has         |
  8772. | user_dataphone        | The user's data phone number                  |
  8773. | user_date_format      | Format user wishes to have dates displayed in |
  8774. | user_deducted_time    | Total time that has been subtracted from user |
  8775. | user_downk            | Total Kilobytes downloaded by the user        |
  8776. | user_downlimit        | User's daily download limit                   |
  8777. | user_downloads        | Total number of files downloaded by the user  |
  8778. | user_echomailentered  | Whether or not the user has entered EchoMail  |
  8779. | user_error_free       | Whether or not connection is error-free       |
  8780. | user_file_area        | The user's current file area                  |
  8781. | user_firstcall        | Date of the user's first call to the BBS      |
  8782. | user_flags            | User's sysop-defined flag settings            |
  8783. | user_forward_to       | Name to forward user's mail to                |
  8784. | user_group            | User's group number                           |
  8785. | user_handle           | User's alias                                  |
  8786. | user_homephone        | User's home telephone number                  |
  8787. | user_language         | User's language setting                       |
  8788. | user_last_pwdchange   | Total calls since last password change        |
  8789. | user_lastdate         | Date of the user's last call                  |
  8790. | user_lastread         | Highest message number read by user           |
  8791. | user_lasttime         | Time of the user's last call                  |
  8792. | user_location         | Name of the city where the user lives         |
  8793. | user_logindate        | Date on which the current call began          |
  8794. +-----------------------+-----------------------------------------------+
  8795.  
  8796.  
  8797.  
  8798. ===============================================================================
  8799. OpenDoors 6.00 Manual                                          End of Page 160
  8800.  
  8801.  
  8802.  
  8803.  
  8804. +-----------------------+-----------------------------------------------+
  8805. | VARIABLE NAME         | VARIABLE CONTENTS                             |
  8806. +-----------------------+-----------------------------------------------+
  8807. | user_loginsec         | User's security at the beginning of this call |
  8808. | user_logintime        | Time at which the current call began          |
  8809. | user_logonpassword    | User's password at the beginning of this call |
  8810. | user_menustack        | Contents of the user's current menu stack     |
  8811. | user_menustackpointer | Pointer to the top of the menu stack          |
  8812. | user_messages         | Total number of messages written by the user  |
  8813. | user_msg_area         | The user's current message area               |
  8814. | user_name             | The user's name                               |
  8815. | user_net_credit       | The user's remaining netmail credit           |
  8816. | user_netmailentered   | Whether or not the user has entered NetMail   |
  8817. | user_num              | The user's record number in the user file     |
  8818. | user_numcalls         | Number of calls the user has made to the BBS  |
  8819. | user_numpages         | Number of times the user has paged the sysop  |
  8820. | user_password         | The user's current password                   |
  8821. | user_pending          | The value of unsent NetMail written by user   |
  8822. | user_reasonforchat    | The reason the user wishes to chat with sysop |
  8823. | user_rip_ver          | RIP protocol version being used               |
  8824. | user_screen_length    | The length of the user's screen               |
  8825. | user_screenwidth      | The width of the user's screen                |
  8826. | user_security         | The user's security access level              |
  8827. | user_sex              | The user's gender                             |
  8828. | user_subdate          | The date the user's subscription expires      |
  8829. | user_timelimit        | The user's daily time limit                   |
  8830. | user_todayk           | Kilobytes downloaded by the user today        |
  8831. | user_upk              | Total Kilobytes uploaded by the user          |
  8832. | user_uploads          | Total number of files uploaded by the user    |
  8833. | user_wantchat         | Whether or not the user wishes to chat        |
  8834. | user_xi_record        | The user's record in the USERSXI.BBS file     |
  8835. +-----------------------+-----------------------------------------------+
  8836.  
  8837.  
  8838.  
  8839.  
  8840. -------------------------------------------------------------------------------
  8841. EMSI           char od_control.ra_emsi_session;
  8842. INFORMATION    char od_control.ra_emsi_crtdef[41];
  8843.                char od_control.ra_emsi_protocols[41];
  8844.                char od_control.ra_emsi_capabilities[41];
  8845.                char od_control.ra_emsi_requests[41];
  8846.                char od_control.ra_emsi_software[41];
  8847.                char od_control.ra_hold_attr1;
  8848.                char od_control.ra_hold_attr2;
  8849.                char od_control.ra_hold_len;
  8850.  
  8851.                These variables provide your door with information pertaining to
  8852.                an interactive EMSI session that has been established. Note that
  8853. ===============================================================================
  8854. OpenDoors 6.00 Manual                                          End of Page 161
  8855.  
  8856.                these variables are only available under systems that produce an
  8857.                RA 1.00 and later style extended EXITINFO.BBS door information
  8858.                file.
  8859.  
  8860.                If an IEMSI session has been established, the Boolean variable
  8861.                od_control.ra_emsi_session will be TRUE, and if no session has
  8862.                not been established, this variable will be FALSE.
  8863.  
  8864.                A full discussion of the IEMSI protocol is beyond the scope of
  8865.                this manual. Specifications for the IEMSI protocol are available
  8866.                from the OpenDoors support BBS.
  8867.  
  8868.  
  8869.  
  8870. -------------------------------------------------------------------------------
  8871. event_days     unsigned char od_control.event_days;
  8872.  
  8873.                This variable is a bit-mapped flag of the days of the week on
  8874.                which the next system event is run. The bit-map bits are as
  8875.                follows:
  8876.  
  8877.                        +-----+------+-----------+
  8878.                        | BIT | MASK | MEANING   |
  8879.                        +-----+------+-----------+
  8880.                        |  0  | 0x01 | Sunday    |
  8881.                        |  1  | 0x02 | Monday    |
  8882.                        |  2  | 0x04 | Tuesday   |
  8883.                        |  3  | 0x08 | Wednesday |
  8884.                        |  4  | 0x10 | Thursday  |
  8885.                        |  5  | 0x20 | Friday    |
  8886.                        |  6  | 0x40 | Saturday  |
  8887.                        |  7  | 0x80 | All Days  |
  8888.                        +-----+------+-----------+
  8889.  
  8890.                For more information on bit-mapped flags, see the glossary item
  8891.                entitled "BIT-MAPPED FLAGS".
  8892.  
  8893.                This variable is only available under systems that produce an
  8894.                EXITINFO.BBS door information file.
  8895.  
  8896.  
  8897.  
  8898. -------------------------------------------------------------------------------
  8899. event_         unsigned char od_control.event_errorlevel;
  8900. errorlevel
  8901.                This variable contains the ErrorLevel associated with the next
  8902.                system event. This variable is only available under systems that
  8903.                produce an EXITINFO.BBS door information file.
  8904.  
  8905.  
  8906.  
  8907.  
  8908. ===============================================================================
  8909. OpenDoors 6.00 Manual                                          End of Page 162
  8910.  
  8911. -------------------------------------------------------------------------------
  8912. event          char od_control.event_force;
  8913. _force
  8914.                This variable indicates whether the next system event should be
  8915.                forced to run at a particular time. If this variable contains a
  8916.                value of TRUE, then the user should be forced off-line in order
  8917.                to accommodate the event, and if this variable is false, then
  8918.                the event can wait until after the user logs off normally. This
  8919.                variable is only available under systems that produce an
  8920.                EXITINFO.BBS file.
  8921.  
  8922.  
  8923.  
  8924. -------------------------------------------------------------------------------
  8925. event          char od_control.event_last_run[9];
  8926. _last_run
  8927.                This variable contains a string representing the date on which
  8928.                the next system event was last run, and is in the same format as
  8929.                the user_lastdate variable. This variable is only available
  8930.                under systems that produce an EXITINFO.BBS file.
  8931.  
  8932.  
  8933.  
  8934. -------------------------------------------------------------------------------
  8935. event          char od_control.event_starttime[6];
  8936. _starttime
  8937.                This variable contains a string representing the time at which
  8938.                the next system event is scheduled to start, in the same format
  8939.                as the user_lasttime variable. This variable is only available
  8940.                under systems that produce an EXITINFO.BBS or Wildcat style
  8941.                DOOR.SYS door information file.
  8942.  
  8943.  
  8944.  
  8945. -------------------------------------------------------------------------------
  8946. event          unsigned char od_control.event_status;
  8947. _status
  8948.                This variable represents the status of the next system event,
  8949.                and will be equal to the value
  8950.  
  8951.                             ES_ENABLED
  8952.  
  8953.                if and only if the other event information contained in the
  8954.                control structure is valid. This variable is only available
  8955.                under systems that produce an EXITINFO.BBS file.
  8956.  
  8957.  
  8958.  
  8959.  
  8960.  
  8961.  
  8962.  
  8963. ===============================================================================
  8964. OpenDoors 6.00 Manual                                          End of Page 163
  8965.  
  8966. -------------------------------------------------------------------------------
  8967. sysop_name     char od_control.sysop_name[40];
  8968.  
  8969.                The od_control.sysop_name variable contains the name of the
  8970.                sysop of the BBS under which your door is running. This variable
  8971.                is available under any BBS system that produces a DORINFO?.DEF
  8972.                (including RA & QBBS which process both DORINFO1.DEF and
  8973.                EXITINFO.BBS files), or Wildcat style DOOR.SYS file.
  8974.  
  8975.  
  8976.  
  8977. -------------------------------------------------------------------------------
  8978. system_calls   long od_control.system_calls;
  8979.  
  8980.                This variable contains the total number of calls that have been
  8981.                placed to the BBS, and is available under any BBS which produces
  8982.                an EXITINFO.BBS file.
  8983.  
  8984.  
  8985.  
  8986. -------------------------------------------------------------------------------
  8987. system_last    char od_control.system_last_caller[36];
  8988. _caller
  8989.                This string contains the name of the previous caller to the BBS,
  8990.                on any line, and is available under EXITINFO.BBS.
  8991.  
  8992.  
  8993.  
  8994. -------------------------------------------------------------------------------
  8995. system_last    char od_control.system_last_handle[36];
  8996. _handle
  8997.                This string contains the handle (alias) of the previous caller
  8998.                to the BBS, on any line, and is available under EXITINFO.BBS.
  8999.  
  9000.  
  9001.  
  9002. -------------------------------------------------------------------------------
  9003. system_name    char od_control.system_name[40];
  9004.  
  9005.                The od_control.system_name variable contains the name of the BBS
  9006.                under which your door is running. This variable is available
  9007.                under any BBS system that produces a DORINFO?.DEF (including RA
  9008.                & QBBS which process both DORINFO1.DEF and EXITINFO.BBS files).
  9009.  
  9010.  
  9011.  
  9012. -------------------------------------------------------------------------------
  9013. TIMELOG        char od_control.timelog_start_date[9];
  9014. VARIABLES
  9015.                This string contains the date of the beginning of the time
  9016.                period for which the time log is recorded. This variable is
  9017.                available under any system that produces an EXITINFO.BBS file.
  9018. ===============================================================================
  9019. OpenDoors 6.00 Manual                                          End of Page 164
  9020.  
  9021.  
  9022.  
  9023.                int od_control.timelog_busyperhour[24];
  9024.  
  9025.                This variable is an array of 24 elements, with each element
  9026.                indicating the total number of times the BBS was in use during
  9027.                each of the 24 hours of the day. Element 0 corresponds to the
  9028.                time period of 0:00-1:00, element 1 corresponds to the time
  9029.                period of 1:00-2:00, and so on. In order to determine the
  9030.                frequency of system use during any hour as a percentage, simply
  9031.                calculate the total of all 24 entries in the array, and divide
  9032.                any given entry by the total, in order to come up with an
  9033.                average. This variable is available under any system that
  9034.                produces an EXITINFO.BBS file.
  9035.  
  9036.  
  9037.                int od_control.timelog_busyperday[7];
  9038.  
  9039.                This variable is an array of 7 elements, with each element
  9040.                indicating the total number of times the BBS was in use during
  9041.                each of the 7 days of the week. Here, elements 0 corresponds to
  9042.                Sunday, element 1 to Monday, and so on. In order to calculate
  9043.                the frequency of system use during any day of the week, use the
  9044.                same method as for calculating the frequency of calls during
  9045.                each hour, as described above. This is only available under
  9046.                systems that produces an EXITINFO.BBS file. Note that at least
  9047.                some, if not all, versions of RemoteAccess do not maintain this
  9048.                variable correctly, and thus even with the presence of an
  9049.                EXITINFO.BBS file, this array may contain all zero entries.
  9050.  
  9051.  
  9052.  
  9053. -------------------------------------------------------------------------------
  9054. user_ansi      char od_control.user_ansi;
  9055.  
  9056.                This variable contains a Boolean value, indicating whether or
  9057.                not the user has ANSI mode turned on. If ANSI graphics mode is
  9058.                enabled, this variable will contain a value of TRUE, and if ANSI
  9059.                graphics mode is disabled, this variable will contain a value of
  9060.                FALSE. Many of the OpenDoors functions test the setting of this
  9061.                variable in order to determine whether or not they should send
  9062.                ANSI-graphics control characters. Also, if this variable
  9063.                contains a TRUE value, OpenDoors will display an "[ANSI]"
  9064.                indicator on the status line.
  9065.  
  9066.                You may change the value of this variable at any time after the
  9067.                first call to od_init() or any other OpenDoors functions.
  9068.                Depending upon what BBS system your door is running under,
  9069.                changes to this variable may or may not result in changes to the
  9070.                user's ANSI setting upon return to the BBS.
  9071.  
  9072.  
  9073. ===============================================================================
  9074. OpenDoors 6.00 Manual                                          End of Page 165
  9075.  
  9076.                This variable is available under all door information file
  9077.                formats.
  9078.  
  9079.  
  9080.  
  9081. -------------------------------------------------------------------------------
  9082. user_          unsigned char od_control.user_attribute;
  9083. attribute
  9084.                This variable is a bitmap of eight flags, each of which
  9085.                represent individual pieces of information pertaining to the
  9086.                user that is currently online. These flags are as follows:
  9087.  
  9088.                        +-----+------+-----------------------+
  9089.                        | BIT | MASK | DESCRIPTION           |
  9090.                        +-----+------+-----------------------+
  9091.                        |  0  | 0x01 | Is the user deleted   |
  9092.                        |  1  | 0x02 | Is screen clearing on |
  9093.                        |  2  | 0x04 | Is "more" prompt on   |
  9094.                        |  3  | 0x08 | Is ANSI mode on       |
  9095.                        |  4  | 0x10 | User no-kill setting  |
  9096.                        |  5  | 0x20 | Transfer-priority     |
  9097.                        |  6  | 0x40 | Full screen editor    |
  9098.                        |  7  | 0x80 | Quiet mode            |
  9099.                        +-----+------+-----------------------+
  9100.  
  9101.                For more information on using and setting bit-mapped flags,
  9102.                please see the entry entitled "BITMAPED FLAGS" in the glossary
  9103.                of this manual.
  9104.  
  9105.                Note that this variable is only available under systems that
  9106.                produce and EXITINFO.BBS format door information file.
  9107.  
  9108.  
  9109.  
  9110. -------------------------------------------------------------------------------
  9111. user_          unsigned char od_control.user_attrib2;
  9112. attrib2
  9113.                See the user_attrib variable for more information. This variable
  9114.                is like the user_attrib variable, except that it contains
  9115.                different information. The bit-mapped flags for the
  9116.                od_control.user_attrib2 variable are as follows:
  9117.  
  9118.                        +-----+------+-----------------------+
  9119.                        | BIT | MASK | DESCRIPTION           |
  9120.                        +-----+------+-----------------------+
  9121.                        |  0  | 0x01 | User hot-keys setting |
  9122.                        |  1  | 0x02 | Is AVATAR graphics on |
  9123.                        |  2  | 0x04 | Full screen reader    |
  9124.                        |  3  | 0x08 | Hidden from userlist  |
  9125.                        +-----+------+-----------------------+
  9126.  
  9127.  
  9128. ===============================================================================
  9129. OpenDoors 6.00 Manual                                          End of Page 166
  9130.  
  9131.                Note that this variable is only available under systems that
  9132.                produce an EXITINFO.BBS door information file.
  9133.  
  9134.  
  9135.  
  9136. -------------------------------------------------------------------------------
  9137. user_          unsigned char od_control.user_attrib3;
  9138. attrib3
  9139.                This variable contains user attribute flags when a RA 2.50 or
  9140.                later EXITINFO.BBS file is used.
  9141.  
  9142.  
  9143.  
  9144. -------------------------------------------------------------------------------
  9145. user_avatar    char od_control.user_avatar;
  9146.  
  9147.                This variable is a Boolean value indicating whether or not
  9148.                AVATAR graphics mode is on. If AVATAR graphics is available,
  9149.                then many of the OpenDoors functions will make use of AVATAR
  9150.                graphics codes for greater display speed. If AVATAR graphics
  9151.                mode is on, a [AVT] indicator will appear on the status line. If
  9152.                your door is running under a system which produces an RA 1.00+
  9153.                style extended EXITINFO.BBS door information file, the
  9154.                user_avatar variable is set automatically. If the extended
  9155.                EXITINFO.BBS file is not available, this value will default to
  9156.                FALSE. In this case, you may wish to ask the user whether or not
  9157.                they wish to use AVATAR graphics, and thus set this variable
  9158.                yourself.
  9159.  
  9160.  
  9161.  
  9162. -------------------------------------------------------------------------------
  9163. user           char od_control.user_birthday[9];
  9164. _birthday
  9165.                This variable is a string, in the same format as the
  9166.                od_control.user_lastcall variable, which stores the date of the
  9167.                user's birthday, if it is available. This variable is only
  9168.                available under systems that produce an RA 1.00 and later style
  9169.                extended EXITINFO.BBS or Wildcat style DOOR.SYS file.
  9170.  
  9171.  
  9172.  
  9173. -------------------------------------------------------------------------------
  9174. user           char od_control.user_callsign[12];
  9175. _callsign
  9176.                This variable is a string which contains the user's amateur
  9177.                radio call sign, if any. This variable is only available under
  9178.                systems that produce a CHAIN.TXT file.
  9179.  
  9180.  
  9181.  
  9182.  
  9183. ===============================================================================
  9184. OpenDoors 6.00 Manual                                          End of Page 167
  9185.  
  9186. -------------------------------------------------------------------------------
  9187. user_combined  unsigned char od_control.user_combinedrecord[25];
  9188. record
  9189.                This variable is an array of bit-mapped flags, with each flag
  9190.                corresponding to an individual message area. In this case, the
  9191.                first bit of od_control.ra_combinedrecord[0] corresponds to the
  9192.                first message area, the second bit to the second message area,
  9193.                and so on. If any given bit-flag is turned on, then the user has
  9194.                corresponding message area enabled for combined access, and if
  9195.                the bit is turned off, the user does not have the area enabled
  9196.                for combined access. A detailed description of the combined
  9197.                message access is beyond the scope of this manual. This variable
  9198.                is only available under systems that produce an RA 1.00 or later
  9199.                style extended EXITINFO.BBS door information file.
  9200.  
  9201.  
  9202.  
  9203. -------------------------------------------------------------------------------
  9204. user_comment   char od_control.user_comment[81];
  9205.  
  9206.                This variable is a string which contains the sysop's comment
  9207.                about the user that is currently online. This comment may be
  9208.                displayed on the OpenDoors status line, if this variable is
  9209.                available. This variable is available under systems that produce
  9210.                an RA 1.00 and later style extended EXITINFO.BBS or Wildcat
  9211.                style DOOR.SYS file.
  9212.  
  9213.  
  9214.  
  9215. -------------------------------------------------------------------------------
  9216. user_credit    unsigned int od_control.user_credit;
  9217.  
  9218.                This variable contains the total amount of NetMail credit that
  9219.                the caller has left. Changes to this variable will be by the BBS
  9220.                when your door exits and control is returned to the BBS. This
  9221.                variable is only available under systems that produce an
  9222.                EXITINFO.BBS door information file.
  9223.  
  9224.  
  9225.  
  9226. -------------------------------------------------------------------------------
  9227. user_          char od_control.user_dataphone[13];
  9228. dataphone
  9229.                This string contains the user's data or business phone number,
  9230.                if available. This value is only available under system that
  9231.                produce EXITINFO.BBS, PC-Board/GAP style DOOR.SYS and WildCat
  9232.                DOOR.SYS format door information files.
  9233.  
  9234.  
  9235.  
  9236.  
  9237.  
  9238. ===============================================================================
  9239. OpenDoors 6.00 Manual                                          End of Page 168
  9240.  
  9241. -------------------------------------------------------------------------------
  9242. user           int od_control.user_deducted_time;
  9243. _deducted
  9244. _time          This variable contains a signed integer value, which indicates
  9245.                the total amount of time that has been deducted from the user
  9246.                during this call. This variable is only available under systems
  9247.                that produce an RA 1.00 and later style extended EXITINFO.BBS
  9248.                door information file.
  9249.  
  9250.  
  9251.  
  9252. -------------------------------------------------------------------------------
  9253. user_downk     unsigned int od_control.user_downk;
  9254.  
  9255.                This variable contains the total kilobytes of files that the
  9256.                current user has downloaded from the BBS, and is available under
  9257.                systems that produce EXITINFO.BBS, Wildcat style DOOR.SYS or
  9258.                SFDOORS.DAT format door information files.
  9259.  
  9260.  
  9261.  
  9262. -------------------------------------------------------------------------------
  9263. user           unsigned int od_control.user_downlimit;
  9264. _downlimit
  9265.                This variable contains the total number of kilobytes that the
  9266.                caller is permitted to download during this call. If your door
  9267.                allows files do be downloaded, you will probably want to compare
  9268.                the value of this variable to the size of any file to be
  9269.                transferred and the total kilobytes already downloaded, as
  9270.                stored in the od_control.user_todayk variable. This variable is
  9271.                only available under systems that produce an EXITINFO.BBS file.
  9272.  
  9273.  
  9274.  
  9275. -------------------------------------------------------------------------------
  9276. user           unsigned int od_control.user_downloads;
  9277. _downloads
  9278.                This variable contains the total number of files that the
  9279.                current user has downloaded from the BBS, and is available under
  9280.                systems that produce EXITINFO.BBS, PC-Board/GAP style DOOR.SYS,
  9281.                WildCat style DOOR.SYS or SFDOORS.DAT format door information
  9282.                files.
  9283.  
  9284.  
  9285.  
  9286. -------------------------------------------------------------------------------
  9287. user_echo      char od_control.user_echomailentered;
  9288. mailentered
  9289.                This variable is a Boolean value, indicating whether or not the
  9290.                user has entered new EchoMail during this call. If this variable
  9291.                has a value of TRUE, then EchoMail has been entered, and if it
  9292.                has a value of FALSE, then EchoMail has not been entered. This
  9293. ===============================================================================
  9294. OpenDoors 6.00 Manual                                          End of Page 169
  9295.  
  9296.                variable will contain a valid value only after od_init() or some
  9297.                OpenDoors function has been called. Any changes made to this
  9298.                variable will be reflected within the BBS software when control
  9299.                is returned to the BBS. This variable is accessible only under
  9300.                systems which produce an EXITINFO.BBS door information file.
  9301.  
  9302.  
  9303.  
  9304. -------------------------------------------------------------------------------
  9305. user_error          char od_control.user_error_free;
  9306. _free
  9307.                This variable contains a Boolean value indicating whether or not
  9308.                the user is connected to the BBS via an error free connection
  9309.                (eg. a V.42/MNP or similar modem protocol). This variable is
  9310.                only available under systems that produce an SFDOORS.DAT,
  9311.                Wildcat style DOOR.SYS or RA 1.00 or later style extended
  9312.                EXITINFO.BBS door information file.
  9313.  
  9314.  
  9315.  
  9316. -------------------------------------------------------------------------------
  9317. user_first     char od_control.user_firstcall[9];
  9318. call
  9319.                This variable is a string which contains the date of the user's
  9320.                first call, in the same format as the od_control. user_lastcall
  9321.                variable. This variable is only available under systems which
  9322.                produce an RA 1.00 and later style extended EXITINFO.BBS door
  9323.                information file.
  9324.  
  9325.  
  9326.  
  9327. -------------------------------------------------------------------------------
  9328. user_          unsigned char od_control.user_flags[4];
  9329. flags
  9330.                The od_control.user_flags variable is an array of four sysop
  9331.                defined bit-mapped flags, which represent some sort of
  9332.                information about the user. od_control.user_flags[0] stores
  9333.                flags A1 - A8 in bits 0 through 7, respectively. Likewise,
  9334.                od_control.user_flags[1] stores flags B1 - B8, and so on. This
  9335.                variable is only available under systems that produce
  9336.                EXITINFO.BBS format door information files.
  9337.  
  9338.  
  9339.  
  9340. -------------------------------------------------------------------------------
  9341. user_handle    char od_control.user_handle[36];
  9342.  
  9343.                This variable contains the user's alias or handle name, if any.
  9344.                If the user does not have and alias or handle, this variable
  9345.                will be blank. This variable is only available under systems
  9346.                that produce a CHAIN.TXT, RA 1.00 and later extended
  9347.                EXITINFO.BBS or Wildcat style DOOR.SYS door information file.
  9348. ===============================================================================
  9349. OpenDoors 6.00 Manual                                          End of Page 170
  9350.  
  9351.  
  9352.  
  9353.  
  9354. -------------------------------------------------------------------------------
  9355. user_          char od_control.user_homephone[13];
  9356. homephone
  9357.                This string contains the user's home or data phone number, if
  9358.                available. This value is only available under system that
  9359.                produce one of the following door information files:
  9360.                EXITINFO.BBS, PC-Board/GAP style DOOR.SYS, WildCat style
  9361.                DOOR.SYS or SFDOORS.DAT.
  9362.  
  9363.  
  9364.  
  9365. -------------------------------------------------------------------------------
  9366. user           unsigned char od_control.user_last_pwdchange;
  9367. _last
  9368. _pwdchange     This variable contains the number of calls that the user has
  9369.                made since they last changed their password. This variable is
  9370.                only available under EXITINFO.BBS files.
  9371.  
  9372.  
  9373.  
  9374. -------------------------------------------------------------------------------
  9375. user           char od_control.user_lastdate[9];
  9376. _lastdate
  9377.                This variable is a string containing the date of the user's last
  9378.                call to the BBS, and should always be of the format:
  9379.  
  9380.                                   "MM-DD-YY"
  9381.  
  9382.                Where MM is two digits representing the number of the month of
  9383.                the user's call, with 1 being January, 2 being February, and so
  9384.                on. DD should be two digits representing the day of the month of
  9385.                the user's last call, beginning with 1, and MM should be the
  9386.                last two digits of the year of the user's last call.
  9387.  
  9388.                This variable is only available under systems that produce one
  9389.                of the following door information files: CHAIN.TXT,
  9390.                EXITINFO.BBS, PC-Board/GAP style DOOR.SYS or WildCat style
  9391.                DOOR.SYS files.
  9392.  
  9393.  
  9394.  
  9395. -------------------------------------------------------------------------------
  9396. user_          unsigned int od_control.user_lastread;
  9397. lastread
  9398.                This variable contains the number of the highest message number
  9399.                that the user has read, and is only available under EXITINFO.BBS
  9400.                format door information files.
  9401.  
  9402.  
  9403. ===============================================================================
  9404. OpenDoors 6.00 Manual                                          End of Page 171
  9405.  
  9406.  
  9407. -------------------------------------------------------------------------------
  9408. user           char od_control.user_lasttime[6];
  9409. _lasttime
  9410.                This variable contains a string representing the time of the
  9411.                user's last call to the BBS, and should always be of the format:
  9412.  
  9413.                                   "HH:MM"
  9414.  
  9415.                Where HH is two digits representing the 24-hour format hour of
  9416.                the user's last call, and MM is two digits representing the
  9417.                minute of the user's last call. Thus, the following strings
  9418.                would be valid entries for this string:
  9419.  
  9420.                     "00:01"    (12:01 am)
  9421.                     "03:47"    (3:47 am)
  9422.                     "18:20"    (6:20 pm)
  9423.  
  9424.                This variable is only available under systems that produce an
  9425.                EXITINFO.BBS or Wildcat style DOOR.SYS format door information
  9426.                file.
  9427.  
  9428.  
  9429.  
  9430. -------------------------------------------------------------------------------
  9431. user           char od_control.user_location[26];
  9432. _location
  9433.                This string contains the name of the location from which the
  9434.                current user is calling from. This will usually be the name of
  9435.                the city, region (province, state, etc.) and sometimes country
  9436.                where the user lives. The contents of this variable are
  9437.                displayed on the OpenDoors status line. The value of this
  9438.                variable is valid after od_init() or any other OpenDoors
  9439.                function has been called. Also, you may change the value of this
  9440.                variable if you wish. However, not that these changes may not
  9441.                immediately be reflected in the status line, and may or may not
  9442.                cause the setting to be changed after the user returns to the
  9443.                BBS. This variable is available under systems that produce one
  9444.                of the following door information files: DORINFO?.DEF,
  9445.                EXITINFO.BBS, PC-Board/GAP style DOOR.SYS, WildCat style
  9446.                DOOR.SYS SFDOORS.DAT and CALLINFO.BBS, but is not available
  9447.                under CHAIN.TXT or DoorWay style DOOR.SYS files.
  9448.  
  9449.  
  9450.  
  9451. -------------------------------------------------------------------------------
  9452. user           char od_control.caller_logindate[9];
  9453. _logindate
  9454.                This variable contains a string representing the date on which
  9455.                the current call to the BBS began. This variable is in the same
  9456.                format as the od_control.user_lastdate variable, described
  9457.  
  9458. ===============================================================================
  9459. OpenDoors 6.00 Manual                                          End of Page 172
  9460.  
  9461.                below. This variable is only available under systems which
  9462.                produce an EXITINFO.BBS file.
  9463.  
  9464.  
  9465.  
  9466. -------------------------------------------------------------------------------
  9467. user           long od_control.user_loginsec;
  9468. _loginsec
  9469.                This variable contains the user's security at login, and can be
  9470.                used to detect changes by the sysop or other programs during the
  9471.                course of the call, by comparing it's value with the
  9472.                od_control.user_security variable. This variable is only
  9473.                available under systems which produce an EXITINFO.BBS file.
  9474.  
  9475.  
  9476.  
  9477. -------------------------------------------------------------------------------
  9478. user           char od_control.user_logintime[6];
  9479. _logintime
  9480.                This variable contains a string representing the time of day at
  9481.                which the current call to the BBS began. This variable is in the
  9482.                same format as the od_control.user_lasttime variable, which is
  9483.                also described below. This variable is available under systems
  9484.                which produce an EXITINFO.BBS, a Wildcat style DOOR.SYS, or an
  9485.                SFDOORS.DAT file.
  9486.  
  9487.  
  9488.  
  9489. -------------------------------------------------------------------------------
  9490. user           char od_control.user_logonpassword[16];
  9491. _logon
  9492. password       This variable is a string which contains the user's password
  9493.                at the time at which the current call to the BBS began. This
  9494.                variable can be used to detect changes by the sysop or other
  9495.                programs to the user's password, which have taken place during
  9496.                the course of the call. In order to detect such changes, simply
  9497.                compare the contents of this string with the contents of the
  9498.                od_control.user_password variable. This variable is only
  9499.                available under systems which produce an EXITINFO.BBS format
  9500.                door information file.
  9501.  
  9502.  
  9503.  
  9504. -------------------------------------------------------------------------------
  9505. user           char od_control.user_menustack[50][9];
  9506. _menustack
  9507.                This variable is an array of 50 strings, containing the stack of
  9508.                BBS menus that have been executed, and is used to record the
  9509.                current position of the user within the BBS's menu system. Each
  9510.                string contains just the base portion of the filename of the
  9511.                menu, without the extension. The od_control.ra_menustackpointer
  9512.                variable points to the top of the menu stack. However, a
  9513. ===============================================================================
  9514. OpenDoors 6.00 Manual                                          End of Page 173
  9515.  
  9516.                complete discussion of the menu stack is beyond the scope of
  9517.                this manual. This variable is only available under systems that
  9518.                produce an RA 1.00 and later style extended EXITINFO.BBS door
  9519.                information file.
  9520.  
  9521.  
  9522.  
  9523. -------------------------------------------------------------------------------
  9524. user           unsigned char od_control.user_menustackpointer;
  9525. _menustack
  9526. pointer        This variable points to the top of the current menu stack. For
  9527.                more information on the menu stack, please refer to the
  9528.                od_control.ra_menustack variable, above. This variable is only
  9529.                available under systems that produce an RA 1.00 and later style
  9530.                extended EXITINFO.BBS door information file.
  9531.  
  9532.  
  9533.  
  9534. -------------------------------------------------------------------------------
  9535. user           unsigned int od_control.user_messages;
  9536. _messages
  9537.                This variable contains a value representing the total number of
  9538.                messages that have been written by the user, and is available
  9539.                under EXITINFO.BBS or Wildcat style DOOR.SYS format door
  9540.                information files.
  9541.  
  9542.  
  9543.  
  9544. -------------------------------------------------------------------------------
  9545. user_name      char od_control.user_name[36];
  9546.  
  9547.                This string contains the name of the user that is currently on-
  9548.                line, and is used by OpenDoors to display the current user name
  9549.                on the status line, and will most likely be used by your door
  9550.                for differentiating among different users. In most cases, you
  9551.                should probably not change the value of this variable, as a
  9552.                user's name does not usually change, and doing so could results
  9553.                in problems when returning to some BBS systems. For an example
  9554.                of using this variable, see the EX_VOTE.C example program. This
  9555.                variable is available under all BBS systems.
  9556.  
  9557.  
  9558.  
  9559. -------------------------------------------------------------------------------
  9560. user_net_      unsigned int od_control.user_net_credit;
  9561. credit
  9562.                This variable contains the amount of NetMail credit that the
  9563.                current user has to his or her name. This variable is only
  9564.                available under systems that produce an EXITINFO.BBS file.
  9565.  
  9566.  
  9567.  
  9568. ===============================================================================
  9569. OpenDoors 6.00 Manual                                          End of Page 174
  9570.  
  9571.                Note that if you wish to change the value of the user's
  9572.                remaining NetMail credit, you should use the od_control.
  9573.                user_credit variable, instead of this variable.
  9574.  
  9575.  
  9576.  
  9577. -------------------------------------------------------------------------------
  9578. user_net       char od_control.user_netmailentered;
  9579. mailentered
  9580.                This variable is a Boolean value, indicating whether or not the
  9581.                user has entered new NetMail or GroupMail during this call. If
  9582.                this variable has a value of TRUE, then NetMail/GroupMail has
  9583.                been entered, and if it has a value of FALSE, then
  9584.                NetMail/GroupMail has not been entered. This variable will
  9585.                contain a valid value only after od_init() or some OpenDoors
  9586.                function has been called. Any changes made to this variable will
  9587.                be reflected within the BBS software when control is returned to
  9588.                the BBS. This variable is accessible only under systems which
  9589.                produce an EXITINFO.BBS door information file.
  9590.  
  9591.  
  9592.  
  9593. -------------------------------------------------------------------------------
  9594. user_num       unsigned int od_control.user_num;
  9595.  
  9596.                This variable contains the number of the user's record in the
  9597.                user database file, where 0 is the first record. This can be
  9598.                useful for changing user settings that are not re-read by the
  9599.                BBS, such as the user's phone number or security level which
  9600.                might be altered by a call back verification door. However, the
  9601.                value of this variable itself should not be altered.
  9602.  
  9603.                This variable is available under systems which produce any of
  9604.                the following door information file formats: CHAIN.TXT, PC-
  9605.                Board/GAP style DOOR.SYS, Wildcat style DOOR.SYS SFDOORS.DAT and
  9606.                EXITINFO.BBS.
  9607.  
  9608.  
  9609.  
  9610. -------------------------------------------------------------------------------
  9611. user_          unsigned int od_control.user_numcalls;
  9612. numcalls
  9613.                This variable contains the total number of calls that the
  9614.                current user has placed to the BBS, and is available under
  9615.                systems that produce EXITINFO.BBS or PC-Board/GAP and Wildcat
  9616.                style DOOR.SYS door information files.
  9617.  
  9618.  
  9619.  
  9620.  
  9621.  
  9622.  
  9623. ===============================================================================
  9624. OpenDoors 6.00 Manual                                          End of Page 175
  9625.  
  9626. -------------------------------------------------------------------------------
  9627. user           unsigned int od_control.user_numpages;
  9628. _numpages
  9629.                The value of this variable contains the total number of times
  9630.                that the user has paged the sysop, and can be used to limit the
  9631.                number of times that the user is permitted to page the sysop.
  9632.                OpenDoors increments this variable every time that the user
  9633.                pages the sysop, via the od_page() function. This variable is
  9634.                used with all types of door information files. However, this
  9635.                variable will only reflect the value within the BBS if an
  9636.                EXITINFO.BBS file is produced. Otherwise, the variable will only
  9637.                contain the number of times that the user has paged within the
  9638.                door, but not the total number of times the user has paged.
  9639.                Under EXITINFO.BBS systems, changes to the value of this
  9640.                variable will be reflected within the BBS upon return by the
  9641.                DOOR.
  9642.  
  9643.  
  9644.  
  9645. -------------------------------------------------------------------------------
  9646. user           char od_control.user_password[16];
  9647. _password
  9648.                This variable contains the user's password for accessing the
  9649.                BBS. OpenDoors does not use this value itself. This variable
  9650.                will contain a valid value only after od_init() or some
  9651.                OpenDoors function has been called. You may change the value of
  9652.                this variable. Note, however, that changes in this variable may
  9653.                or may not cause the setting to be changed when control returns
  9654.                to the BBS - this will depend upon the particular BBS system
  9655.                your door is running under. This variable is only available
  9656.                under systems that produce one of the following door information
  9657.                files: EXITINFO.BBS, PC-Board/GAP and Wildcat style DOOR.SYS,
  9658.                SFDOORS.DAT, and CALLINFO.BBS.
  9659.  
  9660.  
  9661.  
  9662. -------------------------------------------------------------------------------
  9663. user_pending   unsigned int od_control.user_pending;
  9664.  
  9665.                This variable represents the total value of NetMail that has
  9666.                been written by the current user, but not yet exported from the
  9667.                message base. This variable is only available under systems that
  9668.                produce an EXITINFO.BBS door information file.
  9669.  
  9670.  
  9671.  
  9672. -------------------------------------------------------------------------------
  9673. user_reason    char od_control.user_reasonforchat[78];
  9674. forchat
  9675.                This variable is a string, containing the reason for which the
  9676.                user wishes to chat with the sysop, as they entered at the time
  9677.                of paging the sysop. This variable will contain an empty string
  9678. ===============================================================================
  9679. OpenDoors 6.00 Manual                                          End of Page 176
  9680.  
  9681.                if the user has not paged the sysop, or if the reason the user
  9682.                wishes to chat is unknown. See also the od_control.user_wantchat
  9683.                variable. This variable is available under all BBS systems,
  9684.                regardless of what style of door information file they produce.
  9685.                However, this variable will not be passed between the door and
  9686.                BBS, and thus the user's reason for chat within the door will
  9687.                not necessarily correspond to their reason for chat outside the
  9688.                door.
  9689.  
  9690.  
  9691.  
  9692. -------------------------------------------------------------------------------
  9693. user_rip       char user_rip;
  9694.  
  9695.                This variable is set to TRUE if the user has RIP (Remote Imaging
  9696.                Protocol) graphics enabled, and FALSE if they do not. This
  9697.                setting can be determined from the door information (drop) file
  9698.                in many cases. In other cases, you can automatically determine
  9699.                whether or not the user's system supports RIP graphics using the
  9700.                od_autodetect() function (see page 48).
  9701.  
  9702.  
  9703.  
  9704. -------------------------------------------------------------------------------
  9705. user_rip_ver   BYTE user_rip_ver;
  9706.  
  9707.                This variable contains the version of the RIP protocol that is
  9708.                in use. This variable is only available under a RemoteAccess
  9709.                2.50 EXITINFO.BBS file.
  9710.  
  9711.  
  9712.  
  9713. -------------------------------------------------------------------------------
  9714. user           unsigned int od_control.user_screen_length;
  9715. _screen
  9716. _length        This value of this variable represents the total number of
  9717.                lines that can be displayed on the user's screen at once, and is
  9718.                usually either 24 or 25. You may wish to make use of this
  9719.                variable to allow your door to pause the display of long pieces
  9720.                of text after every screen length, in order to allow the user to
  9721.                read this information before it passes off of their screen. In
  9722.                this case, you would simply maintain a counter of the total
  9723.                number of lines displayed, and when this value reaches one less
  9724.                than the length of the user screen, display a prompt asking the
  9725.                user to whether or not they wish to continue.
  9726.  
  9727.                This variable is set to the user's setting within the BBS under
  9728.                systems that produce any of the following door information file
  9729.                formats: CHAIN.TXT, EXITINFO.BBS, PC-Board/GAP and Wildcat style
  9730.                DOOR.SYS and CALLINFO.BBS files.
  9731.  
  9732.  
  9733. ===============================================================================
  9734. OpenDoors 6.00 Manual                                          End of Page 177
  9735.  
  9736.                This variable is used by the OpenDoors function,
  9737.                od_list_files(). If this variable contains a valid value,
  9738.                OpenDoors will pause the listing of files after every screen,
  9739.                and give the user the option of continuing, aborting, or
  9740.                disabling the "Continue?" prompt for the rest of the file
  9741.                listing. Thus, if you are using the od_list_files() under a
  9742.                system that does not produce one of the door information files
  9743.                listed above, you may wish to obtain the user's screen length
  9744.                from the user themselves. If the screen length is not available
  9745.                from the particular type of door information file that is found,
  9746.                and you do not set this value yourself, this variable will
  9747.                default to 23. If you are going to set the value of this
  9748.                variable yourself, you should do so after having called
  9749.                od_init() or some OpenDoors function.
  9750.  
  9751.  
  9752.  
  9753. -------------------------------------------------------------------------------
  9754. user_          unsigned char od_control.user_screenwidth;
  9755. screenwidth
  9756.                This variable contains a value representing the width of the
  9757.                user's screen, and will most often be equal to 80. This variable
  9758.                is only available under systems that produce a CHAIN.TXT or RA
  9759.                1.00 and later style extended EXITINFO.BBS door information
  9760.                file.
  9761.  
  9762.  
  9763.  
  9764. -------------------------------------------------------------------------------
  9765. user           unsigned int od_control.user_security;
  9766. _security
  9767.                This variable contains a numerical value representing the user's
  9768.                security access level on the BBS. You may wish to use this value
  9769.                to determine whether or not the current user of your door should
  9770.                have access to certain sysop-only functions. In this case, you
  9771.                may wish to have a configuration file used by your door, in
  9772.                which the sysop may define the minimum security level for sysop
  9773.                access. You would then be able to compare this configuration
  9774.                setting to the security level stored in this variable, in order
  9775.                to determine whether or not sysop function should be available.
  9776.                An alternative method, used by the EX_VOTE.C sample door, of
  9777.                determining whether or not the current user is the sysop is to
  9778.                compare the user's name with the value of the
  9779.                od_control.sysop_name variable. This method has the advantage of
  9780.                not requiring a configuration program, but the disadvantage that
  9781.                the door will not function correctly under all BBS systems, as
  9782.                the od_control.sysop_name variable is not available under all
  9783.                BBS systems.
  9784.  
  9785.                The od_control.user_security variable is available under BBS
  9786.                systems that produce any of the following door information file
  9787.  
  9788. ===============================================================================
  9789. OpenDoors 6.00 Manual                                          End of Page 178
  9790.  
  9791.                formats: CHAIN.TXT, EXITINFO.BBS, PC-Board/GAP and Wildcat style
  9792.                DOOR.SYS, SFDOORS.DAT or CALLINFO.BBS.
  9793.  
  9794.  
  9795.  
  9796. -------------------------------------------------------------------------------
  9797. user_sex       char od_control.user_sex;
  9798.  
  9799.                This variable contains a single character representing the
  9800.                gender of the user that is currently online. This variable will
  9801.                contain an upper-case 'F' if the user is female, and an upper-
  9802.                case 'M' if the user is male. This variable is available under
  9803.                systems that produce a CHAIN.TXT or RA 2.x style EXITINFO.BBS
  9804.                file.
  9805.  
  9806.  
  9807.  
  9808. -------------------------------------------------------------------------------
  9809. user_subdate   char od_control.user_subdate[9];
  9810.  
  9811.                This variable is a string, in the same format as the
  9812.                od_control.user_lastdate variable, which stores the date of
  9813.                expiry of the user's subscription to the BBS. This variable is
  9814.                only available under systems which produce a PC-Board/GAP and
  9815.                Wildcat style DOOR.SYS or RA 1.00 and later style extended
  9816.                EXITINFO.BBS door information file.
  9817.  
  9818.  
  9819.  
  9820. -------------------------------------------------------------------------------
  9821. user           int od_control.user_timelimit;
  9822. _timelimit
  9823.                This variable contains the amount of time, in minutes, that the
  9824.                user has left in the door. Note that this value may or may not
  9825.                be equal to the total amount of time that the user has left on
  9826.                the BBS, depending upon whether the BBS or a third-party door
  9827.                manager program only allows a limited amount of time in this
  9828.                door. This variable contains a valid value after od_init() or
  9829.                some OpenDoors function has been called. OpenDoors uses this
  9830.                variable to keep track of how much time the user has left in the
  9831.                door, and will automatically warn the user when nearly all of
  9832.                his or her time has been used up. OpenDoors will also force the
  9833.                user out of the door when their time in the door has expired.
  9834.                OpenDoors automatically subtracts one minute from this variable
  9835.                every minute that OpenDoors is active, unless chat mode has been
  9836.                activated (in which case the user's time will freeze), and also
  9837.                adjusts the value of this variable when the sysop uses the time
  9838.                adjustment function keys. Hence, you will not normally have any
  9839.                need to alter the value of this variable yourself. However,
  9840.                there may be some cases in which you wish to subtract a penalty
  9841.                or add a bonus to the user's time, such as in a "timebank" door
  9842.                or a door game that permits the user to "gamble time".
  9843. ===============================================================================
  9844. OpenDoors 6.00 Manual                                          End of Page 179
  9845.  
  9846.  
  9847.                Depending on which BBS system your door is running under, the
  9848.                value of this variable may or may not effect the user's time
  9849.                left upon return to the BBS. The BBS system will either reset
  9850.                the user's time to the value re-written to the door information
  9851.                file (this variable), or will always subtract the amount of time
  9852.                spent in the door from the user's remaining time.
  9853.  
  9854.                This variable is available under all door information file
  9855.                formats.
  9856.  
  9857.  
  9858.  
  9859. -------------------------------------------------------------------------------
  9860. user           unsigned int od_control.user_todayk;
  9861. _todayk
  9862.                This variable contains the total kilobytes of files that the
  9863.                current user has downloaded from the BBS during the current day,
  9864.                and is available under systems that produce EXITINFO.BBS, PC-
  9865.                Board/GAP and Wildcat style DOOR.SYS, or SFDOORS.DAT format door
  9866.                information files.
  9867.  
  9868.  
  9869.  
  9870. -------------------------------------------------------------------------------
  9871. user_upk       unsigned int od_control.user_upk;
  9872.  
  9873.                This variable contains the total kilobytes of files that the
  9874.                current user has uploaded to the BBS, and is available under
  9875.                systems that produce EXITINFO.BBS, Wildcat style DOOR.SYS or
  9876.                SFDOORS.DAT files.
  9877.  
  9878.  
  9879.  
  9880. -------------------------------------------------------------------------------
  9881. user_uploads   unsigned int od_control.user_uploads;
  9882.  
  9883.                This variable contains the total number of files that the
  9884.                current user has uploaded to the BBS, and is available under
  9885.                systems that produce EXITINFO.BBS, PC-Board/GAP and Wildcat
  9886.                style DOOR.SYS, or SFDOORS.DAT format door information files.
  9887.  
  9888.  
  9889.  
  9890. -------------------------------------------------------------------------------
  9891. user           char od_control.user_wantchat;
  9892. _wantchat
  9893.                This variable is a Boolean value which indicates whether or not
  9894.                the user wishes to chat with the sysop (ie, the user has paged
  9895.                the sysop, but has yet to receive a chat with the sysop). This
  9896.                variable is used under all door information file formats.
  9897.                However, changes to this variable are only reflected on the BBS
  9898. ===============================================================================
  9899. OpenDoors 6.00 Manual                                          End of Page 180
  9900.  
  9901.                when the door is running under a system that produces an
  9902.                EXITINFO.BBS door information file.
  9903.  
  9904.                This variable is automatically turned on (ie., set to TRUE),
  9905.                when the user begins to page the sysop for chat, within the
  9906.                od_page() function, and is automatically turned off (ie., set to
  9907.                FALSE), when the sysop breaks in for chat via the chat function
  9908.                key. Also, setting this variable to TRUE will turn on the
  9909.                flashing want-chat indicator on the OpenDoors status line.
  9910.  
  9911.  
  9912. -------------------------------------------------------------------------------
  9913. user           unsigned int od_control.user_xi_record;
  9914. _xi_record
  9915.                This variable contains the number of the user's record in the
  9916.                USERXI.BBS file, if any. This variable is only available under
  9917.                system that produce a Remote Access 1.00 and later style
  9918.                extended door information file.
  9919.  
  9920.  
  9921.  
  9922.  
  9923.  
  9924.  
  9925.  
  9926.  
  9927.  
  9928.  
  9929.  
  9930.  
  9931.  
  9932.  
  9933.  
  9934.  
  9935.  
  9936.  
  9937.  
  9938.  
  9939.  
  9940.  
  9941.  
  9942.  
  9943.  
  9944.  
  9945.  
  9946.  
  9947.  
  9948.  
  9949.  
  9950.  
  9951.  
  9952.  
  9953. ===============================================================================
  9954. OpenDoors 6.00 Manual                                          End of Page 181
  9955.  
  9956. CONTROL STRUCTURE - DOOR SETTINGS
  9957. -------------------------------------------------------------------------------
  9958.  
  9959.                This section deals with those variables in the OpenDoors control
  9960.                structure which reflect the current door settings. These
  9961.                variables are as follows:
  9962.  
  9963.                od_cur_attrib            The current display attribute, or -1 if
  9964.                                         unknown.
  9965.  
  9966.                od_okaytopage            Controls whether the user is currently
  9967.                                         permitted to page the sysop.
  9968.  
  9969.                od_pageendmin            End of valid paging hours.
  9970.  
  9971.                od_pagestartmin          Start of valid paging hours.
  9972.  
  9973.                od_silent_mode           Turns off local user interface.
  9974.  
  9975.                od_user_keyboard_on      Controls whether OpenDoors will
  9976.                                         currently accept input from the remote
  9977.                                         user's keyboard.
  9978.  
  9979.                od_update_status_now     Forces immediate update of the status
  9980.                                         line.
  9981.  
  9982.                sysop_next               Indicates whether or not the sysop has
  9983.                                         reserved use of the system after the
  9984.                                         current calls.
  9985.  
  9986.  
  9987.  
  9988. -------------------------------------------------------------------------------
  9989. od_cur         int od_control.od_cur_attrib;
  9990. _attrib
  9991.                This read-only values stores the current display color
  9992.                attribute, or the value -1 if the current display color is
  9993.                unknown (such as when the door first begins execution).
  9994.  
  9995.  
  9996.  
  9997. -------------------------------------------------------------------------------
  9998. od             char od_control.od_okaytopage;
  9999. _okaytopage
  10000.                This variable allows you to control whether or not the user is
  10001.                currently permitted to page the sysop via the od_page()
  10002.                function. A value of PAGE_ENABLE indicates that paging is
  10003.                currently permitted, regardless of the sysop page hours setting.
  10004.                A value of PAGE_DISABLE indicates that paging is not current
  10005.                permitted. A value of PAGE_USE_HOURS indicates that the
  10006.                od_page() function should check the values of the
  10007.  
  10008. ===============================================================================
  10009. OpenDoors 6.00 Manual                                          End of Page 182
  10010.  
  10011.                od_pagestartmin and od_pageendmin variables in order to
  10012.                determine whether or not paging should be permitted.
  10013.                The od_okaytopage variable should only be set after you call
  10014.                od_init() or some other OpenDoors function. The default value is
  10015.                PAGE_USE_HOURS. For more information on the od_page() function
  10016.                itself, see page 101.
  10017.  
  10018.  
  10019.  
  10020. -------------------------------------------------------------------------------
  10021. od             unsigned int od_control.od_pageendmin;
  10022. _pageendmin
  10023.                This variable can be used to set the beginning of valid sysop
  10024.                paging hours within the od_page() function. If the
  10025.                od_control.od_okaytopage variable (which is described above) is
  10026.                set to MAYBE, then OpenDoors will check the value of this
  10027.                variable prior to paging the sysop via the od_page() function.
  10028.                This variable should contain the time at which the valid sysop
  10029.                paging hours end, represented as the a number of minutes since
  10030.                midnight. For more information on the od_page() function itself,
  10031.                see page 101.
  10032.  
  10033.  
  10034.  
  10035. -------------------------------------------------------------------------------
  10036. od             unsigned int od_control.od_pagestartmin;
  10037. _pagestartmin
  10038.                This variable can be used to set the beginning of valid sysop
  10039.                paging hours within the od_page() function. If the
  10040.                od_control.od_okaytopage variable (which is described above) is
  10041.                set to MAYBE, then OpenDoors will check the value of this
  10042.                variable prior to paging the sysop via the od_page() function.
  10043.                This variable should contain the time at which the valid sysop
  10044.                paging hours begin, represented as the a number of minutes since
  10045.                midnight. For more information on the od_page() function itself,
  10046.                see page 101.
  10047.  
  10048.  
  10049.  
  10050. -------------------------------------------------------------------------------
  10051. od_silent      BOOL od_control.od_silent_mode;
  10052. _mode
  10053.                If this variable is set to TRUE prior to the first call to any
  10054.                OpenDoors function, OpenDoors will operate in silent mode, where
  10055.                the local display and sysop commands are not used. Silent mode
  10056.                is automatically disabled if the program is running in local
  10057.                mode.
  10058.  
  10059.  
  10060.  
  10061.  
  10062.  
  10063. ===============================================================================
  10064. OpenDoors 6.00 Manual                                          End of Page 183
  10065.  
  10066. -------------------------------------------------------------------------------
  10067. od_update      char od_control.od_update_status_now;
  10068. _status_now
  10069.                Setting this variable to TRUE forces OpenDoors to update the
  10070.                status line during the next od_kernel() execution. When the
  10071.                status line is updated, this variable is reset to its default
  10072.                value of FALSE.
  10073.  
  10074.  
  10075.  
  10076. -------------------------------------------------------------------------------
  10077. od_user        char od_control.od_user_keyboard_on;
  10078. _keyboard_on
  10079.                This variable is a Boolean value, indicating whether OpenDoors
  10080.                will currently accept input from a remote user. OpenDoors
  10081.                provides a function key (usually [ALT]-[K], unless you have
  10082.                changed the default), which will allow the sysop to temporarily
  10083.                prevent the user from having any control over the door. When the
  10084.                sysop activates this feature, a flashing [Keyboard-Off]
  10085.                indicator will appear on the status line, and this variable will
  10086.                be set to FALSE. When the sysop presses the [ALT]-[K]
  10087.                combination a second time, to toggle the user's keyboard back
  10088.                on, the flashing indicator will disappear, and this variable
  10089.                will be set back to TRUE.
  10090.  
  10091.  
  10092.  
  10093. -------------------------------------------------------------------------------
  10094. sysop_next     char od_control.sysop_next;
  10095.  
  10096.                This variable is a Boolean value, indicating whether or not the
  10097.                "sysop next" feature has been activated. The "sysop next"
  10098.                feature, which reserves the system for the sysop after the call
  10099.                has ended, can be toggled on and off within OpenDoors by use of
  10100.                a function key (Alt-N by default). Also, when the "sysop next"
  10101.                feature has been activated, an indicator will appear on the
  10102.                OpenDoors status line. This variable is only available under
  10103.                systems that produce an SFDOORS.DAT or RA 1.00 and later style
  10104.                extended EXITINFO.BBS door information file. For more
  10105.                information on testing the type of door information file
  10106.                available, please see page 158.
  10107.  
  10108.  
  10109.  
  10110.  
  10111.  
  10112.  
  10113.  
  10114.  
  10115.  
  10116.  
  10117.  
  10118. ===============================================================================
  10119. OpenDoors 6.00 Manual                                          End of Page 184
  10120.  
  10121. CONTROL STRUCTURE - DIAGNOSTICS
  10122. -------------------------------------------------------------------------------
  10123.  
  10124.                To help in diagnosing problems in your OpenDoors programs,
  10125.                OpenDoors stores information on the most recent error which
  10126.                occurred. When any of the OpenDoors functions return an "error"
  10127.                or "failure" state, the reason for this failure is recorded.
  10128.  
  10129.                The following OpenDoors control structure variable provides
  10130.                diagnostics information:
  10131.  
  10132.                od_error                 Stores a "reason code" for the last
  10133.                                         failed OpenDoors API function call.
  10134.  
  10135.  
  10136.  
  10137.  
  10138. -------------------------------------------------------------------------------
  10139. od_error       int od_control.od_error;
  10140.  
  10141.                When any of the OpenDoors API functions return an "error" or
  10142.                "failure" state (usually denoted by either of the values FALSE
  10143.                or NULL), the reason for the failure is recorded in this
  10144.                variable. Since successful function calls do not alter the value
  10145.                of the od_control.od_error variable, you must be careful not
  10146.                only to check the value of the od_control.od_error variable, but
  10147.                also to check the OpenDoors function return codes, in order to
  10148.                determine which function failed.
  10149.  
  10150.                This variable will always store the reason for the most recent
  10151.                function call failure, or ERR_NONE if no functions have failed.
  10152.                od_error may take on any of the following values:
  10153.  
  10154.                     ERR_NONE            Indicates that no error has occurred
  10155.                                         yet.
  10156.  
  10157.                     ERR_MEMORY          Function was unable to allocate
  10158.                                         required memory. This usually indicates
  10159.                                         that there is not enough available
  10160.                                         memory. This failure may also be due to
  10161.                                         memory corruption caused by your
  10162.                                         program inadvertently overwriting heap
  10163.                                         structures. If your program has been
  10164.                                         compiled in either the small or the
  10165.                                         medium memory model, try recompiling it
  10166.                                         in the compact, large, or huge memory
  10167.                                         models. If your program is already
  10168.                                         compiled in the compact, large, or huge
  10169.                                         memory models, try making more system
  10170.                                         memory available to your program.
  10171.  
  10172.  
  10173. ===============================================================================
  10174. OpenDoors 6.00 Manual                                          End of Page 185
  10175.  
  10176.                     ERR_NOGRAPHICS      This setting indicates that the
  10177.                                         function called requires ANSI, AVATAR
  10178.                                         or RIP graphics mode, but none of these
  10179.                                         modes are active.
  10180.  
  10181.                     ERR_PARAMETER       An invalid parameter was passed to an
  10182.                                         OpenDoors functions. Check the
  10183.                                         function's description in chapter four,
  10184.                                         to determine the required values for
  10185.                                         each function parameter.
  10186.  
  10187.                     ERR_FILEOPEN        OpenDoors was unable to open a file.
  10188.                                         This can be due to the specified
  10189.                                         filename not existing, due to the file
  10190.                                         being locked for exclusive access by
  10191.                                         another process, or due to a hardware
  10192.                                         failure.
  10193.  
  10194.                     ERR_FILEREAD        OpenDoors was able to open the
  10195.                                         specified file, but unable to read the
  10196.                                         required data from the file. This error
  10197.                                         may be due to an invalid file format,
  10198.                                         due to a portion of the file being
  10199.                                         locked by another process, or due to a
  10200.                                         hardware failure.
  10201.  
  10202.                     ERR_LIMIT           An internal function limit has been
  10203.                                         exceeded. Refer to the function's
  10204.                                         description in chapter four for
  10205.                                         information on the function's
  10206.                                         limitations.
  10207.  
  10208.                     ERR_NOREMOTE        Indicates that a function has been
  10209.                                         called which is not valid in local
  10210.                                         mode, such as od_carrier() or
  10211.                                         od_set_dtr().
  10212.  
  10213.  
  10214.  
  10215.  
  10216.  
  10217.  
  10218.  
  10219.  
  10220.  
  10221.  
  10222.  
  10223.  
  10224.  
  10225.  
  10226.  
  10227.  
  10228. ===============================================================================
  10229. OpenDoors 6.00 Manual                                          End of Page 186
  10230.  
  10231. CONTROL STRUCTURE - OPENDOORS CUSTOMIZATION
  10232. -------------------------------------------------------------------------------
  10233.  
  10234.                The OpenDoors control structure provides many variables which
  10235.                allow you to customize OpenDoor's behavior and appearance. These
  10236.                customization variables fit into one of the following
  10237.                categories:
  10238.  
  10239.                          General Behavior Customization Variables
  10240.                          Sysop Function Keys Customization Variables
  10241.                          Color Customization Variables
  10242.                          Language-Specific Prompts Customization Variables
  10243.  
  10244.                This section deals with those variables that fit into the first
  10245.                category, "General Behavior Customization Variables". The other
  10246.                categories are dealt with in the following sections of this
  10247.                chapter.
  10248.  
  10249.                Below is a brief overview of the variables grouped into this
  10250.                section of the OpenDoors control structure. Following the
  10251.                overview is a detailed description of each of these variables.
  10252.  
  10253.  
  10254.                od_app_icon              Program icon for Win32 version.
  10255.  
  10256.                od_box_chars             Array of characters used by the
  10257.                                         od_draw_box() function.
  10258.  
  10259.                od_before_exit           Function to call prior to exiting.
  10260.  
  10261.                od_cafter_chat           Function to call after sysop chat.
  10262.  
  10263.                od_cafter_shell          Function to call after DOS shell.
  10264.  
  10265.                od_cbefore_chat          Function to call prior to sysop chat.
  10266.  
  10267.                od_cbefore_shell         Function to call prior to DOS shell.
  10268.  
  10269.                od_cfg_lines             Sets the configuration file's custom
  10270.                                         door information file line keywords.
  10271.  
  10272.                od_cfg_text              Sets the built-in configuration file
  10273.                                         keywords that OpenDoors will recognize.
  10274.  
  10275.                od_chat_active           Controls whether or not sysop chat mode
  10276.                                         is active.
  10277.  
  10278.                od_clear_on_exit         Controls whether the screen is cleared
  10279.                                         upon door exit.
  10280.  
  10281.  
  10282.  
  10283. ===============================================================================
  10284. OpenDoors 6.00 Manual                                          End of Page 187
  10285.  
  10286.                od_color_delimiter       Indicates what character should delimit
  10287.                                         imbedded color codes for the
  10288.                                         od_printf() function.
  10289.  
  10290.                od_color_names           Strings which OpenDoors recognizes as
  10291.                                         the names of various text colors.
  10292.  
  10293.                od_config_file           Used to enable or disable the OpenDoors
  10294.                                         configuration file system.
  10295.  
  10296.                od_config_filename       Sets the filename that will be read by
  10297.                                         the configuration file system.
  10298.  
  10299.                od_config_function       The callback function that OpenDoors
  10300.                                         will call to allow your program to
  10301.                                         process custom configuration file
  10302.                                         entries.
  10303.  
  10304.                od_default_personality   Sets the default personality to be used
  10305.                                         with the OpenDoors Multiple Personality
  10306.                                         System, and also sets the personality
  10307.                                         to use when the MPS is not active.
  10308.  
  10309.                od_default_rip_win       Whether OpenDoors should use the
  10310.                                         default 43-line RIP window for ANSI
  10311.                                         text (TRUE), or a 23-line window
  10312.                                         (FALSE).
  10313.  
  10314.                od_disable               Disable OpenDoors activities such as
  10315.                                         reading door information file and
  10316.                                         monitoring carrier detect / remaining
  10317.                                         time.
  10318.  
  10319.                od_disable_dtr           Specifies the string that will be sent
  10320.                                         to the modem to prevent the modem from
  10321.                                         hanging up when DTR is lowered.
  10322.  
  10323.                od_emu_simluate_modem    Simulates modem display speed for
  10324.                                         emulation functions such as
  10325.                                         od_send_file(), od_disp_emu() and
  10326.                                         od_hotkey_menu().
  10327.  
  10328.                od_errorlevel            Sets the errorlevel OpenDoors exits
  10329.                                         with under various conditions.
  10330.  
  10331.                od_force_local           Forces door to operate in local mode,
  10332.                                         ignoring any door information file and
  10333.                                         using default user settings.
  10334.  
  10335.                od_help_callback         Allows you to provide a help menu item
  10336.                                         under the Win32 version of OpenDoors
  10337.  
  10338. ===============================================================================
  10339. OpenDoors 6.00 Manual                                          End of Page 188
  10340.  
  10341.                od_in_buf_size           Sets size of OpenDoor's internal
  10342.                                         local/remote inbound buffer.
  10343.  
  10344.                od_inactive_warning      Number of seconds before hanging up
  10345.                                         that OpenDoors displays the inactivity
  10346.                                         timeout warning.
  10347.  
  10348.                od_inactivity            Controls user inactivity timeout.
  10349.  
  10350.                od_ker_exec              Is called whenever od_kernel()
  10351.                                         executes.
  10352.  
  10353.                od_last_input            Indicates whether the last input came
  10354.                                         from the remote user (==0) or the local
  10355.                                         sysop (==1).
  10356.  
  10357.                od_list_pause            Controls whether or not the user may
  10358.                                         pause display within the
  10359.                                         od_list_files() and od_send_file()
  10360.                                         functions by using the [P] key.
  10361.  
  10362.                od_list_stop             Controls whether or not the user may
  10363.                                         terminate display within the
  10364.                                         od_list_files() and od_send_file()
  10365.                                         functions using [S], [CTRL]-[K], etc.
  10366.  
  10367.                od_logfile               Enables or disables the OpenDoors log
  10368.                                         file system.
  10369.  
  10370.                od_logfile_disable       Prevents the logfile from being opened,
  10371.                                         even if the logfile is enabled by
  10372.                                         od_logfile.
  10373.  
  10374.                od_logfile_messages      Array of message strings that OpenDoors
  10375.                                         will use when writing log file entries.
  10376.  
  10377.                od_logfile_name          Contains the filename and possibly path
  10378.                                         of the logfile.
  10379.  
  10380.                od_maxtime               Indicates the maximum length of time
  10381.                                         any user is permitted to use the door.
  10382.  
  10383.                od_maxtime_deduction     Indicates the amount of time that has
  10384.                                         temporarily been taken away from the
  10385.                                         user's remaining time, as a result of
  10386.                                         the maximum door time setting.
  10387.  
  10388.                od_mps                   Enables or disables the OpenDoors
  10389.                                         Multiple Personality System.
  10390.  
  10391.                od_no_file_func          Called when no door information file
  10392.                                         can be read.
  10393. ===============================================================================
  10394. OpenDoors 6.00 Manual                                          End of Page 189
  10395.  
  10396.  
  10397.                od_no_ra_codes           Disables translation of RA/QBBS control
  10398.                                         codes.
  10399.  
  10400.                od_nocopyright           Prevents OpenDoors from displaying it's
  10401.                                         name and version number when a door
  10402.                                         program begins execution.
  10403.  
  10404.                od_noexit                Prevents OpenDoors from exiting when
  10405.                                         the od_exit() function is called.
  10406.  
  10407.                od_page_len              Controls length of the sysop page beep.
  10408.  
  10409.                od_page_pausing          Enables or disables page pausing in
  10410.                                         od_send_file(), od_hotkey_menu() and
  10411.                                         od_list_files() functions.
  10412.  
  10413.                od_page_startmin         Indicates the time of day at which
  10414.                                         sysop paging is first enabled.
  10415.  
  10416.                od_page_statusline       Which status line (if any) is activated
  10417.                                         when the user pages the sysop.
  10418.  
  10419.                od_page_endmin           Indicates the time of day at which
  10420.                                         sysop paging is disabled.
  10421.  
  10422.                od_prog_name             Stores the name of your program.
  10423.  
  10424.                od_prog_version          Stores the version number of your
  10425.                                         program.
  10426.  
  10427.                od_prog_copyright        Place your copyright information here.
  10428.  
  10429.                od_reg_key               Stores the registration key that you
  10430.                                         receive when purchasing OpenDoors.
  10431.  
  10432.                od_reg_name              Stores your name or your companies name
  10433.                                         when you have purchased an OpenDoors
  10434.                                         license (registration).
  10435.  
  10436.                od_spawn_freeze_time     Indicates whether the user's time
  10437.                                         remaining continues to be decreased
  10438.                                         during the execution of the
  10439.                                         od_spawn...() functions (FALSE), or if
  10440.                                         the timer should be "frozen" (TRUE).
  10441.  
  10442.                od_swapping_disable      Disables swapping during DOS shell and
  10443.                                         od_spawn...() functions.
  10444.  
  10445.                od_swapping_noems        Prevents swapping form being done to
  10446.                                         EMS expanded memory.
  10447.  
  10448. ===============================================================================
  10449. OpenDoors 6.00 Manual                                          End of Page 190
  10450.  
  10451.                od_swapping_path         Location where disk swap file should be
  10452.                                         created.
  10453.  
  10454.                od_status_on             Controls whether the status line sub-
  10455.                                         system is active.
  10456.  
  10457.                od_time_msg_func         Called instead of displaying time limit
  10458.                                         warning messages.
  10459.  
  10460.  
  10461.  
  10462.  
  10463. -------------------------------------------------------------------------------
  10464. od_app         HICON od_control.od_app_icon;
  10465. _icon
  10466.                Normally, the Win32 version of OpenDoors displays its own icon
  10467.                on the application title bar, on the Windows taskbar, and in the
  10468.                help|about dialog box. You can supply your own icon by setting
  10469.                this variable to point to the handle of the icon, as returned by
  10470.                LoadIcon();
  10471.  
  10472.  
  10473.  
  10474. -------------------------------------------------------------------------------
  10475. od_box         char od_control.od_box_chars[8];
  10476. _chars
  10477.                This variable allows you to specify which character the
  10478.                od_draw_box() function uses in drawing the boarder of a window.
  10479.                The elements of this array are as follows:
  10480.  
  10481.                od_box_chars[BOX_UPPERLEFT]  - Upper left corner of box
  10482.                od_box_chars[BOX_TOP]        - Top horizontal line
  10483.                od_box_chars[BOX_UPPERRIGHT] - Upper right corner of box
  10484.                od_box_chars[BOX_LEFT]       - Left Vertical line
  10485.                od_box_chars[BOX_LOWERLEFT]  - Lower left corner of box
  10486.                od_box_chars[BOX_LOWERRIGHT] - Lower right corner of box
  10487.                od_box_chars[BOX_BOTTOM]     - Bottom horizontal line
  10488.                od_box_chars[BOX_RIGHT]      - Right horizontal line
  10489.  
  10490.  
  10491.  
  10492. -------------------------------------------------------------------------------
  10493. od_before      void (*od_control.od_before_exit)();
  10494. _exit
  10495.                This variable contains a pointer to a function which OpenDoors
  10496.                should call prior to exiting, or NULL if you do not wish to have
  10497.                any function called at exit time. For an example of the use of
  10498.                this variable, see the description of the EX_VOTE.C example
  10499.                program, which begins on page 38.
  10500.  
  10501.  
  10502.  
  10503. ===============================================================================
  10504. OpenDoors 6.00 Manual                                          End of Page 191
  10505.  
  10506. -------------------------------------------------------------------------------
  10507. od_cafter      void (*od_control.od_cafter_chat)();
  10508. _chat
  10509.                The function pointed to by this variable will be called after
  10510.                sysop chat mode has ended. This may be useful for allowing you
  10511.                to save the user's screen contents prior to chat, and restoring
  10512.                the afterwards. If this variable contains its default value of
  10513.                NULL, no function will be called. To alter the string of text
  10514.                which is displayed after sysop chat, see the
  10515.                od_control.od_after_chat variable, which is described in the
  10516.                section on the prompts customization portion of the control
  10517.                structure.
  10518.  
  10519.  
  10520.  
  10521. -------------------------------------------------------------------------------
  10522. od_cafter      void (*od_control.od_cafter_shell)();
  10523. _shell
  10524.                The function pointed to by this variable will be called after
  10525.                the sysop has returned from a DOS shell. If this variable
  10526.                contains its default value of NULL, no function will be called.
  10527.                To alter the string of text which is displayed after a DOS
  10528.                shell, see the od_control.od_after_shell variable, which is
  10529.                described in the section on the prompts customization portion of
  10530.                the control structure.
  10531.  
  10532.  
  10533.  
  10534. -------------------------------------------------------------------------------
  10535. od_cbefore     void (*od_control.od_cbefore_chat)();
  10536. _chat
  10537.                The function pointed to by this variable will be called prior to
  10538.                entering sysop chat mode. This may be useful for allowing you to
  10539.                save the user's screen contents prior to chat, and restoring the
  10540.                afterwards. If this variable contains its default value of NULL,
  10541.                no function will be called. To alter the string of text which is
  10542.                displayed prior to sysop chat, see the od_control.od_before_chat
  10543.                variable, which is described in the section on the prompts
  10544.                customization portion of the control structure. To replace the
  10545.                OpenDoors sysop chat facility with your own, simply activate
  10546.                your chat mode when this function is called. Your chat mode
  10547.                facility should remain active until OpenDoors sets the
  10548.                od_control.od_chat_active variable to FALSE. If you wish to
  10549.                terminate chat mode prior to this variable being set to FALSE,
  10550.                you should set this variable to FALSE yourself if you do not
  10551.                wish OpenDoors to activate its own chat mode.
  10552.  
  10553.  
  10554.  
  10555.  
  10556.  
  10557.  
  10558. ===============================================================================
  10559. OpenDoors 6.00 Manual                                          End of Page 192
  10560.  
  10561. -------------------------------------------------------------------------------
  10562. od_cbefore     void (*od_control.od_cbefore_shell)();
  10563. _shell
  10564.                The function pointed to by this variable will be called prior to
  10565.                executing a sysop DOS shell. If this variable contains its
  10566.                default value of NULL, no function will be called. To alter the
  10567.                string of text which is displayed before a DOS shell, see the
  10568.                od_control.od_before_shell variable, which is described in the
  10569.                section on the prompts customization portion of the control
  10570.                structure.
  10571.  
  10572.  
  10573.  
  10574. -------------------------------------------------------------------------------
  10575. od_cfg_lines   char od_control.cfg_lines[25][33];
  10576.  
  10577.                This array contains the strings for the keywords that represent
  10578.                various lines in the definition of a custom door information
  10579.                file. Each keyword must be 32 character or less in length. These
  10580.                keywords are not case sensitive. See page 230 for more
  10581.                information on defining custom door information (drop) file
  10582.                formats. The default values for this array are as follows:
  10583.  
  10584.                     [0]  "Ignore"
  10585.                     [1]  "ComPort"
  10586.                     [2]  "FossilPort"
  10587.                     [3]  "ModemBPS"
  10588.                     [4]  "LocalMode"
  10589.                     [5]  "UserName"
  10590.                     [6]  "UserFirstName"
  10591.                     [7]  "UserLastName"
  10592.                     [8]  "Alias"
  10593.                     [9]  "HoursLeft"
  10594.                     [10] "MinutesLeft"
  10595.                     [11] "SecondsLeft"
  10596.                     [12] "ANSI"
  10597.                     [13] "AVATAR"
  10598.                     [14] "PagePausing"
  10599.                     [15] "ScreenLength"
  10600.                     [16] "ScreenClearing"
  10601.                     [17] "Security"
  10602.                     [18] "City"
  10603.                     [19] "Node"
  10604.                     [20] "SysopName"
  10605.                     [21] "SysopFirstName"
  10606.                     [22] "SysopLastName"
  10607.                     [23] "SystemName"
  10608.                     [24] "RIP"
  10609.  
  10610.                If you wish to change any of these variable, you must do so
  10611.                before calling any OpenDoors functions.
  10612.  
  10613. ===============================================================================
  10614. OpenDoors 6.00 Manual                                          End of Page 193
  10615.  
  10616.  
  10617.  
  10618. -------------------------------------------------------------------------------
  10619. od_cfg_text    char od_control.od_cfg_text[47][33];
  10620.  
  10621.                This array of strings contains the built-in configuration file
  10622.                keywords that are recognized by OpenDoors. These keywords may be
  10623.                up to 32 characters in size, and are not case sensitive. If you
  10624.                wish to change any of these settings, you must do so before
  10625.                calling any OpenDoors functions. The default values for this
  10626.                array are as follows:
  10627.  
  10628.                     [0]  "Node"
  10629.                     [1]  "BBSDir"
  10630.                     [2]  "DoorDir"
  10631.                     [3]  "LogFileName"
  10632.                     [4]  "DisableLogging"
  10633.                     [5]  "SundayPagingHours"
  10634.                     [6]  "MondayPagingHours"
  10635.                     [7]  "TuesdayPagingHours"
  10636.                     [8]  "WednesdayPagingHours"
  10637.                     [9]  "ThursdayPagingHours"
  10638.                     [10] "FridayPagingHours"
  10639.                     [11] "SaturdayPagingHours"
  10640.                     [12] "MaximumDoorTime"
  10641.                     [13] "SysopName"
  10642.                     [14] "SystemName"
  10643.                     [15] "SwappingDisable"
  10644.                     [16] "SwappingDir"
  10645.                     [17] "SwappingNoEMS"
  10646.                     [18] "LockedBPS"
  10647.                     [19] "SerialPort"
  10648.                     [20] "CustomFileName"
  10649.                     [21] "CustomFileLine"
  10650.                     [22] "InactivityTimeout"
  10651.                     [23] "PageDuration"
  10652.                     [24] "ChatUserColor"
  10653.                     [25] "ChatSysopColor"
  10654.                     [26] "FileListTitleColor"
  10655.                     [27] "FileListNameColor"
  10656.                     [28] "FileListSizeColor"
  10657.                     [29] "FileListDescriptionColor"
  10658.                     [30] "FileListOfflineColor"
  10659.                     [31] "Personality"
  10660.                     [32] "NoFossil"
  10661.                     [33] "PortAddress"
  10662.                     [34] "PortIRQ"
  10663.                     [35] "ReceiveBuffer"
  10664.                     [36] "TransmitBuffer"
  10665.                     [37] "PagePromptColor"
  10666.                     [38] "LocalMode"
  10667.                     [39] "PopupMenuTitleColor"
  10668. ===============================================================================
  10669. OpenDoors 6.00 Manual                                          End of Page 194
  10670.  
  10671.                     [40] "PopupMenuBorderColor"
  10672.                     [41] "PopupMenuTextColor"
  10673.                     [42] "PopupMenuKeyColor"
  10674.                     [43] "PopupMenuHighlightColor"
  10675.                     [44] "PopupMenuHighKeyColor"
  10676.                     [45] "NoFIFO"
  10677.                     [46] "FIFOTriggerSize"
  10678.                     [47] "DiableDTR"
  10679.                     [48] "NoDTRDisable"
  10680.  
  10681.  
  10682.  
  10683. -------------------------------------------------------------------------------
  10684. od_chat        char od_control.od_chat_active;
  10685. _active
  10686.                This variable is set to TRUE when sysop chat mode is active, and
  10687.                is set to FALSE when sysop chat mode is not active. This
  10688.                variable can be used to determine whether or not chat mode is
  10689.                active, and to force chat mode to end. When the sysop presses
  10690.                the chat mode key ([ALT]-[C] if the default personality is being
  10691.                used) while chat mode is active, this variable is set to FALSE.
  10692.  
  10693.  
  10694.  
  10695. -------------------------------------------------------------------------------
  10696. od_clear       char od_control.od_clear_on_exit;
  10697. _on_exit
  10698.                This variable contains a Boolean value, which indicates whether
  10699.                or not you wish OpenDoors to clear the screen prior to exiting.
  10700.                This variable defaults to a value of TRUE, which causes the
  10701.                screen to be cleared when a door program exits. However, you may
  10702.                wish to set this variable to a value of FALSE, which will cause
  10703.                the contents of the screen to remain unchanged when the door
  10704.                exits. While setting this variable to FALSE will probably result
  10705.                in a messy display if the door is to return control to a batch
  10706.                file, if the door returns directly to the BBS, it will result in
  10707.                a smoother transition from the door back to the BBS (as the
  10708.                sysop is not left with a blank screen). If your door has a
  10709.                configuration file or configuration program, you may wish to
  10710.                have an option which will allow the individual sysop to
  10711.                determine whether or not the screen should be cleared when the
  10712.                door exits.
  10713.  
  10714.  
  10715.  
  10716. -------------------------------------------------------------------------------
  10717. od_color       char od_control.od_color_delimiter;
  10718. _delimiter
  10719.                This variable sets the character that is used to delimit color
  10720.                codes in the od_printf() function, and defaults to the back-
  10721.                quote (`) character. If you wish to be able to display the back-
  10722.                quote (`) character using the od_printf() function, and thus
  10723. ===============================================================================
  10724. OpenDoors 6.00 Manual                                          End of Page 195
  10725.  
  10726.                wish to use a different character to delimit color codes in the
  10727.                od_printf() function, simply set this variable to the
  10728.                alternative character you wish to use. If you wish to disable
  10729.                the imbedded color codes feature of the od_printf() function,
  10730.                simply set this variable to a value of zero. For more
  10731.                information on od_printf() imbedded color codes, see the
  10732.                description of the od_printf() function, which begins on page
  10733.                110.
  10734.  
  10735.  
  10736.  
  10737. -------------------------------------------------------------------------------
  10738. od_color       char od_control.od_color_names[12][33];
  10739. _names
  10740.                This array sets the strings that OpenDoors will recognize as
  10741.                color description keywords. These are the keywords that can be
  10742.                imbedded in od_printf() format strings, and are also the
  10743.                keywords that can be used to change color settings in the
  10744.                OpenDoors configuration file. If you wish to change these
  10745.                keywords, you will normally do so before calling any OpenDoors
  10746.                functions. These keywords should always be supplied in upper-
  10747.                case characters. The defaults values for this array are as
  10748.                follows:
  10749.  
  10750.                     [0]  "BLACK"
  10751.                     [1]  "BLUE"
  10752.                     [2]  "GREEN"
  10753.                     [3]  "CYAN"
  10754.                     [4]  "RED"
  10755.                     [5]  "MAGENTA"
  10756.                     [6]  "YELLOW"
  10757.                     [7]  "WHITE"
  10758.                     [8]  "BROWN"
  10759.                     [9]  "GREY"
  10760.                     [10] "BRIGHT"
  10761.                     [11] "FLASHING"
  10762.  
  10763.  
  10764.  
  10765. -------------------------------------------------------------------------------
  10766. od_config      void (*od_control.od_config_file)(void);
  10767. _file
  10768.                Set this variable to INCLUDE_CONFIG_FILE to enable the OpenDoors
  10769.                configuration file system, or set it to NO_CONFIG_FILE to
  10770.                disable the configuration file system. This variable should only
  10771.                be set prior to your first call to an OpenDoors function. For
  10772.                more information on the OpenDoors configuration file system, see
  10773.                page 224.
  10774.  
  10775.  
  10776.  
  10777.  
  10778. ===============================================================================
  10779. OpenDoors 6.00 Manual                                          End of Page 196
  10780.  
  10781. -------------------------------------------------------------------------------
  10782. od_config      char *od_control.od_config_filename;
  10783. _filename
  10784.                If set, this variable should point to a string containing the
  10785.                filename that you wish the OpenDoors configuration file system
  10786.                to read. If this variable has its default value of NULL, the
  10787.                filename DOOR.CFG will be used by default.
  10788.  
  10789.  
  10790.  
  10791. -------------------------------------------------------------------------------
  10792. od_config      void (*od_control.od_config_function)(char *keyword, char
  10793. _function      *options);
  10794.  
  10795.                If set, this variable should point to the function that
  10796.                OpenDoors should call when lines with unrecognized keywords are
  10797.                encountered in the configuration file. This allows you to add
  10798.                your own configuration file keywords. The first parameter to
  10799.                this function will be a pointer to a string containing the
  10800.                unrecognized keywords, and the second parameter will be a
  10801.                pointer to a string containing any options that were specified
  10802.                after the keyword. If no options were specified after the
  10803.                keyword, this string will have a length of 0.
  10804.  
  10805.  
  10806.  
  10807. -------------------------------------------------------------------------------
  10808. od_default     void (*od_control.od_default_personality)(unsigned char
  10809. _personality   operation);
  10810.  
  10811.                This variable sets the default personality that OpenDoors will
  10812.                use if the multiple personality system is active. If the
  10813.                multiple personality system is not active, the personality set
  10814.                by this variable will be the only personality available. This
  10815.                variable should only be set prior to calling an OpenDoors
  10816.                function. This variable can be set to point to your own
  10817.                personality function, or it can be set to one of the manifest
  10818.                constants that represent one of the built-in personalities:
  10819.  
  10820.                     PER_OPENDOORS
  10821.                     PER_PCBOARD
  10822.                     PER_RA
  10823.                     PER_WILDCAT
  10824.  
  10825.                For more information on the OpenDoors Multiple Personality
  10826.                System, see page 230.
  10827.  
  10828.  
  10829.  
  10830.  
  10831.  
  10832.  
  10833. ===============================================================================
  10834. OpenDoors 6.00 Manual                                          End of Page 197
  10835.  
  10836. -------------------------------------------------------------------------------
  10837. od_default     char od_control.od_default_rip_win;
  10838. _rip_win
  10839.                This variable defaults to FALSE. When set to FALSE, OpenDoors
  10840.                resets the RIP text window to a 23-line window that is most
  10841.                appropriate for doors that support both RIP-graphics and non-RIP
  10842.                mode. When this variable is set to TRUE, OpenDoors will use the
  10843.                default sized text output window, 43 lines in size.
  10844.  
  10845.  
  10846.  
  10847. -------------------------------------------------------------------------------
  10848. od_disable          unsigned int od_control.od_disable;
  10849.  
  10850.                This variable is a bit-mapped flag which can be used to disable
  10851.                certain OpenDoors features which are normally active, in order
  10852.                to allow for maximum customization of OpenDoors. Each bit of
  10853.                this variable represents a different feature that can be
  10854.                disabled. To DISABLE a feature, you set the bit that corresponds
  10855.                to the particular feature. To ENABLE the feature, the bit is
  10856.                reset. Each bit is represented by a keyword, as follows:
  10857.  
  10858.                DIS_INFOFILE - Setting the DIS_INFOFILE bit of the
  10859.                     od_control.od_disable variable allows you to prevent
  10860.                     OpenDoors from reading or re-writing a door information
  10861.                     file. If you wish to disable OpenDoors' reading of the door
  10862.                     information file, you must  do so prior to calling
  10863.                     od_init() or any other OpenDoors door-driver functions. At
  10864.                     the same time, you must also manually set any required
  10865.                     variables that are normally set by the information obtained
  10866.                     from the door information file, such as the comm port
  10867.                     number, baud rate, user name, and so on. You may wish to
  10868.                     disable reading of the door information file in a number of
  10869.                     cases. For example, you may wish to manually read another
  10870.                     format of door information file not supported by OpenDoors,
  10871.                     or to obtain the necessary door information from your
  10872.                     program's command line. Also, if you are using OpenDoors to
  10873.                     write a non-door communications program, such as a terminal
  10874.                     program, you want to prevent OpenDoors from attempting to
  10875.                     read a door information file on startup.
  10876.  
  10877.                DIS_CARRIERDETECT - Setting this bit allows you to prevent
  10878.                     OpenDoors from exiting when it the carrier detect signal
  10879.                     from the modem disappears. This bit may be set or rest at
  10880.                     any time. If you use this bit to disable OpenDoors' carrier
  10881.                     detection, you will probably want to monitor the state of
  10882.                     the carrier detect signal yourself, using the od_carrier()
  10883.                     function, which is described on page 51.
  10884.  
  10885.                DIS_TIMEOUT - This flag allows you to prevent OpenDoors from
  10886.                     exiting when the user runs out of time. As with the
  10887.                     DIS_CARRIERDETECT flag, you may set or reset this bit at
  10888. ===============================================================================
  10889. OpenDoors 6.00 Manual                                          End of Page 198
  10890.  
  10891.                     any time. You will most often want to use this setting when
  10892.                     writing a non-door program, which you would not want to
  10893.                     have exit after a particular amount of time has elapsed. Be
  10894.                     sure that you do not confuse this flag with the user's
  10895.                     inactivity timeout. To disable the inactivity timeout, set
  10896.                     the do_control.od_inactivity variable to 0.
  10897.  
  10898.                DIS_LOCAL_OVERRIDE - This setting affects OpenDoors' behavior
  10899.                     when a locked BPS rate is specified in the configuration
  10900.                     file, and another BPS rate is specified in the door
  10901.                     information file. By default, OpenDoors will initialize the
  10902.                     modem at the BPS rate specified in the configuration file,
  10903.                     unless the BPS rate specified in the door information file
  10904.                     is 0. In this case, the 0 BPS rate is used to indicate that
  10905.                     the door is operating in local mode, and will override the
  10906.                     BPS rate specified in the configuration file. Setting this
  10907.                     flag disables the local mode override, causing the modem to
  10908.                     always be initialized at the locked BPS rate, even when the
  10909.                     door information file specifies that local mode should be
  10910.                     used.
  10911.  
  10912.                DIS_BPS_SETTING - When used with a FOSSIL driver, OpenDoors
  10913.                     normally changes the BPS rate to that passed from the BBS
  10914.                     (if the BBS passes a valid FOSSIL BPS rate). Setting the
  10915.                     DIS_BPS_SETTING flag disables this BPS rate setting.
  10916.  
  10917.                DIS_LOCAL_INPUT -  The local keyboard may be disabled by setting
  10918.                     this bit. This only affects the sysop's input in
  10919.                     circumstances that input is also accepted from the remote
  10920.                     user; this setting has no effect on the sysop function
  10921.                     keys.
  10922.  
  10923.                DIS_SYSOP_KEYS - This setting also disables the local keyboard.
  10924.                     However, unlike the DIS_LOCAL_INPUT, this function disables
  10925.                     both sysop function keys and door input from the local
  10926.                     keyboard.
  10927.  
  10928.                DIS_DTR_DISABLE - This setting prevents OpenDoors from
  10929.                     disabiling DTR response from the modem. Even if not
  10930.                     specified, OpenDoors only disables DTR response in the when
  10931.                     exiting under the Win32 version if an open serial port
  10932.                     handle was not provided to OpenDoors at startup.
  10933.  
  10934.                DIS_NAME_PROMPT - Prevents OpenDoors from prompting for a user
  10935.                     name when operating in automatic local mode (by setting
  10936.                     od_force_local to TRUE or specifying -local on the command
  10937.                     line).
  10938.  
  10939.                Note that in order to disable the OpenDoors status line, the
  10940.                od_control.od_status_on variable is used, instead of the
  10941.                od_disable variable. You may also disable the user's inactivity
  10942.                timeout by setting the od_control.od_inactivity variable to 0.
  10943. ===============================================================================
  10944. OpenDoors 6.00 Manual                                          End of Page 199
  10945.  
  10946.                The od_control.od_status_on variable is described later in this
  10947.                section.
  10948.  
  10949.  
  10950.  
  10951. -------------------------------------------------------------------------------
  10952. od_disable_    char od_control.od_disable_dtr[40];
  10953. dtr
  10954.                Unles the DIS_DTR_DISABLE od_disable flag is set, the Win32
  10955.                version of OpenDoors will attempt to disable DTR response by the
  10956.                modem when closing the serial port, if the serial port was
  10957.                opened by OpenDoors. This is done by sending a series of
  10958.                commands to the modem, and possibly waiting for responses to the
  10959.                command. The string format specifies each command, followed by
  10960.                the required response. The command and response is separated by
  10961.                a single space character. If no response is required between two
  10962.                commands, then those commands may be separated by two space
  10963.                characters. A '|' character is translated into a carriage
  10964.                return, and a '~' character is translated into a one second
  10965.                pause. The default value of this string is "~+++~  AT&D0  ATO".
  10966.  
  10967.  
  10968.  
  10969. -------------------------------------------------------------------------------
  10970. od_emu_        BOOL od_control.od_emu_simulate_modem;
  10971. simulate_modem
  10972.                When this flag is set to its default value of FALSE, the
  10973.                OpenDoors terminal emulator displays text at full speed. When
  10974.                this flag is set to TRUE, the emulation functions will display
  10975.                text at approximately the same speed as it would be displayed
  10976.                when sent over the modem, based on the current connect speed. In
  10977.                local mode, an average modem speed of 9600bps is assumed. This
  10978.                allows animations to be displayed locally at the same speed as
  10979.                they would appear on the remote system. This switch affects the
  10980.                following functions:
  10981.                     od_disp_emu()
  10982.                     od_send_file()
  10983.                     od_hotkey_menu()
  10984.  
  10985.  
  10986.  
  10987. -------------------------------------------------------------------------------
  10988. od             unsigned char od_control.od_errorlevel[8];
  10989. _errorlevel
  10990.                Allows you to configure the errorlevel (program exit code) which
  10991.                OpenDoors exits with under various circumstances. The elements
  10992.                of this array are as follows:
  10993.  
  10994.  
  10995.  
  10996.  
  10997.  
  10998. ===============================================================================
  10999. OpenDoors 6.00 Manual                                          End of Page 200
  11000.  
  11001.                [ERRORLEVEL_ENABLE]     Enables or disables custom errorlevels
  11002.                [ERRORLEVEL_CRITICAL]   Critical error errorlevel
  11003.                [ERRORLEVEL_NOCARRIER]  Carrier lost errorlevel
  11004.                [ERRORLEVEL_HANGUP]     Sysop manually terminated call
  11005.                [ERRORLEVEL_TIMEOUT]    User time expired errorlevel
  11006.                [ERRORLEVEL_INACTIVITY] Keyboard inactivity timeout errorlevel
  11007.                [ERRORLEVEL_DROPTOBBS]  Sysop returned user to BBS errorlevel
  11008.                [ERRORLEVEL_NORMAL]     Door has exited normally
  11009.  
  11010.                If you wish to override the default errorlevels used by
  11011.                OpenDoors, you should set element [ERRORLEVEL_ENABLE] of this
  11012.                array to TRUE, and set the remaining array elements to the
  11013.                appropriate errorlevels. Note that the settings in this array
  11014.                only affect the errorlevels which OpenDoors uses when it causes
  11015.                the door to exit for one of the reasons listed above. This
  11016.                setting has no effect on the errorlevel returned when your
  11017.                program explicitly exits by calling the od_exit() function, or
  11018.                your program returns by calling exit() or returning from the
  11019.                main() function.
  11020.  
  11021.  
  11022.  
  11023. -------------------------------------------------------------------------------
  11024. od             char od_control.od_force_local;
  11025. _force_local
  11026.                This variable defaults to FALSE, which causes OpenDoors to
  11027.                behave normally. When this variable is set to TRUE prior to
  11028.                calling od_init() or any other OpenDoors functions, OpenDoors
  11029.                will operate in local mode. In this case, no door information
  11030.                file will be read. Also, the user name will be used if
  11031.                od_control.user_name has not been set prior to calling od_init()
  11032.                or the first OpenDoors function.
  11033.  
  11034.                The default OpenDoors settings when od_control.od_force_local is
  11035.                set are as follows:
  11036.  
  11037.                - ANSI mode is on
  11038.                - Time limit is 60 minutes
  11039.                - User's location is the name of the BBS, or "Unknown Location"
  11040.                otherwise if BBS name is not known.
  11041.                - User name is set to sysop's name ("Sysop" if no sysop name is
  11042.                specified in the configuration file).
  11043.  
  11044.                You may wish to add a "-local" type parameter to your program's
  11045.                command line, which will permit the sysop to easily operate the
  11046.                door in local mode, as an interface to the
  11047.                od_control.od_force_local setting.
  11048.  
  11049.  
  11050.  
  11051. -------------------------------------------------------------------------------
  11052. od_help        void (*od_control.od_help_callback)(void);
  11053. ===============================================================================
  11054. OpenDoors 6.00 Manual                                          End of Page 201
  11055.  
  11056. _callback
  11057.                If this variable is set to a non-NULL value, the Win32 version
  11058.                of OpenDoors will provide a Contents item on the help menu, and
  11059.                call the function pointed to by this variable when the user
  11060.                chooses the Contents menu item.
  11061.  
  11062.  
  11063.  
  11064. -------------------------------------------------------------------------------
  11065. od_in_buf      unsigned int od_control.od_in_buf_size;
  11066. _size
  11067.                Specifies the size, in characters, of the OpenDoor's internal
  11068.                local/remote inbound buffer size. Two bytes of storage are
  11069.                required for each character in this buffer. This variable should
  11070.                only be changed prior to calling od_init() or the first
  11071.                OpenDoors function. If not set, this variable defaults to a
  11072.                value of 256.
  11073.  
  11074.                The buffer corresponding to this variable should not be confused
  11075.                with the FOSSIL or internal communications receive buffer (which
  11076.                is set by od_control.od_com_rx_buf). Unlike the serial I/O
  11077.                receive buffer, which is used only for characters received from
  11078.                the remote system, this buffer serves as a queue for input from
  11079.                both the remote system and the local keyboard. If you find that
  11080.                characters are lost when information is being set to your door
  11081.                from the user, you may wish to increase the size of this buffer.
  11082.  
  11083.  
  11084.  
  11085. -------------------------------------------------------------------------------
  11086. od             unsigned int od_control.od_inactivity;
  11087. _inactivity
  11088.                OpenDoors has a built in user-inactivity timeout facility, which
  11089.                will automatically disconnect a user who appears .to be sleeping
  11090.                at the keyboard. If the user has not pressed any keys on their
  11091.                keyboard for to great a length of time, they will be warned that
  11092.                they are about to be disconnected due to inactivity. If they
  11093.                still do not respond after another few seconds, OpenDoors will
  11094.                automatically disconnect the user and return control to the BBS
  11095.                software. The od_control.od_inactivity variable allows you to
  11096.                set the maximum length of time, in seconds, after which the user
  11097.                will be disconnected for inactivity. This variable defaults to a
  11098.                value of 200 seconds. You may disable OpenDoors' inactivity
  11099.                timeout altogether, by setting the od_control.od_inactivity
  11100.                variable to a value of 0.
  11101.  
  11102.  
  11103.  
  11104.  
  11105.  
  11106.  
  11107.  
  11108. ===============================================================================
  11109. OpenDoors 6.00 Manual                                          End of Page 202
  11110.  
  11111. -------------------------------------------------------------------------------
  11112. od_inactive    int od_control.od_inactive_warning.
  11113. _warning
  11114.                This variable sets the number of seconds prior to hanging up
  11115.                that OpenDoors displays the inactivity timeout warning. This
  11116.                variable should only be changed after your first call to an
  11117.                OpenDoors API function. If not explicitly set by your program,
  11118.                this setting defaults to 10 seconds.
  11119.  
  11120.  
  11121.  
  11122. -------------------------------------------------------------------------------
  11123. od_ker_exec    void (*od_control.od_ker_exec)(void);
  11124.  
  11125.                When od_control.od_ker_exec is set to point to a function,
  11126.                OpenDoors will call this function whenever od_kernel() executes.
  11127.                This provides any easy way for you to perform your own
  11128.                processing on a regular basis during door execution. The
  11129.                od_control.od_ker_exec variable defaults to NULL.
  11130.  
  11131.  
  11132.  
  11133. -------------------------------------------------------------------------------
  11134. od_last        char od_control.od_last_input;
  11135. _input
  11136.                Indicates whether the last key retrieved using the od_get_key()
  11137.                function originated from the remote user, or the local sysop. If
  11138.                the input originated from the remote, this variable is set to 0.
  11139.                If the input originated from the local keyboard, this variables
  11140.                is set to 1.
  11141.  
  11142.  
  11143.  
  11144. -------------------------------------------------------------------------------
  11145. od_list        char od_control.od_list_pause;
  11146. _pause
  11147.                This variable contains a Boolean value, which allows you to
  11148.                control whether or not the user may pause displaying within the
  11149.                od_list_files() and od_send_file() function. When this variable
  11150.                is set to its default value of TRUE, the user will be able to
  11151.                pause the display by pressing the [P] key, and resume display by
  11152.                pressing any other key. However, the pause feature may be
  11153.                disabled by setting this variable to FALSE.
  11154.  
  11155.  
  11156.  
  11157. -------------------------------------------------------------------------------
  11158. od_list        char od_control.od_list_stop;
  11159. _stop
  11160.                This variable contains a Boolean value, which allows you to
  11161.                control whether or not the user may abort displaying within the
  11162.                od_list_files() and od_send_file() function. When this variable
  11163. ===============================================================================
  11164. OpenDoors 6.00 Manual                                          End of Page 203
  11165.  
  11166.                is set to its default value of TRUE, the user will be able to
  11167.                pause the display by pressing the [S], [CTRL]-[K] or [CTRL]-[C]
  11168.                keys. However, the stop feature may be disabled by setting this
  11169.                variable to FALSE.
  11170.  
  11171.  
  11172.  
  11173. -------------------------------------------------------------------------------
  11174. od_local       void (*od_control.od_local_input)(int);
  11175. _input
  11176.                If set, this function is called whenever the sysop presses a
  11177.                non-sysop-function key on the local keyboard. The key pressed is
  11178.                passed to the function in the single int parameter that it
  11179.                accepts.
  11180.  
  11181.  
  11182.  
  11183. -------------------------------------------------------------------------------
  11184. od_logfile     void *(od_control.od_logfile)(void);
  11185.  
  11186.                To make the OpenDoors log file system available in your program,
  11187.                set this variable to INCLUDE_LOGFILE, prior to calling any
  11188.                OpenDoors functions. If not set, or if set to NO_LOGFILE, the
  11189.                OpenDoors log file system will not automatically be enabled.
  11190.  
  11191.  
  11192.  
  11193. -------------------------------------------------------------------------------
  11194. od_logfile     char od_control.od_logfile_disable;
  11195. _disable
  11196.                This variable defaults to the value of FALSE, unless the
  11197.                "LogfileDisable" option is specified in the configuration file,
  11198.                in which case the variable will be set to TRUE. If this variable
  11199.                is set to TRUE, OpenDoors will not write to a logfile, even if
  11200.                the logfile system is enabled using od_control.od_logfile.
  11201.  
  11202.  
  11203.  
  11204. -------------------------------------------------------------------------------
  11205. od_logfile     char *od_control.od_logfile_messages[14];
  11206. _messages
  11207.                This array of pointers to strings contains the messages that
  11208.                OpenDoors will automatically write to the log file, if the log
  11209.                file system is enabled. If you wish to change the settings of
  11210.                this array, you should do so before calling any OpenDoors
  11211.                functions. The default strings for this array are as follows:
  11212.  
  11213.                [0] "Carrier lost, exiting door"
  11214.                [1] "System operator terminating call, exiting door"
  11215.                [2] "User's time limit expired, exiting door"
  11216.                [3] "User keyboard inactivity time limit exceeded, exiting door"
  11217.                [4] "System operator returning user to BBS, exiting door"
  11218. ===============================================================================
  11219. OpenDoors 6.00 Manual                                          End of Page 204
  11220.  
  11221.                [5] "Exiting door with errorlevel %d,
  11222.                [6] "Invoking operating system shell"
  11223.                [7] "Returning from operating system shell"
  11224.                [8] "User paging system operator"
  11225.                [9] "Entering sysop chat mode"
  11226.                [10] "Terminating sysop chat mode"
  11227.                [11] "%s entering door"
  11228.                [12] "Reason for chat: %s"
  11229.                [13] "Exiting door"
  11230.  
  11231.  
  11232.  
  11233. -------------------------------------------------------------------------------
  11234. od_logfile     char od_control.od_logfile_name[80];
  11235. _name
  11236.                This variable specifies the filename, and optionally the full
  11237.                path of the logfile where OpenDoors should perform logging. This
  11238.                variable only has an effect when set prior to calling any
  11239.                OpenDoors functions. If the log file name is specified in the
  11240.                configuration file, that name will be stored in this variable.
  11241.                If you do not set this variable, and the log file name is not
  11242.                specified in the configuration file, the default name "DOOR.LOG"
  11243.                will be used. If you wish to set this variable, you should do so
  11244.                prior to calling od_init() or any OpenDoors function.
  11245.  
  11246.  
  11247.  
  11248. -------------------------------------------------------------------------------
  11249. od_            unsigned int od_control.od_maxtime;
  11250. maxtime
  11251.                This variable specifies the maximum length of time that any user
  11252.                is permitted to use the door, and is normally set from a
  11253.                configuration file option. If upon entering the door, the user's
  11254.                time remaining online is greater than the od_maxtime setting,
  11255.                their time remaining is temporarily decreased to the maximum
  11256.                value. Then upon exit of the door, the number of subtracted
  11257.                minutes is added back onto the user's remaining time. If the
  11258.                user's remaining time is less than this value, then the setting
  11259.                has no effect. A value of 0 disables the maximum time setting
  11260.                altogether.
  11261.  
  11262.  
  11263.  
  11264. -------------------------------------------------------------------------------
  11265. od_maxtime     int od_control.od_maxtime_deduction;
  11266. _deduction
  11267.                This variable store the amount of time that should be added to
  11268.                the user's time upon exit of the door, as a result of the
  11269.                maximum time deduction, described above. If the maximum time
  11270.                feature is not used, this variable will be given a value of 0.
  11271.  
  11272.  
  11273. ===============================================================================
  11274. OpenDoors 6.00 Manual                                          End of Page 205
  11275.  
  11276.  
  11277. -------------------------------------------------------------------------------
  11278. od_mps         void (*od_control.od_mps)(void);
  11279.  
  11280.                To make the OpenDoors Multiple Personality system available in
  11281.                your program, set this variable to INCLUDE_MPS before calling
  11282.                any OpenDoors functions. If this variable is not set, or is set
  11283.                to NO_MPS, the Multiple Personality System will be disabled. For
  11284.                more information on the OpenDoors Multiple Personality System,
  11285.                see page 233.
  11286.  
  11287.  
  11288.  
  11289. -------------------------------------------------------------------------------
  11290. od_no_         void (*od_control.od_no_file_func)();
  11291. file_func
  11292.                If od_no_file_func is set to point to a function, that function
  11293.                will be called whenever a door information (drop) file cannot be
  11294.                located or read. This provides an easy mechanism to add your own
  11295.                door information file reader, or to provide a local login prompt
  11296.                when no drop file is present. If you wish the door to operate in
  11297.                local mode, you should set od_control.od_force_local to TRUE
  11298.                prior to returning from your function. If you have successfully
  11299.                read your own door information file format, you should set
  11300.                od_control.od_info_type to CUSTOM. If neither of these variables
  11301.                are set by the od_no_file_function, OpenDoors will report that
  11302.                it is unable to find or read a door information file and will
  11303.                exit immediately.
  11304.  
  11305.  
  11306.  
  11307. -------------------------------------------------------------------------------
  11308. od_no_ra       char od_control.od_no_ra_codes;
  11309. _codes
  11310.                This variable defaults to FALSE. When set to TRUE, the
  11311.                translation of the RemoteAccess/QuickBBS control codes by the
  11312.                functions od_send_file(), od_hotkey_menu() and od_disp_emu() is
  11313.                disabled.
  11314.  
  11315.  
  11316.  
  11317. -------------------------------------------------------------------------------
  11318. od_            char od_control.od_nocopyright;
  11319. nocopyright
  11320.                This variable is a Boolean value that allows you to prevent
  11321.                OpenDoors from displaying its name, version number, copyright
  11322.                notice and registration information when the program begins
  11323.                execution. Set this variable to TRUE to disable the display of
  11324.                copyright and associated information. When this variable is set
  11325.                to TRUE, OpenDoors also does not change the initial display
  11326.                color on startup. For obvious reasons, this variable does not
  11327.                take effect when OpenDoors is operating in unregistered mode.
  11328. ===============================================================================
  11329. OpenDoors 6.00 Manual                                          End of Page 206
  11330.  
  11331.  
  11332.  
  11333.  
  11334. -------------------------------------------------------------------------------
  11335. od_noexit      char od_control.od_noexit;
  11336.  
  11337.                This variable contains a Boolean value, which allows you to
  11338.                prevent OpenDoors from exiting when shutting down. This may be
  11339.                useful when you want to have your program to do more processing
  11340.                after you have called the od_exit() function, or if you do not
  11341.                wish to have your program exit automatically when the user drops
  11342.                carrier. Normally, this variable will default to a value of
  11343.                FALSE, indicating that OpenDoors will exit normally when the
  11344.                od_exit() function is called. However, you may optionally set
  11345.                this variable to TRUE after od_init() or some OpenDoors function
  11346.                has been called. In this case, when the od_exit() function is
  11347.                called, either by your program manually, or automatically by
  11348.                OpenDoors in response to the user dropping carrier, etc.,
  11349.                OpenDoors will not exit. However, the normal operations of
  11350.                closing the serial port and re-writing the door information file
  11351.                will be carried out. If you set the od_noexit variable to TRUE,
  11352.                you will probably have to provide some mechanism to allow your
  11353.                program to detect when OpenDoors shutdowns due to the loss of
  11354.                carrier, etc. The best way of doing this is to provide a
  11355.                function which is to be called at the beginning of the od_exit()
  11356.                function, by setting the od_control.od_before_exit pointer,
  11357.                described above.
  11358.  
  11359.  
  11360.  
  11361. -------------------------------------------------------------------------------
  11362. od_page        char od_control.od_page_len;
  11363. _len
  11364.                This variable allows you to control the length, in seconds, of
  11365.                the sysop page beep produced when the user pages the sysop via
  11366.                the od_page() function.
  11367.  
  11368.  
  11369.  
  11370. -------------------------------------------------------------------------------
  11371. od_page        char od_control.od_page_pausing;
  11372. _pausing
  11373.                This variable contains a Boolean value that indicates whether or
  11374.                not page pausing is enabled in the od_send_file(),
  11375.                od_hotkey_menu() and od_list_files() functions. The default
  11376.                value of TRUE indicates that page pausing is enabled. A value of
  11377.                FALSE indicates that page pausing is disabled.
  11378.  
  11379.  
  11380.  
  11381.  
  11382.  
  11383. ===============================================================================
  11384. OpenDoors 6.00 Manual                                          End of Page 207
  11385.  
  11386. -------------------------------------------------------------------------------
  11387. od_page        int od_control.od_pagestartmin;
  11388. startmin       int od_control.od_pageendmin;
  11389.  
  11390. od_page        These variables indicate the start and end times for sysop
  11391. endmin         paging, expressed as the number of minutes past midnight.
  11392.                Sysop paging will be available through the od_page() function
  11393.                from the start time, up to but not including the end time.
  11394.  
  11395.  
  11396.  
  11397. -------------------------------------------------------------------------------
  11398. od_page        char od_control.od_page_statusline;
  11399. _statusline
  11400.                This variable controls which status line, if any, is activated
  11401.                when the user pages the system operator (via the od_page()
  11402.                function). A value between 0 and 9 causes the corresponding
  11403.                status line to be activated. A value of -1 prevents any change
  11404.                from being made to the current status line setting. This
  11405.                variable will normally be set by personality functions (see page
  11406.                233).
  11407.  
  11408.  
  11409.  
  11410. -------------------------------------------------------------------------------
  11411. od_prog_       char od_control.od_prog_copyright[40];
  11412. copyright
  11413.                This variable should contain your program's copyright notice,
  11414.                such as "(C) Copyright 1996 by Your Name". This information is
  11415.                used in the Help|about dialog box under the Win32 version of
  11416.                OpenDoors, and may be used in other places in future versions of
  11417.                OpenDoors.
  11418.  
  11419.  
  11420.  
  11421. -------------------------------------------------------------------------------
  11422. od_prog_name   char od_control.od_prog_name[40];
  11423.  
  11424.                This variable should contain the full name of your program, up
  11425.                to 39 characters. If not set, OpenDoors will use the string
  11426.                "OpenDoors" in place of this variable. If used, this variable
  11427.                should be set prior to calling any OpenDoors functions, and
  11428.                should not include your program's version number. This
  11429.                information is used to write your program's name in the log file
  11430.                and to indicate your program's name on various windows, among
  11431.                other places.
  11432.  
  11433.  
  11434.  
  11435.  
  11436.  
  11437.  
  11438. ===============================================================================
  11439. OpenDoors 6.00 Manual                                          End of Page 208
  11440.  
  11441.  
  11442.  
  11443.  
  11444. -------------------------------------------------------------------------------
  11445. od_prog_version     char od_control.od_prog_version[40];
  11446.  
  11447.                This variable should contain the version information of your
  11448.                program. If used, this variable should be set prior to calling
  11449.                any OpenDoors functions. This information is used in the
  11450.                Help|About dialog box under the Win32 version of OpenDoors,
  11451.                among other places.
  11452.  
  11453.  
  11454.  
  11455. -------------------------------------------------------------------------------
  11456. od_reg_key     unsigned log od_control.od_reg_key;
  11457.  
  11458.                When you purchase an OpenDoors licence (registration), this
  11459.                variable should be set to your registration key, prior to
  11460.                calling any OpenDoors functions.
  11461.  
  11462.  
  11463.  
  11464. -------------------------------------------------------------------------------
  11465. od_reg_name    char od_control.od_reg_name[36];
  11466.  
  11467.                When you purchase an OpenDoors licence (registration), this
  11468.                variable should be set to your name, or your company's name, as
  11469.                is listed in your OpenDoors registration record.
  11470.  
  11471.  
  11472.  
  11473. -------------------------------------------------------------------------------
  11474. od_spawn       char od_control.od_spawn_freeze_time;
  11475. _freeze_time
  11476.                This variable is a Boolean value which indicates whether or not
  11477.                the user's time remaining is frozen during the execution of one
  11478.                of the od_spawn...() functions. If this variable is set to TRUE,
  11479.                the user's time remaining will not decrease during the time that
  11480.                the od_spawn...() function is executing. However, if this
  11481.                variable is set to FALSE, the user's time remaining will
  11482.                continue to be subtracted during the execution of the
  11483.                od_spawn...() function. The default value of this variable is
  11484.                FALSE.
  11485.  
  11486.  
  11487.  
  11488. -------------------------------------------------------------------------------
  11489. od_swapping    char od_control.od_swapping_disable;
  11490. _disable
  11491.                This variable is a Boolean value which specifies whether or not
  11492.                OpenDoors will attempt to swap itself and your entire door upon
  11493. ===============================================================================
  11494. OpenDoors 6.00 Manual                                          End of Page 209
  11495.  
  11496.                DOS shell or a call to one of the od_spawn...() functions. This
  11497.                variable defaults to FALSE. If set to TRUE, OpenDoors will not
  11498.                attempt to perform swapping activities.
  11499.  
  11500.  
  11501.  
  11502. -------------------------------------------------------------------------------
  11503. od_swapping    char od_control.od_swapping_noems;
  11504. _noems
  11505.                This variable is a Boolean value which can be used to prevent
  11506.                OpenDoors from swapping to EMS memory. This variable defaults to
  11507.                the value FALSE. If set to TRUE, OpenDoors will not attempt to
  11508.                use EMS memory for swapping, and will only swap to disk.
  11509.  
  11510.  
  11511.  
  11512. -------------------------------------------------------------------------------
  11513. od_swapping    char od_control.od_swapping_path;
  11514. _path
  11515.                This variable specifies the drive and directory where OpenDoors
  11516.                should create its disk swapping file, if applicable. More than
  11517.                one path can be specified, by separating the paths with a semi-
  11518.                colon (;) character.
  11519.  
  11520.  
  11521.  
  11522. -------------------------------------------------------------------------------
  11523. od_status      char od_control.od_status_on;
  11524. _on
  11525.                This variable is a Boolean value which allows your program to
  11526.                completely disable the OpenDoors status line. The variable
  11527.                defaults to a value of TRUE, which causes the OpenDoors status
  11528.                line to be controllable by function keys, displayed and updated
  11529.                as it would normally be. However, if this variable is set to
  11530.                FALSE, then OpenDoors will not update the status line, nor will
  11531.                it allow the status line to be re-displayed as a result of one
  11532.                of the status line ([F1] through [F10]) keys being pressed. When
  11533.                you change the value of this variable from FALSE to TRUE,
  11534.                OpenDoors will automatically redisplay the status line. Note,
  11535.                however, that the status line isn't automatically removed when
  11536.                the value of this variable is changed from TRUE to FALSE. In
  11537.                order to erase the status line after resetting the value of this
  11538.                variable, you should reset the output window to the full screen,
  11539.                by calling the function window(1,1,25,80). Then manually erase
  11540.                the old status line either by clearing the bottom two lines of
  11541.                the screen, or by clearing the entire screen.
  11542.  
  11543.                It is important that you do not confuse the use of this variable
  11544.                with the od_set_statusline() function, which is described on
  11545.                page 137. When the status line is enabled, the sysop can change
  11546.                which status line, if any, is being displayed, using the
  11547.                function keys [F1] through [F10]. The od_set_statusline()
  11548. ===============================================================================
  11549. OpenDoors 6.00 Manual                                          End of Page 210
  11550.  
  11551.                function allows your program to make the same changes to the
  11552.                status line setting which the sysop can make by pressing one of
  11553.                the function keys. The status line can be removed from the
  11554.                screen, allowing a full 25 lines of text to be displayed, by
  11555.                pressing the [F10] key, or by making the appropriate call to the
  11556.                od_set_statusline() function. Note, however, than when this is
  11557.                done, the status line is still enabled, and can be turned on by
  11558.                pressing any of the other function keys. On the other hand, if
  11559.                the status line is turned off using this variable
  11560.                (od_control.od_status_on), the status line sub-system will be
  11561.                disabled, and pressing function keys will not "bring it back".
  11562.                So, if you were writing a program where a status line would be
  11563.                undesirable - such as a non-door communications program, you
  11564.                would use the od_control.od_status_on variable. On the other
  11565.                hand, if you only wanted to temporarily remove the status line -
  11566.                say in order that all 25 lines of a door program's output could
  11567.                be viewed - while still allowing the status line to be turned on
  11568.                with the sysop function keys, you would use the
  11569.                od_set_statusline() function. For more information on the
  11570.                od_set_statusline() function, see page 137.
  11571.  
  11572.  
  11573.  
  11574. -------------------------------------------------------------------------------
  11575. od_time        void (*od_control.od_time_msg_func)(char *string)
  11576. _msg_func
  11577.                This variable defaults to a value of NULL. If set to point to a
  11578.                function, OpenDoors will call this function INSTEAD OF
  11579.                displaying time limit warning messages to the user. The messages
  11580.                redirected to this function are:
  11581.  
  11582.                     - Inactivity timeout warning
  11583.                     - Inactivity timeout expired
  11584.                     - Less than 4 minutes left today
  11585.                     - Daily time limit expired
  11586.  
  11587.  
  11588.  
  11589.  
  11590.  
  11591.  
  11592.  
  11593.  
  11594.  
  11595.  
  11596.  
  11597.  
  11598.  
  11599.  
  11600.  
  11601.  
  11602.  
  11603. ===============================================================================
  11604. OpenDoors 6.00 Manual                                          End of Page 211
  11605.  
  11606. CONTROL STRUCTURE - FUNCTION KEYS
  11607. -------------------------------------------------------------------------------
  11608.  
  11609.                Within OpenDoors, as with most BBS software and doors, the sysop
  11610.                has access to a number of function keys, which permits the sysop
  11611.                to carry out various functions such as entering chat mode,
  11612.                hanging up on the user, shelling to DOS, and so on. The
  11613.                variables in this section allow you to customize which keys
  11614.                carry out the standard sysop functions, allowing you to
  11615.                customize your door's interface to mimic any BBS package. By
  11616.                default, OpenDoors emulates the function keys used by the Remote
  11617.                Access BBS package, but you may choose, for example, to have
  11618.                your door use the key combinations used by PC-Board. In
  11619.                addition, OpenDoors provides an interface which allows you to
  11620.                add your own function keys which will be accepted by the door.
  11621.                This could allow you to add additional features, such as giving
  11622.                the sysop access to a status screen which displays information
  11623.                about your door.
  11624.  
  11625.                Many of the variables in this section are unsigned ints, which
  11626.                represent a sysop key combination such as [ALT]-[H], [F8], or
  11627.                [CTRL]-[P]. These values are in the same format as is returned
  11628.                by the Turbo C(++) / Borland C++ bioskey() function. The high-
  11629.                order byte represents the scan code of the key, and the low-
  11630.                order byte represents the ASCII value, if any, of the key
  11631.                combination. Note that a complete tutorial on these key codes is
  11632.                beyond the scope of this manual. For more information on these
  11633.                key codes, you should see the documentation on the bioskey()
  11634.                function, which accompanies your compiler. If you wish to
  11635.                determine the key code which corresponds to a particular
  11636.                keystroke, there is a simple program, listed below, which you
  11637.                can compile and use. This program will simply display the key
  11638.                code for any key pressed, until you press the [ESCape] key. So,
  11639.                in order to determine the code for [SHIFT]-[F8], you would
  11640.                simply run this program, press the [SHIFT]-[F8] key combination
  11641.                on your keyboard, and record the value displayed on your screen.
  11642.  
  11643.                          #include <stdio.h>
  11644.                          #include <bios.h>
  11645.                          main()
  11646.                          {
  11647.                             int nKey;
  11648.  
  11649.                             do
  11650.                                {
  11651.                                nKey = bioskey(0);
  11652.                                printf("%d (from: %x, %x)\n",
  11653.                                   nKey, nKey>>8, nKey&0xff);
  11654.                                } while((nKey & 0xff) != 27);
  11655.                          }
  11656.  
  11657.  
  11658. ===============================================================================
  11659. OpenDoors 6.00 Manual                                          End of Page 212
  11660.  
  11661.  
  11662. -------------------------------------------------------------------------------
  11663. BUILT IN       These variable allow you to customize the sysop function keys
  11664. FUNCTION       which control functions such as hanging up on the user, shelling
  11665. KEYS           to DOS, and so on. All of these variable will be assigned
  11666.                default values, which correspond to the same function keys used
  11667.                by the RemoteAccess BBS package. However, you may change the
  11668.                values of these variables in order to customize the key
  11669.                combinations which carry out these functions in your own door
  11670.                program. Remember that if you wish to change the value of any of
  11671.                these variables, you must do so after having called od_init() or
  11672.                some OpenDoors function. Each of these variables contain a scan-
  11673.                code / ASCII-code combination representing a keystroke, as is
  11674.                described above. These variables are as follows:
  11675.  
  11676.                +---------------------+----------------------------------------+
  11677.                | VARIABLE            | CORRESPONDING FUNCTION                 |
  11678.                +---------------------+----------------------------------------+
  11679.                | od_control.         | Enter sysop chat mode                  |
  11680.                | key_chat            | (Normally [ALT]-[C]                    |
  11681.                |                     |                                        |
  11682.                | od_control.         | Invoke sysop DOS shell                 |
  11683.                | key_dosshell        | (Normally [ALT]-[J]                    |
  11684.                |                     |                                        |
  11685.                | od_control.         | Return to the BBS without hanging up   |
  11686.                | key_drop2bbs        | (Normally [ALT]-[D])                   |
  11687.                |                     |                                        |
  11688.                | od_control.         | Hangup on the user                     |
  11689.                | key_hangup          | (Normally [ALT]-[H])                   |
  11690.                |                     |                                        |
  11691.                | od_control.         | Turn off the user's keyboard           |
  11692.                | key_keyboardoff     | (Normally [ALT]-[K])                   |
  11693.                |                     |                                        |
  11694.                | od_control.         | Decreases the user's remaining time    |
  11695.                | key_lesstime        | (Normally [DOWN-ARROW])                |
  11696.                |                     |                                        |
  11697.                | od_control.         | Lock the user out of the BBS system    |
  11698.                | key_lockout         | (Normally [ALT]-[L])                   |
  11699.                |                     |                                        |
  11700.                | od_control.         | Increases the user's remaining time    |
  11701.                | key_moretime        | (Normally [UP-ARROW])                  |
  11702.                |                     |                                        |
  11703.                | od_control.         | Array of eight function keys to set the|
  11704.                | key_status[8]       | current status line.                   |
  11705.                |                     | (Normally [F1], [F2], [F3], [F4], [F5],|
  11706.                |                     |  [F6], [F9], [F10])                    |
  11707.                |                     |                                        |
  11708.                | od_control.         | "Sysop next" toggle key                |
  11709.                | key_sysopnext       | (Normally [ALT]-[N])                   |
  11710.                +---------------------+----------------------------------------+
  11711.  
  11712.  
  11713. ===============================================================================
  11714. OpenDoors 6.00 Manual                                          End of Page 213
  11715.  
  11716.  
  11717. -------------------------------------------------------------------------------
  11718. CUSTOM         In addition to the sysop function keys built into OpenDoors, you
  11719. FUNCTION       may wish to add your own function keys to your door. For
  11720. KEYS           example, you might wish to have the [ALT]-[Z] combination
  11721.                display a window of information about your door, or you may wish
  11722.                to add your own user editor to your door, accessible through the
  11723.                [ALT]-[E] combination. The four variables:
  11724.  
  11725.                          unsigned char od_control.od_num_keys;
  11726.                          unsigned int od_control.od_hot_key[16];
  11727.                          unsigned int od_control.od_last_hot;
  11728.                          void (*od_control.od_hot_function[16])(void);
  11729.  
  11730.                provide your program with an interface to add your own sysop
  11731.                function keys (not accessible by the remote user) to the door
  11732.                you have written.
  11733.  
  11734.                OpenDoors allows you to define up to sixteen custom sysop
  11735.                function keys. The key codes (as described at the beginning of
  11736.                this section) are stored in the od_control.od_hot_key[] array,
  11737.                and the od_control.od_num_keys variable records the number of
  11738.                keys which have been defined. The od_control.od_num_keys
  11739.                variable defaults to a value of 0. So, in order to add your own
  11740.                function keys, simply place the key codes for these keys in the
  11741.                first n elements of the od_control.od_hot_key[] array, and set
  11742.                the od_control.od_num_keys variable to the number of keys you
  11743.                have defined. OpenDoors will then watch the keyboard for any of
  11744.                your predefined sysop function keys being pressed. If one of
  11745.                these keys is pressed, OpenDoors will place the key code of the
  11746.                pressed key in the od_control.od_last_hot variable. Your program
  11747.                will then be able to respond to one of your custom function keys
  11748.                being pressed by checking the value of the
  11749.                od_control.od_last_hot variable. At any time this variable
  11750.                contains a non-zero value. If this is the case, you will then be
  11751.                able to determine which of your function keys has been pressed
  11752.                by checking the key code contained in this variable. After
  11753.                taking the appropriate action for the key pressed, you should be
  11754.                sure to reset the value of the od_control.od_last_hot variable
  11755.                back to zero, which will indicate to OpenDoors that your program
  11756.                has received and responded to the function key which was
  11757.                pressed.
  11758.  
  11759.                As an alternative to testing the contents of the
  11760.                od_control.od_last_hot variable, you  can also have your program
  11761.                respond to custom sysop function keys by providing a callback
  11762.                function in the array: void
  11763.                (*od_control.od_hot_function[16])(void);
  11764.  
  11765.                The Nth element in this array corresponds to the Nth element in
  11766.                the od_control.od_hot_key array. To use this mechanism, simply
  11767.                set the appropriate element of this array to point to the
  11768. ===============================================================================
  11769. OpenDoors 6.00 Manual                                          End of Page 214
  11770.  
  11771.                function that you wish to have OpenDoors call when the sysop
  11772.                presses the corresponding function key. For instance, assume
  11773.                that the following function is included in your program's source
  11774.                code:
  11775.  
  11776.                     void addPoints(void)
  11777.                     {
  11778.                        /* add ten points to the user's score */
  11779.                        currentUser->points += 10;
  11780.                     }
  11781.  
  11782.                If you wanted to have this function called when the sysop
  11783.                presses the [Page Up] key, you could do the following:
  11784.  
  11785.                     /* get number of new sysop function key, and increment */
  11786.                     /* total number of keys */
  11787.                     int new_key = od_control.od_num_keys++;
  11788.  
  11789.                     /* Set next sysop hotkey to Page Up */
  11790.                     od_control.od_hot_key[new_key] = 0x4900;
  11791.  
  11792.                     /* Set corresponding function to addPoints() */
  11793.                     od_control.od_hot_function[new_key] = addPoints;
  11794.  
  11795.  
  11796.  
  11797.  
  11798.  
  11799.  
  11800.  
  11801.  
  11802.  
  11803.  
  11804.  
  11805.  
  11806.  
  11807.  
  11808.  
  11809.  
  11810.  
  11811.  
  11812.  
  11813.  
  11814.  
  11815.  
  11816.  
  11817.  
  11818.  
  11819.  
  11820.  
  11821.  
  11822.  
  11823. ===============================================================================
  11824. OpenDoors 6.00 Manual                                          End of Page 215
  11825.  
  11826. CONTROL STRUCTURE - COLOR CUSTOMIZATION
  11827. -------------------------------------------------------------------------------
  11828.  
  11829.                These variables allow you to customize the color of text
  11830.                displayed by OpenDoors. Each of these variables are assigned
  11831.                color attributes, in the format used by od_set_attrib()
  11832.                (described on page 128). These variables are as follows:
  11833.  
  11834.                +---------------------+----------------------------------------+
  11835.                | VARIABLE            | WHERE COLOR IS USED                    |
  11836.                +---------------------+----------------------------------------+
  11837.                | od_control.         | Text typed by the sysop and user in    |
  11838.                | od_chat_color1 & 2  | chat mode.                             |
  11839.                |                     |                                        |
  11840.                | od_control.         | File description fields in FILES.BBS   |
  11841.                | od_list_comment_col | listings                               |
  11842.                |                     |                                        |
  11843.                | od_control.         | Color of page pausing prompt that is   |
  11844.                | od_continue_col     | displayed at the end of each page      |
  11845.                |                     |                                        |
  11846.                | od_control.         | Filename fields in FILES.BBS listings  |
  11847.                | od_list_name_col    |                                        |
  11848.                |                     |                                        |
  11849.                | od_control.         | "Missing" string in FILES.BBS listings |
  11850.                | od_list_offline_col |                                        |
  11851.                |                     |                                        |
  11852.                | od_control.         | File size fields in FILES.BBS listings |
  11853.                | od_list_size_col    |                                        |
  11854.                |                     |                                        |
  11855.                | od_control.         | Title fields in FILES.BBS listings     |
  11856.                | od_list_title_col   |                                        |
  11857.                |                     |                                        |
  11858.                | od_control.         | Color of the window title as displayed |
  11859.                | od_menu_title_col   | by od_popup_menu()                     |
  11860.                |                     |                                        |
  11861.                | od_control.         | Color of the window border as          |
  11862.                | od_menu_border_col  | displayed by od_popup_menu()           |
  11863.                |                     |                                        |
  11864.                | od_control.         | Color of the normal text displayed     |
  11865.                | od_menu_text_col    | by od_popup_menu()                     |
  11866.                |                     |                                        |
  11867.                | od_control.         | Color of the shortcut keys displayed   |
  11868.                | od_menu_key_col     | by od_popup_menu()                     |
  11869.                |                     |                                        |
  11870.                | od_control.         | Color of the selection bar as          |
  11871.                | od_menu_highlight_  | displayed by od_popup_menu()           |
  11872.                | col                 |                                        |
  11873.                |                     |                                        |
  11874.                | od_control.         | Color of the shortcut keys displayed   |
  11875.                | od_menu_highkey_col | on the selected line by od_popup_menu()|
  11876.                +---------------------+----------------------------------------+
  11877.  
  11878. ===============================================================================
  11879. OpenDoors 6.00 Manual                                          End of Page 216
  11880.  
  11881. CONTROL STRUCTURE - TEXT CUSTOMIZATION
  11882. -------------------------------------------------------------------------------
  11883.  
  11884.                In addition to the other aspects of OpenDoors which may be
  11885.                customized by use of the OpenDoors control structure, all of the
  11886.                text displayed by OpenDoors may also be customized. This may be
  11887.                done either to create doors with OpenDoors that use languages
  11888.                other than English, or to simply give your doors a "personal
  11889.                touch". The variables described in this section allow you to
  11890.                define what text you want to have displayed by OpenDoors at any
  11891.                time. All of these variables are pointers to strings, and are
  11892.                set to default values in the od_init() function. Thus, if you
  11893.                wish to change the string pointed to by any of these variables,
  11894.                you must do so after od_init() or some OpenDoors API function
  11895.                has been called. To set any of these variables, you can simply
  11896.                set them to point to a string-constant in your program. For
  11897.                example, to set the text displayed by OpenDoors prior to a DOS
  11898.                shell, you could:
  11899.  
  11900.                od_control.od_before_shell=(char *)"\n\rJust a moment...\n\r";
  11901.  
  11902.                The chart below lists each of the text customization variables
  11903.                (without the "od_control." prefix, for the sake of brevity),
  11904.                along with their default strings.
  11905.  
  11906.                Note that some of these strings MUST always be the same length
  11907.                as their default string. You may not display longer text within
  11908.                these strings, and if you wish to display shorter text, you must
  11909.                pad the remaining space in the string with spaces, in order to
  11910.                preserve its length. Those string which must be of fixed length
  11911.                also have their length listed in the chart below. Any strings
  11912.                which have an asterisk (*) in their length column may be any
  11913.                length.
  11914.  
  11915.                Also keep in mind that any string with "printf-style" formatting
  11916.                sequences, such as "%s", must retain the same sequences in the
  11917.                same order.
  11918.  
  11919.                In addition, four of these pointers - od_after_chat,
  11920.                od_after_shell, od_before_chat and od_before_shell - can be set
  11921.                to a value of NULL. In this case, OpenDoors will not display any
  11922.                string where this variable's string is normally displayed.
  11923.  
  11924. +-----------------------+-----+----------------------------------------------+
  11925. | VARIABLE NAME         | LEN | DEFAULT VALUE                                |
  11926. +-----------------------+-----+----------------------------------------------+
  11927. | od_after_chat         |  *  | "\n\rChat mode ended...\n\r\n\r"             |
  11928. |                       |     |                                              |
  11929. | od_after_shell        |  *  | "\n\r...Thanks for waiting\n\r\n\r"          |
  11930. |                       |     |                                              |
  11931. | od_before_chat        |  *  | "\n\rSysop breaking in for chat...\n\r\n\r"  |
  11932. |                       |     |                                              |
  11933. ===============================================================================
  11934. OpenDoors 6.00 Manual                                          End of Page 217
  11935.  
  11936. | od_before_shell       |  *  | "\n\rPlease wait a moment...\n\r"            |
  11937. |                       |     |                                              |
  11938. | od_chat_reason        |  *  | "                          Why would you "   |
  11939. |                       |     | "like to chat?\n\r"                          |
  11940. |                       |     |                                              |
  11941. | od_continue           |  *  | "Continue? [Y/n/=]"                          |
  11942. |                       |     |                                              |
  11943. | od_continue_no        | char| 'N'                                          |
  11944. |                       |     |                                              |
  11945. | od_continue_nonstop   | char| '='                                          |
  11946. |                       |     |                                              |
  11947. | od_continue_yes       | char| 'Y'                                          |
  11948. |                       |     |                                              |
  11949. | od_day[0]             |  3  | "Sun"                                        |
  11950. |                       |     |                                              |
  11951. | od_day[1]             |  3  | "Mon"                                        |
  11952. |                       |     |                                              |
  11953. | od_day[2]             |  3  | "Tue"                                        |
  11954. |                       |     |                                              |
  11955. | od_day[3]             |  3  | "Wed"                                        |
  11956. |                       |     |                                              |
  11957. | od_day[4]             |  3  | "Thu"                                        |
  11958. |                       |     |                                              |
  11959. | od_day[5]             |  3  | "Fri"                                        |
  11960. |                       |     |                                              |
  11961. | od_day[6]             |  3  | "Sat"                                        |
  11962. |                       |     |                                              |
  11963. | od_hanging_up         |  *  | "Terminating Call"                           |
  11964. |                       |     |                                              |
  11965. | od_help_text          |  80 | "  Alt: [C]hat [H]angup [L]ockout [J]Dos "   |
  11966. |                       |     | "[K]eyboard-Off [D]rop to BBS            "   |
  11967. |                       |     |                                              |
  11968. | od_help_text2         |  79 | "  OpenDoors 6.00 - (C)Copyright 1992, "     |
  11969. |                       |     | "Brian Pirie - Registered Version         "  |
  11970. |                       |     |                                              |
  11971. | od_inactivity_timeout |  *  | "User sleeping at keyboard, inactivity "     |
  11972. |                       |     | "timeout...\n\r\n\r"                         |
  11973. |                       |     |                                              |
  11974. | od_inactivity_warning |  *  | "Warning, only %d minute(s) remaining "      |
  11975. |                       |     | "today...\n\r\n\r"                           |
  11976. |                       |     |                                              |
  11977. | od_month[0]           |  3  | "Jan"                                        |
  11978. |                       |     |                                              |
  11979. | od_month[1]           |  3  | "Feb"                                        |
  11980. |                       |     |                                              |
  11981. | od_month[2]           |  3  | "Mar"                                        |
  11982. |                       |     |                                              |
  11983. | od_month[3]           |  3  | "Apr"                                        |
  11984. |                       |     |                                              |
  11985. | od_month[4]           |  3  | "May"                                        |
  11986. |                       |     |                                              |
  11987. | od_month[5]           |  3  | "Jun"                                        |
  11988. ===============================================================================
  11989. OpenDoors 6.00 Manual                                          End of Page 218
  11990.  
  11991. |                       |     |                                              |
  11992. | od_month[6]           |  3  | "Jul"                                        |
  11993. |                       |     |                                              |
  11994. | od_month[7]           |  3  | "Aug"                                        |
  11995. |                       |     |                                              |
  11996. | od_month[8]           |  3  | "Sep"                                        |
  11997. |                       |     |                                              |
  11998. | od_month[9]           |  3  | "Oct"                                        |
  11999. |                       |     |                                              |
  12000. | od_month[10]          |  3  | "Nov"                                        |
  12001. |                       |     |                                              |
  12002. | od_month[11]          |  3  | "Dec"                                        |
  12003. |                       |     |                                              |
  12004. | od_no_keyboard        |  10 | "[Keyboard]"                                 |
  12005. |                       |     |                                              |
  12006. | od_no_sysop           |  *  | "\n\rI'm afraid the sysop is not available " |
  12007. |                       |     | "at this time.\n\r"                          |
  12008. |                       |     |                                              |
  12009. | od_no_response        |  *  | " No response.\n\r\n\r"                      |
  12010. |                       |     |                                              |
  12011. | od_no_time            |  *  | "Sorry, you have used up your time for "     |
  12012. |                       |     | "today...\n\r\n\r"                           |
  12013. |                       |     |                                              |
  12014. | od_offline            |  10 | "[OFFLINE] "                                 |
  12015. |                       |     |                                              |
  12016. | od_paging             |  *  | "\n\rPaging Sysop for Chat"                  |
  12017. |                       |     |                                              |
  12018. | od_press_key          |  *  | "Press [Enter] to continue..."               |
  12019. |                       |     |                                              |
  12020. | od_sending_rip        |  *  | "\xb4 Sending RIP File \xc3"                 |
  12021. |                       |     |                                              |
  12022. | od_status_line[0]     |  80 | "                                        "   |
  12023. |                       |     | "                             [Node:     "   |
  12024. |                       |     |                                              |
  12025. | od_status_line[1]     |  *  | "%s of %s at %u BPS"                         |
  12026. |                       |     |                                              |
  12027. | od_status_line[2]     |  79 | "Security:        Time:                  "   |
  12028. |                       |     | "                             [F9]=Help "    |
  12029. |                       |     |                                              |
  12030. | od_sysop_next         |  5  | "[SN] "                                      |
  12031. |                       |     |                                              |
  12032. | od_time_left          |  10 | "%d mins   "                                 |
  12033. |                       |     |                                              |
  12034. | od_time_warning       |  *  | "Warning, only %d minute(s) remaining tod"   |
  12035. |                       |     | "ay...\n\r\n\r"                              |
  12036. |                       |     |                                              |
  12037. | od_want_chat          |  11 | "[Want-Chat]"                                |
  12038. +-----------------------+-----+----------------------------------------------+
  12039.  
  12040.  
  12041.  
  12042.  
  12043. ===============================================================================
  12044. OpenDoors 6.00 Manual                                          End of Page 219
  12045.  
  12046.     66
  12047.    66
  12048.   66
  12049.  66666
  12050.  66  66
  12051.  66  66
  12052.   6666
  12053. -------------------------------------------------------------------------------
  12054. CHAPTER 6 - SPECIAL TOPICS
  12055.  
  12056.  
  12057.  
  12058.  
  12059. ADDITIONAL INFORMATION ON THE WIN32 VERSION
  12060. -------------------------------------------------------------------------------
  12061.  
  12062.                This section provides additional information on the Win32
  12063.                version of OpenDoors that isn't found elsewhere in this manual.
  12064.                If you are working with the Win32 version of OpenDoors, you
  12065.                should take the time to read this entire section. You should
  12066.                also read the sections in chapter 3 that describe how to compile
  12067.                and run Win32 programs that use OpenDoors.
  12068.  
  12069.                The Win32 version of OpenDoors has been designed to be as
  12070.                similar as possible to the DOS version of OpenDoors. This means
  12071.                that where possible, you can compile the same source code to
  12072.                produce both a DOS and a Windows program. However, if you are
  12073.                porting an existing DOS OpenDoors-based program to the Win32
  12074.                platform, there are some important things to keep in mind.
  12075.  
  12076.                The first thing to note is that under DOS, the program's
  12077.                execution begins in the main() function, whereas under Windows,
  12078.                it begins in the WinMain() function. To allow the same source
  12079.                file to build both DOS and Windows versions you can use
  12080.                conditional compilation. OpenDoor.h defines a constant of the
  12081.                form ODPLAT_xxx, indicating which version of OpenDoors is being
  12082.                used. Currently, this will be either ODPLAT_DOS, or
  12083.                ODPLAT_WIN32. However, if a OS/2 or Unix version of OpenDoors
  12084.                were created, they would use definitions such as ODPLAT_OS2, or
  12085.                ODPLAT_UNIX. Under the Win32 version, you should pass the
  12086.                nCmdShow parameter that is passed to WinMain into OpenDoors,
  12087.                through od_control.od_cmd_show. If you do not do this, the
  12088.                program will always start with the main window maximized,
  12089.                regardless of what the user has requested. Also, you will
  12090.                probably want to use the new od_parse_cmd_line() function in
  12091.                both DOS and Windows programs, to allow standard command-line
  12092.                options to be processed. The od_parse_cmd_line() function
  12093.                accepts command line information in the same format as it is
  12094.                passed to the main or WinMain() function. So, the general
  12095.                structure of an OpenDoors program that can be compiled under
  12096.                either DOS or Win32 now becomes:
  12097.  
  12098. ===============================================================================
  12099. OpenDoors 6.00 Manual                                          End of Page 220
  12100.  
  12101.                /* Add your own #includes here. */
  12102.  
  12103.                #include "opendoor.h"
  12104.  
  12105.                #ifdef ODPLAT_WIN32
  12106.                int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  12107.                   LPSTR lpszCmdLine, int nCmdShow)
  12108.                #else
  12109.                int main(int argc, char *argv[])
  12110.                #endif
  12111.                {
  12112.                     /* Add local variables here. */
  12113.  
  12114.                #ifdef ODPLAT_WIN32
  12115.                   od_control.od_cmd_show = nCmdShow;
  12116.  
  12117.                   od_parse_cmd_line(lpszCmdLine);
  12118.                #else
  12119.                   od_parse_cmd_line(argc, argv);
  12120.                #endif
  12121.  
  12122.                     /* Add the rest of your program after this point. */
  12123.                }
  12124.  
  12125.                If you are porting existing OpenDoors programs over to the Win32
  12126.                version of OpenDoors, another issue that you will have to pay
  12127.                careful attention to is the fact that you are now working in the
  12128.                32-bit world. While 32-bit programming under a flat memory model
  12129.                has many advantages (no more 64K segments and related
  12130.                limitations, for example), you must be aware that the size of
  12131.                basic data types that you are used to using may have changed.
  12132.                For example, an int is now 32-bits wide instead of 16-bits wide.
  12133.                One of the places where this difference becomes very important
  12134.                is if you are performing file-I/O by directly dumping a
  12135.                structure to or from disk using functions such as fread() and
  12136.                fwrite(). In this case, you must declare your structures using
  12137.                types that are of the same size between the 16-bit and 32-bit
  12138.                worlds, in order for your file formats to be compatible between
  12139.                the DOS and Win32 versions of your program. For example, the
  12140.                EX_VOTE.C example program declares its structure using fixed-
  12141.                sized types that are always available to any program including
  12142.                "opendoor.h". These types are the following size, regardless of
  12143.                what platform you are compiling under:
  12144.  
  12145.                INT8     - 8-bit signed integer.
  12146.                INT16    - 16-bit signed integer.
  12147.                INT32    - 32-bit signed integer.
  12148.                BYTE     - 8-bit unsigned integer.
  12149.                WORD     - 16-bit unsigned integer.
  12150.                DWORD    - 32-bit unsigned integer.
  12151.  
  12152.  
  12153. ===============================================================================
  12154. OpenDoors 6.00 Manual                                          End of Page 221
  12155.  
  12156.                (NOTE: Obviously, the many details of 32-bit programming and
  12157.                Windows programming are beyond the scope of this document. For
  12158.                more information on the issues discussed here, you will probably
  12159.                wish to consult other sources of information on Win32
  12160.                programming.)
  12161.  
  12162.                As you are probably aware, the Win32 edition of OpenDoors makes
  12163.                extensive use of multithreading. The number of threads will
  12164.                depend on what mode OpenDoors is operating in. In some
  12165.                situations, all of the following threads may exist:
  12166.  
  12167.                - The client thread(s), which executes the code that you write
  12168.                  in your program, along with the OpenDoors API functions.
  12169.                - The local screen thread, which is responsible for drawing
  12170.                  your program's output on the screen, and receiving input from
  12171.                  the local keyboard.
  12172.                - The frame window thread, which handles the OpenDoors menus,
  12173.                  toolbar, status bar and sysop function keys.
  12174.                - The remote input thread, which receives input from the serial
  12175.                  port and adds it to OpenDoors common local/remote input
  12176.                  queue.
  12177.                - The carrier detection thread, which blocks and only executes
  12178.                  if the carrier detect signal goes low.
  12179.                - The time update thread, which updates the user's time
  12180.                  remaining online, and monitors user timeouts.
  12181.  
  12182.                Since most of these threads only execute when the operating
  12183.                system determines that there is actually something for them to
  12184.                do, the Win32 version of OpenDoors provides very high
  12185.                performance and responsiveness.
  12186.  
  12187.                You may also want to make use of multithreading directly within
  12188.                your program. If you do this, please note that while you may use
  12189.                threads to perform background processing, OpenDoors requires
  12190.                that you only call OpenDoors API functions from one thread.
  12191.  
  12192.                If you wish to customize the information that is displayed in
  12193.                the Help|About dialog box (including your program's name and
  12194.                copyright information), provide your own application icon, or
  12195.                add online help to the help menu, refer to the sections in the
  12196.                manual on the following od_control variables:
  12197.  
  12198.                     od_control.od_app_icon
  12199.                     od_control.od_help_callback
  12200.                     od_control.od_prog_name
  12201.                     od_control.od_prog_version
  12202.                     od_control.od_prog_copyright
  12203.  
  12204.                The section that describes how to run Windows based door
  12205.                programs under DOS-based BBS package indicates that
  12206.                COM<n>AutoAssign=0 should be set in the system.ini file. The
  12207.                explanation for this is as follows: The default value for this
  12208. ===============================================================================
  12209. OpenDoors 6.00 Manual                                          End of Page 222
  12210.  
  12211.                setting in Windows 95 is -1, which prevents any Windows-based
  12212.                program from accessing a serial port which has previously been
  12213.                used by a non-Windows-based program, until the window that
  12214.                program was running in is closed. By setting this value to 0,
  12215.                you are allowing the Windows-based door program to immediately
  12216.                use the modem, even while the MS-DOS session (VM) is still
  12217.                active. A value of <x> greater than 0 will allow Windows-based
  12218.                programs to access the serial port, only if the DOS-based
  12219.                program has not accessed the serial port for at least <x>
  12220.                seconds. For example, the default setting in Windows 3.1 was
  12221.                COM1AutoAssign=2, which allowed Windows-based programs to access
  12222.                the serial port if no DOS program had used it for at least 2
  12223.                seconds.
  12224.  
  12225.                The section that describes how to run Windows based door
  12226.                programs under DOS-based BBS package also indicates that the
  12227.                DTRON utility should be run after the start command returns. The
  12228.                reason for this is that when a Windows program exits and closes
  12229.                the serial port (by calling the CloseHandle() function), Windows
  12230.                95 lowers the DTR line on the serial port. Most modems are
  12231.                configured to respond to this by hanging up on the remote user.
  12232.                From talking to other people, it seems that this "feature" (or
  12233.                fundamental design flaw, depending on how you want to look at
  12234.                it) is unique to Windows 95, and won't effect OpenDoors when
  12235.                running under Windows NT. However, the majority of people will
  12236.                undoubtedly be using the Win32 version of OpenDoors under
  12237.                Windows 95. This is unfortunate, since the Win32 communications
  12238.                facilities are otherwise _very_ well designed. There is a rumor
  12239.                that Microsoft's next upgrade to Windows 95 will fix this
  12240.                problem. However, I must stress that this is only a rumor, and
  12241.                that I haven't received any confirmation about this from
  12242.                Microsoft.
  12243.  
  12244.                OpenDoors currently provides two solutions to this problem.
  12245.  
  12246.                First of all, OpenDoors has the ability to use an already open
  12247.                serial port handle, if that information is supplied to it.
  12248.                Hopefully, all Windows 95-based BBS software will provide the
  12249.                option of running a door program with the serial port still
  12250.                open, and allow you to pass that serial port handle on the door
  12251.                program's command line. OpenDoors allows the serial port handle
  12252.                to be passed on the command line, or set directly in the
  12253.                od_control structure, as is described later in this manual. On
  12254.                BBS systems where this form of hot sharing of the serial port is
  12255.                supported, the serial port can remain open at all times, and so
  12256.                the CloseHandle() problem is avoided.
  12257.  
  12258.                This means that the only situation where the CloseHandle()
  12259.                problem still has to be dealt with is when OpenDoors is running
  12260.                on a Windows 95 system and OpenDoors has to open the serial port
  12261.                itself (and so must close the serial port before exiting). This
  12262.                would be the case for most MS-DOS based BBS systems running
  12263. ===============================================================================
  12264. OpenDoors 6.00 Manual                                          End of Page 223
  12265.  
  12266.                under Windows 95, unless some intermediate layer is provided. By
  12267.                default, in this situation OpenDoors will disable DTR response
  12268.                by the modem just before it closes the serial port, by sending
  12269.                the AT&D0 command to the modem. The exact sequence of commands
  12270.                used by OpenDoors to do this is specified by the
  12271.                od_control.od_disable_dtr string. This DTR response disabling
  12272.                may be turned off by setting the DIS_DTR_DISABLE
  12273.                od_control.od_disable flag. Since many programs (OpenDoors
  12274.                included) assume that they can hangup the modem by lowering the
  12275.                DTR signal, a small utility will usually be run after the door,
  12276.                which first raises the DTR signal again, and then re-enables DTR
  12277.                response by the modem. Such a utility is included in this
  12278.                package, named DTRON.EXE. I wrote the DTRON utility so that you
  12279.                can freely redistributed it with your programs.
  12280.  
  12281.                So, to summarize, the DTR disabling by OpenDoors and subsequent
  12282.                reenabling by DTRON is only required for the Win32 version of
  12283.                OpenDoors running under Windows 95 when the modem is configured
  12284.                to hangup if the DTR signal is lowered, and the BBS software
  12285.                does not have the ability to pass a live serial port handle to a
  12286.                door program. Setting COM<n>AutoAssign in system.ini is only
  12287.                required for the Win32 version of OpenDoors when it is being
  12288.                called from an MS-DOS session that has previously accessed the
  12289.                serial port.
  12290.  
  12291.                Note that the Win32 version of OpenDoors requires Windows 95 or
  12292.                Windows NT. It will not run under Windows 3.x, even with Win32s.
  12293.                This is because OpenDoors makes use of the Windows 95/NT
  12294.                multitasking and multithreading services that are not available
  12295.                under Win32s.
  12296.  
  12297.  
  12298.  
  12299.  
  12300.  
  12301.  
  12302.  
  12303.  
  12304.  
  12305.  
  12306.  
  12307.  
  12308.  
  12309.  
  12310.  
  12311.  
  12312.  
  12313.  
  12314.  
  12315.  
  12316.  
  12317.  
  12318. ===============================================================================
  12319. OpenDoors 6.00 Manual                                          End of Page 224
  12320.  
  12321. CONFIGURATION FILE SYSTEM
  12322. -------------------------------------------------------------------------------
  12323.  
  12324.                One of the most useful OpenDoors features that you can
  12325.                optionally choose to include in your programs is the OpenDoors
  12326.                configuration file system. All that is required to enable the
  12327.                configuration file system is to include the following line
  12328.                before your first call to any OpenDoors function:
  12329.  
  12330.                     od_control.od_config_file = INCLUDE_CONFIG_FILE;
  12331.  
  12332.                OpenDoors will now search for and read an OpenDoors
  12333.                configuration file. If you do not specify the name of this file,
  12334.                the default name of DOOR.CFG will be used. Using this
  12335.                configuration file, the sysop can set a wide variety of options,
  12336.                such as modem and system configuration information, maximum time
  12337.                limits for the door, and even define custom door information
  12338.                (drop) file formats. The example DOOR.CFG file included in your
  12339.                OpenDoors package shows the format and all options that are
  12340.                automatically supported by the configuration file system. This
  12341.                configuration file format is designed to be easy to use, and the
  12342.                example configuration file contains comments which provide a
  12343.                complete description of each option. Feel free to redistribute
  12344.                DOOR.CFG or a modified version of this file with your door
  12345.                programs. In addition to the many configuration file settings
  12346.                already supported, you can add your own settings that are
  12347.                specific to your particular program.
  12348.  
  12349.                To specify your own filename for the configuration file, use the
  12350.                od_config_filename control structure variable. For example, the
  12351.                following line:
  12352.  
  12353.                     od_control.od_config_filename = "MYDOOR.CFG"
  12354.  
  12355.                causes OpenDoors to look for the configuration file MYDOOR.CFG
  12356.                instead of the default DOOR.CFG.
  12357.  
  12358.                OpenDoors fill first search for the configuration file in the
  12359.                directory specified in the od_config_filename variable, if a
  12360.                specific directory name was supplied. If not found, it will then
  12361.                search the current directory. If the configuration file system
  12362.                is unable to locate a configuration file, or if any settings are
  12363.                omitted from the file, the default values for these settings
  12364.                will be used automatically. This means that the configuration
  12365.                file is always optional, unless your program has custom settings
  12366.                that it requires in order to run.
  12367.  
  12368.                The format for the configuration file is as follows. Blank lines
  12369.                and any text following the semi-colon (;) character are ignored.
  12370.                Configuration options are specified using a keyword, possibly
  12371.                followed by one or more options. The keywords are not case
  12372.                sensitive, but some of the options are. The order of options in
  12373. ===============================================================================
  12374. OpenDoors 6.00 Manual                                          End of Page 225
  12375.  
  12376.                the configuration file is not significant, with the exception of
  12377.                the "CustomFileLine" option. For more information on the
  12378.                "CustomFileLine" setting, see the section that begins on page
  12379.                230. The built-in configuration options are as follow:
  12380.  
  12381.                BBSDir - BBS System directory. Indicates where the door
  12382.                     information file (drop file) can be found.
  12383.  
  12384.                DoorDir - The door's working directory. This is where the door's
  12385.                     system files are located. OpenDoors will automatically
  12386.                     perform a chdir into this directory at initialization, and
  12387.                     will return to the original directory on exit.
  12388.  
  12389.                LogFileName - Specifies the filename (path optional) where the
  12390.                     door should record log information.
  12391.  
  12392.                DisableLogging - Prevents door from writing to a log file.
  12393.  
  12394.                Node - BBS node number that the door is running on. Only used if
  12395.                     OpenDoors is unable to determine the node number by some
  12396.                     other means.
  12397.  
  12398.                ???dayPagingHours - Specifies sysop paging hours. Sysop paging
  12399.                     will be permitted beginning at the start time, up until,
  12400.                     but not including, the end time. Times should be in the 24-
  12401.                     hour format. To disable paging on a particular day, set the
  12402.                     paging start and end times to the same time. ???day can be
  12403.                     one of Sunday, Monday, Tuesday, Wednesday, Thursday, Friday
  12404.                     or Saturday.
  12405.  
  12406.                PageDuration - Duration of sysop page. Value indicates the
  12407.                     number of beeps that compose the sysop page alarm.
  12408.  
  12409.                MaximumDoorTime - Maximum length of time a user is permitted to
  12410.                     access the door. If the user's total remaining time on the
  12411.                     BBS is less than this value, the user will only be
  12412.                     permitted to access the door for this shorter length of
  12413.                     time. This option is disabled by commenting out the line.
  12414.  
  12415.                InactivityTimeout - Specifies the maximum number of seconds that
  12416.                     may elapse without the user pressing a key, before the user
  12417.                     will automatically be disconnected. A value of 0 disables
  12418.                     inactivity timeouts.
  12419.  
  12420.                SysopName - Name of the sysop. OpenDoors can usually determine
  12421.                     the sysop's name from the door information (drop) file.
  12422.                     How3ever, some BBS packages do not supply this information.
  12423.                     In such cases, if the sysop's name is required by the door,
  12424.                     it may be supplied here.
  12425.  
  12426.  
  12427.  
  12428. ===============================================================================
  12429. OpenDoors 6.00 Manual                                          End of Page 226
  12430.  
  12431.                SystemName - Like the sysop's name, this option can usually be
  12432.                     determined from the door information file. If it is not
  12433.                     available, the sysop my supply the information here.
  12434.  
  12435.                ChatUserColor - Specifies the color of text typed by the user in
  12436.                     sysop chat mode. The format of the color name is included
  12437.                     in the description of the od_color_config() function.
  12438.  
  12439.                ChatSysopColor - Specifies the color of test typed by the sysop
  12440.                     in chat mode.
  12441.  
  12442.                FileListTitleColor - Files.BBS listing colors.
  12443.                FileListNameColor
  12444.                FileListSizeColor
  12445.                FileListDescriptionColor
  12446.                FileListOfflineColor
  12447.  
  12448.                SwappingDir - Directory where disk swapping will be done.
  12449.  
  12450.                SwappingNoEMS - Disables swapping to EMS memory.
  12451.  
  12452.                SwappingDisable - Disables swapping entirely.
  12453.  
  12454.                LockedBPS -  BPS rate at which door should communicate with the
  12455.                     modem.  Valid rates are 300, 600, 1200, 2400, 4800, 9600,
  12456.                     19200 and 38400. A value of 0 forces the door to always
  12457.                     operate in local mode. This option is not normally needed,
  12458.                     as the information is usually available from the door
  12459.                     information file.
  12460.  
  12461.                FossilPort - Specifies the FOSSIL driver port number that the
  12462.                     modem is connected to. FOSSIL port 0 usually corresponds to
  12463.                     COM1, port 1 to COM2, and so on. This option is not
  12464.                     normally needed, as the information is usually available
  12465.                     from the door information file.
  12466.  
  12467.                CustomFileName - Specifies the filename used by the custom door
  12468.                     information file format. Described in more detail below.
  12469.  
  12470.                CustomFileLine - Specifies the contents of a particular line in
  12471.                     the custom door information file format.
  12472.  
  12473.                The last two configuration file options, "CustomFileName" and
  12474.                "CustomFileLine" allow you or the system operator using your
  12475.                program to define your own door information (drop) file formats.
  12476.                For more information on this topic, see the section which begins
  12477.                on page 230.
  12478.  
  12479.                You can also extend OpenDoor's configuration file format to add
  12480.                your own options, by supplying a callback function that will be
  12481.                called whenever OpenDoors encounters an unrecognized
  12482.  
  12483. ===============================================================================
  12484. OpenDoors 6.00 Manual                                          End of Page 227
  12485.  
  12486.                configuration file keyword. The prototype of this function
  12487.                should be as follows:
  12488.  
  12489.                     custom_line_function(char *keyword, char *options)
  12490.  
  12491.                To cause OpenDoors to use your function, you would include the
  12492.                following line before your first call to any OpenDoors function:
  12493.  
  12494.                     od_control.od_config_function = custom_line_function;
  12495.  
  12496.                (You can use a different function name if you wish.) When
  12497.                OpenDoors encounters unrecognized keyword, it will now call your
  12498.                function, passing a pointer to an upper case version the keyword
  12499.                string in the first parameter, and a pointer to any options that
  12500.                follow the keyword in the second parameter. For instance, if the
  12501.                following line were encountered in the configuration file:
  12502.  
  12503.                     RegisteredTo    John Smith      ; Sysop's name
  12504.  
  12505.                The parameters passed to your function would be:
  12506.  
  12507.                     char *keyword = "REGISTEREDTO"
  12508.                     char *options = "John Smith"
  12509.  
  12510.                Your custom line function should be written in such a way that
  12511.                if OpenDoors passes a configuration option to your function that
  12512.                your function does not recognize, that option would simply be
  12513.                ignored.
  12514.  
  12515.                The example program below demonstrates how to use the custom
  12516.                line function to add your own configuration file options. This
  12517.                program looks for three custom configuration file options,
  12518.                "RegistrationKey", "DefaultColor" and "DisplayWinners". If the
  12519.                "RegistrationKey" option is present, the numerical value
  12520.                following this option is stored in the global variable "key". If
  12521.                the "DefaultColor" option is present, the color description
  12522.                (such as "Bright Red on Black") is translated to an
  12523.                od_set_attr() color code using od_color_config(). This color
  12524.                setting is stored in the global variable default_color. Since
  12525.                this variable is initialized to 0x07 (the value for dark white
  12526.                on black), if this option is omitted, that color is used by
  12527.                default. If the "DisplayWinners" option is included in the
  12528.                configuration file, the global variable display_winners is set
  12529.                to TRUE, regardless of any options that may follow this keyword.
  12530.  
  12531.  
  12532.                #include "opendoor.h"                  /* Include opendooor.h */
  12533.                                        /* Prototype for custom line function */
  12534.                void custom_line_function(char *keyword, char *options);
  12535.  
  12536.                unsigned long key=0L; /* Variables for our own config option */
  12537.                unsigned char default_color=0x07;
  12538. ===============================================================================
  12539. OpenDoors 6.00 Manual                                          End of Page 228
  12540.  
  12541.                char display_winners=FALSE;
  12542.  
  12543.                main()                     /* Program's execution begins here */
  12544.                {               /* Begin door operations, reading config file */
  12545.                   od_control.od_config_file = INCLUDE_CONFIG_FILE;
  12546.                                /* Tell OpenDoors to use custom line function */
  12547.                   od_control.od_config_function = custom_line_function;
  12548.                   od_init();
  12549.                   /* Main program's operations go here */
  12550.                   od_exit(10, FALSE);                        /* Exit program */
  12551.                }
  12552.                                             /* Code for custom line function */
  12553.                void custom_line_function(char *keyword, char *options)
  12554.                {                            /* If option is registration key */
  12555.                   if(stricmp(keyword,"REGISTRATIONKEY")==0)
  12556.                   {
  12557.                      key=atol(options);             /* Store key in variable */
  12558.                   }                               /* If option is text color */
  12559.                   else if(stricmp(keyword,"DEFAULTCOLOR")==0)
  12560.                   {               /* Get color value using od_color_config() */
  12561.                      default_color=od_color_config(options);
  12562.                   }         /* Example of option enabled by just the keyword */
  12563.                   else if(stricmp(keyword,"DISPLAYWINNERS")==0)
  12564.                   {                 /* If keyword is present, turn on option */
  12565.                      display_winners=TRUE;
  12566.                   }
  12567.                }
  12568.  
  12569.  
  12570.  
  12571.  
  12572.  
  12573.  
  12574.  
  12575.  
  12576.  
  12577.  
  12578.  
  12579.  
  12580.  
  12581.  
  12582.  
  12583.  
  12584.  
  12585.  
  12586.  
  12587.  
  12588.  
  12589.  
  12590.  
  12591.  
  12592.  
  12593. ===============================================================================
  12594. OpenDoors 6.00 Manual                                          End of Page 229
  12595.  
  12596. DEFINING CUSTOM DOOR INFORMATION FILE FORMATS
  12597. -------------------------------------------------------------------------------
  12598.  
  12599.                As is mentioned in the previous section, the OpenDoors
  12600.                configuration file system provides two settings which allow the
  12601.                sysop to define a custom door information file format. This
  12602.                permits OpenDoors doors to operate directly on any BBS system
  12603.                that produces a door information file format not directly
  12604.                supported by OpenDoors. A custom door information file format is
  12605.                defined using the "CustomFileName" option, followed by one or
  12606.                more lines beginning with the "CustomFileLine" option.
  12607.  
  12608.                The "CustomFileName" option specifies the filename used to
  12609.                distinguish this file format from other file formats. This
  12610.                filename should not include a path. To specify the path where
  12611.                the door information file is located, the sysop should use the
  12612.                BBSDir configuration file setting. If the filename of the custom
  12613.                format is the same as that of one of the built-in formats, the
  12614.                custom format will override the built-in format.
  12615.  
  12616.                The actual format of the custom file is specified using a number
  12617.                of lines that begin with the keyword "CustomFileLine". Each of
  12618.                these lines will correspond to a single line in the door
  12619.                information file, with the option following the "CustomFileLine"
  12620.                keyword specifying the information that can be found on that
  12621.                line. This can be one of the following keywords:
  12622.  
  12623.                     Ignore - Causes the next line in the door information file
  12624.                          to be ignored. Use on lines for which none of the
  12625.                          options below apply.
  12626.  
  12627.                     COMPORT - COM? port the modem is connected to (0 indicates
  12628.                          local mode)
  12629.  
  12630.                     FOSSILPORT - Fossil port number the modem is connected to
  12631.  
  12632.                     MODEMBPS - BPS rate at which to communicate with modem (0
  12633.                          or non-numerical value indicates local mode)
  12634.  
  12635.                     LOCALMODE - 1, T or Y if door is operating in local mode
  12636.  
  12637.                     USERNAME - Full name of the user
  12638.  
  12639.                     USERFIRSTNAME - First name(s) of the user
  12640.  
  12641.                     USERLASTNAME - Last name of the user
  12642.  
  12643.                     ALIAS - The user's pseudonym / handle
  12644.  
  12645.                     HOURSLEFT - Hours user has left online
  12646.  
  12647.  
  12648. ===============================================================================
  12649. OpenDoors 6.00 Manual                                          End of Page 230
  12650.  
  12651.                     MINUTESLEFT - Minutes user has left online, or time left
  12652.                          online in format hh:mm
  12653.  
  12654.                     SECONDSLEFT - Seconds user has left online, or time left
  12655.                          online in format hh:mm:ss or format mm:ss (If more
  12656.                          than one of the above time options are used, the user
  12657.                          time left is taken to be the total of all of these
  12658.                          values.)
  12659.  
  12660.                     ANSI - 1, T, Y or G for ANSI graphics mode
  12661.  
  12662.                     AVATAR - 1, T or Y for AVATAR graphics mode
  12663.  
  12664.                     PAGEPAUSING - 1, T or Y if user wishes a pause at end of
  12665.                          screen
  12666.  
  12667.                     SCREENLENGTH - Number of lines on user's screen
  12668.  
  12669.                     SCREENCLEARING - 1, T or Y if screen clearing mode is on
  12670.  
  12671.                     SECURITY - The user's security level / access level
  12672.  
  12673.                     CITY - City the user is calling from
  12674.  
  12675.                     NODE - Node number user is connected to
  12676.  
  12677.                     SYSOPNAME - Full name of the sysop
  12678.  
  12679.                     SYSOPFIRSTNAME - The sysop's first name(s)
  12680.  
  12681.                     SYSOPLASTNAME - The sysop's last name
  12682.  
  12683.                     SYSTEMNAME - Name of the BBS
  12684.  
  12685.                As an example of how to define custom door information file
  12686.                formats, consider the following imaginary file format, which we
  12687.                will name DROPINFO.TXT:
  12688.  
  12689.                     Brian Pirie         <-- User name
  12690.                     0                   <-- Local mode
  12691.                     COM1:               <-- Serial port to use
  12692.                     9600                <-- BPS rate
  12693.                     22:30:15 05-08-95   <-- File creation time
  12694.                     35                  <-- Time remaining (in minutes)
  12695.                     1                   <-- ANSI mode
  12696.                     Ottawa, Canada      <-- Location
  12697.  
  12698.                This format would be defined in an OpenDoors configuration file
  12699.                as follows:
  12700.  
  12701.  
  12702.  
  12703. ===============================================================================
  12704. OpenDoors 6.00 Manual                                          End of Page 231
  12705.  
  12706.                     CustomFileName DROPINFO.TXT
  12707.                     CustomFileLine USERNAME
  12708.                     CustomFileLine LOCALMODE
  12709.                     CustomFileLine COMPORT
  12710.                     CustomFileLine MODEMBPS
  12711.                     CustomFileLine IGNORE
  12712.                     CustomFileLine MINUTESLEFT
  12713.                     CustomFileLine ANSI
  12714.                     CustomFileLine CITY
  12715.  
  12716.                Notice that the first "CustomFileLine" keyword in the
  12717.                configuration file corresponds to the first line in our
  12718.                DROPINFO.TXT file, the second "CustomFileLine" to the second
  12719.                line, and so on. Also notice that the keyword "IGNORE" is used
  12720.                for the line that contains the file creation time, since there
  12721.                is no CustomFileLine keyword that allows you to read this
  12722.                information.
  12723.  
  12724.  
  12725.  
  12726.  
  12727.  
  12728.  
  12729.  
  12730.  
  12731.  
  12732.  
  12733.  
  12734.  
  12735.  
  12736.  
  12737.  
  12738.  
  12739.  
  12740.  
  12741.  
  12742.  
  12743.  
  12744.  
  12745.  
  12746.  
  12747.  
  12748.  
  12749.  
  12750.  
  12751.  
  12752.  
  12753.  
  12754.  
  12755.  
  12756.  
  12757.  
  12758. ===============================================================================
  12759. OpenDoors 6.00 Manual                                          End of Page 232
  12760.  
  12761. MULTIPLE PERSONALITY SYSTEM
  12762. -------------------------------------------------------------------------------
  12763.  
  12764.                The OpenDoors Multiple Personality System allows  the DOS
  12765.                version of OpenDoors to support multiple sysop function key /
  12766.                status line "personalities". Most commonly, you will use this
  12767.                feature in conjunction with the "Personality" setting in the
  12768.                OpenDoors configuration file, to allow the sysop to choose one
  12769.                of the built-in personalities that most closely mimics the BBS
  12770.                software they are using. OpenDoors includes the following
  12771.                personalities:
  12772.  
  12773.                     Configuration Keyword         Manifest constant
  12774.                     -----------------------------------------------------------
  12775.                     Standard                      PER_OPENDOORS
  12776.                     PCBoard                       PER_PCBOARD
  12777.                     RemoteAccess                  PER_RA
  12778.                     Wildcat                       PER_WILDCAT
  12779.  
  12780.                The PCBoard, RemoteAccess and Wildcat personalities mimic the
  12781.                status lines and function keys used by the BBS packages with
  12782.                those names. The Standard personality, which is the personality
  12783.                used by default, is a trimmed down version of the status lines
  12784.                provided by OpenDoors 4.10 and earlier.
  12785.  
  12786.                In addition to using the personalities supplied with OpenDoors,
  12787.                you can create your own personalities. This simply involves
  12788.                writing a function which OpenDoors will call to setup the sysop
  12789.                function keys and to display the status line.
  12790.  
  12791.                Include the following line before your first call to any
  12792.                OpenDoors function:
  12793.  
  12794.                     od_control.od_mps = INCLUDE_MPS;
  12795.  
  12796.                to include the multiple personality system in your program. This
  12797.                also enables the Personality setting in the configuration file,
  12798.                if you are using the configuration file system.
  12799.  
  12800.                You can set the default personality to be used by OpenDoors by
  12801.                setting od_control.od_default_personality to one of the manifest
  12802.                constants listed in the table above. If you have included the
  12803.                multiple personality system in your program, this setting will
  12804.                determine the personality to use if the "Personality" option is
  12805.                not set in the configuration file, and your program does not
  12806.                later change the personality using the od_set_personality()
  12807.                function. If you do not include the multiple personality system
  12808.                in your program, this setting will determine the personality
  12809.                that will always be used.
  12810.  
  12811.                Creating your own personality involves writing a single
  12812.                function.. Whenever OpenDoors needs to perform an operation that
  12813. ===============================================================================
  12814. OpenDoors 6.00 Manual                                          End of Page 233
  12815.  
  12816.                involves the personality, it will call this function, passing
  12817.                one of the following message values:
  12818.  
  12819.                PEROP_INITIALIZE    Initialize the personality, installing any
  12820.                                    custom function keys.
  12821.                PEROP_DEINITIALIZE  Deinitialize the personality, returning any
  12822.                                    changed settings to their original values.
  12823.                PEROP_CUSTOMKEY     Indicates that a custom function key has
  12824.                                    been pressed.
  12825.                PEROP_DISPLAYx      Where x is a number from 1 to 10. Indicates
  12826.                                    that the specified status line should be
  12827.                                    drawn from scratch.
  12828.                PEROP_UPDATEx       Where x is a number from 1 to 10. Indicates
  12829.                                    that the specified status line should be
  12830.                                    updated to reflect any changes.
  12831.  
  12832.                If you have enabled the multiple personality system by setting
  12833.                od_control.od_mps to INCLUDE_MPS, you can install your
  12834.                personality function into OpenDoors by calling
  12835.                od_add_personality(). When you call od_add_personality(), you
  12836.                supply a string containing the name of the personality, along
  12837.                with the top and bottom output line numbers to use. These line
  12838.                numbers specify the portion of the screen to use for door
  12839.                output, leaving the remainder of the screen available for
  12840.                displaying the personality's status line. Once the personality
  12841.                has been installed into OpenDoors, it can be selected by the
  12842.                sysop using the "Personality" configuration file option, or
  12843.                manually activated using the od_set_personality() function. For
  12844.                more information on the od_add_personality() function, see page
  12845.                47.
  12846.  
  12847.                You can make your personality function the default personality
  12848.                by setting od_control.od_default_personality to point to your
  12849.                personality function. As is the case with the built-in
  12850.                personalities, this setting will be used as the default
  12851.                personality if you have enabled the multiple personality system
  12852.                by setting od_control.od_mps to INCLUDE_MPS. If you have not
  12853.                enabled the multiple personality system in this manner, your
  12854.                personality function will become the one and only personality
  12855.                used within your program. When creating your own personality,
  12856.                you can use the od_control.od_page_statusline variable to set
  12857.                which status line (if any) will be activated when the user pages
  12858.                the system operator.
  12859.  
  12860.  
  12861.  
  12862.  
  12863.  
  12864.  
  12865.  
  12866.  
  12867.  
  12868. ===============================================================================
  12869. OpenDoors 6.00 Manual                                          End of Page 234
  12870.  
  12871. LOG FILE SYSTEM
  12872. -------------------------------------------------------------------------------
  12873.  
  12874.                In order for the system operator to monitor system activity and
  12875.                diagnose problems that have occurred while the system was
  12876.                unattended, it is common for BBS software and door programs to
  12877.                record major events in a log file. This log file typically
  12878.                records the date and time of evens such as a user logging on or
  12879.                off, transferring files, sending messages, paging the system
  12880.                operator, and similar activities. Sometimes the system operator
  12881.                will configure all of the pieces of software running on a
  12882.                particular node to write to a single log file. In other cases,
  12883.                the system operator will prefer to have each program write to
  12884.                its own log file. However, software serving one line of a multi-
  12885.                node BBS system should never attempt to write to the same log
  12886.                file that is used by another node.
  12887.  
  12888.                OpenDoors uses the "FrontDoor format" log file standard. This
  12889.                was chosen as it is a clearly documented format that is quickly
  12890.                becoming the standard for bulletin board software log files. A
  12891.                segment from a log file produced by OpenDoors is listed below.
  12892.  
  12893.                          ----------  Thu 25 Feb 93, Vote 6.00
  12894.                          > 19:42:23  Brian Pirie entering door
  12895.                          > 19:50:55  User paging system operator
  12896.                          > 19:51:02  Entering sysop chat mode
  12897.                          > 20:05:41  Terminating sysop chat mode
  12898.                          > 20:18:32  User time expired, exiting door
  12899.  
  12900.                To enable the OpenDoors log file system, simply include the
  12901.                following line before your first call to any OpenDoors function:
  12902.  
  12903.                     od_control.od_logfile = INCLUDE_LOGFILE;
  12904.  
  12905.                When OpenDoors is initialized, it will open the log file and
  12906.                begin logging activities, unless logging has been disabled with
  12907.                the od_control.od_logfile_disable variable. The log file name
  12908.                will be taken from the od_control.od_logfile_name variable,
  12909.                which is usually set by the configuration file. If no logfile
  12910.                name has been set, OpenDoors will use the logfile named
  12911.                DOOR.LOG. Upon opening the log file, OpenDoors will write an
  12912.                entry indicating the time at which the use entered the door.
  12913.  
  12914.                The od_control.od_prog_name variable sets the program name that
  12915.                is written to the log file immediately after the current date
  12916.                information. If this variable is not set, OpenDoors will write
  12917.                its own name and version information in this place.
  12918.  
  12919.                When the OpenDoors log file system is enabled, OpenDoors will
  12920.                automatically produce logfile entries for the following events:
  12921.  
  12922.                          - User paging sysop, beginning of chat, end of chat
  12923. ===============================================================================
  12924. OpenDoors 6.00 Manual                                          End of Page 235
  12925.  
  12926.                          - Sysop entering or returning from DOS shell
  12927.                          - User inactivity timeout or user time expired
  12928.                          - Sysop dropping user back to BBS
  12929.                          - Sysop hanging up on user, sysop locking out user
  12930.                          - User hanging up on BBS
  12931.                          - Your program calling the od_exit() function
  12932.  
  12933.  
  12934.  
  12935.  
  12936.  
  12937.  
  12938.  
  12939.  
  12940.  
  12941.  
  12942.  
  12943.  
  12944.  
  12945.  
  12946.  
  12947.  
  12948.  
  12949.  
  12950.  
  12951.  
  12952.  
  12953.  
  12954.  
  12955.  
  12956.  
  12957.  
  12958.  
  12959.  
  12960.  
  12961.  
  12962.  
  12963.  
  12964.  
  12965.  
  12966.  
  12967.  
  12968.  
  12969.  
  12970.  
  12971.  
  12972.  
  12973.  
  12974.  
  12975.  
  12976.  
  12977.  
  12978. ===============================================================================
  12979. OpenDoors 6.00 Manual                                          End of Page 236
  12980.  
  12981. MAKING DOORS MULTI-NODE-AWARE
  12982. -------------------------------------------------------------------------------
  12983.  
  12984.                While the majority of BBS systems have only a single phone line,
  12985.                allowing only one user to access the system at a time, there are
  12986.                also many multi-node BBS systems. On such systems, it is quite
  12987.                possible that more than one user may be using your door program
  12988.                simultaneously. OpenDoors itself is designed for both single-
  12989.                node and multi-node operation. However, if you want your program
  12990.                to operate correctly on multi-node systems, there are a number
  12991.                of concurrency issues that you must keep in mind when writing
  12992.                your own code.
  12993.  
  12994.                Some door programs are designed to behave on multi-node systems
  12995.                just as they would on single-line BBSes. Others add special
  12996.                features only possible in multi-node environments. For instance,
  12997.                you may want to permit users to interact or chat with one
  12998.                another in "real time". Many simple doors may not require any
  12999.                special attention to multi-node capabilities. However, if your
  13000.                door must access any data files or other resources that are to
  13001.                be shared among nodes, it is necessary to carefully coordinate
  13002.                access to these resources.
  13003.  
  13004.                There are two primary issues that are often of concern when
  13005.                creating door programs for multi-node systems. The first issue
  13006.                discussed below is how to coordinate concurrent file access
  13007.                between multiple node. The second topic we will deal with is the
  13008.                installation of door programs on multi-node systems.
  13009.  
  13010.  
  13011.  
  13012. CONCURRENT FILE ACCESS
  13013. -------------------------------------------------------------------------------
  13014.  
  13015.                One of the most important issues that arises when writing door
  13016.                programs for multi-node systems is how to coordinate
  13017.                simultaneous access to a single data file by multiple instances
  13018.                of your program. While it is generally safe to have multiple
  13019.                nodes reading simultaneously from a single file, having multiple
  13020.                nodes updating a file without any coordination can lead to lost
  13021.                updates and other problems. Consider, for example, the EX_VOTE.C
  13022.                example program that is included in your OpenDoors package. When
  13023.                the user votes on a poll, EX_VOTE.C must update the total number
  13024.                of votes for the user's answer. Such a program that is only
  13025.                intended for single node operation could do this by simply
  13026.                reading the current number of votes for the appropriate option,
  13027.                adding one to this total, and writing the updated total back to
  13028.                the file. However, if this approach where to be used on a multi-
  13029.                node system, it is quite possible that two users would vote on
  13030.                the same poll after both nodes have read the poll record into
  13031.                memory. In this situation, one node would add one to the total
  13032.                number of votes for the poll record that it has in memory, and
  13033. ===============================================================================
  13034. OpenDoors 6.00 Manual                                          End of Page 237
  13035.  
  13036.                write the updated information to the file. The second node would
  13037.                then add one to its total, without reading the updated
  13038.                information written by the first node. When the second node then
  13039.                writes this information to the file, it overwrites the first
  13040.                node's total with its own. The final effect is that the second
  13041.                user's vote overwrites the first, and so the first user's vote
  13042.                is lost.
  13043.  
  13044.                The solution to this problem is to lock a file unit for the
  13045.                entire update operation, to prevent other nodes from accessing
  13046.                the unit at the same time. This unit could be the entire file,
  13047.                or only a single record in the file. EX_VOTE.C locks its entire
  13048.                file when performing an update operation, but in other cases it
  13049.                may be more appropriate to only lock a single record in the
  13050.                file. The important thing to understand is that when one node
  13051.                locks a file unit, other nodes much wait until the first node is
  13052.                finished the update operation. This means that if one node is
  13053.                updating information that other nodes could possibly need access
  13054.                to, it should always perform the lock, read, write and unlock
  13055.                cycle as quickly as possible.
  13056.  
  13057.                Let's look again at the approach taken by EX_VOTE.C. After the
  13058.                user has indicated which option he/she wishes to vote on, Vote
  13059.                attempts to open the file for exclusive access. By doing this,
  13060.                EX_VOTE.C in effect locks the entire file for the duration that
  13061.                it has the file open. If another node attempts to open the file
  13062.                while one node has it locked, the open operation will fail, and
  13063.                the C runtime library will set the errno variable to EACCES.
  13064.                This, in effect, tells you that another node is currently
  13065.                working on the file, and that you must wait your turn. In this
  13066.                case, EX_VOTE.C continues to retry the open operation until the
  13067.                other node is finished its update, at which time the open
  13068.                operation will succeed. This approach will even work when there
  13069.                are many nodes that are attempting to update the file at the
  13070.                same time. Whichever node first attempts to open the file will
  13071.                gain exclusive access to the file, and any additional nodes are
  13072.                forced to wait for access to the file. When one node finishes
  13073.                with the file, another node will gain access to the file
  13074.                (whichever happens to be the next node to re-attempt the open
  13075.                operation). This process continues until all waiting nodes have
  13076.                had a chance to perform their update. EX_VOTE.C will repeatedly
  13077.                try to open the file for up to 20 seconds, after which time it
  13078.                will give up, reporting an error which indicate that it is
  13079.                unable to access the file. During this waiting process,
  13080.                EX_VOTE.C repeatedly calls od_kernel(), so that sysop function
  13081.                keys, carrier detection and other essential door operations can
  13082.                continue to be performed.
  13083.  
  13084.                After EX_VOTE.C has successfully secured exclusive access to the
  13085.                file, it first reads the record that it is going to update. It
  13086.                is important that this be done after the file unit is locked, in
  13087.                order to ensure that the copy of the record in memory matches
  13088. ===============================================================================
  13089. OpenDoors 6.00 Manual                                          End of Page 238
  13090.  
  13091.                what is stored in the file. EX_VOTE.C then updates the record
  13092.                based on the question on which the user has voted, writes this
  13093.                information back to the file. EX_VOTE.C then immediately closes
  13094.                the file, allowing other nodes to also access the file.
  13095.                EX_VOTE.C is very carefully designed so that the file update
  13096.                operation can never be interrupted (for instance, no OpenDoors
  13097.                functions are called, which could detect a time-out and
  13098.                terminate the program while a file update operation is in
  13099.                progress), or delayed until the user makes a response. As such,
  13100.                the file unit is always unlocked (in this case, closed) within a
  13101.                fraction of a second after it was locked, or order that other
  13102.                nodes will never have to wait long for access to the file.
  13103.  
  13104.                Here I have presented a detailed account of how EX_VOTE.C
  13105.                handles multi-node file access. While all of the details
  13106.                involved in coordinating multiple file access can be
  13107.                overwhelming at first, they will begin to come naturally to you,
  13108.                as you begin to always think in terms of multi-node scenarios.
  13109.                To summarize, the important elements that are typically involved
  13110.                in multi-node file access are:
  13111.  
  13112.                A. Decide on an appropriate file unit to lock for your
  13113.                   application. In simple cases, this can be the entire file.
  13114.                   In other cases, you may wish to lock individual file
  13115.                   records, using the appropriate runtime library functions.
  13116.  
  13117.                B. Always perform update operations in lock, read, update,
  13118.                   write, unlock cycles on individual file units. If there is a
  13119.                   chance that other nodes will also need to access the file
  13120.                   unit, ensure that the update operation cannot be interrupted
  13121.                   or delayed until a user makes a response.
  13122.  
  13123.                After you have designed your program for concurrent file access,
  13124.                how can you test it? If you don't have a multi-node BBS system
  13125.                that you have access to, you can perform most of your testing
  13126.                under a multitasking environment, with multiple copies of your
  13127.                program running in different windows.
  13128.  
  13129.  
  13130.  
  13131.  
  13132.  
  13133.  
  13134.  
  13135.  
  13136.  
  13137.  
  13138.  
  13139.  
  13140.  
  13141.  
  13142.  
  13143. ===============================================================================
  13144. OpenDoors 6.00 Manual                                          End of Page 239
  13145.  
  13146. MULTI-NODE CONFIGURATION
  13147. -------------------------------------------------------------------------------
  13148.  
  13149.                A second issue that you may want to bear in mind is how door
  13150.                programs are typically setup on multi-node systems.
  13151.                Unfortunately, this may differ considerable depending upon which
  13152.                BBS software is being used. However, some of the issues that you
  13153.                may have to consider discussed below:
  13154.  
  13155.                A. Your program must be able to locate the correct door
  13156.                   information file for the appropriate node. Most BBS systems
  13157.                   make separate door information files available to each node
  13158.                   by one of the following means:
  13159.  
  13160.                          - By naming each node's door information file
  13161.                            uniquely. (e.g. DORINFO1.DEF, DORINFO2.DEF.)
  13162.  
  13163.                          - By having a separate directory for each node's door
  13164.                            information file. (e.g. \NODE1\DOOR.SYS,
  13165.                            \NODE2\DOOR.SYS, etc.)
  13166.  
  13167.                   In the first case, OpenDoors can automatically select the
  13168.                   correct door information file, assuming that it knows which
  13169.                   node it is running on (see item C, below). In the later
  13170.                   case, you must tell OpenDoors which directory it must look
  13171.                   in to find the appropriate door information file. You may do
  13172.                   this by any of the following means:
  13173.  
  13174.                          - By specifying the location of the file on the
  13175.                            command line, if od_parse_cmd_line() is used.
  13176.  
  13177.                          - By providing a configuration file keyword to set
  13178.                            the door information file location for each node.
  13179.  
  13180.                          - By providing a different configuration file for
  13181.                            each node (See item B, below).
  13182.  
  13183.                B. If you are using the OpenDoors configuration file system,
  13184.                   node-specific options should not be used if each node is
  13185.                   accessing the same configuration file. While it is possible
  13186.                   to have a different configuration file for each node (the
  13187.                   filename can be specified on the command line if
  13188.                   od_parse_cmd_line() is used), in most cases the same
  13189.                   configuration file will be used for all nodes. In this case,
  13190.                   the node number, serial port information, and possible door
  13191.                   information file location operations should not be used. If
  13192.                   you are basing your configuration file on the example
  13193.                   DOOR.CFG file that is included in the OpenDoors package, you
  13194.                   may want to remove these options from the file.
  13195.  
  13196.                C. In many cases, your program must also be able to determine
  13197.                   which node it is running under. If this information is
  13198. ===============================================================================
  13199. OpenDoors 6.00 Manual                                          End of Page 240
  13200.  
  13201.                   available in the door information file, or is stored in a
  13202.                   TASK environment variable, OpenDoors will automatically set
  13203.                   the appropriate node number in od_control.od_node.
  13204.                   Otherwise, if your program requires this information, it
  13205.                   should be specified on the program's command line. The
  13206.                   od_parse_cmd_line() function supports this option. Reasons
  13207.                   that your program might need to know the current node number
  13208.                   include:
  13209.  
  13210.                          - In order for OpenDoors to display this information
  13211.                            correctly on the status line.
  13212.  
  13213.                          - In order to determine which configuration file to
  13214.                            read or which node directory in which to look for
  13215.                            the door information file.
  13216.  
  13217.                          - In order for OpenDoors to know which door
  13218.                            information file to read (e.g. DORINFO1.DEF,
  13219.                            DORINFO2.DEF. etc.)
  13220.  
  13221.                          - In order to provide any form of real-time
  13222.                            interaction between nodes, such as inter-node chat.
  13223.  
  13224.                D. If your program is running under MS-DOS, and multi-node file
  13225.                   access is being coordinated by locking part or all of a
  13226.                   file, the SHARE.EXE utility must be installed.
  13227.  
  13228.  
  13229.  
  13230.  
  13231.  
  13232.  
  13233.  
  13234.  
  13235.  
  13236.  
  13237.  
  13238.  
  13239.  
  13240.  
  13241.  
  13242.  
  13243.  
  13244.  
  13245.  
  13246.  
  13247.  
  13248.  
  13249.  
  13250.  
  13251.  
  13252.  
  13253. ===============================================================================
  13254. OpenDoors 6.00 Manual                                          End of Page 241
  13255.  
  13256.  7777777
  13257.       77
  13258.      77
  13259.     77
  13260.    77
  13261.   77
  13262.  77
  13263. -------------------------------------------------------------------------------
  13264. CHAPTER 7 - TROUBLESHOOTING AND GETTING ASSISTANCE WITH OPENDOORS
  13265.  
  13266.  
  13267.  
  13268.  
  13269. ABOUT THIS CHAPTER
  13270. -------------------------------------------------------------------------------
  13271.  
  13272.                This chapter is perhaps the most important section of this
  13273.                entire manual. Here, we provide detailed instructions to help
  13274.                you in tracing the source of problems in programs written with
  13275.                OpenDoors. Included in this chapter is a step-by-step OpenDoors
  13276.                troubleshooting guide and a chart listing common problems and
  13277.                their solutions. Also included in this chapter is information on
  13278.                the many means available to you for getting more help with
  13279.                OpenDoors, including the OpenDoors support BBS, the OpenDoors
  13280.                EchoMail conference, and how to get in touch with me. It is
  13281.                strongly encouraged that you take the time to read through this
  13282.                chapter.
  13283.  
  13284.  
  13285.  
  13286. TROUBLESHOOTING PROBLEMS
  13287. -------------------------------------------------------------------------------
  13288.  
  13289.                If you are experiencing difficulty with a program that you are
  13290.                writing using OpenDoors, it is suggested that you follow the
  13291.                steps listed below in order to quickly solve your problem. Also,
  13292.                be sure to check to "solutions to common problems" section of
  13293.                this manual. There are many common difficulties which people
  13294.                have with OpenDoors, that can easily be fixed using the
  13295.                instructions in the "common solutions" section. Also, if you are
  13296.                having difficulty solving a problem yourself, do not hesitate to
  13297.                get in touch with me, as I am always happy to help with any
  13298.                problems. In addition, you may find the other means of OpenDoors
  13299.                support (described latter in this chapter), invaluable in
  13300.                solving difficulties with OpenDoors.
  13301.  
  13302.                Keep in mind that most programs you write will have some "bugs"
  13303.                to begin with, and you should expect to spend at least 50% of
  13304.                any programming project tracing down and solving errors and
  13305.                bugs. While it would be nice if every program written worked
  13306.                correctly the first time, it is a fact of life that debugging is
  13307.                and always has been an important part of the software life-
  13308. ===============================================================================
  13309. OpenDoors 6.00 Manual                                          End of Page 242
  13310.  
  13311.                cycle. In fact, what most often separates the good programs from
  13312.                the bad is the amount of time their programmer's spend debugging
  13313.                and improving them. Unfortunately, it is difficult, if not
  13314.                impossible, to come up with a "magic formula" for debugging
  13315.                software. Debugging software is really more of an art than a
  13316.                science. However, there are some basic guidelines, which if
  13317.                followed, can greatly ease the task of software debugging.
  13318.  
  13319.                As with all problem solving, the secret to software debugging
  13320.                lies in obtaining as much information about the problem as
  13321.                possible. While it is sometimes possible to solve a bug by
  13322.                making intuitive changes in your program, or in re-writing a
  13323.                piece of code to solve the problem by a different means,
  13324.                debugging most often requires more of a "planned attack". This
  13325.                planned attack generally involves little more than learning as
  13326.                much about what is going wrong as possible. The first step in
  13327.                solving a bug usually lies in locating the source of the
  13328.                problem. Once you have located the problem, solving it is often
  13329.                a relatively simple procedure. In locating the source of your
  13330.                bug, the use of a software debugger, such as the one built into
  13331.                the Turbo C(++) / Borland C++ integrated development
  13332.                environment, can be invaluable.
  13333.  
  13334.                When debugging programs written with OpenDoors, you should also
  13335.                follow the steps listed below, in order to obtain more
  13336.                information related to the problem you are trying to solve:
  13337.  
  13338.                1.)  Re-read the section(s) of this manual, your Turbo C(++) /
  13339.                     Borland C++ manuals and your program's source code, which
  13340.                     apply to the problem you are experiencing.
  13341.  
  13342.                2.)  Check the solutions to common problems section below. The
  13343.                     most common problems with OpenDoors can be solved using
  13344.                     this simple chart.
  13345.  
  13346.                3.)  Check the value in the od_errno variable, which will often
  13347.                     provide vital clues as to the source of the problem. Use of
  13348.                     the od_errno variable is described in the section below.
  13349.  
  13350.                4.)  If you are still stuck, please feel more than free to get
  13351.                     in touch with me! (see the end of this chapter for
  13352.                     information on reaching me) I am always more than happy to
  13353.                     help with any OpenDoors or general programming problems!
  13354.  
  13355.  
  13356.  
  13357.  
  13358.  
  13359.  
  13360.  
  13361.  
  13362.  
  13363. ===============================================================================
  13364. OpenDoors 6.00 Manual                                          End of Page 243
  13365.  
  13366. SOLUTIONS TO COMMON PROBLEMS
  13367. -------------------------------------------------------------------------------
  13368.  
  13369.                Below, several common difficulties with OpenDoors are listed,
  13370.                along with suggested solutions to these problems. If you are
  13371.                experiencing any difficulty with a program that you have written
  13372.                with OpenDoors, we would suggest that you read this section
  13373.                thoroughly. Here, the common problem is listed in the left
  13374.                margin, and the solutions listed on the right portion of the
  13375.                page.
  13376.  
  13377.  
  13378. -------------------------------------------------------------------------------
  13379. PROGRAM        1.) Check that the compiler is able to locate the OpenDoors
  13380. WON'T          header file, "OPENDOOR.H". This can be accomplished either by
  13381. COMPILE        placing this header file in the same directory as your other
  13382.                header files (such as STDIO.H, etc.), or by placing the header
  13383.                file in the current directory.
  13384.  
  13385.                2.) Be sure that you are linking your program with the correct
  13386.                library for the memory model you are using. (See the section on
  13387.                compiling with OpenDoors). Also be sure that both the source
  13388.                code file for your program (such as EX_VOTE.C) and the library
  13389.                file are listed in your project file, and that the project file
  13390.                is loaded. For more information on compiling programs written
  13391.                with OpenDoors, see page 22.
  13392.  
  13393.                3.) If you have tried the above solutions, and your program
  13394.                still won't compile, then the problem is most likely an error in
  13395.                your source code file. If you are unable to resolve your
  13396.                problem, feel free to get in touch with me.
  13397.  
  13398.  
  13399. -------------------------------------------------------------------------------
  13400. SCREEN         If you are using the od_clr_scr() function to clear the screen,
  13401. WILL NOT       but are not getting any results, this is likely because the user
  13402. CLEAR          online has screen clearing turned off. If you wish to force
  13403.                screen clearing regardless of the user's screen clearing
  13404.                settings (this is probably not a good idea), use the function
  13405.                call od_disp_emu("\xc", TRUE);
  13406.  
  13407.  
  13408. -------------------------------------------------------------------------------
  13409. FIXUP          This problem was probably caused by a mismatch between your
  13410. OVERFLOW       memory model selection in your compiler, and the memory model
  13411. ERROR          library you are using. See the section on compiling programs
  13412.                with OpenDoors for more information on the correct library you
  13413.                should be using for your memory model selection.
  13414.  
  13415.  
  13416.  
  13417.  
  13418. ===============================================================================
  13419. OpenDoors 6.00 Manual                                          End of Page 244
  13420.  
  13421. OPENDOORS SUPPORT
  13422. -------------------------------------------------------------------------------
  13423.  
  13424.                The powerful and easy to use door toolkit and this comprehensive
  13425.                manual are only two portions of how OpenDoors helps you to write
  13426.                BBS door and similar programs. The third element of OpenDoors is
  13427.                the extensive OpenDoors support mechanisms. The OpenDoors email
  13428.                conference and support BBS each give you a chance to share ideas
  13429.                and source code with other OpenDoors programmers. A lot of
  13430.                information concerning OpenDoors, along with the newest version
  13431.                and online registration, is available through the OpenDoors
  13432.                World Wide Web site. In addition to these sources, I am also
  13433.                more than happy to answer any of your questions, or hear any
  13434.                suggestions for future versions of OpenDoors. The remainder of
  13435.                this chapter provides more information on the various sources of
  13436.                OpenDoors support. Also keep your eyes open for the "OpenDoors
  13437.                Tech Journal", that is produced on a regular basis by the users
  13438.                of OpenDoors. Included in this newsletter is information on
  13439.                OpenDoors and future versions, questions and answers about
  13440.                OpenDoors and BBS door / utility programming in general, sample
  13441.                source code, and much more.
  13442.  
  13443.  
  13444.  
  13445. THE OPENDOORS SUPPORT BBS
  13446. -------------------------------------------------------------------------------
  13447.  
  13448.                One means of receiving OpenDoors support is via the OpenDoors
  13449.                BBS. Below is an outline of some of what is available from the
  13450.                OpenDoors BBS:
  13451.  
  13452.                     -  The newest version of this package is always available
  13453.                        for download.
  13454.  
  13455.                     -  Also available for download is example source code and
  13456.                        other files which you may find helpful when writing
  13457.                        programs with OpenDoors.
  13458.  
  13459.                     -  Access to the OpenDoors conference where OpenDoors
  13460.                        programmers can share ideas, source code, and receive
  13461.                        help with difficulties or with learning OpenDoors.
  13462.  
  13463.                     -  Get in touch with me with any questions, comments,
  13464.                        suggestions or bug reports.
  13465.  
  13466.                     -  Other files by yours truly, which may be of use in you
  13467.                        programming, such as a registration key system, and so
  13468.                        on.
  13469.  
  13470.                All users receive full access upon their first call to the
  13471.                OpenDoors BBS. The North American phone number for the support
  13472.                BBS is:
  13473. ===============================================================================
  13474. OpenDoors 6.00 Manual                                          End of Page 245
  13475.  
  13476.  
  13477.                                    +1 (613) 599-5554
  13478.  
  13479.                The OpenDoors support BBS also has a FidoNet address, 1:243/8.
  13480.                If you are interested in a list of files available from the
  13481.                support BBS, simply file-request "FILES". To receive the newest
  13482.                version of OpenDoors, you can file-request "ODOORS".
  13483.  
  13484.  
  13485.  
  13486. THE OPENDOORS WORD WIDE WEB SITE
  13487. -------------------------------------------------------------------------------
  13488.  
  13489.                The OpenDoors World Wide Web site has been setup to provide up-
  13490.                to-date information on OpenDoors. This includes news concerning
  13491.                OpenDoors, OpenDoors tips and techniques, pointers to other
  13492.                sources of OpenDoors support, online registration and access to
  13493.                the newest version of OpenDoors.
  13494.  
  13495.                The current URL (address) of the OpenDoors Web site is:
  13496.  
  13497.                     http://omega.scs.carleton.ca/~ug930227/opendoor.html
  13498.  
  13499.                However, I plan on moving this to a new location some time this
  13500.                year. If you are unable to reach the OpenDoors Web site through
  13501.                the above URL, please get in touch with me, and I will be able
  13502.                to tell you where it has moved to.
  13503.  
  13504.  
  13505.  
  13506. THE OPENDOORS CONFERENCE
  13507. -------------------------------------------------------------------------------
  13508.  
  13509.                The OpenDoors conference is devoted to OpenDoors and BBS / door
  13510.                / BBS utility programming in general. The OpenDoors conference
  13511.                serves as a place where people working with OpenDoors can share
  13512.                ideas, source code examples, and other tricks and techniques.
  13513.                Through the OpenDoors conference you can receive help with
  13514.                OpenDoors and programming in general. Also available through the
  13515.                OpenDoors conference is information on future versions of
  13516.                OpenDoors and recent developments of concern to BBS door and
  13517.                utility programmers. The OpenDoors conference is also a place
  13518.                for suggestions for future versions of OpenDoors, OpenDoors bug
  13519.                reports, a place to announce the availability of your programs,
  13520.                and much more information of interest to programmers working
  13521.                with OpenDoors.
  13522.  
  13523.                You can become involved in the OpenDoors Conference by the
  13524.                following means:
  13525.  
  13526.                - The OpenDoors conference is available as an Internet mailing
  13527.                  list. to subscribe, send email to listserv@hms.com and put
  13528. ===============================================================================
  13529. OpenDoors 6.00 Manual                                          End of Page 246
  13530.  
  13531.                  SUBSCRIBE OPENDOOR in the message body. For help on using the
  13532.                  listserver you can send email to listserv@hms.com and put
  13533.                  HELP in the message body.
  13534.  
  13535.                - The OpenDoors conference is available on the FidoNet North
  13536.                  America echo backbone, and so is available to a large number
  13537.                  of BBS systems. FidoNet capable systems may also obtain an
  13538.                  OpenDoors feed directly from the moderator, Brian Pirie.
  13539.  
  13540.  
  13541. GETTING IN TOUCH WITH ME
  13542. -------------------------------------------------------------------------------
  13543.  
  13544.                If you have any questions about OpenDoors, would like help with
  13545.                any programs that your are writing, or have any suggestions for
  13546.                future versions of OpenDoors, please feel free to get in touch
  13547.                with me. You can get in touch with me by any of the following
  13548.                means:
  13549.  
  13550.                - The best way to contact me is by Internet email. My primary
  13551.                  email address is:
  13552.  
  13553.                               pirie@msn.com
  13554.  
  13555.                  If you have difficulty contacting me through this address, I
  13556.                  may also be reached through the address:
  13557.  
  13558.                               aa522@freenet.carleton.ca
  13559.  
  13560.                - By writing a message to me in the OpenDoors support
  13561.                  conference. For more information on the OpenDoors conference,
  13562.                  see the previous section of this chapter.
  13563.  
  13564.                - By calling the OpenDoors support BBS. Information on the
  13565.                  support BBS is provided earlier on in this chapter.
  13566.  
  13567.                - By sending your question or comment by Fax. My fax number is:
  13568.  
  13569.                               +1 (613) 599-5554
  13570.  
  13571.                - By FidoNet NetMail. My address is:
  13572.  
  13573.                               1:243/8
  13574.  
  13575.                  While I would like to be able to reply to all NetMail
  13576.                  messages by CrashMail, I am afraid I simply can not afford to
  13577.                  do this. So, if you choose to send NetMail, please indicate
  13578.                  whether you would like me to reply by routed NetMail (this
  13579.                  may not work, if routed NetMail is not available in your
  13580.                  area), or to place the message on hold for you to poll and
  13581.                  pick up.
  13582.  
  13583. ===============================================================================
  13584. OpenDoors 6.00 Manual                                          End of Page 247
  13585.  
  13586.                - By conventional mail. My postal address is:
  13587.  
  13588.                               Brian Pirie
  13589.                               117 Cedarock Drive
  13590.                               Kanata ON  K2M 2H5
  13591.                               Canada
  13592.  
  13593.  
  13594.                I try to respond to all correspondences as soon as possible.
  13595.  
  13596.                If you are having some sort of difficulty with OpenDoors, the
  13597.                more detailed information you supply (such as source code to the
  13598.                program that is causing the problem, how to duplicate the
  13599.                problem, and so on), the more quickly I will be able to
  13600.                determine the source of your problem. Also, before you write
  13601.                about a problem with OpenDoors, you may wish to be sure that you
  13602.                have read and followed the instructions in the section on
  13603.                troubleshooting, found on page 242. While I do not mind taking
  13604.                the time to answer any questions related to OpenDoors, you may
  13605.                be able to save yourself the time of writing and waiting for a
  13606.                response - simply by following the instructions in the
  13607.                troubleshooting section. More often than not, the answer to
  13608.                questions I receive is already in this manual.
  13609.  
  13610.  
  13611.  
  13612.  
  13613.  
  13614.  
  13615.  
  13616.  
  13617.  
  13618.  
  13619.  
  13620.  
  13621.  
  13622.  
  13623.  
  13624.  
  13625.  
  13626.  
  13627.  
  13628.  
  13629.  
  13630.  
  13631.  
  13632.  
  13633.  
  13634.  
  13635.  
  13636.  
  13637.  
  13638. ===============================================================================
  13639. OpenDoors 6.00 Manual                                          End of Page 248
  13640.  
  13641.     A
  13642.    AAA
  13643.   AA AA
  13644.  AAAAAAA
  13645.  AA   AA
  13646.  AA   AA
  13647.  AA   AA
  13648. -------------------------------------------------------------------------------
  13649. APPENDIX A - CONTENTS OF PACKAGE
  13650.  
  13651.  
  13652.  
  13653.  
  13654.                The main OpenDoors package is distributed in the form of a
  13655.                single, compressed archive file. Thus, you should have received
  13656.                this version of OpenDoors in a file whose name began with
  13657.                ODOORS60. The files listed below should be included in your
  13658.                OpenDoors package. If any of these files are missing, you will
  13659.                probably want to look for the most recent version of OpenDoors
  13660.                from another source. Note that the medium and compact memory
  13661.                model libraries are now distributed separately from the main
  13662.                OpenDoors package.
  13663.  
  13664.                MISCALENEOUS FILES
  13665.                     FILE_ID.DIZ    Description of the OpenDoors package
  13666.                     DORINFO1.DEF   Sample door info file for testing programs
  13667.                     DOOR.CFG       Sample OpenDoors configuration file
  13668.  
  13669.                EXAMPLE PROGRAMS
  13670.                     EX_HELLO.C     A simple program using OpenDoors
  13671.                     EX_CHAT.C      Split-screen sysop chat program
  13672.                     EX_MUSIC.C     Example of ANSI music in OpenDoors
  13673.                     EX_SKI.C       Simple slalom skiing action game
  13674.                     EX_VOTE.C      Example of an online voting program
  13675.                     VOTEDOS.EXE    Compiled version of EX_VOTE.C - DOS version
  13676.                     VOTEWIN.EXE    EX_VOTE.C compiled - Windows version
  13677.                     DTRON.EXE      Free utility for running Win 95 doors
  13678.  
  13679.                THE LIBRARY FILES
  13680.                     ODOORS.LIB     DOS, Small memory model library
  13681.                     ODOORL.LIB     DOS, Large memory model library
  13682.                     ODOORH.LIB     DOS, Huge memory model library
  13683.                     ODOORW.LIB     Win32 import library (Microsoft version)
  13684.                     ODOORS60.DLL   The OpenDoors Win32 DLL
  13685.  
  13686.                THE HEADER FILE
  13687.                     OPENDOOR.H     OpenDoors header file
  13688.  
  13689.                OPENDOORS DOCUMENATION
  13690.                     ORDER.TXT      Easy-to-print order form
  13691.                     OPENDOOR.TXT   OpenDoors programmer's manual (this file)
  13692.  
  13693. ===============================================================================
  13694. OpenDoors 6.00 Manual                                          End of Page 249
  13695.  
  13696.  BBBBBB
  13697.  BB   BB
  13698.  BB   BB
  13699.  BBBBBB
  13700.  BB   BB
  13701.  BB   BB
  13702.  BBBBBB
  13703. -------------------------------------------------------------------------------
  13704. APPENDIX B - CHANGES FOR THIS VERSION
  13705.  
  13706.  
  13707.  
  13708.  
  13709.                Since version 5.00, a lot of work has gone into OpenDoors. Many
  13710.                months were spent cleaning up and restructuring the OpenDoors
  13711.                code in a process that has touched nearly every line of the
  13712.                OpenDoors code. As well as making the OpenDoors source code
  13713.                easier to maintain, this has also involved making OpenDoors more
  13714.                easily portable to 32-bit multithreaded platforms.
  13715.  
  13716.                After this effort was completed, I began work on a Win32 port of
  13717.                OpenDoors. The OpenDoors package now includes both DOS and Win32
  13718.                versions of the library, giving you the option of developing for
  13719.                one, the other, or both platforms. The Win32 version of
  13720.                OpenDoors is highly multithreaded to give you the best possible
  13721.                performance. With some exciting new BBS packages that are
  13722.                designed specifically for Windows 95/NT in the works, the Win32
  13723.                version of OpenDoors gives you a head start on developing
  13724.                applications that will integrate smoothly with these new BBS
  13725.                packages. Even if your programs will only be used with DOS-based
  13726.                BBS packages, the Win32 version of OpenDoors allows you to take
  13727.                advantage of the Windows 95 GUI, multithreading capabilities and
  13728.                flat 32-bit memory model (no more DOS 64K limitations and
  13729.                different memory models to worry about!). It also allows you to
  13730.                access services that are only available to Windows based
  13731.                programs, such as ODBC for easy database access, and MAPI for
  13732.                email, fax and other messaging.
  13733.  
  13734.                While this internal restructuring of OpenDoors and the Win32
  13735.                port of the package would be enough alone to count as a major
  13736.                new version, version 6.00 also includes many exciting new
  13737.                features, enhancements and bug fixes:
  13738.  
  13739.                - A new option, "silent mode", has been added. When operating
  13740.                  in silent mode, OpenDoor's local sysop interface is disabled,
  13741.                  so that no output is displayed on the local screen, and no
  13742.                  input is accepted from the local keyboard. Silent mode can be
  13743.                  activated by setting od_control.od_silent_mode = TRUE prior
  13744.                  to the first call to any OpenDoors function, or by specifying
  13745.                  -SILENT on the command-line (if od_parse_cmd_line() is used).
  13746.  
  13747.  
  13748. ===============================================================================
  13749. OpenDoors 6.00 Manual                                          End of Page 250
  13750.  
  13751.                - OpenDoors now fully supports RTS/CTS flow control, which is
  13752.                  enabled by default. To disable the use of the RTS/CTS lines
  13753.                  for flow control, use od_control.od_com_flow_control.
  13754.  
  13755.                - In version 5.00, the built-in serial I/O module would be
  13756.                  unable to initialize the serial port if the "Uses Serial
  13757.                  Ports" option was turned off in DesqView or other
  13758.                  multitasking environments. When this option is turned off,
  13759.                  multitasking environments typically remove the serial port
  13760.                  information from the BIOS data segment. However, it seems
  13761.                  that other serial I/O software commonly uses the default
  13762.                  address for each port if this information is not available
  13763.                  from the BIOS data area. OpenDoors 6.00 has been changed to
  13764.                  do the same thing.
  13765.  
  13766.                - OpenDoors now provides a standard command-line processing
  13767.                  function, od_parse_cmd_line(). This function provides a one-
  13768.                  step method of adding support for many common command-line
  13769.                  options to your program. This function handles options such
  13770.                  as serial port information (including non-standard serial
  13771.                  port configurations), node number information, user
  13772.                  information, drop file and configuration file locations,
  13773.                  silent mode (turns off the local interface for efficiency and
  13774.                  privacy), one step local login without a drop file, and more.
  13775.                  For details, run the included example program (votedos.exe or
  13776.                  votewin.exe) with the -help command line option. The
  13777.                  od_parse_cmd_line() function is particularly helpful in
  13778.                  several situations:
  13779.  
  13780.                          - When your program is being used on a multi-node
  13781.                            system.
  13782.                          - Allows potential users to try your program in local
  13783.                            mode by just specifying -local on the command line.
  13784.                          - Allows door information to be specified on the
  13785.                            command line, rather than through a drop file, as
  13786.                            supported by some BBS systems
  13787.                          - Allows serial port handle to be directly passed to
  13788.                            the program under Windows-based BBS systems that
  13789.                            support this.
  13790.                          - Provides customizable command-line help (in a
  13791.                            window in the Win32 version of OpenDoors).
  13792.  
  13793.                - A new function, od_sleep(), allows you to suspend program
  13794.                  execution for the specified number of milliseconds, releasing
  13795.                  time to other processes in a multitasking environment. A call
  13796.                  of od_sleep(0) will yield control to any other processes
  13797.                  without forcing program execution to be suspended if no other
  13798.                  processes are waiting.
  13799.  
  13800.                - The sysop page timing mechanism has been reworked. By
  13801.                  default, od_control.od_okaytopage is set to PAGE_USE_HOURS,
  13802.                  only allowing the sysop to be paged during the paging hours
  13803. ===============================================================================
  13804. OpenDoors 6.00 Manual                                          End of Page 251
  13805.  
  13806.                  set by od_pagestartmin and od_pageendmin. Rather than
  13807.                  allowing the sysop to be paged at any time of the day or
  13808.                  night, the default now only permits sysop paging from 8:00am
  13809.                  to 10:00pm. Setting paging start and end time to the same
  13810.                  value now correctly permits paging 24 hours a day.
  13811.  
  13812.                - OpenDoors now provides a multi-line editor function,
  13813.                  od_multiline_edit(). This editor allows the user to enter or
  13814.                  edit any information that spans multiple lines, such as email
  13815.                  messages or text files. The editor can be configured to
  13816.                  operate in full screen mode, or in any smaller area of the
  13817.                  screen that you specify. The editor is designed to be both
  13818.                  easy to use, and highly customizable.
  13819.  
  13820.                - One new feature of OpenDoors 5.00 was somehow omitted from
  13821.                  the manual. Since version 5.00, it has been possible to set
  13822.                  the name of the drop file to use by including both a path and
  13823.                  filename in the od_control.info_path variable.
  13824.  
  13825.                - All known inaccuracies and missing information from the
  13826.                  version 5.00 manual have been corrected.
  13827.  
  13828.                - The example program, ex_chat.c, has been expanded to
  13829.                  demonstrate how OpenDoor's standard chat mode can be replaced
  13830.                  with the split-screen chat mode within your own programs.
  13831.  
  13832.                - The multiple ex_vote?.c example files have been combined and
  13833.                  simplified into a single example program, as it was prior to
  13834.                  version 5.00.
  13835.  
  13836.                - A memory leak in the od_popup_menu() function has been fixed.
  13837.  
  13838.                - od_control.od_open_handle can be used to provide OpenDoors
  13839.                  with an already open serial port handle on platforms that
  13840.                  support it. Currently, this only applies to the Win32 version
  13841.                  of OpenDoors. If this variable is not set to a non-zero value
  13842.                  prior to calling the first OpenDoors function (other than
  13843.                  od_parse_cmd_line()), then OpenDoors proceeds normally,
  13844.                  opening the serial port itself, and closing the serial port
  13845.                  before exiting.
  13846.  
  13847.                - A new switch, od_emu_simulate_modem, has been added to
  13848.                  od_control. When this is set to its default value of FALSE,
  13849.                  the OpenDoors terminal emulator displays at full speed, as it
  13850.                  has always done. However, when this flag is set to TRUE, the
  13851.                  emulation functions will display text at approximately the
  13852.                  same speed as it would be displayed when sent over the modem,
  13853.                  based on the current connect speed. This allows animations to
  13854.                  be displayed locally at the same speed as they would appear
  13855.                  on the remote system. This switch affects the following
  13856.                  functions:
  13857.                     od_disp_emu()
  13858. ===============================================================================
  13859. OpenDoors 6.00 Manual                                          End of Page 252
  13860.  
  13861.                     od_send_file()
  13862.                     od_hotkey_menu()
  13863.  
  13864.                - OpenDoors now distinguishes between the serial port BPS rate
  13865.                  (od_control.baud) and the connection BPS (a new variable,
  13866.                  od_control.od_connect_speed). In situations where a separate
  13867.                  value is available for the connect speed (e.g., this caller
  13868.                  has connected at 14400 bps), OpenDoors will now display that
  13869.                  value on the status line. Currently, a separate connect speed
  13870.                  is only obtained from the DOOR.SYS drop file format.
  13871.  
  13872.                - The latest versions of the QBBS EXITINFO.BBS drop file is now
  13873.                  supported.
  13874.  
  13875.                - A new od_edit_str() flag, EDIT_FLAG_SHOW_SIZE, has been
  13876.                  added. By default, the fields shown by od_edit_str() are one
  13877.                  character larger than the number of characters that may be
  13878.                  entered. This is for esthetic reasons, so that the cursor
  13879.                  remains within the highlighted field, even after a full
  13880.                  string has been entered. However, you may prefer that the
  13881.                  highlighted area reflect the exact number of characters that
  13882.                  are permitted. This can be accomplished by setting
  13883.                  EDIT_FLAG_SHOW_SIZE.
  13884.  
  13885.                - Tab characters ('\t') are now expanded on the local display.
  13886.  
  13887.                - The new RemoteAccess 2.50 EXITINFO.BBS fields are now
  13888.                  supported. This has included the addition of the following
  13889.                  new od_control members: user_rip_ver, user_attrib3 and
  13890.                  system_last_handle.
  13891.  
  13892.                - When operating in "forced automatic local" mode (where no
  13893.                  door information file used), OpenDoors now displays a window
  13894.                  in which in prompts for the user's name at startup time. This
  13895.                  new feature can be disabled by specifying the DIS_NAME_PROMPT
  13896.                  od_control.od_disable flag.
  13897.  
  13898.                - The latest version of the SFDOORS.DAT drop file is now
  13899.                  supported. SFMAIN.DAT, SFSYSOP.DAT, SFFILE.DAT and
  13900.                  SFMESS.DAT, which are in the same format as SFDOORS.DAT, are
  13901.                  also now recognized.
  13902.  
  13903.                - A new function, od_get_input(), allows you to easily handle
  13904.                  extended keys in your program, such as arrow keys, insert and
  13905.                  function keys.
  13906.  
  13907.                - The OpenDoors configuration file system will now display an
  13908.                  error and exit the program if a particular configuration file
  13909.                  name has been specified, and that configuration file cannot
  13910.                  be found.
  13911.  
  13912.  
  13913. ===============================================================================
  13914. OpenDoors 6.00 Manual                                          End of Page 253
  13915.  
  13916.    CCCC
  13917.   CC  CC
  13918.  CC
  13919.  CC
  13920.  CC
  13921.   CC  CC
  13922.    CCCC
  13923. -------------------------------------------------------------------------------
  13924.  APPENDIX C - FUTURE VERSIONS
  13925.  
  13926.  
  13927.  
  13928.  
  13929.                While I cannot make any promises about what features and changes
  13930.                will be seen in future versions of OpenDoors, I would like to
  13931.                take a moment to tell you a bit about some of the features you
  13932.                can expect to see in future versions of OpenDoors
  13933.  
  13934.                As you are probably already aware, OpenDoors is a constantly
  13935.                evolving package. To help meet the needs of programmers working
  13936.                with OpenDoors, nearly every idea and change that is made to the
  13937.                package results from the suggestions and comments I receive from
  13938.                the people using OpenDoors. For this reason, I will most likely
  13939.                continue to produce new versions of OpenDoors for as long as
  13940.                there is a demand and ideas for upgrades. There certainly is no
  13941.                shortage of either of this right now.
  13942.  
  13943.                Some of the features that I am considering for upcoming versions
  13944.                of OpenDoors include:
  13945.  
  13946.                     -Telnet support.
  13947.  
  13948.                     - HTML support.
  13949.  
  13950.                     - Direct interfacing with new Windows 95/NT BBS packages.
  13951.  
  13952.                     - Further features to help writing multi-node door
  13953.                      programs.
  13954.  
  13955.                     -Direct interfacing with more BBS systems.
  13956.  
  13957.                     -Additional RIP graphics support, including possible
  13958.                      display of RIP images on local screen.
  13959.  
  13960.                     -Possible support for additional programming languages and
  13961.                      operating systems.
  13962.  
  13963.                     - Improvements to existing OpenDoors features, such as more
  13964.                      configuration file options, multiple log file formats,
  13965.                      and many smaller changes.
  13966.  
  13967.  
  13968. ===============================================================================
  13969. OpenDoors 6.00 Manual                                          End of Page 254
  13970.  
  13971.  DDDDD
  13972.  DD  DD
  13973.  DD   DD
  13974.  DD   DD
  13975.  DD   DD
  13976.  DD  DD
  13977.  DDDDD
  13978. -------------------------------------------------------------------------------
  13979.  APPENDIX D - SPECIAL THANKS
  13980.  
  13981.  
  13982.  
  13983.  
  13984.                There are many people who I would like to thank, for their
  13985.                suggestions, ideas and assistance in making OpenDoors what it is
  13986.                today. Among those I would like to thank are:
  13987.  
  13988.                     - Everyone who has registered OpenDoors.
  13989.  
  13990.                     - All those who participate in the OpenDoors conference,
  13991.                       who provide many suggestions, bug reports and words of
  13992.                       encouragement.
  13993.  
  13994.                     - Those who on the OpenDoors beta team. Thank-you for
  13995.                       putting up with the problems along the way. You have
  13996.                       certainly helped to make OpenDoors a better package. The
  13997.                       people who have helped to beta test OpenDoors 6.00 are:
  13998.  
  13999.                               Robert Bouman
  14000.                               Doug Crone
  14001.                               Greg Diener
  14002.                               Patrick Dixon
  14003.                               Joel Downer
  14004.                               Mike Fenton
  14005.                               Les Howie
  14006.                               Vince Jacobs
  14007.                               Scott Jibben
  14008.                               Dean Mills
  14009.                               Jimmy Rose
  14010.                               Jim Woodward
  14011.                               Timothy Ward
  14012.                               Mark Williams
  14013.  
  14014.                     - Last but not least, I would like to thank my wife, Pearl,
  14015.                       for her support during the long hours that it has taken
  14016.                       to put OpenDoors together.
  14017.  
  14018.  
  14019.  
  14020.  
  14021.  
  14022.  
  14023. ===============================================================================
  14024. OpenDoors 6.00 Manual                                          End of Page 255
  14025.  
  14026.   GGGG
  14027.  GG  GG
  14028.  GG
  14029.  GG GGGG
  14030.  GG  GG
  14031.  GG  GG
  14032.   GGGG
  14033. -------------------------------------------------------------------------------
  14034. GLOSSARY
  14035.  
  14036. ANSI           ANSI is an acronym for "American National Standards Institute".
  14037.                One of the standards approved by ANSI is a terminal display
  14038.                protocol which allows (in this case), BBS software to perform
  14039.                certain display functions such as changing the color of
  14040.                displayed text, or moving the location of the cursor on the
  14041.                screen. The majority, though not all, BBS users use terminal
  14042.                software with ANSI capabilities. Any users that do not have
  14043.                graphics display capabilities, will be using ASCII mode,
  14044.                instead. The ANSI terminal protocol is sometimes referred to as
  14045.                "ANSI graphics". It is graphic in the sense that it provides
  14046.                more visual control than an ASCII TTY terminal does, but does
  14047.                not imply any support for bit-mapped nor vector graphics.
  14048.                Compare ASCII and AVATAR.
  14049.  
  14050.  
  14051. API            API is an acronym for "Application Program(er) Interface". An
  14052.                API is a set of well documented functions, variables and data
  14053.                types that you can use to access certain services from your
  14054.                program. When you write any C program that uses standard C
  14055.                library functions such as fopen() or strcpy(), you are using a
  14056.                sort of API. When you use OpenDoors functions such as
  14057.                od_printf() or od_get_key(), you are using functions that are
  14058.                part of the OpenDoors API. Operating systems provide their own
  14059.                APIs that allow programs to gain access to operating system
  14060.                features such as screen display, file I/O and communications.
  14061.                The API provided by Microsoft Windows 95 and Windows NT is
  14062.                called the Win32 API.
  14063.  
  14064.  
  14065. ASCII          ASCII (pronounced "ass-key") is an acronym for "American
  14066.                Standard Code for Information Interchange", and is a definition
  14067.                of a set of 128 letters, number and symbols, which can be
  14068.                displayed by computer systems. Also, when used within the domain
  14069.                of BBS software, ASCII mode is often used to refer to the lack
  14070.                of any more advanced display capabilities, such as ANSI or
  14071.                AVATAR. When ASCII mode is used, characters can only be
  14072.                displayed in standard Teletype (TTY) fashion, one after another.
  14073.                Also, color and cursor positioning functions are not available
  14074.                in ASCII mode. Compare ANSI and AVATAR.
  14075.  
  14076.  
  14077.  
  14078. ===============================================================================
  14079. OpenDoors 6.00 Manual                                          End of Page 256
  14080.  
  14081. AVATAR         AVATAR is an acronym for "Advanced Video Attribute Terminal
  14082.                Assembler and Recreator". AVATAR is a graphics display protocol,
  14083.                similar to ANSI. Like ANSI-graphics, AVATAR graphics allow
  14084.                functions such as cursor positioning, and color changing.
  14085.                However, AVATAR also offers many capabilities not available from
  14086.                ANSI, and performs the same functions as ANSI much more quickly.
  14087.                AVATAR graphics is less common than both ANSI or ASCII, but is
  14088.                becoming more popular as time goes by. Compare ASCII and ANSI.
  14089.  
  14090.  
  14091. BAUD           "baud" or "baud rate" are generally used as a synonym for "BPS".
  14092.  
  14093.  
  14094. BPS            BPS is an acronym for "Bits Per Second", and refers to the rate
  14095.                at which data is being sent over a communications medium. There
  14096.                are two important BPS rates which are relevant to OpenDoors. The
  14097.                serial port BPS rate (also called the DCE rate) is the speed at
  14098.                which the computer is communicating with the local modem. The
  14099.                connect speed, on the other hand, is the speed at which the
  14100.                local modem is communicating with the remote modem. The serial
  14101.                port speed must be at least as fast as the connection speed.
  14102.                Often the serial port speed will be locked at a fixed speed that
  14103.                is higher than the fastest possible connection speed of the
  14104.                modem. For example, the serial port might be locked at a speed
  14105.                of 38400 BPS, while the modem could be connected at 28,800,
  14106.                14,400 or slower speeds. OpenDoors usually needs to know the
  14107.                serial port BPS rate in order to function correctly (as stored
  14108.                in od_control.baud). Under certain situations, OpenDoors will
  14109.                also be able to report the connection speed to you (as stored in
  14110.                od_control.od_connect_speed), although OpenDoors does never
  14111.                requires this information to operate.
  14112.  
  14113.  
  14114. BIT-MAPPED     As with Boolean values, described below, bit mapped flags
  14115. FLAGS          are used to indicate whether or not various conditions exist.
  14116.                (For example, whether or not a certain setting is enabled, or
  14117.                whether or not a particular event has occurred.) However, unlike
  14118.                Boolean variables, a single bit-mapped flag represents more than
  14119.                one of these TRUE/FALSE values. In fact, each bit (BInary
  14120.                Digit), which makes of the variable can be used to represent a
  14121.                separate TRUE/FALSE state. (ie, each bit maps to a particular
  14122.                piece of information, and hence the term "Bit Map").
  14123.  
  14124.                For an example of using bit-mapped flags, let us take a case of
  14125.                a single "unsigned char" which contains three independent
  14126.                TRUE/FALSE values. We will call this variable user_info, and it
  14127.                will indicate whether or not a user has ANSI graphics, whether
  14128.                or not the user has screen clearing turned on, and whether or
  14129.                not the user has end-of-page "more" prompts enabled. Internally,
  14130.                the bits of the user_info variable will be as follows:
  14131.  
  14132.  
  14133. ===============================================================================
  14134. OpenDoors 6.00 Manual                                          End of Page 257
  14135.  
  14136.                      Bit:  7 6 5 4 3 2 1 0
  14137.                                      | | |
  14138.                                      | | +--- ANSI Graphics
  14139.                                      | +----- Screen Clearing
  14140.                                      +------- More prompts
  14141.  
  14142.                In this case, we will have three constants which we define in
  14143.                order to simplify access to these bit-mapped flags, as follows:
  14144.  
  14145.                      #define ANSI_GRAPHICS        0x01
  14146.                      #define SCREEN_CLEARING      0x02
  14147.                      #define MORE_PROMPTS         0x04
  14148.  
  14149.                Note that normally within OpenDoors, these constants will be
  14150.                defined for you, and you will have no need to know what their
  14151.                values are, nor in which bit which piece of information is
  14152.                stored.
  14153.  
  14154.                Using bit-mapped flags, you are able to set or clear any of the
  14155.                individual flags, and check whether any of the flags are set,
  14156.                using these simple methods: (Not that a set flag is the
  14157.                equivalent of a Boolean value of "True", and a cleared flag is
  14158.                the equivalent of a Boolean value of "False".)
  14159.  
  14160.                     Set Flag:      variable |= FLAG_CONSTANT;
  14161.                     Clear Flag:    variable &=~ FLAG_CONSTANT;
  14162.                     Test Flag:     variable & FLAG_CONSTANT
  14163.  
  14164.                Where "variable" is the name of the bit-mapped flag variable,
  14165.                and "FLAG_CONSTANT" is the pre-defined constant for the
  14166.                individual setting. To return to our example, you could turn on
  14167.                the user's ANSI graphics setting by using the line:
  14168.  
  14169.                     user_info |= ANSI_GRAPHICS;
  14170.  
  14171.                and to turn off screen clearing you would:
  14172.  
  14173.                     user_info &=~ ANSI_GRAPHICS;
  14174.  
  14175.                To perform an action (such as waiting for the user to press
  14176.                [Return]/[Enter]) only if "More" prompts are enabled, you would:
  14177.  
  14178.                     if(user_info & MORE_PROMPTS)
  14179.                     {
  14180.                          ...            /* Whatever you want */
  14181.                     }
  14182.  
  14183.  
  14184.  
  14185.  
  14186.  
  14187.  
  14188. ===============================================================================
  14189. OpenDoors 6.00 Manual                                          End of Page 258
  14190.  
  14191. BOOLEAN        Many of the variables used within OpenDoors contain a
  14192. VALUES         "Boolean Value". A Boolean value is a two-state variable, who's
  14193.                states are referred to as "True" and "False'. If the variable
  14194.                contains a value of "True", it indicates that a certain
  14195.                condition is so, and if it contains a value of "False", it
  14196.                indicates that the condition is not so. For example, a Boolean
  14197.                variable "wait" might be used to indicate whether or not
  14198.                OpenDoors should wait for the user to press a key, or continue
  14199.                without waiting. In this case, a value of "True" would indicate
  14200.                that OpenDoors should wait, and a value of "False" would
  14201.                indicate that it should not wait.
  14202.  
  14203.                Note that in the C programming language, there is no actual
  14204.                Boolean variable type - usually a char or an int are used to
  14205.                store Boolean values.
  14206.  
  14207.                The constants TRUE and FALSE, as defined in the OPENDOOR.H file,
  14208.                are used to represent the two states of a Boolean value. Thus,
  14209.                to set a Boolean variable "wait" to the value of "True", you
  14210.                would use this line:
  14211.  
  14212.                          wait=TRUE;
  14213.  
  14214.                and to set the variable "wait" to "False", you would:
  14215.  
  14216.                          wait=FALSE;
  14217.  
  14218.                However, you SHOULD NOT test whether a Boolean variable is
  14219.                "True" or "False" by using the C compare (==) operator, as the
  14220.                value "True" will not always be the same numerical value.
  14221.                (Actually, the TRUE constant represents just one of many
  14222.                possible numerical values for "True"). Instead, to perform an
  14223.                action of the "wait" Boolean variable is "True", you would:
  14224.  
  14225.                          if(wait)
  14226.                          {
  14227.                               ...        /* Whatever you want */
  14228.                          }
  14229.  
  14230.                and to perform an action if the "wait" Boolean variable is
  14231.                "False', you would:
  14232.  
  14233.                          if(!wait)
  14234.                          {
  14235.                               ...       /* Whatever you want */
  14236.                          }
  14237.  
  14238.                For interest sake, Boolean values are named after the 19th
  14239.                century English mathematician, who studied formal logic, and
  14240.                created Boolean algebra - an algebra which deals with TRUE and
  14241.                FALSE values.
  14242.  
  14243. ===============================================================================
  14244. OpenDoors 6.00 Manual                                          End of Page 259
  14245.  
  14246.  
  14247. BPS            BPS is an acronym for "Bits Per Second". For our purposes here,
  14248.                the terms BPS and BAUD refer to the same thing.
  14249.  
  14250.  
  14251. CARRIER        The term "Carrier" or "Carrier Detect" refers to a signal which
  14252. DETECT         most modems send to the computer, which indicates whether or not
  14253.                the modem is currently connected to (communicating with) another
  14254.                modem. The door driver module of OpenDoors, as with most other
  14255.                BBS software, uses the status of this carrier detect signal in
  14256.                order to know whether the user is still connected to the BBS
  14257.                computer. Thus, if the user hangs up, or if something goes wrong
  14258.                and the connection is lost, OpenDoors is able to detect this
  14259.                state, and exit to the BBS. The BBS will then also detect that
  14260.                the carrier signal has been "lost", and will reset itself, and
  14261.                then again be ready to accept calls.
  14262.  
  14263.  
  14264. CHAT MODE      The term "chat mode" refers to a means by which the sysop can
  14265.                communicate with a user of the BBS / door. During sysop chat,
  14266.                anything typed by the sysop will appear on the user's screen,
  14267.                and likewise, anything typed by the user will appear on the
  14268.                sysop's screen. Sysop chatting is available on both single and
  14269.                multi-line systems. Sysop chatting is initiated by the sysop,
  14270.                either at any time a user is online, or specifically in response
  14271.                to a sysop page.
  14272.  
  14273.  
  14274. COMPILE        "Compiling" refers to the process of converting the source code
  14275.                that you write for your program, into an executable file (such
  14276.                as a .EXE file) that an end user can use. The process of
  14277.                building an executable file is generally divided into two
  14278.                stages. In the first stage, called compiling, source files are
  14279.                converted to object files, often named .OBJ. In the second
  14280.                stage, called linking, one or more object files are combined,
  14281.                along with any library files, to produce the final executable
  14282.                file.
  14283.  
  14284.  
  14285. DLL            DLL is an acronym for "Dynamic Link Library". A dynamic link
  14286.                library is similar to a static library, in that it contains one
  14287.                or more functions that an application program can use. Unlike a
  14288.                static library, the code from a dynamic link library is not
  14289.                added to the program's executable file at link time. Instead,
  14290.                the dynamic link library exists as a separate file which must be
  14291.                loaded when the program is run. The Win32 version of OpenDoors
  14292.                resides in a DLL.
  14293.  
  14294.                See also "Library".
  14295.  
  14296.  
  14297.  
  14298. ===============================================================================
  14299. OpenDoors 6.00 Manual                                          End of Page 260
  14300.  
  14301. DOOR           A "door" is a program that runs as part of a BBS system, but
  14302.                which is separate from the central BBS software (RemoteAccess,
  14303.                Maximus, QuickBBS, PC-Board, etc.) itself. A door provides
  14304.                additional features not built into the BBS software, such as on-
  14305.                line games, on-line shopping services, voting booths, match
  14306.                making systems, access to special files or messages, and much
  14307.                much more. Since the user also communicates with the door
  14308.                online, as they do with the BBS, it may not necessarily be
  14309.                obvious to the user that the door is even a separate entity from
  14310.                the central BBS software itself.
  14311.  
  14312.  
  14313. DOOR           Also referred to as a "drop file", "exit file", or "chain
  14314. INFORMATION    file". The door information file is a file passed from the
  14315. FILE           central BBS software to a door program, providing it with
  14316.                information about the user who is online, the BBS the door is
  14317.                running under, and the current modem connection. The door
  14318.                information file may also be used to pass changed information
  14319.                back to the BBS, such as the amount of time that the user has
  14320.                used in the door. OpenDoors takes care of all of the work
  14321.                involved in reading and writing the door information file for
  14322.                you, as described in the "Basics of Door Programming" section,
  14323.                in chapter 4. Examples of door information files supported by
  14324.                OpenDoors include: DOOR.SYS, EXITINFO.BBS, DORINFO?.DAT,
  14325.                SFDOORS.DAT, CALLINFO.BBS and CHAIN.TXT.
  14326.  
  14327. DTR            DTR is an acronym for "Data Terminal Ready". This is a signal
  14328.                that the computer sends to the modem, indicating that the
  14329.                computer is ready to send or receive information. Most modems
  14330.                are configured to hangup if the DTR signal is lowered. This is a
  14331.                convenient means of hanging up the modem, but cases problems
  14332.                under Windows 95, where the DTR signal is always lowered when a
  14333.                program closes the serial port.
  14334.  
  14335.  
  14336. ECHO           See "Local Echo".
  14337.  
  14338.  
  14339. FOSSIL         The FOSSIL driver, or simply FOSSIL, is a TSR program or
  14340. DRIVER         device driver which OpenDoors can optionally make use of in
  14341.                order to communicate with the modem. The FOSSIL driver is loaded
  14342.                prior to starting up the BBS or your door, usually from the
  14343.                AUTOEXEC.BAT or CONFIG.SYS files. The two most commonly used
  14344.                FOSSIL drivers are X00 and BNU. (FOSSIL is an acronym for
  14345.                "Fido/Opus/SEAdog Standard Interface Layer", although it has now
  14346.                become the standard for nearly all BBS software.) FOSSIL drivers
  14347.                are also available for other specialized serial port hardware,
  14348.                such as the popular "DigiBoard" multi-port serial card.
  14349.  
  14350.  
  14351. IMPORT LIBRARY See "Library".
  14352.  
  14353. ===============================================================================
  14354. OpenDoors 6.00 Manual                                          End of Page 261
  14355.  
  14356.  
  14357. LIBRARY        A "library" or "library file" is a collection of precompiled
  14358.                functions and variables that can be used by other programs. All
  14359.                of the features, capabilities and functions of OpenDoors that
  14360.                you can make use of are contained within the OpenDoors library
  14361.                files. (Likewise, the C runtime library, consisting of the
  14362.                familiar functions such as fopen(), printf() and atoi(), is also
  14363.                contained within a library file.) For more information on the
  14364.                different OpenDoors library files, see the section that begins
  14365.                on page 22.
  14366.  
  14367.                There are several different kinds of library files. A static
  14368.                library file is actually a collection of individual object
  14369.                files. When you compile a program that makes use of a static
  14370.                library file, only those portions of the library file that your
  14371.                program actually uses are linked into your program's executable
  14372.                (.EXE) file. Static library files can be identified by a .LIB
  14373.                extension. The DOS version of OpenDoors resides in a static
  14374.                library.
  14375.  
  14376.                A dynamic link library, on the other hand, is not combined with
  14377.                the program's executable file. Instead dynamic link libraries
  14378.                exist in separate .DLL files that must also be present when the
  14379.                program is executed. The Win32 version of OpenDoors resides in a
  14380.                dynamic link library.
  14381.  
  14382.                An import library is a small file that describes a dynamic link
  14383.                library. The most common way for a program to call functions in
  14384.                a dynamic link library requires that an import library be used a
  14385.                program link time.
  14386.  
  14387.                See also "DLL".
  14388.  
  14389.  
  14390. LINK           "Linking" generally refers to the process of combining several
  14391.                object files into a final executable file, during which
  14392.                references to symbol names (such as od_printf()) are resolved to
  14393.                the address of the corresponding object. See also "Compiling".
  14394.  
  14395.  
  14396. LOCAL MODE     The term "local mode" refers to a mode in which a BBS system or
  14397.                door program may operate. In local mode, the BBS/door behave as
  14398.                they would if a user were connected via modem to the BBS, except
  14399.                that all display and input is done simply on the BBS software,
  14400.                but not through the modem. Local mode allows the sysop or
  14401.                another person with direct access to the BBS computer to use the
  14402.                BBS/door software, either for their own user, or for testing
  14403.                that the software is running correctly. When programming door
  14404.                software, local mode can be very useful in testing and debugging
  14405.                the door, without requiring the door to be connected to a remote
  14406.                system. All doors written with OpenDoors automatically support
  14407.                local mode operation. Compare "Remote".
  14408. ===============================================================================
  14409. OpenDoors 6.00 Manual                                          End of Page 262
  14410.  
  14411.  
  14412.  
  14413. LOCAL ECHO     The term "Local Echo" refers to a door displaying the same
  14414.                characters which are sent to the modem on the local screen
  14415.                ("Output Window"). This allows the sysop to view the same
  14416.                information that is sent to the user's system, in the same
  14417.                manner that it will appear on the user's screen.
  14418.  
  14419.  
  14420. LOCKED         (eg. "Locked Baud Rate", "Locked BPS Rate", "Locked Commport
  14421.                Speed", etc.) Usually, the communication port to which a modem
  14422.                is connected is set to transfer data at the same BPS rate as the
  14423.                rate at which the modem is communicating. However, many high
  14424.                speed modems allow very high speed data transfer by using built-
  14425.                in data compression methods. In this case, the actual rate of
  14426.                data transfer can easily exceed the true BPS rate of the
  14427.                connection. As a result, the BPS rate of the port is kept a
  14428.                single speed, faster than any of the true modem connections, in
  14429.                order to increase modem speed performance. This is referred to
  14430.                as locking the commport BPS rate. OpenDoors has full support for
  14431.                the use of locked BPS rates.
  14432.  
  14433.  
  14434. LOG FILE       A log file is a normal text file in which BBS software records
  14435.                all major activities that have taken place. As such, the log
  14436.                file permits the sysop, to review what activities have taken
  14437.                place on the BBS during the time which they have been away from
  14438.                the computer. A log file can be helpful in identifying system
  14439.                errors or crashes that have occurred, in alerting the sysop in
  14440.                the case that any users have been causing problems on the BBS,
  14441.                or in simply letting the sysop know who has called recently, and
  14442.                what when they did when they called.
  14443.  
  14444.  
  14445. MEMORY MODEL   C and C++ programs can be compiled under a variety of different
  14446.                memory models. Each memory model describes how data and program
  14447.                code are addressed in memory. When writing MS-DOS programs, you
  14448.                generally have the choice of six different memory models (named
  14449.                tiny, small, compact, medium, large and huge), each of which
  14450.                provides a different combination of the maximum sizes of data
  14451.                and code that your program may have. When writing Win32
  14452.                programs, there is a single, flat 32-bit memory model that all
  14453.                programs use. This memory model allows a program to address (in
  14454.                theory) up to 4 gigabytes of data and code.
  14455.  
  14456.  
  14457. MODEM          A device connected to a computer which permits it to communicate
  14458.                with other computers, usually over standard telephone lines.
  14459.  
  14460.  
  14461.  
  14462.  
  14463. ===============================================================================
  14464. OpenDoors 6.00 Manual                                          End of Page 263
  14465.  
  14466. OBJECT FILE    An object file contains the compiled version of a source code
  14467.                file of a program. The source code file may be a .C file, .CPP
  14468.                file, .ASM file, .PAS file, .BAS file, or any number of other
  14469.                extensions associated with other programming languages. When any
  14470.                of these language's source code files are compiled, a .OBJ file
  14471.                is created containing information such as the executable code,
  14472.                and names of symbols (variables and functions) that are to be
  14473.                shared with other .OBJ files. In order to produce a .EXE file
  14474.                that may be executed, a process known as linking must be
  14475.                performed. During the link process, one or more object files
  14476.                composing your program are combined, along with the necessary
  14477.                code from any library files being used, in order to produce the
  14478.                final .EXE file.
  14479.  
  14480.  
  14481. ONLINE         In the case of BBS software and BBS door programs, the term
  14482.                online refers to the state of a user using the BBS. Usually, the
  14483.                user will be connected to the BBS from a remote location, using
  14484.                a modem. However, it is also possible that the user will be
  14485.                using the actual BBS computer, with the software operating in
  14486.                "local mode".
  14487.  
  14488.  
  14489. OUTPUT WINDOW  The local screen of the BBS on which BBS software is running is
  14490.                usually divided into two sections. At the bottom of the screen,
  14491.                there is often a one or two line status line, which displays
  14492.                information to the sysop about the BBS and the user who is
  14493.                currently online. The rest of the screen is usually an "output
  14494.                window", in which the information which is being displayed to
  14495.                the user, is also displayed on the local screen. In some cases,
  14496.                there will be no status line, in which case the entire screen
  14497.                will be the output window. Usually, the upper 23 lines of the
  14498.                screen in an OpenDoors door will be the output window, with the
  14499.                bottom two lines being the status line. However, it is possible
  14500.                to disable the OpenDoors status line, in which case the entire
  14501.                screen will be the output window. See also "Status Line"
  14502.  
  14503.  
  14504. PAGE           See "SYSOP PAGE"
  14505.  
  14506.  
  14507. PARAMETER      In the C programming language, many tasks are accomplished by
  14508.                calling functions. When a function is called, one or more pieces
  14509.                of information may be passed to a function, in the form of
  14510.                parameters. For example, a function used to set the foreground
  14511.                and background color of displayed text might accept two
  14512.                parameters, one for each of the two color settings. In this
  14513.                example, a function such as od_set_color(), would be called as
  14514.                follows:
  14515.  
  14516.                               od_set_color(D_GREEN,D_RED);
  14517.  
  14518. ===============================================================================
  14519. OpenDoors 6.00 Manual                                          End of Page 264
  14520.  
  14521.                In this case, D_GREEN, the foreground color, is the first
  14522.                parameter, and D_RED, the background color, is the second
  14523.                parameter.
  14524.  
  14525.                In C, parameters are enclosed in parentheses, ( and ), which are
  14526.                located after the name of the function to be called. Each
  14527.                parameter is then separated by a comma character. If a function
  14528.                does not accept any parameters, the parentheses will have
  14529.                nothing between them. (ie. od_clr_scr() ).
  14530.  
  14531.  
  14532. REGISTRATION   This is a demonstration version of OpenDoors, which may only be
  14533.                used under limited circumstances, for a limited period of time.
  14534.                If you wish to continue using OpenDoors after this "evaluation
  14535.                period", you must "register" it. For more information on
  14536.                registering OpenDoors, please see chapter 2 of this manual.
  14537.  
  14538.  
  14539. REMOTE         When used in reference to BBS software or door programs, the
  14540.                term remote is used to refer to a user or computer that is
  14541.                communicating with the BBS, for a distant location, by use of a
  14542.                modem. Compare "Local Mode"
  14543.  
  14544.  
  14545. RIP            "RIP", "RIPScrip" or "Remote Imaging Protocol" is a popular
  14546.                graphical terminal standard that is used with BBS systems.
  14547.                Unlike other terminal emulation standards, such as the ANSI and
  14548.                AVATAR modes supported by OpenDoors, RIP operates in bit mapped
  14549.                graphics mode, allowing features such as lines, circles and
  14550.                icons to be drawn on the remote screen. OpenDoors provides
  14551.                support for RIP graphics, although OpenDoors operates in text
  14552.                mode itself.
  14553.  
  14554.  
  14555. STATUS LINE    Usually, the bottom two lines of the screen, as displayed by an
  14556.                OpenDoors door, is devoted to a status line (although this
  14557.                status line may be turned off). This status line will display
  14558.                information about the user who is online, along with information
  14559.                about the current state of the BBS system, and a reference to
  14560.                the sysop function keys. See also "Local Window".
  14561.  
  14562.  
  14563. SYSOP          The term sysop is a short-form for "SYStem OPerator", and refers
  14564.                to the individual who is responsible for running and maintaining
  14565.                the BBS system. The sysop is usually the only person who has
  14566.                direct access to the local keyboard and computer on which the
  14567.                BBS, BBS utilities and BBS doors are running.
  14568.  
  14569.  
  14570. SYSOP CHAT     See "CHAT MODE".
  14571.  
  14572.  
  14573. ===============================================================================
  14574. OpenDoors 6.00 Manual                                          End of Page 265
  14575.  
  14576. SOURCE CODE    The term "source code" refers to the original file or files that
  14577.                where used to produce a library or executable program. The
  14578.                source code files contain the language statements or commands
  14579.                that are directly written by the programmer. These source code
  14580.                files are then compiled to produce an executable file that may
  14581.                be "run".
  14582.  
  14583.  
  14584. SYSOP PAGE     Sysop paging refers to the process whereby a user of the BBS
  14585.                system may call or page for the sysop's attention, when they
  14586.                wish to "chat" with the sysop, and can be thought of as being
  14587.                similar to the ringing of a telephone. When a user pages the
  14588.                sysop, the BBS system will produce some sort of sound, which the
  14589.                sysop may elect to respond to if they are within hearing range
  14590.                of the computer. The most common reasons for a user to page a
  14591.                sysop include the case that they are having difficulty with some
  14592.                aspect of the BBS, that they have a question, or if they are
  14593.                simply interested in having a friendly conversation with the
  14594.                sysop. Obviously, since the sysop may not wish to be disturbed
  14595.                by users paging at certain times (such as when they are in bed),
  14596.                most BBS software provides controls to allow you to control
  14597.                paging. These features might include the ability to set hours
  14598.                for each day of the week during which paging will be permitted,
  14599.                and the ability to temporarily override the ability of some or
  14600.                all callers to page the sysop.
  14601.  
  14602.  
  14603. USER           When applied to computers in general, the term user simply
  14604.                refers to any person using the computer hardware and software.
  14605.                However, when applied particularly to BBSes, the term user
  14606.                refers specifically to a person who calls the BBS, to carry out
  14607.                activities such as communicating via messages or chatting,
  14608.                uploading and downloading files, or using doors. Often, the term
  14609.                user is used in contrast with the term sysop. In this case,
  14610.                users are all of the people who call and user the BBS, other
  14611.                than the sysop themselves.
  14612.  
  14613.  
  14614. WIN32          Win32 is the name of the API that programs written to run under
  14615.                Microsoft Windows 95 and Microsoft Windows NT use to access
  14616.                operating system services. Win32 programs use a flat, 32-bit
  14617.                memory model and have access to advanced operating system
  14618.                services such as multithreading. Win32 programs cannot run under
  14619.                DOS nor OS/2. While some Win32 programs can run under Windows
  14620.                3.x using the Win32s system, OpenDoors cannot since it requires
  14621.                multithreading services that are not provided by Win32s.
  14622.  
  14623.  
  14624.  
  14625.  
  14626.  
  14627.  
  14628. ===============================================================================
  14629. OpenDoors 6.00 Manual                                          End of Page 266
  14630.  
  14631.  IIIIII
  14632.    II
  14633.    II
  14634.    II
  14635.    II
  14636.    II
  14637.  IIIIII
  14638. -------------------------------------------------------------------------------
  14639. INDEX
  14640.  
  14641.  
  14642.  
  14643. A                                          D
  14644.  
  14645. About This Manual ..................21     Debugging                     21, 241
  14646. Access Level ......................178     Demo Version........................9
  14647. Alias .............................170     Display Functions..............42, 63
  14648. ANSI Graphics                              Displaying Text....30, 41, 42, 60, 62
  14649. Archive Contents ..................248     Door Driver Functions..............40
  14650. ASCII Chart ........................86     Door Driver Module..............6, 40
  14651. ASCII Mode ........................255     Door Functions.....................45
  14652. AVATAR Graphics ....118, 134, 167, 256     Door Information File30, 33, 150, 158
  14653.                                            Door Settings.....................182
  14654. B                                          DORINFOx.DEF File..................33
  14655.                                            DOS Shell.........................192
  14656. Baud Rate .........................154     Download Limit....................169
  14657. BBS Information ...................158
  14658. BBS Name ..........................164     E
  14659. BBS Systems ........................30
  14660. Before Exit Function ..............191     Error Free Connection.............170
  14661. Box Characters ...............185, 191     Example Program - Changing Only
  14662. BPS Rate ..........................154      Foreground/Background Colour ....132
  14663. Built-In Function Keys ............212     Example Program - Choosing Text
  14664.                                             Colour ..........................129
  14665. C                                          Example Program - Clearing A Line..56
  14666.                                            Example Program - Dialog Box.......66
  14667. Caller Information ................158     Example Program - Door And Utility In
  14668. Carrier Detect .................51, 97      One Program ......................92
  14669. Chat ..........................38, 104     Example Program - Drawing A Window118
  14670. Chat Mode ....................104, 259     Example Program - Exiting A Door...79
  14671. Colour Attribute Codes ............128     Example Program - First Door.......29
  14672. Colour Constants ..................132     Example Program - Hanging Up In CBV
  14673. Colour Customization215, 229, 232, 236      Door .............................51
  14674. Colour Functions ...................42     Example Program - Hotkeyed Menu....91
  14675. Colours .................110, 128, 131     Example Program - Input Key.......115
  14676. Common Problems ...................243     Example Program - Setting Door Info
  14677. Compiler Errors ...................243      File Location ...................150
  14678. Compiling With OpenDoors ...........22     Example Program - Shelling To DOS.141
  14679. Custom Function Keys ..............213     Example Program - Terminal Emu.....62
  14680.                                            Example Program - Testing Available
  14681.                                             Door Information ................158
  14682.  
  14683. ===============================================================================
  14684. OpenDoors 6.00 Manual                                          End of Page 267
  14685.  
  14686.  
  14687.  
  14688. Example Program - Testing Screen           M
  14689.   Clearing Capabilities             57
  14690. Example Program - Transferring A File      Memory Models..................23, 24
  14691.   Using DSZ........................142     Memory Swapping...................209
  14692. Example Program - User Statistics          Modem Port........................157
  14693.   Door.............................113     Modem Settings....................153
  14694. Example Program - Vote .............33
  14695. Example Program - Waiting For CR ...54     N
  14696. Exiting A Door Program .............79
  14697.                                            New Version.......................249
  14698. F                                          Node Number.......................152
  14699.  
  14700. Features ............................6     O
  14701. Feedback Form ......................19
  14702. File Display Functions .............44     Object File.......................263
  14703. FILES.BBS File .....................98     od_autodetect() Function...........48
  14704. Fossil Driver .....................260     od_carrier() Function..............51
  14705. FOSSIL port .......................157     od_chat() Function.................50
  14706. Function Keys .................97, 211     od_clear_keybuffer() Function......53
  14707. Future Versions ...................253     od_clr_line() Function.............55
  14708.                                            od_clr_scr() Function.........57, 243
  14709. G                                          od_colour_config() Function........59
  14710.                                            od_control Structure..........31, 148
  14711. Getting In Touch With Us ..........246     od_disable Variable...............198
  14712. Graphics Mode ...........165, 167, 255     od_disp() Function.................60
  14713.                                            od_disp_emu() Function.............62
  14714. H                                          od_disp_str() Function.............63
  14715.                                            od_draw_box() Function.............65
  14716. History ...........................249     od_edit_str() Function.............68
  14717. Hotkeys ............................90     od_exit() Function...31, 79, 191, 195
  14718.                                            od_get_answer() Function...........81
  14719. I                                          od_get_input() Function............82
  14720.                                            od_get_key() Function......30, 53, 85
  14721. IBM Colour Attribute Codes ........128     od_gettext() Function..............89
  14722. IEMSI Session Information .........161     od_hotkey_menu() Function..........90
  14723. Inactivity Timeout ......199, 200, 202     od_init() Function.............31, 92
  14724. Input Functions ............44, 81, 85     od_input_str() Function........53, 95
  14725.                                            od_kernal() Function...............31
  14726. K                                          od_kernel() Function...............97
  14727.                                            od_list_files() Function...........98
  14728. Keyboard Buffer ...........53, 97, 115     od_log_write() Function...........100
  14729. Keys ...............................97     od_multiline_edit() Function......101
  14730.                                            od_page() Function...........104, 207
  14731. L                                          od_parse_cmd_line() Function......105
  14732.                                            od_popup_menu() Function..........107
  14733. Language Customization ............216     od_printf() Function.....29, 110, 195
  14734. Learning OpenDoors .................29     od_putch() Function...............115
  14735. Library ...........................261     od_puttext() Function.............116
  14736. LIBrary Files ......................24     od_repeat() Function..............118
  14737. Line Number .......................152     od_restore_screen() Function......120
  14738. Linking ............................23     od_save_screen() Function.........121
  14739. Local Mode ...............33, 200, 261     od_scroll() Function..............123
  14740. Locked ............................262     od_send_file() Function...........124
  14741.                                            od_set_attrib() Function..........128
  14742.  
  14743. ===============================================================================
  14744. OpenDoors 6.00 Manual                                           End of Page 268
  14745.  
  14746.  
  14747.  
  14748. od_set_color() Function ...........131     Solutions To Problems.............243
  14749. od_set_cursor() Function ..........134     Source Code................10, 17, 20
  14750. od_set_dtr() Function .............135     Special Thanks....................254
  14751. od_set_personality() Function .....136     Status Line...104, 137, 209, 210, 264
  14752. od_set_statusline() Function ......137     Stop Key..........................203
  14753. od_sleep() Function ...............139     Support...........................244
  14754. od_spawn Function .................208     Support BBS.............244, 245, 246
  14755. od_spawn() Function ...............141     Swapping..........................209
  14756. od_spawnvpe() Function ............143     Sysop Chat...............38, 104, 192
  14757. od_window_create() Function .......145     Sysop Function Keys...............211
  14758. od_window_remove() Function ..147, 148     Sysop Keys.........................97
  14759. OPENDOOR.H File ............22, 29, 34     Sysop Name........................164
  14760. OpenDoors BBS ................244, 245     Sysop Next Setting................184
  14761. OpenDoors Customization ...........187     Sysop Page........................207
  14762. OPENDOORS Echo ....................245     Sysop Paging.................104, 265
  14763. OpenDoors History .................249     System Event......................162
  14764. Our Address .......................246     System Name.......................164
  14765. Output Functions ...................42
  14766. Output Window .................34, 263     T
  14767.  
  14768. P                                          Terminal Emulator........62, 124, 125
  14769.                                            Terminal Emulator Control Codes...126
  14770. Paging Hours .................182, 183     Text Customization................216
  14771. Paging The Sysop ..................104     Thank-yous........................254
  14772. Pause Key .........................203     Time Left.........................179
  14773. Phone Number ......................171     Timeout............................97
  14774. Printing ..30, 41, 60-63, 90, 110, 115     Troubleshooting....................21
  14775. Printing Manual ....................22
  14776. Problems ...........................21     U
  14777. Product Support ...................244
  14778. Project Files ......................23     User Handle (Alias)...............170
  14779.                                            User Information..................158
  14780. R                                          User Keyboard Off Key..............53
  14781.                                            User Keyboard Setting.............184
  14782. Registration ..9, 10, 12, 18, 246, 264     User Name.........................174
  14783. Registration Form ..............15, 18     User Password.....................176
  14784. RIP ...............................264     User Timeout.......................97
  14785. RIPScrip ..........................264
  14786.                                            V
  14787. S
  14788.                                            Version History...................249
  14789. Screen Functions ...................42
  14790. Screen Length .....................177     W
  14791. Screen Width ......................178
  14792. Security Level ....................178     Want-Chat Setting.................180
  14793. Setting Colours .........110, 128, 131
  14794.  
  14795.  
  14796.  
  14797.  
  14798.  
  14799.  
  14800.  
  14801.  
  14802.  
  14803. ===============================================================================
  14804. OpenDoors 6.00 Manual                                           End of Page 269
  14805.  
  14806.