//  This may look like C code, but it is really -*- C++ -*-

//  ------------------------------------------------------------------
//  The Goldware Library
//  Copyright (C) 1996 Folkert J. Wijnstra
//  Copyright (C) 1990-1999 Odinn Sorensen
//  ------------------------------------------------------------------
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Library General Public
//  License as published by the Free Software Foundation; either
//  version 2 of the License, or (at your option) any later version.
//
//  This library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Library General Public License for more details.
//
//  You should have received a copy of the GNU Library General Public
//  License along with this program; if not, write to the Free
//  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
//  MA 02111-1307, USA
//  ------------------------------------------------------------------
//  $Id$
//  ------------------------------------------------------------------
//  File structures for FMail 1.16
//  ------------------------------------------------------------------

#ifndef __gs_fm116_h
#define __gs_fm116_h


//  ------------------------------------------------------------------

#include <gftnall.h>


//  ------------------------------------------------------------------

#if defined(GOLD_CANPACK)
    #pragma pack(1)
#endif


//  ------------------------------------------------------------------

typedef struct
{
    char  programName[46];
    word  memRequired;
} archiverInfo;

typedef char pathType[48];

typedef struct
{
    ftn_addr    nodeNum;
    word        fakeNet;
} nodeFakeType;


//  ------------------------------------------------------------------
//  File header structure

#define DATATYPE_CF    0x0102 // not used yet
#define DATATYPE_NO    0x0202 // node file
#define DATATYPE_AD    0x0401 // area file for echo mail defaults
#define DATATYPE_AE    0x0402 // area file for echo mail

typedef struct
{
    char    versionString[32];  // Always starts with 'FMail'
    word    revNumber;          // Is now 0x0100
    word    dataType;           // See #defines above
    word    headerSize;
    int32_t creationDate;
    int32_t lastModified;
    word    totalRecords;
    word    recordSize;
} headerType;


//  ------------------------------------------------------------------
//  The structure below is used by the Areas File and (only partly)
//  by the Config File

typedef struct
{
    word active      : 1; /* Bit  0 */
    word tinySeenBy  : 1; /* Bit  1 */
    word security    : 1; /* Bit  2 */
    word             : 1; /* Bit  3 */
    word allowPrivate: 1; /* Bit  4 */
    word impSeenBy   : 1; /* Bit  5 */
    word checkSeenBy : 1; /* Bit  6 */
    word             : 1; /* Bit  7 */
    word local       : 1; /* Bit  8 */
    word disconnected: 1; /* Bit  9 */
    word _reserved   : 1; /* Bit 10 */
    word allowAreafix: 1; /* Bit 11 */
    word             : 2; /* Bit 12-13 */
    word arrivalDate : 1; /* Bit 14 */
    word sysopRead   : 1; /* Bit 15 */
} areaOptionsType;


/* ********** FMAIL.CFG ********** */

#define MAX_AKAS      32
#define MAX_AKAS_F    64
#define MAX_AKAS_OLD  16
#define MAX_NA_OLD    11
#define MAX_NETAKAS   32
#define MAX_NETAKAS_F 64
#define MAX_USERS     16
#define MAX_UPLREQ    32
#define MAX_MATCH     16           // not used yet

typedef nodeFakeType _akaListType[MAX_AKAS_OLD];
typedef nodeFakeType akaListType[MAX_AKAS_F];

typedef struct
{
    word useEMS       : 1; /* BIT 0 */
    word checkBreak   : 1; /* BIT 1 */
    word swap         : 1; /* BIT 2 */
    word swapEMS      : 1; /* BIT 3 */
    word swapXMS      : 1; /* BIT 4 */
    word              : 1;
    word monochrome   : 1; /* BIT 6 */
    word commentFFD   : 1; /* BIT 7 */
    word PTAreasBBS   : 1; /* BIT 8 */
    word commentFRA   : 1; /* BIT 9 */
    word              : 1; /* BIT 10 */
    word incBDRRA     : 1; /* BIT 11 */
    word              : 1; /* BIT 12 */
    word              : 2;
    word _RA2         : 1; /* BIT 15 */
} genOptionsType;

