
#ifndef CNET_CONTROL
#define CNET_CONTROL

#include "ports.h"
#include "config.h"

struct   PortConfig {
   UBYTE   online;         // port loaded or not
   UBYTE   open;           // 1==perm, 2==call only

   UBYTE   check;          // menu:  BITS 0=DoorsClosed, 1=FilesClosed, 2=MsgsClosed
                           //             3=NoNewUsers,  4=SysopIsIn
                           // see also: MainPort->check_latch

   UBYTE   idle;           // clock, SAG, SAM ?

   UBYTE   offline;        // port loaded, but modem offline
   UBYTE   not_used;

   UBYTE   bplanes;
   UBYTE   lace;           // 0=none, 1=24 line, 2=49 line

   USHORT   sizes[8];      // workbench window & zoom size
};


struct MainPortExtension
   {
   struct SignalSemaphore sem[20];  // sem[0] = lock reload_text variable..
                                    // sem[1] = lock idd (identd data) before insertion/removal
                                    // sem[2] = lock the global MailKill list
                                    // sem[3] = lock IMP list
                                    // sem[4] = lock HOSTNAME/SPAM filter config file before accessing
                                    // sem[5] = lock uumail dir - causes mail-task to "pause" until this semaphore is released
                                    //          mail-task will obtain a lock on sem[5] before it tries to access uumail dir.
                                    // sem[6] = lock global MIME list (myp->MPE->mimelist)
                                    // sem[7..19] not yet assigned/used.

   UBYTE reload_text;               // set to 1 to cause control to reload text/menu.
                                    // you MUST ObtainSemphore(&myp->MPE->sem[0]) before accessing!

   UBYTE newsman_up;    // 0 if news-task not running..
                        // 1 if running and window open
                        // 2 if running and iconified or menufied

   struct Task   *newstask;     // pointer to news-task Task structure if running.
   struct IdentdData *idd;      // linked list of identd info for in-use clients
   struct List *MailKillList;   // standard Exec List with Node ln_name(s) containing the list of mail kill patterns
   struct List *CPortList;      // Exec list used for Control listview - PRIVATE - accessing this variable may result in unpredictable results

   UBYTE UpdateGUI_notused;     // ** expansion - not used

   struct ConfigExtension gc2;  // second set of config variables

   struct List IMPList;         // Exec list of IMPStruct(s) - be sure to
                                //   ObtainSemaphore(&myp->MPE->sem[3])
                                //   before accessing and
                                // ReleaseSemaphore(&myp->MPE->sem[3]) afterwards.
   char *statline;              // pointer to allocated Control stats line

   struct SignalSemaphore *MailSem;   // user account mail semaphores
                                      // pointers to structures for CNet mailbox locking.
                                      //   Each array memeber applies to its ordinal
                                      // account_number-1.
                                      // eg. MailSem[0] is account 1
                                      //     MailSem[1] is account 2 etc,.

   UBYTE smtpd_up;           // 0 if SMTPd not running..
                             // 1 if running and window open
                             // 2 if running and iconified or menufied
   struct Task *smtpdtask;   // pointer to cnsmtpd Task structure if running.
   
   struct MIMEContentType *mimelist;	// linked list of sysop-configured MIMEContentTypes. (see mail.h)
   };


struct MainPort {          // common, public to all ports
                           // the same msgport that Findport("cnetport")
                           // returns a pointer to..

   struct  MsgPort mp;     // 0  - standard EXEC message port
   char    portName[22];   // 34

   char    LastOn[32];     // 56

   long   Nums[5];         //  88 [0] # of physical user accounts
                           //     [1] # of in-use user accounts
                           //     [2] last assigned unique ID Number
                           //     [3] # of calls to system TOTAL
                           //     [4] # of calls now logged

   ULONG   SAG[2][72];             // 108 activity graph
   long   SAM[5][15];              // activity monitor
   struct   IsDate SAMDate[6];

   long   um[10];          // for C programmer use.  You can
                           // (typecast) them as you need to.
                           // Initially at bootup == 0

   struct   Window      *PWindow;        // pointer to control window if open; otherwise 0
   struct   TransType   *FirstTT;
   struct   SubboardType4 *Subboard;
   struct   LinkPort   *link;            // all-linked port users!
   struct   KeyElement4   *Key;          // alpha order, etc.
   short      *IName;                    // Indexes into KeyElement4 array
   short      *IPhone;                   // Indexes into KeyElement4 array
   char      *SubTitle;
   struct   MailLock   *mlock;
   struct   ChargeSet   *FirstCharge;

   long   ns;           // number of subs in memory (allocated)

   UBYTE   toss_up;     // 0 if toss not running..
                        // 1 if running
                        // 2 if running and iconified
                        // 3 if running and menufied
   UBYTE   yank_up;     // TRUE if yank-task running..
   UBYTE   serv_exit;   // internally set as TRUE to tell mail-task, yank-task and any other "server" programs to quit - control is closing down/quitting
   UBYTE   item_up;     // not used
   
   UBYTE   mail_up;     // 0 if mail-task not running..
                        // 1 if running
                        // 2 if running and iconified or menufied

