home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / TGARTS.ZIP / TGDEV309.ZIP / DEVEL309.DOC < prev    next >
Text File  |  1997-11-06  |  68KB  |  1,326 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.                    Telegard 3.10 Development Kit (v3.09)
  15.  
  16.  
  17.                              November 6th, 1997
  18.  
  19.  
  20.                      Copyright 1995,1997 by Tim Strike.
  21.                             All rights reserved.
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.      INTRODUCTION                                                        I
  29.      _____________________________________________________________________
  30.  
  31.      PREFACE
  32.  
  33.          This documentation was designed to help utility developers find
  34.          information regarding Telegard data files and formats with
  35.          relative ease and speed.
  36.  
  37. |        This kit is for the first 3.09 gamma (1), and may not represent 
  38. |        the final structures for Telegard 3.10.  I have marked all changes
  39. |        from the 3.01 development kit release with a vertical bar in the
  40. |        left margin.  For Telegard 3.0 references which have not changed
  41. |        in Telegard 3.10, I have used 3.0+ as the version reference.
  42.  
  43.          Before developing utilities for Telegard, it would be appreciated
  44.          if this document was thoroughly read.  This documentation contains
  45.          several discussion sections which outline methods, procedures and
  46.          data file formats.  The discussion section explains all of the
  47.          data files that Telegard maintains, and how to access the data
  48.          and what must be done to properly access the information therein.
  49.  
  50.          It is imperative that important items in this document are
  51.          followed when developing utilities for use with Telegard.  By
  52.          following these specifications and helpful hints, you reduce the
  53.          chance of producing a poorly written/working utility.
  54.  
  55. |        Telegard 3.0+ brought about a major revision in the way that many
  56.          of the data files are used.  You will find that many of the files
  57.          with the same name no longer use the same data format; please
  58.          ensure that even when UPDATING utilities that you look at the
  59.          information which is provided for each file type (if they are not
  60.          listed under major headings in the DEVELOPMENT DISCUSSION section,
  61.          they will be listed under the heading OTHER FILES).
  62.  
  63.          After the discussion section follows a section on distribution.
  64.          This section outlines the best ways to document your work, the
  65.          best ways to ensure accurate distribution and even how to access
  66.          the Telegard File Distribution Network, which will distribute your
  67.          files across North America and overseas and give you the widest
  68.          distribution for nothing more then a simple phone call to one of
  69.          the development sites (provided that your distribution package
  70.          follows the simple guidelines that are set forth in this section).
  71.  
  72. |        We urge the development of quality utilities for Telegard 3.10.  
  73.          We also urge you to look over this document in it's entirety so 
  74.          that you will be able to accomplish your goal of writing a utility 
  75.          which works properly and efficiently with Telegard.
  76.  
  77.  
  78.      CONTACT INFORMATION
  79.  
  80.          The best way to contact the Telegard development team is through
  81.          our support conference on Fidonet, TG_SUPPORT.  In this conference
  82.          we will answer all questions relating to Telegard and Telegard
  83.          third-party utility development.  This is also the preferred 
  84.          method of contact.
  85.  
  86.          The next best way is to contact us through Fidonet/Internet
  87.          netmail.
  88.  
  89.          The author of this document can be reached via the following
  90.          addresses:
  91.  
  92.                  Fidonet    1:259/423
  93. |                Internet   tim@telegard.net
  94.  
  95.          Please feel free to contact us with regard to Telegard utility
  96.          development -- questions relating to data file format, access or
  97.          any other questions are welcomed.
  98.  
  99.  
  100.      INCLUDED FILES
  101.  
  102.          Several files have been included in this package.  If any of these 
  103.          files are missing, please obtain a new development package from 
  104.          one of our development sites.
  105.  
  106.             DEVEL309.DOC    Telegard 3.09 Development Documentation
  107.             WHATSNEW.309    Telegard 3.09 Structure Change Log
  108.             README.TXT      'Read-Me' information
  109.         
  110.             TELEGARD.H      C/C++ structure file
  111.             TELEGARD.INC    Turbo/Borland Pascal structure file
  112.             TEXT_ADF.TXT    Text File Description - Archive Definitions
  113.             TEXT_MDF.TXT    Text File Description - Modem Definitions
  114.             TEXT_PDF.TXT    Text File Description - Protocol Definitions
  115.  
  116. |           TESTINC.PAS     List structure sizes for Pascal
  117. |           TESTH.C         " " for C/C++
  118. |           TEST.OUT        Expected output from TESTINC.PAS/TESTH.C
  119.  
  120. |           BITPLANE.PAS    Sample routines for modifying bitplanes
  121.  
  122.             FILE_ID.DIZ     Automated package description
  123.             PACKING.LST     Package file listing
  124.             97-11-05.PR     Press Release: 05 Nov 97
  125.  
  126.  
  127.  
  128.      DEVELOPMENT DISCUSSION                                             II
  129.      _____________________________________________________________________
  130.  
  131. |    SOURCE CODE EXAMPLES
  132. |
  133. |        I have not released any secondary packages contrary to what 
  134. |        previous development kits have discussed.  If you wish to have 
  135. |        some source code examples, please provide me with a list of short 
  136. |        examples that you would like to see (C or Pascal).
  137.          
  138. |    TELEGARD 3.10 (3.09.g1)
  139.  
  140. |        Telegard 3.10 was developed in Borland Pascal 7.0 -- with portions 
  141.          compiled in C and Assembly.
  142.  
  143. |        All the Telegard 3.10 internal data structures use standard pascal 
  144.          methods and constructors, and this should be noted by utility 
  145.          developers who will use other languages.  Structures which are 
  146. |        external to Telegard 3.10 (i.e. data files which other programs 
  147.          create and Telegard just uses, things like JAM, Squish, etc.) use 
  148.          either C or Pascal methods and constructors; ensure that you 
  149.          determine which is which and make the necessary adjustments in 
  150.          your programs.
  151.          
  152. |        C/C++ users, please remember that Turbo Pascal uses a different 
  153. |        string storage method.  This method uses the first byte of the 
  154. |        string to indicate the length, and the remainder of the bytes to 
  155. |        store the string.  The string is not necessarily null terminated.
  156.         
  157.  
  158.      DATE FORMATS
  159.  
  160. |        Telegard 3.10 uses two different types of date formats; the first
  161.          is a simple string format and the second is a Unix timestamp.
  162.  
  163.          STRING DATE FORMAT    --   --   --   --   --   --   --   --   --
  164.  
  165.          The string dates are always in the same format (MM/DD/YY) and are
  166.          converted to other formats on the fly.  This date format is stored
  167. |        in a string of length 8, with "/" as the date separator.
  168.  
  169.          UNIX DATE FORMAT --   --   --   --   --   --   --   --   --   --
  170.  
  171.          The second date format is a Unix timestamp.  Effectively this is
  172.          the number of seconds since midnight, January 1st, 1970.  Several
  173.          compilers and implementations use different algorithms to
  174.          calculate the date format.  Telegard uses the local system time
  175.          (i.e. the time on the machine) and calculates the number of
  176.          seconds since midnight, January 1st, 1970, including the extra
  177.          days during all leap years (which some implementations ignore).
  178.          No adjustments are made for timezone, and no conversion is done
  179.          to Greenwich Mean Time (GMT).
  180.  
  181.  
  182.      CONFIGURATION FILES
  183.  
  184.          Data file CONFIG.TG   --   --   --   --   --   --   --   --   --
  185.  
  186.          The main configuration is stored in CONFIG.TG in the main BBS
  187.          directory.  This file contains all paths and all necessary
  188.          configuration items that pertain to operation and selection of the
  189.          BBS' features.  The CONFIG.TG file can be opened and modified;
  190.          please note that modifications to the file will not immediately be
  191.          loaded into memory in a multinode environment.  If another task
  192.          overwrites the file contents, another node could still overwrite
  193.          and replace those contents at another time.
  194.  
  195. |        The hiddenPW, resvmsgarea and resvfilearea fields should *never* 
  196. |        be updated by an external utility, as the consequences of doing 
  197. |        this could be very dire.
  198.  
  199.          Data file SYSTEM.DAT  --   --   --   --   --   --   --   --   --
  200.  
  201.          The SYSTEM.DAT file contains operation variables which are very 
  202.          sensitive to changes, and thus, the following procedure must be 
  203.          followed (in single node or multinode environments):
  204.  
  205.                (1) Open file
  206.                (2) Obtain a lock on the entire files contents - if
  207.                        lock can not be obtained, cycle for waiting period
  208.                        abort w/error if still unable
  209.                (3) Read the current data record into memory
  210.                (4) Update record (do *NOT* sit idle waiting for input
  211.                        or other processes)
  212.                (5) Write the new information to the file
  213.                (6) Unlock file contents, close file
  214.  
  215.          The information in this record must be current, and always must be
  216.          accessed by only one source at a time.
  217.  
  218.  
  219.      SEARCHING INDEXES
  220.  
  221.          Several of the data files used in Telegard 3.0+ are indexed to 
  222.          make searching for data quicker and easier to accomplish.  The 
  223.          index files, marked with TG_INDEX in the structures, contain 
  224.          different information but are built and maintained the same way.
  225.  
  226.          The purpose of the index files (*.IDX) is to ensure quick access
  227.          to the information.  The index file design used in Telegard
  228.          facilitates not only the searching of existing records, but also
  229.          the addition of new records.
  230.  
  231.          The records in the index files all contain some data [key] and
  232.          a number location [offset].  The [key] is used to find the
  233.          correct record, and the [offset] can be used with another file
  234.          to directly load the necessary information.
  235.  
  236.          The index files (*.IDX) have two distinct sections; the first is a
  237.          sorted database, and the second part is an unsorted database (used
  238.          primarily for additions to the index).  A binary search is used
  239.          for the first section, and a sequential search for the second
  240.          section.  The binary search uses the sorted characteristic to
  241.          chop the search area in half each time; this results in a very
  242.          quick search of the sorted section of the database.  If the [key]
  243.          can not be found there, the sequential search will check through
  244.          the small unsorted portion.  If the [key] is not found there, the
  245.          [key] does not exist.  The important thing to note about this
  246.          indexing method is that the sorted database will be significantly
  247.          large compared to the unsorted portion.  Frequent updates of the
  248.          database using the indexing utilities provided with Telegard will
  249.          ensure that the fastest searching time is always maintained.
  250.  
  251.          When the index files are first built, all valid records will be
  252.          added to the file and sorted.  When new records are created, the
  253.          records will be added to the end of the database and remain there
  254.          until index maintenance is completed.
  255.  
  256.          The first record in the index files contains the record offset
  257.          of the first unsorted record.  This is important to note, since
  258.          the binary search should ONLY be run on the database starting at
  259.          record #1 and ending at the last sorted record.  The sequential
  260.          search should start at the first unsorted record and end at the
  261.          last record in the index file.
  262.  
  263.                 Record 0      Unsorted index record [offset=NS]
  264.                 Record 1      First sorted record, if NS <> 1
  265.                 Record NS-1   Last sorted record
  266.                 Record NS     First unsorted record -- could be <EOF>
  267.                 to <EOF>      Last unsorted record
  268.  
  269.          To search for a [key] the following procedure should be followed:
  270.  
  271.               1. Read record #0, store [offset]=NS
  272.               2. Binary search on record #1 through record NS-1.
  273.                      If [key] found, skip to FOUND.
  274.               3. Sequential search of record NS through <EOF>.
  275.                      If [key] found, skip to FOUND.
  276.               4. [key] does not exist, skip to END.
  277.           FOUND. If [offset] = -1, [key] does not exist, skip to END.
  278.                  Otherwise, [key] exists, use [offset] to find data.
  279.             END.
  280.  
  281.          The indexing methods used in Telegard 3.09 provide fast and
  282.          efficient loading and manipulation of the data.  There are other
  283.          ways to search for information, but if the index files exist for
  284.          the information you are looking for, they are the best way to find
  285.          the information.
  286.  
  287.          ADDING INDEX RECORDS  --   --   --   --   --   --   --   --   --
  288.  
  289.          Search the index to see if a record already exists for that [key].
  290.          If it does exist, there are two possibilities (a) this is an
  291.          adjusting record, in which case adjust the [offset] field and
  292.          rewrite the record or (b) this [key] already exists and does not
  293.          need to be added, or can not be added.  If is does not exist,
  294.          simply create the necessary record and then write it to the end
  295.          of the index file (simple, eh?).
  296.  
  297.          REMOVING INDEX RECORDS     --   --   --   --   --   --   --   --
  298.  
  299.          Search the index for the necessary [key] - if a record already
  300.          exists, set the [offset] field to -1 and rewrite the record.  If
  301.          the record doesn't exist, it can't be deleted now can it (smile).
  302.  
  303.  
  304.      USERS
  305.  
  306. |        Telegard 3.0+ no longer uses USER NUMBERS to find records in the
  307.          data files.  Record #2, therefore, is not User #2 like older
  308.          versions of Telegard had implemented.
  309.  
  310.          USER-ID     --   --   --   --   --   --   --   --   --   --   --
  311.  
  312.          Since user numbers were no longer tied to user records, a user-id
  313.          was created to give each user a 'id-tag' that was not associated
  314.          with user/real names (since those change frequently).  The user-id
  315.          number is generated when the user first logs on and is ordered
  316.          sequentially from 1 (i.e. the first available user-id after 0 is
  317.          assigned to the new user).  This user-id field is only used to
  318.          reference the user' records in other files.  It is *not*
  319.          associated with the users data file position; i.e. user-id #2 is
  320.          not necessarily found in record position #2.
  321.  
  322.          PASSWORD TEXT/CRC FIELDS   --   --   --   --   --   --   --   --
  323.  
  324.          The pwtext field *may* be empty.  Please observe the following 
  325.          when updating passwords:
  326.  
  327.          1. All password input is UPPERCASE
  328.  
  329.          2. If ConfigRec.HiddenPW = TRUE, then only the CRC32 of the 
  330.             password is stored in the user record (userrec.crcpw). 
  331.  
  332.          3. If ConfigRec.HiddenPW = FALSE, both the CRC32 and the actual
  333.             password are stored in the user record.
  334.  
  335.         *4. When checking input passwords against the file, only the CRC32
  336.             value should be tested (the pwtext may or may not be correct).  
  337.             If ConfigRec.HiddenPW = FALSE, and the pwtext field is EMPTY, 
  338.             then after a correct password the field will be automatically
  339.             updated.  If ConfigRec.HiddenPW = TRUE, the pwtext will *not* be 
  340.             updated (this is obvious).
  341.  
  342.         *5. Passwords should *only* be displayed (pwtext) if the CRC32 of
  343.             the pwtext field *matches* the pwcrc field.  Otherwise, the 
  344.             pwtext field is likely incorrect.  When changing passwords, the
  345.             user should be prompted only, not shown their previous password.
  346.  
  347.         *6. The CRC32 calculation used by Telegard is a standard CRC32
  348.             calculation.  The initial value is 0xFFFFFFFF (FFFFFFFFh)
  349.             and only the contents of the password are used (i.e. start at
  350.             position 1, not 0 (the length byte).  Remember, the passwords
  351.             are in uppercase.
  352.  
  353.          Data file USERS.DAT   --   --   --   --   --   --   --   --   --
  354.  
  355.          The USERS.DAT data file has no specific order, except that the
  356.          SysOp Record must be record #0.  The data file may be sorted in
  357.          any manner that is deemed important, except that record #0 should
  358.          never be moved; that is the only restriction to the order of the
  359.          file.
  360.  
  361.          Data file USERS.IDX  [TG_INDEX] --   --   --   --   --   --   --
  362.  
  363.          To speed up data searches a USERS.IDX file has been created
  364.          (replacing NAMES.LST from older versions of Telegard).  The index
  365.          file contains both user aliases and real names (if different) so
  366.          that searches can be completed using either one.  The offset
  367.          provided in the index record is the record position offset in
  368.          USERS.DAT.
  369.  
  370.          Data file USERID.IDX  [TG_INDEX]     --   --   --   --   --   --
  371.  
  372.          To speed up associative data searches, a USERID.IDX file has been
  373.          created.  The index file contains the userid's of all active users
  374.          so that searches can be completed by finding the matching id.  The
  375.          offset provided in the index record is the record position offset
  376.          in USERS.DAT.
  377.  
  378.          SEARCHING FOR USERS   --   --   --   --   --   --   --   --   --
  379.  
  380.          Use the index files to quickly search for users (user name/alias
  381.          or id) or use a sequential search on USERS.DAT to search for other
  382.          fields.
  383.  
  384.          DELETING USERS   --   --   --   --   --   --   --   --   --   --
  385.  
  386.          Deleting users from the database is a relatively simple task, but
  387.          has many associated items which must be properly executed for the
  388.          data files to be tidy and efficient.
  389.  
  390.               (1) Remove user records from *.IDX files (see section on
  391.                      TELEGARD INDEXES - REMOVING INDEX RECORDS )
  392.               (2) Remove all email (base 0) to user
  393.               (3) Remove all shortmsgs (SHORTMSG.DAT) to user
  394.               (4) Adjust voting records for user (VOTING.DAT - adjust totals)
  395.               (5) Reset all lastread pointers to ZERO
  396.               (6) Remove macro record of user (null MACRO.DAT.UserId, set
  397.                       macro pointer to -1)
  398.               (7) Set USERID field to ZERO
  399.               (8) Set udeleted in user flags
  400.  
  401.          Following those instructions will lead to the most compact data
  402.          files and ensure that data records are not accidentally
  403.          cross-linked.
  404.  
  405.          PACKING USERS    --   --   --   --   --   --   --   --   --   --
  406.  
  407.          All deleted users can be removed from the data file by simply
  408.          removing their data record (provided that the users were properly
  409.          deleted as above).  All this entails is that the users record is
  410.          overwritten with an active record, or a new data file is created
  411.          with only the active user records).
  412.  
  413.          SORTING USERS    --   --   --   --   --   --   --   --   --   --
  414.  
  415.          Since the dependency on user numbers no longer exists, user
  416.          records can be sorted in any manner with any method.  The only
  417.          restriction (as noted above) is that Record #0 must remain as
  418.          Record #0 at all times (it should *not* be sorted).
  419.  
  420. |    SCAN RECORDS
  421. |
  422. |        Telegard 3.10 uses a new method for storing user scan records;
  423. |        this method is considerably faster, and uses less storage than 
  424. |        it's predecessor found in Telegard 3.02-.  Unfortunately with
  425. |        that speed increase also comes some complexity.
  426. |
  427. |             1) File and message areas can not be arbitrarily inserted
  428. |                and deleted without adjusting the scan records
  429. |             2) File and message areas can not be updated while a user
  430. |                is online (since their records would not get updated)
  431. |       
  432. |        The speed increase is accomplished by loading all the scan records
  433. |        from a file, and storing them in memory.  All comparisons are then
  434. |        done from memory instead of from disk.  This will make day-to-day 
  435. |        operation of the BBS much faster.  
  436. |       
  437. |        In order to maintain the same level of message and file area 
  438. |        support (up to 32,000+ areas each), without sacrificing huge 
  439. |        amounts of storage space or memory, these tables of boolean values
  440. |        (true or false, 1 or 0) are compressed into bitplanes.  So each
  441. |        byte can store 8 areas instead of only 1.
  442. |
  443. |        The sample routines BITPLANE.PAS (No C/C++ version yet, sorry 
  444. |        folks; ask and ye shall receive however) have been included for
  445. |        manipulating these bitplanes.  These are the same routines used 
  446. |        within Telegard.
  447. |
  448. |        The MSCAN.DAT holds Message Scan records, and FSCAN.DAT holds File 
  449. |        Scan records.  The offset to any given user is 
  450. |        (userid-1)*(systat.resv...areas).  The bitplane is then stored in 
  451. |        systat.resv...areas sequential bytes.  So, to find the msg scan 
  452. |        records for userid N, the following is done:
  453. |               memalloc bitplane,systat.resvmsgareas
  454. |               open MSCAN.DAT;
  455. |               if (N-1)*(systat.resvmsgareas) < filesize
  456. |                  seek (N-1)*(systat.resvmsgareas);
  457. |                  read bitplane,systat.resvmsgareas;
  458. |               else
  459. |                  // record does not exist
  460. |               endif
  461. |               close MSCAN.DAT
  462. |               { . . . use as desired . . . }
  463. |               dealloc bitplane
  464. |     
  465. |        NOTE: The user may not have any scan records stored if they are a 
  466. |        new user and have not successfully completed a full login.
  467.  
  468.  
  469.      MESSAGES
  470.  
  471. |        Telegard 3.0+ no longer uses proprietary message formats, but
  472.          instead uses the standard formats SQUISH and JAM.  These two
  473.          formats provide standard access to the message bases, are
  474.          considerably more adaptable and provide similar performance to
  475.          the old Telegard formats without losing compatibility.
  476.  
  477.          Data file MAREAS.DAT  --   --   --   --   --   --   --   --   --
  478.  
  479.          The MAREAS.DAT data file stores all the datafile definitions for
  480.          Telegard message bases.  There are only a few areas of note in the
  481.          record format which will be outlined shortly.  The message bases
  482.          are stored in numerical order (i.e. base #1 is record #1) -- this
  483.          number will correspond to the message base number within Telegard
  484.          unless the base compression tables are on (this will have to be
  485.          handled differently by other utilities).
  486.  
  487.              *  If the FileName is blank, the message base is not active
  488.                 and should not be processed.
  489. |            *  JAM/Squish files will be stored in the MsgPath field -- if 
  490. |               they are not there, create them there.
  491.              *  The QwkIndex field should be a permanent number which
  492.                 should not be changed except for extreme repair procedures
  493.                 or for controlled maintenance purposes; the QwkIndex field
  494.                 is best changed by the indexing utility provided with
  495.                 Telegard.
  496.  
  497.              *  When changing a FileName the MAREAS.IDX file should be
  498.                 updated; the old record should be deleted and the new
  499.                 record should be created (see section on TELEGARD INDEXES -
  500.                 ADDING AND REMOVING INDEX RECORDS).
  501.              *  Similarly, if and when changing a QwkIndex number, the
  502.                 QWK.IDX file must be updated in the same fashion.
  503.  
  504.          Data file MAREAS.IDX  [TG_INDEX]     --   --   --   --   --   --
  505.  
  506.          The MAREAS.IDX file contains the base filenames and file offsets
  507.          into the file MAREAS.DAT for those bases.  This file can be used
  508.          to quickly locate a specific base by filename.
  509.  
  510.          Data file QWK.IDX  [TG_INDEX]   --   --   --   --   --   --   --
  511.  
  512.          The QWK.IDX file contains the QWK base numbers (QwkIndex) and the
  513.          file offsets into the file MAREAS.DAT for those bases.  This file
  514.          can be used to quickly locate a specific base by QwkIndex number.
  515.  
  516.          JAM FORMAT  --   --   --   --   --   --   --   --   --   --   --
  517.  
  518.          The JAM format uses an expandable record format which essentially
  519.          allows it to grow as needed for application purposes.  The purpose
  520.          of this section is not to outline how JAM works (the JAM API
  521.          released by the authors of JAM provides code examples and a text
  522.          development document) but rather to just quickly outline the
  523.          format and some assumptions used with Telegard 3.0+.
  524.  
  525.          The *.JHR file contains most of the information that is required
  526.          for messages.  The first record contains information about the
  527.          base that is being looked at.  The records afterward are variable
  528.          in length because of the numerous subfields that may or may not
  529.          exist for each message:
  530.  
  531.             jaminforec
  532.                jamhdrrec[1]
  533.                   subfield[1]
  534.                   subfield character buffer
  535.                      :
  536.                   subfield[n]
  537.                   subfield character buffer
  538.                jamhdrrec[2]
  539.                   :
  540.                jamhdrrec[n]
  541.  
  542. |        The subfield codes used by Telegard 3.0+ match all the standard JAM
  543.          subfield codes.
  544.  
  545.          ** NOTE: For bases where anonymous, anyname, etc postings are
  546.          used, the sender/receiver names will be "anonymous", "anyname",
  547.          etc.  The FTS-kludge "^aREALNAME: <name>" will be used to store
  548.          the posting users name (which will depend on the realname/alias
  549.          toggled on the base).  This kludge uses the standard subfield-id
  550.          of 2000.
  551.  
  552.          JAM stores its own lastread pointers in the *.JLR files.  To find
  553.          the correct lastread record for any user, a sequential search for
  554.          the matching user-id should be done.
  555.  
  556.          SQUISH FORMAT    --   --   --   --   --   --   --   --   --   --
  557.  
  558.          The Squish format is another dynamic message base, which allocates
  559.          itself in data chunks (frames) and links itself on the fly.  The
  560.          Squish bases automatically attempt to pack themselves for all
  561.          newly posted or incoming messages, which alleviates the job of
  562.          running a packer each night for the Squish message format (it is
  563.          however a good idea to run the packer on a frequent basis to
  564.          remove the unused frames and reduce disk usage (even at the lowest
  565.          level)).
  566.  
  567.          The Squish format is outlined well by it's author in the SQUISH
  568.          API package, which includes a comprehensive discussion of the
  569.          Squish format and methods for reading, writing and indexing the
  570.          message areas.
  571.  
  572.          The Squish format uses it's own lastread pointers, stored in the
  573.          *.SQL files.  To find the lastread record for any user, the offset
  574.          in the *.SQL file is userrec.userid-1 (so if the userid = 2, the
  575.          offset = 1 and therefore the record position = 1).
  576.  
  577.          QWK OFFLINE MAIL FORMAT    --   --   --   --   --   --   --   --
  578.  
  579.          Telegard 3.0+ implements the QWK mail format as per the QWK
  580.          specifications (covered well in the document package dealing with
  581.          the QWK layout, normally distributed with filenames similar to
  582.          QWKLAYnn.ZIP, where nn is the revision number (the latest at the
  583.          time of this release was nn=17).
  584.  
  585.          Data file *.QPT  --   --   --   --   --   --   --   --   --   --
  586.  
  587. |        Telegard 3.0+ also adds it's own pointer file, *.QPT which stores
  588.          the lastread pointers for the requested message bases.  This file
  589.          only contains the QWK base number and the lastread number, and is
  590.          sent with the QWK offline mail package to the user.
  591.  
  592.  
  593.     FILES
  594.  
  595. |        Telegard 3.10 uses a proprietary file base format, since there are 
  596.          few standard filebase formats which are suitable and efficient.
  597.  
  598.          Data file FAREAS.DAT  --   --   --   --   --   --   --   --   --
  599.  
  600.          The FAREAS.DAT data file stores all the datafile definitions for
  601.          Telegard file bases.  There are only a few areas of note in the
  602.          record format which will be outlined shortly.  The file bases are
  603.          stored in numerical order (i.e. base #1 is record #1) -- this
  604.          number will correspond to the file base number within Telegard
  605.          unless the base compression tables are on (this will have to be
  606.          handled differently by other utilities).
  607.  
  608.              *  If the FileName is blank, the file base is not active
  609.                 and should not be processed.
  610. |            *  *.FA and *.FAD files will be stored in the FilePath field 
  611. |               -- if they are not there, create them there.
  612.              *  Files are actually stored in the path pointed to be
  613.                 FAreaRec.Path.  Offline files are obviously not here.
  614.                 Check CD-ROM status to check access for writing to this
  615.                 path (read-only toggle means no writing!).
  616.              *  Telegard keeps track of CD-ROM titles that are in the
  617.                 drive at the current time - if the FAreaRec.CdLabel field
  618.                 contains a value and the area is toggled as CD-ROM Telegard
  619.                 will check the drive for the correct CD-ROM before trying
  620.                 to download/access.
  621.  
  622.              *  When changing a FileName the QFAREAS.IDX file should be
  623.                 updated; the old record should be deleted and the new
  624.                 record should be created (see section on TELEGARD INDEXES -
  625.                 ADDING AND REMOVING INDEX RECORDS).
  626.  
  627.          Data file FAREAS.IDX  [TG_INDEX]     --   --   --   --   --   --
  628.  
  629.          The FAREAS.IDX file contains the base filenames and file offsets
  630.          into the file FAREAS.DAT for those bases.  This file can be used
  631.          to quickly locate a specific base by filename.
  632.  
  633. |        Data file *.FA   --   --   --   --   --   --   --   --   --   --
  634. |
  635.          The *.FA data files contain the actual file records for the files
  636.          that are available and currently in that file base.  File records
  637.          are stored with a variable length description (which will be
  638.          touched on later).
  639.  
  640. |        Unlike previous versions of Telegard (2.7), record #0 is now used 
  641.          for file records.  Deleted records are completely removed from the 
  642.          file instead of sitting at the end of the file (like previous 
  643.          versions as well).
  644.  
  645.          The fields in the file records are not updated on the fly; if a
  646.          file is moved offline external to Telegard, then Telegard will not
  647.          know this unless the file has its status changed.
  648.  
  649. |        Data file *.FAD  --   --   --   --   --   --   --   --   --   --
  650. |
  651. |        The *.FAD data files contain the extended file descriptions 
  652. |        (stored in variable length text blocks).
  653.  
  654. |        Variable Length Descriptions    --   --   --   --   --   --   --
  655. |
  656. |        As mentioned before, Telegard stores the file records with 
  657. |        variable length descriptions, and uses a description ID key to 
  658. |        ensure that the correct description is being used.
  659. |        
  660. |        The descriptions are organized as follows:
  661. |
  662. |        File (FBREC)
  663. |           DescOffset                        { offset into .FAD for desc }
  664. |           DescLength                        { length of description, not }
  665. |                                             { including description key }
  666. |        File (*.FAD)
  667. |           Key [13 bytes]                    { match to FBREC.Filename }
  668. |           Bounded Text Buffer               { description of DescLength }
  669. |           (0..DescLength..MAXFDESCLENGTH)   { length }
  670. |        
  671. |        Telegard expects the text in the description to be written with 
  672. |        CR where appropriate.  In addition, Telegard currently expects the 
  673. |        descriptions to be limited to 45 characters per line, although 
  674. |        Telegard will reformat (as configured) as necessary.
  675.          
  676. |        Data file QFILES.IDX  [TG_INDEX]     --   --   --   --   --   --
  677.  
  678. |        The data file QFILES.IDX contains a listing of all the filenames
  679. |        that are currently available on the system.  It can be used to
  680.          check for duplicate files, to find files quickly (i.e. Request
  681.          Processors) or many other useful tasks.  The file *must* be
  682. |        maintained properly.  A file is unique to the filename and area 
  683. |        that it is stored in; two files can not have the same filename and 
  684. |        be stored in the same area, although they can have the same 
  685. |        filename and be stored in different areas.
  686.  
  687.          ADDING FILES     --   --   --   --   --   --   --   --   --   --
  688.  
  689.          When adding a file to a directory, the index should first be
  690. |        checked for a matching filename & area number.  If the file 
  691. |        already exists (and is not listed in the index as fnDeleted), the 
  692. |        utility should either (a) replace the old file with the new file, 
  693. |        removing the old file if necessary from other areas or (b) abort 
  694. |        adding the new file to the database.
  695.  
  696.  |       To add a file, simply write it's record into the correct *.FA
  697. |        file, the description to the .FAD file.  Then add the file into 
  698. |        the QFILES.IDX (see information on Telegard Indexes - Adding Index 
  699. |        Records).  DO NOT WORRY ABOUT UPDATING/REPLACING .IDX RECORDS 
  700. |        WHICH HAVE FNDELETED TOGGLED TRUE--THIS IS NOT NECESSARY.
  701.  
  702.          DELETING FILES   --   --   --   --   --   --   --   --   --   --
  703.  
  704.          A little more care should be taken when deleting files. The file 
  705. |        should be removed from the *.FA file (rewrite all records after 
  706.          that record to their current position-1, truncate the last record 
  707. |        from the file -- this ensures that the order of the *.FA file is 
  708. |        maintained).  The .FAD file does not need to be touched.  Finally, 
  709. |        the record must be removed from the QFILES.IDX file -- this is 
  710. |        done by toggling the fnDeleted flag on the appropriate QFILES 
  711. |        record.  DO NOT DELETE THE .IDX RECORD OR SET THE FILEAREA TO -1 
  712. |        AS WAS PREVIOUSLY EXPECTED.  The file should be removed from the 
  713. |        filepath if (a) necessary and (b) if possible.
  714.  
  715.          Data File PROTOCOL.DAT and Transfer Protocols  --   --   --   --
  716.  
  717.          Telegard maintains the transfer protocols in a file called
  718.          PROTOCOL.DAT.  Internally to Telegard, the protocols are referred
  719.          to as A-Z (i.e. 26 protocols can be stored in Telegard - one
  720.          record per protocol type).  Unlike previous versions of Telegard,
  721.          single, batch and resume protocols no longer require separate
  722.          records.  Record #0 refers to Protocol A, and record #25 refers to
  723.          Protocol Z.  All the protocol records are created in the file at
  724.          once, even if they are not used.
  725.  
  726.          If the ProtRec.Batch field is toggled TRUE, then the files will be
  727.          compiled into a filelist and this filelist will be sent as the
  728.          protocol filename (~PF).  Most protocols require a special flag to
  729.          list this file as a 'list' of files - this should be stored in the
  730.          ProtRec.flist field.  If the ProtRec.Bidirec field is toggled
  731.          TRUE, Telegard will search the temporary incoming directory for
  732.          files after the download.
  733.  
  734.          If ProtRec.Desc field is null, the protocol has not been defined.
  735.  
  736.  |       Data file *.QQQ, *.QQD - Download Queues  --   --   --   --   --
  737.  
  738. |        The download queues are stored in the temporary directory as the 
  739. |        files *.QQQ and *.QQD.  The download queues store information 
  740. |        about flagged files that are pending download by the user.  
  741. |        Information may be added/removed from these queues during a shell 
  742. |        since the queues will be re-processed after the shell.
  743.  
  744. |        The maximum number of queued files is maxqueue, any entries after 
  745. |        the maxqueue number will not be read by Telegard.
  746.  
  747. |        The description queues (*.QQD) use the same format as the file 
  748. |        area description files (*.FAD).
  749.  
  750.          Data file TESTINFO.DAT     --   --   --   --   --   --   --   --
  751.  
  752.          TESTINFO.DAT is a file that is created by virus scanners and
  753.          upload processors.  It includes information on file conversions,
  754.          descriptions, testing information, etc.  Telegard will read this
  755.          file (if toggled on) to process conversions and get information
  756.          regarding the file testing that has just occurred (after the virus
  757.          scanner has been run on the file).
  758.  
  759.          Records which are not scanned for a period of time can be removed
  760.          from the TESTINFO.DAT file - this indicates that errors have
  761.          occurred with the importation of these file records.
  762.  
  763.          THDPRO V11 and subsequent versions will produce this file.  At the
  764.          time of this writing, this is the only known product to use the
  765.          format.  Telegard will only work with THDPRO V11, since prior
  766. |        versions do not include the TG3.0+ product code.
  767.  
  768.  
  769.      OTHER FILES
  770.  
  771.          If the data file is not listed below, then no extra information is
  772.          required to access the data file; the record format is straight
  773.          forward, and the data is not organized in any varying manner
  774.          (usually there is only one record).
  775.  
  776.          Data file *.MNU  --   --   --   --   --   --   --   --   --   --
  777.  
  778.          The menu files are stored in a number of different paths; the
  779.          first being the default *.MNU path, stored in CONFIG.TG.  The
  780.          other paths are language specific paths (for more information see
  781.          section LANGUAGE CONSIDERATIONS).
  782.  
  783.          The menu files have a base header (MenuRec) and are followed by up
  784.          to MaxMenuCommands of the menu command records (CommandRec).  The
  785.          *.MNU files must be opened in non-record specific file formats
  786.          (i.e. for those Turbo Pascal people, define the type as FILE and
  787.          use BLOCKREAD/BLOCKWRITE to access the records).
  788.  
  789.          Data file *.BBS  --   --   --   --   --   --   --   --   --   --
  790.  
  791.          The BBSlisting files are stored in the ConfigRec.DataPath and
  792.          contain the BBS listing entries.  To add an entry, add to the end
  793.          of the file.  To remove an entry, physically remove the record.
  794.          If updating the entry, be sure to touch the BBSListRec.LastEdit
  795.          field with the current date.  MCI codes should be removed from all
  796.          BBSlist entries.
  797.  
  798.          Data file ARCHIVE.DAT --   --   --   --   --   --   --   --   --
  799.  
  800.          Telegard maintains the archivers in a file called ARCHIVE.DAT.
  801.          Internally to Telegard, the archivers are referred to as 1-MaxArcs
  802.          (i.e. MaxArcs archivers be stored in Telegard - one record per
  803.          archive type).  Record #0 refers to Archiver #1, Record #1 to
  804.          Archiver #2, etc.  All the archive records are created in the file
  805.          at once, even if they are not used.
  806.  
  807.          If ArchiveRec.Extension field is null, the archiver has not been
  808.          defined.
  809.  
  810.          Data file EVENTS.DAT  --   --   --   --   --   --   --   --   --
  811.  
  812.          The events that Telegard maintains are stored in the file
  813.          EVENTS.DAT.  This file contains an array of all the events:
  814.          Event(#1) - Event(MaxEvents) and includes a reserved record
  815.          Event(#0) which is used for processing external events.
  816.  
  817.          If the event is forced, users will be kicked off when the event
  818.          time occurs.  If the event is not forced, users will be allowed to
  819.          stay on past the duration of the event and the event will be run
  820.          afterwards.
  821.  
  822.          If Telegard is loaded from an external program (Mailer, external
  823.          call answer door, etc.) the Telegard events will still be adhered
  824.          to.  If the External Event command line is used (-X[n]) then
  825.          Telegard will also include this event time in its event
  826.          calculations.
  827.  
  828.          Data file GROUPS.DAT  --   --   --   --   --   --   --   --   --
  829.  
  830.          The groups that Telegard maintains are stored in the file 
  831.          GROUPS.DAT.  This file contains an array of all the groups: Group 
  832.          @ is record #0, Group A is record #1, etc.
  833.  
  834.          If GroupsRec.Name field is null, the group has not been defined.
  835.          
  836. |        The GROUPS.DAT file contains two records, the primary and 
  837. |        secondary group sets (main & file).
  838.  
  839.          Data file HISTORY.DAT --   --   --   --   --   --   --   --   --
  840.  
  841.          Telegard stores the call information in a file called HISTORY.DAT.
  842.          Unlike previous versions of Telegard in which this file was stored
  843. |        in reverse order, Telegard 3.0+ stores this file in ascending order
  844.          - i.e. the first record is the oldest record, the last record is
  845.          the newest record.
  846.  
  847.          To find the current days entry, check the last record in the file.
  848.          If the dates do not match up, the daily turnover event has not
  849.          been run; a new record can be created for the new day (this will
  850.          however result in Telegard not processing it's turnover events,
  851.          which include packing away the SysOp logs and other minor
  852.          maintenance processes) or the old record can be added to.
  853.  
  854.          Data file IEMSI.DAT   --   --   --   --   --   --   --   --   --
  855.  
  856.          The IEMSI.DAT data file is created in the \temp directory only if
  857.          a user connects with IEMSI.  The file contains the IEMSI record as
  858.          Telegard has processed the incoming IEMSI information.  At the end
  859.          of this record will be the actual buffer dump of the IEMSI
  860.          handshaking package which was received by the system - just in
  861.          case for some reason it is required or needed.
  862.  
  863.          The IEMSI buffer/protocol contains several fields which Telegard
  864.          can not process (either lack of functionality, or no real purpose
  865.          to process).  See the record structure for specific entries which
  866.          Telegard will not do anything with.
  867.  
  868.          Data file LANGUAGE.DAT     --   --   --   --   --   --   --   --
  869.  
  870.          The LANGUAGE.DAT file contains entries for all active languages
  871.          that have been defined for the system.  There are a couple of
  872.          fields of note which should be looked at when searching to load
  873.          menus or to display text files -- Telegard searches the language
  874.          specific entries first, and then if that fails, looks at the
  875.          default entries (if the language is setup to do that):
  876.  
  877.                      LANGUAGEREC RECORD              CONFIGREC RECORD
  878.                                              YES
  879.          START -> Is path field empty/null? -----> Search for file in
  880.                            |                   |   default path (MenuPath/
  881.                        NO  |                   |   TextPath).
  882.                            |                   |   File found? -----> Use
  883.                   Search for file in defined   |       |        YES
  884.              YES  path (MenuPath/TextPath).    |    NO |
  885.        Use <----- File found?                  |       |
  886.                            |                   |   File does not exist.
  887.                            | NO                |
  888.                            |                   |
  889.                   Check defined boolean for    |
  890.                   further searching.           |
  891.                   (CheckMenus/CheckText).      |
  892.                   Boolean = TRUE --------------'
  893.                            |
  894.                         NO |
  895.                            |
  896.                        File does not exist.
  897.  
  898.          The actual language text is stored in the *.TGL file with the
  899.          filename LanguageRec.Filename.  There are more considerations for
  900. |        Telegard 3.0+ with it's new multilingual capabilities; see the
  901.          section titled LANGUAGE CONSIDERATIONS.
  902.  
  903.          Data file LASTON.DAT  --   --   --   --   --   --   --   --   --
  904.  
  905.          The LASTON.DAT file is kept in sequential order - the last record
  906.          is therefore the newest record, and the first record is the
  907.          oldest.
  908.  
  909.          The LCallers record is written when the user first logs on.  The
  910.          LCallers.Caller field is used to update the record when the user
  911.          logs off to include the logoff time and download totals.
  912.  
  913.          If writing a utility which handles this information, please
  914.          observe the HIDDEN flag for any records that are going to be
  915.          displayed, and only display to the users with Co-SysOp ACS or
  916.          above.
  917.  
  918.          Data file LEVELS.DAT  --   --   --   --   --   --   --   --   --
  919.  
  920.          Telegard maintains the validation levels in a file called
  921.          LEVELS.DAT.  Internally to Telegard, the levels are referred to as
  922.          A-Z (i.e. 26 levels can be stored in Telegard). Record #0 refers
  923.          to Level A, and record #25 refers to Level Z.  All the level
  924.          records are created in the file at once, even if they are not
  925.          used.
  926.  
  927.          If LevelsRec.Desc field is null, the level has not been defined.
  928.  
  929.          Data file MACRO.DAT   --   --   --   --   --   --   --   --   --
  930.  
  931.          Telegard stores the macros in this file.  When searching for a
  932.          users macro record, check UserRec.MacroPtr and check there for the
  933.          macro offset.  If this record does not match the correct User-ID,
  934.          then set the UserRec.MacroPtr field to -1.  The order of the
  935.          macros in the array is alphabetical; ^D,^E,^F and ^R.
  936.  
  937.          Data file MODEM.DAT/MODEMnnn.DAT     --   --   --   --   --   --
  938.  
  939.          Modem information for single node boards is stored in MODEM.DAT.
  940.  
  941.          For multinode boards, the default modem information is stored in
  942.          MODEM.DAT (will be used for all new node entries).  Each node uses
  943.          the file MODEMnnn.DAT where nnn is the node number of that node.
  944.  
  945. |        Telegard 3.0+ uses VERBOSE result codes instead of NUMERIC result
  946.          codes.  This should make the configuration of modems considerably
  947.          easier.  If Telegard detects the ModemRec.Code_ARQ string in the
  948.          connect string then the connection is considered Error Correcting.
  949.          The modems are very sensitive to the ModemRec.Delay* fields;
  950.          adjusting these fields even slightly will affect most modems
  951.          considerably.
  952.  
  953. |        Telegard 3.0+ stores the IRQ/Base I/O address for the port.  These
  954.          are purely informational for Telegard - since TG uses the fossil
  955.          drivers, non-standard ports are addressed through the fossil 
  956.          driver.  However, GSZ/DSZ and several other protocols access the
  957.          ports directly and may need this information on a per-node basis.        
  958.  
  959.          For more multinode considerations, see the section titled
  960.          MULTINODE CONSIDERATIONS.
  961.  
  962.          Data file NODES.DAT   --   --   --   --   --   --   --   --   --
  963.  
  964.          Stores information on the node configuration (acs, logon times,
  965.          phone numbers) and the whos online information for each user.
  966.          The status text can be freely modified (it's displayed with an
  967.          MCI code in the language file) -- as long as the statusid is
  968.          correctly maintained for each node.
  969.  
  970.          Data file SHORTMSG.DAT/INODEnnn.MSG  --   --   --   --   --   --
  971.  
  972.          When searching for short messages to a user, search the file for
  973.          matching user-id fields -- the messages are in no particular
  974.          order, so the entire file will need to be sequentially searched.
  975.  
  976.          The status ID should always be 0 for all external Telegard 
  977.          utilities.  Telegard itself uses this field for internal transfer
  978.          stubs, and using a value other than 0 for external utilities can
  979.          potentially cause many problems.
  980.  
  981.          To send a message to an online user for them to read, write the
  982.          message to the appropriate INODEnnn.MSG file.  If the user logs
  983.          off before the message is received, it will be deleted.
  984.  
  985.          To delete the short message (when deleting a user or after the
  986.          message has been sent to the user), set the ShortMsgRec.UserId
  987.          field to 0 (instead of the normal -1 as most other deleted records
  988.          do).
  989.  
  990.          Do not delete short messages from the INODEnnn.MSG file.  Telegard
  991.          will clean these up as neccessary (on the next login to that 
  992.          node).
  993.  
  994. |        Data file SIGS.DAT    --   --   --   --   --   --   --   --   --
  995. |
  996. |        Telegard stores the user signatures in this file.  When searching 
  997. |        for a users signature record, check UserRec.SigPtr and check there 
  998. |        for the signature offset.  If it is not -1, then seek to this 
  999. |        record offset and read the record.  If the signature record does 
  1000. |        not match the correct userid, then set UserRec.SigPtr field to -1.
  1001.  
  1002.          Data file TIMELOG.DAT --   --   --   --   --   --   --   --   --
  1003.  
  1004.          The TIMELOG.DAT data file contains the time tracking graphs that
  1005.          each of the nodes maintains.  For single node systems, Record #0
  1006.          is the only record that is maintained.  For multinode systems,
  1007.          Record #0 is for Node#1, Record #1 is for Node#2, etc.
  1008.  
  1009.          The actual format of the data is not too significant, however:
  1010.  
  1011.              TimeLogRec.BusyPerHour contains the number of minutes in
  1012.              each hour breakdown that the node has been active for all
  1013.              days during the week.
  1014.  
  1015.              TimeLogRec.BusyPerDay breaks down that information into 20
  1016.              minute chunks for separate days of the week.  Both fields
  1017.              should be updated, rolling time past midnight if necessary.
  1018.              While it is possible to calculate the TimeLogRec.BusyPerHour
  1019.              fields from the TimeLogRec.BusyPerDay fields on the fly, that
  1020.              wasn't the way that I implemented the structure (grin).
  1021.  
  1022.          The TIMELOG.DAT data file can be deleted to restart the time
  1023.          tracking variables -- or alternatively the entire record can be
  1024.          set to null (fill all fields with chr #0).
  1025.  
  1026.      MULTINODE CONSIDERATIONS
  1027.  
  1028. |        Telegard 3.0+ opens all of its files in SHARE mode -- this means
  1029.          that for a multinode environment to exist, SHARE (or the OS
  1030. |        equivalent) must be loaded.  Telegard 3.0+ opens most of its files
  1031.          in fmReadWrite+fmDenyNone mode, although occasionally Telegard
  1032.          uses fmRead+fmDenyNone and fmWrite+fmDenyNone.  When files are
  1033.          being critically updated, Telegard will open the file in fmDenyAll
  1034.          mode (and will only keep the file open a short period of time).
  1035.  
  1036. |        A few circumstances arrive where Telegard 3.0+ actually LOCKS the
  1037.          file contents; JAM, Squish and the SYSTEM.DAT file are all cases
  1038.          where this is done.  For JAM and Squish, follow their respective
  1039.          development documents, and for SYSTEM.DAT see the information
  1040.          earlier in the document.
  1041.  
  1042.          When opening files in a multinode environment, there are a few
  1043.          things to keep in mind:
  1044.  
  1045.                 (a) Open the file in fmReadWrite+fmDenyNone unless there
  1046.                     is a specific reason you need to open the file in
  1047.                     another file mode.
  1048.                 (b) All data files should be open as _little_ as possible
  1049.                     (i.e. do not keep a file open while waiting for input
  1050.                     for example).
  1051.  
  1052.          Utility authors should not ignore the existence of multinode
  1053.          systems -- if your utility can't co-exist in a multinode
  1054.          environment, please specify it is for SINGLE node systems or for
  1055.          systems which are shut down ENTIRELY for a maintenance event (i.e.
  1056.          no nodes are left active during maintenance).
  1057.  
  1058.  
  1059.      LANGUAGE SUPPORT
  1060.  
  1061. |        Telegard 3.0+ introduced multilingual support for the BBS -- this
  1062.          means that different language strings can be setup and chosen by
  1063.          the online user to use.
  1064.  
  1065.          While it is not necessary for Utility authors (esp. those with
  1066.          with interactive doors) to support multiple languages, keep in
  1067.          mind that your product could be used on several different language
  1068.          platforms, and multilingual support could be beneficial.
  1069.  
  1070.          There are two common ways to handle multiple languages; the first
  1071.          is to create a text file which is loaded on the fly (good for
  1072.          small amounts of text), and the second is a data file which stores
  1073.          different strings for different languages.  Both methods are
  1074.          equally useful, and both have their drawbacks.  If you intend on
  1075.          supporting multiple languages, the choice of which method to use
  1076.          is entirely up to you.
  1077.  
  1078.          You can load the current users language from their user record,
  1079.          or you can have it passed on the command line with MCI codes.  The
  1080.          choice there is also up to the utility developer.
  1081.  
  1082.          Telegard language file structure is *not* distributed at the
  1083.          present time.  If you need text strings from a Telegard language
  1084.          file, please get in touch with the development team for more
  1085.          information.  The text strings are not always at the same file
  1086.          offset, so seeking into the file to get around the lack of
  1087.          structures will not consistently work properly.
  1088.  
  1089.  
  1090.      TEXT FILE DEFINITIONS
  1091.  
  1092. |        Telegard 3.0+ added the ability to import text file definitions for
  1093.          archivers, protocols and modem setups.  This allows standard
  1094.          configurations to be freely distributed and installed without the
  1095.          hassle of playing with the setup, or having to input all of the
  1096.          field information.  The text file definitions can be imported and
  1097.          exported by Telegard 3.0+, and the format is freely available so
  1098.          that distribution can easily occur.
  1099.  
  1100.          SysOps are encouraged to release new archive and protocol setups
  1101.          (provided they work, naturally) so that other SysOps can benefit
  1102.          from this new distribution method.
  1103.  
  1104.          The three formats (ARCHIVE, PROTOCOL and MODEM) are all discussed
  1105.          in their own document files (TEXT_ADF, TEXT_PDF, TEXT_MDF
  1106.          respectively).
  1107.  
  1108.  
  1109.      UTILITY DISTRIBUTION                                              III
  1110.      _____________________________________________________________________
  1111.  
  1112.      DISTRIBUTION TYPES
  1113.  
  1114.          When deciding to distribute your archive, there are several
  1115.          considerations you must make -- mainly dealing with what you want
  1116.          in return for your utility, etc.
  1117.  
  1118.          There are several distinct types of distribution, and several that
  1119.          fall in between categories - FREEWARE, SHAREWARE and COMMERCIAL
  1120.          SOFTWARE.  There are too many misconceptions and other conditions
  1121.          to describe each type of distribution in this document; the best
  1122.          method is to determine what you want, find a similar product and
  1123.          look at how they marketed their product.
  1124.  
  1125.      THE DISTRIBUTION ARCHIVE
  1126.  
  1127.          Most distribution archives are packed in such a way that SysOps
  1128.          can quickly look at what is inside and determine that they are
  1129.          getting everything that they need.  Some SysOps will not even
  1130.          look at your program if they are in any way suspicious of the
  1131.          contents of your distribution archive.  The following hints are
  1132.          aimed at helping you as a utility developer get the most out of
  1133.          your efforts.
  1134.  
  1135.          THE ARCHIVE FILENAME
  1136.  
  1137.          Almost all utilities will require more then one release version,
  1138.          so version numbers come in handy so that SysOps and users know
  1139.          what version of the program the current archive contains.  Thus,
  1140.          the version number normally finds its way into the filename of the
  1141.          archive, either as FFFFFFnn.EEE or FFFFFnnn.EEE depending on how
  1142.          the version numbers are represented (the first is for Vn.n, the
  1143.          second for Vn.nn -- your choice, personal freedom).  The filename
  1144.          could also contain many variations on the above format, such as
  1145.          FFnnnFFF.EEE, etc.  If at all possible, shorten your archive
  1146.          filename and add the version number to the name -- that is the
  1147.          best way to ensure that SysOps will take a look at your file.
  1148.  
  1149.          And if you generally think your utility will not have any more
  1150.          versions, give it another thought -- most do.
  1151.  
  1152.          THE ARCHIVE FORMAT
  1153.  
  1154.          The most popular archive formats are still ZIP and ARJ.  Other
  1155.          formats, such as RAR and LZH have followings in certain regions,
  1156.          but may not necessarily be used everywhere your archive may
  1157.          travel.  You are best to stick with the most popular archive 
  1158.          formats -- if you really want to deviate, consider self-extracting 
  1159.          forms of your archive choice.
  1160.  
  1161.          Also, if you are considering a self-extracting form, it is 
  1162.          suggested that you first pack your archive with the 
  1163.          self-extracting header, and then pack that .EXE file (and any 
  1164.          release notes) in a .ZIP file.  Your release notes should be 
  1165.          separated from the your self-extracting .EXE file -- some SysOps 
  1166.          read the release notes to determine if they want to look at the 
  1167.          file further.  If they only see an .EXE file, they might look the 
  1168.          other way.
  1169.  
  1170.          THE ARCHIVE CONTENTS
  1171.  
  1172.          All pieces of your program should naturally be contained in your
  1173.          archive (this includes all necessary data files, text files and
  1174.          of course the executable files).
  1175.  
  1176.          Your archive should also contain some form of documentation.  Even
  1177.          if your program doesn't do much, you should include documentation
  1178.          which at least covers the following topics: (a) a brief
  1179.          description of the program, (b) what files and versions of those
  1180.          files are required -- if any, and (c) contact information for 
  1181.          reaching the author.  The program documentation normally takes on 
  1182.          the name of the executable file with the extension of .DOC, 
  1183.          although this isn't a standard by any means.  Some software 
  1184.          distribution networks and BBSes refuse to carry files without 
  1185.          documentation -- consider this, and even if it's only a small 1k 
  1186.          file that you write, at least it ensures that your archive won't 
  1187.          be immediately deleted.
  1188.  
  1189.          Last minute release information should be put into one of several
  1190.          files; README.DOC, UPDATE.DOC or RELEASE.DOC.  These files are
  1191.          commonly searched and read before any other miscellaneous files
  1192.          are touched, so putting last minute information into these files
  1193.          is a good idea.
  1194.  
  1195.          If you wish to ensure that no files are added or removed from the
  1196.          archive, then a text listing (in both your main documentation and
  1197.          a separate file called PACKING.LST) of all the files in your
  1198.          archive is a good idea.
  1199.  
  1200.          If you wish to ensure that your archive is always described the
  1201.          way that you want it, a FILE_ID.DIZ file is a great idea (in fact,
  1202.          many popular BBSes now import the file as the file description,
  1203.          regardless of what the uploading user types in).  The FILE_ID.DIZ
  1204.          file is a text file which describes your program.  This file has a
  1205.          specific format; the maximum number of characters on any line is
  1206.          45, and the maximum number of lines is 10.  PLEASE DO NOT DEVIATE
  1207.          FROM THIS STANDARD - I REALIZE THAT OTHER AUTHORS HAVE AND JUST
  1208.          BECAUSE THEY DO DOES NOT MAKE IT RIGHT.  IF YOU WANT TO ENCLOSE A
  1209.          FILE_ID.DIZ FILE, ENCLOSE IT IN THE PROPER FORMAT.
  1210.  
  1211.          Some authors like to time stamp all the files in their archive so
  1212.          that all the files have the same date/time.  This makes it very
  1213.          easy for the author to check and see what files have been
  1214.          changed/added to the archive, by checking the file date when
  1215.          unpacking.  This obviously isn't something that everyone needs to
  1216.          do -- personal preference again.
  1217.  
  1218.          Beyond that, archives are archives.  Many authors have their own
  1219.          personal ways of building their archives and of setting up their
  1220.          distribution files.  You can be just as free with your decisions,
  1221.          just remember that when it comes to distributing your archive, you
  1222.          may be limiting your distribution if you don't put together a
  1223.          complete package.
  1224.  
  1225.      DISTRIBUTION
  1226.  
  1227.          There are several ways of distributing your final archive.  These
  1228.          ways will be discussed below so that you can determine the best
  1229.          way of getting your file out into the field.
  1230.  
  1231.          ADVERTISING
  1232.  
  1233.          The best place to advertise new utilities for Telegard is in a
  1234.          Telegard support conference.  The participants of the conference
  1235.          are mostly Telegard SysOps or other interested parties, and thus
  1236.          advertising in the support conferences will ensure that you hit
  1237.          your best (and most interested) audience.  TG_SUPPORT (our
  1238.          international Fidonet conference) is probably the best place to go
  1239.          for this advertising.  Please note however that you should 
  1240.          advertise your program only once or twice; advertising it daily 
  1241.          will unnerve many people and may turn them off of your product.
  1242.  
  1243.          FILE REQUESTS/MAIN BBS DOWNLOAD
  1244.  
  1245.          Setting up your archive for File Request (mailer) or BBS download
  1246.          ensures that people will be able to get to your file.  The problem
  1247.          with relying on this method alone means that your utility spreads
  1248.          only through direct contact (i.e. the interested SysOps must call
  1249.          your system to get the file).  This results in a very systematic
  1250.          and slow diffusion of your program -- although it's still
  1251.          recommended that you do this, there are other methods you should
  1252.          also consider.
  1253.  
  1254.          SOFTWARE DISTRIBUTION NETWORKS
  1255.  
  1256.          Software distribution networks distribute your file for you; you
  1257.          send it in to a site, which sends it to connected systems, and
  1258.          those systems send it to connected systems, etc.  This ensures
  1259.          that everyone who is connected to a specific SDN gets your file
  1260.          automatically (and in many cases, the file is automatically added
  1261.          to their file bases for download as well).  This method of
  1262.          distribution means that you program will be spread in a very
  1263.          hierarchical way, but will spread quickly and automatically -- two
  1264.          things new releases generally benefit from.
  1265.  
  1266.          There are several different distribution networks out their to
  1267.          distribute your utility.  Most networks have different categories
  1268.          for different types of files; so when choosing a network, make
  1269.          sure that they have an area for your type of utility (i.e. a
  1270.          Telegard area, or a BBS utility area).
  1271.  
  1272.          The Telegard Development Team has created a software distribution 
  1273.          network on the fidonet filebone which provides national and 
  1274.          international distribution through Fidonet channels.  This area
  1275.          has the tag name TG_SUP and should be available from your Fidonet
  1276.          hub.  If you would like your file distributed via this SDN, please
  1277.          see the section on DISTRIBUTION BY THE TELEGARD DEVELOPMENT TEAM.
  1278.  
  1279.          FTP (FILE-TRANSFER-PROTOCOL) SITES
  1280.  
  1281.          The internet provides a service called FTP, which allows for the
  1282.          collection of files over the internet.  This ensures that people
  1283.          can access your file without cost (except the cost of their
  1284.          Internet provider, if any) and at any time of the day, without
  1285.          worrying about busy signals, etc.  Although I'm not aware of most
  1286.          of the anonymous FTP sites, if you upload your utility to one of
  1287.          them into a /Telegard/ area, I am sure that you will get some
  1288.          internet users grabbing your file.
  1289.  
  1290.          The Telegard Development Team presently operates one official
  1291. |        FTP site, available through FTP at ftp://telegard.net/pub/tg. If 
  1292.          you would like your file distributed via this site, please see the 
  1293.          section on DISTRIBUTION BY THE TELEGARD DEVELOPMENT TEAM.
  1294.  
  1295.          DISTRIBUTION BY TELEGARD DEVELOPMENT TEAM 
  1296.  
  1297.          The Telegard Development Team operates many distribution sites 
  1298.          which can help distribution your utilities (TG_SUP, ftp site and
  1299.          the development sites).  To have your file distributed via our 
  1300.          distribution methods, please refer to the following "to-do" list:
  1301.  
  1302.                 (a) Ensure your program works (test!)
  1303.                 (b) Include complete documentation and contact information
  1304.                 (c) Include FILE_ID.DIZ file
  1305.                 (d) The preferred archive format is ZIP -- if you pack
  1306.                     in another format, please consider double packing so
  1307.                     that your file is ultimately in ZIP format.
  1308.                 (e) Upload to a Telegard Development Site, let the SysOp
  1309.                     know the file is there, and provide a simple one-line
  1310.                     description (this is for the actual SDN distribution)
  1311.                 (f) The file will be hatched into the TG_SUP as soon as
  1312.                     humanly possible.  Within 36 hours of that hatching,
  1313.                     the file will be placed on the FTP server.
  1314.  
  1315.  
  1316.      OTHER QUESTIONS                                                    IV
  1317.      _____________________________________________________________________
  1318.  
  1319.          If you have any further questions on topics discussed in this
  1320.          document, or even topics which were not discussed, please feel
  1321.          free to ask us in our support conference (preferred) or contact 
  1322.          the author of this document or get in touch with one of the 
  1323.          Telegard Development Team sites.
  1324.  
  1325.