typedef struct
{
    word removeNetKludges : 1; /* Bit 0 */
    word                  : 1;
    word checkPktDest     : 1; /* Bit 2 */
    word                  : 1;
    word createSema       : 1; /* Bit 4 */
    word                  : 1;
    word warnNewMail      : 1; /* bit 6 */
    word killBadFAtt      : 1; /* Bit 7 */
    word dupDetection     : 1; /* Bit 8 */
    word ignoreMSGID      : 1; /* Bit 9 */
    word ARCmail060       : 1; /* Bit 10 */
    word extNames         : 1; /* Bit 11 */
    word persNetmail      : 1; /* Bit 12 */
    word privateImport    : 1; /* Bit 13 */
    word keepExpNetmail   : 1; /* Bit 14 */
    word killEmptyNetmail : 1; /* Bit 15 */
} mailOptionsType;

typedef struct
{
    word sortNew      : 1; /* bit  0   */
    word sortSubject  : 1; /* bit  1   */
    word updateChains : 1; /* bit  2   */
    word reTear       : 1; /* bit  3   */
    word              : 1; /* bit  4   */
    word              : 1; /* bit  5   */
    word removeRe     : 1; /* bit  6   */
    word removeLfSr   : 1; /* bit  7   */
    word scanAlways   : 1; /* bit  8   */
    word scanUpdate   : 1; /* bit  9   */
    word multiLine    : 1; /* bit 10   */
    word              : 1; /* bit 11   */
    word quickToss    : 1; /* bit 12   */
    word              : 1; /* bit 13   */
    word              : 1; /* bit 14   */
    word sysopImport  : 1; /* bit 15   */
} mbOptionsType;

typedef struct
{
    word keepRequest  : 1; /* Bit  0 */
    word keepReceipt  : 1; /* Bit  1 */
    word              : 2; /* Bit 2-3 */
    word autoDiscArea : 1; /* Bit  4 */
    word autoDiscDel  : 1; /* Bit  5 has temp. no effect, rec is always deleted */
    word              : 3; /* Bit 6-8 */
    word allowAddAll  : 1; /* Bit  9 */
    word allowActive  : 1; /* Bit 10 */
    word              : 1; /* Bit 11 */
    word allowPassword: 1; /* Bit 12 */
    word allowPktPwd  : 1; /* Bit 13 */
    word allowNotify  : 1; /* Bit 14 */
    word allowCompr   : 1; /* Bit 15 */
} mgrOptionsType;

typedef struct
{
    word addPlusPrefix :  1; /* BIT 0 */
    word               :  3;
    word unconditional :  1; /* BIT 4 */
    word               : 11;
} uplOptType;

typedef struct
{
    char userName[36];
    byte reserved[28];
} userType;

typedef struct
{
    ftn_addr    node;
    char        program[9];
    byte        password[17];
    char        fileName[13];
    byte        fileType;
    dword       groups;
    byte        originAka;
    uplOptType  options;
    byte        reserved[9];
} uplinkReqType;

typedef struct
{
    word  valid;
    word  zone;
    word  net;
    word  node;
} akaMatchNodeType;

typedef struct
{
    akaMatchNodeType amNode;
    word             aka;
} akaMatchType;

