ÛÛÛÛÛÛÛÛÛÛ                         ÛÛÛÛÛÛÛÜ
    ÛÛÛßßßßÛÛÛ                         ÛÛÛßßßÛÛÛ
    ÛÛÛ    ÛÛÛ ÜÜÜÜÜÜÜ ÜÜÜÜÜÜÜ ÜÜÜÜÜÜÜ ÛÛÛ   ÛÛÛ ÜÜÜÜÜÜÜ ÜÜÜÜÜÜÜ ÜÜÜÜÜÜ ÜÜÜÜÜÜÜ
    ÛÛÛ    ÛÛÛ ÛÛÛßÛÛÛ ÛÛÛßÛÛÛ ÛÛÛßÛÛÛ ÛÛÛ   ÛÛÛ ÛÛÛßÛÛÛ ÛÛÛßÛÛÛ ÛÛÛßßß ÛÛÛßßßß
    ÛÛÛÜÜÜÜÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛßßßß ÛÛÛ ÛÛÛ ÛÛÛÜÜÜÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ    ßßßßÛÛÛ
    ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛÛÛÛÛß  ÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛ    ÛÛÛÛÛÛÛ
               ÛÛÛ
               ÛÛÛ
               ßßß                          Online Software Programming Toolkit
    ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

                                                            Programmer's Manual


                                                                   Version 6.00


                                                         DOS and Win32 Editions














          NOTE: Since you will likely want to refer to this manual while
                working with OpenDoors, it is highly recommended that you take
                the time to print it out. Simply type COPY OPENDOOR.TXT PRN
                from your DOS prompt. With the exception of this title page,
                this document contains only 7-bit ASCII characters.




        (C) Copyright 1991 - 1996 by Brian Pirie. All Rights Reserved.

                              TABLE OF CONTENTS


CHAPTER 1 - INTRODUCTION TO OPENDOORS.......................................5
    WELCOME! ...............................................................5
    FEATURES OF THE OPENDOORS TOOLKIT ......................................6

CHAPTER 2 - ABOUT THIS EVALUATION COPY AND ORDERING.........................9
    THE EVALUATION COPY & BENEFITS OF REGISTERING ..........................9
    HOW TO ORDER ...........................................................10
    HOW TO ORDER BY MAIL ...................................................11
    SENDING YOUR ORDER FEE IN THE MAIL .....................................12
    ORDERING BY CREDIT CARD ................................................14
    HOW YOU CAN RECEIVE YOUR ORDER .........................................15
    ORDERING THE SOURCE CODE ...............................................17
    OPENDOORS 6.00 ORDER FORM ..............................................18
    OPENDOORS 6.00 FEEDBACK FORM ...........................................19
    TERMS OF REGISTRATION AND SOURCE CODE USE ..............................20

CHAPTER 3 - OPENDOORS TUTORIAL..............................................21
    ABOUT THIS MANUAL ......................................................21
    COMPILING A PROGRAM WITH OPENDOORS .....................................22
    LINKING WITH OPENDOORS USING A DOS COMPILER ............................23
    LINKING WITH OPENDOORS USING A WINDOWS COMPILER ........................24
    RUNNING A DOOR PROGRAM WRITTEN WITH OPENDOORS ..........................26
    RUNNING DOS-BASED DOOR PROGRAMS ........................................26
    RUNNING WINDOWS 95/NT DOOR PROGRAMS ....................................26
    BASICS OF DOOR PROGRAMMING WITH OPENDOORS ..............................29
    TOUR OF A SAMPLE DOOR PROGRAM: "EX_VOTE" ...............................33
    OTHER EXAMPLE PROGRAMS INCLUDED WITH OPENDOORS .........................38

CHAPTER 4 - THE OPENDOORS API FUNCTIONS.....................................40
    OVERVIEW ...............................................................40
    TABLE OF MOST COMMONLY USED FUNCTIONS ..................................41
    TABLE OF ALL FUNCTIONS .................................................42
    OD_ADD_PERSONALITY() ...................................................47
    OD_AUTODETECT() ........................................................48
    OD_CHAT() ..............................................................50
    OD_CARRIER() ...........................................................51
    OD_CLEAR_KEYBUFFER() ...................................................53
    OD_CLR_LINE() ..........................................................55
    OD_CLR_SCR() ...........................................................57
    OD_COLOR_CONFIG() ......................................................59
    OD_DISP() ..............................................................60
    OD_DISP_EMU() ..........................................................62
    OD_DISP_STR() ..........................................................63
    OD_DRAW_BOX() ..........................................................65
    OD_EDIT_STR() ..........................................................68
    OD_EXIT() ..............................................................79
    OD_GET_ANSWER() ........................................................81
    OD_GET_INPUT() .........................................................82
    OD_GET_KEY() ...........................................................85
===============================================================================
OpenDoors 6.00 Manual                                            End of Page 2

    OD_GETTEXT() ...........................................................89
    OD_HOTKEY_MENU() .......................................................90
    OD_INIT() ..............................................................92
    OD_INPUT_STR() .........................................................95
    OD_KERNEL() ............................................................97
    OD_LIST_FILES() ........................................................98
    OD_LOG_WRITE() .........................................................100
    OD_MULTILINE_EDIT() ....................................................101
    OD_PAGE() ..............................................................104
    OD_PARSE_CMD_LINE() ....................................................105
    OD_POPUP_MENU() ........................................................107
    OD_PRINTF() ............................................................110
    OD_PUTCH() .............................................................115
    OD_PUTTEXT() ...........................................................116
    OD_REPEAT() ............................................................118
    OD_RESTORE_SCREEN() ....................................................120
    OD_SAVE_SCREEN() .......................................................121
    OD_SCROLL() ............................................................123
    OD_SEND_FILE() .........................................................124
    OD_SET_ATTRIB() ........................................................128
    OD_SET_COLOR() .........................................................131
    OD_SET_CURSOR() ........................................................134
    OD_SET_DTR() ...........................................................135
    OD_SET_PERSONALITY() ...................................................136
    OD_SET_STATUSLINE() ....................................................137
    OD_SLEEP() .............................................................139
    OD_SPAWN() .............................................................141
    OD_SPAWNVPE() ..........................................................143
    OD_WINDOW_CREATE() .....................................................145
    OD_WINDOW_REMOVE() .....................................................147

CHAPTER 5 - THE OPENDOORS CONTROL STRUCTURE.................................148
    INTRODUCTION TO THE CONTROL STRUCTURE ..................................148
    CONTROL STRUCTURE - DOOR INFO FILE STATS ...............................150
    CONTROL STRUCTURE - SERIAL PORT SETTINGS ...............................153
    CONTROL STRUCTURE - BBS AND CALLER INFORMATION .........................158
    CONTROL STRUCTURE - DOOR SETTINGS ......................................182
    CONTROL STRUCTURE - DIAGNOSTICS ........................................185
    CONTROL STRUCTURE - OPENDOORS CUSTOMIZATION ............................187
    CONTROL STRUCTURE - FUNCTION KEYS ......................................212
    CONTROL STRUCTURE - COLOR CUSTOMIZATION ................................216
    CONTROL STRUCTURE - TEXT CUSTOMIZATION .................................217

CHAPTER 6 - SPECIAL TOPICS..................................................220
    ADDITIONAL INFORMATION ON THE WIN32 VERSION ............................220
    CONFIGURATION FILE SYSTEM ..............................................225
    DEFINING CUSTOM DOOR INFORMATION FILE FORMATS ..........................230
    MULTIPLE PERSONALITY SYSTEM ............................................233
    LOG FILE SYSTEM ........................................................235
    MAKING DOORS MULTI-NODE-AWARE ..........................................237

CHAPTER 7 - TROUBLESHOOTING AND GETTING ASSISTANCE WITH OPENDOORS...........242
===============================================================================
OpenDoors 6.00 Manual                                            End of Page 3

    ABOUT THIS CHAPTER .....................................................242
    TROUBLESHOOTING PROBLEMS ...............................................242
    SOLUTIONS TO COMMON PROBLEMS ...........................................244
    OPENDOORS SUPPORT ......................................................245
    THE OPENDOORS SUPPORT BBS ..............................................245
    THE OPENDOORS WORD WIDE WEB SITE .......................................246
    THE OPENDOORS CONFERENCE ...............................................246
    GETTING IN TOUCH WITH ME ...............................................247

APPENDIX A - CONTENTS OF PACKAGE............................................249

APPENDIX B - CHANGES FOR THIS VERSION.......................................250

APPENDIX C - FUTURE VERSIONS................................................254

APPENDIX D - SPECIAL THANKS.................................................255

GLOSSARY....................................................................256

INDEX.......................................................................267
































===============================================================================
OpenDoors 6.00 Manual                                            End of Page 4

  11
 111
  11
  11
  11
  11
 1111
-------------------------------------------------------------------------------
CHAPTER 1 - INTRODUCTION TO OPENDOORS




WELCOME!
-------------------------------------------------------------------------------

               Welcome to OpenDoors! OpenDoors is a POWERFUL and EASY TO USE
               online software programming toolkit for C and C++. While
               OpenDoors is most often used to create add-on "door" programs
               that run under BBS systems, it can also be used for many other
               online software applications. By using OpenDoors, you are
               joining over 500 other programmers from around the world who
               have used it since it was first released to the public in 1991.
               Over the years, OpenDoors has grown from a simple BBS door
               programming library to what is perhaps the most sophisticated,
               widely used and supported package of its type.

               What exactly is OpenDoors? OpenDoors provides a complete system
               that allows you to quickly and easily write spectacular,
               professional quality interactive online software. With
               OpenDoors, you can write software such as BBS door programs just
               as you would write any other program - without having to worry
               about the many of the internal details of door programming.
               OpenDoors looks after communicating through the modem, providing
               ANSI/AVATAR/RIP terminal support and interfacing with a wide
               variety of BBS packages through door information files (such as
               DOOR.SYS, DORINFO1.DEF, etc.). OpenDoors also looks after status
               lines and sysop function keys for DOS shells, chatting, hanging
               up, and so on. In addition, OpenDoors carries out all the work
               involved in keeping track of carrier detection, user timeouts
               and much, much more. OpenDoors is also highly flexible, allowing
               you to take as little or as much control of your program's
               behavior as you wish.

               This package includes both DOS and Win32 versions of OpenDoors.
               This allows you to build a plain-DOS version of your program to
               run under a variety of platforms (DOS, DesqView, Windows 3.x,
               NT, 95 and OS/2), to build a Win32 version that takes special
               advantage of Windows 95 / NT, or build both versions of your
               program - the choice is yours. The DOS version of OpenDoors
               performs its serial I/O using either a FOSSIL driver, or built-
               in serial I/O capabilities, making the use of a FOSSIL driver
===============================================================================
OpenDoors 6.00 Manual                                            End of Page 5

               optional. The  Win32 version takes special advantage of 32-bit
               programming, multithreading and the Windows GUI, and allows you
               to access many services that are provided by Windows, such as
               ODBC (for database access) and MAPI (for email and messaging).
               Both the DOS and Win32 versions of OpenDoors can be run under
               both DOS and Windows-based BBS packages. The DOS version of
               OpenDoors can also be run under OS/2-based BBS packages.

               The following section provides more detailed information on the
               features and capabilities that OpenDoors provides.




FEATURES OF THE OPENDOORS TOOLKIT
-------------------------------------------------------------------------------

               You will find that OpenDoors provides a solid platform to build
               BBS door programs and other online software on top of. You may
               want to write simple utility door programs, on-line games or
               sophisticated applications. Perhaps you are interested in
               getting into the market of selling online software, or perhaps
               you just wish to write some custom door programs for a
               particular BBS system. With OpenDoors, you can accomplish all of
               these things - and do it much more easily than ever before. Some
               of the features that OpenDoors provides to :

               - OpenDoors handles all the "dirty" work involved in writing
                 BBS door programs. Since OpenDoors looks after all the door-
                 related operations for you, you need do next to nothing
                 different when writing door programs than you would when
                 writing any other program. You simply call OpenDoor's simple
                 functions to input, output and control door operation. In
                 fact, many people have converted non-door programs to door
                 programs in only a matter of minutes using OpenDoors. One of
                 the most common comments I receive about OpenDoors is how
                 easy it is to use.

               -  OpenDoors allows you to write software that DIRECTLY support
                 a wide variety of BBS systems, including RemoteAccess,
                 QuickBBS, PC-Board, Maximus,  Opus, Wildcat!, WWIV, Spitfire,
                 SuperBBS, Telegard, TriBBS, GAP, and others.

               - As you would expect, OpenDoors flawlessly monitors the
                 modem's carrier detect signal, to automatically recover when
                 a user hangs up - without your having to do anything extra in
                 your program. OpenDoors also monitors how much time the user
                 has left in the door, and provides a fully adjustable
                 inactivity timeout monitor.

               - OpenDoors takes care of all the work involved in reading and
                 writing BBS door information files, such as DORINFO1.DEF,
===============================================================================
OpenDoors 6.00 Manual                                            End of Page 6

                 EXITINFO.BBS, CHAIN.TXT, DOOR.SYS, etc.  If the particular
                 information is available to OpenDoors, it will provide you
                 with just about everything you could ever want to know about
                 the user on-line, the system your door is running under, and
                 so on. In addition to the many door information file formats
                 supported by OpenDoors, you are also able to define your own
                 custom formats.

               - OpenDoors also does all the work involved in displaying and
                 automatically updating the door's status line, with
                 information available to the sysop such as user name,
                 location, baud rate, time left, function keys,
                 ANSI/AVATAR/RIP settings, and so on. Using OpenDoors, you can
                 choose from a number of different "personalities". These
                 personalities allows OpenDoors to mimic the status lines and
                 sysop function keys used in various BBS packages. OpenDoors
                 includes personalities that mimic RemoteAccess, PC-Board and
                 Wildcat! OpenDoors also allows you to create your own
                 personalities to mimic any other BBS system.

               - OpenDoors automatically provides the sysop with all the
                 standard function keys for adjusting user time, hanging up on
                 or even locking out the user, and so on. OpenDoors also
                 provides you with a chat mode, which is available to the
                 sysop by pressing Alt-C. In addition, OpenDoors has full
                 support for sysop shell to DOS, activated by the Alt-J key.

               - What's more, OpenDoors is designed to be very easy to use.
                 Even the most novice 'C' programmers are able to write
                 professional-quality doors with OpenDoors. It takes care of
                 just about every detail for you, yet still gives you the
                 ability to completely control and customize every detail of
                 your door's behavior. There are even people who begin door
                 programming with OpenDoors, having never programmed in C in
                 the past.

               - OpenDoors supports both FOSSIL-based and built-in serial I/O
                 capabilities. FOSSIL-based serial I/O can be used for maximum
                 compatibility with various systems and serial ports,
                 including multiple-port serial cards such as DigiBoard.
                 OpenDoors can also operate without a FOSSIL driver, using
                 it's own serial I/O capabilities. OpenDoor's built-in
                 asynchronous communications supports baud rates of up to
                 115,200 and non-standard serial port configurations.
                 OpenDoors also has the ability to automatically detect which
                 of the two serial I/O methods should be used on a particular
                 system.

               - OpenDoors also automatically detects when the BBS system is
                 operating in local mode, and supports full local mode
                 operations itself.

===============================================================================
OpenDoors 6.00 Manual                                            End of Page 7

               - Other OpenDoors functions include a built in sysop-page
                 function that will ask the user why they wish to chat, and
                 then proceed to page the sysop, just as any BBS package
                 would. OpenDoors also provides screen clearing functions
                 (which will detect whether the user has screen clearing
                 turned on), and various ANSI/AVATAR/RIP control functions
                 (which again detect if the user has graphics mode turned on).

               - In addition to the basic display features of OpenDoors there
                 are also a number of advanced screen control functions. These
                 include functions to save and restore the entire screen,
                 along with functions to save, restore or scroll portions of
                 the screen. Other functions allow you to provide overlapping
                 windows and pop-up menus with highlighted selection bars.

               - OpenDoors provides a multi-line text editor that you can use
                 to allow the user to enter or edit text files, email
                 messages, or any other text that spans multiple lines. You
                 can customize many of the editor's settings to suit your
                 needs.

               - OpenDoors has a number of special sub-systems that you may
                 elect to include in your doors. Among these, is a log-file
                 system that allows you to add log file support to your doors
                 with only a single line of programming.

               - Another valuable OpenDoors sub-system is the configuration
                 file system. Again using only a single line of code, you can
                 add configuration file support to your doors. OpenDoors
                 configuration files permit the sysop using the door to
                 customize the door's behavior to their own preferences.

               - OpenDoors can also be fully customized in order that you may
                 write door programs that use languages other than English.

               - Among the ANSI/AVATAR/RIP features found in OpenDoors is the
                 ability to send ANSI/AVATAR/RIP files from disk. This allows
                 you to easily design program screens, and incorporate them
                 into your doors.

               - OpenDoors also comes with the source code for a number of
                 example doors, which you can modify, or simply extract bits
                 and pieces for use in your own doors. Plus, this manual
                 contains many examples of C source code, to help you in
                 writing nearly any door program you might wish to build.

               - You may also elect to purchase the source code for OpenDoors,
                 which will permit you to make modifications to any portion of
                 OpenDoors, use any portions of the OpenDoors source code in
                 other programs you write, or merely learn how communications-
                 type programs are written.

===============================================================================
OpenDoors 6.00 Manual                                            End of Page 8

  2222
 22  22
     22
    22
   22
  22
 222222
-------------------------------------------------------------------------------
CHAPTER 2 - ABOUT THIS EVALUATION COPY AND ORDERING




THE EVALUATION COPY & BENEFITS OF REGISTERING
-------------------------------------------------------------------------------

               OpenDoors is distributed and sold using the conventional
               "shareware" approach. This complete package can be freely
               distributed, both online (through BBS systems and the Internet)
               and on CD-ROMs or other media. This gives you the chance to try
               OpenDoors before you buy it. Unlike traditional commercial
               software, you have the opportunity to see OpenDoors first-hand,
               and determine whether it meets your needs without first paying
               for it. However, before registering you are only permitted to
               use it under the following conditions:

               1.)You may only use this package for a one month period, and
                  for evaluation purposes only.

               2.) Programs written with this package may not be distributed.

               Also, before registering, any program written with OpenDoors
               will display a message to the user indicating that OpenDoors is
               not registered. Of course, this message is removed once you have
               registered.

               If you decided to register OpenDoors, you will become the
               licensed owner of a powerful tool for creating BBS door programs
               and other online software. Registered (licensed) owners of
               OpenDoors are entitled to:

               1.)Virtually unlimited use of OpenDoors. You may write as many
                  programs as you wish using OpenDoors, and do what you please
                  with these programs. They may be freely distributed, or even
                  sold. What's more, there are no additional royalty fees.
                  Your one time purchase of OpenDoors entitles you to use it
                  as you please.

               2.)Your registration entitles you to use both the DOS and Win32
                  versions of OpenDoors.


===============================================================================
OpenDoors 6.00 Manual                                            End of Page 9

               3.)You will also be entitled to free upgrades to newer versions
                  of OpenDoors. In addition to the great many features and the
                  quality that this version of OpenDoors has to offer, I am
                  currently working on a great many additions and enhancements
                  for the next version. (See the end of this document for an
                  outline of features currently "in the works".) Any programs
                  you write using this version will also automatically take on
                  many of these new features when you upgrade to the new
                  version.


               Perhaps the best news of all is the price of OpenDoors. Similar
               packages sell for $50, $75, or even more. However, this version
               of OpenDoors will only cost you $28 US Dollars, $34 Canadian
               Dollars, or the equivalent in your country's currency! (Note
               that this price will increase in future versions. By registering
               now, you will save by being able to upgrade to all future
               versions at no additional charge.)

               Also, the source code for OpenDoors is now available to licensed
               users for an additional $28US / $34CDN / equivalent. Ordering a
               copy of the source code will allow you to customize OpenDoors
               for your own use, making any changes or additions that you wish.
               It also gives you the opportunity to see how OpenDoors works,
               and to use any portions of the OpenDoors code in any other
               programs you wish to write. If you think you might be interested
               in ordering the OpenDoors source code, please be sure to read
               the section entitled "Ordering The Source Code", located on page
               20.



HOW TO ORDER
-------------------------------------------------------------------------------

               There are to ways of ordering and OpenDoors license
               (registration):

               -The most common way to order is by mailing the OpenDoors order
                form along with a cheque, money order or cash to the address
                on this order form.

               - You may order using a major credit card. OpenDoors credit card
                orders are handled by a third-party credit card order service,
                named PsL.

               The following sections provide more information on how to order
               using each of these options.




===============================================================================
OpenDoors 6.00 Manual                                           End of Page 10

HOW TO ORDER BY MAIL
-------------------------------------------------------------------------------

               To order OpenDoors by mailing a cheque, money order or cash,
               simply follow these three steps:

               1.)  Fill out the registration form. Information on filling out
                    the form is located on page 15.

               2.)  Send the appropriate payment, $28US/$34CDN/equivalent for
                    the registration or $56US/$68CDN/equivalent for both the
                    registration and source code. If you wish more detailed
                    instructions on sending the registration fee, see the
                    section that begins page on 12. Included in that section is
                    a list of equivalent prices for a number of other
                    countries.

               3.)  Send the above two items to me at:

                              Brian Pirie
                              117 Cedarock Drive
                              Kanata ON  K2M 2H5
                              Canada


               Many people who register OpenDoors also order the source code
               package. You may wish to consider the benefits of having the
               OpenDoors source code - it allows you to learn how OpenDoors and
               communications software is written, it allows you to modify and
               customize OpenDoors to suit your own preferences, and it also
               allows you to use portions of OpenDoors for other non-door
               programming projects. If you think you might also be interested
               in the OpenDoors source code, be sure to read the section on the
               source code, which begins on page 20.

               Also, you may wish to send the OpenDoors feedback form (located
               on page 19), along with your registration. The feedback form
               gives you a chance to tell me what you think of OpenDoors, and
               what changes you would like to see in future versions. In fact,
               the majority of suggestions made on these forms in the past have
               already been implemented in the current version of OpenDoors.

               If you have printed the OpenDoors manual, you can simply remove
               and mail the forms on pages 18 and 19. If you have not already
               printed a copy of the manual, and you have a printer, you can
               quickly print these forms by printing the ORDER.FRM file
               included in the OpenDoors distribution archive. (Type COPY
               ORDER.FRM PRN from your DOS prompt.)

NO PRINTER?    Alternatively, if you do not have a printer, simply send a hand-
               written version of the order form.

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 11

               If you have any special instructions for me, or anything that
               you would like to say when you register, feel free to write this
               on the back of the registration form, or on a separate piece of
               paper.

               When filling out the OpenDoors registration form, be sure to
               indicate how you would prefer to receive your OpenDoors
               registration key and/or source code. The following options are
               available:

                         - Having me send the registration and/or source code
                          by conventional mail
                         - Internet E-Mail (the fastest option)
                         - By Fax
                         - Having me call to your BBS
                         - You calling the OpenDoors support BBS
                         - FidoNet "CrashMail"

               Once you have decided which means you would prefer to receive
               your order by, please read the detailed instructions on your
               order method, below. Also, if you are ordering the source code,
               please be sure to read the section on ordering the source code,
               which begins on page 20.




SENDING YOUR ORDER FEE IN THE MAIL
-------------------------------------------------------------------------------

               The price of OpenDoors is 34 Canadian Dollars, 28 U.S. Dollars,
               or equivalent for the registration. The source code costs an
               additional 34 Canadian Dollars, 28 U.S. Dollars, or equivalent.
               For your convenience, the equivalent value in a number of other
               country's currencies, at the time of this writing, is as
               follows:

                       -----------------------------------------------
                                                REGISTRATION
                       REGISTRATION ONLY        AND SOURCE CODE
                       -----------------------------------------------
                       34 Canadian Dollars      68 Canadian Dollars
                       28 US Dollars            56 US Dollars
                       18 British Pounds        36 British Pounds
                       150 French Francs        300 French Francs
                       44 German Marks          88 German Marks
                       50 Netherland Gilders    100 Netherland Gilders
                       39 Australian Dollars    78 Australian Dollars
                       -----------------------------------------------

               If you are ordering by mail, this order fee may be paid using
               any of the following methods:
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 12


               -Cheque or Money Order in Canadian currency, drawn upon a
                Canadian bank. In this case, your order fee will be either
                $34CDN for just the registration, or $68CDN for both the
                registration and source code.

               -Cheque or Money Order in U.S. currency, drawn upon a U.S. bank.
                In this case, your order fee will be either $28US for just the
                registration, or $56US for both the registration and source
                code.

               -An International Money Order or International Bank Draft
                (available from your bank, post office or companies such as
                American Express), in Canadian currency. Depending on the
                particular case, your order fee MAY be sent to me by the postal
                service, and you will mail your order form by itself. You
                should have the money order drawn in either $34CDN for just the
                registration, or $68CDN for both the registration and source
                code.

               -A cheque drawn on any bank in the world, IN THAT COUNTRY'S
                CURRENCY, equivalent to 34 Canadian dollars. For instance, a
                cheque for the appropriate number of British Pounds, drawn on a
                British bank, is perfectly acceptable. However, I am unable to
                accept a cheque for $34 Canadian dollars, drawn on a British
                Bank. UNFORTUNATELY, THE BANKS IN CANADA ARE CURRENTLY
                UNWILLING TO ACCEPT EUROCHEQUES.

               -Cash. Please note that it is not usually recommended that cash
                be sent in the mail, and that I cannot be responsible for any
                cash lost in the mail. Simply put, if you wish to order by
                cash, it is your responsibility to get the cash to me. However,
                if I do receive your order in the form of cash, it will be
                perfectly acceptable to me. I would like to mention that many
                people have already ordered OpenDoors by sending cash, and I
                have yet to run across any case of cash being lost in the mail.
                Nonetheless, if you wish to send cash, you may wish to consider
                doing so by registered mail, for your added security.


               If you are ordering OpenDoors from within Canada, you will most
               likely choose the first option (a Canadian cheque or money
               order). If you are ordering OpenDoors from within the United
               States, you will most likely choose the second option (an
               American cheque or money order). If you are ordering from
               outside Canada and the U.S., it would be ideal if you could send
               your fee by an international money order. However, it should be
               noted that any of the above order methods will be acceptable
               from any location. Also, it is quite possible that I may be able
               to accept other means of sending your order fee. If you are
               unsure about sending your order fee, please feel free to get in
               touch with me by any of the means listed on page 247.
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 13

ORDERING BY CREDIT CARD
-------------------------------------------------------------------------------

               This information applies to CREDIT CARD ORDERS ONLY. Please read
               this entire section before ordering OpenDoors by credit card.

               In order to cover the additional costs of processing credit card
               orders, an $8 shipping and handling fee applies to all OpenDoors
               orders made through PsL. As such, the total prices you will pay
               are:

               - Just registration ($28 + $8 Handling) = $36 U.S.
               - Registration and Source Code ($56 + $8 Handling) = $64 U.S.
                 (All prices will be charged to your credit card in U.S.
               Dollars.)

               You can order OpenDoors with MC, Visa, Amex, or Discover from
               Public (software) Library by calling 800-2424-PsL or 713-524-6394
               or by FAX to 713-524-6398 or by CIS Email to 71355,470. You can
               also order online through the World Wide Web. For more
               information on how to do this, visit the OpenDoors Web site.
               (Information on the OpenDoors web site is provided on page 246.)
               You can also mail credit card orders to PsL at P.O.Box 35705,
               Houston, TX 77235-5705. When ordering by phone, you must call
               between 6:00am and 6:00pm CST on Monday to Thursday, or between
               6:00am and 12:30pm on Fridays.

               THE ABOVE NUMBERS ARE FOR CREDIT CARD ORDERS ONLY.
               THE AUTHOR OF THIS PROGRAM CANNOT BE REACHED AT THESE NUMBERS.

               Any questions about the status of the shipment of the order,
               refunds, registration options, product details, technical
               support, volume discounts, dealer pricing, site licenses, non-
               credit card orders, etc., must be directed to:

                              Brian Pirie
                              117 Cedarock Drive
                              Kanata ON  K2M 2H5
                              Canada

               To insure that you get the latest version, PsL will notify me the
               day of your order and I will ship OpenDoors directly to you. I
               will send OpenDoors by conventional mail unless I have previously
               heard from you, asking me to send your order by some other means.

               When ordering by credit card through PsL, please be sure to
               indicate whether you wish to order just the OpenDoors
               registration, or both the registration and source code. Also,
               please be sure to include your credit card billing address.
               Without this information, PsL will be unable to process your
               order.

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 14

HOW YOU CAN RECEIVE YOUR ORDER
-------------------------------------------------------------------------------

               For your convenience, I can send your OpenDoors registration key
               and/or source code by any of the following methods. If you are
               ordering OpenDoors by mail, simply check one of these options on
               your order form. If you are ordering through the third-party
               credit card service, I will automatically send your order by
               Internet email or conventional mail unless I receive a message
               from you before you order, asking me to send it by some other
               means.


-------------------------------------------------------------------------------
RECEIVING      If you wish to receive your OpenDoors registration key by
ORDER BY       Internet E-Mail (including Internet E-Mail to a CompuServe
INTERNET       account), fill out the order form and mail it along with your
E-MAIL         payment as described below. Be sure to include your e-mail
               address on your order form. Note that the source code cannot be
               sent via Internet e-mail.


-------------------------------------------------------------------------------
RECEIVING      In order to receive your OpenDoors registration key and/or
ORDER          source code by conventional mail, simply fill out the order
BY MAIL        form and mail it along with your payment as described below. I
               will cover the cost of postage. If your address contains non-
               Roman characters, also enclose a self-addressed envelope or
               mailing label.


-------------------------------------------------------------------------------
RECEIVING      If you wish to receive your OpenDoors registration key by
ORDER BY       FAX, fill out the order form and mail it along with your payment
FAX            as described below. Be sure to include your fax number on your
               order form. Do to choose this method if you are ordering the
               source code.


-------------------------------------------------------------------------------
RECEIVING      You may choose to receive your OpenDoors registration and/or
ORDER BY       source code by calling the OpenDoors BBS after your registration
CALLING        form and order fee have been received here. If you are unable to
OPENDOORS      receive your order by any other electronic means (such as a call
BBS            to your BBS, or by electronic mail), this may be the quickest
               way for you to receive your registration information and/or
               source code. The obvious disadvantage with to option is the fact
               that you will have to estimate when your order will arrive here
               in order to receive it as quickly as possible. You may end up
               calling the OpenDoors BBS more than once before your order has
               arrived. After your order form has arrived, your registration
               key and/or source code will be placed on hold for you, and you
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 15

               will be able to receive it on your first call to the BBS. The
               phone number of the BBS is:

                         +1 (613) 599-5554


-------------------------------------------------------------------------------
RECEIVING      In order to receive your OpenDoors registration key and/or
ORDER BY       source code by a message and/or upload to your BBS, fill out
CALL TO        the order form and mail it along with your payment as described
YOUR BBS       below. Be sure to include the phone number, baud rate, and my
               login and password for the BBS to which you would like me to
               call. As always, I will cover any long distance costs. If, for
               some reason, I am unable to connect to your BBS (not because it
               is busy, but, for example, if your BBS is no longer online), I
               will send your order by conventional mail instead.


-------------------------------------------------------------------------------
RECEIVING      In order to receive your OpenDoors registration key and/or
ORDER BY       source code by FidoNet CrashMail, simply fill out the order
FIDONET        form and mail it along with your payment as described below.
CRASHMAIL      Be sure to include the FidoNet node address to which you wish to
               have your registration key and/or source code sent to (via
               CrashMail). Again I will cover any long distance costs. If, for
               some reason, I am unable to connect to your FidoNet system, I
               will send your order by conventional mail instead.

























===============================================================================
OpenDoors 6.00 Manual                                           End of Page 16

ORDERING THE SOURCE CODE
-----------------------------------------------------------------------------

               Many people also choose to order the source code along with
               their OpenDoors registration. Ordering the source code will
               allow you to customize OpenDoors for your own use, use parts of
               the OpenDoors source code in other programs, and learn more
               about how OpenDoors works. If you have any ideas for changes
               that you would like to see in OpenDoors, either large or small,
               ordering the source code will allow you to makes these changes
               yourself, creating your own customized version of OpenDoors. You
               will be able to remove copyright notices, change the way certain
               OpenDoors functions work, or add new capabilities to OpenDoors
               in surprisingly little time. You will also be able to use any of
               the OpenDoors source code, be it the DesqView-aware code,
               EMS/disk swapping routines, configuration file system,
               communications routines, or anything else, in any other programs
               that you write. Also, ordering the OpenDoors source code will
               allow you to learn more about how OpenDoors works, and how to
               program communications software and BBS door programs.

               When you order the OpenDoors source code, you will receive the
               source code package. The source code package also includes a
               short "Source Code Manual", with a description of how the
               OpenDoors source code is organized, instructions on how to
               recompile the source code, and more. If you choose to receive
               the source code package electronically, you will receive it in
               the form of a single .ZIP file. If you choose to receive the
               source code package by mail, you will receive it on a 3-1/2"
               diskette.

REQUIREMENTS   Due to the wide variety of compilers that are available, and the
               differences between them, I have been unable to test the
               OpenDoors source code with every compiler. This means that you
               may need to make some changes to the source code in order to
               compile it with certain compilers.

               In order to compile the DOS version of OpenDoors, you must be
               using a compiler that supports inline assembly language
               keywords. This includes all Borland compilers released since
               1991, and many other compilers. The one notable exception is
               Watcom's compiler, which does not support inline assembly
               language at the time of this writing.

               For your information, the DOS OpenDoors libraries included with
               this package were compiled using Turbo C++ 1.0 Professional. The
               Win32 libraries included with this package were compiled using
               Microsoft Visual C++ 2.0. This means that you can be reasonably
               certain that OpenDoors will compile with these compilers and any
               more recent compilers by these companies without any changes.


===============================================================================
OpenDoors 6.00 Manual                                           End of Page 17

--------------------------------------------------------------------------
                       OPENDOORS 6.00 ORDER FORM
--------------------------------------------------------------------------

 REGISTRATION NAME : _______________________________   (AS SHOULD APPEAR IN
                                                        REGISTRATION)
         YOUR NAME : _______________________________   (IF DIFFERENT)

    POSTAL ADDRESS : ______________________________________________________

                     ______________________________________________________

                     ______________________________________________________

  E-MAIL ADDRESSES : ____________________________________   (IF APPLICABLE)

   ADDITIONAL INFO : ______________________________________________________
                     (EG FAX/BBS PHONE NUMBER & BRIAN'S PASSWORD, IF NEEDED)

I WISH TO RECEIVE MY ORDER BY:
          ___                                ___
         |   | - INTERNET E-MAIL (FASTEST)  |   | - I WILL CALL BRIAN'S BBS
         |___|                              |___|
          ___                                ___
         |   | - CONVENTIONAL MAIL          |   | - CALL TO MY BBS
         |___|                              |___|   (INCLUDE LOGIN INFO)
          ___                                ___
         |   | - FAX (INCLUDE FAX #)        |   | - FIDONET "CRASHMAIL"
         |___|                              |___|

                        ___
I WOULD LIKE TO ORDER: |   | - BOTH REGISTRATION KEY AND SOURCE CODE
                       |___|   ($56 US, $68 CANADIAN, OR EQUIVALENT FUNDS)
                        ___
                       |   | - JUST MY REGISTRATION KEY
                       |___|   ($28 US, $34 CANADIAN, OR EQUIVALENT FUNDS)
                        ___
                       |   | - UPGRADE TO SOURCE CODE (ONLY IF ALREADY
                       |___|   REGISTERED) ($28 US, $34 CANADIAN OR EQUIV.)


I AGREE TO THE REGISTRATION TERMS,             ____________________________
SET FORTH ON PAGE 20 OF THE MANUAL             (SIGNATURE)

MAKE CHEQUES PAYABLE TO:   BRIAN PIRIE
                           117 CEDAROCK DRIVE
                           KANATA ON  K2M 2H5
                           CANADA
+-- OFFICIAL USE ONLY ----------------------------------------------------+
|                                                                         |
| S.N. : _____________  SENT : _________________________________________  |
+-------------------------------------------------------------------------+
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 18

--------------------------------------------------------------------------
                         OPENDOORS 6.00 FEEDBACK FORM
--------------------------------------------------------------------------

YOUR NAME :  _______________________________


WHICH OPENDOORS LIBRARY(S) DO YOU EXPECT TO USE:
             ___
            |   | - DOS VERSION, MEMORY MODELS: _________________________
            |___|
             ___
            |   | - WINDOWS (WIN32) VERSION
            |___|


HOW DID YOU FIRST LEARN OF OPENDOORS?

             ____________________________________________________________


WHICH COMPILER(S) AND VERSION(S) ARE YOU USING?

             ____________________________________________________________


WHAT DO YOU LIKE MOST ABOUT OPENDOORS?

             ____________________________________________________________

             ____________________________________________________________


WHAT CHANGES OR ADDITIONS WOULD YOU LIKE TO SEE IN FUTURE VERSIONS?

             ____________________________________________________________

             ____________________________________________________________


DO YOU HAVE ANY ADDITIONAL COMMENTS?

             ____________________________________________________________

             ____________________________________________________________

             ____________________________________________________________


-----------------------------------------------------------------------------


===============================================================================
OpenDoors 6.00 Manual                                           End of Page 19

TERMS OF REGISTRATION AND SOURCE CODE USE
-----------------------------------------------------------------------------

               When you purchase an OpenDoors registration and/or source code
               license, you are entitled to almost unlimited use of all
               versions of OpenDoors. However, in order to protect my
               investment of time and effort in developing OpenDoors, you must
               also agree to the terms outlined below when licensing OpenDoors
               and/or the source code. These terms are intended to be very
               reasonable, and are in no way intended to limit your use of
               OpenDoors. The primary intent of these terms is that you are not
               permitted to disclose your OpenDoors registration information,
               or the OpenDoors source code, to other individuals. The terms of
               registration and source code use are as follows:

               For the purpose of these terms, "OpenDoors" is defined to be the
               library files, header files, example programs and programmer's
               manual of all versions, past and present, for all languages and
               platforms of the OpenDoors online software programming toolkit.
               In the case of a source code license, OpenDoors also refers to
               the source code that is used to build OpenDoors. Upon licensing
               OpenDoors, the individual or organization named on the order
               form (the licensee) is entitled to use of all versions of
               OpenDoors, within the terms set forth below. Violation of these
               terms will be considered copyright infringement, and grounds for
               the termination of the registration agreement. The licensee is
               entitled, at no additional cost, to use, distribute or sell the
               executable (.EXE or .COM) files that are built from OpenDoors.
               The licensee is also entitled to use, distribute or sell the
               example programs, example configuration files and portions of
               the manual. If licensing the source code, the licensee is also
               entitled to distribute or sell any executable files that result
               from using altered versions of the source code, or portions
               thereof, provided that it is not possible for other programmers
               to access the OpenDoors API functions through this executable
               file. The licensee is NOT entitled to distribute the
               registration key number that is provided by Brian Pirie, nor any
               portions of the OpenDoors source code. For the purposes of these
               terms, an organization is considered to be a company or non-
               profit organization. If the licensee is an organization, the
               registration key and source code may be shared among members of
               the organization, under the condition that these individuals are
               using the registration and/or source code only for official
               activities of that organization. These terms in no way suggest
               an agreement on the part of Brian Pirie to develop any future
               versions of OpenDoors, or fix any bugs in current versions of
               OpenDoors. OpenDoors is offered "as is", and no warrantees are
               expressed or implied. In no event shall Brian Pirie be liable
               for any loss of profit or any other damage, including but not
               limited to special, incidental, consequential or other damages.


===============================================================================
OpenDoors 6.00 Manual                                           End of Page 20

  3333
 33  33
     33
   333
     33
 33  33
  3333
-------------------------------------------------------------------------------
CHAPTER 3 - OPENDOORS TUTORIAL




ABOUT THIS MANUAL
-------------------------------------------------------------------------------

               The OpenDoors programmer's manual is intended to serve as a
               complete tutorial, guide and reference to writing programs with
               OpenDoors. Chapter 1 of this manual, beginning on page 5,
               provides an introduction and overview of the features of
               OpenDoors. If you are unsure of what OpenDoors will do for you,
               begin with Chapter 1. Chapter 2, beginning on page 9, provides
               important information related to this evaluation copy of
               OpenDoors, and how to register your copy. Chapter 3 serves as a
               tutorial on OpenDoors and BBS door programming in general.
               Chapter 4 provides a reference to the OpenDoors API functions
               which you can use in your programs. Chapter 5 provides a
               reference to the "OpenDoors control structure", which gives you
               access to a wide array of information, and allows you to
               customize OpenDoor's appearance and behavior. Chapter 6 provides
               information on special OpenDoors features and advanced door
               programming topics. Among the subjects discussed in chapter 6
               are the Win32 version of OpenDoors, configuration files, multi-
               node operation, RIP graphics, logfile support, defining custom
               door information file formats, and more.

               Chapter 7 (which begins on page 242) gives instructions on
               troubleshooting programs written with OpenDoors, lists solutions
               to common difficulties, and has information about the many
               sources for OpenDoors support. If at any time you are having
               difficulty with OpenDoors, be sure to refer to this chapter for
               complete step-by-step instruction on tracing the source of your
               problem, and for solutions to common difficulties with
               OpenDoors. This chapter also directs you to some of the major
               sources of support, including information on the OpenDoors email
               conference, the OpenDoors support BBS, and how to get in touch
               with me.

               You will also find many useful tools in this manual, which will
               no doubt come in useful while working with OpenDoors. Beginning
               on page 2 is a basic table of contents, showing you how the
               manual is organized, and helping you to locate general topics.
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 21

               At the end of the manual, beginning on page 267, is an index to
               help you locate more information on specific topics. The manual
               also includes a glossary, on page 256, which will help you in
               understanding new terms that you may come across while reading
               the manual. At the end of the manual, you will also find several
               useful sections, such as information on what is new in this
               version, information on how to contact me, and information about
               new OpenDoors features currently in the works.

               You will likely want to print this manual, to make reading and
               reference while programming easier. To print this manual, simply
               type the following line from your DOS prompt. If you are worried
               about the size of this manual, you might consider using a
               utility that can print multiple pages of a text file on a single
               sheet of paper. Printing two manual pages per side of paper
               should certainly be legible, and even four-up would give you
               text about the size of average newspaper text. Printing on both
               sides, you should be able to fit the manual on about 34 sheets
               of paper (269/8 < 34).




COMPILING A PROGRAM WITH OPENDOORS
-------------------------------------------------------------------------------

               The process of compiling a program written with OpenDoors is
               very similar to that of compiling any other program. However,
               there are two additional steps which you must be sure to
               remember:

               1.)  You must include the OPENDOOR.H header file.

               2.)  You must link your program with the appropriate OpenDoors
                    library file.


               All programs written with OpenDoors, must "include" the
               OPENDOOR.H header file. If you have placed the OPENDOOR.H header
               file in the same directory as your program's source code, place
               the following line at the beginning of your .C or .CPP file(s):

                    #include "opendoor.h"

               If you have placed the OPENDOOR.H header file in the same
               directory as other standard header files (such as stdio.h),
               place the following line at the beginning of your .C or .CPP
               file(s):

                    #include <opendoor.h>


===============================================================================
OpenDoors 6.00 Manual                                           End of Page 22

               In addition to including the OpenDoors header file in your
               source code modules, you must also "link" the appropriate
               OpenDoors library file with your program. The procedure for
               doing this depends upon which compiler you are using. The
               following sections describe how to link with the OpenDoors
               libraries using various compilers.



LINKING WITH OPENDOORS USING A DOS COMPILER
-------------------------------------------------------------------------------

               This section describes how to link with the provided OpenDoors
               library files under a variety of DOS compilers. If you are using
               a compiler other than those described here, refer to your
               compiler's manual for information on how to link with third-
               party libraries.

               If you are using Borland Turbo C 2.00 or earlier, you can cause
               your compiler to link your program with the OpenDoors library by
               creating a text file with a .PRJ extension. In this text file,
               you should list the names of your program's .C modules, along
               with the name of the appropriate OpenDoors library file, as
               listed in the table at the end of this section. You should then
               select this Project file from within the Turbo C IDE prior to
               compiling your program.

               If you are using Turbo C++ or Borland C++, you can set your
               compiler to link your program with the OpenDoors library by
               creating a project file from within the IDE. To do this, choose
               the Open Project command from the Project menu, and enter the
               name for your new project file in the Load Project dialog box.
               Then add the names of your program's .C/.CPP modules, along with
               the name of the appropriate OpenDoors library file, by pressing
               [Insert] in the project window. When you return to Turbo C++ or
               Borland C++ again, you can work with the same project file by
               using the Open command from the Project menu.

               If you are using any Microsoft C compiler, such as Quick C,
               Microsoft C or Visual C++, you can set your compiler to link
               your program with the OpenDoors library by creating a makefile.
               You can create a new project file from within Quick C by using
               the Set Program List option from the Make menu. You can do this
               from within Visual C++ by using the New command from the Project
               menu. You should add the names of your program's .C/.CPP source
               files, along with the name of the appropriate OpenDoors library
               file, to the newly create makefile.

               There are several different DOS library files included with
               OpenDoors, each one for use with a different memory model. The
               following chart lists the library file names, along with their
               corresponding memory model. It is important that you use the
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 23

               library file which corresponds to the memory model you are
               using. Whenever you change your compiler to use a different
               memory model, it is important to rebuild all of your source
               files (using the "Build All" or "Rebuild All" command) in
               addition to changing the library that your program is being
               linked with. If you are unfamiliar with the concept of memory
               models, you should refer to your compiler's manuals. If you are
               unsure as to what memory model your compiler is currently using,
               check this setting in the compile options dialog box or command
               line reference information.

                 +------------------------------------------------+
                 | Library     | Memory                           |
                 | Filename    | Model                            |
                 |-------------|----------------------------------|
                 | ODOORS.LIB  | DOS small memory model library   |
                 |             |                                  |
                 | ODOORM.LIB  | DOS medium memory model library  |
                 |             | (Available separately)           |
                 |             |                                  |
                 | ODOORC.LIB  | DOS compact memory model library |
                 |             | (Available separately)           |
                 |             |                                  |
                 | ODOORL.LIB  | DOS large memory model library   |
                 |             |                                  |
                 | ODOORH.LIB  | DOS huge memory model library    |
                 +------------------------------------------------+

               To understand how to compile a program written with OpenDoors,
               it is a good idea to try compiling one of the example programs,
               such as ex_hello.c, that are included in the OpenDoors package.




LINKING WITH OPENDOORS USING A WINDOWS COMPILER
-------------------------------------------------------------------------------

               The Win32 version of OpenDoors resides in a DLL, ODOORS60.DLL.
               In order to use OpenDoors from a Win32 program, you will
               typically link to an import library (although it is also
               possible to use load-time dynamic linking through the use of
               LoadLibrary() and GetProcAddress()). The OpenDoors package
               includes a COFF-format import library for use Microsoft
               compilers, named ODOORW.LIB. If you are using a compiler that
               uses OMF-format object files, such as a Borland compiler, you
               will need to create your own version of the odoorw.lib import
               library, by using the implib utility provided with your
               compiler.

               When compiling an OpenDoors program with a Windows compiler, be
               sure that either the WIN32 or __WIN32__ constant is defined.
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 24

               Microsoft and Borland compilers define one of these constants by
               default. However, if you are using a compiler from another
               company, you may need to explicitly configure your compiler to
               define one of these preprocessor constants.

               If you are using Microsoft Visual C++ 2.0 or later, you can
               setup your compiler to link with the OpenDoors import library by
               creating a makefile (choose File|New|Project) and adding both
               your program's .C/.CPP source file(s) and the odoorw.lib import
               library to the project. When prompted for the Project type,
               choose "Application", not a "MFC AppWizard". If you are using
               Visual C++ 2.0, then you must manually edit the .mak file using
               a text editor. In this file, replace all occurrences of
               "/SUBSYSTEM:windows" with "/SUBSYSTEM:windows,4.0". This
               instructs the linker to create an executable file that is
               targeted for Windows 95. If you do not do this, some of the
               OpenDoors visual elements will not appear correctly. Later
               versions of Microsoft's compiler default to using
               "/SUBSYSTEM:windows,4.0", and so this step is no longer
               necessary with those compilers.

               If you are using Borland C++ 4.50 or later, you must create an
               OpenDoors import library for ODOORS60.DLL before you can compile
               your first OpenDoors program. To do this, go to the directory
               where ODOORS60.DLL is located, move the original odoorw.lib to a
               backup location, and issue the command:

                    IMPLIB ODOORW.LIB ODOORS60.DLL

               This will create a new import library (ODOORW.LIB) which you can
               then use with your compiler. To compile an OpenDoors program
               from the command line, issue the command:

                    BCC32 -tW your_program.c ODOORW.LIB

               To compile an OpenDoors program from within the IDE, create a
               new project file, and add both your program's source file(s) and
               the OpenDoors import library to that project. If you are
               compiling from within the IDE, check the TargetExpert and be
               sure that you are using the multithreaded version of the the
               runtime libraries. By default, the Borland IDE compiles single-
               threaded, which will not work with OpenDoors.

               Additional information on the Win32 version of OpenDoors is
               provided in chapter 6.







===============================================================================
OpenDoors 6.00 Manual                                           End of Page 25

RUNNING A DOOR PROGRAM WRITTEN WITH OPENDOORS
-------------------------------------------------------------------------------

               This section provides information on how to run a BBS door
               program that has been written with OpenDoors. If you are using
               OpenDoors to write some other form of online software, the
               information provided here will apply to different degrees,
               depending on the nature of your program.

               OpenDoors supports both local and remote modes. In the normal
               mode of operation, remote mode, your program's output will be
               displayed to both the local screen and the remote user's screen.
               To run your program in remote mode, you will usually set it up
               to run under some BBS package. However, for testing purposes, it
               is often convenient to run your program in local mode.

               There are several ways to start your program in local mode. The
               first method is to place the example DORINFO1.DEF file in the
               same directory as your program. If your program uses the
               OpenDoors command line processing function, od_parse_cmd_line(),
               then you can start your program in local mode by simply
               specifying -local on your program's command line. For example,
               you can try the example program include with OpenDoors by
               issuing the command VOTEDOS -LOCAL (for the DOS version) or
               VOTEWIN -LOCAL (for the Windows 95/NT version). OpenDoors will
               also run in local mode if you set it up to run under a BBS
               package, and log into the BBS in local mode. When the BBS runs
               your door program, OpenDoors will automatically run in local
               mode.

               To run your program in remote mode, you will probably want to
               run it under a BBS system. If you don't have a BBS package for
               testing purposes, you might want to obtain a popular BBS package
               such as Wildcat!, Maximus (which is free) or RemoteAccess.



RUNNING DOS-BASED DOOR PROGRAMS
-------------------------------------------------------------------------------

               DOS BBS packages typically run door programs using one of two
               methods. Either the BBS package directly loads and executes the
               program, or it exits to a DOS batch file, which in turn executes
               the door program. In either case, the BBS package produces a
               door information file, common called a "drop file", which
               provides information to the door program such as the name of the
               current user. OpenDoors automatically supports the common drop
               file formats, including DORINFOx.DEF and DOOR.SYS.



RUNNING WINDOWS 95/NT DOOR PROGRAMS
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 26

-------------------------------------------------------------------------------

               This section provides information specific to running door
               programs that are compiled with the Win32 version of OpenDoors.
               Please feel free to include this information in your program's
               manual.

               Since the Win32 version of OpenDoors resides in a DLL,
               ODOORS60.DLL, this file must be present on any system where your
               program will be run. Although Windows 95/NT will find this file
               if it is located in the same directory as your program's
               executable file, it is a good idea to install this DLL into the
               Windows system directory. This way, all programs using the Win32
               version of OpenDoors can share the same copy of the DLL,
               reducing the amount of disk space that is used.

               The required setup for a Windows 95/NT door will depend upon
               what BBS system it is being run under. If you the program is
               being run under a native Windows 95/NT BBS system, then ideally
               that BBS system will provide the ability to pass a live serial
               port handle to the door program, on the program's command line.
               Otherwise, you should run the door from a batch file, following
               the instructions provided below for running the program under a
               DOS-based BBS system. If the BBS system is able to pass a live
               Window communications handle on the door's command line, and you
               are using the OpenDoors standard command-line processing
               function (od_parse_cmd_line()), then you can just setup the BBS
               to run the program directly, using the command line:

                    YourProgramName.exe -handle xxxxxxxxxx

               where xxxxxxxxx is the serial port handle, in decimal format.
               You do not need to use the start command, nor the DTRON utility,
               and you do not have to change the COM<n>AutoAssign setting in
               the system.ini file.

               If you are running the Win32 door program under a DOS-based BBS
               system, or a Windows-based BBS system that is unable to pass a
               live serial port handle to the door program, then follow these
               steps:

               1.Add a line of the form "COM<n>AutoAssign=<x>" to the [386Enh]
                 section of your system.ini file. Here, <n> specifies the
                 serial port number that the BBS's modem is connected to, and
                 <x> will usually be 0. For example, if your modem is
                 connected to COM1, you would add a line such as
                 "COM1AutoAssign=0" (sans quotes). You will then have to re-
                 start your computer for this change to take effect. If you do
                 not do this, the Windows-based door program will not be able
                 to access the modem.


===============================================================================
OpenDoors 6.00 Manual                                           End of Page 27

               2.Setup the BBS software to run the Windows-based door program
                 just as you would any other door program. You will probably
                 want to do this from a batch file. The command line that runs
                 the Windows program should be of the form:

                    start /w /m YourProgramName.exe [any command line
                 parameters]

                 This will cause the Windows-based door program to start in
                 minimized mode, and cause the calling MS-DOS session to wait
                 until the Windows program exits before continuing. If you do
                 not wish the program to be started in minimized mode, remove
                 the /m from the command line. If you attempt to start the
                 door program by calling it directly, rather than using the
                 "start /w" command, the BBS software will immediately start
                 again, cause it to attempt to run simultaneously with the
                 door program.

               3.After running the start command, use DTRON.EXE or a similar
                 utility to re-enable DTR detection by the modem. Normally,
                 this command line will be of the form:

                    dtron /port x /bps y

                 Where x is the serial port number (0 for COM1, 1 for COM2,
                 etc.) and y is the locked bps rate. For example, if your
                 serial port is locked at 38400 bps and is connected to COM2,
                 you would use:

                    dtron /port 1 /bps 38400

                 For full information on the DTRON utility, simply type the
                 command line:

                    dtron /help

                 You may freely redistribute the DTRON utility that is
                 included in this package with your program.

               Additional information on the Win32 version of OpenDoors, and
               further explanation of some of these steps, is provided in
               chapter 6.










===============================================================================
OpenDoors 6.00 Manual                                           End of Page 28

BASICS OF DOOR PROGRAMMING WITH OPENDOORS
-------------------------------------------------------------------------------

               This section provides a complete tutorial to the basics of
               writing BBS door programs using OpenDoors. If you are using
               OpenDoors to write other online software, much of this
               information will still be relevant.

               In addition to reading this section, I would encourage you to
               look at the example programs included int the OpenDoors
               packages. These programs, which are described beginning on page
               38, will give you a much better idea of what an OpenDoors
               program will look like. These programs can also serve as a great
               starting point for writing your own programs using OpenDoors.

               Probably the best means of introduction to door programming with
               OpenDoors is by doing it yourself. As such, I strongly encourage
               you to try compiling and running the simple introduction program
               below. For instructions on compiling programs written with
               OpenDoors, see page 22.

               DOS version:

                    #include "opendoor.h"

                    main()
                    {
                       od_printf("Welcome to my first door program!\n\r");
                       od_printf("Press a key to return to BBS!\n\r");
                       od_get_key(TRUE);
                       od_exit(0, FALSE);
                    }

               Win32 version:

                    #include "opendoor.h"

                    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,LPSTR lpszCmdLine,int nCmdShow)
                    {
                       od_printf("Welcome to my first door program!\n\r");
                       od_printf("Press a key to return to BBS!\n\r");
                       od_get_key(TRUE);
                       od_exit(0, FALSE);
                    }

               Keep in mind that even this simple program will automatically
               have all of the door capabilities we have already mentioned.
               Notice the line that reads #include "opendoor.h". All programs
               written with OpenDoors must include the OPENDOOR.H header file
               in order to compile correctly. The first two lines in the
               main/WinMain function simply call the OpenDoors od_printf()
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 29

               function. od_printf() is similar to the printf() function that C
               programmers will already be familiar with. However, unlike
               printf(), the od_printf() function sends the output to both the
               modem and the local screen. Notice that the lines of text
               displayed by the od_printf() function end with a "\n\r"
               sequence, instead of the normal "\n". This is because the
               terminal emulation software that is running on the remote user's
               system usually requires both a carriage return and a line feed
               to correctly begin a new line. The next line in our example
               program is the OpenDoors single-key input function,
               od_get_key(). The TRUE value causes OpenDoors to wait for a key
               to be pressed (again, either from remote or local keyboard)
               before returning. The last line of the main/WinMain function is
               a call to od_exit(). Any program using OpenDoors should call
               this function. For the time being, you can always use the (0,
               FALSE) parameters.

               Once again, you are encouraged to try compiling and running this
               program, as described above. Congratulations, you have written
               your first door program! Feel free to make any changes to this
               program, and see what effects your changes have.

               To simplify this example, separate versions of this program are
               shown for the DOS and Win32 versions of OpenDoors. However, you
               would typically write your program so that it could be compiled
               using either the DOS or Win32 versions of OpenDoors, by
               beginning the mainline function as follows:

                    #ifdef ODPLAT_WIN32
                    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE
                    hPrevInstance,
                       LPSTR lpszCmdLine, int nCmdShow)
                    #else
                    int main(int argc, char *argv[])
                    #endif

               In case you are not entirely familiar with the operation of door
               programs, we will now provide an introduction to the internals
               of a door's operation. Keep in mind that OpenDoors automatically
               carries out most of these tasks for you. When any door program
               starts up, one of the first things it must do is to read the
               door information file(s) (sometimes called a "drop file") passed
               to it by the BBS. When a user is on-line, and wishes to run a
               door, they will most likely select a command from a menu. At
               this point, the BBS system (such as RemoteAccess, Maximus, PC-
               Board or whatever), will create a file of information about the
               system, who is currently on-line, and so on. Various BBS
               packages produce various styles of door information files.
               OpenDoors automatically recognizes and reads a wide variety of
               door information file formats. As a result, your doors will be
               able to run on a almost any BBS system.

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 30

               Fortunately, OpenDoors takes care of all the work involved in
               detecting and reading the door information file, and then
               initializing and communicating with the serial port for you. In
               order to carry out these tasks, along with setting up the status
               line, and so on, OpenDoors provides a function called od_init().
               If you do not explicitly call this function, the first call to
               any other OpenDoors function (such as the first time your door
               program outputs anything) will automatically cause the od_init()
               function to be called. As a result, upon the first call to an
               OpenDoors function, all of the initialization tasks for the door
               will automatically be carried out. However, there may be times
               when you will want your program to have access information about
               the user who is on-line, or carry out other actions which
               require od_init() to have been executed - prior to the point
               where you call any other OpenDoors functions. In this case, you
               will have to call od_init() yourself before you do any of these
               things.

               OpenDoors provides you with a C/C++ structure, by the name of
               od_control, which allows you to access all the available
               information about the user who is on-line, the system your door
               is running on, and also allows you to adjust various OpenDoors
               parameters. Depending on what BBS system your door is running
               under, the actual information available from the od_control
               structure will vary. For more information on the od_control
               structure, see the section on the control structure, beginning
               on page 148.

               Once the door has initialized itself, it will then begin
               communications with the user who is online. OpenDoors takes care
               of all communications, through its various input and display
               functions. When the door has finished, it will then write any
               information that has changed back to the door information file
               (if applicable), finish communicating with the modem, and return
               to the BBS. In OpenDoors, these shut-down operations are
               automatically performed you call the od_exit() function. This
               function will terminate the door's activity, OPTIONALLY hang up
               on the user (allowing you to provide either return to BBS or
               logoff options for exiting), and then exit with the specified
               errorlevel.

               One other important OpenDoors function that you should be aware
               of is the od_kernel() function. od_kernel() is the central
               OpenDoors control function, and is responsible for much of
               OpenDoor's updating of the status line, monitoring the carrier
               detect and user timeout status, responding to sysop function
               keys, and so on. The od_kernel() function is called
               automatically by OpenDoors, within the other OpenDoors
               functions. As a result, since most door programs will call some
               OpenDoors function on a regular basis, you will most often have
               no need to call the od_kernel() function yourself. However, if
               your door is going to perform some action, such as updating data
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 31

               files, during which it will not call any OpenDoors function for
               more than a few seconds, you should then call the od_kernel()
               function yourself. For more information on the od_kernel()
               function, see page 97.

               For more information on the functions available from OpenDoors,
               or the control structure, see the corresponding sections in this
               manual.












































===============================================================================
OpenDoors 6.00 Manual                                           End of Page 32

TOUR OF A SAMPLE DOOR PROGRAM: "EX_VOTE"
------------------------------------------------------------------------------

               One of the best ways to see how OpenDoors works, and the
               potential that it has, is to look at the example programs
               included in the OpenDoors package. A brief description of each
               of these programs can be found on page 38. This section takes a
               closer look at one of the example programs, EX_VOTE.C. Unlike
               our simple example in the previous section, EX_VOTE.C is a much
               more complicated program, taking advantage of many of the
               advanced features of OpenDoors. Even if you do not understand
               everything that EX_VOTE.C does, you should be able to make use
               of various elements demonstrated here, in your own programs.

               The OpenDoors package includes a two compiled versions of
               EX_VOTE. VOTEDOS.EXE is a plain-DOS program which can run under
               DOS, Windows or OS/2. VOTEWIN.EXE was compiled using the Win32
               version of OpenDoors, and so it runs only on Windows 95/NT. The
               OpenDoors package also contains a sample door information file,
               DORINFO1.DEF. You can use this file to test any doors in local
               mode. If you wish to manually create your own DORINFO1.DEF file,
               you can do so very easily. The DORINFO1.DEF door information
               file is a simple text file which lists a different piece of
               information on each line, in the following format:

               +----------------------------------------------------------+
               | LINE NUMBER | DESCRIPTION            | EXAMPLE           |
               +-------------+------------------------+-------------------|
               |     1       | Name of the BBS        | MY OWN BBS        |
               |     2       | Sysop's first name     | BRIAN             |
               |     3       | Sysop's last name      | PIRIE             |
               |     4       | Com Port modem is on   | COM0              |
               |     5       | Baud rate, etc.        | 0 BAUD,N,8,1      |
               |     6       | Unused                 | 0                 |
               |     7       | User's first name      | JOHN              |
               |     8       | User's last name       | PUBLIC            |
               |     9       | Caller's location      | OTTAWA, ON        |
               |     10      | ANSI mode (0=off, 1=on)| 1                 |
               |     11      | User's security level  | 32000             |
               |     12      | User's time left       | 60                |
               +----------------------------------------------------------+


               Feel free to make any changes you wish to EX_VOTE.C, and
               recompile it. One of the most effective and enjoyable ways to
               learn OpenDoors is by experimenting. If you are a registered
               owner of OpenDoors, you may even distribute your own versions of
               this door. Also, you may find that EX_VOTE.C serves as a good
               framework for building your own door programs.

               The EX_VOTE.C door behaves similarly to most other door
               programs, and will have a fair bit in common with any other door
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 33

               you write in OpenDoors. What you see in the output window is
               identical to what a remote user will be seeing. If the user has
               ANSI, AVATAR or RIP mode turned on, you will see the same colors
               as they do, and if they have screen clearing turned on, your
               screen will be cleared when theirs is. The status line at the
               bottom of the window will list the name of the user currently
               on-line (if you are using the sample DORINFO1.DEF file, the
               user's name will be "The Sysop"), the user's location, and the
               user's baud rate (0 if the door is operating in local mode). The
               local display also shows how much time the user has left,
               whether the user has paged the system operator for a chat, and
               other information.

               There are a number of special commands that are only available
               to the system operator on the local keyboard. These commands
               allow the system operator to hang up on the user, adjust the
               amount of time the user may remain online, enter chat mode with
               the user, enter a DOS shell (in the DOS version), and so on. In
               the DOS version, help on these commands is available on the
               status line by pressing the [F9] key. In the Windows version,
               these commands are listed on the menu that appears at the top of
               the window.

               Now, let us take a closer look at the actual source code for the
               EX_VOTE.C door. If you have not already printed out a copy of
               this manual, and possibly the EX_VOTE.C file as well, it would
               probably be a good idea to do so now.

               Notice that near the top of the program, along with all the
               standard header files, the OPENDOOR.H file is included. This
               file must be included in all programs written under OpenDoors.
               If you are placing the OPENDOOR.H file in the same directory as
               the door you are compiling, simply include the line:

                                    #include "opendoor.h"

               in your program.

               The main()/WinMain() function of the EX_VOTE.C program has a
               for(;;) loop that repeatedly displays the main menu, obtains a
               choice from the user and responds to the command, until the user
               chooses to exit the program. Before the main menu is displayed,
               the screen is cleared by calling od_clr_scr(). The od_clr_scr()
               function will clear both the local and remote screens, but only
               if the user has screen clearing enabled. Refer to page 57 for
               information on how to force the screen to be cleared, regardless
               of the user's screen clearing setting. The main menu is
               displayed using the od_printf() function, one of the most common
               OpenDoors functions you will use. Next, od_get_answer() is used
               to obtain a menu choice from the user from the specified set of
               keys. Next, a switch() statement is used to respond to the
               user's command appropriately. If the user presses the P key to
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 34

               page the system operator, od_page() is called. If the user
               chooses to return to the BBS, od_exit() is called to terminate
               OpenDoor's activities and return control to the BBS. The FALSE
               parameter passed to od_exit() indicates that OpenDoors should
               not disconnect (hangup) before exiting. If the user chooses to
               log off, EX_VOTE.C first confirms this action with the user, and
               then calls od_exit() with the TRUE parameter. The numerical
               parameter passed to od_exit() sets the errorlevel that OpenDoors
               will exit with.

               In its ChooseQuestion() function, EX_VOTE.C uses the OpenDoors
               function od_get_key(). This function is similar to the
               od_get_answer() function that we have already seen. However,
               unlike od_get_answer() which will wait until the user presses
               some key from the list of possibilities you provide,
               od_get_key() will allow the user to press any key. od_get_key()
               accepts a single parameter. If this parameter is TRUE,
               od_get_key() will wait for the user to press a key before
               returning. If this parameter is FALSE, od_get_key() will return
               immediately with a value of 0 if there are no keys waiting in
               the inbound buffer, and returning the next key if there are
               characters waiting.

               In a number of places, EX_VOTE.C also uses the od_input_str()
               function. Unlike od_get_key() and od_get_answer() which return a
               single character, od_input_str() allows the user to input and
               edit a string of many characters. You will only receive the
               string entered by the user after they press the enter key.
               od_input_str() accepts four parameters: the string where the
               user's input should be stored, the maximum number of characters
               to input, the minimum character value to accept and the maximum
               character value to accept.

               Another new feature of OpenDoors that is used by EX_VOTE.C is
               the OpenDoors control structure, od_control. This global
               structure is documented in chapter 5 of this manual. The
               OpenDoors control structure allows you to access a wide variety
               of information about the user who is currently online, the BBS
               system your program is running on, and also allows you to
               control various OpenDoors settings. For example, EX_VOTE.C
               compares the current user name (od_control.od_user_name) with
               the name of the system operator (od_control.od_sysop_name) to
               determine whether it is the system operator who using the
               program.

               EX_VOTE.C uses two data files, the first of which contains a
               record for every user, and the second of which contains a record
               for every question. EX_VOTE.C accesses these data files in a
               controlled manner in order to permit the program to be running
               simultaneously on multiple lines on a multi-node BBS system.
               When EX_VOTE.C needs to update a data file, it opens it for
               exclusive access, so that only one node can access the file at
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 35

               any given time. Since the data file could have been changed by
               another node since the time that EX_VOTE.C last read the file,
               it always reads a record, makes changes to it and then re-writes
               the record while it has the file open for exclusive access. It
               then closes the file as soon as possible after opening the file,
               in order to permit other nodes to once again access the file.
               Because EX_VOTE.C keeps track of which questions each user has
               voted on, along with the questions and results of voting on each
               question, its data file format is more complex than many door
               programs (although not as complex as others).

               EX_VOTE.C also uses color. One of the easiest ways to use
               different colors in an OpenDoors program is to use the
               OpenDoor's print color-setting extensions. You can change the
               color of text display at any point in an od_printf() format
               string using by enclosing the name of new display color in back
               quote characters (`, not '). For example:

                    od_printf("`red`This is in red `green`This is green\n\r");

               Would cause the words "This is in red" to be displayed in red,
               and the words "This is in green" to be displayed in green.

               EX_VOTE.C also takes advantage of a number of OpenDoors
               capabilities that you can optionally choose to include in your
               door programs. You will notice that there are a number of new
               lines at the beginning of the main() function, all of which
               change settings in the OpenDoors control structure. The line:

                    od_control.od_config_file = INCLUDE_CONFIG_FILE;

               causes the OpenDoors configuration file system to be included in
               your program. Using this system, OpenDoors automatically reads a
               configuration file that can be used by the system operator to
               change various program settings. Refer to the included door.cfg
               file for an example OpenDoors configuration file. In addition to
               the configuration file settings automatically supported by the
               configuration file system, you can also add your own
               configuration file settings. To do this, you simply supply
               OpenDoors with a callback function that it will call whenever it
               encounters an unrecognized keyword in the configuration file.
               The line:

                    od_control.od_config_function = CustomConfigFunction;

               Causes OpenDoors to call the function CustomConfigFunction() in
               EX_VOTE.C for this purpose. You will notice that the
               CustomConfigFunction() receives two parameters - the first is
               the unrecognized keyword, and the second is any parameters that
               follow the keyword in the configuration file. EX_VOTE.C checks
               for two special configuration file lines - one to set whether or

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 36

               not users can add questions, and one to set whether or not users
               can view the results of a question before voting on it.

               The next line in the main() function,

                    od_control.od_mps = INCLUDE_MPS;

               causes the OpenDoors "Multiple Personality System" to be
               included in program. This allows the sysop to choose from a
               number of status line / sysop function key "personalities" that
               mimic a number of different BBS systems, using the Personality
               setting in the configuration file.


               The line:

                    od_control.od_logfile = INCLUDE_LOGFILE;

               causes the OpenDoors log file system to be included in the
               program. The OpenDoors log file system automatically records the
               date and time of program startup, exit and other major actions
               in the specified file. EX_VOTE.C also writes its own log file
               entries by calling the od_log_write() function.

               EX_VOTE.C also provides the ability for the sysop to provide
               their own ASCII/ANSI/AVATAR/RIP files to be displayed in place
               of the normal main menu. EX_VOTE.C uses the od_hotkey_menu()
               function to display a VOTE.ASC/.ANS/.AVT/.RIP file for the main
               menu, if such a file exists. If the file is not available, the
               normal EX_VOTE.C menu is used instead. The od_hotkey_menu()
               function will automatically select the appropriate file
               (.ASC/.ANS/.AVT/.RIP) for the current display mode, and the user
               is able to make a menu choice at any time. If a menu choice is
               made before the menu is entirely displayed, the function will
               stop displaying the menu and return immediately.

















===============================================================================
OpenDoors 6.00 Manual                                           End of Page 37

OTHER EXAMPLE PROGRAMS INCLUDED WITH OPENDOORS
------------------------------------------------------------------------------

               In addition to the EX_VOTE.C program, which is discussed in
               detail in the previous section, a number of other example
               programs are included with OpenDoors. These programs help to
               demonstrate what is possible with OpenDoors. They can also serve
               as excellent tools to help you learn OpenDoors. In addition, you
               are free to include any portions of any of these example
               programs in your own programs. Below is a summary of each of
               these example programs:


-------------------------------------------------------------------------------
EX_HELLO.C     This an example of a very simple door program that displays a
               short message and prompts for the user to press a key. After the
               user presses a key, the door exits and control is returned to
               the main BBS software. Despite the fact that it only consists of
               a few lines of code, EX_HELLO remains a fully functional door
               program. For information on compiling an OpenDoors door program,
               see the section that begins on page 22.


-------------------------------------------------------------------------------
EX_CHAT.C      This program is an example of a multi-window full-screen chat
               door written with OpenDoors. EX_CHAT demonstrates the ease of
               using sophisticated ANSI / AVATAR / RIP terminal features within
               OpenDoors programs. For instructions on how to compile this
               program, see the section that begins on page 22.

               This program create two windows on the screen, separated by a
               bar with user name / sysop name information. This program
               permits communication between the local sysop and remote user by
               displaying the text typed by the user in one window, and the
               text typed by the sysop in the other window. When either
               person's typing reaches the bottom of the window, the contents
               of the window is scrolled up to provide more room for typing.
               Words are also wrapped when either typist reaches the end of a
               line. The advantage of a split-screen chat program is that it
               permits both sysop and user to type at the same time without
               difficulty. The chat function automatically invokes OpenDoor's
               internal chat mode if ANSI, AVATAR or RIP modes are not
               available. The display colors, window sizes and locations, and
               distance to scroll a window's contents are configurable by
               setting the appropriate variables, below. When the Sysop invokes
               a DOS shell, a pop-up window is displayed to indicate to the
               user that the door program has been suspended.

               The chat feature of this program can also be easily integrated
               into other doors you write, and may be used to replace the
               existing OpenDoors line-oriented chat system.

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 38


-------------------------------------------------------------------------------
EX_MUSIC.C     This example door demonstrates how to play "ANSI" music and
               sound effects in an OpenDoors door. Included in this program is
               a function to send "ANSI" music to the remote system, and a
               function to text the remote system's ability to play "ANSI"
               music. You may use both of these functions in your own doors, if
               you wish to add music or sound effect capabilities. This program
               can be compiled by following the instructions that begin on page
               22.


-------------------------------------------------------------------------------
EX_SKI.C       This is a simple but addictive online game that is written using
               OpenDoors. In this action game, the player must control a skier
               through a downhill slalom course. The user may turn the skier
               left or right, and the game ends as soon as the player skis
               outside the marked course. The game begins at an easy level, but
               quickly becomes more and more difficult as the course to be
               navigated becomes more and more narrow. The game maintains a
               list of players with high scores, and this list may be viewed
               from the main menu.


-------------------------------------------------------------------------------
EX_VOTE.C      The EX_VOTE.C file contain the source code for the Vote example
               door, as is described beginning on page 38. The Vote example
               door allows users to vote on up to 200 different "polls", view
               the results of voting on each question, and optionally add their
               own questions for other users to answer.






















===============================================================================
OpenDoors 6.00 Manual                                           End of Page 39

    444
   4444
  44 44
 44444444
     44
     44
     44
-------------------------------------------------------------------------------
CHAPTER 4 - THE OPENDOORS API FUNCTIONS




OVERVIEW
------------------------------------------------------------------------------

               OpenDoors provides a wide set of features that you can take
               advantage of in your program. You control these features and
               access OpenDoors from your program using two facilities - the
               OpenDoors API functions, and the OpenDoors control structure. In
               general, the API functions are used to actually accomplish a
               task, such as displaying something to the user, or retrieving
               input from the user. The OpenDoors control structure, on the
               other hand, is used to alter OpenDoors settings or retrieve
               specific information.

               Any program written with OpenDoors makes use of the OpenDoors
               API functions for all of its door-related input and output. In
               addition to the common input and output tasks, the OpenDoors API
               functions provide access to many special capabilities, such as
               displaying ASCII/ANSI/AVATAR/RIP files, providing pop-up windows
               and menus, and much more. Much of the information about the user
               who is online, information about the system your door is running
               on, and settings which customize OpenDoor's behavior are
               controlled through the OpenDoors control structure. The control
               structure is described in the section beginning on page 148.

               This chapter is divided into the following sections:

                    i.)   TABLE OF MOST COMMONLY USED FUNCTIONS (Page 41)
                   ii.)  TABLE OF ALL OPENDOORS FUNCTIONS (Page 42)
                  iii.) DETAILED INFORMATION ON EACH FUNCTION (Pages 47 - 147)

               The two tables list the names of the OpenDoors functions, along
               with a brief description of the task performed by each function,
               and the page number on which the detailed description of that
               function can be found. The first table lists only the most
               commonly used OpenDoors functions, to allow you to quickly find
               the function you are most likely looking for. The second table
               lists all of the OpenDoors functions, grouped according to
               general categories of functionality.

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 40

               The section containing detailed information lists all of the
               functions in alphabetical order, with the information about each
               function beginning on a new page. This section includes a brief
               description of each function's purpose, a detailed description
               of how to use the function, the function call format, a list of
               related functions, and in many cases example source code showing
               you a typical use of the function.




TABLE OF MOST COMMONLY USED FUNCTIONS
------------------------------------------------------------------------------

               od_printf()         Displays text, with the ability to change
                                   display color. (page 110)

               od_clr_scr()        Clears the screen. (Page 57)

               od_input_str()      Inputs a string of one or more characters
                                   from the user. (Page 95)

               od_get_answer()     Inputs a single key from a list of possible
                                   choices ignoring upper/lower case. (Page 81)

               od_get_key()        Inputs any single key from the user.
                                   (Page 82)

               od_set_cursor()     Positions the cursor in ANSI/AVATAR/RIP
                                   modes. (Page 134)

               od_hotkey_menu()    Displays an ASCII/ANSI/AVATAR/RIP file, with
                                   the option of watching for a keypress from
                                   the user. (Page 90)

               od_popup_menu()     Displays a popup menu in ANSI/AVATAR/RIP
                                   modes. (Page 105)

               od_window_create()  Creates a popup window in ANSI/AVATAR/RIP
                                   modes. (Page 145)

               od_window_remove()  Removes a popup window in, restoring screen
                                   contents "underneath" window. (Page 147)









===============================================================================
OpenDoors 6.00 Manual                                           End of Page 41

TABLE OF ALL FUNCTIONS
-------------------------------------------------------------------------------
OUTPUT         TEXT DISPLAY FUNCTIONS
FUNCTIONS      ----------------------
               od_disp_str()            Displays a normal, NULL-terminated
                                        string. (page 63)

               od_disp()                Sends the specified number of
                                        characters to the modem, with or
                                        without local echo. (page 60)

               od_printf()              Performs formatted output, as the
                                        printf() function does. Also allows
                                        imbedded codes to change display color.
                                        (page 110)

               od_putch()               Displays a single character. (page 115)

               od_disp_emu()            Displays a string, interpreting
                                        imbedded ANSI/AVATAR terminal emulation
                                        codes. (page 62)

               od_repeat()              Displays the same character any number
                                        of times, using AVATAR optimization, if
                                        possible. (page 118)

               COLOR AND CURSOR CONTROL
               ------------------------
               od_set_color()           Sets current color to specified
                                        foreground and background settings.
                                        (page 131)

               od_set_attrib()          Sets current color to specified IBM-PC
                                        display attribute. (page 128)

               od_set_cursor()          Sets the position of the cursor, if
                                        ANSI/AVATAR/RIP mode is enabled. (page
                                        134)

               SCREEN MANIPULATION
               -------------------
               od_clr_scr()             Clears the screen, if user has screen
                                        clearing enabled. (page 57)

               od_save_screen()         Stores the current contents of the
                                        screen, to be later redisplayed using
                                        od_restore_screen(). Works in all
                                        display modes. (page 121)

               od_restore_screen()      Restores the contents of the screen, as
                                        previously stored using

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 42

                                        od_save_screen(). Works in all display
                                        modes. (page 120)

               BLOCK MANIPULATION
               ------------------
               od_clr_line()            Clears the remainder of current line.
                                        (page 55)

               od_gettext()             Stores any area of the screen, to later
                                        be displayed by od_puttext(). Requires
                                        ANSI/AVATAR/RIP graphics mode. (page
                                        89)

               od_puttext()             Displays text with color information,
                                        as previously stored using
                                        od_gettext(). Requires ANSI/AVATAR/RIP
                                        graphics mode. (page 116)

               od_scroll()              Scrolls a portion of the screen in
                                        ANSI/AVATAR/RIP graphics modes. (page
                                        123)

               POPUP WINDOWS AND MENUS
               -----------------------
               od_draw_box()            Draws a box on the screen in
                                        ANSI/AVATAR/RIP graphics mode. (page
                                        65)

               od_window_create()       Displays a popup window, storing the
                                        screen contents "under" the window.
                                        Requires ANSI/AVATAR/RIP graphics mode.
                                        (page 145)

               od_window_remove()       Removes a popup window displayed with
                                        od_window_create(), restoring the
                                        original screen contents "under" the
                                        window. Requires ANSI/AVATAR/RIP
                                        graphics mode. (page 147)

               od_popup_menu()          Displays a menu in a popup window,
                                        allowing the user to choose menu items
                                        either by pressing a "hot" key, or
                                        moving a highlighted selection bar.
                                        After menu selection, the menu may be
                                        removed, restoring the original screen
                                        contents "under" the window. Requires
                                        ANSI/AVATAR/RIP graphics mode. (page
                                        105)




===============================================================================
OpenDoors 6.00 Manual                                           End of Page 43

               FILE DISPLAY FUNCTIONS
               ----------------------
               od_send_file()           Displays an ASCII/ANSI/AVATAR/RIP file
                                        (for instance, an .ANS file created by
                                        a program such as "TheDraw" (page 124)

               od_hotkey_menu()         Displays an ASCII/ANSI/AVATAR/RIP menu
                                        file, with hotkeys active. (page 90)

               od_list_files()          Lists the files available for download
                                        in an area, using a FILES.BBS file.
                                        (page 98)


-------------------------------------------------------------------------------
INPUT          od_get_answer()          Inputs a single key from the keyboard,
FUNCTIONS                               allowing only particular responses.
                                        (page 81)

               od_get_input()           A more flexible version of
                                        od_get_key(), that also supports
                                        extended keys such as arrow keys,
                                        insert, etc. (page 82)

               od_get_key()             Inputs a single key from the keyboard,
                                        optionally waiting if a key is not
                                        available. (page 82)

               od_input_str()           Inputs a string of specified length,
                                        from the keyboard. (page 95)

               od_edit_str()            Formatted string editing function,
                                        requiring ANSI/AVATAR/RIP graphics.
                                        (page 68)

               od_multiline_edit()      Provides a text editor that allows the
                                        user to enter or edit text that spans
                                        multiple lines, such as email messages
                                        or text files. (page 101)

               od_clear_keybuffer()     Removes any waiting keys from the
                                        keyboard input queue. (page 53)


-------------------------------------------------------------------------------
COMMON         od_page()                Allows the user to page the sysop.
DOOR                                    (page 101)
ACTIVITY
FUNCTIONS      od_spawn()                    OpenDoors "quick" spawn function.
                                        Executes an external program (eg. file
                                        compressor, external protocol, etc.) on

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 44

                                        a separate screen, restoring the
                                        OpenDoors screen afterwards. (page 139)

               od_spawnvpe()            OpenDoors full-featured spawn function.
                                        Executes an external program on a
                                        separate screen, searching the path for
                                        the program, allowing you to specify an
                                        environment to pass to the child
                                        process, and returning the errorlevel
                                        returned by the child process. (page
                                        143)

               od_log_write()           Adds an entry to the end of the log
                                        file. (page 100)

               od_parse_cmd_line()      Handle standard command line options.
                                        (page 105)


-------------------------------------------------------------------------------
SPECIAL        od_init()                Begins door operation by setting up
CONTROL                                 the OpenDoors control structure,
FUNCTIONS                               setting up the local screen,
                                        initializing the serial port (if
                                        applicable), and reading the door
                                        information file. (page 92)

               od_color_config()        Transfers a color configuration line to
                                        a color attribute value. (page 59)

               od_add_personality()     Adds a custom status line/control key
                                        personality to OpenDoors. (page 47)

               od_set_statusline()      Temporarily alters the setting of the
                                        current OpenDoors status line. (page
                                        137)

               od_autodetect()          Automatically determines the remote
                                        terminal software's graphical
                                        capabilities. (page 48)

               od_kernel()              The central OpenDoors control function,
                                        which should be executed every few
                                        seconds. (page 97)

               od_exit()                Ends door operations, closing the
                                        serial port driver, re-writing the door
                                        information file, and optionally
                                        returning control to the BBS. (page 79)



===============================================================================
OpenDoors 6.00 Manual                                           End of Page 45

               od_carrier()             Allows detection of carrier signal in
                                        programs that have disabled OpenDoors
                                        internal checking. (page 51)

               od_set_dtr()             Controls the DTR signal to the modem.
                                        Can be used to manually disconnect a
                                        remote user, in order to perform
                                        activities such as call back
                                        verification. (page 135)

               od_chat()                Forces OpenDoors to enter chat mode,
                                        even if sysop did not press the "chat"
                                        key. (page 50)

               od_sleep()               Suspends program execution, yielding
                                        control to other tasks in a
                                        multitasking environment. (page 139)



































===============================================================================
OpenDoors 6.00 Manual                                           End of Page 46

OD_ADD_PERSONALITY()
-------------------------------------------------------------------------------

PURPOSE        Installs a custom status line / sysop function key personality
               into OpenDoors.


FORMAT         BOOL od_add_personality(char *pszName, BYTE btOutputTop,
                   BYTE btOutputBottom, OD_PERSONALITY_PROC *pfPerFunc);


RETURNS        TRUE on success
               FALSE on failure


DESCRIPTION    If used, this function should be called before any other
               OpenDoors API functions. This function installs a new
               personality into OpenDoors. The first parameter specifies the
               string that will be used to identify the personality. This is
               the string that the user will be able to supply in the
               configuration file to select this personality, and is also the
               string that can be passed to od_set_personality() to manually
               switch to this personality. The second and third parameters
               specify the 1-based to and bottom line numbers of the output
               window to be used with this personality. For instance, a top
               value of 1 and bottom value of 23 would cause all door output to
               be displayed on the first 23 lines of the screen, leaving the
               bottom two lines for use by the personality's status line. The
               last parameter is a pointer to the personality function, which
               OpenDoors will call to perform various operations with that
               involve the personality. For more information on personalities
               and the OpenDoors Multiple Personality System, see the section
               which begins on page 233.

               This function only has an effect under the DOS version of
               OpenDoors.

SEE ALSO       od_set_personality(), od_set_statusline()














===============================================================================
OpenDoors 6.00 Manual                                           End of Page 47

OD_AUTODETECT()
-------------------------------------------------------------------------------

PURPOSE        Attempts to automatically determine the terminal capabilities of
               the remote system.


FORMAT         void od_autodetect(int nFlags);


RETURNS        N/A


DESCRIPTION    This function can be used to determine whether or not the remote
               terminal supports ANSI and/or RIP (Remote Imaging Protocol)
               graphics modes. This information is usually supplied to the door
               by the BBS software, through the door information file. For this
               reason, most door programs do not need to make used of this
               function. However, if your door will be running under any BBS
               software that does not report the ANSI or RIP capabilities of
               the remote system, you may wish to use this function.
               od_autodetect() will set either of the following OpenDoors
               control structure variables to TRUE if the corresponding
               graphics mode is detected:

                    od_control.user_ansi     - TRUE if ANSI mode is available
                    od_control.user_rip      - TRUE if RIP mode is available

               However, if either of these variables have previously been set
               to TRUE (either explicitly by your program, or due to the
               corresponding modes being enabled in the door information file),
               and od_autodetect() does not detect the corresponding graphics
               mode, they will not be set to FALSE. Not all terminal software
               that supports ANSI or RIP graphics mode will necessarily have
               the ability to report their graphics mode capabilities to the
               door. For this reason, failure to detect either of these modes
               does not necessarily indicate that they are not available.
               However, if these modes are detected by od_autodetect(), it is
               safe to assume that the remote system does support the detected
               mode.

               The nFlags parameter is reserved for future use, and should
               always be set to DETECT_NORMAL.

               This function cannot auto-detect AVATAR mode, because there is
               no standard means of determining whether a remote system
               supports AVATAR mode.


EXAMPLE        Below is an example of using od_autodetect() in determining the
               remote terminal's graphics capabilities. Since not all terminal
               software supports auto-detection, this example will also prompt
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 48

               the user to determine their software's capabilities if
               od_autodetect() fails to detect ANSI mode. This code assumes
               that if the terminal software supports the autodetection of ANSI
               mode, that it will also support the autodetection of RIP mode.
               OpenDoors assumes that ANSI mode is always available in
               conjunction with RIP mode.

                    /* Call the automatic terminal detection function */
                    od_autodetect();

                    /* If ANSI mode was not detected, ask the user about
                    if(!od_control.user_ansi)
                    {
                       /* Prompt the user for ANSI capabilities */
                       od_clr_scr();
                       od_printf("Does your system support ANSI graphics?");
                       od_printf(" (Y/N)");

                       /* If the user chooses [Y]es */
                       if(od_get_answer("YN") == 'Y')
                       {
                          /* Turn on ANSI mode */
                          od_control.user_ansi = TRUE;

                          /* Since ANSI mode is present, RIP mode may also */
                          /* be available. Prompt the user for RIP. */
                          od_printf("\r\n\n");
                          od_printf("Does your system support RIP graphics?");
                          od_printf(" (Y/N)");

                          /* If the user chooses [Y]es */
                          if(od_get_answer("YN") == 'Y')
                             /* Turn on RIP mode */
                             od_control.user_rip = TRUE;

                          /* Since ANSI mode is present, AVATAR mode may  */
                          /* also be available. Prompt the user for AVATAR. */
                          od_printf("\r\n\n");
                          od_printf("Does your system support AVATAR ");
                          od_printf("graphics? (Y/N)");

                          /* If the user chooses [Y]es */
                          if(od_get_answer("YN") == 'Y')
                             /* Turn on AVATAR mode */
                             od_control.user_avatar = TRUE;
                       }

                       od_printf("\r\n\n");
                    }



===============================================================================
OpenDoors 6.00 Manual                                           End of Page 49

OD_CHAT()
-------------------------------------------------------------------------------

PURPOSE        Manually invokes sysop chat mode.


FORMAT         void od_chat(void);


RETURNS        N/A


DESCRIPTION    Normally, the OpenDoors sysop chat mode will only be invoked
               when the sysop explicitly requests it using the sysop chat key.
               However, there may be some cases where you wish to manually
               invoke the sysop chat mode. One example is when you are
               replacing the OpenDoors built-in chat mode with your own, but
               still wish to use the OpenDoors chat mode under some
               circumstances. For instance, you may wish to use your own split-
               screen chat routine if ANSI, AVATAR or RIP graphics mode is
               available, and use the OpenDoors line-oriented chat mode if only
               ASCII mode is available.


SEE ALSO       od_page()


EXAMPLE        For an example of using the od_chat() function, see the
               ex_chat.c example door, which is described on page 38.























===============================================================================
OpenDoors 6.00 Manual                                           End of Page 50

OD_CARRIER()
-------------------------------------------------------------------------------

PURPOSE        To determine the status of the carrier detect signal, in
               programs where OpenDoors' internal carrier detection has been
               disabled.


FORMAT         BOOL od_carrier(void);


RETURNS        TRUE if a carrier is present, or
               FALSE if no carrier is present, or in local mode.


DESCRIPTION    Usually, you will not have any use for the od_carrier()
               function, as OpenDoors automatically monitor's the carrier
               detect signal, and will correctly recover if the carrier detect
               signal is lost while the door is operating in remote mode.
               However, in some programs, you may wish to disable OpenDoors'
               internal carrier detection routines, using the
               od_control.od_disable variable. Two such cases in which you
               might want to do this, are a call-back verification door, which
               disconnects the user and attempts to call them back, or in a
               terminal program, which is in fact not a door at all (and as
               such you would not want to have OpenDoors exit when the carrier
               detect signal is lost). In cases like these, you will then be
               able to use the od_carrier() function in order to determine the
               state of the carrier detect signal.

               This function will return a Boolean value (for more information
               on Boolean values, see the Glossary which begins on page 256),
               of either TRUE or FALSE. If a carrier detect signal is present
               when the function is called, it will return TRUE, and if no
               carrier detect signal is detected, it will return FALSE. Since
               there is no remote connection, and thus no carrier when
               OpenDoors is operating in local mode, this function will always
               return a value of FALSE in local mode.


SEE ALSO       od_set_dtr()


EXAMPLE        As an example of the use of this function, let us consider a
               call back verification door, which hangs up on the user, and
               then calls the user back at their entered phone number, in order
               to verify the correctness of that number. This program would
               probably contain a function that is responsible for
               disconnecting the user, waiting for the connection to be broken,
               and then phoning the user. At some point in this function,
               likely just prior to the point where the function hangs up on

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 51

               the user, you would disable OpenDoors' internal carrier
               detection, using the line:

                    od_control.od_disable |= DIS_CARRIERDETECT;

               You would then want to have a piece of code which would simply
               wait up to a given amount of time for the carrier signal to
               drop. If this occurs, you would continue to place the call, and
               if it does not occur, you would probably try your hangup
               procedure one or two more times. In this example, the function
               will return with a value of FALSE if the carrier signal does not
               drop, and will return a value of TRUE if it does.

                    char hangup(void)
                    {
                       clock_t timer;
                       char to_return = FALSE;

                       od_set_dtr(FALSE);                    /* Hangup modem */

                                                        /* Wait up to 30secs */
                       timer = clock() + CLOCKS_PER_SEC * 30;
                       while(timer >= clock())
                       {    /* If carrier has been lost, return with success */
                          if(!od_carrier())
                          {
                             to_return = TRUE;
                             break;
                          }
                       }

                       od_set_dtr(TRUE);             /* Re-enable DTR signal */
                       return(to_return);
                    }


















===============================================================================
OpenDoors 6.00 Manual                                           End of Page 52

OD_CLEAR_KEYBUFFER()
-------------------------------------------------------------------------------

PURPOSE        Function to clear the input keyboard buffer


FORMAT         void od_clear_keybuffer(void);


RETURNS        N/A


DESCRIPTION    OpenDoors maintains its own keyboard input buffer, in order to
               permit the user to "type ahead" - to send input to the door
               prior to the time when it is ready to process those key presses.
               For example, the user could begin to type a command while a menu
               is still being displayed, and when your door reaches the point
               of inputting the menu command, the characters already typed by
               the user will already be waiting for the OpenDoors input
               functions. Note that the keyboard input buffer will include both
               the keys hit by the user on-line, and the non-function keys (ie,
               Alt-C will not appear in the OpenDoors keyboard buffer), hit by
               the sysop. This allows both the user on-line and the sysop to
               control the door at any time. If the sysop wishes to temporarily
               prevent the user from having any control over the door, the
               sysop may use the Alt-K (user-keyboard off) key. The key strokes
               placed in the OpenDoors type-ahead buffer will be retrieved by
               the od_get_key() and od_input_str() functions. The keyboard
               buffer can contain a maximum of 64 user keystrokes in this
               version of OpenDoors, after which any additional keystrokes will
               simply be discarded by OpenDoors.

               There are times, however, when you will want to erase any keys
               that have been hit by the user, to prevent them from typing
               ahead. For example, if your door has been busy doing some
               processing for a few moments, they user may have been pressing
               keys on their keyboard - perhaps in the hope that doing so will
               speed things up. These keys will be waiting in the type-ahead
               buffer, and if one of the keys the user entered was a valid
               response to the next prompt in your door, the user may find that
               they have accidentally made a choice they did not wish to. A
               well designed door will simply erase the contents of the type-
               ahead buffer after any long period of internal processing, etc.
               Keep in mind that too much use of the od_clear_keybuffer()
               function can be just as undesirable as not using it all, as
               there are times when the presence of the keyboard buffer can
               prove to be very useful for the user of a door.

               To erase the contents of the type-ahead buffer, you simply call
               the od_clear_keybuffer() function. This function takes no
               parameters, and does not return any value.

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 53



SEE ALSO       od_get_key(), od_input_str(), od_edit_str()


EXAMPLE        For one example of the use of the od_clear_keybuffer() function,
               see the example program EX_VOTE.C, which is described beginning
               on page 38. Below is another example of using this function. In
               this case, we present a simple function, wait_for_return(),
               which simply pauses for the user to press their [Enter]/[Return]
               key. The function begins by displaying a prompt asking for the
               [Enter] or [Return] key to be pressed. The function then clears
               the keyboard input buffer, and waits until the user presses the
               carriage return key, using the od_get_key() function. Note also
               that this function will only continue if the user has pressed
               the correct key. This is a good idea in all door programs, as it
               allows your door to distinguish between a character pressed by
               the user, and a "line noise" character.

                    void wait_for_return(void)
                    {                                      /* Display prompt */
                       od_disp_str("Please Press [Enter] to continue...\n\r");
                       od_clear_keybuffer();        /* Clear keyboard buffer */
                       while(od_get_key(TRUE) != 13);  /* Wait for Enter key */
                    }



























===============================================================================
OpenDoors 6.00 Manual                                           End of Page 54

OD_CLR_LINE()
-------------------------------------------------------------------------------

PURPOSE        Clears the rest of the current display line


FORMAT         void od_clr_line(void);


RETURNS        N/A


DESCRIPTION    This function clears the line that the cursor is on, from the
               cursor position to the end of the line. After the rest of the
               line is cleared, the cursor is automatically returned to the
               position it was at prior to issuing the command. Hence, if the
               display line the cursor was located on looked as follows, with
               the underscore (_) character representing the cursor position:

                        This is a_line of text!

               With the cursor between the words "a" and "line", after the
               od_clr_line command is issued, the line would appear as follows:

                        This is a_

               With the cursor directly following the word "a". Note that this
               function places a space character at the cursor location, and
               every location up to the end of the line.

               When the door is running in plain ASCII mode, this command will
               simply clear the rest of the line by manually sending a series
               of space and backspace characters. When ANSI, AVATAR or RIP
               modes are active, the corresponding ANSI/AVATAR control sequence
               will be sent in order to accomplish the line clear. Since the
               graphics mode sequences are much shorter than the sequence that
               would be required to clear the line manually, the use of this
               function will cause your door's graphics to display much more
               quickly when ANSI, AVATAR or RIP modes are active. Also note
               that in ANSI, AVATAR or RIP graphics modes, the line will be
               cleared with the currently selected color attribute. Thus, if
               you wanted to place a blue background on a particular line, you
               would use the od_set_color() (or od_set_attrib()) function, then
               use the od_set_cursor() function to locate the cursor at the
               beginning of the desired line, followed by the od_clr_line()
               function. Just such a procedure is demonstrated in the example,
               below.


SEE ALSO       od_clr_scr(), od_set_cursor()


===============================================================================
OpenDoors 6.00 Manual                                           End of Page 55

EXAMPLE        Below, is an example of a function that clears an entire line
               with a specified color. Since this function performs operations
               that require ANSI, AVATAR or RIP graphics mode, it should only
               be used in a case where these modes are known to be available.
               For example, this function would be useful in a full-screen
               editor or viewer, or when performing ANSI animations. The
               function accepts three parameters: the line to be cleared (where
               1 is the first line, 2 the second, and so on), the foreground
               color of this line, and the background color of this line.

               This function differs from the od_clr_line() function itself in
               several important manners. First of all, this function clears
               the entire line, whereas the od_clr_line() function can be used
               to clear only the remaining characters of the line, after any
               particular location. Also, as mentioned before, this function
               selects a color to clear the line to, and moves the cursor to
               the line which is to be cleared - neither of which is done by
               the od_clr_line() function.


               void clear_line(char line_number,char foreground,char
               background)
               {
                  od_set_cursor(line_number,1);      /* move to correct line */
                  od_set_color(foreground,background);          /* set color */
                  od_clr_line();                        /* clear entire line */
               }

























===============================================================================
OpenDoors 6.00 Manual                                           End of Page 56

OD_CLR_SCR()
------------------------------------------------------------------------------

PURPOSE        The OpenDoors clear screen function


FORMAT         void od_clr_scr(void);


RETURNS        N/A


DESCRIPTION    The od_clr_scr() function can be used to clear the output
               screen. (ie, the user's screen and local screen with the
               exception of the status line are cleared.) This function will
               only clear the screen if screen clearing is enabled. If your
               program will be running under BBS systems that do not pass the
               user's screen clearing setting to the door, you may wish to
               determine yourself whether or not the user's system supports
               screen clearing codes, during the first time the user uses the
               door. You will then be able to store this setting in a data
               file. The example below demonstrates how to detect whether or
               not the user's system supports screen clearing.

               You should note that the ability for the user's terminal to
               support screen clearing codes is independent of the user's ANSI
               / AVATAR / RIP graphics mode settings.

               For more information on the user's screen clearing setting,
               please refer to the user_attrib variable in the OpenDoors
               Control Structure chapter of this manual. If you wish to force a
               screen clear, regardless of the user's screen clearing setting,
               simply use the function call:

                         od_disp_emu("\xc", TRUE);


SEE ALSO       od_clr_line()


EXAMPLE        Below is an example of a function which determines whether or
               not the user's system supports screen clearing. This function
               will return a value of TRUE if screen clearing is supported, and
               will return a value of FALSE if screen clearing is not
               supported:

               int user_supports_screen_clearing(void)
               {
                  char answer;
                                             /* display instructions to user */
                  od_disp_str("In order for this door to function\n\r");
                  od_disp_str("correctly, we must know whether or not\n\r");
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 57

                  od_disp_str("your system supports screen clearing.\n\r");
                  od_disp_str("In a moment, we will attempt to clear\n\r");
                  od_disp_str(
                     "your screen in order to test your system's\n\r");
                  od_disp_str("capabilities.\n\r\n\r");

                  od_disp_str("Please press [Enter]/[Return] when you\n\r");
                  od_disp_str("are ready to perform this test.\n\r");
                  while(od_get_key(TRUE)!=13);      /* wait for [Return] key */

                  od_clr_scr();                   /* attempt to clear screen */
                                         /* ask user if their screen cleared */
                  od_disp_str("Did your screen just clear? (Y/N)\n\r");
                  for(;;)           /* loop until user chooses [Y]es or [N]o */
                  {
                     answer=od_get_key(TRUE);           /* Get user's answer */
                     if(answer=='y' || answer=='Y') return(TRUE);
                     if(answer=='n' || answer=='N') return(FALSE);
                  }
               }
































===============================================================================
OpenDoors 6.00 Manual                                           End of Page 58

OD_COLOR_CONFIG()
-------------------------------------------------------------------------------

PURPOSE        Parses a color configuration line from the configuration file,
               generating a color attribute value.


FORMAT         BYTE od_color_config(char *pszColorDesc);


RETURNS        Color attribute value


DESCRIPTION    This function will be of use if you are using the configuration
               file system of OpenDoors, and wish to allow the sysop to specify
               text colors to be used in your door. While OpenDoors
               automatically recognizes color configuration settings for things
               such as sysop chat mode and FILES.BBS listings, you may wish to
               add additional color configuration options. In this case, you
               could call the od_color_config() function from your custom line
               function. For more information on the custom line function, see
               the section on the OpenDoors configuration file system, which
               begins on page 224.

               To use this function, simply pass the configuration file line
               you wish to have parsed to the function in it's single
               parameter. The function will then return a color attribute value
               in the same format that is used but the od_set_attrib()
               function. Colors are specified using a string of the format:

                    {Flashing} {Bright} [foreground] on [background]

               Where "Flashing" is an optional keyword indicating that the text
               should be flashing. "Bright" is an optional keyword indicating
               that the foreground color should be bright. Foreground is the
               name of a foreground color, and background is the name of a
               background color. Case (upper or lower) is not significant.

               The color keywords are language configurable, using the array
               od_control.od_color_names.


EXAMPLE        See the example accompanying in the section on the OpenDoors
               configuration file system, which begins on page 224.








===============================================================================
OpenDoors 6.00 Manual                                           End of Page 59

OD_DISP()
------------------------------------------------------------------------------

PURPOSE        Sends a buffer of text with optional local echo


FORMAT         void od_disp(char *pachBuffer, INT nSize, BOOL bLocalEcho);


RETURNS        N/A


DESCRIPTION    This function allows you to send a buffer of text of any
               specified length, with the option of enabling or disabling local
               echo. You will probably have little use for this function -
               instead you will most likely display strings using either the
               od_disp_str() or od_printf() functions, depending on whether or
               not you wish to use printf()'s formatting options. For a
               breakdown of the uses of the various OpenDoors display
               functions, see the description of the od_disp_str() function, on
               page 63.

               There are two cases when this function will come in useful:

                    1.)If you wish to display a buffer of characters of known
                       length, which may contain null (ASCII 0) characters.
                       Since this character is used by the C language to
                       indicate the end of a string, the other two string
                       display functions (od_disp_str() and od_printf()) will
                       not send this character to the remote system.

                    2.)If you wish to send text to the remote system without
                       having it displayed on the local screen, or if you wish
                       to send strings to the modem when it is in command
                       mode, without having these characters displayed on the
                       local screen.

               The od_disp() function is called with three parameters. The
               first parameter, pachBuffer, is a pointer to a buffer of
               characters you wish to have displayed. The second parameter,
               nSize, is simply the number of characters in the buffer to be
               displayed. If the third parameter, bLocalEcho, is set to TRUE,
               then all characters sent to the modem will also be displayed on
               the local screen. If the third parameter is set to FALSE, then
               the buffer will be sent to the modem without being echoed to the
               sysop's screen.


SEE ALSO       od_disp_str(), od_printf(), od_putch(), od_repeat(),
               od_disp_emu()


===============================================================================
OpenDoors 6.00 Manual                                           End of Page 60

EXAMPLES       The following are a few examples of the use of the od_disp()
               function:

               In order to display a single character, contained in the
               variable "character", without echo to the local screen:

                    od_disp(&character,1,FALSE);


               In order to send a command to the modem (only if you know that
               the modem is in command mode), with the command contained in the
               null-terminated string "string":

                    od_disp(string,strlen(string),FALSE);


               In order to send exactly 5 characters from the buffer "buffer",
               WITH echo to the local screen:

                    od_disp(buffer,5,TRUE);
































===============================================================================
OpenDoors 6.00 Manual                                           End of Page 61

OD_DISP_EMU()
-------------------------------------------------------------------------------

PURPOSE        Displays a string with ANSI/AVATAR terminal emulation


FORMAT         void od_disp_emu(char *pszToDisplay, BOOL bRemoteEcho);


RETURNS        N/A


DESCRIPTION    The od_disp_emu() function allows you to display your own ANSI /
               AVATAR graphics sequences. This function passes the characters
               you wish to display to the OpenDoors terminal emulator, which is
               fully documented in the description of the od_send_file()
               function, on page 124. This function can be used to send these
               control sequences to the user's terminal, and also have them
               displayed on the local screen as they will appear to the user.

               The string passed to od_disp_emu() contains any stream of text
               to display, and may include both normal text and terminal
               emulation control sequences. If the bRemoteEcho parameter is set
               to TRUE, the string passed to od_disp_emu() will be sent to the
               remote terminal in addition to being displayed locally. If this
               parameter is set to FALSE, the string will only be displayed
               locally.

               Note that if you wish to display an entire file containing
               ANSI/AVATAR/RIP graphics sequences (perhaps as your program's
               menu or title screen), you can use the od_send_file() function.


SEE ALSO       od_send_file(), od_disp(), od_disp_str() od_printf().

               For a breakdown of the uses of the various OpenDoors display
               functions, see the od_disp_str() function, on page 63.


EXAMPLE        For an example of the use of the od_disp_emu() function, see the
               SpaceRight() and MoveLeft() functions included in the example
               program ex_ski.c.










===============================================================================
OpenDoors 6.00 Manual                                           End of Page 62

OD_DISP_STR()
-------------------------------------------------------------------------------

PURPOSE        Displays a string to the screen (remote and local)


FORMAT         od_disp_str(char *pszToDisplay);


RETURNS        N/A


DESCRIPTION    The two functions most often used for displaying strings within
               a door are the od_disp_str() and od_printf() functions. The
               od_printf() function allows for formatted output, whereas the
               od_disp_str function simply displays the actual contents of the
               string passed to it. If you wish to display a single character,
               use the od_putch() function. If you wish to send a string or
               buffer to the modem without local echo, use the od_disp()
               function. If you wish to send a sequence of the same character
               to the modem, the od_repeat() function will use graphics control
               codes, if available to display the sequence much faster than
               simply sending the same character in repetition. Also, if you
               wish to send ANSI, AVATAR or RIP graphics control codes, and
               have them emulated on the local screen, use the od_disp_emu()
               function.

               The od_disp_str() function displays the contents of the null-
               terminated string pointed to by *string. Display is sent to both
               the local screen and modem (presuming the door is not running in
               local mode).

               An important thing to keep in mind when using the od_disp_str()
               function, is that you should use "/n/r" instead of simply "/n"
               for a new line. This is due to the fact that terminal programs
               usually require a carriage-return line-feed sequence (/n/r),
               instead of just a line-feed (/n). For example, instead of using:

                              od_disp_str("Hello world!\n");

               You should use:

                              od_disp_str("Hello world!\n\r");

               To change the cursor color or location of output with the
               od_disp_str() function, refer to the od_set_cursor() and the
               od_set_attrib() functions.


SEE ALSO       od_disp(), od_printf(), od_putch(), od_repeat(), od_disp_emu()


===============================================================================
OpenDoors 6.00 Manual                                           End of Page 63

EXAMPLES       Below are a few examples of various uses of the od_disp_str()
               function:

               Displaying three string constants on separate lines:

                         od_disp_str("This is an example\n\r");
                         od_disp_str("of the OpenDoors\n\r");
                         od_disp_str("od_disp_str() function\n\r");


               Displaying three string constants on the same line:

                         od_disp_str("Another ");
                         od_disp_str("od_disp_str() ");
                         od_disp_str("example\n\r");


               Displaying a string variable:

                         char string[80];

                         strcpy(string,"This is a string!\n\r");
                         od_disp_str(string);





























===============================================================================
OpenDoors 6.00 Manual                                           End of Page 64

OD_DRAW_BOX()
-------------------------------------------------------------------------------

PURPOSE        Draws a box on the screen in ANSI, AVATAR or RIP graphics modes.


FORMAT         BOOL od_draw_box(BYTE btLeft, BYTE btTop, BYTE btRight, BYTE
                  btBottom);


RETURNS        TRUE on success, FALSE on failure


DESCRIPTION    This function is for use in ANSI, AVATAR or RIP graphics modes.
               This function will draw a box in the current display attribute,
               at the specified location on the screen. The boarder of the box
               is made up of the characters specified in the od_control.
               od_box_chars[] array. If AVATAR graphics mode is available, this
               function uses AVATAR control codes to display the box in less
               than 1/10 the length of time required to display the box in ANSI
               mode.

               The first two parameters of this function, btLeft and btTop,
               specify the coordinates of the top, left-hand corner of the box
               to be draw. The third and fourth parameters, btRight and
               btBottom, specify the coordinates of the bottom, left-hand
               corner of the box. Like the values passed to the od_set_cursor()
               function, these coordinates are relative to the upper left-hand
               corner of the screen, with the position (1,1) being this corner.

               As mentioned above, this function will display the window in the
               current text color. Thus, before calling this function, you
               should use either the od_set_color() or the od_set_attrib()
               function to specify the color in which you would like to have
               the window displayed.

               Normally, the boarder of the window will be displayed using the
               IBM extended ASCII characters which produce a single line
               boarder. However, you may wish to have the boarder displayed
               using different characters. In this case, the characters used to
               display the boarder can be specified by the od_control.
               od_box_chars variable, described in the OpenDoors control
               structure section of this manual.

SEE ALSO       od_set_color(), od_set_attrib(), od_clr_scr(), od_edit_str(),
               od_set_cursor()


EXAMPLE        As an example of the use of the od_draw_box() function in
               conjunction with the od_edit_str() function, we show a portion
               of a program which displays a window, and allows the user to
               input the name of a file they would like to upload, a
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 65

               description of the file, and whether they want it to be a
               private upload. The user is able to move among fields using the
               tab key, and select a "continue" button when they are finished.
               The function returns TRUE if the user selects continue, and
               FALSE if the user presses [ESCape].

                                                  // Main "dialog box" function
               int get_information(char *filename, char *description,
                                    char *private)
               {
                  char current_field=1;             // Currently selected field
                  int choice;                                  // User's choice

                  od_set_color(L_WHITE,D_BLUE);               // Display window
                  od_draw_box(10,5,70,13);

                  od_set_cursor(5,25);                  // Display window title
                  od_set_color(L_GREEN,D_BLUE);
                  od_disp_str(" ENTER FILENAME INFORMATION ");

                  od_set_color(L_CYAN,D_BLUE);     // Display fields and titles
                  od_set_cursor(6,15);
                  od_disp_str("FILENAME : ");
                  od_repeat(176,13);
                  od_set_cursor(7,12);
                  od_disp_str("DESCRIPTION : ");
                  od_repeat(176,43);
                  od_set_cursor(8,16);
                  od_disp_str("PRIVATE : ");
                  od_repeat(176,2);
                  draw_button();

                  filename[0]='\0';    // Blank out contents of input variables
                  description[0]='\0';
                  private[0]='\0';

                  for(;;)                               // Main dialog box loop
                  {
                     if(current_field==4)             // If field is the button
                     {
                        od_set_color(L_GREEN,D_BLUE);       // Highlight button
                        draw_button();

                        do  // Loop until user presses [TAB], [ENTER], or [ESC]
                        {
                           choice=od_get_key(TRUE);
                        } while(choice!=9 && choice!=13 && choice!=27);

                        od_set_color(L_CYAN,D_BLUE);     // Un-highlight button
                        draw_button();

                        if(choice==13) return(TRUE);  // If [ENTER] was pressed
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 66

                        if(choice==27) return(FALSE);   // If [ESC] was pressed
                        current_field=1;        // Otherwise, [TAB] was pressed
                     }

                    switch(current_field)        // According to selected field
                     {                       // Input from the appropriate line
                        case 1:
                           choice=od_edit_str(filename,"FFFFFFFFFFFF",6,26,
                                              0x1b,0x1a,176,
                                              EDIT_FLAG_EDIT_STRING|
                                              EDIT_FLAG_ALLOW_CANCEL|
                                              EDIT_FLAG_FIELD_MODE|
                                              EDIT_FLAG_KEEP_BLANK);
                           break;
                        case 2:
                           choice=od_edit_str(description,
                                              "*******************",
                                              7,26,0x1b,0x1a,176,
                                              EDIT_FLAG_EDIT_STRING|
                                              EDIT_FLAG_ALLOW_CANCEL|
                                              EDIT_FLAG_FIELD_MODE|
                                              EDIT_FLAG_KEEP_BLANK);

                           break;
                        case 3:
                           choice=od_edit_str(private,"Y",8,26,
                                              0x1b,0x1a,176,
                                              EDIT_FLAG_EDIT_STRING|
                                              EDIT_FLAG_ALLOW_CANCEL|
                                              EDIT_FLAG_FIELD_MODE);
                     }
                                                    // If user pressed [ESCape]
                     if(choice==EDIT_RETURN_CANCEL) return(FALSE);
                                      // If user choice to go to previous field
                     if(choice==EDIT_RETURN_PREVIOUS)
                     {
                        if(current_field==1)               // If at first field
                           current_field=4;                 // Go to last field
                        else                           // If not at first field
                           --current_field;             // Go to previous field
                     }
                     else                           // If user chose next field
                        ++current_field;                    // Go to next field
                  }
               }

               void draw_button(void)         // Function to display the button
               {
                  od_draw_box(12,10,23,12);              // Draw box for button
                  od_set_cursor(11,14);
                  od_disp_str("Continue");            // Display text in button
               }
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 67

OD_EDIT_STR()
-------------------------------------------------------------------------------

PURPOSE        Allows you to perform formatted input with full line editing
               features, etc., in ANSI/AVATAR/RIP graphics mode.


FORMAT         WORD od_edit_str(char *pszInput, char *pszFormat, INT nRow,
                  INT nColumn, BYTE btNormalColor, BYTE btHighlightColor,
                  char chBlank, WORD nFlags);


RETURNS        This function will return one of the following values:

               EDIT_RETURN_ERROR        Indicates that an error has occurred,
                                        and the edit function was unable to
                                        run. This will occur if there is an
                                        error in one of the parameters, or if
                                        ANSI/AVATAR/RIP graphics is not
                                        available

               EDIT_RETURN_CANCEL       Indicates that the user pressed the
                                        cancel key [ESC], and that the string
                                        was left unaltered.

               EDIT_RETURN_ACCEPT       Indicates that the user pressed the
                                        accept key [Enter], or that the auto-
                                        enter feature was activated.

               EDIT_RETURN_PREVIOUS     Indicates that the user wishes to move
                                        to the previous field, by pressing [UP
                                        ARROW], [SHIFT]-[TAB], etc.

               EDIT_RETURN_NEXT         Indicates that the user wishes to move
                                        to the next field, by pressing [DOWN
                                        ARROW], [TAB], etc.


DESCRIPTION    To perform string input within OpenDoors, one of two functions
               can be used, od_input_str() and od_edit_str(). The first
               function, od_input_str(), allows simple line input and editing,
               and can be used in ASCII, ANSI, AVATAR and RIP modes. The second
               function, od_edit_str(), allows many formatted input options,
               advanced line editing, and other features, but requires the use
               of ANSI, AVATAR or RIP terminal modes.

               As mentioned above, the od_edit_str() function allows for
               advanced line editing, such as inputting and deleting text from
               the middle of the string (whereas the od_input_str() function
               only allows editing from the end of the string, such as
               backspacing to erase a mistake). The edit functions available
               from the od_edit_str() are listed below. Note that some of these
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 68

               functions may or may not be available, depending upon the
               capabilities of the user's terminal program. While there is no
               single standard used for the transmission of special edit keys
               such as the arrow keys, the od_edit_str() function makes as much
               effort as possible to make all of the edit features available to
               most terminal programs. Many of the edit functions can be
               accesses using either [CONTROL]-key combinations or special keys
               such as the arrow keys, delete key, and so on. OpenDoors will
               recognize most of these special control keys when sent as either
               an ANSI control sequence (which is sent by most terminal
               programs), or as a DoorWay style scan code / ASCII code sequence
               (which is also available from many terminal programs, but is not
               usually required). The od_edit_str() edit functions are as
               follows. Note that all edit functions are always available from
               the local keyboard.

               HOME - Moves the cursor to the beginning of the line being
                         edited. Press the [HOME] key, either in DoorWay mode
                         or from the local keyboard.

               END - Moves the cursor to the end of the line being edited.
                         Press the [END] key, either in DoorWay mode or from
                         the local keyboard.

               DELETE CHARACTER - Deletes the character under the cursor. Press
                         [DELete] on the local keyboard, in DoorWay mode, and
                         under many terminal programs without DoorWay mode.
                         Alternatively, press [CONTROL]-[G].

               BACKSPACE - Deletes the character left of the cursor. Press
                         [BACKSPACE] or [CONTROL]-[H].

               TOGGLE INSERT MODE - Switches the od_edit_str() function between
                         insert mode and overwrite mode. Press [INSert], either
                         in DoorWay mode, or from the local keyboard.
                         Alternatively, press [CONTROL]-[V].

               CURSOR LEFT - Moves the cursor left one character. Press [LEFT
                         ARROW] on the local keyboard, in DoorWay mode, and
                         under many terminal programs without DoorWay mode.
                         Alternatively, press [CONTROL]-[S].

               CURSOR RIGHT - Moves the cursor right one character. Press
                         [RIGHT ARROW] on the local keyboard, in DoorWay mode,
                         and under many terminal programs without DoorWay mode.
                         Alternatively, press [CONTROL]-[D].

               ERASE ENTIRE LINE - Press [CONTROL]-[Y].

               ACCEPT INPUT - Press the [ENTER] / [RETURN] line to accept the
                         input. Alternatively, press [CONTROL]-[Z]. Note that
                         this key will only work when the current input is
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 69

                         "valid" (ie, it conforms to the format string, which
                         is described below)

               CANCEL INPUT - Only available if specifically enabled on the
                         od_edit_str() command line. Press [ESCape].

               NEXT FIELD - If enabled, allows the user to move to the next
                         field in a dialog box / form. Press [DOWN ARROW] in
                         DoorWay mode and under many terminal programs without
                         DoorWay mode. Alternatively, press [TAB]. Note that
                         the [DOWN ARROW] key is NOT usually available from the
                         local keyboard, as it is usually used to adjust the
                         user's remaining time.

               PREVIOUS FIELD - If enabled, allows the user to move to the
                         previous field in a dialog box / form. Press [UP
                         ARROW] in DoorWay mode and under many terminal
                         programs without DoorWay mode. Alternatively, press
                         [SHIFT]-[TAB] on the local keyboard or in DoorWay
                         mode. Again, note that the [UP ARROW] key is NOT
                         usually available from the local keyboard, as it is
                         usually used to adjust the user's remaining time.


               Let us now look at the parameters which the od_edit_str()
               function accepts. The first parameter, pszInput, is a pointer to
               the string where the user's input should be stored. It is
               important that this string be long enough to accommodate the
               longest input your format string will permit, including the '\0'
               C string terminator (ie, the string should be one character
               greater than the length of the format string, not including the
               format string's ' and " characters).

               The second parameter, pszFormat, is a pointer to a string which
               specifies the format and maximum length of the input the
               od_edit_str() function should accept. Using the format string,
               not only do you specify the length of the input field, but you
               can also force the user's input into certain formats. For
               example, if you wished to input a North American style phone
               number, you could use a format string of "###-###-####". Then
               regardless of whether the user typed any dash character or not,
               their input would be converted, as they type, to the format of
               the phone number 613-599-5554. You could also specify a format
               string such of "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", which would
               permit the user to enter a name of up to 30 characters. Note
               that since the cursor can be moved to the position immediately
               following the last character, a the input field for a 30
               character string will occupy 31 columns on the screen. The
               od_edit_str() function would then automatically capitalize the
               name, so that the first character of each word is capitalized,
               and the remain characters of the word is in lower case. Even if
               the user were to move the cursor to the middle of the string
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 70

               they had entered, and add or delete a space (and thus either
               make one work two or two words one), od_edit_str() would re-
               format the string to reflect the change. The valid characters
               for the format sting, along with their meanings, are listed
               below. Note that the format string is NOT case sensitive (except
               for literal strings delimited by the '' or "" characters), and
               space characters can be added at any point to increase
               legibility.

               #    Indicates that numeric characters from '0' to '9' are valid
                    for this position

               %    Indicates that numeric characters from '0' to '9', and the
                    space character (' ') are valid for this position.

               9    Indicates that numeric characters from '0' to '9', along
                    with '.', '-' and '+' are valid for this position. This
                    format style is intended for floating-point numeric input.

               ?    Indicates that any character is valid for this position.

               *    Indicates that any printable character, from ASCII 32 to
                    ASCII 127, is valid for this position.

               A    Indicates that alphabetical characters 'A' to 'Z', 'a' to
                    'z' and space (' ') are valid for this position.

               C    Indicates that city name characters are valid for this
                    position. As with the 'M' format character, words are
                    automatically capitalized so that the first letter is in
                    upper case, and all subsequent letters are in lower case.
                    In addition to permitting alphabetical characters and the
                    space (' ') character, the ',' and '.' characters are also
                    accepted in this position.

               D    Indicates that date characters '0' to '9', '-' and '/' are
                    valid for this position.

               F    Indicates that MS-DOS filename characters are valid for
                    this position.

               H    Indicates that hexidecimal character '0' to '9', 'A' to 'F'
                    and 'a' to 'f' are valid for this position.

               L    Indicates that only lower case alphabetical characters 'a'
                    to 'z', and the space (' ') character is valid for this
                    position. However, if the user attempts to enter an upper
                    case alphabetical character in this position, it will
                    automatically be converted to the lower case equivalent.

               M    Indicates that name characters are valid for this position.
                    These characters are the alphabetical characters 'A' to
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 71

                    'Z', 'a' to 'z', and the space character (' '). A
                    character's case is converted such that the first character
                    of a word is in upper case, and all other letters are in
                    lower case.

               T    Indicates that telephone number character '0' to '9', '(',
                    ')', '-' and ' ' are valid for this position.

               U    Indicates that only upper case alphabetical characters 'A'
                    to 'Z', and the space (' ') character is valid for this
                    position. However, if the user attempts to enter a lower
                    case alphabetical character in this position, it will
                    automatically be converted to the upper case equivalent.

               W    Indicates that MS-DOS filename characters are permitted in
                    this position, including the '*' and '?' wildcard
                    characters.

               X    Indicates that alphanumeric characters 'A' to 'Z', 'a' to
                    'z', '0' to '9' and ' ' are valid for this position.

               Y    Indicates that yes/no characters 'Y', 'N', 'y', 'n' are
                    valid for this position. The characters are automatically
                    converted to upper case.

               '/"  Single or double quotes can be used to specify sequences of
                    characters that should appear at the same location in the
                    input string (referred to elsewhere as "literal strings").
                    When the user is entering the string, these characters are
                    automatically supplied, and the user is not required to
                    type them. Literal strings must begin and end with the same
                    quote character. Remember that the double quote (")
                    character must be imbedded in C strings by preceding the
                    quote character with a \ (backslash) character.

               The third and fourth parameters, nRow and nColumn specify the
               location on the screen where the first (left most) character of
               the input field should be located. These parameters are
               identical to the nRow and nColumn parameters passed to the
               od_set_cursor() function. In other words, nRow specifies the
               line number on the screen, where 1 is the first line, and
               nColumn specifies the column across the screen, where 1 is the
               first column.

               The fifth and sixth parameters, btNormalColor and
               btHighlightColor, allow you to specify the color of the input
               field. The fifth parameter, btNormalColor, specifies the color
               of the input field when input is not taking place and the sixth
               parameter, btHighlightColor, specifies the color of the field
               while input is taking place. Thus, if you had several input
               fields on the screen at one time, you would be able to make is
               easier for the user to identify the currently active field by
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 72

               having the field currently accepting input highlighted in a
               color distinct from the other fields. When the od_edit_str()
               function begins, it will change the current color of the field
               from the normal color to the highlighted color. Then, when the
               od_edit_str() function exits, it will change the current color
               of the field back to its normal color. If you do not wish to
               have the field highlighted, you can set both of these parameters
               to the same value, and disable field re-drawing by using the
               eighth parameter, flags.

               The seventh parameter accepted by the od_edit_str() function,
               chBlank, will serve one of two purposes. Normally, this
               parameter will specify a background character to display in the
               unfilled portion at the end of the input field. This can be set
               to a character, such as the ASCII 177 grey block character, to
               produce a visual background to the field. Doing this will show
               the user visually how long the field is, and how many character
               they will be permitted to type into the field. Normally, this
               field will be displayed during input, and removed when the
               od_edit_str() function exits. However, you may cause the
               background to remain in place using the eighth parameter, flags.
               If you do not wish to have this "background" visual field
               effect, simply set the character parameter to a space (ASCII
               32). In password input mode, this parameter will instead specify
               the character to display in place of characters typed by the
               user. In this case, the background display character defaults to
               the space (ASCII 32) character.

               The eighth, and last, parameter accepted by the od_edit_str()
               function is the nFlags parameter. This parameter is a bit-mapped
               flags variable which allows you to control special features of
               the od_edit_str() function. More than one of these settings may
               be specified by listing a chain of the values, separated by the
               bitwise-or (|) operator. If you do not wish to turn on any of
               these modes, simply pass the EDIT_FLAG_NORMAL value as the flags
               parameter.

               EDIT_FLAG_NORMAL - Default setting, use this value of none of
                         the other flags below are active.

               EDIT_FLAG_NO_REDRAW - When set, prevents the od_edit_str()
                         function from re-drawing the input string and field
                         when it starts up and exits. If you set this flag, the
                         normal color and highlight color should contain the
                         same value. If background character (the character
                         parameter) is not a space (ASCII 32) character, you
                         must draw the field background prior to calling
                         od_edit_str(). Also, if you are calling od_edit_str()
                         with the EDIT_FLAG_EDIT_STRING flag set, you must
                         display the existing string in the field prior to
                         calling od_edit_str().

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 73

               EDIT_FLAG_FIELD_MODE - Setting this flag specifies that
                         od_edit_str() should operate in field input mode. In
                         field input mode, the user may finish entering their
                         input by pressing the previous field or next field
                         button (arrow keys, tab keys, etc.), as described
                         above. If the user chooses to finish and accept their
                         input by pressing one of these keys, the od_edit_str()
                         return value will reflect which choice they made. This
                         will allow you to make it possible for the user to
                         move between a number of input fields in a form /
                         dialog box, as demonstrated in the example
                         accompanying the od_draw_box() function.

               EDIT_FLAG_EDIT_STRING - Setting this flag specifies that
                         od_edit_str() should edit a pre-existing string,
                         instead of starting with a blank string. In this case,
                         the input_string parameter MUST point to an
                         initialized string. This string may either contain
                         some text, or be empty, but od_edit_str() will expect
                         to find a string terminator ('\0') character, and will
                         begin editing the contents of the string prior to that
                         character. If you do not set the EDIT_FLAG_EDIT_STRING
                         flag, the previous contents of the input_string
                         parameter is not significant, as od_edit_str() will
                         automatically start with a blank string.

               EDIT_FLAG_STRICT_INPUT - Setting this flag causes the
                         od_edit_str() function to operate in "strict" input
                         mode, which may be desirable if your input format
                         contains more than one type of input. Normally, if you
                         were inputting such a string, the user would be able
                         to move to the middle of the string, and insert any
                         text. Doing so would cause the rest of the input line
                         to shift right. However, in cases where your format
                         string specifies different types of character to be
                         permitted in different positions, this can cause the
                         input to be changed so that it no longer conforms to
                         the format string. In this case, the user's input will
                         no longer be valid, and the user will not be able to
                         exit the function by pressing [ENTER] (although
                         [ESCAPE] will still be available, if you activated it)
                         until they change their input. However, when strict
                         input mode is turned on, od_edit_str() will restrict
                         the ways in which the user is permitted to edit the
                         string, to prevent just such a case from occurring.

               EDIT_FLAG_PASSWORD_MODE - Setting this flag causes the
                         od_edit_str() function to operate in "password" mode.
                         In password mode, the characters typed by the user
                         will be hidden, displayed instead as the blank
                         character specified in the "character" parameter.

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 74

               EDIT_FLAG_ALLOW_CANCEL - When this flag is set, the user will be
                         able to cancel their current input and abort the
                         editing process by pressing their [ESCAPE] key. When
                         they do so, any changes they have made to the input
                         field will be canceled, and replaced by the original
                         contents of the string. The od_edit_str() function
                         will then exit, indicating that the user has canceled
                         their input.

               EDIT_FLAG_FILL_STRING - When set, this flag will force the user
                         to enter a string that fills the entire length of the
                         format string. Normally, the user will be able to
                         enter a string of any length up to the maximum length
                         specified by the format string. However in some cases,
                         such as when inputting a date, you will want to have
                         the input field filled. (Otherwise, the user would be
                         able to enter only the first part of the date.)

               EDIT_FLAG_AUTO_ENTER - When set, this flag will cause the
                         od_edit_str() function to automatically simulate
                         pressing of the [ENTER] key when the string is filled.
                         This can be used to cause the od_edit_str() function
                         to finish inputting as soon as a valid string is
                         entered, instead of having to wait for the user to
                         press [ENTER] / [RETURN].

               EDIT_FLAG_AUTO_DELETE - When set, along with the
                         EDIT_FLAG_EDIT_STRING flag, this flag will activate
                         the auto-delete feature of the od_edit_str() function.
                         When auto-delete is active, if the first key pressed
                         by the user is not an edit control key, the existing
                         text will automatically be deleted, and a totally new
                         string accepted from the user. This could be useful
                         when you are allowing the user to go back to edit a
                         previous input. If the user wishes to only change part
                         of the old string, they can move the cursor to the
                         location where they wish to make the change, and
                         perform their editing. However, if the user wishes to
                         completely replace the old string with a new one, they
                         can simply begin to type, and the old string will
                         automatically be deleted, and the new string accepted.

               EDIT_FLAG_KEEP_BLANK - Normally, OpenDoors will only display the
                         input field background (as passed in the "character"
                         parameter) while the user is editing the string, and
                         will remove it when the od_edit_str() function exits.
                         However, you may wish to continue having this field
                         displayed after input has taken place, and the
                         od_edit_str() function has exited. In this case,
                         setting this flag will cause the background characters
                         to remain visible after input has finished.

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 75

               EDIT_FLAG_PERMALITERAL - When the format string contains literal
                         characters (such as forcing a ':' character to be
                         added to a time input by using the format string
                         "##':'##':'##"), the od_edit_str() function can
                         operate in one of two modes. In the default mode, the
                         literal characters will only be displayed when they
                         have been automatically added to the string. For
                         instance, if you were inputting the current time using
                         the above format string, this mode would result in the
                         input field initially being blank. When the user types
                         the first digit of the time, that number would appear.
                         When the user types the second digit of the time, that
                         number will appear, and then the colon character will
                         automatically be added by OpenDoors. However, you can
                         also set the od_edit_str() function to operate in
                         "PermaLiteral" mode, by setting this flag. When the
                         EDIT_FLAG_PERMALITERAL flag is set, the input field
                         will initially contain the literal characters (ie, the
                         colons in our example), with the cursor still located
                         at the leftmost position in the input field. In this
                         mode, the literal character become a permanent part of
                         the input field, and can not be moved or deleted by
                         the user - instead the cursor simply skips over the
                         literal character's position.

               EDIT_FLAG_LEAVE_BLANK - This flag applies to the special case
                         where the first character or characters of the format
                         string are literals. By default, the od_edit_str()
                         function will always return a string containing at
                         least these first literal characters. However, you can
                         alter this behaviors by setting this flag. When set,
                         if no non-literal characters have been entered in the
                         string, od_edit_str() will return an empty string.

               EDIT_FLAG_SHOW_SIZE - Normally, od_edit() adds an extra blank to
                         the end of the input field, to give the cursor a space
                         to move into when the field is full. However, you may
                         prefer to have the input field be shown as exactly the
                         maximum size of input that is permitted. Setting
                         EDIT_FLAG_SHOW_SIZE does just this. In this case, the
                         cursor will be positioned immediately past the end of
                         the input field when the maximum number of characters
                         have been entered.


SEE ALSO       od_input_str(), od_get_char(), od_clear_keybuffer()


EXAMPLE        Below are several examples of typical uses of the od_edit_str()
               function. For the sake of simplicity, all of these examples
               perform their input beginning at the top, left hand corner of
               the screen, and store the user's input in the string variable
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 76

               named "string". For an example of the user of the od_edit_str()
               function in a dialog-box / form entry application, see the
               example accompanying the od_draw_box() function.

               To input a name with a maximum of 25 characters, having the
               first letter of each word automatically capitalized:

                        od_edit_str(string, "MMMMMMMMMMMMMMMMMMMMMMMMM", 1, 1,
                                    0x03, 0x21, 176, EDIT_FLAG_NORMAL);

               To input a North American style phone number, requiring that all
               digits be filled, and running in "strict input" mode:

                        od_edit_str(string, "###'-'###'-'####",
                                    1, 1, 0x03, 0x21, 176,
                                    EDIT_FLAG_FILL_STRING|
                                    EDIT_FLAG_STRICT_INPUT);

               To allow the user to edit a previously entered 20 character
               string, with auto-delete mode on. Any characters will be
               permitted in the string. Remember that when the
               EDIT_FLAG_EDIT_STRING flag is set, the string must be
               initialized prior to calling the od_edit_str() function.

                        od_edit_str(string, "????????????????????",
                                    1, 1, 0x03, 0x21, 176,
                                    EDIT_FLAG_EDIT_STRING|
                                    EDIT_FLAG_AUTO_DELETE);


               To input a password of up to 16 characters from the user. Here,
               the password will only be permitted to contain upper case
               characters, and the od_edit_str() password mode is used, with a
               small block displayed in place of any characters typed:

                         od_edit_str(string, "UUUUUUUUUUUUUUUU",
                                     1, 1, 0x03, 0x21, 254,
                                     EDIT_FLAG_PASSWORD_MODE);

               To input a two-digit number from the user, requiring that both
               digits be filled, and automatically accepting the input after
               the two digits have been entered (not requiring the user to
               press [ENTER]):

                        od_edit_str(string, "##", 1, 1, 0x03, 0x21, 176,
                                    EDIT_FLAG_FILL_STRING|
                                    EDIT_FLAG_AUTO_ENTER);

               To input a filename to download, as a field in a dialog box.
               Here, the filename will be permitted to contain valid filename
               characters, and the od_input_str() function will operate in
               field mode, with the cancel [ESCape] key enabled. Also, string
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 77

               edit mode will be enabled, allowing the user to edit a
               previously entered line, and the EDIT_FLAG_KEEP_BLANK flag will
               be set, causing the field background to remain displayed after
               the user exits. This time, however, auto-delete mode will not be
               used. Note that this combination of parameters expects that the
               field and it's contents will have already been displayed, prior
               to calling the od_edit_str() function.

                        od_edit_str(string, "WWWWWWWWWWWW",
                                    1, 1, 0x03, 0x21, 176,
                                    EDIT_FLAG_EDIT_STRING|
                                    EDIT_FLAG_FIELD_MODE|
                                    EDIT_FLAG_ALLOW_CANCEL|
                                    EDIT_FLAG_KEEP_BLANK);

               To input a string without the field background and line
               redrawing before and after input takes place:

                        od_edit_str(string, "******************************",
                                    1, 1, 0x07, 0x07, ' ',
                                    EDIT_FLAG_NO_REDRAW);

               To input a date, using PermaLiteral mode. Here, the month is
               entered by a three digit short form ("JAN", "FEB", etc.), and
               the literal characters such as the '-' and the "19" are a
               permanent part of the input field:

                        od_edit_str(string,"UUU'-'##'-19'##",
                                    1, 1, 0x03, 0x21, 176,
                                    EDIT_FLAG_PERMALITERAL|
                                    EDIT_FLAG_FILL_STRING);





















===============================================================================
OpenDoors 6.00 Manual                                           End of Page 78

OD_EXIT()
-------------------------------------------------------------------------------

PURPOSE        The OpenDoors program termination function


FORMAT         void od_exit(INT nErrorLevel, BOOL bTermCall);


RETURNS        N/A


DESCRIPTION    You MUST USE THIS FUNCTION when you want your program to exit.
               This function will close the serial port, re-write changed
               information to the door information (drop), call your end-of-
               program function (if any), and then exit with the errorlevel
               specified in the first parameter.

               Also, if the second parameter, bTermCall, is set to TRUE,
               od_exit() will also log the user off (for options such as
               logging off within the door - as shown in the example below).
               This is accomplished by lowering the DTR line to the modem,
               causing the modem to hangup. When control is returned to the
               BBS, it will then detect that the user is no longer online, and
               will carry out its own logoff processing.

               If you wish for your program to always perform any activities
               prior to exiting, such as updating or closing data files, you
               should set a function to be executed from within the od_exit()
               function. This is accomplished by using the od_control.
               od_before_exit variable, as described in the section on the
               OpenDoors control structure in chapter 5. Use of this variable
               will allow your program to always carry out these activates,
               even if OpenDoors decides to call the od_exit() function itself,
               such as when a user hangs up on the door.

               Note that in special cases, you may use the
               od_control.od_disable variable to prevent the od_exit() function
               from re-writing the door information file. Also, you may use the
               od_control.od_noexit variable to shutdown door operations
               without actually exiting your program. Both of these variables
               are described in chapter 5.


SEE ALSO       od_init()


EXAMPLE        The example below demonstrates a function which a door could
               execute when the user chooses to exit the door. This function
               will ask the user whether they wish to exit the door and return
               to the BBS, simply logoff of the BBS, or continue using the
               door. The example function will then call od_exit() if the user
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 79

               wishes to exit the door, or return control to the function which
               called it, if the user does not wish to exit:

               void goodbye(void)
               {
                  char pressed;
                                                  /* Display choices to user */
                  od_disp_str("You have chosen to exit this door.\n\r");
                  od_disp_str("Do you wish to:\n\r");
                  od_disp_str("      [R]eturn to the BBS\n\r");
                  od_disp_str("      [L]ogoff of the BBS\n\r");
                  od_disp_str("      [C]ontinue using the door\n\r");

                  for(;;)              /* loop until user makes valid choice */
                  {
                     pressed=od_get_key(TRUE);          /* Get key from user */

                               /* If user selects R, exit without hanging up */
                     if(pressed=='R' || pressed=='r') od_exit(40,FALSE);

                                  /* If user selects L, hangup and then exit */
                     if(pressed=='L' || pressed=='l') od_exit(41,TRUE);

                     /* If user selects C, return and allow door to continue */
                     if(pressed=='C' || pressed=='c') return;
                  }
               }

























===============================================================================
OpenDoors 6.00 Manual                                           End of Page 80

OD_GET_ANSWER()
-------------------------------------------------------------------------------

PURPOSE        Function to allow the user to respond to a prompt using only
               certain keys.


FORMAT         char od_get_answer(char *pszOptions);


RETURNS        Character that user entered


DESCRIPTION    This function can be used to get a response from the user, when
               only particular responses should be accepted. The parameter to
               the od_get_answer() function is simply a string listing the
               valid responses. The function will wait until the user selects
               one of the valid responses, and then return that response. The
               function is case insensitive, and will return the character in
               the same case that was supplied to it in the string.


SEE ALSO       od_get_key(), od_hotkey_menu()


EXAMPLES       od_get_answer("YN");
                    - If the user presses 'y', will return 'Y'.

               od_get_answer("yn");
                    - If the user presses 'y', will return 'y'.

               od_get_answer("ABC 123\n\rZ");
                    - Valid responses will be: [A], [B], [C], [SPACE],
                      [1], [2], [3], [ENTER], [Z]


















===============================================================================
OpenDoors 6.00 Manual                                           End of Page 81

OD_GET_INPUT()
-------------------------------------------------------------------------------

PURPOSE        This function allows a single input event (e.g. keystroke) to be
               retrieved, optionally translating extended key sequences such as
               arrow keys and the insert key.


FORMAT         BOOL od_get_input(tODInputEvent *pInputEvent,
                  tODMilliSec TimeToWait, WORD wFlags);


RETURNS        TRUE on success, FALSE if no input event was retrieved.


DESCRIPTION    Like od_get_key(), od_get_input() can be used to retrieve a
               single key of input from the user. However, od_get_input() has
               been designed to be easily extended in future versions of
               OpenDoors. The information retrieved by this new function is
               placed in a structure, which contains information on whether the
               input event was generated by the remote user or the local
               console, and what type of input event it was. This function also
               has built-in the ability to recognize and translate the multiple-
               character sequences that are generated when the user presses
               extended keys such as arrow keys, insert, delete, etc.

               The first parameter points to a tODInputEvent structure, which is
               defined as follows:

                    typedef struct
                    {
                       tODInputEventType EventType;
                       BOOL bFromRemote;
                       char chKeyPress;
                    } tODInputEvent;

               When od_get_input() successfully retrieves an input event, this
               structure is filled with information about the input. The
               EventType member can be either EVENT_CHARACTER (indicating a
               single character keystroke) or EVENT_EXTENDED_KEY (indicating an
               extended key, such as an arrow key). In the case of
               EVENT_CHARACTER, chKeyPress is set to the character that was
               received. In the case of EVENT_EXTENDED_KEY, chKeyPress is set to
               one of the following values:








===============================================================================
OpenDoors 6.00 Manual                                           End of Page 82

               +------------------+---------------+-------------------------+
               | chKeyPress Value | Meaning       | Control Key Alternative |
               +------------------+---------------+-------------------------+
               | OD_KEY_F1        | [F1]          | None                    |
               | OD_KEY_F2        | [F2]          | None                    |
               | OD_KEY_F3        | [F3]          | None                    |
               | OD_KEY_F4        | [F4]          | None                    |
               | OD_KEY_F5        | [F5]          | None                    |
               | OD_KEY_F6        | [F6]          | None                    |
               | OD_KEY_F7        | [F7]          | None                    |
               | OD_KEY_F8        | [F8]          | None                    |
               | OD_KEY_F9        | [F9]          | None                    |
               | OD_KEY_F10       | [F10]         | None                    |
               | OD_KEY_UP        | [UP ARROW]    | [CTRL]-[E]              |
               | OD_KEY_DOWN      | [DOWN ARROW]  | [CTRL]-[X]              |
               | OD_KEY_LEFT      | [LEFT ARROW]  | [CTRL]-[S]              |
               | OD_KEY_RIGHT     | [RIGHT ARROW] | [CTRL]-[D]              |
               | OD_KEY_INSERT    | [INSERT]      | [CTRL]-[V]              |
               | OD_KEY_DELETE    | [DELETE]      | [CTRL]-[G]              |
               | OD_KEY_HOME      | [HOME]        | None                    |
               | OD_KEY_END       | [END]         | None                    |
               | OD_KEY_PGUP      | [PAGE UP]     | None                    |
               | OD_KEY_PGDN      | [PAGE DOWN]   | None                    |
               | OD_KEY_SHIFTTAB  | [SHIFT]-[TAB] | None                    |
               +------------------+---------------+-------------------------+

               The bFromRemote member of the tODInputEvent structure will be set
               to TRUE if the input event originated from the remote system, or
               FALSE if the event originated from the local system.

               The second parameter, TimeToWait specifies how long the function
               should wait for input before returning, in milliseconds. A value
               of 0 causes the function to return immediately if no input is
               waiting in OpenDoor's internal input buffer. The is equivalent to
               a value of FALSE being passed to the od_get_key() function. A
               value of OD_NO_TIMEOUT causes this function to wait and only
               return after the next input event has been received. This is
               equivalent to a value of TRUE being passed to the od_get_key()
               function. An other value specifies the maximum number of
               milliseconds that od_get_input() should wait for input. If input
               is received before this time elapses, od_get_key() will return
               immediately with a value of TRUE, and the tODInputEvent structure
               will be fill accordingly. If no input is received before this
               time elapses, od_get_key() will return FALSE. The number of
               milliseconds to wait is rounded to the nearest 55 milliseconds in
               the DOS version of OpenDoors.

               The third parameter allows you to specify flags to further
               control the behavior of od_get_input(). Normally, this parameter
               will be set to GETIN_NORMAL. However, you can disable all
               translation of extended keystrokes by setting this value to
               GETIN_RAW. In this mode, od_get_input() works just like
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 83

               od_get_key(), returning every individual character received from
               the remote system.

               Since extended keys are not directly supported by all terminal
               programs, od_get_input() provides alternatives for some of the
               extended keys, in the form of control-key combinations. The
               control key combinations recognized by od_get_input() are listed
               in the table above. However, these control key alternatives can
               be ignored by setting the GETIN_RAWCTRL flag.

               The od_get_input() function is used internally by
               od_popup_menu(), od_edit_str() and od_multiline_edit().


SEE ALSO       od_get_key(), od_clear_keybuffer()


EXAMPLE        The following example shows the structure of how od_get_input()
               might be used in your program:

                    tODInputEvent InputEvent;
                    od_get_input(&InputEvent, OD_NO_TIMEOUT, GETIN_NORMAL);
                    if(InputEvent.EventType == EVENT_EXTENDED_KEY)
                    {
                       switch(InputEvent.chKeyPress)
                       {
                          case OD_KEY_UP:
                             /* The up arrow key has been pressed. */
                             break;
                          case OD_KEY_DOWN:
                             /* The down arrow key has been pressed. */
                             break;
                       }
                    }
                    else if(InputEvent.EventType == EVENT_CHARACTER)
                    {
                       /* A single character key has been pressed, and is  */
                       /* stored in InputEvent.chKeyPress.                 */
                    }













===============================================================================
OpenDoors 6.00 Manual                                           End of Page 84

OD_GET_KEY()
-------------------------------------------------------------------------------

PURPOSE        Function to input a key from the user


FORMAT         char od_get_key(BOOL bWait);


RETURNS        The next key waiting from the keyboard, or 0 if none.


DESCRIPTION    This function retrieves the next key waiting in the OpenDoors
               keyboard buffer (see the description of the od_clear_keybuffer()
               function, on page 53, for more information on the OpenDoors
               keyboard buffer). The od_get_key() function allows your door to
               retrieve both those keystrokes pressed by the user, and the
               keystrokes pressed on the sysop keyboard (other than the sysop
               function keys), in the sequence they were pressed. Since input
               is accepted from both sources, it is possible for the sysop, as
               well as the remote user, to make selections and control the
               door.

               Door input with OpenDoors can be accomplished with this
               function, with the od_input_str() function or with the
               od_edit_str() function. The od_input_str() and od_edit_str()
               functions is used to input an entire sequence of characters from
               the user (a string), and requires the user to press the [Enter]
               key when they are finished typing their input. On the other
               hand, the od_get_key() function is used to input a single
               keystroke (one character) from the user, and allows the user to
               make choices without having to press the enter key.

               The od_get_key() function accepts a single parameter, which
               determines whether or not it should wait for the user to press a
               key, if they have not already done so. If you pass a FALSE value
               to od_get_key(), then the function will not wait for a key to be
               pressed at the keyboard, but instead return a 0 if there are no
               keys waiting in the buffer. If you pass a TRUE value to
               od_get_key(), then this function will instead wait for a key to
               be pressed. Also, while waiting for the user to press a key, the
               od_get_key() function will give up the processor to other
               waiting programs, if you door is running under DesqView.

               If you are waiting for the user to make a choice from a menu or
               list of options, you will most likely pass a TRUE to the
               od_get_key() function, indicating that you wish for it to wait
               until a key is pressed. However, if you wish to continue other
               processing if no key is yet available from the keyboard, you
               should pass a FALSE to the od_get_key() function. For example,
               if you are displaying a screen of text, and wish to allow the
               user to pause or abort the display, you would simply call the
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 85

               od_get_key() function every few moments, passing it a value of
               FALSE. You would then be able to check if any control keys have
               been pressed, and if not, continue displaying text.

               The od_get_key() function returns the ASCII value representing
               the keystroke that was made. If you are waiting for the user to
               make a particular choice, perhaps from a menu, you will most
               likely store the value returned by od_get_key() in a variable of
               type char. For example:

                      char key;
                      ...
                      key=od_get_key(TRUE);

               You would then be able to determine which key the user pressed
               by testing the value of key, either by comparing it's numerical
               ASCII value, or by comparing it to a character constant. If you
               are testing for a non-character key, such as [ESCape], [Tab] or
               [Return], you may wish to use the ASCII value of that key. For
               example, if you wished to take some action in the case that the
               user presses the [Enter]/[Return] key, who's ASCII value is 13,
               you could do:

                      key=od_get_key(TRUE);        /* Get keypress from user */
                      if(key==13)             /* If key was [Enter]/[Return] */
                      {
                         ...                      /* Whatever you want to do */
                      }

               If you wish, instead, to respond to the user pressing a
               character key (perhaps as a choice from a menu), you can do so
               by using character constants, such as 'c', '6', or 'F'. Also,
               when testing for an alphabetical character, you will probably
               want to check for the user pressing either the upper or lower-
               case version of the letter. For example, if you wished to have
               the user press the [Y] key to continue, you could test for
               either an upper or lower-case Y as follows:

                       key=od_get_key(TRUE);       /* Get keypress from user */
                       if(key=='y' || key=='Y')        /* If key was [y]/[Y] */
                       {
                          ...                     /* Whatever you want to do */
                       }





The charts on the following page lists the decimal value and corresponding
keystroke(s) of each of the ASCII values from 0 to 127.


===============================================================================
OpenDoors 6.00 Manual                                           End of Page 86

ASCII  KEYSTROKE                       |  ASCII   KEYSTROKE
-----  ------------------------------  |  -----   ----------------------
  0    [Control]-[@]                   |   15     [Control]-[O]
  1    [Control]-[A]                   |   16     [Control]-[P]
  2    [Control]-[B]                   |   17     [Control]-[Q]
  3    [Control]-[C]                   |   18     [Control]-[R]
  4    [Control]-[D]                   |   19     [Control]-[S]
  5    [Control]-[E]                   |   20     [Control]-[T]
  6    [Control]-[F]                   |   21     [Control]-[U]
  7    [Control]-[G]                   |   22     [Control]-[V]
  8    [Control]-[H]/[Backspace]       |   23     [Control]-[W]
  9    [Control]-[I]/[Tab]             |   24     [Control]-[X]
 10    [Control]-[J]                   |   25     [Control]-[Y]
 11    [Control]-[K]                   |   26     [Control]-[Z]
 12    [Control]-[L]                   |   27     [ESCape]
 13    [Control]-[M]/[Enter]/[Return]  |   32     [SpaceBar]
 14    [Control]-[N]                   |



ASCII  KEYSTROKE | ASCII  KEYSTROKE | ASCII  KEYSTROKE | ASCII  KEYSTROKE
-----  --------- | -----  --------- | -----  --------- | -----  ---------
 33       '!'    |  57       '9'    |  80       'P'    |  104      'h'
 34       '"'    |  58       ':'    |  81       'Q'    |  105      'i'
 35       '#'    |  59       ';'    |  82       'R'    |  106      'j'
 36       '$'    |  60       '<'    |  83       'S'    |  107      'k'
 37       '%'    |  61       '='    |  84       'T'    |  108      'l'
 38       '&'    |  62       '>'    |  85       'U'    |  109      'm'
 39    '\''  (') |  63       '?'    |  86       'V'    |  110      'n'
 40       '('    |  64       '@'    |  87       'W'    |  111      'o'
 41       ')'    |  65       'A'    |  88       'X'    |  112      'p'
 42       '*'    |  66       'B'    |  89       'Y'    |  113      'q'
 43       '+'    |  67       'C'    |  90       'Z'    |  114      'r'
 44       ','    |  68       'D'    |  91       '['    |  115      's'
 45       '-'    |  69       'E'    |  92    '\\'  (\) |  116      't'
 46       '.'    |  70       'F'    |  93       ']'    |  117      'u'
 47       '/'    |  71       'G'    |  94       '^'    |  118      'v'
 48       '0'    |  72       'H'    |  95       '_'    |  119      'w'
 49       '1'    |  73       'I'    |  96       '`'    |  120      'x'
 50       '2'    |  74       'J'    |  98       'b'    |  121      'y'
 51       '3'    |  75       'K'    |  99       'c'    |  122      'z'
 52       '4'    |  76       'L'    |  100      'd'    |  123      '{'
 53       '5'    |  77       'M'    |  101      'e'    |  124      '|'
 54       '6'    |  78       'N'    |  102      'f'    |  125      '}'
 55       '7'    |  79       'O'    |  103      'g'    |  126      '~'
 56       '8'    |                  |                  |  127    [DELete]






===============================================================================
OpenDoors 6.00 Manual                                           End of Page 87





SEE ALSO       od_get_input(), od_input_str(), od_edit_str(),
               od_clear_keybuffer()


EXAMPLE        For examples of the use of the od_get_key() function, see the
               examples in the description portion, above, and the examples for
               the od_exit() and od_clear_keybuffer() functions. For further
               examples of this function, see the example program EX_VOTE.C,
               described in the section beginning on page 38.







































===============================================================================
OpenDoors 6.00 Manual                                           End of Page 88

OD_GETTEXT()
-------------------------------------------------------------------------------

PURPOSE        Stores a rectangular region of the screen in an array, to later
               be redrawn using od_puttext(). Requires ANSI, AVATAR or RIP
               modes.


FORMAT         BOOL od_gettext(INT nLeft, INT nTop, INT nRight, INT nBottom,
                  void *pBlock);


RETURNS        TRUE on success
               FALSE on failure


DESCRIPTION    This function stores the contents (both text and color
               information) of the rectangular portion of the screen denoted by
               the variables nLeft, nTop, nRight and nBottom into the buffer
               pointed to by pBlock. The saved portion of the screen may then
               be restored using od_puttext(). The buffer must be large enough
               to store two bytes for every character in the specified
               rectangle. In other words, the required size of the buffer, in
               bytes, is:

                           length * width * 2

               The parameters nLeft and nRight are column numbers from 1 to 80,
               and the parameters nTop and nBottom are row numbers between 1
               and 23.

               This function has no effect on the current text color or cursor
               position. ANSI, AVATAR or RIP mode is required for this
               function. If you wish to save and restore the entire screen, you
               may use the od_save_screen() and od_restore_screen() functions,
               which can be used in all display modes.

               If this function fails for any reason, a value of FALSE is
               returned, and the od_control.od_error variable is set to
               indicate the reason for the failure. For more information on the
               od_control.od_error variable, see page 185.


SEE ALSO       od_puttext(), od_save_screen(), od_restore_screen(),
               od_scroll(), od_window_create(), od_window_remove()







===============================================================================
OpenDoors 6.00 Manual                                           End of Page 89

OD_HOTKEY_MENU()
-------------------------------------------------------------------------------

PURPOSE        Function to display a menu file with hotkeys


FORMAT         char od_hotkey_menu(char *pszFileName, char *pszHotKeys, BOOL
               bWait);


RETURNS        Key pressed in response to menu, or '\0' if none.


DESCRIPTION    This function can be used to display a menu from an ASCII, ANSI,
               AVATAR or RIP file, allowing the user to select an option at any
               time while the menu is being displayed. The od_hotkey_menu()
               function is quite similar to the od_send_file() function, and
               you should probably familiarize yourself with that function if
               you are going to use od_hotkey_menu(). Like od_send_file(),
               od_hotkey_menu() will display the file specified by pszFileName,
               using the appropriate terminal emulation. If no extension is
               provided for the filename, OpenDoors will automatically search
               for matching files ending in .ASC, .ANS and .AVT extensions.
               OpenDoors will the select the appropriate file to display, based
               on the available files and available terminal emulation.

               The second parameter, pszHotKeys, is a string specifying the
               valid responses to the menu, in the same format as the string
               passed to the od_get_answer() function. If any of the characters
               listed in this string are pressed, either uppercase or lowercase
               versions, OpenDoors will immediately stop displaying the menu,
               and return with the value of the key pressed. The case (upper or
               lower) returned will always be identical to the case used in the
               hotkeys string. You can include the [ENTER] key as a valid hot
               key by including the \n character in the hotkey string.

               The third parameter passed to od_hotkey_menu(), bWait, specifies
               whether OpenDoors should wait after displaying the menu for the
               user to make a valid selection from the menu (TRUE), or if it
               should exit immediately (FALSE). Normally, you will want to use
               the TRUE value when calling this function. This will allow you
               to use a single function call that will display the menu and
               always return the user's selection. If you wish to gain control
               as soon as OpenDoors has displayed the menu, you may specify
               FALSE for this parameter. In this case, if the user does not
               press any of the valid hot keys while the menu is being sent,
               the function will return the character '\0'.


SEE ALSO       od_send_file(), od_get_answer()


===============================================================================
OpenDoors 6.00 Manual                                           End of Page 90

EXAMPLE        As an example of the use of the od_hotkey_menu() function,
               consider the following code fragment:


                    for(;;)                             /* Main program loop */
                    {                  /* Display menu and get user's choice */
                         char choice=od_hotkey_menu("MAINMENU","123Q",TRUE");

                         switch(choice)    /* Perform the appropriate action */
                         {
                              case '1':
                                   od_printf("You selected one.\n\r");
                                   break;

                              case '2':
                                   od_printf("You selected two.\n\r");
                                   break;

                              case '3':
                                   od_printf("You selected three.\n\r");
                                   break;

                              case 'Q':
                                   od_exit(FALSE,10);
                         }
                    }

               This is an example of the main menu loop of a simple door that
               uses the od_hotkey_menu() function. The program will continue
               executing the for(;;) loop until the user chooses to exit the
               door. On each iteration of the loop, the od_hotkey_menu()
               function is called, to display the door's menu from the file
               MAINMENU.A??. The appropriate .ASC/.ANS/.AVT file will be chosen
               and displayed as the menu. The possible choices that may be made
               from the menu are specified by the string "123Q". Thus, whenever
               the user presses one of the keys [1], [2], [3] or [Q], the
               od_hotkey_menu() function will return immediately with the value
               of the key pressed. If the menu is still being displayed at the
               time when the key was pressed, menu display will cease at that
               moment. The program then executes a case statement, to respond
               to the user's key appropriately. If the user presses [1], [2] or
               [3] this door will output a simple message to the screen. If the
               user presses the [Q] key, the door will pass control back to the
               BBS.








===============================================================================
OpenDoors 6.00 Manual                                           End of Page 91

OD_INIT()
-------------------------------------------------------------------------------

PURPOSE        To initialize OpenDoors activities


FORMAT         void od_init(void);


RETURNS        N/A


DESCRIPTION    This function initializes OpenDoors. This function must be
               called manually if you wish to access data about the user, etc.,
               before you call any other OpenDoors functions. However, if you
               do not explicitly call the od_init() function, it will be called
               automatically on the first call to most other OpenDoors
               functions. The only functions that should be called before
               od_init() are od_add_personality() and od_parse_cmd_line(). The
               od_init() function reads information from the door information
               file, initializes communications with the modem, displays the
               status line, and sets up OpenDoors' internal data structures.
               For more information on what data is and is not available before
               od_init() has been called, please refer to the chapter on the
               OpenDoors control structure, which begins on page 148.

               The od_init() function will read the door information file which
               is located in the directory specified by the variable
               od_control.info_path. If this variable has not been set prior to
               calling the od_init() function, OpenDoors will expect to find
               the door information file in the current directory. Thus, if you
               wish your door to be able to be run in a directory other than
               the BBS system directory, it would be a good idea to allow the
               sysop using your door to specify the location of the door
               information file. For an example of setting the
               od_control.info_path variable, please see the example program
               located on page 150.

               Also note that you can prevent the od_init() function from
               carrying out some of it's normal activities, such as attempting
               to read a door information file, by the use of the
               od_control.od_disable variable, as described in the section on
               the OpenDoors control structure, which begins on page 148.


SEE ALSO       od_exit()


EXAMPLE        At times, you may wish to write a door program which will
               require a maintenance utility to be run on a regular basis. For
               example, a game door may have to have its system files updated
               on a daily basis, by having a utility program run in a system
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 92

               event each day at midnight. One way of accomplishing this would
               be to have your door package include two .EXE files, one being
               the actual door program, and the other being a utility program.
               However, another option would be to have both the door and
               maintenance functions to be accessible from a single .EXE file,
               in order to simplify use of the door for the sysop. In this
               case, you would want to test the command line to determine
               whether your program should run in door mode or maintenance
               mode. You would then only execute the od_init() function, along
               with the rest of your door code, if you program were running in
               "door mode".

               The program below demonstrates one method of doing just this. In
               this case, the program would include two functions, door(),
               which would carry out all of the door-related activities, and
               maint(), which would carry out all of the maintenance-related
               activities. In this simple example, if the command line includes
               a "-M" or "/M", the program will run in maintenance mode,
               otherwise it will run in door mode. Also, if it is running in
               door mode, the program will take the first command-line
               parameter, if any, as a path to the location of the door
               information file.


               #include "opendoor.h"

               void door(void);
               void maint(void);


               int main(int argc, char *argv[])
               {
                  int counter;

                           /* Check any command line parameters for /M or -M */
                  for(counter=1;counter<argc;++counter)
                  {
                     if((argv[counter])[1]=='m' || (argv[counter])[1]=='M')
                     {
                        maint();               /* Then carry out maintenance */
                        exit(20);                                /* And exit */
                     }
                  }
                          /* If there was no -M or /M, then run in door mode */

                  /* If there are any command-line parameters take the first */
                                 /* as the path to the door information file */
                  if(argc>1) strncpy(od_control.info_path,argv[1],59);

                  od_init();                  /* call the od_init() function */
                  door();             /* Run the door portion of the program */
                  od_exit(30,FALSE);                    /* Shutdown the door */
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 93

               }


               void maint(void)
               {
                  ...               /* Carry out maintenance activities here */
               }


               void door(void)
               {
                  ...                      /* Carry out door activities here */
               }







































===============================================================================
OpenDoors 6.00 Manual                                           End of Page 94

OD_INPUT_STR()
-------------------------------------------------------------------------------

PURPOSE        Inputs a string from the user


FORMAT         void od_input_str(char *pszInput, INT nMaxLength,
                  unsigned char chMin, unsigned char chMax);


RETURNS        N/A


DESCRIPTION    To perform string input within OpenDoors, one of two functions
               can be used, od_input_str() and od_edit_str(). The first
               function, od_input_str(), allows simple line input and editing,
               and can be used in ASCII, ANSI, AVATAR and RIP modes. The second
               function, od_edit_str(), allows many formatted input options,
               advanced line editing, and other features, but requires the use
               of ANSI, AVATAR or RIP graphics modes.

               The od_input_str() function allows you to input a string from
               the user. The string will be permitted to have up to the number
               of characters specified by the max_len parameter, and all
               characters must be between the values of the min_char and
               max_char parameters. This function will wait until the user
               presses the [Enter] key to finish inputting the string.

               The first parameter passed to this function should be a pointer
               to the string where the user's input should be stored. So, if
               you wanted to store a string of up to 30 characters inputted by
               the user, you might define this string as follows:

                         char input_string[31];

               Notice here than the string must be long enough to hold the
               thirty characters which can be entered by the user, along with
               the additional "null" character which is used to indicate the
               end of a string in C. Hence, the length of the string should
               always be at least one greater than the total number of
               characters the user is permitted to enter, passed in the
               nMaxLength parameter.

               The second parameter passed to the od_input_str() function
               should be an integer value indicating the maximum number of
               characters which can be input by the user. For example, if this
               parameter had a value of 10, the user would be able to enter a
               string containing any number of characters up to and including
               10 characters. If this parameter had a value of 1, the user
               would only be able to enter a single character. However, the
               user would be able to backspace, change the character, and press
               [Enter] when they were satisfied with their entry. Note that
===============================================================================
OpenDoors 6.00 Manual                                           End of Page 95

               even if you only ask the od_input_str() function to input a
               single character, it will still expect a STRING to be passed to
               it, and will return a string with either zero or one character,
               followed by a null (string terminator) character.

               The third and fourth parameters passed to this function allow
               you to control what characters the user will be permitted to
               enter as part of the string. For example, you could set the
               minimum character to the '0' character and the maximum character
               to the '9' character, permitting the user to only enter numeric
               characters. On the other hand, you could permit the user to
               enter all ASCII characters in the range from 32 to 127. The
               od_input_str() function will permit characters in the range
               beginning with the character passed as minchar, up to and
               including the character passed as maxchar.


SEE ALSO       od_edit_str(), od_get_key(), od_clear_keybuffer()


EXAMPLE        Below are a number of examples of the use of the od_input_str()
               function in various applications:

                 - To input a two character number (only digits from 0-9):

                        od_input_str(string, 2, '0', '9');

                 - To input a 35 character name (characters from Space to
                   ASCII 127):

                        od_input_str(string, 35, 32, 127);





















===============================================================================
OpenDoors 6.00 Manual                                           End of Page 96

OD_KERNEL()
-------------------------------------------------------------------------------

PURPOSE        The OpenDoors Central Control function.


FORMAT         void od_kernel(void);


RETURNS        N/A


DESCRIPTION    In the DOS version of OpenDoors, the od_kernel() function is
               responsible for many vital OpenDoors tasks, such as monitoring
               the carrier detect signal, monitoring the amount of time that
               the user has remaining, updating the status line, responding to
               sysop hotkeys, and reading characters which are received from
               the modem. The od_kernel() function is automatically called on a
               frequent basis by the other OpenDoors functions, so most often
               you will not need to be concerned with this function. However,
               in order that OpenDoors can carry out the activities mentioned
               above with a quick response, it is important that od_kernel(),
               or some other OpenDoors function be called at least once every
               second. Thus, if your program will be carrying out some
               processing, in which it will not be calling any OpenDoors
               functions for more than a second or so, you should call the
               od_kernel() function yourself. The example below demonstrates
               one method of doing just this.

               Note that if for some reason or other, it is not possible for
               your program to call the od_kernel() function, or any other
               OpenDoors functions for a period of several seconds, this will
               not cause your door to crash or fail in any way. The only
               problem will be that OpenDoors will not be able to respond to
               any action, such as the sysop pressing a function key, or the
               user dropping carrier, until such time as you next call
               od_kernel(), or some OpenDoors function. Hence, use of the
               od_kernel() function will improve the quality and response time
               of your program, but calling it or some OpenDoors function on a
               regular basis is not absolutely vital.

               This function has no effect in the Win32 version of OpenDoors.


SEE ALSO       od_sleep()







===============================================================================
OpenDoors 6.00 Manual                                           End of Page 97

OD_LIST_FILES()
-------------------------------------------------------------------------------

PURPOSE        Lists files in a particular file area (using FILES.BBS)


FORMAT         BOOL od_list_files(char *pszFileSpec);


RETURNS        TRUE if successful, FALSE if unsuccessful


DESCRIPTION    This function allows you to display a list of files available
               for download from a particular file area, as any BBS system
               would. The file names and descriptions are taken from the
               FILES.BBS located in the directory pointed to by pszFileSpec.
               Thus, to list the files available for download in
               C:\BBS\FILES\UPLOADS, simply:

                      od_list_files("C:\\BBS\\FILES\\UPLOADS");

               OpenDoors uses a third-generation FILES.BBS format, that is
               compatible with other FILES.BBS formats, but adds some
               additional features. Each line in the FILES.BBS file lists a
               filename, along with it's description. Thus, a typical FILES.BBS
               file might look as follows:

                        PKZ110.EXE    PKZip file compressor, version 1.10
                        ODOORS60.ZIP  The newest version of OpenDoors
                        REC*.ZIP      A Record file
                        C:\BBS\*.*    All BBS files.

               When displayed, OpenDoors will list the size of each file found
               in the FILES.BBS file beside it's name, if the file is found. If
               the file does not exist, then a "[OFFLINE]" string is displayed
               in the file size column. Title lines may also be added to the
               FILES.BBS, by indenting them one or more columns. Thus, you
               could have something like:

                           NEWEST UPLOADS
                           ~~~~~~~~~~~~~~
                        PKZ110.EXE    PKZip file compressor, version 1.10
                        ODOORS60.ZIP  The newest version of OpenDoors
                        REC*.ZIP      A Record file
                        C:\BBS\*.*    All BBS files.

               In addition to this standard FILES.BBS format, OpenDoors will
               also permit wildcards to be used in FILES.BBS filenames (ie
               FNEWS???.*), or full directory paths to allow files from several
               different directories to be included in the same files area.


===============================================================================
OpenDoors 6.00 Manual                                           End of Page 98

               You may alter the colors used to display the various portions of
               the files list using the od_control variables:
                         od_control.od_list_title_col
                         od_control.od_list_name_col
                         od_control.od_list_size_col
                         od_control.od_list_comment_col
                         od_control.od_list_offline_col

               which are documented in the OpenDoors control structure section
               on this manual, which begins on page 148.


SEE ALSO       od_send_file()







































===============================================================================
OpenDoors 6.00 Manual                                           End of Page 99

OD_LOG_WRITE()
-------------------------------------------------------------------------------

PURPOSE        Function to write an entry to the log file


FORMAT         BOOL od_log_write(char *pszMessage);


RETURNS        TRUE on success, or FALSE on failure


DESCRIPTION    This function can be used to write entries to the log file. If
               the logfile has not already been opened when you call this
               function for the first time, OpenDoors will automatically open
               the log file at that time.

               To create an entry in the log file, simply call the
               od_log_write() function, passing to it the string of the text
               you wish to write. You should not include any control characters
               in this string, simply the text that should appear on the line.
               OpenDoors will automatically format the log file, adding the
               time information and other control characters. It is recommended
               that the length of the string passed to od_log_write() not
               exceed 67 characters, in order that logfile lines will all be
               less than 80 characters in length.

               Log file entries do not usually contain periods or other
               punctuation at the end of the line. Also, log file entries are
               usually written in the present tense. The first character of the
               entry is usually upper-case, with all other entries in lower
               case. Also, since excessive numbers or lengths of log file
               entries can quickly use a lot of disk space, it is best to think
               carefully about what events should be recorded in the log file.
               It is also a good idea to minimize the number of words used in
               the entry, without being too cryptic. As an example, "User
               entering options menu" should be used instead of "user entered
               the options menu."


SEE ALSO       Page 224.


EXAMPLE        Calling the od_log_write() function is as simple as follows:

                    od_log_write("Awarding user with 5 minutes more time");






===============================================================================
OpenDoors 6.00 Manual                                          End of Page 100

OD_MULTILINE_EDIT()
-------------------------------------------------------------------------------

PURPOSE        Provides a multiple line text editor which can be used for
               entering editing any text that spans more than one line, such as
               messages or text files.


FORMAT         INT od_multiline_edit(char *pszBufferToEdit, UINT unBufferSize,
                  tODEditOptions *pEditOptions);


RETURNS        OD_MULTIEDIT_SUCCESS on success, or OD_MULTIEDIT_ERROR on
               failure


DESCRIPTION    This function provides a text editor with optional word wrap
               capabilities. This editor can be used for entering or editing
               text files, messages or other information that spans multiple
               lines. The editor can be configured to operate in full-screen
               mode, or to occupy any smaller area of the screen that you
               specify. It provides the navigation (home / end / page up / arrow
               keys) features and editing features (insert / overwrite mode,
               Ctrl-Y to delete a line, etc.) that you would expect.

               The od_multiline_edit() function is designed to be both easy to
               use and very flexible. To that end, the function only takes three
               parameters. The first two parameters are required, and the third
               parameter is an optional options structure. The first parameter,
               pszBufferToEdit, is a pointer to the buffer of text to edit. This
               buffer must always be a '\0'-terminated string. This buffer must
               be initialized before calling od_multiline_edit(). The second
               parameter, unBufferSize, indicates the size of the buffer that is
               passed in pszBufferToEdit. Note that this should be the total
               amount of space that is available in the buffer for text entered
               by the user, not the length of data that is actually initially in
               the buffer. If you do not wish to customize any of the
               od_multiline_edit() options, then you may simply set the third
               parameter to 0. Hence, a simple example of how to use
               od_multiline_edit() is:

                    char szMyEditBuffer[4000] = "";
                    od_multiline_edit(szMyEditBuffer, sizeof(szMyEditBuffer),
                    NULL);

               If you wish to customize od_multiline_edit(), you should pass a
               pointer to a tODEditOptions structure as the third parameter. You
               should initialize this entire structure to zeros before
               attempting to use it. You can then set any values of this
               structure which you wish to change from their default. Any values
               that are left at 0 will automatically revert to their defaults.
               For example, if you wanted to specify a text format other than
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 101

               the default, you could create, initialize and pass in a
               tODEditOptions structure as follows:

                    char szMyEditBuffer[4000] = "";
                    tODEditOptions MyEditOptions;
                    memset(&MyEditOptions, 0, sizeof(MyEditOptions));
                    MyEditOptions.TextFormat = FORMAT_LINE_BREAKS;
                    od_multiline_edit(szMyEditBuffer, sizeof(szMyEditBuffer),
                         &MyEditOptions);

               The definition of the tODEditOptions structure is as follows:

                    typedef struct
                    {
                       INT nAreaLeft;
                       INT nAreaTop;
                       INT nAreaRight;
                       INT nAreaBottom;
                       tODEditTextFormat TextFormat;
                       tODEditMenuResult (*pfMenuCallback)(void *pUnused);
                       void * (*pfBufferRealloc)(void *pOriginalBuffer,
                          UINT unNewSize);
                       DWORD dwEditFlags;
                       char *pszFinalBuffer;
                       UINT unFinalBufferSize;
                    } tODEditOptions;

               nAreaLeft, nAreaTop, nAreaRight, nAreaBottom allows you to
               specify the portion of the screen that the text editor should
               use. This defaults to 1, 1 - 80, 23.

               TextFormat allows you to specify what format the text should be
               stored in the buffer using. The default is
               FORMAT_PARAGRAPH_BREAKS, which specifies that a line break only
               appears at the end of each paragraph, and that the contents of a
               paragraph are word wrapped. FORMAT_LINE_BREAKS specifies that a
               line break appears at the end of each line of text on the screen,
               and that newly entered text is word wrapped. FORMAT_NO_WORDWRAP
               is equivalent to FORMAT_LINE_BREAKS, except that newly entered
               text is not word wrapped. Instead, lines may be arbitrarily long.
               For each of these text formats, od_multiline_edit() automatically
               decides whether line breaks should take the form of a carriage
               return ('\r'), line feed ('\n'), or some combination of these,
               based on what it sees in the buffer that you supply. If no line
               breaks are found in the buffer, then the default is to use just a
               line feed ('\n') character. FORMAT_FTSC_MESSAGE specifies a FTSC-
               compliant message, such as is used in a *.MSG message file. Among
               other things, this specifies that carriage returns ('\r') end
               paragraphs, and that line feeds ('\n') should be ignored.

               pfMenuCallback allows you to provide a callback function that
               will be called when the user presses the escape (or control-Z)
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 102

               key. This allows you to provide a menu that can be accessed from
               within the text editor. This function should return
               EDIT_MENU_DO_NOTHING if the editor should continue normally, or
               EDIT_MENU_EXIT_EDITOR if the od_multiline_edit() should return.
               If no menu callback function is provided, then
               od_multiline_edit() always returns when the escape or control-z
               key is pressed.

               pfBufferRealloc allows you to provide a function which will
               attempt to reallocate a larger buffer if the user enters more
               text than will fit in the originally supplied buffer. You should
               only do this if you have dynamically allocated the buffer that
               you initially passed into od_multiline_edit(). If you allocated
               the buffer using malloc() or calloc(), then pfBufferRealloc can
               be set to point to the realloc() function. If you allocated the
               buffer using the C++ new operator, then you must write a your own
               reallocation function which obeys the same semantics as the C
               realloc() function. If no buffer reallocation function is
               provided, then od_multiline_edit() will never allow the user to
               enter more text than will fit in the buffer that you initially
               supply. If you are using the buffer reallocation option, you can
               obtain a pointer to the final buffer, and the size of the final
               buffer, from the pszFinalBuffer and unFinalBufferSize members.


SEE ALSO       od_input_str(), od_edit_str(), od_get_input()


























===============================================================================
OpenDoors 6.00 Manual                                          End of Page 103

OD_PAGE()
-------------------------------------------------------------------------------

PURPOSE        Function to allow user to page the sysop


FORMAT         void od_page(void);


RETURNS        N/A


DESCRIPTION    This function can be called to allow the user to page the sysop.
               This function will ask the user why they wish to chat with the
               sysop, and then page the sysop. The sysop will then be free to
               break into chat at any time. Sysop paging will also be aborted
               by the user, simply by pressing [Enter] when asked for a reason
               for chat. When the user pages the sysop, the [Wants-Chat]
               indicator will begin to flash on the main status line, and the
               status line will switch to show the user's reason for wanting to
               chat. Also, the user's total number of pages will be
               incremented.

               Depending upon the setting of the od_control.od_okaytopage
               variable, this function will also optionally check sysop paging
               hours, and only allow the user to page the sysop during valid
               paging hours. For information on the variables containing the
               user's total number of pages, the user's want-chat status, valid
               sysop paging hours, and the od_control.od_okaytopage variable,
               see the section on the OpenDoors control structure, which begins
               on page 148.


EXAMPLE        For an example of the use of the od_page() function, see the
               EX_VOTE.C example program, which is described beginning on page
               38.
















===============================================================================
OpenDoors 6.00 Manual                                          End of Page 104

OD_PARSE_CMD_LINE()
-------------------------------------------------------------------------------

PURPOSE        Handles standard command line options.


FORMAT         Under DOS Version:
               void od_parse_cmd_line(INT nArgCount, char *papszArguments[]);

               Under Win32 Version:
               void od_parse_cmd_line(LPSTR pszCmdLine);


RETURNS        N/A


DESCRIPTION    This is the only OpenDoors function that uses a different
               calling format in the DOS and Win32 versions of OpenDoors. The
               reason for this is that od_parse_cmd_line() always allows you to
               pass command line parameters in the same format that the
               operating system passes them to you. Under the DOS version of
               OpenDoors, you should pass the argc and argv values that were
               passed to your main function as the two parameters to
               od_parse_cmd_line(). Under the Win32 version of OpenDoors, you
               should pass the pszCmdLine values that were passed to your
               WinMain() function as the one parameter to od_parse_cmd_line().

               The od_parse_cmd_line() function should be called before your
               first call to any other OpenDoors function, with the possible
               exception of the od_add_personality() function.

               It is recommended that any program which uses OpenDoors call
               od_parse_cmd_line() as part of its startup procedure. This
               allows your program to automatically handle many common command
               line options that will make it easier to setup and run your
               program. Among the helpful command line options processed by
               od_parse_cmd_line() are options to set serial port information
               (including information on non-standard serial port setups),
               specify the location of configuration and drop files, force the
               program to run in silent mode (without no local display), pass
               in user information, and the ability to start the program in
               local mode without a drop file. For a complete list of the
               options supported by od_parse_cmd_line(), run the example Vote
               door that is included in the OpenDoors packages, specifying -
               help on the command line.

               If you wish to process your own command line parameters in
               addition to those supported by OpenDoors, simply check the
               command-line for your own parameters after calling
               od_parse_cmd_line(). You can do this in the same way that you
               would handle command line options if you weren't using
               od_parse_cmd_line(). The od_parse_cmd_line() function does not
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 105

               generate an error message if it encounters unrecognized command
               line options. You can supply your own text to display when the
               user chooses the /Help option by setting
               od_control.od_cmd_line_help to point to your own string. Separate
               lines in your string with the \n character, and align text using
               the \t character.


SEE ALSO       od_init()


EXAMPLE        The following example shows how a program that uses
               od_parse_cmd_line() should be structured in order to compile
               under either DOS or Win32 versions of OpenDoors:

               #include "opendoor.h"

               /* main() or WinMain() function - Program begins here. */
               #ifdef ODPLAT_WIN32
               int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                  LPSTR lpszCmdLine, int nCmdShow)
               #else
               int main(int argc, char *argv[])
               #endif
               {
               #ifdef ODPLAT_WIN32
               #endif

                  /* Set program's name for use by OpenDoors. */
               #ifdef ODPLAT_WIN32
                  /* In Windows, pass in nCmdShow value to OpenDoors. */
                  od_control.od_cmd_show = nCmdShow;

                  /* Call od_parse_cmd_line. */
                  od_parse_cmd_line(lpszCmdLine);
               #else
                  od_parse_cmd_line(argc, argv);
               #endif


                  /* Start the rest of your program here. */


               }








===============================================================================
OpenDoors 6.00 Manual                                          End of Page 106

OD_POPUP_MENU()
-------------------------------------------------------------------------------

PURPOSE        Creates a popup menu which allows the user to make a selection
               by pressing a single key, or selecting the item with a highlight
               bar. After the user has made a selection, the menu may be
               removed from the screen, restoring the original screen contents
               "beneath" the window.


FORMAT         INT od_popup_menu(char *pszTitle, char *pszText, INT nLeft,
                  INT nTop, INT nLevel, WORD uFlags);


RETURNS        POPUP_ERROR    On error (od_control.od_error is set to
                              indicate type of error).
               POPUP_ESCAPE   If user exited menu by pressing [ESCape].
               POPUP_LEFT     If user exited menu by pressing the left arrow
                              key.
               POPUP_RIGHT    If user exited menu by pressing the right arrow
                              key.

               Or, a postive integer indicating the menu item that was chosen
               if a selection was made.


DESCRIPTION    od_popup_menu() creates a popup window with a menu of choices,
               for use in ANSI/AVATAR/RIP modes. The user is able to choose an
               item from the menu by moving the highlighted selection bar with
               the arrow keys, or by pressing a key associated with a
               particular menu item. The contents of the menu are defined by
               the string pointed to by the pszText parameter. This menu
               definition string contains each menu option, separated by a '|'
               (pipe) character. Keys associated with each menu entry can be
               defined by proceeding the letter with a '^' (carat) character.
               For example, the string:

                    "^Save|^Load|E^xit"

               would produce a menu with three options: Save, Load and Exit.
               The user would be able to select the Save option by pressing the
               [S] key, the Load option by pressing the [L] key, and the Exit
               option by pressing the [X] key. Furthermore, the characters
               corresponding to each menu item would be displayed in a
               highlighted color.

               Menus displayed with od_popup_menu() may optionally have a
               title, as specified by the pszTitle parameter. If this parameter
               is set to NULL, no title will be displayed. If this parameter is
               not NULL, the specified string will be displayed as a title on
               the window.

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 107

               The nLeft and nTop parameters specify the left and top locations
               of the menu window, were 1, 1 is the upper right corner of the
               screen. The bottom and right corners of the menu are
               automatically determined by the size and number of menu entries
               in the menu definition string.

               The nLevel parameter specifies the menu level, an integer from 0
               to 10. Unless you are using the MENU_KEEP flag, this parameter
               can always be 0.

               The uFlags parameter specifies one or more of the following
               options, joined by the bitwise-OR operator (|).

                    MENU_NORMAL         Has no effect.
                    MENU_ALLOW_CANCEL   Allow user to exit menu with [ESCape].
                    MENU_PULLDOWN       Allow exit with arrow keys.
                    MENU_KEEP           Leave menu active on selection.
                    MENU_DESTROY        Remove a currently active menu.

               If you are not using any of the other flags, you can use
               MENU_NORMAL as a place-holder for this parameter. If you specify
               MENU_ALLOW_CANCEL, the user will be able to exit the menu
               without making a selection by pressing the [ESCape] key. If the
               user presses [ESCape], od_popup_menu() returns POPUP_ESCAPE.

               You can use the MENU_PULLDOWN option with od_popup_menu() to
               implement a set of pulldown menus. In this case, if the user
               presses the left arrow key or right arrow key while the menu is
               being displayed, od_popup_menu() returns with POPUP_LEFT or
               POPUP_RIGHT, allowing you to display a different menu.

               Normally, od_popup_menu() will remove the menu from the screen
               as soon as the user makes a selection. However, there may be
               some cases when you want the menu to continue to be visible
               after the user makes a selection. For example, you may want some
               menu options to lead to further sub-menus, or you may wish to
               display a popup window, and return to this menu after the user
               has exited from the popup window. If the MENU_KEEP flag is
               specified, the menu will remain active (on-screen) after the
               user makes a selection. However, the menu will still be
               destroyed if the user cancels out of the menu (this will only
               happen if you have specified MENU_ALLOW_CANCEL), or if the user
               moves to another menu by pressing the left or right arrow keys
               (this will only happen if you have specified MENU_PULLDOWN). If
               MENU_KEEP has been specified, and the user makes a selection,
               you must eventually either return to the menu, or destroy it by
               calling MENU_DESTROY. If you want to return to the menu, simply
               call od_popup_menu() again with the same level value that was
               used to originally create the menu. The user will now be able to
               make another selection from the menu, and od_popup_menu() will
               once again return that selection to you. If you want to destroy
               the menu, simply call od_popup_menu() with the MENU_DESTROY flag
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 108

               set, and the same level value that was used to create the
               original menu. If you wish to create another popup menu while
               the first one is still active, simply call od_popup_menu()
               again, this time with a different level value. The colors used
               by the od_popup_menu() function are set by the following
               OpenDoors control structure settings:

                    char od_control.od_menu_title_col;
                    char od_control.od_menu_border_col;
                    char od_control.od_menu_text_col;
                    char od_control.od_menu_key_col;
                    char od_control.od_menu_highlight_col;
                    char od_control.od_menu_highkey_col;


SEE ALSO       od_window_create(), od_window_remove(), od_draw_box(),
               od_hotkey_menu()


EXAMPLE        The following example shows the use of multiple-level menus:

               #include <stdlib.h>
               #include "opendoor.h"
               main()
               {
                  for(;;)
                  {
                     switch(od_popup_menu("Main Menu",
                        "^Files|^Electronic Mail|^News|E^xit",
                        20, 5, 0, MENU_NORMAL | MENU_KEEP))
                     {
                        case 1:
                           od_popup_menu("Files Menu",
                              "^Search For Files|^Download|^Upload",
                              30, 7, 2, MENU_NORMAL | MENU_ALLOW_CANCEL);
                           break;
                        case 2:
                           od_popup_menu("EMail Menu",
                              "Get ^New Mail|^Send Mail|Send ^Fax",
                              30, 8, 1, MENU_NORMAL | MENU_ALLOW_CANCEL);
                           break;
                        case 3:
                           od_popup_menu("News Menu",
                              "Choose News^Group|^Read News|^Post News",
                              30, 9, 1, MENU_NORMAL | MENU_ALLOW_CANCEL);
                           break;
                        case 4:
                           od_popup_menu(NULL, NULL, 0, 0, 0, MENU_DESTROY);
                           return(0);
                     }
                  }
               }
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 109

OD_PRINTF()
-------------------------------------------------------------------------------

PURPOSE        Performs formatted output (remote & local), with the ability to
               change display colors.


FORMAT         void od_printf(char * pszFormat,...);


RETURNS        N/A


DESCRIPTION    This is one of two OpenDoors function which allows you to
               display a string of characters, the other being the
               od_disp_str() function. For a complete comparison of the various
               OpenDoors display function, see the description of the
               od_disp_str() function, on page 63. Like the od_disp_str()
               function, the od_printf() function will display its output both
               on the local screen, and on the remote user's screen (if the
               door is not operating in local mode). However, the od_printf()
               function also allows for formatted output, just as the printf()
               function does. In addition to providing all of the features of
               the normal C printf() function, the od_printf() function allows
               you to include codes to change the color of the display of text.
               This unique feature allows you to display multi-colored text,
               without having to use chains of alternating od_disp_str() and
               od_set_color() calls.

               As with the printf() function, the od_printf() function accepts
               one or more parameters, the first parameter being the format
               string to be displayed, and the additional parameters being data
               to be displayed within the string. The OpenDoors od_printf()
               function recognizes all of the control characters and options
               recognized by the normal printf() function. For example, to
               display the amount of time that a user has left online, the
               following line would be a valid use of the od_printf() function:

                    od_printf("Time Left:%d\n\r", od_control.user_timelimit);

               Note that a full discussion of the printf() function is beyond
               the scope of this manual. For more information on using
               printf(), please see your Turbo C(++) / Borland C++ manuals.

               In addition to the normal control sequences, such as "%s", "%d",
               or "%12.12s", the od_printf() function also allows you to
               include special color-setting codes within the format string.
               These color code sequences BEGIN and END with a delimiter
               character, which is used to indicate that the sequence is a
               color setting. Consider, for example, the following line of
               code, which displays text in various colors:

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 110

                       od_printf("`blue`Blue `green`Green `red`Red  \n\r");

               In this case (assuming of course that a color monitor is being
               used) the word "Blue" will be displayed in the color blue, the
               word "Green" will be displayed in the color green, and the word
               "Red" will be displayed in the color red. In this case, the
               sequence `blue` sets the display color to dark blue on black.
               Here, the back-quote (`) is the delimiter character which
               indicates the beginning and end of the color sequence. Be sure
               not to confuse the back-quote character (`) with the normal
               forward quote ('). THIS IS THE MOST COMMON DIFFICULTY
               EXPERIENCED WITH THE OD_PRINTF() FUNCTION. The text between the
               back-quote characters indicates the color that should be set.
               This text can include the name of the foreground color, the name
               of the background color, the "bright" keyword and the "flashing"
               keyword. The first color mentioned is taken to be the foreground
               color, and the second the background color. Case is not
               sensitive, additional words can be included for legibility.
               Thus:

                         `bright white cyan`

               is equivalent to:

                         `Bright white on a cyan background`.

               The "bright" keyword indicates that the foreground color should
               be displayed in high intensity, and the "flashing" keyword
               indicates that the text should be flashing. If no background is
               specified, the background color defaults to black. If no
               foreground or background colors are specified, the color
               defaults to white on black.

               The od_printf() function will automatically determine whether
               the user has ANSI, AVATAR or RIP graphics enabled, and will send
               the appropriate color codes to change the color of displayed
               text. If the user does not have either ANSI or AVATAR graphics
               modes turned on, then the od_printf() function will not send any
               color codes. Thus, a door program using color codes would work
               just as well when ANSI/AVATAR/RIP graphics are not available,
               except that all text will appear in the same color.

               You may prefer to set colors by using the od_set_color() or
               od_set_attrib() functions, instead of using these cryptic color
               codes imbedded in od_printf() functions. In some cases, however,
               it will be much more advantageous to place the color codes
               within your od_printf() strings. As a case in point, consider
               the single od_printf() statement in the example, above. To
               accomplish the same result using the od_disp_str() and
               od_set_color() functions, you would have to use the following
               SIX function calls:

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 111

                       od_set_color(D_BLUE,D_BLACK);
                       od_disp_str("Blue ");
                       od_set_color(D_GREEN,D_BLACK);
                       od_disp_str("Green ");
                       od_set_color(D_RED,D_BLACK);
                       od_disp_str("Red  \n\r");

               While this method MAY be easier understand, it certainly
               requires many more line of code to accomplish. However, either
               method will work, and the choice is up to you as to which method
               you prefer. Keep in mind, however, that if the color to be set
               is stored in a variable, instead of always being the same color,
               you must use either the od_set_color() or od_set_attrib()
               function to set the display color.

               While the back-quote (`) character is normally used to delimit a
               color sequence in the od_printf() function, you may wish to be
               able to print a back-quote character using the od_printf()
               function. In this case, you may configure OpenDoors to use a
               different character to represent color code sequences. To do
               this, simply use the od_control.od_color_delimiter variable,
               which is described in the OpenDoors control structure section,
               beginning on page 148. For example, if you wished to use the
               tilde (~) character instead of the back-quote character to
               change colors, simply place the following line within your
               program, at some point after having called od_init() or some
               OpenDoors function:

                       od_control.od_color_delimiter='~';

               Also, you may disable the color code interpretation within the
               od_printf() function altogether, by setting the
               od_control.od_color_delimiter variable to 0.

               Note that the od_printf() function interprets the color codes
               AFTER parsing the other control sequences, such as "%d" or "%s".
               Thus, if you used the command:

                       od_printf("%s",string);

               Any color codes contained in the string "string" would also be
               interpreted. If you did not wish to have any color code
               characters which might be contained in the string "string"
               treated as such, you could again disable od_printf()'s color
               code interpretation, by setting the od_control.od_color_char
               variable to 0.

               Note that the string to be displayed by od_printf() should not
               exceed 511 characters in size, including the size of color
               sequences and expanded % fields.


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 112

SEE ALSO       od_disp_str(), od_disp(), od_putch(), od_repeat(), od_disp_emu()


EXAMPLE        Below is a simple example of a user statistics door program,
               which displays various pieces of information to the user, by
               using the od_printf() function. Notice the use of color code
               sequences in order to display the titles in a different color
               from the information fields. Note that since the information
               available to this door will depend on the BBS system under which
               it is running, not all of the information displayed by this door
               will be available under all BBS systems. For a description of
               what information is available under what BBS systems, see the
               OpenDoors control structure portion of this manual, which begins
               on page 148.


#include "opendoor.h"

int main(int argc,char *argv[])
   {
   od_init();                                     /* Begin OpenDoors program */

   od_printf("`bright white` YOUR STATISTICS\n\r");         /* Display title */
   od_printf("---------------\n\r\n\r");

                                                       /* Display statistics */
   od_printf("`red`NAME :             `blue`%s\n\r",od_control.user_logintime);
   od_printf("`red`LOCATION :         `blue`%s\n\r",od_control.user_location);
   od_printf("`red`PHONE NUMBER :     `blue`%s\n\r",od_control.user_homephone);
   od_printf("`red`LAST CALL :        `blue`%s\n\r",od_control.user_lastdate);
   od_printf("`red`NUMBER OF CALLS :  `blue`%u\n\r",od_control.user_numcalls);
   od_printf("`red`NUMBER OF PAGES :  `blue`%u\n\r",od_control.user_numpages);
   od_printf("`red`REMAINING TIME :   `blue`%d\n\r",od_control.user_timelimit);
   od_printf("`red`# OF DOWNLOADS :   `blue`%u\n\r",od_control.user_downloads);
   od_printf("`red`# OF UPLOADS :     `blue`%u\n\r",od_control.user_uploads);
   od_printf("`red`KBYTES DL TODAY :  `blue`%u\n\r",od_control.user_todayk);

                                                /* Ask user to press [Enter] */
   od_printf("`bright green on green`Press [Enter] to return to BBS...\n\r");

   while(od_get_key(TRUE)!=13);            /* Wait for user to press [Enter] */

   od_exit(20,FALSE);                                       /* Return to BBS */
   }


HELPFUL        This section demonstrates use of the od_printf() color
HINT           sequences imbedded directly in the printf() format string, such
               as:

                         od_printf("Hello `bright green` there!");

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 113

               However, there are also other ways that you can take advantage
               of this feature. For example, the C programming language
               concatenates string constants that are separated only by white
               space or carriage returns. For instance,

                         "Hello " "`bright green`" " there!"

               is equivalent to:

                         "Hello `bright green` there!"

               For this reason, you can create macros for common color
               sequences in your program, such as:

                         #define HIGHLIGHT "`bright green`"

               You can then use such constants when calling the od_printf()
               function, as follows:

                         od_printf("Hello " HIGHLIGHT " there!");

               You may find this method of setting the display color to be
               easier to read, and more easily configurable than including the
               color sequence directly in the format string. Below another use
               of the color sequences is describe, which allows the colors used
               by od_printf() not be "hard-wired".


               Since color control sequences are evaluated by od_printf() after
               it evaluates all format sequences (such as "%d"). For this
               reason, it is possible to change the display color using a
               string variable, instead of using a fixed color in the string.
               For example, if you program had the variable:

                         char highlight[40];

               which was set at some point to be equal to:

                         "`bright green`"

               you would be able to use od_printf() as follows:

                         od_printf("Hello %s there!", highlight);

               The display color would then be changed at the location where
               the "%s" appears in the od_printf() format string. The advantage
               of using this method to change display colors is that unlike
               other methods, the value of the highlight variable can be
               changed. This could be used, for example, to allow the sysop to
               configure the colors they wish your door to use. You would only
               need to change the value of the highlight variable in order to
               change the color set by od_printf().
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 114

OD_PUTCH()
-------------------------------------------------------------------------------

PURPOSE        Function to display a single character.


FORMAT         void od_putch(int chToDisplay);


RETURNS        N/A


DESCRIPTION    This function performs a similar function to the other OpenDoors
               display functions. For information on the uses of the various
               OpenDoors display functions, see the description of the
               od_disp_str() function, on page 63. This function is most
               similar to the od_disp() and od_disp_str() functions, except
               that it only displays a single character at a time.

               This function will display the character passed to it at the
               cursor position in the output window, and then advance the
               cursor to the next display position. If OpenDoors is not
               operating in local mode, the character will also be sent to the
               modem, and thus displayed on the user's screen in the same
               manner that it is displayed on the local screen. If ANSI, AVATAR
               or RIP graphics mode is activated the character will be
               displayed in the current color.


SEE ALSO       od_disp_str(), od_disp(), od_printf(), od_repeat(),
               od_disp_emu()


EXAMPLE        Below is an example of the use of the od_putch() function. This
               example is a function which you could use in place of the
               od_get_key() function. This function inputs a single character
               from the keyboard, just as the od_get_key() function does.
               However, if the character entered is a printable character, the
               function will also echo the character to the local screen, using
               the od_putch() function.

               char get_key_with_echo(int wait)
               {
                  char pressed=od_get_key(wait);        /* Get key from user */

                  if(pressed>=32 && pressed<=126)     /* If key is printable */
                  {
                     od_putch(pressed);             /* Display the character */
                  }

                  return(pressed);             /* Return key pressed by user */
               }
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 115

OD_PUTTEXT()
-------------------------------------------------------------------------------

PURPOSE        Displays a rectangular region of text and color information, as
               previously stored using od_gettext()


FORMAT         BOOL od_puttext(INT nLeft, INT nTop, INT nRight, INT nBottom,
                  void *pBlock);


RETURNS        TRUE on success
               FALSE on failure


DESCRIPTION    This function "pastes" a rectangular block of text and color
               information that has been previously retrieved using
               od_gettext(). The block is placed at the screen location
               indicated by the variables nLeft, nTop, nRight and nBottom,
               where nLeft and nRight are column numbers from 1 - 80, and nTop
               and nBottom are row numbers from 1 - 23. The length and width of
               the rectangle specified by nLeft, nTop, nRight and nBottom must
               be the same as the length and width of the rectangle passed to
               od_gettext() when storing the block of text.

               This function attempts to display the pasted block as quickly as
               possible, only transmitting information on portions of the block
               that are different than the original screen contents. When this
               function returns, it leaves the cursor at its original position,
               and the display color at its original setting. This function
               requires ANSI or AVATAR mode.

               The control structure variable od_control.od_full_put may be set
               to TRUE to force od_puttext() to always send all characters in
               the block to be displayed, instead of only displaying the
               portions of the block that differ from the original screen
               contents. If you wish to save and restore the entire screen, you
               can use od_save_screen() and od_restore_screen(), which work in
               all display modes.

               You may also use the od_puttext() to display a rectangular block
               of text that you generate manually, instead of retrieving using
               od_gettext(). To do this, you pass an array which contains the
               text and color information for the rectangular area to be
               painted, in the pBlock parameter. The array passed to
               od_puttext() contains a two-byte sequence of information for
               each character in the rectangle. The first byte contains the
               ASCII code of the character to be displayed. The second byte
               contains the color attribute value of the character, in the same
               format as used by the od_set_attrib() function (described on
               page 128). These two byte sequences are stored in the order in
               which English is written; the array begins with the two byte
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 116

               sequences for all of the characters on the first line, from left
               to right, followed by the characters for the second line, and so
               on. The length of each line must be exactly equal to the width
               of the rectangular region to be painted.


SEE ALSO       od_gettext(), od_save_screen(), od_restore_screen(),
               od_scroll(), od_window_create(), od_window_remove()












































===============================================================================
OpenDoors 6.00 Manual                                          End of Page 117

OD_REPEAT()
-------------------------------------------------------------------------------

PURPOSE        Repeatedly display the specified character any number of times,
               using special graphics codes for greater speed, if possible.


FORMAT         void od_repeat(char chValue, BYTE btTimes);


RETURNS        N/A


DESCRIPTION    This display function will repeatedly display the character
               chValue, btTimes times. For a complete breakdown of the various
               OpenDoors display functions, see the description of the
               od_disp_str() function, located on page 63.

               The advantage of using this function to display a series of
               identical characters is that this function will use special
               graphics-mode control sequences to display the repeated
               character very efficiently, if the required graphics mode is
               available. For example, in AVATAR mode, this function can
               display an entire line of one character, by sending a control
               sequence to the modem that is only three characters long. If
               graphics mode is not turned on, then the od_disp_str() function
               will simply send the specified character the appropriate number
               of times. As with the other display functions, the output of
               this function is sent to both the local and remote screens.


SEE ALSO       od_putch(), od_disp_str(), od_disp(), od_printf(), od_disp_emu()


EXAMPLE        The example function below demonstrates the use of the
               od_repeat() function in drawing a window (a square box) on the
               screen. This function is essentially a simplified version of the
               od_draw_box() function, which is described on page 65. Unlike
               this function, the od_draw_box() function allows the
               customization of the characters used to draw the box's boarder,
               and if possible uses additional AVATAR graphics codes to display
               the window even faster than this function does. Thus, the
               function below is really provided for demonstration purposes
               only.

               This function accepts four parameters, which indicate the
               location of the upper left and lower right corners of the window
               to be displayed. The function then displays the window with the
               current color attribute settings. Since this function uses the
               od_repeat() function, if AVATAR graphics are available, it can
               display the entire window in a fraction of a second, even if it
               is displaying a window the size of the entire screen at slow
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 118

               baud rates. Note that this window display function requires that
               the user has ANSI, AVATAR or RIP graphics mode enabled.

               void draw_window(char left, char top, char right, char bottom)
               {
                  char line_counter;   /* Number of current line being drawn */
                  char between_size=(right-left)-1;      /* X size of window */

                  od_set_cursor(top,left);             /* move to top corner */
                  od_putch(218);                 /* display corner character */
                  od_repeat(196,between_size);           /* display top line */
                  od_putch(191);                 /* display corner character */
                                      /* loop through middle lines of window */
                  for(line_counter=top+1;line_counter<bottom;++line_counter)
                  {
                     od_set_cursor(line_counter,left); /* move to line start */
                     od_putch(179);                /* display left line char */
                     od_repeat(' ',between_size);      /* display blank area */
                     od_putch(179);               /* display right line char */
                  }

                  od_set_cursor(bottom,left);       /* move to bottom corner */
                  od_putch(192);                 /* display corner character */
                  od_repeat(196,between_size);        /* display bottom line */
                  od_putch(217);                 /* display corner character */
               }


























===============================================================================
OpenDoors 6.00 Manual                                          End of Page 119

OD_RESTORE_SCREEN()
-------------------------------------------------------------------------------

PURPOSE        Restores the screen contents as previous saved using the
               od_save_screen() function. This function can be used in any
               display mode.


FORMAT         BOOL od_restore_screen(void *pBuffer);


RETURNS        TRUE on success
               FALSE on failure


DESCRIPTION    This function restores the entire contents of the screen, along
               with the current cursor position and display color, which was
               previously stored using the od_save_screen() function. Unlike
               the od_get_text() and od_put_text() functions, the
               od_save_screen() and od_restore_screen() functions will work in
               all display modes (ASCII, ANSI, AVATAR and RIP).

               The pBuffer parameter must point to the buffer previously passed
               to od_save_screen(). Note that the od_save_screen() and
               od_restore_screen() functions save the stored information in
               different formats than the od_getttext() and od_puttext()
               functions. For this reason, you cannot save the screen contents
               with od_gettext() and restore them with od_restore_screen(), or
               visa-versa.

               If this function fails for any reason, a value of FALSE is
               returned, and the od_control.od_error variable is set to
               indicate the reason for the failure. For more information on the
               od_control.od_error variable, see page 185.


SEE ALSO       od_save_screen(), od_gettext(), od_puttext(), od_clr_scr()


EXAMPLE        For an example of how to use the od_restore_screen() function,
               see the example which accompanies the od_save_screen() function,
               on page 121.










===============================================================================
OpenDoors 6.00 Manual                                          End of Page 120

OD_SAVE_SCREEN()
-------------------------------------------------------------------------------

PURPOSE        Saves the contents of the screen, to later be restored using
               od_restore_screen(). Can be used in any display mode.


FORMAT         BOOL od_save_screen(void *pBuffer);


RETURNS        TRUE on success
               FALSE on failure


DESCRIPTION    This function saves the entire contents of the screen, along
               with the current cursor position and display color, to be later
               restored using the od_restore_screen() function. Unlike the
               od_get_text() and od_put_text() functions, the od_save_screen()
               and od_restore_screen() functions will work in all display modes
               (ASCII, ANSI, AVATAR and RIP).

               The pBuffer parameter should point to a buffer where the current
               screen information is to be stored. This buffer must be at least
               4004 bytes in size.

               Note that the od_save_screen() and od_restore_screen() functions
               save the stored screen information in different formats than the
               od_getttext() and od_puttext() functions. For this reason, you
               cannot save the screen contents with od_save_screen() and
               restore them with od_puttext(), or visa-versa.

               Also, note that when used in RIP graphics mode, this function
               only saves and restores textual information, and not bit-mapped
               graphical information.

               If this function fails for any reason, a value of FALSE is
               returned, and the od_control.od_error variable is set to
               indicate the reason for the failure. For more information on the
               od_control.od_error variable, see page 185.


SEE ALSO       od_restore_screen(), od_gettext(), od_puttext(), od_clr_scr()


EXAMPLE        One case where you might wish to save and restore the contents
               of the screen is when sysop chat mode is activated. This can be
               accomplished by using the od_control.od_cbefore_chat and
               od_control.od_cafter_chat variables. The following example
               causes the screen contents to be saved and the entire screen
               cleared, prior to entering sysop chat mode when the sysop
               presses the "chat key". When the sysop ends chat mode, the

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 121

               user's original screen is restored, and the user will be able to
               continue working in the door as though nothing had happened.

               Code to perform screen saving and restoring:

                    /* Function prototypes */
                    void before_chat_function(void);
                    void after_chat_function(void);

                    /* Buffer to hold contents of screen prior to chat */
                    char before_chat_buffer[4004];
                    /* Variable to store whether screen save was successful */
                    char before_chat_saved = FALSE;

                    /* Function which is called prior to entering chat mode */
                    void before_chat_function(void)
                       {
                       /* Store current screen contents */
                       before_chat_saved = od_save_screen(before_chat_buffer);

                       /* Present a blank screen for chat mode */
                       od_clr_scr();
                       }

                    /* Function which is called after exiting chat mode */
                    void after_chat_function(void)
                       {
                       /* If screen was successfully saved prior to chat */
                       if(before_chat_saved)
                          {
                          /* Restore original screen contents */
                          od_restore_screen(before_chat_buffer);
                          }
                       }

               Code included in main() function to enable screen saving and
               restoring code:

                    od_control.od_cbefore_chat = before_chat_function;
                    od_control.od_cafter_chat = after_chat_function;












===============================================================================
OpenDoors 6.00 Manual                                          End of Page 122

OD_SCROLL()
-------------------------------------------------------------------------------

PURPOSE        Scrolls any rectangular area of the screen a specified number of
               lines upwards or downwards. Requires ANSI/AVATAR/RIP graphics
               mode to be active.


FORMAT         BOOL od_scroll(INT nLeft, INT nTop, INT nRight, INT nBottom,
                  INT nDistance, WORD nFlags);


RETURNS        TRUE on success
               FALSE on FAILURE


DESCRIPTION    This function scrolls a rectangular area of the screen described
               by the parameters nLeft, nTop, nRight and nBottom. The
               parameters nLeft and nRight are column numbers from 1 - 80, and
               the parameters nTop and nBottom are row numbers from 1 - 23.

               The parameter nDistance indicates the direction and number of
               lines to scroll the text in the specified area. Positive values
               denote moving the text upwards, and negative values denote
               moving the text downwards.

               The new lines created by scrolling text will appear in the
               current color. When this function returns, it leaves the cursor
               at its original position, and the display color at its original
               setting. This function requires ANSI or AVATAR modes. If ANSI
               mode is active, this function is equivalent to calling
               od_gettext(), od_puttext(), and then sending addition codes to
               the modem clear the newly created lines. In ANSI mode, scrolling
               can be accomplished more quickly if the area to be scrolled is
               equal in width to the entire screen. This is because the
               clearing of newly created lines is done by sending a simple
               control sequence, instead of a line of space characters. If
               AVATAR mode is active, scrolling of the window is accomplished
               by sending a single 6-byte control sequence.

               The last parameter to od_scroll(), nFlags, should normally be
               set to SCROLL_NORMAL. However, if you set nFlags to
               SCROLL_NO_CLEAR, the newly created lines at the top or bottom of
               the screen are not cleared if it would take longer to do so.


SEE ALSO       od_gettext(), od_puttext(), od_window_create(),
               od_window_remove()


EXAMPLE        For an example of a program which uses the od_scroll() function,
               see the ex_chat.c example program, described on page 38.
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 123

OD_SEND_FILE()
-------------------------------------------------------------------------------

PURPOSE        Sends an ASCII/ANSI/AVATAR/RIP file from disk, using terminal
               emulation.


FORMAT         BOOL od_send_file(char *pszFileName);


RETURNS        TRUE if the file was successfully sent
               FALSE if OpenDoors was unable to send the file


DESCRIPTION:   This powerful function will display any ASCII, ANSI, AVATAR or
               RIP file. The od_send_file() function can be used to display
               existing BBS text files, such as a "logoff screen", before your
               door hangs up on the user. You can also make use of the
               od_send_file() function to build many of your door screens as
               external files. This will allow you to easily create these
               screens in an ANSI editor program, such as "TheDraw". It will
               could also optionally allow sysops to customize your door for
               use on their own BBS.

               The od_send_file() function is called with the full path and
               filename of the file you wish to have displayed. Thus, if you
               wished to send the ANSI file MAINMENU.SCR, you would simply
               call:

                            od_send_file("MAINMENU.SCR");

               In many cases, instead of having just one file that you want
               displayed in particular, you will have several different files,
               and will want a different one displayed according to the user's
               graphics mode. For example, you might have the four files,
               MAINMENU.ASC, MAINMENU.ANS, MAINMENU.AVT and MAINMENU.RIP; the
               .ASC file containing no special control codes, the .ANS file
               containing ANSI control codes, the .AVT file containing AVATAR
               control codes, and the .RIP file containing RIP graphics control
               codes. In this case, you can have the od_send_file() function
               automatically select the appropriate file according to the
               user's current display mode, by omitting the extension
               altogether. Thus, a call to:

                            od_send_file("MAINMENU");

               would cause OpenDoors to automatically send the appropriate
               file, according to the user's graphics mode settings. When the
               od_send_file() function is used in this "automatic mode" (where
               you do not specify a filename extension), it will look for one
               of the four filename extensions listed below.

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 124

               +----------------------------------------------------------+
               | Extension| File type                                     |
               +----------+-----------------------------------------------|
               |   .ASC   | Does not require any graphics mode to display |
               |   .ANS   | Requires ANSI graphics mode to display        |
               |   .AVT   | Requires AVATAR graphics mode to display      |
               |   .RIP   | Requires RIP graphics mode to be displayed    |
               +----------------------------------------------------------+


               If the user has RIP graphics enabled, od_send_file() will first
               search for the .RIP file. If no file exists with the specified
               filename and a .RIP extension, od_send_file() will then search
               for .AVT, then .ANS, and if not found .ASC. If the user has only
               ANSI graphics enabled, od_send_file() will attempt first to
               display the .ANS file, and if not found will search for .ASC. In
               the case that the user is using plain-ASCII mode, this function
               will attempt only to display the .ASC file.

               When displaying a .RIP file to the remote system, OpenDoors will
               attempt to locate and display a corresponding .AVT/.ANS/.ASC
               file on the local system. If no such file can be found, a window
               will be displayed, indicating the name of the .RIP file that is
               being sent to the remote system. When a .RIP file is being
               displayed, page pausing is disabled.

               When displaying .AVT/.ANS/.ASC files, od_send_file() will send
               any ANSI or AVATAR codes in the file directly to the remote
               terminal, and interpret them to display on the local screen
               (regardless of the actual filename extension). This
               interpretation is accomplished by OpenDoor's built in terminal
               emulator. The terminal emulator fully supports all ANSI and
               AVATAR level 0 and level 0+ control codes. The terminal emulator
               will also translate Remote Access/QuickBBS style control codes,
               if enabled by setting od_control.od_no_ra_codes to FALSE. The
               control codes supported by OpenDoors are listed in the chart on
               the following pages. When these control codes are inserted into
               the file, OpenDoors will replace them with various pieces of
               user or system information.













===============================================================================
OpenDoors 6.00 Manual                                          End of Page 125

                 +-----------------------------------------------------+
                 | CONTROL | ASCII |                                   |
                 |  CODE   | VALUE | DESCRIPTION                       |
                 +---------+-------+-----------------------------------|
                 |   ^FA   | 06,65 | Displays the user's full name     |
                 |   ^FB   | 06,66 | Location the user is calling from |
                 |   ^FC   | 06,67 | Displays the user's password      |
                 |   ^FD   | 06,68 | Business/data phone number        |
                 |   ^FE   | 06,69 | Home/voice phone number           |
                 |   ^FF   | 06,70 | Date of the user's last call      |
                 |   ^FG   | 06,71 | Time of day of the last call      |
                 |   ^FH   | 06,72 | The user's `A' flags settings     |
                 |   ^FI   | 06,73 | The user's `B' flags settings     |
                 |   ^FJ   | 06,74 | The user's `C' flags settings     |
                 |   ^FK   | 06,75 | The user's `D' flags settings     |
                 |   ^FL   | 06,76 | User's remaining netmail credit   |
                 |   ^FM   | 06,77 | Number of messages posted by user |
                 |   ^FN   | 06,78 | Last read message number by user  |
                 |   ^FO   | 06,79 | Displays security level of user   |
                 |   ^FP   | 06,80 | Number of times user has called   |
                 |   ^FQ   | 06,81 | Total # of uploads by user        |
                 |   ^FR   | 06,82 | Total KBytes uploaded by user     |
                 |   ^FS   | 06,83 | Total # of downloads by user      |
                 |   ^FT   | 06,84 | Total Kbytes downloaded by user   |
                 |   ^FU   | 06,85 | # of minute user has used today   |
                 |   ^FV   | 06,86 | User's screen length setting      |
                 |   ^FW   | 06,87 | User's first name only            |
                 |   ^FX   | 06,88 | User's ANSI setting               |
                 |   ^FY   | 06,89 | User's "continue?" prompt setting |
                 |   ^FZ   | 06,90 | Does user have screen clearing on |
                 |   ^F0   | 06,48 | User's Full-screen editor setting |
                 |   ^F1   | 06,49 | User's Quiet mode setting         |
                 |   ^F2   | 06,50 | User's hot-keys setting           |
                 |   ^F3   | 06,51 | Displays the user's alias         |
                 |   ^F4   | 06,52 | The date of the User's first call |
                 |   ^F5   | 06,53 | The user's date of birth          |
                 |   ^F6   | 06,54 | User's subscription expiry date   |
                 |   ^F7   | 06,55 | Number of days until expiry       |
                 |   ^F8   | 06,56 | User's AVATAR setting             |
                 |   ^F9   | 06,57 | The user's upload:download ratio  |
                 |   ^F:   | 06,58 | User's Upload K:download K ratio  |
                 +-----------------------------------------------------+










===============================================================================
OpenDoors 6.00 Manual                                          End of Page 126

                 +-----------------------------------------------------+
                 | CONTROL | ASCII |                                   |
                 |  CODE   | VALUE | DESCRIPTION                       |
                 +---------+-------+-----------------------------------|
                 |   ^F;   | 06,59 | Full-screen message reader        |
                 |   ^KA   | 11,65 | Total # of calls BBS has received |
                 |   ^KB   | 11,66 | Name of the last caller to BBS    |
                 |   ^KC   | 11,67 | Total # of active messages on BBS |
                 |   ^KD   | 11,68 | Displays # of the first message   |
                 |   ^KE   | 11,69 | Displays # of the last message    |
                 |   ^KF   | 11,70 | # of times user has paged sysop   |
                 |   ^KG   | 11,71 | Full name of the current weekday  |
                 |   ^KH   | 11,72 | Displays total number of users    |
                 |   ^KI   | 11,73 | Displays the current time         |
                 |   ^KJ   | 11,74 | Displays the current date         |
                 |   ^KK   | 11,75 | Minutes the user has been online  |
                 |   ^KL   | 11,76 | Seconds the user has been online  |
                 |   ^KM   | 11,77 | Minutes the user has used today   |
                 |   ^KN   | 11,78 | Seconds the user has used today   |
                 |   ^KO   | 11,79 | Minutes remaining for user today  |
                 |   ^KP   | 11,80 | Seconds remaining for user today  |
                 |   ^KQ   | 11,81 | The user's daily time limit       |
                 |   ^KR   | 11,82 | Displays the current baud rate    |
                 |   ^KS   | 11,83 | The current weekday in short-form |
                 |   ^KT   | 11,84 | The user's daily download limit   |
                 |   ^KU   | 11,85 | # of minutes until the next event |
                 |   ^KV   | 11,86 | Time of the next system event     |
                 |   ^KW   | 11,87 | # of node user is currently on    |
                 |   ^KX   | 11,88 | Disconnects the user              |
                 +-----------------------------------------------------+


SEE ALSO       od_disp_emu(), od_list_files(), od_hotkey_menu()


EXAMPLE        For an example of the use of the od_send_file() function in
               displaying a custom door menu, see the EX_VOTE.C example
               program, which is described beginning on page 38.














===============================================================================
OpenDoors 6.00 Manual                                          End of Page 127

OD_SET_ATTRIB()
-------------------------------------------------------------------------------

PURPOSE        Function to change the text color in ANSI or AVATAR mode, using
               a single IBM-PC color attribute value.


FORMAT         void od_set_attrib(INT nColor);


RETURNS        N/A


DESCRIPTION    od_set_attrib() is one of two functions which change the color
               of the currently displayed text. This function allows you to set
               the text color using a single IBM-PC style color attribute. On
               the other hand, the od_set_color() function allows you to set
               the display color by specifying a foreground and background text
               color. Generally speaking, which of these two functions you use
               will be only a matter of personal preference. You will, however,
               most likely find it more convenient to use the od_set_color()
               function for changing display color. However the od_set_attrib()
               offers the advantage of allowing you to manipulate the color to
               be displayed as a single value, instead of two separate values.
               This could be convenient, for example, when displaying text in a
               user configured color. Using a single byte to represent the
               color will likely be easier than using two. An alternative
               method of setting the color of displayed text is to include the
               color codes within a string displayed by the od_printf()
               function. The benefits of doing this, along with instructions on
               how to do this, are described in the section on the od_printf()
               function, which begins on page 110.

               This function will only have an effect if the user has ANSI,
               AVATAR or RIP modes enabled. As a result, you can use this
               function within your door program, and have your text
               automatically displayed in multiple colors if graphics mode is
               available, and displayed without colors if graphics mode is not
               available.

               Note that the color to be set is passed to this function as an
               IBM-style screen attribute. Hence, you can set the color of text
               to be displayed by a single hexidecimal value, encoded as
               follows:

                              +------------- Background color
                              |
                            0x7f
                               |
                               +------------ Foreground color


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 128

               Where the left digit (most significant nibble) of the
               hexidecimal number represents the background color, and the
               right digit (least significant nibble) represents the foreground
               color. Each of the possible colors, along with their
               corresponding hexidecimal values, are listed in the charts,
               below.

               +-----------------------+  +--------------------------+
               |   Foreground colors   |  |   Background  | Flashing |
               +-----------------------|  +---------------+----------|
               |  0  | Black           |  |  0  | Black   |   Off    |
               |  1  | Blue            |  |  1  | Blue    |   Off    |
               |  2  | Green           |  |  2  | Green   |   Off    |
               |  3  | Cyan            |  |  3  | Cyan    |   Off    |
               |  4  | Red             |  |  4  | Red     |   Off    |
               |  5  | Magenta         |  |  5  | Magenta |   Off    |
               |  6  | Brown           |  |  6  | Brown   |   Off    |
               |  7  | White (grey)    |  |  7  | White   |   Off    |
               |  8  | Bright Black    |  |  8  | Black   |    On    |
               |  9  | Bright Blue     |  |  9  | Blue    |    On    |
               |  a  | Bright Green    |  |  a  | Green   |    On    |
               |  b  | Bright Cyan     |  |  b  | Cyan    |    On    |
               |  c  | Bright Red      |  |  c  | Red     |    On    |
               |  d  | Bright Magenta  |  |  d  | Magenta |    On    |
               |  e  | Yellow          |  |  e  | Brown   |    On    |
               |  f  | White (bright)  |  |  f  | White   |    On    |
               +-----------------------+  +--------------------------+


SEE ALSO       od_set_color(), od_disp_emu(), od_clr_scr(), od_clr_line(),
               od_set_cursor()


EXAMPLE        At times, you may wish to allow the user to select the color of
               text they wish to have displayed, perhaps to configure your door
               for the ideal colors to be displayed on their system. To
               demonstrate the use of the od_set_attrib() function, we show
               another function, which shows the user all 256 possible colors
               that can be displayed, and allows the user to choose which color
               they prefer. The function will then return the color attribute
               value of the user's chosen color.

               unsigned char choose_color(void)
               {
                  register unsigned char counter;   /* for displaying colors */
                  char string[4];                    /* string input by user */

                  od_set_attrib(0x07);                      /* display title */
                  od_disp_str("Available colors:\n\r\n\r");

                  for(counter=0;counter<=255;)    /* loop through all colors */
                  {
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 129

                     od_set_attrib(counter);        /* set appropriate color */
                     od_printf("%03.3u",counter);  /* display color's number */
                     if(((++counter)%16)==0)    /* after every 16 colors ... */
                     {
                        od_set_attrib(0x07);  /* ... reset display color ... */
                        od_disp_str("\n\r");     /* ... and start a new line */
                     }
                  }

                  od_set_attrib(0x07);         /* Allow user to choose color */
                  od_disp_str("Which color do you prefer : ");
                  od_input_str(string,3,'0','9');
                  return(atoi(string));               /* Return chosen color */
               }






































===============================================================================
OpenDoors 6.00 Manual                                          End of Page 130

OD_SET_COLOR()
-------------------------------------------------------------------------------

PURPOSE        Function to change the current display color in ANSI, AVATAR or
               RIP modes, using foreground and background color values.


FORMAT         void od_set_color(INT nForeground, INT nBackground);


RETURNS        N/A


DESCRIPTION    od_set_color() is one of two functions which change the color of
               the currently displayed text. This function allows you to set
               the text color using separate foreground an background text
               colors, whereas od_set_attrib() allows you to set the text color
               using a single IBM-PC style color attribute. Generally speaking,
               which of these two functions you use is only a matter of
               personal preference. An alternative method of setting the color
               of displayed text is to include the color codes within a string
               displayed by the od_printf() function. The benefits of doing
               this, along with instructions on how to do this, are described
               in the section on the od_printf() function, which begins on page
               110.

               This function will only have an effect if the user has ANSI,
               AVATAR or RIP mode turned on. As a result, you can use this
               function within your door program, and have your text
               automatically displayed in multiple colors if graphics mode is
               available, and displayed without colors if graphics mode is not
               available.

               The od_set_color() function accepts two parameters, the first
               parameter being the foreground color to be used in displaying
               text, and the second parameter being the background color to be
               used in displaying text. For example,

                               od_set_color(L_WHITE,D_BLACK);

               would set the current color to Light White on Dark Black. The
               foreground and background text colors can be any one of the
               color values listed on the following page.









===============================================================================
OpenDoors 6.00 Manual                                          End of Page 131



               +-------------------+-----------+
               | Foreground Color  | Value     |
               +-------------------+-----------+
               | Dark Black        | D_BLACK   |
               | Dark Blue         | D_BLUE    |
               | Dark Green        | D_GREEN   |
               | Dark Cyan         | D_CYAN    |
               | Dark Red          | D_RED     |
               | Dark Magenta      | D_MAGENTA |
               | Dark Brown        | D_BROWN   |
               | Grey (Dark White) | D_GREY    |
               | Light Black (Grey)| L_BLACK   |
               | Light Blue        | L_BLUE    |
               | Light Green       | L_GREEN   |
               | Light Cyan        | L_CYAN    |
               | Light Red         | L_RED     |
               | Light Magenta     | L_MAGENTA |
               | Yellow            | L_YELLOW  |
               | White             | L_WHITE   |
               +-------------------+-----------+


               +-------------------+-----------+
               | Background Color  | Value     |
               +-------------------+-----------+
               | Black             | D_BLACK   |
               | Blue              | D_BLUE    |
               | Green             | D_GREEN   |
               | Cyan              | D_CYAN    |
               | Red               | D_RED     |
               | Magenta           | D_MAGENTA |
               | Brown             | D_BROWN   |
               | Grey              | D_GREY    |
               | Blinking Black    | B_BLACK   |
               | Blinking Blue     | B_BLUE    |
               | Blinking Green    | B_GREEN   |
               | Blinking Cyan     | B_CYAN    |
               | Blinking Red      | B_RED     |
               | Blinking Magenta  | B_MAGENTA |
               | Blinking Brown    | B_BROWN   |
               | Blinking Grey     | B_WHITE   |
               +-------------------+-----------+


SEE ALSO       od_set_attrib(), od_disp_emu(), od_clr_scr(), od_clr_line(),
               od_set_cursor()

EXAMPLE        As an example of using the od_set_color() function to set the
               color of displayed text, we show a pair of two functions. These
               functions will allow a program to set the foreground OR
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 132

               background color of text, without setting the other. In
               contrast, the od_set_color() function sets both the foreground
               and background color at the same time. These function presume
               that they are the only functions used within the door to set the
               color of displayed text, and that the original text color prior
               to calling either of these functions is dark white on black.
               These function must also have access to the two global variables
               "current_foreground" and "current_background", as defined below.


               void set_foreground(char foreground);
               void set_background(char background);
               unsigned char current_foreground=D_BLACK;
               unsigned char current_background=D_GREY;

               void set_foreground(char foreground)
               {                                       /* set new text color */
                  od_set_color(foreground, current_background);
                  current_foreground=foreground;      /* save new foreground */
               }

               void set_background(char background)
               {                                       /* set new text color */
                  od_set_color(current_foreground, background);
                  current_background=background;      /* save new background */
               }


               Using these functions, you would then be able to set just the
               foreground text color by a function call like:

                         set_foreground(L_YELLOW);

               Or set just the background text color by a function call like:

                         set_background(D_GREY);
















===============================================================================
OpenDoors 6.00 Manual                                          End of Page 133

OD_SET_CURSOR()
-------------------------------------------------------------------------------

PURPOSE        Function to reposition the text cursor in ANSI, AVATAR or RIP
               mode


FORMAT         void od_set_cursor(INT nRow, INT nColumn);


RETURNS        N/A


DESCRIPTION    This function repositions the cursor to the specified row and
               column on the screen. nRow can have a value of 1 to 23, and
               nColumn can have a value of 1 to 80. ANSI, AVATAR or RIP mode
               must be active.


SEE ALSO       od_disp_emu(), od_clr_scr(), od_clr_line(), od_set_color(),
               od_set_attrib()


EXAMPLE        Below is a simple example that demonstrates the use of the
               od_set_cursor() function. Note that this example detects whether
               or not graphics mode is available, and if it is not, will carry
               out the same task without the use of od_set_cursor().

                            od_init();         /* Initialize door operations */
                            od_clr_scr();                /* Clear the screen */
                            if(od_control.user_ansi || od_control.user_avatar)
                            {               /* If graphics mode is available */
                               od_set_cursor(1,1);           /* Display demo */
                               od_disp_str("Top, Left Corner");

                               od_set_cursor(1,70);
                               od_disp_str("Top, Right Corner");

                               od_set_cursor(15,1);
                               od_disp_str("Fifteenth line\n\r");
                            }
                            else        /* If graphics mode is not available */
                            {                                /* Display demo */
                               od_disp_str("Top, Left Corner");
                               od_repeat(' ', 54);
                               od_disp_str("Top, Right Corner\n\r");
                               od_disp_str("\n\n\n\n\n\n\n\n\n\n\n\n\n");
                               od_disp_str("Fifteenth line\n\r");
                            }
                            od_get_key(TRUE);  /* Wait for user to press key */


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 134

OD_SET_DTR()
-------------------------------------------------------------------------------

PURPOSE        Controls the DTR (Data Terminal Ready) signal to the modem. Used
               primarily to cause the modem to "hang up".


FORMAT         void od_set_dtr(BOOL bHigh);


RETURNS        N/A


DESCRIPTION    In certain circumstances (such as call back verification doors),
               you may wish to "hang up" the modem without exiting your door
               program. This can be accomplished with most modems by
               controlling the DTR (Data Terminal Ready) signal to the modem.
               Passing a FALSE value to od_set_dtr() causes the DTR signal to
               be set low, and passing a TRUE value causes the DTR signal to be
               set high. Normally, OpenDoors maintains the DTR signal in its
               high state. Since most (but not all) modems are configured to
               disconnect from the remote modem when the DTR signal is set low,
               calling od_set_dtr(FALSE) can be used to hangup the modem. When
               hanging up by this method, you should be sure to set the DTR
               signal high again, after the carrier detect signal has
               disappeared. For more information on determining the state of
               the carrier detect signal, see the od_carrier() function, which
               is described on page 51. Note that not all modems will
               disconnect from the remote user in response to your lowering the
               DTR signal. If your software may be used with such modems, you
               may wish to also provide the option of disconnecting the modem
               by sending a "hang up" command sequence to the modem.

               Since OpenDoors normally monitors the carrier detect signal, and
               exits when this signal disappears, you will have to disable
               OpenDoor's carrier detection if you wish your program to
               continue executing after hanging up the modem. OpenDoor's
               automatic carrier detection can be disabled using the
               od_control.od_disable OpenDoors control structure variable, as
               follows:

                    od_control.od_disable |= DIS_CARRIERDETECT;

SEE ALSO       od_carrier(), od_exit()


EXAMPLE        For an example of using the od_set_dtr() function to "hang up"
               the modem, see the example that accompanies the od_carrier()
               function, which is described on page 52.



===============================================================================
OpenDoors 6.00 Manual                                          End of Page 135

OD_SET_PERSONALITY()
-------------------------------------------------------------------------------

PURPOSE        Sets the current status line / sysop function key personality to
               be used.


FORMAT         BOOL od_set_personality(char *pszName);


RETURNS        TRUE on success
               FALSE on failure


DESCRIPTION    This function changes the current status line / sysop function
               key personality. The pszName parameter should contain the string
               which uniquely identifies the personality to be set. This
               function may only be used by OpenDoors programs which include
               the OpenDoors "Multiple Personality System". To enable use of
               the MPS, include the following line before your first call to
               any OpenDoors function:

                         od_control.od_mps=INCLUDE_MPS;

               OpenDoors includes a number of built-in personalities.
               Additional personalities may be added using the
               od_add_personality() function, which is described on page 47.
               The following personalities are included with this version of
               OpenDoors:

                    Name                Description
                    -----------------------------------------------------------
                    Standard            OpenDoors style, similar to RA 1.11
                    PCBoard             Similar to PC-Board
                    RemoteAccess        Similar to RemoteAccess 2.x
                    Wildcat             Similar to Wildcat!

               Personality names are not case sensitive. For more information
               on the OpenDoors Multiple Personality System, see the section
               which begins on page 233.

               This function returns TRUE on success, or FALSE on failure. In
               the case of a failure, the od_control.od_error variable is set
               to indicate the nature of the failure. For more information on
               the od_control.od_error variables, see page 185.


SEE ALSO       od_add_personality(), od_set_statusline()




===============================================================================
OpenDoors 6.00 Manual                                          End of Page 136

OD_SET_STATUSLINE()
-------------------------------------------------------------------------------

PURPOSE        To set the currently displayed status line.


FORMAT         void od_set_statusline(INT nSetting);


RETURNS        N/A


DESCRIPTION    If you have the OpenDoors status line enabled within your door
               program (as is the default), the sysop will be able to control
               the setting of the status line using the F1 - F10 keys on the
               keyboard. These function keys are as follows:

                         [F1] -  Display basic door and user information
                         [F2] -  Display phone numbers and important dates
                         [F3] -  Display security flags and up/download info
                         [F4] -  Display system information and current time
                         [F5] -  Display message info and user's settings
                         [F6] -  Display chat reason and sysop's comment
                         [F9] -  Display help information for sysop
                         [F10] - Turn off the status line

               Using the od_set_statusline() function, you can manually set
               which of these status line settings is currently selected. The
               od_set_statusline() accepts a single parameter, which should be
               one of the values listed below, which indicates which status
               line you would like to have selected:

               +---------------+---------------+------------------------------+
               |               | Corresponding |                              |
               | Value         | Function Key  | Meaning                      |
               +---------------+---------------+------------------------------+
               | STATUS_NORMAL | [F1]          | Basic door and user info     |
               | STATUS_NONE   | [F10]         | Turn off status line         |
               | STATUS_HELP   | [F9]          | Displays help for the sysop  |
               | STATUS_USER1  | [F2]          | Phone Numbers and dates      |
               | STATUS_USER2  | [F3]          | Security flags & up/downloads|
               | STATUS_USER3  | [F5]          | Message info & user settings |
               | STATUS_USER4  | [F6]          | Chat reason and sysop comment|
               | STATUS_SYSTEM | [F4]          | System info & current time   |
               +---------------+---------------+------------------------------+
               (Note that these keys may be customized using variables in the
                OpenDoors control structure.)

               Keep in mind that the od_set_statusline() function only
               temporarily changes the current status line setting, and that
               the sysop will still be able to change the status line to any of
               the other settings using the function keys. For instance, if you
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 137

               wished to allow the sysop to normally see all 25 lines of text
               displayed by your door, but at the same time to still allow the
               sysop to turn on the status line at any time, you could place
               the line

                         od_set_statusline(STATUS_NONE);

               at the beginning of your program. Similarly, when the user pages
               the sysop, OpenDoors itself calls

                         od_set_statusline(STATUS_USER4);

               in order to display the status line which shows the user's
               reason for chat, while still allowing the sysop to switch back
               to any of the other status lines.

               If you wish to permanently turn off the OpenDoor's status line,
               without allowing the sysop to be able to turn it back on using
               the sysop function keys, simply set the
               "od_control.od_status_on" variable to FALSE. This variable is
               described in the OpenDoors control structure section of this
               manual, which begins on page 148.






























===============================================================================
OpenDoors 6.00 Manual                                          End of Page 138

OD_SLEEP()
-------------------------------------------------------------------------------

PURPOSE        Suspends program execution, yielding control to other tasks in a
               multitasking environment.


FORMAT         void od_sleep(tODMilliSec Milliseconds);


RETURNS        N/A


DESCRIPTION    od_sleep() suspends execution of your program for the specified
               number of milliseconds. Note that under the DOS version of
               OpenDoors, this value is rounded to the nearest 55 milliseconds.
               While the program's execution is suspended, od_sleep() yields
               control of the processor to other tasks in a multitasking
               environment.

               Calling od_sleep() with a sleep time of 0 causes control to be
               yielded to other waiting processes without imposing a minimum
               sleep time. If no other processes are waiting to execute, the
               function returns immediately. OpenDoors automatically calls
               od_sleep(0) itself in most of the situations where there is a
               need to do so. However, there may be circumstances under which
               od_sleep(0) can be used to improve performance. In particular,
               od_sleep(0) can be used to improve the performance of other
               applications that are also running at the same time as yours. By
               calling od_sleep(0), you are essentially telling the operating
               system that your program doesn't currently need all of the
               processing time that has been allocated to it. While appropriate
               use of od_sleep(0) can improve overall system performance,
               overusing od_sleep(0) can dramatically degrade the performance
               of your own program. The only way to determine the optimal use
               of od_sleep(0)  is by trial and error.

               The most common situation where you might want to use
               od_sleep(0) is when your program cannot do anything useful until
               you receive input from the user, but for some reason you cannot
               call od_get_key(TRUE). Rather than sitting in a tight loop,
               repeatedly checking where the user has pressed a key yet, it is
               better to call od_sleep(0) to let other tasks run for a while
               before checking again. OpenDoors calls od_sleep(0) itself under
               any of the following circumstances:

                    - When transmitting characters, if the outbound serial
                      buffer is full, OpenDoors yields while waiting for some
                      of the characters in the buffer to be sent.
                    - During od_get_key(), if called with the wait parameter
                      set to TRUE.

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 139

                    - While waiting for input, during the execution of any of
                      the following input functions: od_get_answer(),
                      od_hotkey_menu() (after menu has been displayed),
                      od_popup_menu(), od_edit_str(), od_input_str().
                    - While pausing at the end of a screen during
                      od_send_file(), od_list_files(), od_hotkey_menu().
                    - During chat mode.


SEE ALSO       od_kernel()










































===============================================================================
OpenDoors 6.00 Manual                                          End of Page 140

OD_SPAWN()
-------------------------------------------------------------------------------

PURPOSE        To facilitate easy execution of child tasks from doors.


FORMAT         BOOL od_spawn(char *pszCommandLine);


RETURNS        TRUE on success,
               FALSE on failure


DESCRIPTION    This function allows you to easily run other programs from
               within your door programs, such as external file transfer
               utilities, compression utilities, and so on.

               This function will attempt to swap OpenDoors and your entire
               door to expanded memory or disk. OpenDoors swapping can be
               controlled by the OpenDoors control structure variables,
               od_swapping_disable, od_swapping_ems and od_swap_path. The
               od_spawn...() functions first attempt to swap OpenDoors to EMS
               memory. If enough EMS 3.2 or later memory is available, it will
               be used. If not, OpenDoors will swap to a disk file in the
               directory specified by the od_control.od_swap_path variable.

               Unlike the other Turbo C(++) / Borland C++ library functions
               such as system() or spawnf(), this function will automatically
               store the door screen prior to executing the sub-program, and
               will restore the screen upon return. This function will also
               store the current drive and directory settings prior to
               executing the program, and restore them after the program has
               returned.

               Normally, the user's time will continue to be decreased during
               the execution of the od_spawn() function. However, you can
               freeze the user's time during the spawn process by using the
               OpenDoors control structure variable od_spawn_freeze_time.


SEE ALSO       od_spawnvpe()


EXAMPLE        Below are a few examples of various uses of the od_spawn()
               function:

               To run the command processor from within your door program, to
               allow the sysop access to the DOS shell, simply use the
               following line of code:

                              od_spawn(getenv("COMSPEC"));

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 141

               The following function is an example of using the od_spawn()
               function to call DSZ, allowing the user to download a file. You
               pass the name of the file that you wish to send to the user.
               This function will then ask the user what transfer protocol they
               would like to use, generate the appropriate DSZ command line,
               and then transmit the file to the user. Note that in order to
               use a door which implements this function, the external file
               transfer program "DSZ" must be available in the current search
               path. As an alternative, you may want to allow the sysop to
               specify the location of the DSZ file from within a configuration
               program. If you wish to receive a file (allow the user to
               upload), instead of sending one, simply change the "s" in the
               command line to a "r".

               char download(char *filename)
               {
                  char commandline[80];/* string containing DSZ command line */
                  char protocol;   /* character representing chosen protocol */

                                                    /* display protocol menu */
                  od_printf("Select File Transfer Protocol:\n\r");
                  od_printf("   [X] XModem\n\r");
                  od_printf("   [Y] YModem\n\r");
                  od_printf("   [Z] ZModem\n\r");
                  od_printf("or press [A] to abort transfer\n\r");

                  do            /* loop until valid protocol has been chosen */
                  {
                     protocol=od_get_key();                       /* get key */
                                              /* abort if [A] key is pressed */
                     if(protocol=='a' || protocol=='A') return(FALSE);
                  } while(protocol!='x' && protocol!='y' && protocol!='z' &&
                          protocol!='X' && protocol!='Y' && protocol!='Z');

                  od_printf("Begin receiving file now or press [CTRL]-[X] to
                             abort\n\r");
                                                /* generate DSZ command line */
                  sprintf(commandline,"dsz port %d s%c %s",
                          od_control.port+1,
                          protocol,
                          filename);

                  return(od_spawn(commandline));             /* spawn to DSZ */
               }








===============================================================================
OpenDoors 6.00 Manual                                          End of Page 142


OD_SPAWNVPE()
-------------------------------------------------------------------------------

PURPOSE        To facilitate easy execution of child tasks from doors. Allows
               specification of child's environment, returns errorlevel
               returned by child task, and searches path for the executable
               file.


FORMAT         INT16 od_spawnvpe(INT16 nModeFlag, char *pszPath,
                  char *papszArg[], char *papszEnv[]);


RETURNS        -1 on failure
               errorlevel returned by child process on success


DESCRIPTION    This function behaves very similarly to the od_spawn() function.
               Thus, to save space in the manual, I will not recapitulate what
               is already said in the description of the od_spawn() function.
               Instead, this description concentrates on the additional
               features available through the od_spawnvpe() function. If you
               are not already familiar with the od_spawn() function, take a
               moment now to review the description of that function.

               The od_spawn() function (the OpenDoors "quick-spawn" function)
               is designed to be quick and easy to use, but does not have all
               of the features available in the od_spawnvpe() function. In
               addition to the features of the od_spawn() function, the
               od_spawnvpe() function also provides the following features:

                         - od_spawnvpe() will search the "path" for the file
                           to be executed.

                         - od_spawnvpe() allows you to pass an altered
                           environment to the child process.

                         - od_spawnvpe() returns the errorlevel returned by
                           the child process.

               The parameters passed to the od_spawnvpe() function are
               identical to those passed to the C spawnvpe() function. The
               first parameter should usually the be P_WAIT flag. The second
               parameter is the name of the child program to execute. If a full
               path to the child program is not specified, and the child
               program does not exist in the current directory, OpenDoors will
               search the directories listed by the PATH environment variable.
               Also, if the .EXE or .COM extension is not provide, OpenDoors
               will look first for a .COM file, and if not found, for a .EXE
               file. The third parameter is an array of arguments to pass to
               the child process, or NULL if no arguments are to be passed. The
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 143

               fourth parameter is the environment to be passed to the child
               process, or NULL if the a copy of the current environment should
               be used.


SEE ALSO       od_spawn()


EXAMPLE        For an example of the use of the od_spawn...() functions, see
               the example accompanying the od_spawn() function. As a specific
               example of the od_spawnvpe function, consider the following code
               which executes the "TEST.EXE" program.

                         od_spawnvpe(P_WAIT,"TEST.EXE",NULL,NULL);






































===============================================================================
OpenDoors 6.00 Manual                                          End of Page 144

OD_WINDOW_CREATE()
-------------------------------------------------------------------------------

PURPOSE        Creates a popup window of the specified size and color, storing
               the contents of the screen "under" the window. The window can
               later be removed from the screen, restoring the original
               contents of the screen "under" the window, using the
               od_window_remove() function. Requires ANSI, AVATAR or RIP mode.


FORMAT         void *od_window_create(INT nLeft, INT nTop, INT nRight, INT
               nBottom,
                    char *pszTitle, BYTE btBorderCol, BYTE btTitleCol,
                    BYTE btInsideCol, INT nReserved);


RETURNS        Pointer to newly allocated window structure on success
               NULL on failure


DESCRIPTION    This function creates a pop-up window on the remote and local
               screens. The contents of the screen beneath the window are
               stored, to allow the window to later be removed from the screen
               using the od_window_remove() function. The window is drawn using
               the boarder characters defined in the already existing
               od_control.od_box_chars[] array. The boarder is displayed using
               the color attribute specified in btBorderCol. The working area
               of the window is created in the color specified in btInsideCol.
               A title may optionally be displayed on the window by specifying
               a string in pszTitle. This title will be displayed in the color
               specified by btTitleCol. If you do not wish a title to be
               displayed, pass an empty string or NULL pointer in pszTitle. On
               success, od_window_create() will return a pointer to a buffer
               which was allocated to store information on the window and the
               contents of the screen "under" the window. This pointer should
               at some point be passed in a call to od_window_remove().

               This function requires ANSI, AVATAR or RIP graphics mode. If
               AVATAR mode is active, this function will take advantage of
               special AVATAR control sequences to display the window much
               faster than is possible in ANSI mode. In ANSI mode, window
               display will be slightly faster if btBorderCol and btTitleCol
               are equal. Note that the nReserved parameter of this function is
               not currently used. To preserve compatibility with future
               versions of OpenDoors, this parameter should always be set to 0.
               Currently, the size of the buffer allocated to store the window
               information will be (length*width*2) + 4 bytes in size.

               If od_window_create() fails for any reason, a value of NULL is
               returned, and the od_control.od_error variable is set to
               indicate the reason for the failure. For more information on the
               od_control.od_error variable, see page 185.
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 145



SEE ALSO       od_window_remove(), od_draw_box(), od_gettext(), od_puttext(),
               od_save_screen(), od_restore_screen(), od_scroll()


EXAMPLE        For an example of the use of the od_window_create() function,
               see the included ex_chat.c example program.












































===============================================================================
OpenDoors 6.00 Manual                                          End of Page 146

OD_WINDOW_REMOVE()
-------------------------------------------------------------------------------

PURPOSE        Removes a window previously created using od_window_create(),
               restoring the original screen background.


FORMAT         BOOL od_window_remove(void *pWinInfo);


RETURNS        TRUE on success
               FALSE on failure


DESCRIPTION    The od_window_remove() function removes a window from the screen
               which was previously created by od_window_create(), and
               deallocates the memory which was allocated to store the window
               information. The contents of the screen beneath the window is
               restored to appear as it did prior to the call to
               od_window_create(). pWinInfo must point to the value returned by
               od_window_create().

               Note that overlapping windows must be removed in the reverse
               order from which they were created for proper display results.
               The last window to be created must be the first window to be
               removed.

               If od_window_remove() fails for any reason, a value of FALSE is
               returned, and the od_control.od_error variable is set to
               indicate the reason for the failure. For more information on the
               od_control.od_error variable, see page 185.


SEE ALSO       od_window_create(), od_draw_box(), od_gettext(), od_puttext(),
               od_save_screen(), od_restore_screen(), od_scroll()


EXAMPLE        For an example of the use of the od_window_remove() function,
               see the included ex_chat.c example program.













===============================================================================
OpenDoors 6.00 Manual                                          End of Page 147

 555555
 55
 55
 55555
     55
     55
 55555
-------------------------------------------------------------------------------
CHAPTER 5 - THE OPENDOORS CONTROL STRUCTURE




INTRODUCTION TO THE CONTROL STRUCTURE
-------------------------------------------------------------------------------

               The OpenDoors "Control Structure" is used by OpenDoors in order
               to provide you with a wide range of information about the system
               on which you door is running, and the user who is currently
               using the door, along with providing you a means by which to
               customize much of OpenDoor's behavior. Using the OpenDoors
               control structure, you can access or alter information about the
               user who is online, information about the system on which your
               door is running, and information about OpenDoors itself. You can
               also use the control structure to customize all of the text
               displayed by OpenDoors, the function keys to which it responds,
               and many other aspects of OpenDoor's behavior.

               The OpenDoors control structure is quite simply a normal C
               "struct", named od_control, and is defined in the OPENDOOR.H
               file. This "struct" contains many different variables, which
               provide you access to the information provided by the control
               structure. Hence, to access the contents of a control structure
               variable, for example the variable "system_name" which contains
               the name of the BBS the door is running under, you would use:

                                  od_control.system_name

               The following section of this chapter contains a complete
               reference to all of the variables which make up the OpenDoors
               control structure. This reference includes the name, type and
               complete description of the use of each variable. The reference
               is divided into the following categories of variables, with the
               reference to the variables in each section beginning on the
               listed page.

                         Door Information File Statistics..................150
                         Modem Settings....................................153
                         BBS and Caller Information........................158
                         Door Settings.....................................182
                         OpenDoors Behavior Customization..................187
                         Function Keys Customization.......................212
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 148

                         Color Customization...............................237
                         Text Customization................................217

               Within each section, variables are listed alphabetically by
               name.

               Also, in order to make use of some of the variables in the
               OpenDoors control structure, it is important to understand the
               concepts of Boolean (TRUE/FALSE), and bit-mapped flag variables.
               If you are not familiar with these two terms, they are described
               in detail in the glossary, located towards the end of this
               manual.








































===============================================================================
OpenDoors 6.00 Manual                                          End of Page 149

CONTROL STRUCTURE - DOOR INFO FILE STATS
-------------------------------------------------------------------------------

               The following OpenDoors control structure variables provide your
               program with information concerning the door information file
               from which OpenDoors obtained the BBS and caller information
               that is found elsewhere in the control structure. The following
               control structure items are listed in this section:

               info_path                Sets the location and, optionally, the
                                        name of the door information file

               od_info_type             Type of door information file that was
                                        found

               od_node                  Node number the door is running under

               user_timeofcreation      The time at which the door information
                                        file was created




-------------------------------------------------------------------------------
info_path      char od_control.info_path[60];

               If used, this variable should be set prior to calling od_init()
               or any other OpenDoors function. This variable allows you to
               control where OpenDoors will look for the door information (drop
               file). By default, OpenDoors searches for the door information
               file in the current directory. If this variable is set to the
               name of some other directory, OpenDoors will first search for
               any door information files in that directory. If you only wish
               OpenDoors to look for a particular type of door information file
               (for instance, you want OpenDoors to only read a DORINFO1.DEF,
               and ignore any DOOR.SYS file), you can specify the full path and
               filename of the file you wish OpenDoors to use.

               It is usually a good idea to design your door to allow the
               system operator to set the location of the door information
               file. This will allow the sysop to place your door in its own
               directory, and will facilitate the use of your door on multi-
               line BBS systems. If you are using the OpenDoors configuration
               file system, then the system operator can set the door
               information file location and/or name using the BBSDir keyword.
               However, you may also wish to allow the location of the door
               information file to be set on the command line. The following
               example illustrates a method of reading and setting the location
               of the door information file from the door's command line:

               #include "opendoor.h"

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 150

               main(int argc, char *argv[])
                  {
                  if(argc>1) strncpy(od_control.info_path,argv[1],59);

                  od_disp_str("This is a sample OpenDoors door.\n\r");
                  od_disp_str("Press any key to continue...\n\r");
                  od_get_key(TRUE);
                  od_exit(20);
                  }



-------------------------------------------------------------------------------
od_info_type   char od_control.od_info_type;

               This variable indicates the type of information file from which
               OpenDoors has obtained the BBS and caller information that is
               found elsewhere in the OpenDoors control structure. This
               variable will have one of the following values, indicating that
               the door information file was of the corresponding type:

                     +----------------+----------------------------+
                     |  od_info_type  | Door Information File Type |
                     |      Value     |                            |
                     +----------------+----------------------------+
                     | DORINFO1       | DORINFO?.DEF               |
                     | EXITINFO       | EXITINFO.BBS (Normal)      |
                     | RA1EXITINFO    | EXITINFO.BBS (Extended)    |
                     | RA2EXITINFO    | EXITINFO.BBS (RA 2.x)      |
                     | QBBS275EXITINFO| EXITINFO.BBS (QuickBBS)    |
                     | CHAINTXT       | CHAIN.TXT                  |
                     | SFDOORSDAT     | SFDOORS.DAT                |
                     | CALLINFO       | CALLINFO.BBS               |
                     | DOORSYS_GAP    | DOOR.SYS (GAP/PC-Board)    |
                     | DOORSYS_DRWY   | DOOR.SYS (Doorway style)   |
                     | DOORSYS_WILDCAT| DOOR.SYS (WildCat standard)|
                     | CUSTOM         | Custom door information    |
                     |                | file, defined in config    |
                     |                | file.                      |
                     | NO_DOOR_FILE   | No drop file was found.    |
                     +----------------+----------------------------+

               The value of this variable is only valid AFTER od_init() or some
               OpenDoors function has been called.

               Note that this variable should be treated as a read-only
               variable, and should not normally be altered by your program.
               Altering this variable may cause OpenDoors to re-write a
               different type of door information file upon exiting, than was
               read upon startup.


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 151


-------------------------------------------------------------------------------
od_node        char od_control.od_node;

               This variable indicates the node number that the door is running
               under. If this information is supplied by the BBS in the door
               information file, the node number will be automatically by
               OpenDoors. Specifically, the node number can be determined
               automatically from systems that produce an SFDOORS.DAT, PC-
               Board/GAP style DOOR.SYS or Wildcat style DOOR.SYS door
               information file. If this information is not supplied in the
               door information file, but is provided by the sysop in the
               door's configuration file, OpenDoors will use the value found
               there. Alternatively, you can set this variable manually.

               On systems that produce a DORINFO?.DEF file, OpenDoors will use
               this variable to determine which DORINFO?.DEF file to search
               for. For instance, if od_control.od_node is set to 3, OpenDoors
               will first search for a DORINFO3.DEF file. If this file is not
               found, OpenDoors will then default to the DORINFO1.DEF filename.




-------------------------------------------------------------------------------
user           char od_control.user_timeofcreation[6];
_timeof
creation       This variable contains the time of day at which the door
               information file was created. This variable is available only
               when the door is running under a system that produces an
               EXITINFO.BBS file. To determine what type of door information
               file your door is running under, see the od_control.od_info_type
               variable, below.



















===============================================================================
OpenDoors 6.00 Manual                                          End of Page 152

CONTROL STRUCTURE - SERIAL PORT SETTINGS
-------------------------------------------------------------------------------

               The following OpenDoors control structure items store the
               communications settings that OpenDoors uses to communicate with
               the modem. These values are normally set upon the first call to
               an OpenDoors function, during the od_init() procedure. However,
               you may need to manual set this variables if:

                    - you wish to allow greater configurability of your door
                    - you are reading the door information file yourself
                    - you are using the OpenDoors to write a non-door
                     program

               Some of these variables are always used by OpenDoors, while
               others are only relevant if OpenDoor's built-in serial
               communications code is being used instead of a FOSSIL driver.
               Those that are only used when no FOSSIL driver is present are
               denoted by an [*] in the list below.

               The control structure variables controlling OpenDoor's serial
               port settings are as follows:

               od_control.baud            Serial Port BPS rate

               od_control.od_connect_sppedThe modem connection BPS rate

               od_control.od_com_address  Serial Port address [*]

                " " .od_com_fifo_trigger  16550A FIFO trigger size

                " " .od_com_flow_control  Type of flow control to use.

               od_control.od_com_irq      Serial Port IRQ number [*}

               od_control.od_com_method   Is FOSSIL or built-in serial I/O
                                          being used

               od_control.od_com_no_fifo  Disables use of 16550A FIFOs [*]

               od_control.od_com_rx_buf   Size of receive buffer [*]

               od_control.od_com_tx_buf   Size of transmit buffer [*]

               od_control.od_no_fossil    Prevents OpenDoors from using a
                                          FOSSIL driver, even if one is
                                          available.

               od_control.od_open_handle  Allows a live serial port handle to
                                          be passed to OpenDoors.

               od_control.port            Serial port number, 0 based.
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 153




-------------------------------------------------------------------------------
baud           unsigned long od_control.baud;

               This variable contains the BPS rate at which the computer is
               communicating with the modem, not to be confused with the BPS
               rate at which the local modem is communicating with the remote
               modem.

               A value of 0 indicates that the program is operating in local
               mode.

               If a FOSSIL driver is being used for serial I/O, this value is
               ignored if it does not correspond to one of the baud rates that
               an application can directly set a FOSSIL driver to. The BPS
               rates recognized by FOSSIL drivers are: 300, 600, 1200, 2400,
               4800, 9600, 19200, 38400. If any other BPS rate is to be used,
               the FOSSIL driver must be locked at that BPS from the FOSSIL
               driver command-line. When locked, FOSSIL drivers ignore any
               attempt by an application to change the BPS rate of the locked
               port. For this reason, the od_control.baud setting has no effect
               on the FOSSIL driver if it is locked.



-------------------------------------------------------------------------------
od_com_        int od_control.od_com_address;
address
               This variable is only used when OpenDoors is NOT performing
               serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
               used, the serial port address can be set from the FOSSIL driver
               command line).

               This variable may optionally be set to specify the base address
               of the serial port to be used. For ports COM1: through COM4:,
               OpenDoors can normally determine the serial port address
               automatically. However, for other serial ports, the port address
               must be specified using this variable. If you are not specifying
               a serial port address with this variable, do not change it's
               default value of 0.



-------------------------------------------------------------------------------
od_com_        char od_control.od_com_fifo_trigger;
fifo_trigger
               This variable is only used when OpenDoors is NOT performing
               serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
               used, the IRQ line can be set from the FOSSIL driver command
               line).
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 154


               This variable sets the number of bytes that will be placed in
               the 16550A UART FIFO buffers before an interrupt is triggered,
               if the 16550A UART FIFOs are used. Valid values are 1, 4, 8 and
               14.



-------------------------------------------------------------------------------
od_com_        unsigned char od_control.od_com_flow_control;
flow_control
               This variable sets the type of serial I/O flow control to use.
               By default, this variable is set to COM_DEFAULT_FLOW, which
               specifies the default mode of flow control. Most often, this
               will be RTS/CTS flow control. A value of COM_RTSCTS_FLOW
               explicitly enables RTS/CTS flow control. A value of COM_NO_FLOW
               disables all flow control. If you are going to change the value
               of this variable, it should be set prior to your first call to
               any OpenDoors function.



-------------------------------------------------------------------------------
od_com_        unsigned char od_control.od_com_irq;
irq
               This variable is only used when OpenDoors is NOT performing
               serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
               used, the IRQ line can be set from the FOSSIL driver command
               line).

               This variable may optionally be set to specify the IRQ line to
               be used for the serial port. By default, OpenDoors uses the
               normal IRQ 4 line for ports COM1: and COM3:, and IRQ 3 for ports
               COM2: and COM4:. To override this default, the IRQ line can be
               set using this variable. If you are not specifying an IRQ line
               with this variable, do not change it's default value of 0.



-------------------------------------------------------------------------------
od_com_        char od_control.od_com_method;
method
               This read-only variable reports the method that OpenDoors is
               using for serial I/O. This variable is set during od_init() or
               the first call to an OpenDoors function. This variable can be
               one of the following values:

               COM_FOSSIL          - Indicates that a FOSSIL driver is being
               used
               COM_INTERNAL   - Indicates that OpenDoor's internal serial I/O
                                code is being used.
               COM_WIN32      - Indicates that the Win32 communication system
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 155

                                is being used.



-------------------------------------------------------------------------------
od_com_        char od_control.od_com_no_fifo;
no_fifo
               This variable is only used when OpenDoors is NOT performing
               serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
               used, the receive buffer size can be set from the FOSSIL driver
               command line).

               Normally, OpenDoors will use a 16550A FIFO buffer if a 16550A
               UART is installed. You can disable the use of the 16550A FIFO
               buffer by setting this variable to TRUE.



-------------------------------------------------------------------------------
od_com_        unsigned int od_control.od_com_rx_buf;
rx_buf
               This variable is only used when OpenDoors is NOT performing
               serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
               used, the receive buffer size can be set from the FOSSIL driver
               command line).

               This variable allows you to set the size of OpenDoor's serial
               I/O receive buffer. If you do not set this buffer size, a
               default value of 256 characters is used. Normally, this buffer
               size is more than large enough for door programs. However, if
               you find that inbound characters are lost before they can be
               processed by your program, you may wish to increase the size of
               this buffer.

               This variable should only be changed before your first call to
               od_init() or any other OpenDoors function.



-------------------------------------------------------------------------------
od_com_        unsigned int od_control.od_com_tx_buf;
tx_buf
               This variable is only used when OpenDoors is NOT performing
               serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
               used, the receive buffer size can be set from the FOSSIL driver
               command line).

               This variable allows you to set the size of OpenDoor's serial
               I/O transmit buffer. If you do not set this buffer size, a
               default value of 1024 characters is used.


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 156

               This variable should only be changed before your first call to
               od_init() or any other OpenDoors function.



-------------------------------------------------------------------------------
od_connect_    DWORD od_control.od_connect_speed;
speed
               This variable contains the best guess at the current modem
               connection speed. This information is currently only accurate if
               a DOOR.SYS file is being used. In other situations, it will
               always be set to be equal to od_control.baud.



-------------------------------------------------------------------------------
od_open_       DWORD od_control.od_open_handle;
handle
               Under platforms where this is supported (currently only the
               Win32 version of OpenDoors), this variable can be used to pass a
               live serial port handle to OpenDoors, which OpenDoors will use.
               OpenDoors will not close this handle when it exits. If this
               value is set to 0, OpenDoors will open and close the serial port
               itself.



-------------------------------------------------------------------------------
port           char od_control.port;

               This variable contains the serial port number that the modem is
               connected. This number is 0 based, so that a value of 0
               corresponds to COM1:, a value of 1 corresponds to COM2:, and so
               on. This value will normally be set by the od_init() function,
               when the door information file is read, and should not be
               changed after modem initialization has been carried out by the
               od_init() function.















===============================================================================
OpenDoors 6.00 Manual                                          End of Page 157

CONTROL STRUCTURE - BBS AND CALLER INFORMATION
-------------------------------------------------------------------------------

               As we have already described, there are two types of variables
               in the OpenDoors control structure. Some of the variables are
               simply used to allow you to customize OpenDoor's various
               features, such as altering colors, prompts, timeouts, etc. Other
               variables in the OpenDoors control structure serve to provide
               you with information about the user who is online and the BBS
               system your door is running under. This section deals with those
               variables that provide you with information about the BBS and
               the user.

               The information in these variables is read from the door
               information file, a small file created by the BBS specifically
               for the purpose of communicating with door programs. Depending
               on what BBS system your door is running under, the type of door
               information file will vary. Since different door information
               files do not all provide the same pieces of information, some
               variables in this section will only be available when your door
               is running under particular BBS systems.  Other variables will
               be available with many or all BBS systems. In the description of
               each variable in this section, we indicate under which door
               information files the particular variable will be . So, if you
               wish to access a variable that is only under certain door
               information files, your program should test whether or not the
               required information is available under the particular door
               information file that was found. In order to determine which
               door information file your door is running under, you should use
               the od_control.od_info_type variable. This variable is described
               in the section which begins on page 150. If you test the value
               of the od_control.od_info_type variable, and find that the
               required information is not available, you may wish to simply
               use some sort of default value for the variable, or
               alternatively, not allow your door to run under certain BBS
               systems. Another possibility, if the required information is not
               available, is imply to obtain this information from the user
               yourself. For example, if you wished to know the length of the
               user's screen, when this information is not available from the
               door information file, you could simply prompt the user for
               their screen length the first time they use your door. This
               information could then be stored in your door's data files for
               future reference.

               As an example of testing what door information file your door is
               running under, consider the case where you wanted to display the
               user's birthday. The example below will display the user's
               birthday if it is known, and otherwise, print the string
               "unknown".

                         if(od_control.od_info_type == RA1EXITINFO
                            od_control.od_info_type == RA2EXITINFO)
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 158

                         {
                            od_disp_str(od_control.user_birthday);
                         }
                         else
                         {
                            od_disp_str("Unknown");
                         }

               The chart below lists the door information file formats that
               OpenDoors recognizes, along with example BBS systems that
               produce these files and a reference letter for each type. Thus,
               an OpenDoors door can run DIRECTLY under ANY BBS SYSTEM that
               produces one of these files formats, and under ANY OTHER BBS
               system when used in conjunction with a door information file
               conversion utility.

+--------------------------+----------------------------------------+
| FILE FORMAT              | EXAMPLE BBS SYSTEMS                    |
+--------------------------+----------------------------------------+
| CHAIN.TXT                | WWIV                                   |
+--------------------------+----------------------------------------+
| DORINFO1.DEF             | RBBS-PC                                |
+--------------------------+----------------------------------------+
| DORINFO1.DEF             | QuickBBS                               |
|      &                   | Remote Access (versions 0.01-0.04)     |
| EXITINFO.BBS (Std. Ver.) |                                        |
+--------------------------+----------------------------------------+
| DOOR.SYS (DoorWay Style) | Remote Access                          |
+--------------------------+----------------------------------------+
| DOOR.SYS (PCB/GAP Style) | PC-Board                               |
|                          | GAP                                    |
+--------------------------+----------------------------------------+
| DOOR.SYS (WildCat Style) | Wildcat 3.00 and above                 |
|                          | Telegard                               |
+--------------------------+----------------------------------------+
| SFDOORS.DAT              | Spitfire                               |
|                          | TriBBS                                 |
+--------------------------+----------------------------------------+
| CALLINFO.BBS             | WildCat 2.xx                           |
+--------------------------+----------------------------------------+
| DORINFO1.DEF             | Remote Access (versions 1.00 and later)|
|      &                   |                                        |
| EXITINFO.BBS (Ext. Ver.) |                                        |
+--------------------------+----------------------------------------+



               The chart on the following page lists all of the OpenDoors
               control structure variables in this section, along with a brief
               description of their use. The variables are then described in
               detail, below.

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 159

+-----------------------+-----------------------------------------------+
| VARIABLE NAME         | VARIABLE CONTENTS                             |
+-----------------------+-----------------------------------------------+
| EMSI INFORMATION      | Information on current IEMSI session          |
| event_status          | The status of the next system event           |
| event_starttime       | The start time of the next system event       |
| event_errorlevel      | The errorlevel of the next system event       |
| event_days            | The days of the week to execute the event     |
| event_force           | Whether the next system event is forced       |
| event_last_run        | When the next system event was last run       |
| sysop_name            | The name of the BBS's sysop                   |
| system_calls          | Total number of calls BBS has received        |
| system_last_caller    | The name of the last caller to the BBS        |
| system_last_handle    | The handle (alias) of the last caller         |
| system_name           | The name of the BBS                           |
| TIMELOG VARIABLES     | The times at which the BBS has been most busy |
| user_ansi             | Whether the user has ANSI graphics mode on    |
| user_attribute        | User attribute bit-mapped flags               |
| user_attrib2          | Second set of user attribute bit-mapped flags |
| user_attrib3          | Third set of user attribute flags             |
| user_avatar           | Whether the user has AVATAR graphics mode on  |
| user_birthday         | The date the user was born                    |
| user_callsign         | The user's amateur radio call sign            |
| user_combinedrecord   | The user's combined message areas settings    |
| user_comment          | Sysop's comment about the user                |
| user_credit           | Amount of NetMail credit the user has         |
| user_dataphone        | The user's data phone number                  |
| user_date_format      | Format user wishes to have dates displayed in |
| user_deducted_time    | Total time that has been subtracted from user |
| user_downk            | Total Kilobytes downloaded by the user        |
| user_downlimit        | User's daily download limit                   |
| user_downloads        | Total number of files downloaded by the user  |
| user_echomailentered  | Whether or not the user has entered EchoMail  |
| user_error_free       | Whether or not connection is error-free       |
| user_file_area        | The user's current file area                  |
| user_firstcall        | Date of the user's first call to the BBS      |
| user_flags            | User's sysop-defined flag settings            |
| user_forward_to       | Name to forward user's mail to                |
| user_group            | User's group number                           |
| user_handle           | User's alias                                  |
| user_homephone        | User's home telephone number                  |
| user_language         | User's language setting                       |
| user_last_pwdchange   | Total calls since last password change        |
| user_lastdate         | Date of the user's last call                  |
| user_lastread         | Highest message number read by user           |
| user_lasttime         | Time of the user's last call                  |
| user_location         | Name of the city where the user lives         |
| user_logindate        | Date on which the current call began          |
+-----------------------+-----------------------------------------------+



===============================================================================
OpenDoors 6.00 Manual                                          End of Page 160




+-----------------------+-----------------------------------------------+
| VARIABLE NAME         | VARIABLE CONTENTS                             |
+-----------------------+-----------------------------------------------+
| user_loginsec         | User's security at the beginning of this call |
| user_logintime        | Time at which the current call began          |
| user_logonpassword    | User's password at the beginning of this call |
| user_menustack        | Contents of the user's current menu stack     |
| user_menustackpointer | Pointer to the top of the menu stack          |
| user_messages         | Total number of messages written by the user  |
| user_msg_area         | The user's current message area               |
| user_name             | The user's name                               |
| user_net_credit       | The user's remaining netmail credit           |
| user_netmailentered   | Whether or not the user has entered NetMail   |
| user_num              | The user's record number in the user file     |
| user_numcalls         | Number of calls the user has made to the BBS  |
| user_numpages         | Number of times the user has paged the sysop  |
| user_password         | The user's current password                   |
| user_pending          | The value of unsent NetMail written by user   |
| user_reasonforchat    | The reason the user wishes to chat with sysop |
| user_rip_ver          | RIP protocol version being used               |
| user_screen_length    | The length of the user's screen               |
| user_screenwidth      | The width of the user's screen                |
| user_security         | The user's security access level              |
| user_sex              | The user's gender                             |
| user_subdate          | The date the user's subscription expires      |
| user_timelimit        | The user's daily time limit                   |
| user_todayk           | Kilobytes downloaded by the user today        |
| user_upk              | Total Kilobytes uploaded by the user          |
| user_uploads          | Total number of files uploaded by the user    |
| user_wantchat         | Whether or not the user wishes to chat        |
| user_xi_record        | The user's record in the USERSXI.BBS file     |
+-----------------------+-----------------------------------------------+




-------------------------------------------------------------------------------
EMSI           char od_control.ra_emsi_session;
INFORMATION    char od_control.ra_emsi_crtdef[41];
               char od_control.ra_emsi_protocols[41];
               char od_control.ra_emsi_capabilities[41];
               char od_control.ra_emsi_requests[41];
               char od_control.ra_emsi_software[41];
               char od_control.ra_hold_attr1;
               char od_control.ra_hold_attr2;
               char od_control.ra_hold_len;

               These variables provide your door with information pertaining to
               an interactive EMSI session that has been established. Note that
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 161

               these variables are only available under systems that produce an
               RA 1.00 and later style extended EXITINFO.BBS door information
               file.

               If an IEMSI session has been established, the Boolean variable
               od_control.ra_emsi_session will be TRUE, and if no session has
               not been established, this variable will be FALSE.

               A full discussion of the IEMSI protocol is beyond the scope of
               this manual. Specifications for the IEMSI protocol are available
               from the OpenDoors support BBS.



-------------------------------------------------------------------------------
event_days     unsigned char od_control.event_days;

               This variable is a bit-mapped flag of the days of the week on
               which the next system event is run. The bit-map bits are as
               follows:

                       +-----+------+-----------+
                       | BIT | MASK | MEANING   |
                       +-----+------+-----------+
                       |  0  | 0x01 | Sunday    |
                       |  1  | 0x02 | Monday    |
                       |  2  | 0x04 | Tuesday   |
                       |  3  | 0x08 | Wednesday |
                       |  4  | 0x10 | Thursday  |
                       |  5  | 0x20 | Friday    |
                       |  6  | 0x40 | Saturday  |
                       |  7  | 0x80 | All Days  |
                       +-----+------+-----------+

               For more information on bit-mapped flags, see the glossary item
               entitled "BIT-MAPPED FLAGS".

               This variable is only available under systems that produce an
               EXITINFO.BBS door information file.



-------------------------------------------------------------------------------
event_         unsigned char od_control.event_errorlevel;
errorlevel
               This variable contains the ErrorLevel associated with the next
               system event. This variable is only available under systems that
               produce an EXITINFO.BBS door information file.




===============================================================================
OpenDoors 6.00 Manual                                          End of Page 162

-------------------------------------------------------------------------------
event          char od_control.event_force;
_force
               This variable indicates whether the next system event should be
               forced to run at a particular time. If this variable contains a
               value of TRUE, then the user should be forced off-line in order
               to accommodate the event, and if this variable is false, then
               the event can wait until after the user logs off normally. This
               variable is only available under systems that produce an
               EXITINFO.BBS file.



-------------------------------------------------------------------------------
event          char od_control.event_last_run[9];
_last_run
               This variable contains a string representing the date on which
               the next system event was last run, and is in the same format as
               the user_lastdate variable. This variable is only available
               under systems that produce an EXITINFO.BBS file.



-------------------------------------------------------------------------------
event          char od_control.event_starttime[6];
_starttime
               This variable contains a string representing the time at which
               the next system event is scheduled to start, in the same format
               as the user_lasttime variable. This variable is only available
               under systems that produce an EXITINFO.BBS or Wildcat style
               DOOR.SYS door information file.



-------------------------------------------------------------------------------
event          unsigned char od_control.event_status;
_status
               This variable represents the status of the next system event,
               and will be equal to the value

                            ES_ENABLED

               if and only if the other event information contained in the
               control structure is valid. This variable is only available
               under systems that produce an EXITINFO.BBS file.







===============================================================================
OpenDoors 6.00 Manual                                          End of Page 163

-------------------------------------------------------------------------------
sysop_name     char od_control.sysop_name[40];

               The od_control.sysop_name variable contains the name of the
               sysop of the BBS under which your door is running. This variable
               is available under any BBS system that produces a DORINFO?.DEF
               (including RA & QBBS which process both DORINFO1.DEF and
               EXITINFO.BBS files), or Wildcat style DOOR.SYS file.



-------------------------------------------------------------------------------
system_calls   long od_control.system_calls;

               This variable contains the total number of calls that have been
               placed to the BBS, and is available under any BBS which produces
               an EXITINFO.BBS file.



-------------------------------------------------------------------------------
system_last    char od_control.system_last_caller[36];
_caller
               This string contains the name of the previous caller to the BBS,
               on any line, and is available under EXITINFO.BBS.



-------------------------------------------------------------------------------
system_last    char od_control.system_last_handle[36];
_handle
               This string contains the handle (alias) of the previous caller
               to the BBS, on any line, and is available under EXITINFO.BBS.



-------------------------------------------------------------------------------
system_name    char od_control.system_name[40];

               The od_control.system_name variable contains the name of the BBS
               under which your door is running. This variable is available
               under any BBS system that produces a DORINFO?.DEF (including RA
               & QBBS which process both DORINFO1.DEF and EXITINFO.BBS files).



-------------------------------------------------------------------------------
TIMELOG        char od_control.timelog_start_date[9];
VARIABLES
               This string contains the date of the beginning of the time
               period for which the time log is recorded. This variable is
               available under any system that produces an EXITINFO.BBS file.
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 164



               int od_control.timelog_busyperhour[24];

               This variable is an array of 24 elements, with each element
               indicating the total number of times the BBS was in use during
               each of the 24 hours of the day. Element 0 corresponds to the
               time period of 0:00-1:00, element 1 corresponds to the time
               period of 1:00-2:00, and so on. In order to determine the
               frequency of system use during any hour as a percentage, simply
               calculate the total of all 24 entries in the array, and divide
               any given entry by the total, in order to come up with an
               average. This variable is available under any system that
               produces an EXITINFO.BBS file.


               int od_control.timelog_busyperday[7];

               This variable is an array of 7 elements, with each element
               indicating the total number of times the BBS was in use during
               each of the 7 days of the week. Here, elements 0 corresponds to
               Sunday, element 1 to Monday, and so on. In order to calculate
               the frequency of system use during any day of the week, use the
               same method as for calculating the frequency of calls during
               each hour, as described above. This is only available under
               systems that produces an EXITINFO.BBS file. Note that at least
               some, if not all, versions of RemoteAccess do not maintain this
               variable correctly, and thus even with the presence of an
               EXITINFO.BBS file, this array may contain all zero entries.



-------------------------------------------------------------------------------
user_ansi      char od_control.user_ansi;

               This variable contains a Boolean value, indicating whether or
               not the user has ANSI mode turned on. If ANSI graphics mode is
               enabled, this variable will contain a value of TRUE, and if ANSI
               graphics mode is disabled, this variable will contain a value of
               FALSE. Many of the OpenDoors functions test the setting of this
               variable in order to determine whether or not they should send
               ANSI-graphics control characters. Also, if this variable
               contains a TRUE value, OpenDoors will display an "[ANSI]"
               indicator on the status line.

               You may change the value of this variable at any time after the
               first call to od_init() or any other OpenDoors functions.
               Depending upon what BBS system your door is running under,
               changes to this variable may or may not result in changes to the
               user's ANSI setting upon return to the BBS.


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 165

               This variable is available under all door information file
               formats.



-------------------------------------------------------------------------------
user_          unsigned char od_control.user_attribute;
attribute
               This variable is a bitmap of eight flags, each of which
               represent individual pieces of information pertaining to the
               user that is currently online. These flags are as follows:

                       +-----+------+-----------------------+
                       | BIT | MASK | DESCRIPTION           |
                       +-----+------+-----------------------+
                       |  0  | 0x01 | Is the user deleted   |
                       |  1  | 0x02 | Is screen clearing on |
                       |  2  | 0x04 | Is "more" prompt on   |
                       |  3  | 0x08 | Is ANSI mode on       |
                       |  4  | 0x10 | User no-kill setting  |
                       |  5  | 0x20 | Transfer-priority     |
                       |  6  | 0x40 | Full screen editor    |
                       |  7  | 0x80 | Quiet mode            |
                       +-----+------+-----------------------+

               For more information on using and setting bit-mapped flags,
               please see the entry entitled "BITMAPED FLAGS" in the glossary
               of this manual.

               Note that this variable is only available under systems that
               produce and EXITINFO.BBS format door information file.



-------------------------------------------------------------------------------
user_          unsigned char od_control.user_attrib2;
attrib2
               See the user_attrib variable for more information. This variable
               is like the user_attrib variable, except that it contains
               different information. The bit-mapped flags for the
               od_control.user_attrib2 variable are as follows:

                       +-----+------+-----------------------+
                       | BIT | MASK | DESCRIPTION           |
                       +-----+------+-----------------------+
                       |  0  | 0x01 | User hot-keys setting |
                       |  1  | 0x02 | Is AVATAR graphics on |
                       |  2  | 0x04 | Full screen reader    |
                       |  3  | 0x08 | Hidden from userlist  |
                       +-----+------+-----------------------+


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 166

               Note that this variable is only available under systems that
               produce an EXITINFO.BBS door information file.



-------------------------------------------------------------------------------
user_          unsigned char od_control.user_attrib3;
attrib3
               This variable contains user attribute flags when a RA 2.50 or
               later EXITINFO.BBS file is used.



-------------------------------------------------------------------------------
user_avatar    char od_control.user_avatar;

               This variable is a Boolean value indicating whether or not
               AVATAR graphics mode is on. If AVATAR graphics is available,
               then many of the OpenDoors functions will make use of AVATAR
               graphics codes for greater display speed. If AVATAR graphics
               mode is on, a [AVT] indicator will appear on the status line. If
               your door is running under a system which produces an RA 1.00+
               style extended EXITINFO.BBS door information file, the
               user_avatar variable is set automatically. If the extended
               EXITINFO.BBS file is not available, this value will default to
               FALSE. In this case, you may wish to ask the user whether or not
               they wish to use AVATAR graphics, and thus set this variable
               yourself.



-------------------------------------------------------------------------------
user           char od_control.user_birthday[9];
_birthday
               This variable is a string, in the same format as the
               od_control.user_lastcall variable, which stores the date of the
               user's birthday, if it is available. This variable is only
               available under systems that produce an RA 1.00 and later style
               extended EXITINFO.BBS or Wildcat style DOOR.SYS file.



-------------------------------------------------------------------------------
user           char od_control.user_callsign[12];
_callsign
               This variable is a string which contains the user's amateur
               radio call sign, if any. This variable is only available under
               systems that produce a CHAIN.TXT file.




===============================================================================
OpenDoors 6.00 Manual                                          End of Page 167

-------------------------------------------------------------------------------
user_combined  unsigned char od_control.user_combinedrecord[25];
record
               This variable is an array of bit-mapped flags, with each flag
               corresponding to an individual message area. In this case, the
               first bit of od_control.ra_combinedrecord[0] corresponds to the
               first message area, the second bit to the second message area,
               and so on. If any given bit-flag is turned on, then the user has
               corresponding message area enabled for combined access, and if
               the bit is turned off, the user does not have the area enabled
               for combined access. A detailed description of the combined
               message access is beyond the scope of this manual. This variable
               is only available under systems that produce an RA 1.00 or later
               style extended EXITINFO.BBS door information file.



-------------------------------------------------------------------------------
user_comment   char od_control.user_comment[81];

               This variable is a string which contains the sysop's comment
               about the user that is currently online. This comment may be
               displayed on the OpenDoors status line, if this variable is
               available. This variable is available under systems that produce
               an RA 1.00 and later style extended EXITINFO.BBS or Wildcat
               style DOOR.SYS file.



-------------------------------------------------------------------------------
user_credit    unsigned int od_control.user_credit;

               This variable contains the total amount of NetMail credit that
               the caller has left. Changes to this variable will be by the BBS
               when your door exits and control is returned to the BBS. This
               variable is only available under systems that produce an
               EXITINFO.BBS door information file.



-------------------------------------------------------------------------------
user_          char od_control.user_dataphone[13];
dataphone
               This string contains the user's data or business phone number,
               if available. This value is only available under system that
               produce EXITINFO.BBS, PC-Board/GAP style DOOR.SYS and WildCat
               DOOR.SYS format door information files.





===============================================================================
OpenDoors 6.00 Manual                                          End of Page 168

-------------------------------------------------------------------------------
user           int od_control.user_deducted_time;
_deducted
_time          This variable contains a signed integer value, which indicates
               the total amount of time that has been deducted from the user
               during this call. This variable is only available under systems
               that produce an RA 1.00 and later style extended EXITINFO.BBS
               door information file.



-------------------------------------------------------------------------------
user_downk     unsigned int od_control.user_downk;

               This variable contains the total kilobytes of files that the
               current user has downloaded from the BBS, and is available under
               systems that produce EXITINFO.BBS, Wildcat style DOOR.SYS or
               SFDOORS.DAT format door information files.



-------------------------------------------------------------------------------
user           unsigned int od_control.user_downlimit;
_downlimit
               This variable contains the total number of kilobytes that the
               caller is permitted to download during this call. If your door
               allows files do be downloaded, you will probably want to compare
               the value of this variable to the size of any file to be
               transferred and the total kilobytes already downloaded, as
               stored in the od_control.user_todayk variable. This variable is
               only available under systems that produce an EXITINFO.BBS file.



-------------------------------------------------------------------------------
user           unsigned int od_control.user_downloads;
_downloads
               This variable contains the total number of files that the
               current user has downloaded from the BBS, and is available under
               systems that produce EXITINFO.BBS, PC-Board/GAP style DOOR.SYS,
               WildCat style DOOR.SYS or SFDOORS.DAT format door information
               files.



-------------------------------------------------------------------------------
user_echo      char od_control.user_echomailentered;
mailentered
               This variable is a Boolean value, indicating whether or not the
               user has entered new EchoMail during this call. If this variable
               has a value of TRUE, then EchoMail has been entered, and if it
               has a value of FALSE, then EchoMail has not been entered. This
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 169

               variable will contain a valid value only after od_init() or some
               OpenDoors function has been called. Any changes made to this
               variable will be reflected within the BBS software when control
               is returned to the BBS. This variable is accessible only under
               systems which produce an EXITINFO.BBS door information file.



-------------------------------------------------------------------------------
user_error          char od_control.user_error_free;
_free
               This variable contains a Boolean value indicating whether or not
               the user is connected to the BBS via an error free connection
               (eg. a V.42/MNP or similar modem protocol). This variable is
               only available under systems that produce an SFDOORS.DAT,
               Wildcat style DOOR.SYS or RA 1.00 or later style extended
               EXITINFO.BBS door information file.



-------------------------------------------------------------------------------
user_first     char od_control.user_firstcall[9];
call
               This variable is a string which contains the date of the user's
               first call, in the same format as the od_control. user_lastcall
               variable. This variable is only available under systems which
               produce an RA 1.00 and later style extended EXITINFO.BBS door
               information file.



-------------------------------------------------------------------------------
user_          unsigned char od_control.user_flags[4];
flags
               The od_control.user_flags variable is an array of four sysop
               defined bit-mapped flags, which represent some sort of
               information about the user. od_control.user_flags[0] stores
               flags A1 - A8 in bits 0 through 7, respectively. Likewise,
               od_control.user_flags[1] stores flags B1 - B8, and so on. This
               variable is only available under systems that produce
               EXITINFO.BBS format door information files.



-------------------------------------------------------------------------------
user_handle    char od_control.user_handle[36];

               This variable contains the user's alias or handle name, if any.
               If the user does not have and alias or handle, this variable
               will be blank. This variable is only available under systems
               that produce a CHAIN.TXT, RA 1.00 and later extended
               EXITINFO.BBS or Wildcat style DOOR.SYS door information file.
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 170




-------------------------------------------------------------------------------
user_          char od_control.user_homephone[13];
homephone
               This string contains the user's home or data phone number, if
               available. This value is only available under system that
               produce one of the following door information files:
               EXITINFO.BBS, PC-Board/GAP style DOOR.SYS, WildCat style
               DOOR.SYS or SFDOORS.DAT.



-------------------------------------------------------------------------------
user           unsigned char od_control.user_last_pwdchange;
_last
_pwdchange     This variable contains the number of calls that the user has
               made since they last changed their password. This variable is
               only available under EXITINFO.BBS files.



-------------------------------------------------------------------------------
user           char od_control.user_lastdate[9];
_lastdate
               This variable is a string containing the date of the user's last
               call to the BBS, and should always be of the format:

                                  "MM-DD-YY"

               Where MM is two digits representing the number of the month of
               the user's call, with 1 being January, 2 being February, and so
               on. DD should be two digits representing the day of the month of
               the user's last call, beginning with 1, and MM should be the
               last two digits of the year of the user's last call.

               This variable is only available under systems that produce one
               of the following door information files: CHAIN.TXT,
               EXITINFO.BBS, PC-Board/GAP style DOOR.SYS or WildCat style
               DOOR.SYS files.



-------------------------------------------------------------------------------
user_          unsigned int od_control.user_lastread;
lastread
               This variable contains the number of the highest message number
               that the user has read, and is only available under EXITINFO.BBS
               format door information files.


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 171


-------------------------------------------------------------------------------
user           char od_control.user_lasttime[6];
_lasttime
               This variable contains a string representing the time of the
               user's last call to the BBS, and should always be of the format:

                                  "HH:MM"

               Where HH is two digits representing the 24-hour format hour of
               the user's last call, and MM is two digits representing the
               minute of the user's last call. Thus, the following strings
               would be valid entries for this string:

                    "00:01"    (12:01 am)
                    "03:47"    (3:47 am)
                    "18:20"    (6:20 pm)

               This variable is only available under systems that produce an
               EXITINFO.BBS or Wildcat style DOOR.SYS format door information
               file.



-------------------------------------------------------------------------------
user           char od_control.user_location[26];
_location
               This string contains the name of the location from which the
               current user is calling from. This will usually be the name of
               the city, region (province, state, etc.) and sometimes country
               where the user lives. The contents of this variable are
               displayed on the OpenDoors status line. The value of this
               variable is valid after od_init() or any other OpenDoors
               function has been called. Also, you may change the value of this
               variable if you wish. However, not that these changes may not
               immediately be reflected in the status line, and may or may not
               cause the setting to be changed after the user returns to the
               BBS. This variable is available under systems that produce one
               of the following door information files: DORINFO?.DEF,
               EXITINFO.BBS, PC-Board/GAP style DOOR.SYS, WildCat style
               DOOR.SYS SFDOORS.DAT and CALLINFO.BBS, but is not available
               under CHAIN.TXT or DoorWay style DOOR.SYS files.



-------------------------------------------------------------------------------
user           char od_control.caller_logindate[9];
_logindate
               This variable contains a string representing the date on which
               the current call to the BBS began. This variable is in the same
               format as the od_control.user_lastdate variable, described

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 172

               below. This variable is only available under systems which
               produce an EXITINFO.BBS file.



-------------------------------------------------------------------------------
user           long od_control.user_loginsec;
_loginsec
               This variable contains the user's security at login, and can be
               used to detect changes by the sysop or other programs during the
               course of the call, by comparing it's value with the
               od_control.user_security variable. This variable is only
               available under systems which produce an EXITINFO.BBS file.



-------------------------------------------------------------------------------
user           char od_control.user_logintime[6];
_logintime
               This variable contains a string representing the time of day at
               which the current call to the BBS began. This variable is in the
               same format as the od_control.user_lasttime variable, which is
               also described below. This variable is available under systems
               which produce an EXITINFO.BBS, a Wildcat style DOOR.SYS, or an
               SFDOORS.DAT file.



-------------------------------------------------------------------------------
user           char od_control.user_logonpassword[16];
_logon
password       This variable is a string which contains the user's password
               at the time at which the current call to the BBS began. This
               variable can be used to detect changes by the sysop or other
               programs to the user's password, which have taken place during
               the course of the call. In order to detect such changes, simply
               compare the contents of this string with the contents of the
               od_control.user_password variable. This variable is only
               available under systems which produce an EXITINFO.BBS format
               door information file.



-------------------------------------------------------------------------------
user           char od_control.user_menustack[50][9];
_menustack
               This variable is an array of 50 strings, containing the stack of
               BBS menus that have been executed, and is used to record the
               current position of the user within the BBS's menu system. Each
               string contains just the base portion of the filename of the
               menu, without the extension. The od_control.ra_menustackpointer
               variable points to the top of the menu stack. However, a
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 173

               complete discussion of the menu stack is beyond the scope of
               this manual. This variable is only available under systems that
               produce an RA 1.00 and later style extended EXITINFO.BBS door
               information file.



-------------------------------------------------------------------------------
user           unsigned char od_control.user_menustackpointer;
_menustack
pointer        This variable points to the top of the current menu stack. For
               more information on the menu stack, please refer to the
               od_control.ra_menustack variable, above. This variable is only
               available under systems that produce an RA 1.00 and later style
               extended EXITINFO.BBS door information file.



-------------------------------------------------------------------------------
user           unsigned int od_control.user_messages;
_messages
               This variable contains a value representing the total number of
               messages that have been written by the user, and is available
               under EXITINFO.BBS or Wildcat style DOOR.SYS format door
               information files.



-------------------------------------------------------------------------------
user_name      char od_control.user_name[36];

               This string contains the name of the user that is currently on-
               line, and is used by OpenDoors to display the current user name
               on the status line, and will most likely be used by your door
               for differentiating among different users. In most cases, you
               should probably not change the value of this variable, as a
               user's name does not usually change, and doing so could results
               in problems when returning to some BBS systems. For an example
               of using this variable, see the EX_VOTE.C example program. This
               variable is available under all BBS systems.



-------------------------------------------------------------------------------
user_net_      unsigned int od_control.user_net_credit;
credit
               This variable contains the amount of NetMail credit that the
               current user has to his or her name. This variable is only
               available under systems that produce an EXITINFO.BBS file.



===============================================================================
OpenDoors 6.00 Manual                                          End of Page 174

               Note that if you wish to change the value of the user's
               remaining NetMail credit, you should use the od_control.
               user_credit variable, instead of this variable.



-------------------------------------------------------------------------------
user_net       char od_control.user_netmailentered;
mailentered
               This variable is a Boolean value, indicating whether or not the
               user has entered new NetMail or GroupMail during this call. If
               this variable has a value of TRUE, then NetMail/GroupMail has
               been entered, and if it has a value of FALSE, then
               NetMail/GroupMail has not been entered. This variable will
               contain a valid value only after od_init() or some OpenDoors
               function has been called. Any changes made to this variable will
               be reflected within the BBS software when control is returned to
               the BBS. This variable is accessible only under systems which
               produce an EXITINFO.BBS door information file.



-------------------------------------------------------------------------------
user_num       unsigned int od_control.user_num;

               This variable contains the number of the user's record in the
               user database file, where 0 is the first record. This can be
               useful for changing user settings that are not re-read by the
               BBS, such as the user's phone number or security level which
               might be altered by a call back verification door. However, the
               value of this variable itself should not be altered.

               This variable is available under systems which produce any of
               the following door information file formats: CHAIN.TXT, PC-
               Board/GAP style DOOR.SYS, Wildcat style DOOR.SYS SFDOORS.DAT and
               EXITINFO.BBS.



-------------------------------------------------------------------------------
user_          unsigned int od_control.user_numcalls;
numcalls
               This variable contains the total number of calls that the
               current user has placed to the BBS, and is available under
               systems that produce EXITINFO.BBS or PC-Board/GAP and Wildcat
               style DOOR.SYS door information files.






===============================================================================
OpenDoors 6.00 Manual                                          End of Page 175

-------------------------------------------------------------------------------
user           unsigned int od_control.user_numpages;
_numpages
               The value of this variable contains the total number of times
               that the user has paged the sysop, and can be used to limit the
               number of times that the user is permitted to page the sysop.
               OpenDoors increments this variable every time that the user
               pages the sysop, via the od_page() function. This variable is
               used with all types of door information files. However, this
               variable will only reflect the value within the BBS if an
               EXITINFO.BBS file is produced. Otherwise, the variable will only
               contain the number of times that the user has paged within the
               door, but not the total number of times the user has paged.
               Under EXITINFO.BBS systems, changes to the value of this
               variable will be reflected within the BBS upon return by the
               DOOR.



-------------------------------------------------------------------------------
user           char od_control.user_password[16];
_password
               This variable contains the user's password for accessing the
               BBS. OpenDoors does not use this value itself. This variable
               will contain a valid value only after od_init() or some
               OpenDoors function has been called. You may change the value of
               this variable. Note, however, that changes in this variable may
               or may not cause the setting to be changed when control returns
               to the BBS - this will depend upon the particular BBS system
               your door is running under. This variable is only available
               under systems that produce one of the following door information
               files: EXITINFO.BBS, PC-Board/GAP and Wildcat style DOOR.SYS,
               SFDOORS.DAT, and CALLINFO.BBS.



-------------------------------------------------------------------------------
user_pending   unsigned int od_control.user_pending;

               This variable represents the total value of NetMail that has
               been written by the current user, but not yet exported from the
               message base. This variable is only available under systems that
               produce an EXITINFO.BBS door information file.



-------------------------------------------------------------------------------
user_reason    char od_control.user_reasonforchat[78];
forchat
               This variable is a string, containing the reason for which the
               user wishes to chat with the sysop, as they entered at the time
               of paging the sysop. This variable will contain an empty string
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 176

               if the user has not paged the sysop, or if the reason the user
               wishes to chat is unknown. See also the od_control.user_wantchat
               variable. This variable is available under all BBS systems,
               regardless of what style of door information file they produce.
               However, this variable will not be passed between the door and
               BBS, and thus the user's reason for chat within the door will
               not necessarily correspond to their reason for chat outside the
               door.



-------------------------------------------------------------------------------
user_rip       char user_rip;

               This variable is set to TRUE if the user has RIP (Remote Imaging
               Protocol) graphics enabled, and FALSE if they do not. This
               setting can be determined from the door information (drop) file
               in many cases. In other cases, you can automatically determine
               whether or not the user's system supports RIP graphics using the
               od_autodetect() function (see page 48).



-------------------------------------------------------------------------------
user_rip_ver   BYTE user_rip_ver;

               This variable contains the version of the RIP protocol that is
               in use. This variable is only available under a RemoteAccess
               2.50 EXITINFO.BBS file.



-------------------------------------------------------------------------------
user           unsigned int od_control.user_screen_length;
_screen
_length        This value of this variable represents the total number of
               lines that can be displayed on the user's screen at once, and is
               usually either 24 or 25. You may wish to make use of this
               variable to allow your door to pause the display of long pieces
               of text after every screen length, in order to allow the user to
               read this information before it passes off of their screen. In
               this case, you would simply maintain a counter of the total
               number of lines displayed, and when this value reaches one less
               than the length of the user screen, display a prompt asking the
               user to whether or not they wish to continue.

               This variable is set to the user's setting within the BBS under
               systems that produce any of the following door information file
               formats: CHAIN.TXT, EXITINFO.BBS, PC-Board/GAP and Wildcat style
               DOOR.SYS and CALLINFO.BBS files.


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 177

               This variable is used by the OpenDoors function,
               od_list_files(). If this variable contains a valid value,
               OpenDoors will pause the listing of files after every screen,
               and give the user the option of continuing, aborting, or
               disabling the "Continue?" prompt for the rest of the file
               listing. Thus, if you are using the od_list_files() under a
               system that does not produce one of the door information files
               listed above, you may wish to obtain the user's screen length
               from the user themselves. If the screen length is not available
               from the particular type of door information file that is found,
               and you do not set this value yourself, this variable will
               default to 23. If you are going to set the value of this
               variable yourself, you should do so after having called
               od_init() or some OpenDoors function.



-------------------------------------------------------------------------------
user_          unsigned char od_control.user_screenwidth;
screenwidth
               This variable contains a value representing the width of the
               user's screen, and will most often be equal to 80. This variable
               is only available under systems that produce a CHAIN.TXT or RA
               1.00 and later style extended EXITINFO.BBS door information
               file.



-------------------------------------------------------------------------------
user           unsigned int od_control.user_security;
_security
               This variable contains a numerical value representing the user's
               security access level on the BBS. You may wish to use this value
               to determine whether or not the current user of your door should
               have access to certain sysop-only functions. In this case, you
               may wish to have a configuration file used by your door, in
               which the sysop may define the minimum security level for sysop
               access. You would then be able to compare this configuration
               setting to the security level stored in this variable, in order
               to determine whether or not sysop function should be available.
               An alternative method, used by the EX_VOTE.C sample door, of
               determining whether or not the current user is the sysop is to
               compare the user's name with the value of the
               od_control.sysop_name variable. This method has the advantage of
               not requiring a configuration program, but the disadvantage that
               the door will not function correctly under all BBS systems, as
               the od_control.sysop_name variable is not available under all
               BBS systems.

               The od_control.user_security variable is available under BBS
               systems that produce any of the following door information file

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 178

               formats: CHAIN.TXT, EXITINFO.BBS, PC-Board/GAP and Wildcat style
               DOOR.SYS, SFDOORS.DAT or CALLINFO.BBS.



-------------------------------------------------------------------------------
user_sex       char od_control.user_sex;

               This variable contains a single character representing the
               gender of the user that is currently online. This variable will
               contain an upper-case 'F' if the user is female, and an upper-
               case 'M' if the user is male. This variable is available under
               systems that produce a CHAIN.TXT or RA 2.x style EXITINFO.BBS
               file.



-------------------------------------------------------------------------------
user_subdate   char od_control.user_subdate[9];

               This variable is a string, in the same format as the
               od_control.user_lastdate variable, which stores the date of
               expiry of the user's subscription to the BBS. This variable is
               only available under systems which produce a PC-Board/GAP and
               Wildcat style DOOR.SYS or RA 1.00 and later style extended
               EXITINFO.BBS door information file.



-------------------------------------------------------------------------------
user           int od_control.user_timelimit;
_timelimit
               This variable contains the amount of time, in minutes, that the
               user has left in the door. Note that this value may or may not
               be equal to the total amount of time that the user has left on
               the BBS, depending upon whether the BBS or a third-party door
               manager program only allows a limited amount of time in this
               door. This variable contains a valid value after od_init() or
               some OpenDoors function has been called. OpenDoors uses this
               variable to keep track of how much time the user has left in the
               door, and will automatically warn the user when nearly all of
               his or her time has been used up. OpenDoors will also force the
               user out of the door when their time in the door has expired.
               OpenDoors automatically subtracts one minute from this variable
               every minute that OpenDoors is active, unless chat mode has been
               activated (in which case the user's time will freeze), and also
               adjusts the value of this variable when the sysop uses the time
               adjustment function keys. Hence, you will not normally have any
               need to alter the value of this variable yourself. However,
               there may be some cases in which you wish to subtract a penalty
               or add a bonus to the user's time, such as in a "timebank" door
               or a door game that permits the user to "gamble time".
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 179


               Depending on which BBS system your door is running under, the
               value of this variable may or may not effect the user's time
               left upon return to the BBS. The BBS system will either reset
               the user's time to the value re-written to the door information
               file (this variable), or will always subtract the amount of time
               spent in the door from the user's remaining time.

               This variable is available under all door information file
               formats.



-------------------------------------------------------------------------------
user           unsigned int od_control.user_todayk;
_todayk
               This variable contains the total kilobytes of files that the
               current user has downloaded from the BBS during the current day,
               and is available under systems that produce EXITINFO.BBS, PC-
               Board/GAP and Wildcat style DOOR.SYS, or SFDOORS.DAT format door
               information files.



-------------------------------------------------------------------------------
user_upk       unsigned int od_control.user_upk;

               This variable contains the total kilobytes of files that the
               current user has uploaded to the BBS, and is available under
               systems that produce EXITINFO.BBS, Wildcat style DOOR.SYS or
               SFDOORS.DAT files.



-------------------------------------------------------------------------------
user_uploads   unsigned int od_control.user_uploads;

               This variable contains the total number of files that the
               current user has uploaded to the BBS, and is available under
               systems that produce EXITINFO.BBS, PC-Board/GAP and Wildcat
               style DOOR.SYS, or SFDOORS.DAT format door information files.



-------------------------------------------------------------------------------
user           char od_control.user_wantchat;
_wantchat
               This variable is a Boolean value which indicates whether or not
               the user wishes to chat with the sysop (ie, the user has paged
               the sysop, but has yet to receive a chat with the sysop). This
               variable is used under all door information file formats.
               However, changes to this variable are only reflected on the BBS
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 180

               when the door is running under a system that produces an
               EXITINFO.BBS door information file.

               This variable is automatically turned on (ie., set to TRUE),
               when the user begins to page the sysop for chat, within the
               od_page() function, and is automatically turned off (ie., set to
               FALSE), when the sysop breaks in for chat via the chat function
               key. Also, setting this variable to TRUE will turn on the
               flashing want-chat indicator on the OpenDoors status line.


-------------------------------------------------------------------------------
user           unsigned int od_control.user_xi_record;
_xi_record
               This variable contains the number of the user's record in the
               USERXI.BBS file, if any. This variable is only available under
               system that produce a Remote Access 1.00 and later style
               extended door information file.


































===============================================================================
OpenDoors 6.00 Manual                                          End of Page 181

CONTROL STRUCTURE - DOOR SETTINGS
-------------------------------------------------------------------------------

               This section deals with those variables in the OpenDoors control
               structure which reflect the current door settings. These
               variables are as follows:

               od_cur_attrib            The current display attribute, or -1 if
                                        unknown.

               od_okaytopage            Controls whether the user is currently
                                        permitted to page the sysop.

               od_pageendmin            End of valid paging hours.

               od_pagestartmin          Start of valid paging hours.

               od_silent_mode           Turns off local user interface.

               od_user_keyboard_on      Controls whether OpenDoors will
                                        currently accept input from the remote
                                        user's keyboard.

               od_update_status_now     Forces immediate update of the status
                                        line.

               sysop_next               Indicates whether or not the sysop has
                                        reserved use of the system after the
                                        current calls.



-------------------------------------------------------------------------------
od_cur         int od_control.od_cur_attrib;
_attrib
               This read-only values stores the current display color
               attribute, or the value -1 if the current display color is
               unknown (such as when the door first begins execution).



-------------------------------------------------------------------------------
od             char od_control.od_okaytopage;
_okaytopage
               This variable allows you to control whether or not the user is
               currently permitted to page the sysop via the od_page()
               function. A value of PAGE_ENABLE indicates that paging is
               currently permitted, regardless of the sysop page hours setting.
               A value of PAGE_DISABLE indicates that paging is not current
               permitted. A value of PAGE_USE_HOURS indicates that the
               od_page() function should check the values of the

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 182

               od_pagestartmin and od_pageendmin variables in order to
               determine whether or not paging should be permitted.
               The od_okaytopage variable should only be set after you call
               od_init() or some other OpenDoors function. The default value is
               PAGE_USE_HOURS. For more information on the od_page() function
               itself, see page 101.



-------------------------------------------------------------------------------
od             unsigned int od_control.od_pageendmin;
_pageendmin
               This variable can be used to set the beginning of valid sysop
               paging hours within the od_page() function. If the
               od_control.od_okaytopage variable (which is described above) is
               set to MAYBE, then OpenDoors will check the value of this
               variable prior to paging the sysop via the od_page() function.
               This variable should contain the time at which the valid sysop
               paging hours end, represented as the a number of minutes since
               midnight. For more information on the od_page() function itself,
               see page 101.



-------------------------------------------------------------------------------
od             unsigned int od_control.od_pagestartmin;
_pagestartmin
               This variable can be used to set the beginning of valid sysop
               paging hours within the od_page() function. If the
               od_control.od_okaytopage variable (which is described above) is
               set to MAYBE, then OpenDoors will check the value of this
               variable prior to paging the sysop via the od_page() function.
               This variable should contain the time at which the valid sysop
               paging hours begin, represented as the a number of minutes since
               midnight. For more information on the od_page() function itself,
               see page 101.



-------------------------------------------------------------------------------
od_silent      BOOL od_control.od_silent_mode;
_mode
               If this variable is set to TRUE prior to the first call to any
               OpenDoors function, OpenDoors will operate in silent mode, where
               the local display and sysop commands are not used. Silent mode
               is automatically disabled if the program is running in local
               mode.





===============================================================================
OpenDoors 6.00 Manual                                          End of Page 183

-------------------------------------------------------------------------------
od_update      char od_control.od_update_status_now;
_status_now
               Setting this variable to TRUE forces OpenDoors to update the
               status line during the next od_kernel() execution. When the
               status line is updated, this variable is reset to its default
               value of FALSE.



-------------------------------------------------------------------------------
od_user        char od_control.od_user_keyboard_on;
_keyboard_on
               This variable is a Boolean value, indicating whether OpenDoors
               will currently accept input from a remote user. OpenDoors
               provides a function key (usually [ALT]-[K], unless you have
               changed the default), which will allow the sysop to temporarily
               prevent the user from having any control over the door. When the
               sysop activates this feature, a flashing [Keyboard-Off]
               indicator will appear on the status line, and this variable will
               be set to FALSE. When the sysop presses the [ALT]-[K]
               combination a second time, to toggle the user's keyboard back
               on, the flashing indicator will disappear, and this variable
               will be set back to TRUE.



-------------------------------------------------------------------------------
sysop_next     char od_control.sysop_next;

               This variable is a Boolean value, indicating whether or not the
               "sysop next" feature has been activated. The "sysop next"
               feature, which reserves the system for the sysop after the call
               has ended, can be toggled on and off within OpenDoors by use of
               a function key (Alt-N by default). Also, when the "sysop next"
               feature has been activated, an indicator will appear on the
               OpenDoors status line. This variable is only available under
               systems that produce an SFDOORS.DAT or RA 1.00 and later style
               extended EXITINFO.BBS door information file. For more
               information on testing the type of door information file
               available, please see page 158.











===============================================================================
OpenDoors 6.00 Manual                                          End of Page 184

CONTROL STRUCTURE - DIAGNOSTICS
-------------------------------------------------------------------------------

               To help in diagnosing problems in your OpenDoors programs,
               OpenDoors stores information on the most recent error which
               occurred. When any of the OpenDoors functions return an "error"
               or "failure" state, the reason for this failure is recorded.

               The following OpenDoors control structure variable provides
               diagnostics information:

               od_error                 Stores a "reason code" for the last
                                        failed OpenDoors API function call.




-------------------------------------------------------------------------------
od_error       int od_control.od_error;

               When any of the OpenDoors API functions return an "error" or
               "failure" state (usually denoted by either of the values FALSE
               or NULL), the reason for the failure is recorded in this
               variable. Since successful function calls do not alter the value
               of the od_control.od_error variable, you must be careful not
               only to check the value of the od_control.od_error variable, but
               also to check the OpenDoors function return codes, in order to
               determine which function failed.

               This variable will always store the reason for the most recent
               function call failure, or ERR_NONE if no functions have failed.
               od_error may take on any of the following values:

                    ERR_NONE            Indicates that no error has occurred
                                        yet.

                    ERR_MEMORY          Function was unable to allocate
                                        required memory. This usually indicates
                                        that there is not enough available
                                        memory. This failure may also be due to
                                        memory corruption caused by your
                                        program inadvertently overwriting heap
                                        structures. If your program has been
                                        compiled in either the small or the
                                        medium memory model, try recompiling it
                                        in the compact, large, or huge memory
                                        models. If your program is already
                                        compiled in the compact, large, or huge
                                        memory models, try making more system
                                        memory available to your program.


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 185

                    ERR_NOGRAPHICS      This setting indicates that the
                                        function called requires ANSI, AVATAR
                                        or RIP graphics mode, but none of these
                                        modes are active.

                    ERR_PARAMETER       An invalid parameter was passed to an
                                        OpenDoors functions. Check the
                                        function's description in chapter four,
                                        to determine the required values for
                                        each function parameter.

                    ERR_FILEOPEN        OpenDoors was unable to open a file.
                                        This can be due to the specified
                                        filename not existing, due to the file
                                        being locked for exclusive access by
                                        another process, or due to a hardware
                                        failure.

                    ERR_FILEREAD        OpenDoors was able to open the
                                        specified file, but unable to read the
                                        required data from the file. This error
                                        may be due to an invalid file format,
                                        due to a portion of the file being
                                        locked by another process, or due to a
                                        hardware failure.

                    ERR_LIMIT           An internal function limit has been
                                        exceeded. Refer to the function's
                                        description in chapter four for
                                        information on the function's
                                        limitations.

                    ERR_NOREMOTE        Indicates that a function has been
                                        called which is not valid in local
                                        mode, such as od_carrier() or
                                        od_set_dtr().
















===============================================================================
OpenDoors 6.00 Manual                                          End of Page 186

CONTROL STRUCTURE - OPENDOORS CUSTOMIZATION
-------------------------------------------------------------------------------

               The OpenDoors control structure provides many variables which
               allow you to customize OpenDoor's behavior and appearance. These
               customization variables fit into one of the following
               categories:

                         General Behavior Customization Variables
                         Sysop Function Keys Customization Variables
                         Color Customization Variables
                         Language-Specific Prompts Customization Variables

               This section deals with those variables that fit into the first
               category, "General Behavior Customization Variables". The other
               categories are dealt with in the following sections of this
               chapter.

               Below is a brief overview of the variables grouped into this
               section of the OpenDoors control structure. Following the
               overview is a detailed description of each of these variables.


               od_app_icon              Program icon for Win32 version.

               od_box_chars             Array of characters used by the
                                        od_draw_box() function.

               od_before_exit           Function to call prior to exiting.

               od_cafter_chat           Function to call after sysop chat.

               od_cafter_shell          Function to call after DOS shell.

               od_cbefore_chat          Function to call prior to sysop chat.

               od_cbefore_shell         Function to call prior to DOS shell.

               od_cfg_lines             Sets the configuration file's custom
                                        door information file line keywords.

               od_cfg_text              Sets the built-in configuration file
                                        keywords that OpenDoors will recognize.

               od_chat_active           Controls whether or not sysop chat mode
                                        is active.

               od_clear_on_exit         Controls whether the screen is cleared
                                        upon door exit.



===============================================================================
OpenDoors 6.00 Manual                                          End of Page 187

               od_color_delimiter       Indicates what character should delimit
                                        imbedded color codes for the
                                        od_printf() function.

               od_color_names           Strings which OpenDoors recognizes as
                                        the names of various text colors.

               od_config_file           Used to enable or disable the OpenDoors
                                        configuration file system.

               od_config_filename       Sets the filename that will be read by
                                        the configuration file system.

               od_config_function       The callback function that OpenDoors
                                        will call to allow your program to
                                        process custom configuration file
                                        entries.

               od_default_personality   Sets the default personality to be used
                                        with the OpenDoors Multiple Personality
                                        System, and also sets the personality
                                        to use when the MPS is not active.

               od_default_rip_win       Whether OpenDoors should use the
                                        default 43-line RIP window for ANSI
                                        text (TRUE), or a 23-line window
                                        (FALSE).

               od_disable               Disable OpenDoors activities such as
                                        reading door information file and
                                        monitoring carrier detect / remaining
                                        time.

               od_disable_dtr           Specifies the string that will be sent
                                        to the modem to prevent the modem from
                                        hanging up when DTR is lowered.

               od_emu_simluate_modem    Simulates modem display speed for
                                        emulation functions such as
                                        od_send_file(), od_disp_emu() and
                                        od_hotkey_menu().

               od_errorlevel            Sets the errorlevel OpenDoors exits
                                        with under various conditions.

               od_force_local           Forces door to operate in local mode,
                                        ignoring any door information file and
                                        using default user settings.

               od_help_callback         Allows you to provide a help menu item
                                        under the Win32 version of OpenDoors

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 188

               od_in_buf_size           Sets size of OpenDoor's internal
                                        local/remote inbound buffer.

               od_inactive_warning      Number of seconds before hanging up
                                        that OpenDoors displays the inactivity
                                        timeout warning.

               od_inactivity            Controls user inactivity timeout.

               od_ker_exec              Is called whenever od_kernel()
                                        executes.

               od_last_input            Indicates whether the last input came
                                        from the remote user (==0) or the local
                                        sysop (==1).

               od_list_pause            Controls whether or not the user may
                                        pause display within the
                                        od_list_files() and od_send_file()
                                        functions by using the [P] key.

               od_list_stop             Controls whether or not the user may
                                        terminate display within the
                                        od_list_files() and od_send_file()
                                        functions using [S], [CTRL]-[K], etc.

               od_logfile               Enables or disables the OpenDoors log
                                        file system.

               od_logfile_disable       Prevents the logfile from being opened,
                                        even if the logfile is enabled by
                                        od_logfile.

               od_logfile_messages      Array of message strings that OpenDoors
                                        will use when writing log file entries.

               od_logfile_name          Contains the filename and possibly path
                                        of the logfile.

               od_maxtime               Indicates the maximum length of time
                                        any user is permitted to use the door.

               od_maxtime_deduction     Indicates the amount of time that has
                                        temporarily been taken away from the
                                        user's remaining time, as a result of
                                        the maximum door time setting.

               od_mps                   Enables or disables the OpenDoors
                                        Multiple Personality System.

               od_no_file_func          Called when no door information file
                                        can be read.
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 189


               od_no_ra_codes           Disables translation of RA/QBBS control
                                        codes.

               od_nocopyright           Prevents OpenDoors from displaying it's
                                        name and version number when a door
                                        program begins execution.

               od_noexit                Prevents OpenDoors from exiting when
                                        the od_exit() function is called.

               od_page_len              Controls length of the sysop page beep.

               od_page_pausing          Enables or disables page pausing in
                                        od_send_file(), od_hotkey_menu() and
                                        od_list_files() functions.

               od_page_startmin         Indicates the time of day at which
                                        sysop paging is first enabled.

               od_page_statusline       Which status line (if any) is activated
                                        when the user pages the sysop.

               od_page_endmin           Indicates the time of day at which
                                        sysop paging is disabled.

               od_prog_name             Stores the name of your program.

               od_prog_version          Stores the version number of your
                                        program.

               od_prog_copyright        Place your copyright information here.

               od_reg_key               Stores the registration key that you
                                        receive when purchasing OpenDoors.

               od_reg_name              Stores your name or your companies name
                                        when you have purchased an OpenDoors
                                        license (registration).

               od_spawn_freeze_time     Indicates whether the user's time
                                        remaining continues to be decreased
                                        during the execution of the
                                        od_spawn...() functions (FALSE), or if
                                        the timer should be "frozen" (TRUE).

               od_swapping_disable      Disables swapping during DOS shell and
                                        od_spawn...() functions.

               od_swapping_noems        Prevents swapping form being done to
                                        EMS expanded memory.

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 190

               od_swapping_path         Location where disk swap file should be
                                        created.

               od_status_on             Controls whether the status line sub-
                                        system is active.

               od_time_msg_func         Called instead of displaying time limit
                                        warning messages.




-------------------------------------------------------------------------------
od_app         HICON od_control.od_app_icon;
_icon
               Normally, the Win32 version of OpenDoors displays its own icon
               on the application title bar, on the Windows taskbar, and in the
               help|about dialog box. You can supply your own icon by setting
               this variable to point to the handle of the icon, as returned by
               LoadIcon();



-------------------------------------------------------------------------------
od_box         char od_control.od_box_chars[8];
_chars
               This variable allows you to specify which character the
               od_draw_box() function uses in drawing the boarder of a window.
               The elements of this array are as follows:

               od_box_chars[BOX_UPPERLEFT]  - Upper left corner of box
               od_box_chars[BOX_TOP]        - Top horizontal line
               od_box_chars[BOX_UPPERRIGHT] - Upper right corner of box
               od_box_chars[BOX_LEFT]       - Left Vertical line
               od_box_chars[BOX_LOWERLEFT]  - Lower left corner of box
               od_box_chars[BOX_LOWERRIGHT] - Lower right corner of box
               od_box_chars[BOX_BOTTOM]     - Bottom horizontal line
               od_box_chars[BOX_RIGHT]      - Right horizontal line



-------------------------------------------------------------------------------
od_before      void (*od_control.od_before_exit)();
_exit
               This variable contains a pointer to a function which OpenDoors
               should call prior to exiting, or NULL if you do not wish to have
               any function called at exit time. For an example of the use of
               this variable, see the description of the EX_VOTE.C example
               program, which begins on page 38.



===============================================================================
OpenDoors 6.00 Manual                                          End of Page 191

-------------------------------------------------------------------------------
od_cafter      void (*od_control.od_cafter_chat)();
_chat
               The function pointed to by this variable will be called after
               sysop chat mode has ended. This may be useful for allowing you
               to save the user's screen contents prior to chat, and restoring
               the afterwards. If this variable contains its default value of
               NULL, no function will be called. To alter the string of text
               which is displayed after sysop chat, see the
               od_control.od_after_chat variable, which is described in the
               section on the prompts customization portion of the control
               structure.



-------------------------------------------------------------------------------
od_cafter      void (*od_control.od_cafter_shell)();
_shell
               The function pointed to by this variable will be called after
               the sysop has returned from a DOS shell. If this variable
               contains its default value of NULL, no function will be called.
               To alter the string of text which is displayed after a DOS
               shell, see the od_control.od_after_shell variable, which is
               described in the section on the prompts customization portion of
               the control structure.



-------------------------------------------------------------------------------
od_cbefore     void (*od_control.od_cbefore_chat)();
_chat
               The function pointed to by this variable will be called prior to
               entering sysop chat mode. This may be useful for allowing you to
               save the user's screen contents prior to chat, and restoring the
               afterwards. If this variable contains its default value of NULL,
               no function will be called. To alter the string of text which is
               displayed prior to sysop chat, see the od_control.od_before_chat
               variable, which is described in the section on the prompts
               customization portion of the control structure. To replace the
               OpenDoors sysop chat facility with your own, simply activate
               your chat mode when this function is called. Your chat mode
               facility should remain active until OpenDoors sets the
               od_control.od_chat_active variable to FALSE. If you wish to
               terminate chat mode prior to this variable being set to FALSE,
               you should set this variable to FALSE yourself if you do not
               wish OpenDoors to activate its own chat mode.






===============================================================================
OpenDoors 6.00 Manual                                          End of Page 192

-------------------------------------------------------------------------------
od_cbefore     void (*od_control.od_cbefore_shell)();
_shell
               The function pointed to by this variable will be called prior to
               executing a sysop DOS shell. If this variable contains its
               default value of NULL, no function will be called. To alter the
               string of text which is displayed before a DOS shell, see the
               od_control.od_before_shell variable, which is described in the
               section on the prompts customization portion of the control
               structure.



-------------------------------------------------------------------------------
od_cfg_lines   char od_control.cfg_lines[25][33];

               This array contains the strings for the keywords that represent
               various lines in the definition of a custom door information
               file. Each keyword must be 32 character or less in length. These
               keywords are not case sensitive. See page 230 for more
               information on defining custom door information (drop) file
               formats. The default values for this array are as follows:

                    [0]  "Ignore"
                    [1]  "ComPort"
                    [2]  "FossilPort"
                    [3]  "ModemBPS"
                    [4]  "LocalMode"
                    [5]  "UserName"
                    [6]  "UserFirstName"
                    [7]  "UserLastName"
                    [8]  "Alias"
                    [9]  "HoursLeft"
                    [10] "MinutesLeft"
                    [11] "SecondsLeft"
                    [12] "ANSI"
                    [13] "AVATAR"
                    [14] "PagePausing"
                    [15] "ScreenLength"
                    [16] "ScreenClearing"
                    [17] "Security"
                    [18] "City"
                    [19] "Node"
                    [20] "SysopName"
                    [21] "SysopFirstName"
                    [22] "SysopLastName"
                    [23] "SystemName"
                    [24] "RIP"

               If you wish to change any of these variable, you must do so
               before calling any OpenDoors functions.

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 193



-------------------------------------------------------------------------------
od_cfg_text    char od_control.od_cfg_text[47][33];

               This array of strings contains the built-in configuration file
               keywords that are recognized by OpenDoors. These keywords may be
               up to 32 characters in size, and are not case sensitive. If you
               wish to change any of these settings, you must do so before
               calling any OpenDoors functions. The default values for this
               array are as follows:

                    [0]  "Node"
                    [1]  "BBSDir"
                    [2]  "DoorDir"
                    [3]  "LogFileName"
                    [4]  "DisableLogging"
                    [5]  "SundayPagingHours"
                    [6]  "MondayPagingHours"
                    [7]  "TuesdayPagingHours"
                    [8]  "WednesdayPagingHours"
                    [9]  "ThursdayPagingHours"
                    [10] "FridayPagingHours"
                    [11] "SaturdayPagingHours"
                    [12] "MaximumDoorTime"
                    [13] "SysopName"
                    [14] "SystemName"
                    [15] "SwappingDisable"
                    [16] "SwappingDir"
                    [17] "SwappingNoEMS"
                    [18] "LockedBPS"
                    [19] "SerialPort"
                    [20] "CustomFileName"
                    [21] "CustomFileLine"
                    [22] "InactivityTimeout"
                    [23] "PageDuration"
                    [24] "ChatUserColor"
                    [25] "ChatSysopColor"
                    [26] "FileListTitleColor"
                    [27] "FileListNameColor"
                    [28] "FileListSizeColor"
                    [29] "FileListDescriptionColor"
                    [30] "FileListOfflineColor"
                    [31] "Personality"
                    [32] "NoFossil"
                    [33] "PortAddress"
                    [34] "PortIRQ"
                    [35] "ReceiveBuffer"
                    [36] "TransmitBuffer"
                    [37] "PagePromptColor"
                    [38] "LocalMode"
                    [39] "PopupMenuTitleColor"
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 194

                    [40] "PopupMenuBorderColor"
                    [41] "PopupMenuTextColor"
                    [42] "PopupMenuKeyColor"
                    [43] "PopupMenuHighlightColor"
                    [44] "PopupMenuHighKeyColor"
                    [45] "NoFIFO"
                    [46] "FIFOTriggerSize"
                    [47] "DiableDTR"
                    [48] "NoDTRDisable"



-------------------------------------------------------------------------------
od_chat        char od_control.od_chat_active;
_active
               This variable is set to TRUE when sysop chat mode is active, and
               is set to FALSE when sysop chat mode is not active. This
               variable can be used to determine whether or not chat mode is
               active, and to force chat mode to end. When the sysop presses
               the chat mode key ([ALT]-[C] if the default personality is being
               used) while chat mode is active, this variable is set to FALSE.



-------------------------------------------------------------------------------
od_clear       char od_control.od_clear_on_exit;
_on_exit
               This variable contains a Boolean value, which indicates whether
               or not you wish OpenDoors to clear the screen prior to exiting.
               This variable defaults to a value of TRUE, which causes the
               screen to be cleared when a door program exits. However, you may
               wish to set this variable to a value of FALSE, which will cause
               the contents of the screen to remain unchanged when the door
               exits. While setting this variable to FALSE will probably result
               in a messy display if the door is to return control to a batch
               file, if the door returns directly to the BBS, it will result in
               a smoother transition from the door back to the BBS (as the
               sysop is not left with a blank screen). If your door has a
               configuration file or configuration program, you may wish to
               have an option which will allow the individual sysop to
               determine whether or not the screen should be cleared when the
               door exits.



-------------------------------------------------------------------------------
od_color       char od_control.od_color_delimiter;
_delimiter
               This variable sets the character that is used to delimit color
               codes in the od_printf() function, and defaults to the back-
               quote (`) character. If you wish to be able to display the back-
               quote (`) character using the od_printf() function, and thus
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 195

               wish to use a different character to delimit color codes in the
               od_printf() function, simply set this variable to the
               alternative character you wish to use. If you wish to disable
               the imbedded color codes feature of the od_printf() function,
               simply set this variable to a value of zero. For more
               information on od_printf() imbedded color codes, see the
               description of the od_printf() function, which begins on page
               110.



-------------------------------------------------------------------------------
od_color       char od_control.od_color_names[12][33];
_names
               This array sets the strings that OpenDoors will recognize as
               color description keywords. These are the keywords that can be
               imbedded in od_printf() format strings, and are also the
               keywords that can be used to change color settings in the
               OpenDoors configuration file. If you wish to change these
               keywords, you will normally do so before calling any OpenDoors
               functions. These keywords should always be supplied in upper-
               case characters. The defaults values for this array are as
               follows:

                    [0]  "BLACK"
                    [1]  "BLUE"
                    [2]  "GREEN"
                    [3]  "CYAN"
                    [4]  "RED"
                    [5]  "MAGENTA"
                    [6]  "YELLOW"
                    [7]  "WHITE"
                    [8]  "BROWN"
                    [9]  "GREY"
                    [10] "BRIGHT"
                    [11] "FLASHING"



-------------------------------------------------------------------------------
od_config      void (*od_control.od_config_file)(void);
_file
               Set this variable to INCLUDE_CONFIG_FILE to enable the OpenDoors
               configuration file system, or set it to NO_CONFIG_FILE to
               disable the configuration file system. This variable should only
               be set prior to your first call to an OpenDoors function. For
               more information on the OpenDoors configuration file system, see
               page 224.




===============================================================================
OpenDoors 6.00 Manual                                          End of Page 196

-------------------------------------------------------------------------------
od_config      char *od_control.od_config_filename;
_filename
               If set, this variable should point to a string containing the
               filename that you wish the OpenDoors configuration file system
               to read. If this variable has its default value of NULL, the
               filename DOOR.CFG will be used by default.



-------------------------------------------------------------------------------
od_config      void (*od_control.od_config_function)(char *keyword, char
_function      *options);

               If set, this variable should point to the function that
               OpenDoors should call when lines with unrecognized keywords are
               encountered in the configuration file. This allows you to add
               your own configuration file keywords. The first parameter to
               this function will be a pointer to a string containing the
               unrecognized keywords, and the second parameter will be a
               pointer to a string containing any options that were specified
               after the keyword. If no options were specified after the
               keyword, this string will have a length of 0.



-------------------------------------------------------------------------------
od_default     void (*od_control.od_default_personality)(unsigned char
_personality   operation);

               This variable sets the default personality that OpenDoors will
               use if the multiple personality system is active. If the
               multiple personality system is not active, the personality set
               by this variable will be the only personality available. This
               variable should only be set prior to calling an OpenDoors
               function. This variable can be set to point to your own
               personality function, or it can be set to one of the manifest
               constants that represent one of the built-in personalities:

                    PER_OPENDOORS
                    PER_PCBOARD
                    PER_RA
                    PER_WILDCAT

               For more information on the OpenDoors Multiple Personality
               System, see page 230.






===============================================================================
OpenDoors 6.00 Manual                                          End of Page 197

-------------------------------------------------------------------------------
od_default     char od_control.od_default_rip_win;
_rip_win
               This variable defaults to FALSE. When set to FALSE, OpenDoors
               resets the RIP text window to a 23-line window that is most
               appropriate for doors that support both RIP-graphics and non-RIP
               mode. When this variable is set to TRUE, OpenDoors will use the
               default sized text output window, 43 lines in size.



-------------------------------------------------------------------------------
od_disable          unsigned int od_control.od_disable;

               This variable is a bit-mapped flag which can be used to disable
               certain OpenDoors features which are normally active, in order
               to allow for maximum customization of OpenDoors. Each bit of
               this variable represents a different feature that can be
               disabled. To DISABLE a feature, you set the bit that corresponds
               to the particular feature. To ENABLE the feature, the bit is
               reset. Each bit is represented by a keyword, as follows:

               DIS_INFOFILE - Setting the DIS_INFOFILE bit of the
                    od_control.od_disable variable allows you to prevent
                    OpenDoors from reading or re-writing a door information
                    file. If you wish to disable OpenDoors' reading of the door
                    information file, you must  do so prior to calling
                    od_init() or any other OpenDoors door-driver functions. At
                    the same time, you must also manually set any required
                    variables that are normally set by the information obtained
                    from the door information file, such as the comm port
                    number, baud rate, user name, and so on. You may wish to
                    disable reading of the door information file in a number of
                    cases. For example, you may wish to manually read another
                    format of door information file not supported by OpenDoors,
                    or to obtain the necessary door information from your
                    program's command line. Also, if you are using OpenDoors to
                    write a non-door communications program, such as a terminal
                    program, you want to prevent OpenDoors from attempting to
                    read a door information file on startup.

               DIS_CARRIERDETECT - Setting this bit allows you to prevent
                    OpenDoors from exiting when it the carrier detect signal
                    from the modem disappears. This bit may be set or rest at
                    any time. If you use this bit to disable OpenDoors' carrier
                    detection, you will probably want to monitor the state of
                    the carrier detect signal yourself, using the od_carrier()
                    function, which is described on page 51.

               DIS_TIMEOUT - This flag allows you to prevent OpenDoors from
                    exiting when the user runs out of time. As with the
                    DIS_CARRIERDETECT flag, you may set or reset this bit at
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 198

                    any time. You will most often want to use this setting when
                    writing a non-door program, which you would not want to
                    have exit after a particular amount of time has elapsed. Be
                    sure that you do not confuse this flag with the user's
                    inactivity timeout. To disable the inactivity timeout, set
                    the do_control.od_inactivity variable to 0.

               DIS_LOCAL_OVERRIDE - This setting affects OpenDoors' behavior
                    when a locked BPS rate is specified in the configuration
                    file, and another BPS rate is specified in the door
                    information file. By default, OpenDoors will initialize the
                    modem at the BPS rate specified in the configuration file,
                    unless the BPS rate specified in the door information file
                    is 0. In this case, the 0 BPS rate is used to indicate that
                    the door is operating in local mode, and will override the
                    BPS rate specified in the configuration file. Setting this
                    flag disables the local mode override, causing the modem to
                    always be initialized at the locked BPS rate, even when the
                    door information file specifies that local mode should be
                    used.

               DIS_BPS_SETTING - When used with a FOSSIL driver, OpenDoors
                    normally changes the BPS rate to that passed from the BBS
                    (if the BBS passes a valid FOSSIL BPS rate). Setting the
                    DIS_BPS_SETTING flag disables this BPS rate setting.

               DIS_LOCAL_INPUT -  The local keyboard may be disabled by setting
                    this bit. This only affects the sysop's input in
                    circumstances that input is also accepted from the remote
                    user; this setting has no effect on the sysop function
                    keys.

               DIS_SYSOP_KEYS - This setting also disables the local keyboard.
                    However, unlike the DIS_LOCAL_INPUT, this function disables
                    both sysop function keys and door input from the local
                    keyboard.

               DIS_DTR_DISABLE - This setting prevents OpenDoors from
                    disabiling DTR response from the modem. Even if not
                    specified, OpenDoors only disables DTR response in the when
                    exiting under the Win32 version if an open serial port
                    handle was not provided to OpenDoors at startup.

               DIS_NAME_PROMPT - Prevents OpenDoors from prompting for a user
                    name when operating in automatic local mode (by setting
                    od_force_local to TRUE or specifying -local on the command
                    line).

               Note that in order to disable the OpenDoors status line, the
               od_control.od_status_on variable is used, instead of the
               od_disable variable. You may also disable the user's inactivity
               timeout by setting the od_control.od_inactivity variable to 0.
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 199

               The od_control.od_status_on variable is described later in this
               section.



-------------------------------------------------------------------------------
od_disable_    char od_control.od_disable_dtr[40];
dtr
               Unles the DIS_DTR_DISABLE od_disable flag is set, the Win32
               version of OpenDoors will attempt to disable DTR response by the
               modem when closing the serial port, if the serial port was
               opened by OpenDoors. This is done by sending a series of
               commands to the modem, and possibly waiting for responses to the
               command. The string format specifies each command, followed by
               the required response. The command and response is separated by
               a single space character. If no response is required between two
               commands, then those commands may be separated by two space
               characters. A '|' character is translated into a carriage
               return, and a '~' character is translated into a one second
               pause. The default value of this string is "~+++~  AT&D0  ATO".



-------------------------------------------------------------------------------
od_emu_        BOOL od_control.od_emu_simulate_modem;
simulate_modem
               When this flag is set to its default value of FALSE, the
               OpenDoors terminal emulator displays text at full speed. When
               this flag is set to TRUE, the emulation functions will display
               text at approximately the same speed as it would be displayed
               when sent over the modem, based on the current connect speed. In
               local mode, an average modem speed of 9600bps is assumed. This
               allows animations to be displayed locally at the same speed as
               they would appear on the remote system. This switch affects the
               following functions:
                    od_disp_emu()
                    od_send_file()
                    od_hotkey_menu()



-------------------------------------------------------------------------------
od             unsigned char od_control.od_errorlevel[8];
_errorlevel
               Allows you to configure the errorlevel (program exit code) which
               OpenDoors exits with under various circumstances. The elements
               of this array are as follows:





===============================================================================
OpenDoors 6.00 Manual                                          End of Page 200

               [ERRORLEVEL_ENABLE]     Enables or disables custom errorlevels
               [ERRORLEVEL_CRITICAL]   Critical error errorlevel
               [ERRORLEVEL_NOCARRIER]  Carrier lost errorlevel
               [ERRORLEVEL_HANGUP]     Sysop manually terminated call
               [ERRORLEVEL_TIMEOUT]    User time expired errorlevel
               [ERRORLEVEL_INACTIVITY] Keyboard inactivity timeout errorlevel
               [ERRORLEVEL_DROPTOBBS]  Sysop returned user to BBS errorlevel
               [ERRORLEVEL_NORMAL]     Door has exited normally

               If you wish to override the default errorlevels used by
               OpenDoors, you should set element [ERRORLEVEL_ENABLE] of this
               array to TRUE, and set the remaining array elements to the
               appropriate errorlevels. Note that the settings in this array
               only affect the errorlevels which OpenDoors uses when it causes
               the door to exit for one of the reasons listed above. This
               setting has no effect on the errorlevel returned when your
               program explicitly exits by calling the od_exit() function, or
               your program returns by calling exit() or returning from the
               main() function.



-------------------------------------------------------------------------------
od             char od_control.od_force_local;
_force_local
               This variable defaults to FALSE, which causes OpenDoors to
               behave normally. When this variable is set to TRUE prior to
               calling od_init() or any other OpenDoors functions, OpenDoors
               will operate in local mode. In this case, no door information
               file will be read. Also, the user name will be used if
               od_control.user_name has not been set prior to calling od_init()
               or the first OpenDoors function.

               The default OpenDoors settings when od_control.od_force_local is
               set are as follows:

               - ANSI mode is on
               - Time limit is 60 minutes
               - User's location is the name of the BBS, or "Unknown Location"
               otherwise if BBS name is not known.
               - User name is set to sysop's name ("Sysop" if no sysop name is
               specified in the configuration file).

               You may wish to add a "-local" type parameter to your program's
               command line, which will permit the sysop to easily operate the
               door in local mode, as an interface to the
               od_control.od_force_local setting.



-------------------------------------------------------------------------------
od_help        void (*od_control.od_help_callback)(void);
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 201

_callback
               If this variable is set to a non-NULL value, the Win32 version
               of OpenDoors will provide a Contents item on the help menu, and
               call the function pointed to by this variable when the user
               chooses the Contents menu item.



-------------------------------------------------------------------------------
od_in_buf      unsigned int od_control.od_in_buf_size;
_size
               Specifies the size, in characters, of the OpenDoor's internal
               local/remote inbound buffer size. Two bytes of storage are
               required for each character in this buffer. This variable should
               only be changed prior to calling od_init() or the first
               OpenDoors function. If not set, this variable defaults to a
               value of 256.

               The buffer corresponding to this variable should not be confused
               with the FOSSIL or internal communications receive buffer (which
               is set by od_control.od_com_rx_buf). Unlike the serial I/O
               receive buffer, which is used only for characters received from
               the remote system, this buffer serves as a queue for input from
               both the remote system and the local keyboard. If you find that
               characters are lost when information is being set to your door
               from the user, you may wish to increase the size of this buffer.



-------------------------------------------------------------------------------
od             unsigned int od_control.od_inactivity;
_inactivity
               OpenDoors has a built in user-inactivity timeout facility, which
               will automatically disconnect a user who appears .to be sleeping
               at the keyboard. If the user has not pressed any keys on their
               keyboard for to great a length of time, they will be warned that
               they are about to be disconnected due to inactivity. If they
               still do not respond after another few seconds, OpenDoors will
               automatically disconnect the user and return control to the BBS
               software. The od_control.od_inactivity variable allows you to
               set the maximum length of time, in seconds, after which the user
               will be disconnected for inactivity. This variable defaults to a
               value of 200 seconds. You may disable OpenDoors' inactivity
               timeout altogether, by setting the od_control.od_inactivity
               variable to a value of 0.







===============================================================================
OpenDoors 6.00 Manual                                          End of Page 202

-------------------------------------------------------------------------------
od_inactive    int od_control.od_inactive_warning.
_warning
               This variable sets the number of seconds prior to hanging up
               that OpenDoors displays the inactivity timeout warning. This
               variable should only be changed after your first call to an
               OpenDoors API function. If not explicitly set by your program,
               this setting defaults to 10 seconds.



-------------------------------------------------------------------------------
od_ker_exec    void (*od_control.od_ker_exec)(void);

               When od_control.od_ker_exec is set to point to a function,
               OpenDoors will call this function whenever od_kernel() executes.
               This provides any easy way for you to perform your own
               processing on a regular basis during door execution. The
               od_control.od_ker_exec variable defaults to NULL.



-------------------------------------------------------------------------------
od_last        char od_control.od_last_input;
_input
               Indicates whether the last key retrieved using the od_get_key()
               function originated from the remote user, or the local sysop. If
               the input originated from the remote, this variable is set to 0.
               If the input originated from the local keyboard, this variables
               is set to 1.



-------------------------------------------------------------------------------
od_list        char od_control.od_list_pause;
_pause
               This variable contains a Boolean value, which allows you to
               control whether or not the user may pause displaying within the
               od_list_files() and od_send_file() function. When this variable
               is set to its default value of TRUE, the user will be able to
               pause the display by pressing the [P] key, and resume display by
               pressing any other key. However, the pause feature may be
               disabled by setting this variable to FALSE.



-------------------------------------------------------------------------------
od_list        char od_control.od_list_stop;
_stop
               This variable contains a Boolean value, which allows you to
               control whether or not the user may abort displaying within the
               od_list_files() and od_send_file() function. When this variable
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 203

               is set to its default value of TRUE, the user will be able to
               pause the display by pressing the [S], [CTRL]-[K] or [CTRL]-[C]
               keys. However, the stop feature may be disabled by setting this
               variable to FALSE.



-------------------------------------------------------------------------------
od_local       void (*od_control.od_local_input)(int);
_input
               If set, this function is called whenever the sysop presses a
               non-sysop-function key on the local keyboard. The key pressed is
               passed to the function in the single int parameter that it
               accepts.



-------------------------------------------------------------------------------
od_logfile     void *(od_control.od_logfile)(void);

               To make the OpenDoors log file system available in your program,
               set this variable to INCLUDE_LOGFILE, prior to calling any
               OpenDoors functions. If not set, or if set to NO_LOGFILE, the
               OpenDoors log file system will not automatically be enabled.



-------------------------------------------------------------------------------
od_logfile     char od_control.od_logfile_disable;
_disable
               This variable defaults to the value of FALSE, unless the
               "LogfileDisable" option is specified in the configuration file,
               in which case the variable will be set to TRUE. If this variable
               is set to TRUE, OpenDoors will not write to a logfile, even if
               the logfile system is enabled using od_control.od_logfile.



-------------------------------------------------------------------------------
od_logfile     char *od_control.od_logfile_messages[14];
_messages
               This array of pointers to strings contains the messages that
               OpenDoors will automatically write to the log file, if the log
               file system is enabled. If you wish to change the settings of
               this array, you should do so before calling any OpenDoors
               functions. The default strings for this array are as follows:

               [0] "Carrier lost, exiting door"
               [1] "System operator terminating call, exiting door"
               [2] "User's time limit expired, exiting door"
               [3] "User keyboard inactivity time limit exceeded, exiting door"
               [4] "System operator returning user to BBS, exiting door"
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 204

               [5] "Exiting door with errorlevel %d,
               [6] "Invoking operating system shell"
               [7] "Returning from operating system shell"
               [8] "User paging system operator"
               [9] "Entering sysop chat mode"
               [10] "Terminating sysop chat mode"
               [11] "%s entering door"
               [12] "Reason for chat: %s"
               [13] "Exiting door"



-------------------------------------------------------------------------------
od_logfile     char od_control.od_logfile_name[80];
_name
               This variable specifies the filename, and optionally the full
               path of the logfile where OpenDoors should perform logging. This
               variable only has an effect when set prior to calling any
               OpenDoors functions. If the log file name is specified in the
               configuration file, that name will be stored in this variable.
               If you do not set this variable, and the log file name is not
               specified in the configuration file, the default name "DOOR.LOG"
               will be used. If you wish to set this variable, you should do so
               prior to calling od_init() or any OpenDoors function.



-------------------------------------------------------------------------------
od_            unsigned int od_control.od_maxtime;
maxtime
               This variable specifies the maximum length of time that any user
               is permitted to use the door, and is normally set from a
               configuration file option. If upon entering the door, the user's
               time remaining online is greater than the od_maxtime setting,
               their time remaining is temporarily decreased to the maximum
               value. Then upon exit of the door, the number of subtracted
               minutes is added back onto the user's remaining time. If the
               user's remaining time is less than this value, then the setting
               has no effect. A value of 0 disables the maximum time setting
               altogether.



-------------------------------------------------------------------------------
od_maxtime     int od_control.od_maxtime_deduction;
_deduction
               This variable store the amount of time that should be added to
               the user's time upon exit of the door, as a result of the
               maximum time deduction, described above. If the maximum time
               feature is not used, this variable will be given a value of 0.


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 205


-------------------------------------------------------------------------------
od_mps         void (*od_control.od_mps)(void);

               To make the OpenDoors Multiple Personality system available in
               your program, set this variable to INCLUDE_MPS before calling
               any OpenDoors functions. If this variable is not set, or is set
               to NO_MPS, the Multiple Personality System will be disabled. For
               more information on the OpenDoors Multiple Personality System,
               see page 233.



-------------------------------------------------------------------------------
od_no_         void (*od_control.od_no_file_func)();
file_func
               If od_no_file_func is set to point to a function, that function
               will be called whenever a door information (drop) file cannot be
               located or read. This provides an easy mechanism to add your own
               door information file reader, or to provide a local login prompt
               when no drop file is present. If you wish the door to operate in
               local mode, you should set od_control.od_force_local to TRUE
               prior to returning from your function. If you have successfully
               read your own door information file format, you should set
               od_control.od_info_type to CUSTOM. If neither of these variables
               are set by the od_no_file_function, OpenDoors will report that
               it is unable to find or read a door information file and will
               exit immediately.



-------------------------------------------------------------------------------
od_no_ra       char od_control.od_no_ra_codes;
_codes
               This variable defaults to FALSE. When set to TRUE, the
               translation of the RemoteAccess/QuickBBS control codes by the
               functions od_send_file(), od_hotkey_menu() and od_disp_emu() is
               disabled.



-------------------------------------------------------------------------------
od_            char od_control.od_nocopyright;
nocopyright
               This variable is a Boolean value that allows you to prevent
               OpenDoors from displaying its name, version number, copyright
               notice and registration information when the program begins
               execution. Set this variable to TRUE to disable the display of
               copyright and associated information. When this variable is set
               to TRUE, OpenDoors also does not change the initial display
               color on startup. For obvious reasons, this variable does not
               take effect when OpenDoors is operating in unregistered mode.
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 206




-------------------------------------------------------------------------------
od_noexit      char od_control.od_noexit;

               This variable contains a Boolean value, which allows you to
               prevent OpenDoors from exiting when shutting down. This may be
               useful when you want to have your program to do more processing
               after you have called the od_exit() function, or if you do not
               wish to have your program exit automatically when the user drops
               carrier. Normally, this variable will default to a value of
               FALSE, indicating that OpenDoors will exit normally when the
               od_exit() function is called. However, you may optionally set
               this variable to TRUE after od_init() or some OpenDoors function
               has been called. In this case, when the od_exit() function is
               called, either by your program manually, or automatically by
               OpenDoors in response to the user dropping carrier, etc.,
               OpenDoors will not exit. However, the normal operations of
               closing the serial port and re-writing the door information file
               will be carried out. If you set the od_noexit variable to TRUE,
               you will probably have to provide some mechanism to allow your
               program to detect when OpenDoors shutdowns due to the loss of
               carrier, etc. The best way of doing this is to provide a
               function which is to be called at the beginning of the od_exit()
               function, by setting the od_control.od_before_exit pointer,
               described above.



-------------------------------------------------------------------------------
od_page        char od_control.od_page_len;
_len
               This variable allows you to control the length, in seconds, of
               the sysop page beep produced when the user pages the sysop via
               the od_page() function.



-------------------------------------------------------------------------------
od_page        char od_control.od_page_pausing;
_pausing
               This variable contains a Boolean value that indicates whether or
               not page pausing is enabled in the od_send_file(),
               od_hotkey_menu() and od_list_files() functions. The default
               value of TRUE indicates that page pausing is enabled. A value of
               FALSE indicates that page pausing is disabled.





===============================================================================
OpenDoors 6.00 Manual                                          End of Page 207

-------------------------------------------------------------------------------
od_page        int od_control.od_pagestartmin;
startmin       int od_control.od_pageendmin;

od_page        These variables indicate the start and end times for sysop
endmin         paging, expressed as the number of minutes past midnight.
               Sysop paging will be available through the od_page() function
               from the start time, up to but not including the end time.



-------------------------------------------------------------------------------
od_page        char od_control.od_page_statusline;
_statusline
               This variable controls which status line, if any, is activated
               when the user pages the system operator (via the od_page()
               function). A value between 0 and 9 causes the corresponding
               status line to be activated. A value of -1 prevents any change
               from being made to the current status line setting. This
               variable will normally be set by personality functions (see page
               233).



-------------------------------------------------------------------------------
od_prog_       char od_control.od_prog_copyright[40];
copyright
               This variable should contain your program's copyright notice,
               such as "(C) Copyright 1996 by Your Name". This information is
               used in the Help|about dialog box under the Win32 version of
               OpenDoors, and may be used in other places in future versions of
               OpenDoors.



-------------------------------------------------------------------------------
od_prog_name   char od_control.od_prog_name[40];

               This variable should contain the full name of your program, up
               to 39 characters. If not set, OpenDoors will use the string
               "OpenDoors" in place of this variable. If used, this variable
               should be set prior to calling any OpenDoors functions, and
               should not include your program's version number. This
               information is used to write your program's name in the log file
               and to indicate your program's name on various windows, among
               other places.






===============================================================================
OpenDoors 6.00 Manual                                          End of Page 208




-------------------------------------------------------------------------------
od_prog_version     char od_control.od_prog_version[40];

               This variable should contain the version information of your
               program. If used, this variable should be set prior to calling
               any OpenDoors functions. This information is used in the
               Help|About dialog box under the Win32 version of OpenDoors,
               among other places.



-------------------------------------------------------------------------------
od_reg_key     unsigned log od_control.od_reg_key;

               When you purchase an OpenDoors licence (registration), this
               variable should be set to your registration key, prior to
               calling any OpenDoors functions.



-------------------------------------------------------------------------------
od_reg_name    char od_control.od_reg_name[36];

               When you purchase an OpenDoors licence (registration), this
               variable should be set to your name, or your company's name, as
               is listed in your OpenDoors registration record.



-------------------------------------------------------------------------------
od_spawn       char od_control.od_spawn_freeze_time;
_freeze_time
               This variable is a Boolean value which indicates whether or not
               the user's time remaining is frozen during the execution of one
               of the od_spawn...() functions. If this variable is set to TRUE,
               the user's time remaining will not decrease during the time that
               the od_spawn...() function is executing. However, if this
               variable is set to FALSE, the user's time remaining will
               continue to be subtracted during the execution of the
               od_spawn...() function. The default value of this variable is
               FALSE.



-------------------------------------------------------------------------------
od_swapping    char od_control.od_swapping_disable;
_disable
               This variable is a Boolean value which specifies whether or not
               OpenDoors will attempt to swap itself and your entire door upon
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 209

               DOS shell or a call to one of the od_spawn...() functions. This
               variable defaults to FALSE. If set to TRUE, OpenDoors will not
               attempt to perform swapping activities.



-------------------------------------------------------------------------------
od_swapping    char od_control.od_swapping_noems;
_noems
               This variable is a Boolean value which can be used to prevent
               OpenDoors from swapping to EMS memory. This variable defaults to
               the value FALSE. If set to TRUE, OpenDoors will not attempt to
               use EMS memory for swapping, and will only swap to disk.



-------------------------------------------------------------------------------
od_swapping    char od_control.od_swapping_path;
_path
               This variable specifies the drive and directory where OpenDoors
               should create its disk swapping file, if applicable. More than
               one path can be specified, by separating the paths with a semi-
               colon (;) character.



-------------------------------------------------------------------------------
od_status      char od_control.od_status_on;
_on
               This variable is a Boolean value which allows your program to
               completely disable the OpenDoors status line. The variable
               defaults to a value of TRUE, which causes the OpenDoors status
               line to be controllable by function keys, displayed and updated
               as it would normally be. However, if this variable is set to
               FALSE, then OpenDoors will not update the status line, nor will
               it allow the status line to be re-displayed as a result of one
               of the status line ([F1] through [F10]) keys being pressed. When
               you change the value of this variable from FALSE to TRUE,
               OpenDoors will automatically redisplay the status line. Note,
               however, that the status line isn't automatically removed when
               the value of this variable is changed from TRUE to FALSE. In
               order to erase the status line after resetting the value of this
               variable, you should reset the output window to the full screen,
               by calling the function window(1,1,25,80). Then manually erase
               the old status line either by clearing the bottom two lines of
               the screen, or by clearing the entire screen.

               It is important that you do not confuse the use of this variable
               with the od_set_statusline() function, which is described on
               page 137. When the status line is enabled, the sysop can change
               which status line, if any, is being displayed, using the
               function keys [F1] through [F10]. The od_set_statusline()
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 210

               function allows your program to make the same changes to the
               status line setting which the sysop can make by pressing one of
               the function keys. The status line can be removed from the
               screen, allowing a full 25 lines of text to be displayed, by
               pressing the [F10] key, or by making the appropriate call to the
               od_set_statusline() function. Note, however, than when this is
               done, the status line is still enabled, and can be turned on by
               pressing any of the other function keys. On the other hand, if
               the status line is turned off using this variable
               (od_control.od_status_on), the status line sub-system will be
               disabled, and pressing function keys will not "bring it back".
               So, if you were writing a program where a status line would be
               undesirable - such as a non-door communications program, you
               would use the od_control.od_status_on variable. On the other
               hand, if you only wanted to temporarily remove the status line -
               say in order that all 25 lines of a door program's output could
               be viewed - while still allowing the status line to be turned on
               with the sysop function keys, you would use the
               od_set_statusline() function. For more information on the
               od_set_statusline() function, see page 137.



-------------------------------------------------------------------------------
od_time        void (*od_control.od_time_msg_func)(char *string)
_msg_func
               This variable defaults to a value of NULL. If set to point to a
               function, OpenDoors will call this function INSTEAD OF
               displaying time limit warning messages to the user. The messages
               redirected to this function are:

                    - Inactivity timeout warning
                    - Inactivity timeout expired
                    - Less than 4 minutes left today
                    - Daily time limit expired

















===============================================================================
OpenDoors 6.00 Manual                                          End of Page 211

CONTROL STRUCTURE - FUNCTION KEYS
-------------------------------------------------------------------------------

               Within OpenDoors, as with most BBS software and doors, the sysop
               has access to a number of function keys, which permits the sysop
               to carry out various functions such as entering chat mode,
               hanging up on the user, shelling to DOS, and so on. The
               variables in this section allow you to customize which keys
               carry out the standard sysop functions, allowing you to
               customize your door's interface to mimic any BBS package. By
               default, OpenDoors emulates the function keys used by the Remote
               Access BBS package, but you may choose, for example, to have
               your door use the key combinations used by PC-Board. In
               addition, OpenDoors provides an interface which allows you to
               add your own function keys which will be accepted by the door.
               This could allow you to add additional features, such as giving
               the sysop access to a status screen which displays information
               about your door.

               Many of the variables in this section are unsigned ints, which
               represent a sysop key combination such as [ALT]-[H], [F8], or
               [CTRL]-[P]. These values are in the same format as is returned
               by the Turbo C(++) / Borland C++ bioskey() function. The high-
               order byte represents the scan code of the key, and the low-
               order byte represents the ASCII value, if any, of the key
               combination. Note that a complete tutorial on these key codes is
               beyond the scope of this manual. For more information on these
               key codes, you should see the documentation on the bioskey()
               function, which accompanies your compiler. If you wish to
               determine the key code which corresponds to a particular
               keystroke, there is a simple program, listed below, which you
               can compile and use. This program will simply display the key
               code for any key pressed, until you press the [ESCape] key. So,
               in order to determine the code for [SHIFT]-[F8], you would
               simply run this program, press the [SHIFT]-[F8] key combination
               on your keyboard, and record the value displayed on your screen.

                         #include <stdio.h>
                         #include <bios.h>
                         main()
                         {
                            int nKey;

                            do
                               {
                               nKey = bioskey(0);
                               printf("%d (from: %x, %x)\n",
                                  nKey, nKey>>8, nKey&0xff);
                               } while((nKey & 0xff) != 27);
                         }


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 212


-------------------------------------------------------------------------------
BUILT IN       These variable allow you to customize the sysop function keys
FUNCTION       which control functions such as hanging up on the user, shelling
KEYS           to DOS, and so on. All of these variable will be assigned
               default values, which correspond to the same function keys used
               by the RemoteAccess BBS package. However, you may change the
               values of these variables in order to customize the key
               combinations which carry out these functions in your own door
               program. Remember that if you wish to change the value of any of
               these variables, you must do so after having called od_init() or
               some OpenDoors function. Each of these variables contain a scan-
               code / ASCII-code combination representing a keystroke, as is
               described above. These variables are as follows:

               +---------------------+----------------------------------------+
               | VARIABLE            | CORRESPONDING FUNCTION                 |
               +---------------------+----------------------------------------+
               | od_control.         | Enter sysop chat mode                  |
               | key_chat            | (Normally [ALT]-[C]                    |
               |                     |                                        |
               | od_control.         | Invoke sysop DOS shell                 |
               | key_dosshell        | (Normally [ALT]-[J]                    |
               |                     |                                        |
               | od_control.         | Return to the BBS without hanging up   |
               | key_drop2bbs        | (Normally [ALT]-[D])                   |
               |                     |                                        |
               | od_control.         | Hangup on the user                     |
               | key_hangup          | (Normally [ALT]-[H])                   |
               |                     |                                        |
               | od_control.         | Turn off the user's keyboard           |
               | key_keyboardoff     | (Normally [ALT]-[K])                   |
               |                     |                                        |
               | od_control.         | Decreases the user's remaining time    |
               | key_lesstime        | (Normally [DOWN-ARROW])                |
               |                     |                                        |
               | od_control.         | Lock the user out of the BBS system    |
               | key_lockout         | (Normally [ALT]-[L])                   |
               |                     |                                        |
               | od_control.         | Increases the user's remaining time    |
               | key_moretime        | (Normally [UP-ARROW])                  |
               |                     |                                        |
               | od_control.         | Array of eight function keys to set the|
               | key_status[8]       | current status line.                   |
               |                     | (Normally [F1], [F2], [F3], [F4], [F5],|
               |                     |  [F6], [F9], [F10])                    |
               |                     |                                        |
               | od_control.         | "Sysop next" toggle key                |
               | key_sysopnext       | (Normally [ALT]-[N])                   |
               +---------------------+----------------------------------------+


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 213


-------------------------------------------------------------------------------
CUSTOM         In addition to the sysop function keys built into OpenDoors, you
FUNCTION       may wish to add your own function keys to your door. For
KEYS           example, you might wish to have the [ALT]-[Z] combination
               display a window of information about your door, or you may wish
               to add your own user editor to your door, accessible through the
               [ALT]-[E] combination. The four variables:

                         unsigned char od_control.od_num_keys;
                         unsigned int od_control.od_hot_key[16];
                         unsigned int od_control.od_last_hot;
                         void (*od_control.od_hot_function[16])(void);

               provide your program with an interface to add your own sysop
               function keys (not accessible by the remote user) to the door
               you have written.

               OpenDoors allows you to define up to sixteen custom sysop
               function keys. The key codes (as described at the beginning of
               this section) are stored in the od_control.od_hot_key[] array,
               and the od_control.od_num_keys variable records the number of
               keys which have been defined. The od_control.od_num_keys
               variable defaults to a value of 0. So, in order to add your own
               function keys, simply place the key codes for these keys in the
               first n elements of the od_control.od_hot_key[] array, and set
               the od_control.od_num_keys variable to the number of keys you
               have defined. OpenDoors will then watch the keyboard for any of
               your predefined sysop function keys being pressed. If one of
               these keys is pressed, OpenDoors will place the key code of the
               pressed key in the od_control.od_last_hot variable. Your program
               will then be able to respond to one of your custom function keys
               being pressed by checking the value of the
               od_control.od_last_hot variable. At any time this variable
               contains a non-zero value. If this is the case, you will then be
               able to determine which of your function keys has been pressed
               by checking the key code contained in this variable. After
               taking the appropriate action for the key pressed, you should be
               sure to reset the value of the od_control.od_last_hot variable
               back to zero, which will indicate to OpenDoors that your program
               has received and responded to the function key which was
               pressed.

               As an alternative to testing the contents of the
               od_control.od_last_hot variable, you  can also have your program
               respond to custom sysop function keys by providing a callback
               function in the array: void
               (*od_control.od_hot_function[16])(void);

               The Nth element in this array corresponds to the Nth element in
               the od_control.od_hot_key array. To use this mechanism, simply
               set the appropriate element of this array to point to the
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 214

               function that you wish to have OpenDoors call when the sysop
               presses the corresponding function key. For instance, assume
               that the following function is included in your program's source
               code:

                    void addPoints(void)
                    {
                       /* add ten points to the user's score */
                       currentUser->points += 10;
                    }

               If you wanted to have this function called when the sysop
               presses the [Page Up] key, you could do the following:

                    /* get number of new sysop function key, and increment */
                    /* total number of keys */
                    int new_key = od_control.od_num_keys++;

                    /* Set next sysop hotkey to Page Up */
                    od_control.od_hot_key[new_key] = 0x4900;

                    /* Set corresponding function to addPoints() */
                    od_control.od_hot_function[new_key] = addPoints;





























===============================================================================
OpenDoors 6.00 Manual                                          End of Page 215

CONTROL STRUCTURE - COLOR CUSTOMIZATION
-------------------------------------------------------------------------------

               These variables allow you to customize the color of text
               displayed by OpenDoors. Each of these variables are assigned
               color attributes, in the format used by od_set_attrib()
               (described on page 128). These variables are as follows:

               +---------------------+----------------------------------------+
               | VARIABLE            | WHERE COLOR IS USED                    |
               +---------------------+----------------------------------------+
               | od_control.         | Text typed by the sysop and user in    |
               | od_chat_color1 & 2  | chat mode.                             |
               |                     |                                        |
               | od_control.         | File description fields in FILES.BBS   |
               | od_list_comment_col | listings                               |
               |                     |                                        |
               | od_control.         | Color of page pausing prompt that is   |
               | od_continue_col     | displayed at the end of each page      |
               |                     |                                        |
               | od_control.         | Filename fields in FILES.BBS listings  |
               | od_list_name_col    |                                        |
               |                     |                                        |
               | od_control.         | "Missing" string in FILES.BBS listings |
               | od_list_offline_col |                                        |
               |                     |                                        |
               | od_control.         | File size fields in FILES.BBS listings |
               | od_list_size_col    |                                        |
               |                     |                                        |
               | od_control.         | Title fields in FILES.BBS listings     |
               | od_list_title_col   |                                        |
               |                     |                                        |
               | od_control.         | Color of the window title as displayed |
               | od_menu_title_col   | by od_popup_menu()                     |
               |                     |                                        |
               | od_control.         | Color of the window border as          |
               | od_menu_border_col  | displayed by od_popup_menu()           |
               |                     |                                        |
               | od_control.         | Color of the normal text displayed     |
               | od_menu_text_col    | by od_popup_menu()                     |
               |                     |                                        |
               | od_control.         | Color of the shortcut keys displayed   |
               | od_menu_key_col     | by od_popup_menu()                     |
               |                     |                                        |
               | od_control.         | Color of the selection bar as          |
               | od_menu_highlight_  | displayed by od_popup_menu()           |
               | col                 |                                        |
               |                     |                                        |
               | od_control.         | Color of the shortcut keys displayed   |
               | od_menu_highkey_col | on the selected line by od_popup_menu()|
               +---------------------+----------------------------------------+

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 216

CONTROL STRUCTURE - TEXT CUSTOMIZATION
-------------------------------------------------------------------------------

               In addition to the other aspects of OpenDoors which may be
               customized by use of the OpenDoors control structure, all of the
               text displayed by OpenDoors may also be customized. This may be
               done either to create doors with OpenDoors that use languages
               other than English, or to simply give your doors a "personal
               touch". The variables described in this section allow you to
               define what text you want to have displayed by OpenDoors at any
               time. All of these variables are pointers to strings, and are
               set to default values in the od_init() function. Thus, if you
               wish to change the string pointed to by any of these variables,
               you must do so after od_init() or some OpenDoors API function
               has been called. To set any of these variables, you can simply
               set them to point to a string-constant in your program. For
               example, to set the text displayed by OpenDoors prior to a DOS
               shell, you could:

               od_control.od_before_shell=(char *)"\n\rJust a moment...\n\r";

               The chart below lists each of the text customization variables
               (without the "od_control." prefix, for the sake of brevity),
               along with their default strings.

               Note that some of these strings MUST always be the same length
               as their default string. You may not display longer text within
               these strings, and if you wish to display shorter text, you must
               pad the remaining space in the string with spaces, in order to
               preserve its length. Those string which must be of fixed length
               also have their length listed in the chart below. Any strings
               which have an asterisk (*) in their length column may be any
               length.

               Also keep in mind that any string with "printf-style" formatting
               sequences, such as "%s", must retain the same sequences in the
               same order.

               In addition, four of these pointers - od_after_chat,
               od_after_shell, od_before_chat and od_before_shell - can be set
               to a value of NULL. In this case, OpenDoors will not display any
               string where this variable's string is normally displayed.

+-----------------------+-----+----------------------------------------------+
| VARIABLE NAME         | LEN | DEFAULT VALUE                                |
+-----------------------+-----+----------------------------------------------+
| od_after_chat         |  *  | "\n\rChat mode ended...\n\r\n\r"             |
|                       |     |                                              |
| od_after_shell        |  *  | "\n\r...Thanks for waiting\n\r\n\r"          |
|                       |     |                                              |
| od_before_chat        |  *  | "\n\rSysop breaking in for chat...\n\r\n\r"  |
|                       |     |                                              |
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 217

| od_before_shell       |  *  | "\n\rPlease wait a moment...\n\r"            |
|                       |     |                                              |
| od_chat_reason        |  *  | "                          Why would you "   |
|                       |     | "like to chat?\n\r"                          |
|                       |     |                                              |
| od_continue           |  *  | "Continue? [Y/n/=]"                          |
|                       |     |                                              |
| od_continue_no        | char| 'N'                                          |
|                       |     |                                              |
| od_continue_nonstop   | char| '='                                          |
|                       |     |                                              |
| od_continue_yes       | char| 'Y'                                          |
|                       |     |                                              |
| od_day[0]             |  3  | "Sun"                                        |
|                       |     |                                              |
| od_day[1]             |  3  | "Mon"                                        |
|                       |     |                                              |
| od_day[2]             |  3  | "Tue"                                        |
|                       |     |                                              |
| od_day[3]             |  3  | "Wed"                                        |
|                       |     |                                              |
| od_day[4]             |  3  | "Thu"                                        |
|                       |     |                                              |
| od_day[5]             |  3  | "Fri"                                        |
|                       |     |                                              |
| od_day[6]             |  3  | "Sat"                                        |
|                       |     |                                              |
| od_hanging_up         |  *  | "Terminating Call"                           |
|                       |     |                                              |
| od_help_text          |  80 | "  Alt: [C]hat [H]angup [L]ockout [J]Dos "   |
|                       |     | "[K]eyboard-Off [D]rop to BBS            "   |
|                       |     |                                              |
| od_help_text2         |  79 | "  OpenDoors 6.00 - (C)Copyright 1992, "     |
|                       |     | "Brian Pirie - Registered Version         "  |
|                       |     |                                              |
| od_inactivity_timeout |  *  | "User sleeping at keyboard, inactivity "     |
|                       |     | "timeout...\n\r\n\r"                         |
|                       |     |                                              |
| od_inactivity_warning |  *  | "Warning, only %d minute(s) remaining "      |
|                       |     | "today...\n\r\n\r"                           |
|                       |     |                                              |
| od_month[0]           |  3  | "Jan"                                        |
|                       |     |                                              |
| od_month[1]           |  3  | "Feb"                                        |
|                       |     |                                              |
| od_month[2]           |  3  | "Mar"                                        |
|                       |     |                                              |
| od_month[3]           |  3  | "Apr"                                        |
|                       |     |                                              |
| od_month[4]           |  3  | "May"                                        |
|                       |     |                                              |
| od_month[5]           |  3  | "Jun"                                        |
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 218

|                       |     |                                              |
| od_month[6]           |  3  | "Jul"                                        |
|                       |     |                                              |
| od_month[7]           |  3  | "Aug"                                        |
|                       |     |                                              |
| od_month[8]           |  3  | "Sep"                                        |
|                       |     |                                              |
| od_month[9]           |  3  | "Oct"                                        |
|                       |     |                                              |
| od_month[10]          |  3  | "Nov"                                        |
|                       |     |                                              |
| od_month[11]          |  3  | "Dec"                                        |
|                       |     |                                              |
| od_no_keyboard        |  10 | "[Keyboard]"                                 |
|                       |     |                                              |
| od_no_sysop           |  *  | "\n\rI'm afraid the sysop is not available " |
|                       |     | "at this time.\n\r"                          |
|                       |     |                                              |
| od_no_response        |  *  | " No response.\n\r\n\r"                      |
|                       |     |                                              |
| od_no_time            |  *  | "Sorry, you have used up your time for "     |
|                       |     | "today...\n\r\n\r"                           |
|                       |     |                                              |
| od_offline            |  10 | "[OFFLINE] "                                 |
|                       |     |                                              |
| od_paging             |  *  | "\n\rPaging Sysop for Chat"                  |
|                       |     |                                              |
| od_press_key          |  *  | "Press [Enter] to continue..."               |
|                       |     |                                              |
| od_sending_rip        |  *  | "\xb4 Sending RIP File \xc3"                 |
|                       |     |                                              |
| od_status_line[0]     |  80 | "                                        "   |
|                       |     | "                             [Node:     "   |
|                       |     |                                              |
| od_status_line[1]     |  *  | "%s of %s at %u BPS"                         |
|                       |     |                                              |
| od_status_line[2]     |  79 | "Security:        Time:                  "   |
|                       |     | "                             [F9]=Help "    |
|                       |     |                                              |
| od_sysop_next         |  5  | "[SN] "                                      |
|                       |     |                                              |
| od_time_left          |  10 | "%d mins   "                                 |
|                       |     |                                              |
| od_time_warning       |  *  | "Warning, only %d minute(s) remaining tod"   |
|                       |     | "ay...\n\r\n\r"                              |
|                       |     |                                              |
| od_want_chat          |  11 | "[Want-Chat]"                                |
+-----------------------+-----+----------------------------------------------+




===============================================================================
OpenDoors 6.00 Manual                                          End of Page 219

    66
   66
  66
 66666
 66  66
 66  66
  6666
-------------------------------------------------------------------------------
CHAPTER 6 - SPECIAL TOPICS




ADDITIONAL INFORMATION ON THE WIN32 VERSION
-------------------------------------------------------------------------------

               This section provides additional information on the Win32
               version of OpenDoors that isn't found elsewhere in this manual.
               If you are working with the Win32 version of OpenDoors, you
               should take the time to read this entire section. You should
               also read the sections in chapter 3 that describe how to compile
               and run Win32 programs that use OpenDoors.

               The Win32 version of OpenDoors has been designed to be as
               similar as possible to the DOS version of OpenDoors. This means
               that where possible, you can compile the same source code to
               produce both a DOS and a Windows program. However, if you are
               porting an existing DOS OpenDoors-based program to the Win32
               platform, there are some important things to keep in mind.

               The first thing to note is that under DOS, the program's
               execution begins in the main() function, whereas under Windows,
               it begins in the WinMain() function. To allow the same source
               file to build both DOS and Windows versions you can use
               conditional compilation. OpenDoor.h defines a constant of the
               form ODPLAT_xxx, indicating which version of OpenDoors is being
               used. Currently, this will be either ODPLAT_DOS, or
               ODPLAT_WIN32. However, if a OS/2 or Unix version of OpenDoors
               were created, they would use definitions such as ODPLAT_OS2, or
               ODPLAT_UNIX. Under the Win32 version, you should pass the
               nCmdShow parameter that is passed to WinMain into OpenDoors,
               through od_control.od_cmd_show. If you do not do this, the
               program will always start with the main window maximized,
               regardless of what the user has requested. Also, you will
               probably want to use the new od_parse_cmd_line() function in
               both DOS and Windows programs, to allow standard command-line
               options to be processed. The od_parse_cmd_line() function
               accepts command line information in the same format as it is
               passed to the main or WinMain() function. So, the general
               structure of an OpenDoors program that can be compiled under
               either DOS or Win32 now becomes:

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 220

               /* Add your own #includes here. */

               #include "opendoor.h"

               #ifdef ODPLAT_WIN32
               int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                  LPSTR lpszCmdLine, int nCmdShow)
               #else
               int main(int argc, char *argv[])
               #endif
               {
                    /* Add local variables here. */

               #ifdef ODPLAT_WIN32
                  od_control.od_cmd_show = nCmdShow;

                  od_parse_cmd_line(lpszCmdLine);
               #else
                  od_parse_cmd_line(argc, argv);
               #endif

                    /* Add the rest of your program after this point. */
               }

               If you are porting existing OpenDoors programs over to the Win32
               version of OpenDoors, another issue that you will have to pay
               careful attention to is the fact that you are now working in the
               32-bit world. While 32-bit programming under a flat memory model
               has many advantages (no more 64K segments and related
               limitations, for example), you must be aware that the size of
               basic data types that you are used to using may have changed.
               For example, an int is now 32-bits wide instead of 16-bits wide.
               One of the places where this difference becomes very important
               is if you are performing file-I/O by directly dumping a
               structure to or from disk using functions such as fread() and
               fwrite(). In this case, you must declare your structures using
               types that are of the same size between the 16-bit and 32-bit
               worlds, in order for your file formats to be compatible between
               the DOS and Win32 versions of your program. For example, the
               EX_VOTE.C example program declares its structure using fixed-
               sized types that are always available to any program including
               "opendoor.h". These types are the following size, regardless of
               what platform you are compiling under:

               INT8     - 8-bit signed integer.
               INT16    - 16-bit signed integer.
               INT32    - 32-bit signed integer.
               BYTE     - 8-bit unsigned integer.
               WORD     - 16-bit unsigned integer.
               DWORD    - 32-bit unsigned integer.


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 221

               (NOTE: Obviously, the many details of 32-bit programming and
               Windows programming are beyond the scope of this document. For
               more information on the issues discussed here, you will probably
               wish to consult other sources of information on Win32
               programming.)

               As you are probably aware, the Win32 edition of OpenDoors makes
               extensive use of multithreading. The number of threads will
               depend on what mode OpenDoors is operating in. In some
               situations, all of the following threads may exist:

               - The client thread(s), which executes the code that you write
                 in your program, along with the OpenDoors API functions.
               - The local screen thread, which is responsible for drawing
                 your program's output on the screen, and receiving input from
                 the local keyboard.
               - The frame window thread, which handles the OpenDoors menus,
                 toolbar, status bar and sysop function keys.
               - The remote input thread, which receives input from the serial
                 port and adds it to OpenDoors common local/remote input
                 queue.
               - The carrier detection thread, which blocks and only executes
                 if the carrier detect signal goes low.
               - The time update thread, which updates the user's time
                 remaining online, and monitors user timeouts.

               Since most of these threads only execute when the operating
               system determines that there is actually something for them to
               do, the Win32 version of OpenDoors provides very high
               performance and responsiveness.

               You may also want to make use of multithreading directly within
               your program. If you do this, please note that while you may use
               threads to perform background processing, OpenDoors requires
               that you only call OpenDoors API functions from one thread.

               If you wish to customize the information that is displayed in
               the Help|About dialog box (including your program's name and
               copyright information), provide your own application icon, or
               add online help to the help menu, refer to the sections in the
               manual on the following od_control variables:

                    od_control.od_app_icon
                    od_control.od_help_callback
                    od_control.od_prog_name
                    od_control.od_prog_version
                    od_control.od_prog_copyright

               The section that describes how to run Windows based door
               programs under DOS-based BBS package indicates that
               COM<n>AutoAssign=0 should be set in the system.ini file. The
               explanation for this is as follows: The default value for this
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 222

               setting in Windows 95 is -1, which prevents any Windows-based
               program from accessing a serial port which has previously been
               used by a non-Windows-based program, until the window that
               program was running in is closed. By setting this value to 0,
               you are allowing the Windows-based door program to immediately
               use the modem, even while the MS-DOS session (VM) is still
               active. A value of <x> greater than 0 will allow Windows-based
               programs to access the serial port, only if the DOS-based
               program has not accessed the serial port for at least <x>
               seconds. For example, the default setting in Windows 3.1 was
               COM1AutoAssign=2, which allowed Windows-based programs to access
               the serial port if no DOS program had used it for at least 2
               seconds.

               The section that describes how to run Windows based door
               programs under DOS-based BBS package also indicates that the
               DTRON utility should be run after the start command returns. The
               reason for this is that when a Windows program exits and closes
               the serial port (by calling the CloseHandle() function), Windows
               95 lowers the DTR line on the serial port. Most modems are
               configured to respond to this by hanging up on the remote user.
               From talking to other people, it seems that this "feature" (or
               fundamental design flaw, depending on how you want to look at
               it) is unique to Windows 95, and won't effect OpenDoors when
               running under Windows NT. However, the majority of people will
               undoubtedly be using the Win32 version of OpenDoors under
               Windows 95. This is unfortunate, since the Win32 communications
               facilities are otherwise _very_ well designed. There is a rumor
               that Microsoft's next upgrade to Windows 95 will fix this
               problem. However, I must stress that this is only a rumor, and
               that I haven't received any confirmation about this from
               Microsoft.

               OpenDoors currently provides two solutions to this problem.

               First of all, OpenDoors has the ability to use an already open
               serial port handle, if that information is supplied to it.
               Hopefully, all Windows 95-based BBS software will provide the
               option of running a door program with the serial port still
               open, and allow you to pass that serial port handle on the door
               program's command line. OpenDoors allows the serial port handle
               to be passed on the command line, or set directly in the
               od_control structure, as is described later in this manual. On
               BBS systems where this form of hot sharing of the serial port is
               supported, the serial port can remain open at all times, and so
               the CloseHandle() problem is avoided.

               This means that the only situation where the CloseHandle()
               problem still has to be dealt with is when OpenDoors is running
               on a Windows 95 system and OpenDoors has to open the serial port
               itself (and so must close the serial port before exiting). This
               would be the case for most MS-DOS based BBS systems running
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 223

               under Windows 95, unless some intermediate layer is provided. By
               default, in this situation OpenDoors will disable DTR response
               by the modem just before it closes the serial port, by sending
               the AT&D0 command to the modem. The exact sequence of commands
               used by OpenDoors to do this is specified by the
               od_control.od_disable_dtr string. This DTR response disabling
               may be turned off by setting the DIS_DTR_DISABLE
               od_control.od_disable flag. Since many programs (OpenDoors
               included) assume that they can hangup the modem by lowering the
               DTR signal, a small utility will usually be run after the door,
               which first raises the DTR signal again, and then re-enables DTR
               response by the modem. Such a utility is included in this
               package, named DTRON.EXE. I wrote the DTRON utility so that you
               can freely redistributed it with your programs.

               So, to summarize, the DTR disabling by OpenDoors and subsequent
               reenabling by DTRON is only required for the Win32 version of
               OpenDoors running under Windows 95 when the modem is configured
               to hangup if the DTR signal is lowered, and the BBS software
               does not have the ability to pass a live serial port handle to a
               door program. Setting COM<n>AutoAssign in system.ini is only
               required for the Win32 version of OpenDoors when it is being
               called from an MS-DOS session that has previously accessed the
               serial port.

               Note that the Win32 version of OpenDoors requires Windows 95 or
               Windows NT. It will not run under Windows 3.x, even with Win32s.
               This is because OpenDoors makes use of the Windows 95/NT
               multitasking and multithreading services that are not available
               under Win32s.






















===============================================================================
OpenDoors 6.00 Manual                                          End of Page 224

CONFIGURATION FILE SYSTEM
-------------------------------------------------------------------------------

               One of the most useful OpenDoors features that you can
               optionally choose to include in your programs is the OpenDoors
               configuration file system. All that is required to enable the
               configuration file system is to include the following line
               before your first call to any OpenDoors function:

                    od_control.od_config_file = INCLUDE_CONFIG_FILE;

               OpenDoors will now search for and read an OpenDoors
               configuration file. If you do not specify the name of this file,
               the default name of DOOR.CFG will be used. Using this
               configuration file, the sysop can set a wide variety of options,
               such as modem and system configuration information, maximum time
               limits for the door, and even define custom door information
               (drop) file formats. The example DOOR.CFG file included in your
               OpenDoors package shows the format and all options that are
               automatically supported by the configuration file system. This
               configuration file format is designed to be easy to use, and the
               example configuration file contains comments which provide a
               complete description of each option. Feel free to redistribute
               DOOR.CFG or a modified version of this file with your door
               programs. In addition to the many configuration file settings
               already supported, you can add your own settings that are
               specific to your particular program.

               To specify your own filename for the configuration file, use the
               od_config_filename control structure variable. For example, the
               following line:

                    od_control.od_config_filename = "MYDOOR.CFG"

               causes OpenDoors to look for the configuration file MYDOOR.CFG
               instead of the default DOOR.CFG.

               OpenDoors fill first search for the configuration file in the
               directory specified in the od_config_filename variable, if a
               specific directory name was supplied. If not found, it will then
               search the current directory. If the configuration file system
               is unable to locate a configuration file, or if any settings are
               omitted from the file, the default values for these settings
               will be used automatically. This means that the configuration
               file is always optional, unless your program has custom settings
               that it requires in order to run.

               The format for the configuration file is as follows. Blank lines
               and any text following the semi-colon (;) character are ignored.
               Configuration options are specified using a keyword, possibly
               followed by one or more options. The keywords are not case
               sensitive, but some of the options are. The order of options in
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 225

               the configuration file is not significant, with the exception of
               the "CustomFileLine" option. For more information on the
               "CustomFileLine" setting, see the section that begins on page
               230. The built-in configuration options are as follow:

               BBSDir - BBS System directory. Indicates where the door
                    information file (drop file) can be found.

               DoorDir - The door's working directory. This is where the door's
                    system files are located. OpenDoors will automatically
                    perform a chdir into this directory at initialization, and
                    will return to the original directory on exit.

               LogFileName - Specifies the filename (path optional) where the
                    door should record log information.

               DisableLogging - Prevents door from writing to a log file.

               Node - BBS node number that the door is running on. Only used if
                    OpenDoors is unable to determine the node number by some
                    other means.

               ???dayPagingHours - Specifies sysop paging hours. Sysop paging
                    will be permitted beginning at the start time, up until,
                    but not including, the end time. Times should be in the 24-
                    hour format. To disable paging on a particular day, set the
                    paging start and end times to the same time. ???day can be
                    one of Sunday, Monday, Tuesday, Wednesday, Thursday, Friday
                    or Saturday.

               PageDuration - Duration of sysop page. Value indicates the
                    number of beeps that compose the sysop page alarm.

               MaximumDoorTime - Maximum length of time a user is permitted to
                    access the door. If the user's total remaining time on the
                    BBS is less than this value, the user will only be
                    permitted to access the door for this shorter length of
                    time. This option is disabled by commenting out the line.

               InactivityTimeout - Specifies the maximum number of seconds that
                    may elapse without the user pressing a key, before the user
                    will automatically be disconnected. A value of 0 disables
                    inactivity timeouts.

               SysopName - Name of the sysop. OpenDoors can usually determine
                    the sysop's name from the door information (drop) file.
                    How3ever, some BBS packages do not supply this information.
                    In such cases, if the sysop's name is required by the door,
                    it may be supplied here.



===============================================================================
OpenDoors 6.00 Manual                                          End of Page 226

               SystemName - Like the sysop's name, this option can usually be
                    determined from the door information file. If it is not
                    available, the sysop my supply the information here.

               ChatUserColor - Specifies the color of text typed by the user in
                    sysop chat mode. The format of the color name is included
                    in the description of the od_color_config() function.

               ChatSysopColor - Specifies the color of test typed by the sysop
                    in chat mode.

               FileListTitleColor - Files.BBS listing colors.
               FileListNameColor
               FileListSizeColor
               FileListDescriptionColor
               FileListOfflineColor

               SwappingDir - Directory where disk swapping will be done.

               SwappingNoEMS - Disables swapping to EMS memory.

               SwappingDisable - Disables swapping entirely.

               LockedBPS -  BPS rate at which door should communicate with the
                    modem.  Valid rates are 300, 600, 1200, 2400, 4800, 9600,
                    19200 and 38400. A value of 0 forces the door to always
                    operate in local mode. This option is not normally needed,
                    as the information is usually available from the door
                    information file.

               FossilPort - Specifies the FOSSIL driver port number that the
                    modem is connected to. FOSSIL port 0 usually corresponds to
                    COM1, port 1 to COM2, and so on. This option is not
                    normally needed, as the information is usually available
                    from the door information file.

               CustomFileName - Specifies the filename used by the custom door
                    information file format. Described in more detail below.

               CustomFileLine - Specifies the contents of a particular line in
                    the custom door information file format.

               The last two configuration file options, "CustomFileName" and
               "CustomFileLine" allow you or the system operator using your
               program to define your own door information (drop) file formats.
               For more information on this topic, see the section which begins
               on page 230.

               You can also extend OpenDoor's configuration file format to add
               your own options, by supplying a callback function that will be
               called whenever OpenDoors encounters an unrecognized

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 227

               configuration file keyword. The prototype of this function
               should be as follows:

                    custom_line_function(char *keyword, char *options)

               To cause OpenDoors to use your function, you would include the
               following line before your first call to any OpenDoors function:

                    od_control.od_config_function = custom_line_function;

               (You can use a different function name if you wish.) When
               OpenDoors encounters unrecognized keyword, it will now call your
               function, passing a pointer to an upper case version the keyword
               string in the first parameter, and a pointer to any options that
               follow the keyword in the second parameter. For instance, if the
               following line were encountered in the configuration file:

                    RegisteredTo    John Smith      ; Sysop's name

               The parameters passed to your function would be:

                    char *keyword = "REGISTEREDTO"
                    char *options = "John Smith"

               Your custom line function should be written in such a way that
               if OpenDoors passes a configuration option to your function that
               your function does not recognize, that option would simply be
               ignored.

               The example program below demonstrates how to use the custom
               line function to add your own configuration file options. This
               program looks for three custom configuration file options,
               "RegistrationKey", "DefaultColor" and "DisplayWinners". If the
               "RegistrationKey" option is present, the numerical value
               following this option is stored in the global variable "key". If
               the "DefaultColor" option is present, the color description
               (such as "Bright Red on Black") is translated to an
               od_set_attr() color code using od_color_config(). This color
               setting is stored in the global variable default_color. Since
               this variable is initialized to 0x07 (the value for dark white
               on black), if this option is omitted, that color is used by
               default. If the "DisplayWinners" option is included in the
               configuration file, the global variable display_winners is set
               to TRUE, regardless of any options that may follow this keyword.


               #include "opendoor.h"                  /* Include opendooor.h */
                                       /* Prototype for custom line function */
               void custom_line_function(char *keyword, char *options);

               unsigned long key=0L; /* Variables for our own config option */
               unsigned char default_color=0x07;
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 228

               char display_winners=FALSE;

               main()                     /* Program's execution begins here */
               {               /* Begin door operations, reading config file */
                  od_control.od_config_file = INCLUDE_CONFIG_FILE;
                               /* Tell OpenDoors to use custom line function */
                  od_control.od_config_function = custom_line_function;
                  od_init();
                  /* Main program's operations go here */
                  od_exit(10, FALSE);                        /* Exit program */
               }
                                            /* Code for custom line function */
               void custom_line_function(char *keyword, char *options)
               {                            /* If option is registration key */
                  if(stricmp(keyword,"REGISTRATIONKEY")==0)
                  {
                     key=atol(options);             /* Store key in variable */
                  }                               /* If option is text color */
                  else if(stricmp(keyword,"DEFAULTCOLOR")==0)
                  {               /* Get color value using od_color_config() */
                     default_color=od_color_config(options);
                  }         /* Example of option enabled by just the keyword */
                  else if(stricmp(keyword,"DISPLAYWINNERS")==0)
                  {                 /* If keyword is present, turn on option */
                     display_winners=TRUE;
                  }
               }

























===============================================================================
OpenDoors 6.00 Manual                                          End of Page 229

DEFINING CUSTOM DOOR INFORMATION FILE FORMATS
-------------------------------------------------------------------------------

               As is mentioned in the previous section, the OpenDoors
               configuration file system provides two settings which allow the
               sysop to define a custom door information file format. This
               permits OpenDoors doors to operate directly on any BBS system
               that produces a door information file format not directly
               supported by OpenDoors. A custom door information file format is
               defined using the "CustomFileName" option, followed by one or
               more lines beginning with the "CustomFileLine" option.

               The "CustomFileName" option specifies the filename used to
               distinguish this file format from other file formats. This
               filename should not include a path. To specify the path where
               the door information file is located, the sysop should use the
               BBSDir configuration file setting. If the filename of the custom
               format is the same as that of one of the built-in formats, the
               custom format will override the built-in format.

               The actual format of the custom file is specified using a number
               of lines that begin with the keyword "CustomFileLine". Each of
               these lines will correspond to a single line in the door
               information file, with the option following the "CustomFileLine"
               keyword specifying the information that can be found on that
               line. This can be one of the following keywords:

                    Ignore - Causes the next line in the door information file
                         to be ignored. Use on lines for which none of the
                         options below apply.

                    COMPORT - COM? port the modem is connected to (0 indicates
                         local mode)

                    FOSSILPORT - Fossil port number the modem is connected to

                    MODEMBPS - BPS rate at which to communicate with modem (0
                         or non-numerical value indicates local mode)

                    LOCALMODE - 1, T or Y if door is operating in local mode

                    USERNAME - Full name of the user

                    USERFIRSTNAME - First name(s) of the user

                    USERLASTNAME - Last name of the user

                    ALIAS - The user's pseudonym / handle

                    HOURSLEFT - Hours user has left online


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 230

                    MINUTESLEFT - Minutes user has left online, or time left
                         online in format hh:mm

                    SECONDSLEFT - Seconds user has left online, or time left
                         online in format hh:mm:ss or format mm:ss (If more
                         than one of the above time options are used, the user
                         time left is taken to be the total of all of these
                         values.)

                    ANSI - 1, T, Y or G for ANSI graphics mode

                    AVATAR - 1, T or Y for AVATAR graphics mode

                    PAGEPAUSING - 1, T or Y if user wishes a pause at end of
                         screen

                    SCREENLENGTH - Number of lines on user's screen

                    SCREENCLEARING - 1, T or Y if screen clearing mode is on

                    SECURITY - The user's security level / access level

                    CITY - City the user is calling from

                    NODE - Node number user is connected to

                    SYSOPNAME - Full name of the sysop

                    SYSOPFIRSTNAME - The sysop's first name(s)

                    SYSOPLASTNAME - The sysop's last name

                    SYSTEMNAME - Name of the BBS

               As an example of how to define custom door information file
               formats, consider the following imaginary file format, which we
               will name DROPINFO.TXT:

                    Brian Pirie         <-- User name
                    0                   <-- Local mode
                    COM1:               <-- Serial port to use
                    9600                <-- BPS rate
                    22:30:15 05-08-95   <-- File creation time
                    35                  <-- Time remaining (in minutes)
                    1                   <-- ANSI mode
                    Ottawa, Canada      <-- Location

               This format would be defined in an OpenDoors configuration file
               as follows:



===============================================================================
OpenDoors 6.00 Manual                                          End of Page 231

                    CustomFileName DROPINFO.TXT
                    CustomFileLine USERNAME
                    CustomFileLine LOCALMODE
                    CustomFileLine COMPORT
                    CustomFileLine MODEMBPS
                    CustomFileLine IGNORE
                    CustomFileLine MINUTESLEFT
                    CustomFileLine ANSI
                    CustomFileLine CITY

               Notice that the first "CustomFileLine" keyword in the
               configuration file corresponds to the first line in our
               DROPINFO.TXT file, the second "CustomFileLine" to the second
               line, and so on. Also notice that the keyword "IGNORE" is used
               for the line that contains the file creation time, since there
               is no CustomFileLine keyword that allows you to read this
               information.



































===============================================================================
OpenDoors 6.00 Manual                                          End of Page 232

MULTIPLE PERSONALITY SYSTEM
-------------------------------------------------------------------------------

               The OpenDoors Multiple Personality System allows  the DOS
               version of OpenDoors to support multiple sysop function key /
               status line "personalities". Most commonly, you will use this
               feature in conjunction with the "Personality" setting in the
               OpenDoors configuration file, to allow the sysop to choose one
               of the built-in personalities that most closely mimics the BBS
               software they are using. OpenDoors includes the following
               personalities:

                    Configuration Keyword         Manifest constant
                    -----------------------------------------------------------
                    Standard                      PER_OPENDOORS
                    PCBoard                       PER_PCBOARD
                    RemoteAccess                  PER_RA
                    Wildcat                       PER_WILDCAT

               The PCBoard, RemoteAccess and Wildcat personalities mimic the
               status lines and function keys used by the BBS packages with
               those names. The Standard personality, which is the personality
               used by default, is a trimmed down version of the status lines
               provided by OpenDoors 4.10 and earlier.

               In addition to using the personalities supplied with OpenDoors,
               you can create your own personalities. This simply involves
               writing a function which OpenDoors will call to setup the sysop
               function keys and to display the status line.

               Include the following line before your first call to any
               OpenDoors function:

                    od_control.od_mps = INCLUDE_MPS;

               to include the multiple personality system in your program. This
               also enables the Personality setting in the configuration file,
               if you are using the configuration file system.

               You can set the default personality to be used by OpenDoors by
               setting od_control.od_default_personality to one of the manifest
               constants listed in the table above. If you have included the
               multiple personality system in your program, this setting will
               determine the personality to use if the "Personality" option is
               not set in the configuration file, and your program does not
               later change the personality using the od_set_personality()
               function. If you do not include the multiple personality system
               in your program, this setting will determine the personality
               that will always be used.

               Creating your own personality involves writing a single
               function.. Whenever OpenDoors needs to perform an operation that
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 233

               involves the personality, it will call this function, passing
               one of the following message values:

               PEROP_INITIALIZE    Initialize the personality, installing any
                                   custom function keys.
               PEROP_DEINITIALIZE  Deinitialize the personality, returning any
                                   changed settings to their original values.
               PEROP_CUSTOMKEY     Indicates that a custom function key has
                                   been pressed.
               PEROP_DISPLAYx      Where x is a number from 1 to 10. Indicates
                                   that the specified status line should be
                                   drawn from scratch.
               PEROP_UPDATEx       Where x is a number from 1 to 10. Indicates
                                   that the specified status line should be
                                   updated to reflect any changes.

               If you have enabled the multiple personality system by setting
               od_control.od_mps to INCLUDE_MPS, you can install your
               personality function into OpenDoors by calling
               od_add_personality(). When you call od_add_personality(), you
               supply a string containing the name of the personality, along
               with the top and bottom output line numbers to use. These line
               numbers specify the portion of the screen to use for door
               output, leaving the remainder of the screen available for
               displaying the personality's status line. Once the personality
               has been installed into OpenDoors, it can be selected by the
               sysop using the "Personality" configuration file option, or
               manually activated using the od_set_personality() function. For
               more information on the od_add_personality() function, see page
               47.

               You can make your personality function the default personality
               by setting od_control.od_default_personality to point to your
               personality function. As is the case with the built-in
               personalities, this setting will be used as the default
               personality if you have enabled the multiple personality system
               by setting od_control.od_mps to INCLUDE_MPS. If you have not
               enabled the multiple personality system in this manner, your
               personality function will become the one and only personality
               used within your program. When creating your own personality,
               you can use the od_control.od_page_statusline variable to set
               which status line (if any) will be activated when the user pages
               the system operator.









===============================================================================
OpenDoors 6.00 Manual                                          End of Page 234

LOG FILE SYSTEM
-------------------------------------------------------------------------------

               In order for the system operator to monitor system activity and
               diagnose problems that have occurred while the system was
               unattended, it is common for BBS software and door programs to
               record major events in a log file. This log file typically
               records the date and time of evens such as a user logging on or
               off, transferring files, sending messages, paging the system
               operator, and similar activities. Sometimes the system operator
               will configure all of the pieces of software running on a
               particular node to write to a single log file. In other cases,
               the system operator will prefer to have each program write to
               its own log file. However, software serving one line of a multi-
               node BBS system should never attempt to write to the same log
               file that is used by another node.

               OpenDoors uses the "FrontDoor format" log file standard. This
               was chosen as it is a clearly documented format that is quickly
               becoming the standard for bulletin board software log files. A
               segment from a log file produced by OpenDoors is listed below.

                         ----------  Thu 25 Feb 93, Vote 6.00
                         > 19:42:23  Brian Pirie entering door
                         > 19:50:55  User paging system operator
                         > 19:51:02  Entering sysop chat mode
                         > 20:05:41  Terminating sysop chat mode
                         > 20:18:32  User time expired, exiting door

               To enable the OpenDoors log file system, simply include the
               following line before your first call to any OpenDoors function:

                    od_control.od_logfile = INCLUDE_LOGFILE;

               When OpenDoors is initialized, it will open the log file and
               begin logging activities, unless logging has been disabled with
               the od_control.od_logfile_disable variable. The log file name
               will be taken from the od_control.od_logfile_name variable,
               which is usually set by the configuration file. If no logfile
               name has been set, OpenDoors will use the logfile named
               DOOR.LOG. Upon opening the log file, OpenDoors will write an
               entry indicating the time at which the use entered the door.

               The od_control.od_prog_name variable sets the program name that
               is written to the log file immediately after the current date
               information. If this variable is not set, OpenDoors will write
               its own name and version information in this place.

               When the OpenDoors log file system is enabled, OpenDoors will
               automatically produce logfile entries for the following events:

                         - User paging sysop, beginning of chat, end of chat
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 235

                         - Sysop entering or returning from DOS shell
                         - User inactivity timeout or user time expired
                         - Sysop dropping user back to BBS
                         - Sysop hanging up on user, sysop locking out user
                         - User hanging up on BBS
                         - Your program calling the od_exit() function














































===============================================================================
OpenDoors 6.00 Manual                                          End of Page 236

MAKING DOORS MULTI-NODE-AWARE
-------------------------------------------------------------------------------

               While the majority of BBS systems have only a single phone line,
               allowing only one user to access the system at a time, there are
               also many multi-node BBS systems. On such systems, it is quite
               possible that more than one user may be using your door program
               simultaneously. OpenDoors itself is designed for both single-
               node and multi-node operation. However, if you want your program
               to operate correctly on multi-node systems, there are a number
               of concurrency issues that you must keep in mind when writing
               your own code.

               Some door programs are designed to behave on multi-node systems
               just as they would on single-line BBSes. Others add special
               features only possible in multi-node environments. For instance,
               you may want to permit users to interact or chat with one
               another in "real time". Many simple doors may not require any
               special attention to multi-node capabilities. However, if your
               door must access any data files or other resources that are to
               be shared among nodes, it is necessary to carefully coordinate
               access to these resources.

               There are two primary issues that are often of concern when
               creating door programs for multi-node systems. The first issue
               discussed below is how to coordinate concurrent file access
               between multiple node. The second topic we will deal with is the
               installation of door programs on multi-node systems.



CONCURRENT FILE ACCESS
-------------------------------------------------------------------------------

               One of the most important issues that arises when writing door
               programs for multi-node systems is how to coordinate
               simultaneous access to a single data file by multiple instances
               of your program. While it is generally safe to have multiple
               nodes reading simultaneously from a single file, having multiple
               nodes updating a file without any coordination can lead to lost
               updates and other problems. Consider, for example, the EX_VOTE.C
               example program that is included in your OpenDoors package. When
               the user votes on a poll, EX_VOTE.C must update the total number
               of votes for the user's answer. Such a program that is only
               intended for single node operation could do this by simply
               reading the current number of votes for the appropriate option,
               adding one to this total, and writing the updated total back to
               the file. However, if this approach where to be used on a multi-
               node system, it is quite possible that two users would vote on
               the same poll after both nodes have read the poll record into
               memory. In this situation, one node would add one to the total
               number of votes for the poll record that it has in memory, and
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 237

               write the updated information to the file. The second node would
               then add one to its total, without reading the updated
               information written by the first node. When the second node then
               writes this information to the file, it overwrites the first
               node's total with its own. The final effect is that the second
               user's vote overwrites the first, and so the first user's vote
               is lost.

               The solution to this problem is to lock a file unit for the
               entire update operation, to prevent other nodes from accessing
               the unit at the same time. This unit could be the entire file,
               or only a single record in the file. EX_VOTE.C locks its entire
               file when performing an update operation, but in other cases it
               may be more appropriate to only lock a single record in the
               file. The important thing to understand is that when one node
               locks a file unit, other nodes much wait until the first node is
               finished the update operation. This means that if one node is
               updating information that other nodes could possibly need access
               to, it should always perform the lock, read, write and unlock
               cycle as quickly as possible.

               Let's look again at the approach taken by EX_VOTE.C. After the
               user has indicated which option he/she wishes to vote on, Vote
               attempts to open the file for exclusive access. By doing this,
               EX_VOTE.C in effect locks the entire file for the duration that
               it has the file open. If another node attempts to open the file
               while one node has it locked, the open operation will fail, and
               the C runtime library will set the errno variable to EACCES.
               This, in effect, tells you that another node is currently
               working on the file, and that you must wait your turn. In this
               case, EX_VOTE.C continues to retry the open operation until the
               other node is finished its update, at which time the open
               operation will succeed. This approach will even work when there
               are many nodes that are attempting to update the file at the
               same time. Whichever node first attempts to open the file will
               gain exclusive access to the file, and any additional nodes are
               forced to wait for access to the file. When one node finishes
               with the file, another node will gain access to the file
               (whichever happens to be the next node to re-attempt the open
               operation). This process continues until all waiting nodes have
               had a chance to perform their update. EX_VOTE.C will repeatedly
               try to open the file for up to 20 seconds, after which time it
               will give up, reporting an error which indicate that it is
               unable to access the file. During this waiting process,
               EX_VOTE.C repeatedly calls od_kernel(), so that sysop function
               keys, carrier detection and other essential door operations can
               continue to be performed.

               After EX_VOTE.C has successfully secured exclusive access to the
               file, it first reads the record that it is going to update. It
               is important that this be done after the file unit is locked, in
               order to ensure that the copy of the record in memory matches
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 238

               what is stored in the file. EX_VOTE.C then updates the record
               based on the question on which the user has voted, writes this
               information back to the file. EX_VOTE.C then immediately closes
               the file, allowing other nodes to also access the file.
               EX_VOTE.C is very carefully designed so that the file update
               operation can never be interrupted (for instance, no OpenDoors
               functions are called, which could detect a time-out and
               terminate the program while a file update operation is in
               progress), or delayed until the user makes a response. As such,
               the file unit is always unlocked (in this case, closed) within a
               fraction of a second after it was locked, or order that other
               nodes will never have to wait long for access to the file.

               Here I have presented a detailed account of how EX_VOTE.C
               handles multi-node file access. While all of the details
               involved in coordinating multiple file access can be
               overwhelming at first, they will begin to come naturally to you,
               as you begin to always think in terms of multi-node scenarios.
               To summarize, the important elements that are typically involved
               in multi-node file access are:

               A. Decide on an appropriate file unit to lock for your
                  application. In simple cases, this can be the entire file.
                  In other cases, you may wish to lock individual file
                  records, using the appropriate runtime library functions.

               B. Always perform update operations in lock, read, update,
                  write, unlock cycles on individual file units. If there is a
                  chance that other nodes will also need to access the file
                  unit, ensure that the update operation cannot be interrupted
                  or delayed until a user makes a response.

               After you have designed your program for concurrent file access,
               how can you test it? If you don't have a multi-node BBS system
               that you have access to, you can perform most of your testing
               under a multitasking environment, with multiple copies of your
               program running in different windows.















===============================================================================
OpenDoors 6.00 Manual                                          End of Page 239

MULTI-NODE CONFIGURATION
-------------------------------------------------------------------------------

               A second issue that you may want to bear in mind is how door
               programs are typically setup on multi-node systems.
               Unfortunately, this may differ considerable depending upon which
               BBS software is being used. However, some of the issues that you
               may have to consider discussed below:

               A. Your program must be able to locate the correct door
                  information file for the appropriate node. Most BBS systems
                  make separate door information files available to each node
                  by one of the following means:

                         - By naming each node's door information file
                           uniquely. (e.g. DORINFO1.DEF, DORINFO2.DEF.)

                         - By having a separate directory for each node's door
                           information file. (e.g. \NODE1\DOOR.SYS,
                           \NODE2\DOOR.SYS, etc.)

                  In the first case, OpenDoors can automatically select the
                  correct door information file, assuming that it knows which
                  node it is running on (see item C, below). In the later
                  case, you must tell OpenDoors which directory it must look
                  in to find the appropriate door information file. You may do
                  this by any of the following means:

                         - By specifying the location of the file on the
                           command line, if od_parse_cmd_line() is used.

                         - By providing a configuration file keyword to set
                           the door information file location for each node.

                         - By providing a different configuration file for
                           each node (See item B, below).

               B. If you are using the OpenDoors configuration file system,
                  node-specific options should not be used if each node is
                  accessing the same configuration file. While it is possible
                  to have a different configuration file for each node (the
                  filename can be specified on the command line if
                  od_parse_cmd_line() is used), in most cases the same
                  configuration file will be used for all nodes. In this case,
                  the node number, serial port information, and possible door
                  information file location operations should not be used. If
                  you are basing your configuration file on the example
                  DOOR.CFG file that is included in the OpenDoors package, you
                  may want to remove these options from the file.

               C. In many cases, your program must also be able to determine
                  which node it is running under. If this information is
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 240

                  available in the door information file, or is stored in a
                  TASK environment variable, OpenDoors will automatically set
                  the appropriate node number in od_control.od_node.
                  Otherwise, if your program requires this information, it
                  should be specified on the program's command line. The
                  od_parse_cmd_line() function supports this option. Reasons
                  that your program might need to know the current node number
                  include:

                         - In order for OpenDoors to display this information
                           correctly on the status line.

                         - In order to determine which configuration file to
                           read or which node directory in which to look for
                           the door information file.

                         - In order for OpenDoors to know which door
                           information file to read (e.g. DORINFO1.DEF,
                           DORINFO2.DEF. etc.)

                         - In order to provide any form of real-time
                           interaction between nodes, such as inter-node chat.

               D. If your program is running under MS-DOS, and multi-node file
                  access is being coordinated by locking part or all of a
                  file, the SHARE.EXE utility must be installed.


























===============================================================================
OpenDoors 6.00 Manual                                          End of Page 241

 7777777
      77
     77
    77
   77
  77
 77
-------------------------------------------------------------------------------
CHAPTER 7 - TROUBLESHOOTING AND GETTING ASSISTANCE WITH OPENDOORS




ABOUT THIS CHAPTER
-------------------------------------------------------------------------------

               This chapter is perhaps the most important section of this
               entire manual. Here, we provide detailed instructions to help
               you in tracing the source of problems in programs written with
               OpenDoors. Included in this chapter is a step-by-step OpenDoors
               troubleshooting guide and a chart listing common problems and
               their solutions. Also included in this chapter is information on
               the many means available to you for getting more help with
               OpenDoors, including the OpenDoors support BBS, the OpenDoors
               EchoMail conference, and how to get in touch with me. It is
               strongly encouraged that you take the time to read through this
               chapter.



TROUBLESHOOTING PROBLEMS
-------------------------------------------------------------------------------

               If you are experiencing difficulty with a program that you are
               writing using OpenDoors, it is suggested that you follow the
               steps listed below in order to quickly solve your problem. Also,
               be sure to check to "solutions to common problems" section of
               this manual. There are many common difficulties which people
               have with OpenDoors, that can easily be fixed using the
               instructions in the "common solutions" section. Also, if you are
               having difficulty solving a problem yourself, do not hesitate to
               get in touch with me, as I am always happy to help with any
               problems. In addition, you may find the other means of OpenDoors
               support (described latter in this chapter), invaluable in
               solving difficulties with OpenDoors.

               Keep in mind that most programs you write will have some "bugs"
               to begin with, and you should expect to spend at least 50% of
               any programming project tracing down and solving errors and
               bugs. While it would be nice if every program written worked
               correctly the first time, it is a fact of life that debugging is
               and always has been an important part of the software life-
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 242

               cycle. In fact, what most often separates the good programs from
               the bad is the amount of time their programmer's spend debugging
               and improving them. Unfortunately, it is difficult, if not
               impossible, to come up with a "magic formula" for debugging
               software. Debugging software is really more of an art than a
               science. However, there are some basic guidelines, which if
               followed, can greatly ease the task of software debugging.

               As with all problem solving, the secret to software debugging
               lies in obtaining as much information about the problem as
               possible. While it is sometimes possible to solve a bug by
               making intuitive changes in your program, or in re-writing a
               piece of code to solve the problem by a different means,
               debugging most often requires more of a "planned attack". This
               planned attack generally involves little more than learning as
               much about what is going wrong as possible. The first step in
               solving a bug usually lies in locating the source of the
               problem. Once you have located the problem, solving it is often
               a relatively simple procedure. In locating the source of your
               bug, the use of a software debugger, such as the one built into
               the Turbo C(++) / Borland C++ integrated development
               environment, can be invaluable.

               When debugging programs written with OpenDoors, you should also
               follow the steps listed below, in order to obtain more
               information related to the problem you are trying to solve:

               1.)  Re-read the section(s) of this manual, your Turbo C(++) /
                    Borland C++ manuals and your program's source code, which
                    apply to the problem you are experiencing.

               2.)  Check the solutions to common problems section below. The
                    most common problems with OpenDoors can be solved using
                    this simple chart.

               3.)  Check the value in the od_errno variable, which will often
                    provide vital clues as to the source of the problem. Use of
                    the od_errno variable is described in the section below.

               4.)  If you are still stuck, please feel more than free to get
                    in touch with me! (see the end of this chapter for
                    information on reaching me) I am always more than happy to
                    help with any OpenDoors or general programming problems!









===============================================================================
OpenDoors 6.00 Manual                                          End of Page 243

SOLUTIONS TO COMMON PROBLEMS
-------------------------------------------------------------------------------

               Below, several common difficulties with OpenDoors are listed,
               along with suggested solutions to these problems. If you are
               experiencing any difficulty with a program that you have written
               with OpenDoors, we would suggest that you read this section
               thoroughly. Here, the common problem is listed in the left
               margin, and the solutions listed on the right portion of the
               page.


-------------------------------------------------------------------------------
PROGRAM        1.) Check that the compiler is able to locate the OpenDoors
WON'T          header file, "OPENDOOR.H". This can be accomplished either by
COMPILE        placing this header file in the same directory as your other
               header files (such as STDIO.H, etc.), or by placing the header
               file in the current directory.

               2.) Be sure that you are linking your program with the correct
               library for the memory model you are using. (See the section on
               compiling with OpenDoors). Also be sure that both the source
               code file for your program (such as EX_VOTE.C) and the library
               file are listed in your project file, and that the project file
               is loaded. For more information on compiling programs written
               with OpenDoors, see page 22.

               3.) If you have tried the above solutions, and your program
               still won't compile, then the problem is most likely an error in
               your source code file. If you are unable to resolve your
               problem, feel free to get in touch with me.


-------------------------------------------------------------------------------
SCREEN         If you are using the od_clr_scr() function to clear the screen,
WILL NOT       but are not getting any results, this is likely because the user
CLEAR          online has screen clearing turned off. If you wish to force
               screen clearing regardless of the user's screen clearing
               settings (this is probably not a good idea), use the function
               call od_disp_emu("\xc", TRUE);


-------------------------------------------------------------------------------
FIXUP          This problem was probably caused by a mismatch between your
OVERFLOW       memory model selection in your compiler, and the memory model
ERROR          library you are using. See the section on compiling programs
               with OpenDoors for more information on the correct library you
               should be using for your memory model selection.




===============================================================================
OpenDoors 6.00 Manual                                          End of Page 244

OPENDOORS SUPPORT
-------------------------------------------------------------------------------

               The powerful and easy to use door toolkit and this comprehensive
               manual are only two portions of how OpenDoors helps you to write
               BBS door and similar programs. The third element of OpenDoors is
               the extensive OpenDoors support mechanisms. The OpenDoors email
               conference and support BBS each give you a chance to share ideas
               and source code with other OpenDoors programmers. A lot of
               information concerning OpenDoors, along with the newest version
               and online registration, is available through the OpenDoors
               World Wide Web site. In addition to these sources, I am also
               more than happy to answer any of your questions, or hear any
               suggestions for future versions of OpenDoors. The remainder of
               this chapter provides more information on the various sources of
               OpenDoors support. Also keep your eyes open for the "OpenDoors
               Tech Journal", that is produced on a regular basis by the users
               of OpenDoors. Included in this newsletter is information on
               OpenDoors and future versions, questions and answers about
               OpenDoors and BBS door / utility programming in general, sample
               source code, and much more.



THE OPENDOORS SUPPORT BBS
-------------------------------------------------------------------------------

               One means of receiving OpenDoors support is via the OpenDoors
               BBS. Below is an outline of some of what is available from the
               OpenDoors BBS:

                    -  The newest version of this package is always available
                       for download.

                    -  Also available for download is example source code and
                       other files which you may find helpful when writing
                       programs with OpenDoors.

                    -  Access to the OpenDoors conference where OpenDoors
                       programmers can share ideas, source code, and receive
                       help with difficulties or with learning OpenDoors.

                    -  Get in touch with me with any questions, comments,
                       suggestions or bug reports.

                    -  Other files by yours truly, which may be of use in you
                       programming, such as a registration key system, and so
                       on.

               All users receive full access upon their first call to the
               OpenDoors BBS. The North American phone number for the support
               BBS is:
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 245


                                   +1 (613) 599-5554

               The OpenDoors support BBS also has a FidoNet address, 1:243/8.
               If you are interested in a list of files available from the
               support BBS, simply file-request "FILES". To receive the newest
               version of OpenDoors, you can file-request "ODOORS".



THE OPENDOORS WORD WIDE WEB SITE
-------------------------------------------------------------------------------

               The OpenDoors World Wide Web site has been setup to provide up-
               to-date information on OpenDoors. This includes news concerning
               OpenDoors, OpenDoors tips and techniques, pointers to other
               sources of OpenDoors support, online registration and access to
               the newest version of OpenDoors.

               The current URL (address) of the OpenDoors Web site is:

                    http://omega.scs.carleton.ca/~ug930227/opendoor.html

               However, I plan on moving this to a new location some time this
               year. If you are unable to reach the OpenDoors Web site through
               the above URL, please get in touch with me, and I will be able
               to tell you where it has moved to.



THE OPENDOORS CONFERENCE
-------------------------------------------------------------------------------

               The OpenDoors conference is devoted to OpenDoors and BBS / door
               / BBS utility programming in general. The OpenDoors conference
               serves as a place where people working with OpenDoors can share
               ideas, source code examples, and other tricks and techniques.
               Through the OpenDoors conference you can receive help with
               OpenDoors and programming in general. Also available through the
               OpenDoors conference is information on future versions of
               OpenDoors and recent developments of concern to BBS door and
               utility programmers. The OpenDoors conference is also a place
               for suggestions for future versions of OpenDoors, OpenDoors bug
               reports, a place to announce the availability of your programs,
               and much more information of interest to programmers working
               with OpenDoors.

               You can become involved in the OpenDoors Conference by the
               following means:

               - The OpenDoors conference is available as an Internet mailing
                 list. to subscribe, send email to listserv@hms.com and put
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 246

                 SUBSCRIBE OPENDOOR in the message body. For help on using the
                 listserver you can send email to listserv@hms.com and put
                 HELP in the message body.

               - The OpenDoors conference is available on the FidoNet North
                 America echo backbone, and so is available to a large number
                 of BBS systems. FidoNet capable systems may also obtain an
                 OpenDoors feed directly from the moderator, Brian Pirie.


GETTING IN TOUCH WITH ME
-------------------------------------------------------------------------------

               If you have any questions about OpenDoors, would like help with
               any programs that your are writing, or have any suggestions for
               future versions of OpenDoors, please feel free to get in touch
               with me. You can get in touch with me by any of the following
               means:

               - The best way to contact me is by Internet email. My primary
                 email address is:

                              pirie@msn.com

                 If you have difficulty contacting me through this address, I
                 may also be reached through the address:

                              aa522@freenet.carleton.ca

               - By writing a message to me in the OpenDoors support
                 conference. For more information on the OpenDoors conference,
                 see the previous section of this chapter.

               - By calling the OpenDoors support BBS. Information on the
                 support BBS is provided earlier on in this chapter.

               - By sending your question or comment by Fax. My fax number is:

                              +1 (613) 599-5554

               - By FidoNet NetMail. My address is:

                              1:243/8

                 While I would like to be able to reply to all NetMail
                 messages by CrashMail, I am afraid I simply can not afford to
                 do this. So, if you choose to send NetMail, please indicate
                 whether you would like me to reply by routed NetMail (this
                 may not work, if routed NetMail is not available in your
                 area), or to place the message on hold for you to poll and
                 pick up.

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 247

               - By conventional mail. My postal address is:

                              Brian Pirie
                              117 Cedarock Drive
                              Kanata ON  K2M 2H5
                              Canada


               I try to respond to all correspondences as soon as possible.

               If you are having some sort of difficulty with OpenDoors, the
               more detailed information you supply (such as source code to the
               program that is causing the problem, how to duplicate the
               problem, and so on), the more quickly I will be able to
               determine the source of your problem. Also, before you write
               about a problem with OpenDoors, you may wish to be sure that you
               have read and followed the instructions in the section on
               troubleshooting, found on page 242. While I do not mind taking
               the time to answer any questions related to OpenDoors, you may
               be able to save yourself the time of writing and waiting for a
               response - simply by following the instructions in the
               troubleshooting section. More often than not, the answer to
               questions I receive is already in this manual.





























===============================================================================
OpenDoors 6.00 Manual                                          End of Page 248

    A
   AAA
  AA AA
 AAAAAAA
 AA   AA
 AA   AA
 AA   AA
-------------------------------------------------------------------------------
APPENDIX A - CONTENTS OF PACKAGE




               The main OpenDoors package is distributed in the form of a
               single, compressed archive file. Thus, you should have received
               this version of OpenDoors in a file whose name began with
               ODOORS60. The files listed below should be included in your
               OpenDoors package. If any of these files are missing, you will
               probably want to look for the most recent version of OpenDoors
               from another source. Note that the medium and compact memory
               model libraries are now distributed separately from the main
               OpenDoors package.

               MISCALENEOUS FILES
                    FILE_ID.DIZ    Description of the OpenDoors package
                    DORINFO1.DEF   Sample door info file for testing programs
                    DOOR.CFG       Sample OpenDoors configuration file

               EXAMPLE PROGRAMS
                    EX_HELLO.C     A simple program using OpenDoors
                    EX_CHAT.C      Split-screen sysop chat program
                    EX_MUSIC.C     Example of ANSI music in OpenDoors
                    EX_SKI.C       Simple slalom skiing action game
                    EX_VOTE.C      Example of an online voting program
                    VOTEDOS.EXE    Compiled version of EX_VOTE.C - DOS version
                    VOTEWIN.EXE    EX_VOTE.C compiled - Windows version
                    DTRON.EXE      Free utility for running Win 95 doors

               THE LIBRARY FILES
                    ODOORS.LIB     DOS, Small memory model library
                    ODOORL.LIB     DOS, Large memory model library
                    ODOORH.LIB     DOS, Huge memory model library
                    ODOORW.LIB     Win32 import library (Microsoft version)
                    ODOORS60.DLL   The OpenDoors Win32 DLL

               THE HEADER FILE
                    OPENDOOR.H     OpenDoors header file

               OPENDOORS DOCUMENATION
                    ORDER.TXT      Easy-to-print order form
                    OPENDOOR.TXT   OpenDoors programmer's manual (this file)

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 249

 BBBBBB
 BB   BB
 BB   BB
 BBBBBB
 BB   BB
 BB   BB
 BBBBBB
-------------------------------------------------------------------------------
APPENDIX B - CHANGES FOR THIS VERSION




               Since version 5.00, a lot of work has gone into OpenDoors. Many
               months were spent cleaning up and restructuring the OpenDoors
               code in a process that has touched nearly every line of the
               OpenDoors code. As well as making the OpenDoors source code
               easier to maintain, this has also involved making OpenDoors more
               easily portable to 32-bit multithreaded platforms.

               After this effort was completed, I began work on a Win32 port of
               OpenDoors. The OpenDoors package now includes both DOS and Win32
               versions of the library, giving you the option of developing for
               one, the other, or both platforms. The Win32 version of
               OpenDoors is highly multithreaded to give you the best possible
               performance. With some exciting new BBS packages that are
               designed specifically for Windows 95/NT in the works, the Win32
               version of OpenDoors gives you a head start on developing
               applications that will integrate smoothly with these new BBS
               packages. Even if your programs will only be used with DOS-based
               BBS packages, the Win32 version of OpenDoors allows you to take
               advantage of the Windows 95 GUI, multithreading capabilities and
               flat 32-bit memory model (no more DOS 64K limitations and
               different memory models to worry about!). It also allows you to
               access services that are only available to Windows based
               programs, such as ODBC for easy database access, and MAPI for
               email, fax and other messaging.

               While this internal restructuring of OpenDoors and the Win32
               port of the package would be enough alone to count as a major
               new version, version 6.00 also includes many exciting new
               features, enhancements and bug fixes:

               - A new option, "silent mode", has been added. When operating
                 in silent mode, OpenDoor's local sysop interface is disabled,
                 so that no output is displayed on the local screen, and no
                 input is accepted from the local keyboard. Silent mode can be
                 activated by setting od_control.od_silent_mode = TRUE prior
                 to the first call to any OpenDoors function, or by specifying
                 -SILENT on the command-line (if od_parse_cmd_line() is used).


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 250

               - OpenDoors now fully supports RTS/CTS flow control, which is
                 enabled by default. To disable the use of the RTS/CTS lines
                 for flow control, use od_control.od_com_flow_control.

               - In version 5.00, the built-in serial I/O module would be
                 unable to initialize the serial port if the "Uses Serial
                 Ports" option was turned off in DesqView or other
                 multitasking environments. When this option is turned off,
                 multitasking environments typically remove the serial port
                 information from the BIOS data segment. However, it seems
                 that other serial I/O software commonly uses the default
                 address for each port if this information is not available
                 from the BIOS data area. OpenDoors 6.00 has been changed to
                 do the same thing.

               - OpenDoors now provides a standard command-line processing
                 function, od_parse_cmd_line(). This function provides a one-
                 step method of adding support for many common command-line
                 options to your program. This function handles options such
                 as serial port information (including non-standard serial
                 port configurations), node number information, user
                 information, drop file and configuration file locations,
                 silent mode (turns off the local interface for efficiency and
                 privacy), one step local login without a drop file, and more.
                 For details, run the included example program (votedos.exe or
                 votewin.exe) with the -help command line option. The
                 od_parse_cmd_line() function is particularly helpful in
                 several situations:

                         - When your program is being used on a multi-node
                           system.
                         - Allows potential users to try your program in local
                           mode by just specifying -local on the command line.
                         - Allows door information to be specified on the
                           command line, rather than through a drop file, as
                           supported by some BBS systems
                         - Allows serial port handle to be directly passed to
                           the program under Windows-based BBS systems that
                           support this.
                         - Provides customizable command-line help (in a
                           window in the Win32 version of OpenDoors).

               - A new function, od_sleep(), allows you to suspend program
                 execution for the specified number of milliseconds, releasing
                 time to other processes in a multitasking environment. A call
                 of od_sleep(0) will yield control to any other processes
                 without forcing program execution to be suspended if no other
                 processes are waiting.

               - The sysop page timing mechanism has been reworked. By
                 default, od_control.od_okaytopage is set to PAGE_USE_HOURS,
                 only allowing the sysop to be paged during the paging hours
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 251

                 set by od_pagestartmin and od_pageendmin. Rather than
                 allowing the sysop to be paged at any time of the day or
                 night, the default now only permits sysop paging from 8:00am
                 to 10:00pm. Setting paging start and end time to the same
                 value now correctly permits paging 24 hours a day.

               - OpenDoors now provides a multi-line editor function,
                 od_multiline_edit(). This editor allows the user to enter or
                 edit any information that spans multiple lines, such as email
                 messages or text files. The editor can be configured to
                 operate in full screen mode, or in any smaller area of the
                 screen that you specify. The editor is designed to be both
                 easy to use, and highly customizable.

               - One new feature of OpenDoors 5.00 was somehow omitted from
                 the manual. Since version 5.00, it has been possible to set
                 the name of the drop file to use by including both a path and
                 filename in the od_control.info_path variable.

               - All known inaccuracies and missing information from the
                 version 5.00 manual have been corrected.

               - The example program, ex_chat.c, has been expanded to
                 demonstrate how OpenDoor's standard chat mode can be replaced
                 with the split-screen chat mode within your own programs.

               - The multiple ex_vote?.c example files have been combined and
                 simplified into a single example program, as it was prior to
                 version 5.00.

               - A memory leak in the od_popup_menu() function has been fixed.

               - od_control.od_open_handle can be used to provide OpenDoors
                 with an already open serial port handle on platforms that
                 support it. Currently, this only applies to the Win32 version
                 of OpenDoors. If this variable is not set to a non-zero value
                 prior to calling the first OpenDoors function (other than
                 od_parse_cmd_line()), then OpenDoors proceeds normally,
                 opening the serial port itself, and closing the serial port
                 before exiting.

               - A new switch, od_emu_simulate_modem, has been added to
                 od_control. When this is set to its default value of FALSE,
                 the OpenDoors terminal emulator displays at full speed, as it
                 has always done. However, when this flag is set to TRUE, the
                 emulation functions will display text at approximately the
                 same speed as it would be displayed when sent over the modem,
                 based on the current connect speed. This allows animations to
                 be displayed locally at the same speed as they would appear
                 on the remote system. This switch affects the following
                 functions:
                    od_disp_emu()
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 252

                    od_send_file()
                    od_hotkey_menu()

               - OpenDoors now distinguishes between the serial port BPS rate
                 (od_control.baud) and the connection BPS (a new variable,
                 od_control.od_connect_speed). In situations where a separate
                 value is available for the connect speed (e.g., this caller
                 has connected at 14400 bps), OpenDoors will now display that
                 value on the status line. Currently, a separate connect speed
                 is only obtained from the DOOR.SYS drop file format.

               - The latest versions of the QBBS EXITINFO.BBS drop file is now
                 supported.

               - A new od_edit_str() flag, EDIT_FLAG_SHOW_SIZE, has been
                 added. By default, the fields shown by od_edit_str() are one
                 character larger than the number of characters that may be
                 entered. This is for esthetic reasons, so that the cursor
                 remains within the highlighted field, even after a full
                 string has been entered. However, you may prefer that the
                 highlighted area reflect the exact number of characters that
                 are permitted. This can be accomplished by setting
                 EDIT_FLAG_SHOW_SIZE.

               - Tab characters ('\t') are now expanded on the local display.

               - The new RemoteAccess 2.50 EXITINFO.BBS fields are now
                 supported. This has included the addition of the following
                 new od_control members: user_rip_ver, user_attrib3 and
                 system_last_handle.

               - When operating in "forced automatic local" mode (where no
                 door information file used), OpenDoors now displays a window
                 in which in prompts for the user's name at startup time. This
                 new feature can be disabled by specifying the DIS_NAME_PROMPT
                 od_control.od_disable flag.

               - The latest version of the SFDOORS.DAT drop file is now
                 supported. SFMAIN.DAT, SFSYSOP.DAT, SFFILE.DAT and
                 SFMESS.DAT, which are in the same format as SFDOORS.DAT, are
                 also now recognized.

               - A new function, od_get_input(), allows you to easily handle
                 extended keys in your program, such as arrow keys, insert and
                 function keys.

               - The OpenDoors configuration file system will now display an
                 error and exit the program if a particular configuration file
                 name has been specified, and that configuration file cannot
                 be found.


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 253

   CCCC
  CC  CC
 CC
 CC
 CC
  CC  CC
   CCCC
-------------------------------------------------------------------------------
 APPENDIX C - FUTURE VERSIONS




               While I cannot make any promises about what features and changes
               will be seen in future versions of OpenDoors, I would like to
               take a moment to tell you a bit about some of the features you
               can expect to see in future versions of OpenDoors

               As you are probably already aware, OpenDoors is a constantly
               evolving package. To help meet the needs of programmers working
               with OpenDoors, nearly every idea and change that is made to the
               package results from the suggestions and comments I receive from
               the people using OpenDoors. For this reason, I will most likely
               continue to produce new versions of OpenDoors for as long as
               there is a demand and ideas for upgrades. There certainly is no
               shortage of either of this right now.

               Some of the features that I am considering for upcoming versions
               of OpenDoors include:

                    -Telnet support.

                    - HTML support.

                    - Direct interfacing with new Windows 95/NT BBS packages.

                    - Further features to help writing multi-node door
                     programs.

                    -Direct interfacing with more BBS systems.

                    -Additional RIP graphics support, including possible
                     display of RIP images on local screen.

                    -Possible support for additional programming languages and
                     operating systems.

                    - Improvements to existing OpenDoors features, such as more
                     configuration file options, multiple log file formats,
                     and many smaller changes.


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 254

 DDDDD
 DD  DD
 DD   DD
 DD   DD
 DD   DD
 DD  DD
 DDDDD
-------------------------------------------------------------------------------
 APPENDIX D - SPECIAL THANKS




               There are many people who I would like to thank, for their
               suggestions, ideas and assistance in making OpenDoors what it is
               today. Among those I would like to thank are:

                    - Everyone who has registered OpenDoors.

                    - All those who participate in the OpenDoors conference,
                      who provide many suggestions, bug reports and words of
                      encouragement.

                    - Those who on the OpenDoors beta team. Thank-you for
                      putting up with the problems along the way. You have
                      certainly helped to make OpenDoors a better package. The
                      people who have helped to beta test OpenDoors 6.00 are:

                              Robert Bouman
                              Doug Crone
                              Greg Diener
                              Patrick Dixon
                              Joel Downer
                              Mike Fenton
                              Les Howie
                              Vince Jacobs
                              Scott Jibben
                              Dean Mills
                              Jimmy Rose
                              Jim Woodward
                              Timothy Ward
                              Mark Williams

                    - Last but not least, I would like to thank my wife, Pearl,
                      for her support during the long hours that it has taken
                      to put OpenDoors together.






===============================================================================
OpenDoors 6.00 Manual                                          End of Page 255

  GGGG
 GG  GG
 GG
 GG GGGG
 GG  GG
 GG  GG
  GGGG
-------------------------------------------------------------------------------
GLOSSARY

ANSI           ANSI is an acronym for "American National Standards Institute".
               One of the standards approved by ANSI is a terminal display
               protocol which allows (in this case), BBS software to perform
               certain display functions such as changing the color of
               displayed text, or moving the location of the cursor on the
               screen. The majority, though not all, BBS users use terminal
               software with ANSI capabilities. Any users that do not have
               graphics display capabilities, will be using ASCII mode,
               instead. The ANSI terminal protocol is sometimes referred to as
               "ANSI graphics". It is graphic in the sense that it provides
               more visual control than an ASCII TTY terminal does, but does
               not imply any support for bit-mapped nor vector graphics.
               Compare ASCII and AVATAR.


API            API is an acronym for "Application Program(er) Interface". An
               API is a set of well documented functions, variables and data
               types that you can use to access certain services from your
               program. When you write any C program that uses standard C
               library functions such as fopen() or strcpy(), you are using a
               sort of API. When you use OpenDoors functions such as
               od_printf() or od_get_key(), you are using functions that are
               part of the OpenDoors API. Operating systems provide their own
               APIs that allow programs to gain access to operating system
               features such as screen display, file I/O and communications.
               The API provided by Microsoft Windows 95 and Windows NT is
               called the Win32 API.


ASCII          ASCII (pronounced "ass-key") is an acronym for "American
               Standard Code for Information Interchange", and is a definition
               of a set of 128 letters, number and symbols, which can be
               displayed by computer systems. Also, when used within the domain
               of BBS software, ASCII mode is often used to refer to the lack
               of any more advanced display capabilities, such as ANSI or
               AVATAR. When ASCII mode is used, characters can only be
               displayed in standard Teletype (TTY) fashion, one after another.
               Also, color and cursor positioning functions are not available
               in ASCII mode. Compare ANSI and AVATAR.



===============================================================================
OpenDoors 6.00 Manual                                          End of Page 256

AVATAR         AVATAR is an acronym for "Advanced Video Attribute Terminal
               Assembler and Recreator". AVATAR is a graphics display protocol,
               similar to ANSI. Like ANSI-graphics, AVATAR graphics allow
               functions such as cursor positioning, and color changing.
               However, AVATAR also offers many capabilities not available from
               ANSI, and performs the same functions as ANSI much more quickly.
               AVATAR graphics is less common than both ANSI or ASCII, but is
               becoming more popular as time goes by. Compare ASCII and ANSI.


BAUD           "baud" or "baud rate" are generally used as a synonym for "BPS".


BPS            BPS is an acronym for "Bits Per Second", and refers to the rate
               at which data is being sent over a communications medium. There
               are two important BPS rates which are relevant to OpenDoors. The
               serial port BPS rate (also called the DCE rate) is the speed at
               which the computer is communicating with the local modem. The
               connect speed, on the other hand, is the speed at which the
               local modem is communicating with the remote modem. The serial
               port speed must be at least as fast as the connection speed.
               Often the serial port speed will be locked at a fixed speed that
               is higher than the fastest possible connection speed of the
               modem. For example, the serial port might be locked at a speed
               of 38400 BPS, while the modem could be connected at 28,800,
               14,400 or slower speeds. OpenDoors usually needs to know the
               serial port BPS rate in order to function correctly (as stored
               in od_control.baud). Under certain situations, OpenDoors will
               also be able to report the connection speed to you (as stored in
               od_control.od_connect_speed), although OpenDoors does never
               requires this information to operate.


BIT-MAPPED     As with Boolean values, described below, bit mapped flags
FLAGS          are used to indicate whether or not various conditions exist.
               (For example, whether or not a certain setting is enabled, or
               whether or not a particular event has occurred.) However, unlike
               Boolean variables, a single bit-mapped flag represents more than
               one of these TRUE/FALSE values. In fact, each bit (BInary
               Digit), which makes of the variable can be used to represent a
               separate TRUE/FALSE state. (ie, each bit maps to a particular
               piece of information, and hence the term "Bit Map").

               For an example of using bit-mapped flags, let us take a case of
               a single "unsigned char" which contains three independent
               TRUE/FALSE values. We will call this variable user_info, and it
               will indicate whether or not a user has ANSI graphics, whether
               or not the user has screen clearing turned on, and whether or
               not the user has end-of-page "more" prompts enabled. Internally,
               the bits of the user_info variable will be as follows:


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 257

                     Bit:  7 6 5 4 3 2 1 0
                                     | | |
                                     | | +--- ANSI Graphics
                                     | +----- Screen Clearing
                                     +------- More prompts

               In this case, we will have three constants which we define in
               order to simplify access to these bit-mapped flags, as follows:

                     #define ANSI_GRAPHICS        0x01
                     #define SCREEN_CLEARING      0x02
                     #define MORE_PROMPTS         0x04

               Note that normally within OpenDoors, these constants will be
               defined for you, and you will have no need to know what their
               values are, nor in which bit which piece of information is
               stored.

               Using bit-mapped flags, you are able to set or clear any of the
               individual flags, and check whether any of the flags are set,
               using these simple methods: (Not that a set flag is the
               equivalent of a Boolean value of "True", and a cleared flag is
               the equivalent of a Boolean value of "False".)

                    Set Flag:      variable |= FLAG_CONSTANT;
                    Clear Flag:    variable &=~ FLAG_CONSTANT;
                    Test Flag:     variable & FLAG_CONSTANT

               Where "variable" is the name of the bit-mapped flag variable,
               and "FLAG_CONSTANT" is the pre-defined constant for the
               individual setting. To return to our example, you could turn on
               the user's ANSI graphics setting by using the line:

                    user_info |= ANSI_GRAPHICS;

               and to turn off screen clearing you would:

                    user_info &=~ ANSI_GRAPHICS;

               To perform an action (such as waiting for the user to press
               [Return]/[Enter]) only if "More" prompts are enabled, you would:

                    if(user_info & MORE_PROMPTS)
                    {
                         ...            /* Whatever you want */
                    }






===============================================================================
OpenDoors 6.00 Manual                                          End of Page 258

BOOLEAN        Many of the variables used within OpenDoors contain a
VALUES         "Boolean Value". A Boolean value is a two-state variable, who's
               states are referred to as "True" and "False'. If the variable
               contains a value of "True", it indicates that a certain
               condition is so, and if it contains a value of "False", it
               indicates that the condition is not so. For example, a Boolean
               variable "wait" might be used to indicate whether or not
               OpenDoors should wait for the user to press a key, or continue
               without waiting. In this case, a value of "True" would indicate
               that OpenDoors should wait, and a value of "False" would
               indicate that it should not wait.

               Note that in the C programming language, there is no actual
               Boolean variable type - usually a char or an int are used to
               store Boolean values.

               The constants TRUE and FALSE, as defined in the OPENDOOR.H file,
               are used to represent the two states of a Boolean value. Thus,
               to set a Boolean variable "wait" to the value of "True", you
               would use this line:

                         wait=TRUE;

               and to set the variable "wait" to "False", you would:

                         wait=FALSE;

               However, you SHOULD NOT test whether a Boolean variable is
               "True" or "False" by using the C compare (==) operator, as the
               value "True" will not always be the same numerical value.
               (Actually, the TRUE constant represents just one of many
               possible numerical values for "True"). Instead, to perform an
               action of the "wait" Boolean variable is "True", you would:

                         if(wait)
                         {
                              ...        /* Whatever you want */
                         }

               and to perform an action if the "wait" Boolean variable is
               "False', you would:

                         if(!wait)
                         {
                              ...       /* Whatever you want */
                         }

               For interest sake, Boolean values are named after the 19th
               century English mathematician, who studied formal logic, and
               created Boolean algebra - an algebra which deals with TRUE and
               FALSE values.

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 259


BPS            BPS is an acronym for "Bits Per Second". For our purposes here,
               the terms BPS and BAUD refer to the same thing.


CARRIER        The term "Carrier" or "Carrier Detect" refers to a signal which
DETECT         most modems send to the computer, which indicates whether or not
               the modem is currently connected to (communicating with) another
               modem. The door driver module of OpenDoors, as with most other
               BBS software, uses the status of this carrier detect signal in
               order to know whether the user is still connected to the BBS
               computer. Thus, if the user hangs up, or if something goes wrong
               and the connection is lost, OpenDoors is able to detect this
               state, and exit to the BBS. The BBS will then also detect that
               the carrier signal has been "lost", and will reset itself, and
               then again be ready to accept calls.


CHAT MODE      The term "chat mode" refers to a means by which the sysop can
               communicate with a user of the BBS / door. During sysop chat,
               anything typed by the sysop will appear on the user's screen,
               and likewise, anything typed by the user will appear on the
               sysop's screen. Sysop chatting is available on both single and
               multi-line systems. Sysop chatting is initiated by the sysop,
               either at any time a user is online, or specifically in response
               to a sysop page.


COMPILE        "Compiling" refers to the process of converting the source code
               that you write for your program, into an executable file (such
               as a .EXE file) that an end user can use. The process of
               building an executable file is generally divided into two
               stages. In the first stage, called compiling, source files are
               converted to object files, often named .OBJ. In the second
               stage, called linking, one or more object files are combined,
               along with any library files, to produce the final executable
               file.


DLL            DLL is an acronym for "Dynamic Link Library". A dynamic link
               library is similar to a static library, in that it contains one
               or more functions that an application program can use. Unlike a
               static library, the code from a dynamic link library is not
               added to the program's executable file at link time. Instead,
               the dynamic link library exists as a separate file which must be
               loaded when the program is run. The Win32 version of OpenDoors
               resides in a DLL.

               See also "Library".



===============================================================================
OpenDoors 6.00 Manual                                          End of Page 260

DOOR           A "door" is a program that runs as part of a BBS system, but
               which is separate from the central BBS software (RemoteAccess,
               Maximus, QuickBBS, PC-Board, etc.) itself. A door provides
               additional features not built into the BBS software, such as on-
               line games, on-line shopping services, voting booths, match
               making systems, access to special files or messages, and much
               much more. Since the user also communicates with the door
               online, as they do with the BBS, it may not necessarily be
               obvious to the user that the door is even a separate entity from
               the central BBS software itself.


DOOR           Also referred to as a "drop file", "exit file", or "chain
INFORMATION    file". The door information file is a file passed from the
FILE           central BBS software to a door program, providing it with
               information about the user who is online, the BBS the door is
               running under, and the current modem connection. The door
               information file may also be used to pass changed information
               back to the BBS, such as the amount of time that the user has
               used in the door. OpenDoors takes care of all of the work
               involved in reading and writing the door information file for
               you, as described in the "Basics of Door Programming" section,
               in chapter 4. Examples of door information files supported by
               OpenDoors include: DOOR.SYS, EXITINFO.BBS, DORINFO?.DAT,
               SFDOORS.DAT, CALLINFO.BBS and CHAIN.TXT.

DTR            DTR is an acronym for "Data Terminal Ready". This is a signal
               that the computer sends to the modem, indicating that the
               computer is ready to send or receive information. Most modems
               are configured to hangup if the DTR signal is lowered. This is a
               convenient means of hanging up the modem, but cases problems
               under Windows 95, where the DTR signal is always lowered when a
               program closes the serial port.


ECHO           See "Local Echo".


FOSSIL         The FOSSIL driver, or simply FOSSIL, is a TSR program or
DRIVER         device driver which OpenDoors can optionally make use of in
               order to communicate with the modem. The FOSSIL driver is loaded
               prior to starting up the BBS or your door, usually from the
               AUTOEXEC.BAT or CONFIG.SYS files. The two most commonly used
               FOSSIL drivers are X00 and BNU. (FOSSIL is an acronym for
               "Fido/Opus/SEAdog Standard Interface Layer", although it has now
               become the standard for nearly all BBS software.) FOSSIL drivers
               are also available for other specialized serial port hardware,
               such as the popular "DigiBoard" multi-port serial card.


IMPORT LIBRARY See "Library".

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 261


LIBRARY        A "library" or "library file" is a collection of precompiled
               functions and variables that can be used by other programs. All
               of the features, capabilities and functions of OpenDoors that
               you can make use of are contained within the OpenDoors library
               files. (Likewise, the C runtime library, consisting of the
               familiar functions such as fopen(), printf() and atoi(), is also
               contained within a library file.) For more information on the
               different OpenDoors library files, see the section that begins
               on page 22.

               There are several different kinds of library files. A static
               library file is actually a collection of individual object
               files. When you compile a program that makes use of a static
               library file, only those portions of the library file that your
               program actually uses are linked into your program's executable
               (.EXE) file. Static library files can be identified by a .LIB
               extension. The DOS version of OpenDoors resides in a static
               library.

               A dynamic link library, on the other hand, is not combined with
               the program's executable file. Instead dynamic link libraries
               exist in separate .DLL files that must also be present when the
               program is executed. The Win32 version of OpenDoors resides in a
               dynamic link library.

               An import library is a small file that describes a dynamic link
               library. The most common way for a program to call functions in
               a dynamic link library requires that an import library be used a
               program link time.

               See also "DLL".


LINK           "Linking" generally refers to the process of combining several
               object files into a final executable file, during which
               references to symbol names (such as od_printf()) are resolved to
               the address of the corresponding object. See also "Compiling".


LOCAL MODE     The term "local mode" refers to a mode in which a BBS system or
               door program may operate. In local mode, the BBS/door behave as
               they would if a user were connected via modem to the BBS, except
               that all display and input is done simply on the BBS software,
               but not through the modem. Local mode allows the sysop or
               another person with direct access to the BBS computer to use the
               BBS/door software, either for their own user, or for testing
               that the software is running correctly. When programming door
               software, local mode can be very useful in testing and debugging
               the door, without requiring the door to be connected to a remote
               system. All doors written with OpenDoors automatically support
               local mode operation. Compare "Remote".
===============================================================================
OpenDoors 6.00 Manual                                          End of Page 262



LOCAL ECHO     The term "Local Echo" refers to a door displaying the same
               characters which are sent to the modem on the local screen
               ("Output Window"). This allows the sysop to view the same
               information that is sent to the user's system, in the same
               manner that it will appear on the user's screen.


LOCKED         (eg. "Locked Baud Rate", "Locked BPS Rate", "Locked Commport
               Speed", etc.) Usually, the communication port to which a modem
               is connected is set to transfer data at the same BPS rate as the
               rate at which the modem is communicating. However, many high
               speed modems allow very high speed data transfer by using built-
               in data compression methods. In this case, the actual rate of
               data transfer can easily exceed the true BPS rate of the
               connection. As a result, the BPS rate of the port is kept a
               single speed, faster than any of the true modem connections, in
               order to increase modem speed performance. This is referred to
               as locking the commport BPS rate. OpenDoors has full support for
               the use of locked BPS rates.


LOG FILE       A log file is a normal text file in which BBS software records
               all major activities that have taken place. As such, the log
               file permits the sysop, to review what activities have taken
               place on the BBS during the time which they have been away from
               the computer. A log file can be helpful in identifying system
               errors or crashes that have occurred, in alerting the sysop in
               the case that any users have been causing problems on the BBS,
               or in simply letting the sysop know who has called recently, and
               what when they did when they called.


MEMORY MODEL   C and C++ programs can be compiled under a variety of different
               memory models. Each memory model describes how data and program
               code are addressed in memory. When writing MS-DOS programs, you
               generally have the choice of six different memory models (named
               tiny, small, compact, medium, large and huge), each of which
               provides a different combination of the maximum sizes of data
               and code that your program may have. When writing Win32
               programs, there is a single, flat 32-bit memory model that all
               programs use. This memory model allows a program to address (in
               theory) up to 4 gigabytes of data and code.


MODEM          A device connected to a computer which permits it to communicate
               with other computers, usually over standard telephone lines.




===============================================================================
OpenDoors 6.00 Manual                                          End of Page 263

OBJECT FILE    An object file contains the compiled version of a source code
               file of a program. The source code file may be a .C file, .CPP
               file, .ASM file, .PAS file, .BAS file, or any number of other
               extensions associated with other programming languages. When any
               of these language's source code files are compiled, a .OBJ file
               is created containing information such as the executable code,
               and names of symbols (variables and functions) that are to be
               shared with other .OBJ files. In order to produce a .EXE file
               that may be executed, a process known as linking must be
               performed. During the link process, one or more object files
               composing your program are combined, along with the necessary
               code from any library files being used, in order to produce the
               final .EXE file.


ONLINE         In the case of BBS software and BBS door programs, the term
               online refers to the state of a user using the BBS. Usually, the
               user will be connected to the BBS from a remote location, using
               a modem. However, it is also possible that the user will be
               using the actual BBS computer, with the software operating in
               "local mode".


OUTPUT WINDOW  The local screen of the BBS on which BBS software is running is
               usually divided into two sections. At the bottom of the screen,
               there is often a one or two line status line, which displays
               information to the sysop about the BBS and the user who is
               currently online. The rest of the screen is usually an "output
               window", in which the information which is being displayed to
               the user, is also displayed on the local screen. In some cases,
               there will be no status line, in which case the entire screen
               will be the output window. Usually, the upper 23 lines of the
               screen in an OpenDoors door will be the output window, with the
               bottom two lines being the status line. However, it is possible
               to disable the OpenDoors status line, in which case the entire
               screen will be the output window. See also "Status Line"


PAGE           See "SYSOP PAGE"


PARAMETER      In the C programming language, many tasks are accomplished by
               calling functions. When a function is called, one or more pieces
               of information may be passed to a function, in the form of
               parameters. For example, a function used to set the foreground
               and background color of displayed text might accept two
               parameters, one for each of the two color settings. In this
               example, a function such as od_set_color(), would be called as
               follows:

                              od_set_color(D_GREEN,D_RED);

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 264

               In this case, D_GREEN, the foreground color, is the first
               parameter, and D_RED, the background color, is the second
               parameter.

               In C, parameters are enclosed in parentheses, ( and ), which are
               located after the name of the function to be called. Each
               parameter is then separated by a comma character. If a function
               does not accept any parameters, the parentheses will have
               nothing between them. (ie. od_clr_scr() ).


REGISTRATION   This is a demonstration version of OpenDoors, which may only be
               used under limited circumstances, for a limited period of time.
               If you wish to continue using OpenDoors after this "evaluation
               period", you must "register" it. For more information on
               registering OpenDoors, please see chapter 2 of this manual.


REMOTE         When used in reference to BBS software or door programs, the
               term remote is used to refer to a user or computer that is
               communicating with the BBS, for a distant location, by use of a
               modem. Compare "Local Mode"


RIP            "RIP", "RIPScrip" or "Remote Imaging Protocol" is a popular
               graphical terminal standard that is used with BBS systems.
               Unlike other terminal emulation standards, such as the ANSI and
               AVATAR modes supported by OpenDoors, RIP operates in bit mapped
               graphics mode, allowing features such as lines, circles and
               icons to be drawn on the remote screen. OpenDoors provides
               support for RIP graphics, although OpenDoors operates in text
               mode itself.


STATUS LINE    Usually, the bottom two lines of the screen, as displayed by an
               OpenDoors door, is devoted to a status line (although this
               status line may be turned off). This status line will display
               information about the user who is online, along with information
               about the current state of the BBS system, and a reference to
               the sysop function keys. See also "Local Window".


SYSOP          The term sysop is a short-form for "SYStem OPerator", and refers
               to the individual who is responsible for running and maintaining
               the BBS system. The sysop is usually the only person who has
               direct access to the local keyboard and computer on which the
               BBS, BBS utilities and BBS doors are running.


SYSOP CHAT     See "CHAT MODE".


===============================================================================
OpenDoors 6.00 Manual                                          End of Page 265

SOURCE CODE    The term "source code" refers to the original file or files that
               where used to produce a library or executable program. The
               source code files contain the language statements or commands
               that are directly written by the programmer. These source code
               files are then compiled to produce an executable file that may
               be "run".


SYSOP PAGE     Sysop paging refers to the process whereby a user of the BBS
               system may call or page for the sysop's attention, when they
               wish to "chat" with the sysop, and can be thought of as being
               similar to the ringing of a telephone. When a user pages the
               sysop, the BBS system will produce some sort of sound, which the
               sysop may elect to respond to if they are within hearing range
               of the computer. The most common reasons for a user to page a
               sysop include the case that they are having difficulty with some
               aspect of the BBS, that they have a question, or if they are
               simply interested in having a friendly conversation with the
               sysop. Obviously, since the sysop may not wish to be disturbed
               by users paging at certain times (such as when they are in bed),
               most BBS software provides controls to allow you to control
               paging. These features might include the ability to set hours
               for each day of the week during which paging will be permitted,
               and the ability to temporarily override the ability of some or
               all callers to page the sysop.


USER           When applied to computers in general, the term user simply
               refers to any person using the computer hardware and software.
               However, when applied particularly to BBSes, the term user
               refers specifically to a person who calls the BBS, to carry out
               activities such as communicating via messages or chatting,
               uploading and downloading files, or using doors. Often, the term
               user is used in contrast with the term sysop. In this case,
               users are all of the people who call and user the BBS, other
               than the sysop themselves.


WIN32          Win32 is the name of the API that programs written to run under
               Microsoft Windows 95 and Microsoft Windows NT use to access
               operating system services. Win32 programs use a flat, 32-bit
               memory model and have access to advanced operating system
               services such as multithreading. Win32 programs cannot run under
               DOS nor OS/2. While some Win32 programs can run under Windows
               3.x using the Win32s system, OpenDoors cannot since it requires
               multithreading services that are not provided by Win32s.






===============================================================================
OpenDoors 6.00 Manual                                          End of Page 266

 IIIIII
   II
   II
   II
   II
   II
 IIIIII
-------------------------------------------------------------------------------
INDEX



A                                          D

About This Manual ..................21     Debugging                     21, 241
Access Level ......................178     Demo Version........................9
Alias .............................170     Display Functions..............42, 63
ANSI Graphics                              Displaying Text....30, 41, 42, 60, 62
Archive Contents ..................248     Door Driver Functions..............40
ASCII Chart ........................86     Door Driver Module..............6, 40
ASCII Mode ........................255     Door Functions.....................45
AVATAR Graphics ....118, 134, 167, 256     Door Information File30, 33, 150, 158
                                           Door Settings.....................182
B                                          DORINFOx.DEF File..................33
                                           DOS Shell.........................192
Baud Rate .........................154     Download Limit....................169
BBS Information ...................158
BBS Name ..........................164     E
BBS Systems ........................30
Before Exit Function ..............191     Error Free Connection.............170
Box Characters ...............185, 191     Example Program - Changing Only
BPS Rate ..........................154      Foreground/Background Colour ....132
Built-In Function Keys ............212     Example Program - Choosing Text
                                            Colour ..........................129
C                                          Example Program - Clearing A Line..56
                                           Example Program - Dialog Box.......66
Caller Information ................158     Example Program - Door And Utility In
Carrier Detect .................51, 97      One Program ......................92
Chat ..........................38, 104     Example Program - Drawing A Window118
Chat Mode ....................104, 259     Example Program - Exiting A Door...79
Colour Attribute Codes ............128     Example Program - First Door.......29
Colour Constants ..................132     Example Program - Hanging Up In CBV
Colour Customization215, 229, 232, 236      Door .............................51
Colour Functions ...................42     Example Program - Hotkeyed Menu....91
Colours .................110, 128, 131     Example Program - Input Key.......115
Common Problems ...................243     Example Program - Setting Door Info
Compiler Errors ...................243      File Location ...................150
Compiling With OpenDoors ...........22     Example Program - Shelling To DOS.141
Custom Function Keys ..............213     Example Program - Terminal Emu.....62
                                           Example Program - Testing Available
                                            Door Information ................158

===============================================================================
OpenDoors 6.00 Manual                                          End of Page 267



Example Program - Testing Screen           M
  Clearing Capabilities             57
Example Program - Transferring A File      Memory Models..................23, 24
  Using DSZ........................142     Memory Swapping...................209
Example Program - User Statistics          Modem Port........................157
  Door.............................113     Modem Settings....................153
Example Program - Vote .............33
Example Program - Waiting For CR ...54     N
Exiting A Door Program .............79
                                           New Version.......................249
F                                          Node Number.......................152

Features ............................6     O
Feedback Form ......................19
File Display Functions .............44     Object File.......................263
FILES.BBS File .....................98     od_autodetect() Function...........48
Fossil Driver .....................260     od_carrier() Function..............51
FOSSIL port .......................157     od_chat() Function.................50
Function Keys .................97, 211     od_clear_keybuffer() Function......53
Future Versions ...................253     od_clr_line() Function.............55
                                           od_clr_scr() Function.........57, 243
G                                          od_colour_config() Function........59
                                           od_control Structure..........31, 148
Getting In Touch With Us ..........246     od_disable Variable...............198
Graphics Mode ...........165, 167, 255     od_disp() Function.................60
                                           od_disp_emu() Function.............62
H                                          od_disp_str() Function.............63
                                           od_draw_box() Function.............65
History ...........................249     od_edit_str() Function.............68
Hotkeys ............................90     od_exit() Function...31, 79, 191, 195
                                           od_get_answer() Function...........81
I                                          od_get_input() Function............82
                                           od_get_key() Function......30, 53, 85
IBM Colour Attribute Codes ........128     od_gettext() Function..............89
IEMSI Session Information .........161     od_hotkey_menu() Function..........90
Inactivity Timeout ......199, 200, 202     od_init() Function.............31, 92
Input Functions ............44, 81, 85     od_input_str() Function........53, 95
                                           od_kernal() Function...............31
K                                          od_kernel() Function...............97
                                           od_list_files() Function...........98
Keyboard Buffer ...........53, 97, 115     od_log_write() Function...........100
Keys ...............................97     od_multiline_edit() Function......101
                                           od_page() Function...........104, 207
L                                          od_parse_cmd_line() Function......105
                                           od_popup_menu() Function..........107
Language Customization ............216     od_printf() Function.....29, 110, 195
Learning OpenDoors .................29     od_putch() Function...............115
Library ...........................261     od_puttext() Function.............116
LIBrary Files ......................24     od_repeat() Function..............118
Line Number .......................152     od_restore_screen() Function......120
Linking ............................23     od_save_screen() Function.........121
Local Mode ...............33, 200, 261     od_scroll() Function..............123
Locked ............................262     od_send_file() Function...........124
                                           od_set_attrib() Function..........128

===============================================================================
OpenDoors 6.00 Manual                                           End of Page 268



od_set_color() Function ...........131     Solutions To Problems.............243
od_set_cursor() Function ..........134     Source Code................10, 17, 20
od_set_dtr() Function .............135     Special Thanks....................254
od_set_personality() Function .....136     Status Line...104, 137, 209, 210, 264
od_set_statusline() Function ......137     Stop Key..........................203
od_sleep() Function ...............139     Support...........................244
od_spawn Function .................208     Support BBS.............244, 245, 246
od_spawn() Function ...............141     Swapping..........................209
od_spawnvpe() Function ............143     Sysop Chat...............38, 104, 192
od_window_create() Function .......145     Sysop Function Keys...............211
od_window_remove() Function ..147, 148     Sysop Keys.........................97
OPENDOOR.H File ............22, 29, 34     Sysop Name........................164
OpenDoors BBS ................244, 245     Sysop Next Setting................184
OpenDoors Customization ...........187     Sysop Page........................207
OPENDOORS Echo ....................245     Sysop Paging.................104, 265
OpenDoors History .................249     System Event......................162
Our Address .......................246     System Name.......................164
Output Functions ...................42
Output Window .................34, 263     T

P                                          Terminal Emulator........62, 124, 125
                                           Terminal Emulator Control Codes...126
Paging Hours .................182, 183     Text Customization................216
Paging The Sysop ..................104     Thank-yous........................254
Pause Key .........................203     Time Left.........................179
Phone Number ......................171     Timeout............................97
Printing ..30, 41, 60-63, 90, 110, 115     Troubleshooting....................21
Printing Manual ....................22
Problems ...........................21     U
Product Support ...................244
Project Files ......................23     User Handle (Alias)...............170
                                           User Information..................158
R                                          User Keyboard Off Key..............53
                                           User Keyboard Setting.............184
Registration ..9, 10, 12, 18, 246, 264     User Name.........................174
Registration Form ..............15, 18     User Password.....................176
RIP ...............................264     User Timeout.......................97
RIPScrip ..........................264
                                           V
S
                                           Version History...................249
Screen Functions ...................42
Screen Length .....................177     W
Screen Width ......................178
Security Level ....................178     Want-Chat Setting.................180
Setting Colours .........110, 128, 131









===============================================================================
OpenDoors 6.00 Manual                                           End of Page 269