class Message; class MsgBase; class SquishMsgBase; class HudsonMsgBase; class JamMsgBase; class MsgArea; class MessageIndex; class HudsonMsgIdx; class HudsonMsgHdr; class HudsonMsgToIdx; class HudsonMsgInfo; class JamFileHeader; class JamHeader; class JamExtHeader; class JamIndex; class JamLastRead; class MsgBase { public: MsgBase() {} virtual ~MsgBase() {} virtual bool open() = 0; virtual void close() = 0; virtual bool lock() { return TRUE; } virtual bool unlock() { return TRUE; } virtual long readMsg(Message& msg , long num) = 0; virtual word readMsgText(Message& msg, char *text, long offset , word size) = 0; virtual word scanMail(MessageIndex *mi,word maxmsgs) = 0; virtual long appendMsg(Message&) = 0; virtual bool updateMsg(Message&) = 0; virtual long highMsg(MsgArea&) = 0; virtual long lowMsg (MsgArea&) = 0; virtual long numMsgs(MsgArea&) = 0; virtual long totalMsgs() = 0; virtual bool deleteMsg(Message&) = 0; virtual long lastRead(MsgArea&,long rec) = 0; virtual void setLastRead(MsgArea&,long rec,long num) = 0; virtual long msgNum(MsgArea&,long id) = 0; virtual long msgId (MsgArea&,long num) = 0; }; class SquishMsgBase : public MsgBase { MSG *lastarea; int lastareanum; MSG *readArea(MsgArea&); public: SquishMsgBase() { open(); } ~SquishMsgBase() { close(); } bool open(); void close(); bool lock() { return TRUE; } bool unlock() { return TRUE; } long readMsg(Message& msg , long num); word readMsgText(Message& msg, char *text, long offset , word size); word scanMail(MessageIndex *mi,word maxmsgs); long appendMsg(Message&); bool updateMsg(Message&); long highMsg(MsgArea&); long lowMsg (MsgArea&); long numMsgs(MsgArea&); long totalMsgs() { return 0; } bool deleteMsg(Message&); long lastRead(MsgArea&,long rec); void setLastRead(MsgArea&,long rec,long num); long msgNum(MsgArea&,long id); long msgId (MsgArea&,long num); }; class HudsonMsgBase : public MsgBase { File f_msghdr; File f_msgtxt; File f_msgtoidx; File f_msgidx; File f_msginfo; HudsonMsgIdx *lastMsgIdx; int *highArray; int *lastReadArray; long lastIndex; long lastReadRecord; /////////////////// void flushCache(); void readHighArray(); void readLastRead(long record); void readInfo(HudsonMsgInfo&); void writeInfo(HudsonMsgInfo&); long findIdx(HudsonMsgIdx &mi,int num,int area,int order); public: HudsonMsgBase(); ~HudsonMsgBase(); bool open(); void close(); bool lock(); bool unlock(); long readMsg(Message& msg , long num); word readMsgText(Message& msg, char *text, long offset , word size); word scanMail(MessageIndex *mi,word maxmsgs); long appendMsg(Message&); bool updateMsg(Message&); long highMsg(MsgArea&); long lowMsg (MsgArea&); long numMsgs(MsgArea&); long totalMsgs(); bool deleteMsg(Message&); long lastRead(MsgArea&,long rec); void setLastRead(MsgArea&,long rec,long num); long msgNum(MsgArea&,long id); long msgId(MsgArea& ma, long num); }; class JamMsgBase : public MsgBase { File f_jhr; File f_jdt; File f_jdx; File f_jlr; int lastAreaNum; JamFileHeader *jamHeader; bool openArea( MsgArea& ); bool jamLock(); bool jamUnLock(); bool readHeader(); bool writeHeader(); long findIdx( JamIndex &mi,long num,int order ); public: JamMsgBase(); ~JamMsgBase(); bool open(); void close(); bool lock() { return TRUE; } bool unlock() { return TRUE; } long readMsg(Message& msg , long num); word readMsgText(Message& msg, char *text, long offset , word size); word scanMail(MessageIndex *mi,word maxmsgs); long appendMsg(Message&); bool updateMsg(Message&); long highMsg(MsgArea&); long lowMsg (MsgArea&); long numMsgs(MsgArea&); long totalMsgs() { return 0; } bool deleteMsg(Message&); long lastRead(MsgArea&,long rec); void setLastRead(MsgArea&,long rec,long num); long msgNum(MsgArea&,long id); long msgId (MsgArea&,long num); }; class MsgBaseList { MsgBase *mblist[5]; public: MsgBaseList(); ~MsgBaseList(); void add(MsgBase *); void close(); void open(); bool lock(); bool unlock(); word scanMail(MessageIndex *,word maxmsgs); long totalMsgs(); }; class MsgArea : public _MsgArea { static File f; static int lastAreaNum; static MsgArea *lastArea; static int numAreas; static void open(); public: MsgBase *msgBase; bool read(int); bool sysopAccess(); static void close(); static int highAreaNum(); long numMsgs() { return (msgBase==NULL) ? 0L : msgBase->numMsgs(*this); } long lowMsg() { return (msgBase==NULL) ? 0L : msgBase->lowMsg (*this); } long highMsg() { return (msgBase==NULL) ? 0L : msgBase->highMsg(*this); } long lastRead(long rec) { return (msgBase==NULL) ? 0L : msgBase->lastRead(*this,rec); } void setLastRead(long rec,long num) { if(msgBase) msgBase->setLastRead(*this,rec,num); } long msgNum(long id) { return (msgBase==NULL) ? 0L : msgBase->msgNum(*this,id); } long msgId (long num) { return (msgBase==NULL) ? 0L : msgBase->msgId(*this,num); } }; const dword MSGATTR_PRIVATE = 0x00000001L; const dword MSGATTR_RECEIVED = 0x00000002L; const dword MSGATTR_DELETED = 0x00000004L; const dword MSGATTR_NETMAIL = 0x00000008L; const dword MSGATTR_UNSENT_ECHO = 0x00000010L; const dword MSGATTR_UNSENT_NET = 0x00000020L; const dword MSGATTR_LOCAL = 0x00000040L; const dword MSGATTR_KILL = 0x00000080L; const dword MSGATTR_CRASH = 0x00000100L; const dword MSGATTR_SENT = 0x00000200L; const dword MSGATTR_FILE = 0x00000400L; const dword MSGATTR_FILEREQ = 0x00000800L; const dword MSGATTR_AUDITREQ = 0x00001000L; const dword MSGATTR_RECEIPTREQ = 0x00002000L; const dword MSGATTR_TRANSIT = 0x00004000L; const dword MSGATTR_HOLD = 0x00008000L; const dword MSGATTR_IMMEDIATE = 0x00010000L; const dword MSGATTR_DIRECT = 0x00020000L; const dword MSGATTR_TRUNCFILE = 0x00040000L; const dword MSGATTR_DELFILE = 0x00080000L; const dword MSGATTR_ORPHAN = 0x00100000L; const dword MSGATTR_ECHOMAIL = 0x00200000L; const dword MSGATTR_NODISP = 0x00400000L; const dword MSGATTR_LOCKED = 0x00800000L; struct Message { long num; dword id; // for Squish only, others -> == num char from[36]; char to [36]; char subj[66]; dword attr; Date postDate; Time postTime; Date recvDate; Time recvTime; long next; long prev; int origZone, origNet, origNode, origPoint; int destZone, destNet, destNode, destPoint; int cost; /************************************************************/ static long lastIndex; union { MsgArea *msgArea; int area; }; Message(int area = 0); Message(Message *, int area = 0); ~Message(); int areaNum() ; MsgBase *msgBase() { return msgArea->msgBase; } void clear(); bool setArea (int num); bool read (long num, int area = 0); bool readFirst(int method,int order,long first,char *data,int area = 0); bool readNext (int method,int order,char *data); bool readPrev (int method,int order,char *data); word readText(char *text,long offset,word size) { return msgBase()->readMsgText(*this, text, offset , size); } void createMsgTextFile(char *fname , bool append); void createMsgTextString(char *string , word maxsize); void export(char *fname); void forward(); void move(); void setFlag (dword msgflag); void clearFlag (dword msgflag); void toggleFlag(dword msgflag); bool testFlag (dword msgflag) { return (attr & msgflag) ? TRUE:FALSE; } void operator=(HudsonMsgHdr&); void addReply(Message&); void delReply(); void remove(); byte show(); void addOrigin(); int pointNum(int mode); long add(); long msgNum() { return msgBase()->msgNum(*msgArea,id); } bool readAccess(); }; struct MessageIndex { MessageIndex() {} MessageIndex(int a,long n) { area = a; num = n; } int area; long num; }; class MarkedMsgList { MessageIndex *msgList; int n; public: MarkedMsgList(); MarkedMsgList(const MarkedMsgList&); ~MarkedMsgList(); void operator=(const MarkedMsgList&); bool add(MessageIndex&); bool add(Message&); void clear() { n = 0; } bool remove(MessageIndex&); void sort(); int numMarked() { return n; } bool isMarked(MessageIndex&); MessageIndex getMarked(int n) { return msgList[n]; } MessageIndex operator[](int n) { return msgList[n]; } }; const int MAX_MARKED_MSGS = 500; extern MsgBase *squishMsgBase; extern MsgBase *hudsonMsgBase; extern MsgBase *jamMsgBase; extern MsgBaseList msgbase; extern MarkedMsgList markedmsglist; void get_new_msgs(MarkedMsgList& marked,int area); inline long HudsonMsgBase::msgNum(MsgArea&,long id) { return id; } inline long HudsonMsgBase::msgId(MsgArea&, long num) { return num; }