typedef struct
{
    byte            versionMajor;
    byte            versionMinor;
    int32_t         creationDate;
    dword           key;
    dword           reservedKey;
    dword           relKey1;
    dword           relKey2;
    byte            reserved1[22];
    mgrOptionsType  mgrOptions;
    _akaListType    _akaList;
    word            _netmailBoard[MAX_NA_OLD];
    word            _reservedNet[16-MAX_NA_OLD];
    genOptionsType  genOptions;
    mbOptionsType   mbOptions;
    mailOptionsType mailOptions;
    word            maxPktSize;
    word            kDupRecs;
    word            mailer;
    word            bbsProgram;
    word            maxBundleSize;
    word            extraHandles; /* 0-235 */
    word            autoRenumber;
    word            bufSize;
    word            ftBufSize;
    word            allowedNumNetmail;
    word            logInfo;
    word            logStyle;
    byte            reserved2[68];
    word            colorSet;
    char            sysopName[36];
    word            defaultArc;
    word            _adiscDaysNode;
    word            _adiscDaysPoint;
    word            _adiscSizeNode;
    word            _adiscSizePoint;
    byte            reserved3[16];
    byte            tearType;
    char            tearLine[25];
    pathType        summaryLogName;
    word            recBoard;
    word            badBoard;
    word            dupBoard;
    byte            topic1[16];
    byte            topic2[16];
    pathType        bbsPath;
    pathType        netPath;
    pathType        sentPath;
    pathType        rcvdPath;
    pathType        inPath;
    pathType        outPath;
    pathType        securePath;
    pathType        logName;
    pathType        swapPath;
    pathType        semaphorePath;
    pathType        pmailPath;
    pathType        areaMgrLogName;
    pathType        autoRAPath;
    pathType        autoFolderFdPath;
    pathType        autoAreasBBSPath;
    pathType        autoGoldEdAreasPath;
    archiverInfo    unArc;
    archiverInfo    unZip;
    archiverInfo    unLzh;
    archiverInfo    unPak;
    archiverInfo    unZoo;
    archiverInfo    unArj;
    archiverInfo    unSqz;
    archiverInfo    GUS;
    archiverInfo    arc;
    archiverInfo    zip;
    archiverInfo    lzh;
    archiverInfo    pak;
    archiverInfo    zoo;
    archiverInfo    arj;
    archiverInfo    sqz;
    archiverInfo    customArc;
    pathType        autoFMail102Path;
    byte            reserved4[35];
    areaOptionsType _optionsAKA[MAX_NA_OLD];
    byte            _groupsQBBS[MAX_NA_OLD];
    word            _templateSecQBBS[MAX_NA_OLD];
    byte            _templateFlagsQBBS[MAX_NA_OLD][4];
    byte            _attr2RA[MAX_NA_OLD];
    byte            _aliasesQBBS[MAX_NA_OLD];
    word            _groupRA[MAX_NA_OLD];
    word            _altGroupRA[MAX_NA_OLD][3];
    byte            _qwkName[MAX_NA_OLD][13];
    word            _minAgeSBBS[MAX_NA_OLD];
    word            _daysRcvdAKA[MAX_NA_OLD];
    byte            _replyStatSBBS[MAX_NA_OLD];
    word            _attrSBBS[MAX_NA_OLD];
    byte            groupDescr[26][27];
    byte            reserved5[9];
    byte            _msgKindsRA[MAX_NA_OLD];
    byte            _attrRA[MAX_NA_OLD];
    word            _readSecRA[MAX_NA_OLD];
    byte            _readFlagsRA[MAX_NA_OLD][4];
    word            _writeSecRA[MAX_NA_OLD];
    byte            _writeFlagsRA[MAX_NA_OLD][4];
    word            _sysopSecRA[MAX_NA_OLD];
    byte            _sysopFlagsRA[MAX_NA_OLD][4];
    word            _daysAKA[MAX_NA_OLD];
    word            _msgsAKA[MAX_NA_OLD];
    byte            _descrAKA[MAX_NA_OLD][51];
    userType        users[MAX_USERS];
    akaMatchType    akaMatch[MAX_MATCH];     // not used yet
    byte            reserved6[1040-10*MAX_MATCH];
    pathType        sentEchoPath;
    archiverInfo    preUnarc;
    archiverInfo    postUnarc;
    archiverInfo    preArc;
    archiverInfo    postArc;
    archiverInfo    unUc2;
    archiverInfo    unRar;
    archiverInfo    resUnpack[6];
    archiverInfo    uc2;
    archiverInfo    rar;
    archiverInfo    resPack[6];
    uplinkReqType   uplinkReq[MAX_UPLREQ+32];
    archiverInfo    unArc32;
    archiverInfo    unZip32;
    archiverInfo    unLzh32;
    archiverInfo    unPak32;
    archiverInfo    unZoo32;
    archiverInfo    unArj32;
    archiverInfo    unSqz32;
    archiverInfo    unUc232;
    archiverInfo    unRar32;
    archiverInfo    GUS32;
    archiverInfo    resUnpack32[6];
    archiverInfo    preUnarc32;
    archiverInfo    postUnarc32;
    archiverInfo    arc32;
    archiverInfo    zip32;
    archiverInfo    lzh32;
    archiverInfo    pak32;
    archiverInfo    zoo32;
    archiverInfo    arj32;
    archiverInfo    sqz32;
    archiverInfo    uc232;
    archiverInfo    rar32;
    archiverInfo    customArc32;
    archiverInfo    resPack32[6];
    archiverInfo    preArc32;
    archiverInfo    postArc32;
    byte            descrAKA[MAX_NETAKAS][51];
    byte            qwkName[MAX_NETAKAS][13];
    areaOptionsType optionsAKA[MAX_NETAKAS];
    byte            msgKindsRA[MAX_NETAKAS];
    word            daysAKA[MAX_NETAKAS];
    word            msgsAKA[MAX_NETAKAS];
    byte            groupsQBBS[MAX_NETAKAS];
    byte            attrRA[MAX_NETAKAS];
    byte            attr2RA[MAX_NETAKAS];
    word            attrSBBS[MAX_NETAKAS];
    byte            aliasesQBBS[MAX_NETAKAS];
    word            groupRA[MAX_NETAKAS];
    word            altGroupRA[MAX_NETAKAS][3];
    word            minAgeSBBS[MAX_NETAKAS];
    word            daysRcvdAKA[MAX_NETAKAS];
    byte            replyStatSBBS[MAX_NETAKAS];
    word            readSecRA[MAX_NETAKAS];
    byte            readFlagsRA[MAX_NETAKAS][8];
    word            writeSecRA[MAX_NETAKAS];
    byte            writeFlagsRA[MAX_NETAKAS][8];
    word            sysopSecRA[MAX_NETAKAS];
    byte            sysopFlagsRA[MAX_NETAKAS][8];
    word            templateSecQBBS[MAX_NETAKAS];
    byte            templateFlagsQBBS[MAX_NETAKAS][8];
    byte            reserved7[512];
    word            netmailBoard[MAX_NETAKAS_F];
    akaListType     akaList;
} configType;