   UBYTE   fileman_up;  // 0 if file-task not running..
                        // 1 if running
                        // 2 if running and iconified or menufied


   UBYTE useredit_up;   // 29-Jul-97
                        // is UserEd running?  Control cannot exit until UserEd quits

   UBYTE expansion1[5]; // future expansion

   long   OpenPfiles;   // number of currently open doors

   struct   NoiseType   *FirstNT;

   long   ClickMaint;   // can we use local mouse maint?
   long   Verbose;      // do not redirect to NIL: for debug

   long   s1;           // version of CONTROL
   long   s2;
   long   s3;           // serial number of owner 0==DEMO

   struct   BitMap  ClockBrush;   // 40 bytes - for the large port clock on idle ports
   struct   SignalSemaphore SEM[19];

               // for critical structure/file/variable locking..
               // Don't hold these in LOCKED state for long
               // as DEADLOCKS will occur!

               // ObtainSemaphore(SEM[x]) to lock, ReleaseSemaphore(SEM[x]) to unlock
               // SEM[0]  = for locking myp (MainPort) itself!
               // SEM[1]  = User myp->Key[], myp->IName, myp->PName, myp->Phone locking
               // SEM[2]  = z.Upload/z.nuploads/z.NoUploaded locking
               // SEM[3]  = for locking serial device
               // SEM[4]  = myp->NUMS[1] locking (NUMS[1] = number of user account currently active
               // SEM[5]  = net/echomail import/export,  subbards3/4 data file and COMPLETE allocated subboard locking - lock before altering/ordering subboard structures
               // SEM[7]  = conference (join) chat locking
               // SEM[8]  = joinlink/conference (join) ROOM locking
               // SEM[10] = Pfile locking
               // SEM[11] = bbs.udata, bbs.cuser & userlist locking
               // SEM[12] = sysdata:log/%s locking
               // SEM[13] = semaphore for locking LIST items - ie. items in a type "LIST" subboard
               // SEM[14] = vote list locking while reading/editing vote items/results
               // SEM[16] = lock before accessing the CopyCDRom() function
               // SEM[18] = semaphore for locking SAM
                                       

   struct   AccessGroup     AGC[32];   // BBS.ADATA / Access Group stuff

   struct   NewConfig1 gc;             // global configuration defaults

   char   SysPassword[6][21];
   ULONG   IDQ;

   short   root;                       // first area#
   struct   PortConfig  pc   [101];    // For CONTROL, remembers things about each port's window menus, etc,..
   struct   PortData   *PortZ[100];    // pointers to each port's PortData struct
   struct   Room       *CRoom[100];    // pointers to ROOM structures..

   struct   ULock *FirstULock;         // Account Locking ... list of dynamically locked accounts!
   short   LastTickHour;               // control is ticking ...
   short   LastTickMinute;

   short   HiPort; // highest port loaded
   short   nPorts;

   char   regto[32], regco[32];

   struct   SignalSemaphore ysem;      // the 3.1 Yank-Task
   struct   YankType *yfirst;

   struct   SignalSemaphore isem;      // WAS the 3.1 Item-Task = not used
   struct   ItemServerType *ifirst;    // not used!

   struct   SignalSemaphore csem;      // the 3.1 Charge-Server
   struct   ChargeType *cfirst;

   struct   SignalSemaphore sem;

   struct   PortData *z0;              // control's PortData structure - copied to other ports as default, when opened..

   /* new for v4.12 */
   UBYTE      cron_up;                 /* non-zero if events are being externally edited - Control WILL NOT exit as long as this is >0 */
   struct   JobType4 *Events;          /* configured events */
   struct   SignalSemaphore eventsem;  /* lock this using ObtainSemaphore() before altering myp->Events! */
                                       /* make sure to release using ReleaseSemaphore() after changing events list */

   struct   SignalSemaphore cesem;     /* control event semaphore locking  - internal use only! */
   struct   JobType4   *cEvents;       /* list of events to be executed by Control */

   struct   SignalSemaphore flsem;     /* semaphore for locking the LIST of file locks */

   struct   Library *NodelistBase;     /* traplist.library - nodelist base */

   UBYTE check_latch;      // 3rd party coders - SET this (1=SET) if ANY of the PortConfig "check" bits are altered via doors
                           //                    changes will not take effect unless this is latched!!

   // task pointers Added in v4.21/v4.22 - used to send signals to CNet servers
   // ie. use Signal(myp->mailtask, SIGBREAKF_CTRL_C) to tell mail-task to quit
   //
   //     note: server will set it's myp->#?task pointer to ZERO when it exits
   //           You cannot be sure the task has exited until it's Task pointer
   //           is 0.  Also, if a server is processing a packet (ie. mail item,
   //           test/transform, NNTPGet etc, the task/server will not exit
   //           until the current operation is complete.
   //
   struct Task   *mailtask;               // pointer to mail-task task structure
   struct Task   *filetask;               // pointer to file-task task structure
   struct Task   *nntptask;               // pointer to nntpget task structure
   struct Task   *yanktask;               // pointer to yank-task task structure

   struct MainPortExtension *MPE;         // MainPort data extensions - see struct MainPortExtension above.
};

#endif