#define MAX_FORWARD   64

#define MB_PATH_LEN_OLD   19
#define MB_PATH_LEN       61
#define ECHONAME_LEN_090  25
#define ECHONAME_LEN      51
#define COMMENT_LEN       51
#define ORGLINE_LEN       59

typedef char areaNameType[ECHONAME_LEN];

typedef struct
{
    word tossedTo     : 1;  /* BIT 0 */
    word              : 15; /* BIT 1-15 */
} areaStatType;

typedef struct
{

    word            signature; // contains "AE" for echo areas in FMAIL.AR and
    // "AD" for default settings in FMAIL.ARD
    word            writeLevel;
    areaNameType    areaName;
    char            comment[COMMENT_LEN];
    areaOptionsType options;
    word            boardNumRA;
    byte            msgBaseType;
    char            msgBasePath[MB_PATH_LEN];
    word            board;
    char            originLine[ORGLINE_LEN];
    word            address;
    dword           group;
    word            _alsoSeenBy; // obsolete: see the 32-bit alsoSeenBy below
    word            msgs;
    word            days;
    word            daysRcvd;

    ftn_addr        exp[MAX_FORWARD];

    word            readSecRA;
    byte            flagsRdRA[4];
    byte            flagsRdNotRA[4];
    word            writeSecRA;
    byte            flagsWrRA[4];
    byte            flagsWrNotRA[4];
    word            sysopSecRA;
    byte            flagsSysRA[4];
    byte            flagsSysNotRA[4];
    word            templateSecQBBS;
    byte            flagsTemplateQBBS[4];
    byte            _internalUse;
    word            netReplyBoardRA;
    byte            boardTypeRA;
    byte            attrRA;
    byte            attr2RA;
    word            groupRA;
    word            altGroupRA[3];
    byte            msgKindsRA;
    byte            qwkName[13];
    word            minAgeSBBS;
    word            attrSBBS;
    byte            replyStatSBBS;
    byte            groupsQBBS;
    byte            aliasesQBBS;
    dword           lastMsgTossDat;
    dword           lastMsgScanDat;
    dword           alsoSeenBy;
    areaStatType    stat;
    byte            reserved[180];
} rawEchoType116;


//  ------------------------------------------------------------------

#if defined(GOLD_CANPACK)
    #pragma pack()
#endif


//  ------------------------------------------------------------------

#endif

//  ------------------------------------------------------------------
