This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
deb-goldedplus/goldlib/gmb3/gmosmb.h
2000-02-25 10:15:17 +00:00

476 lines
16 KiB
C++

// This may look like C code, but it is really -*- C++ -*-
// ------------------------------------------------------------------
// The Goldware Library
// Copyright (C) 2000 Alexander S. Aganichev
// ------------------------------------------------------------------
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// This program 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
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
// ------------------------------------------------------------------
// $Id$
// ------------------------------------------------------------------
// Based on freeware sources from Digital Dynamics
// ------------------------------------------------------------------
// Synchronet message base
// ------------------------------------------------------------------
#ifndef __GMOSMB_H
#define __GMOSMB_H
// ------------------------------------------------------------------
#include <gmoarea.h>
// ------------------------------------------------------------------
// SMB library version used as reference (1.21a)
const int SMB_VERSION = 0x0121; // SMB format version (High byte major, low byte minor)
// ------------------------------------------------------------------
const int SDT_BLOCK_LEN = 256; // Size of data blocks
const int SHD_BLOCK_LEN = 256; // Size of header blocks
const int SMB_SELFPACK = 0; // Self-packing storage allocation
const int SMB_FASTALLOC = 1; // Fast allocation
const int SMB_HYPERALLOC = 2; // No allocation
const int SMB_EMAIL = 1; // User numbers stored in Indexes
// Time zone macros for when_t.zone
const int DAYLIGHT = 0x8000; // Daylight savings is active
const int US_ZONE = 0x4000; // U.S. time zone
const int WESTERN_ZONE = 0x2000; // Non-standard zone west of UT
const int EASTERN_ZONE = 0x1000; // Non-standard zone east of UT
// Valid hfield_t.types
const int SENDER = 0x00;
const int SENDERAGENT = 0x01;
const int SENDERNETTYPE = 0x02;
const int SENDERNETADDR = 0x03;
const int SENDEREXT = 0x04;
const int SENDERPOS = 0x05;
const int SENDERORG = 0x06;
const int AUTHOR = 0x10;
const int AUTHORAGENT = 0x11;
const int AUTHORNETTYPE = 0x12;
const int AUTHORNETADDR = 0x13;
const int AUTHOREXT = 0x14;
const int AUTHORPOS = 0x15;
const int AUTHORORG = 0x16;
const int REPLYTO = 0x20;
const int REPLYTOAGENT = 0x21;
const int REPLYTONETTYPE = 0x22;
const int REPLYTONETADDR = 0x23;
const int REPLYTOEXT = 0x24;
const int REPLYTOPOS = 0x25;
const int REPLYTOORG = 0x26;
const int RECIPIENT = 0x30;
const int RECIPIENTAGENT = 0x31;
const int RECIPIENTNETTYPE = 0x32;
const int RECIPIENTNETADDR = 0x33;
const int RECIPIENTEXT = 0x34;
const int RECIPIENTPOS = 0x35;
const int RECIPIENTORG = 0x36;
const int FORWARDTO = 0x40;
const int FORWARDTOAGENT = 0x41;
const int FORWARDTONETTYPE = 0x42;
const int FORWARDTONETADDR = 0x43;
const int FORWARDTOEXT = 0x44;
const int FORWARDTOPOS = 0x45;
const int FORWARDTOORG = 0x46;
const int FORWARDED = 0x48;
const int RECEIVEDBY = 0x50;
const int RECEIVEDBYAGENT = 0x51;
const int RECEIVEDBYNETTYPE = 0x52;
const int RECEIVEDBYNETADDR = 0x53;
const int RECEIVEDBYEXT = 0x54;
const int RECEIVEDBYPOS = 0x55;
const int RECEIVEDBYORG = 0x56;
const int RECEIVED = 0x58;
const int SUBJECT = 0x60;
const int SUMMARY = 0x61;
const int SMBCOMMENT = 0x62;
const int CARBONCOPY = 0x63;
const int GROUP = 0x64;
const int EXPIRATION = 0x65;
const int PRIORITY = 0x66;
const int FILEATTACH = 0x70;
const int DESTFILE = 0x71;
const int FILEATTACHLIST = 0x72;
const int DESTFILELIST = 0x73;
const int FILEREQUEST = 0x74;
const int FILEPASSWORD = 0x75;
const int FILEREQUESTLIST = 0x76;
const int FILEPASSWORDLIST = 0x77;
const int IMAGEATTACH = 0x80;
const int ANIMATTACH = 0x81;
const int FONTATTACH = 0x82;
const int SOUNDATTACH = 0x83;
const int PRESENTATTACH = 0x84;
const int VIDEOATTACH = 0x85;
const int APPDATAATTACH = 0x86;
const int IMAGETRIGGER = 0x90;
const int ANIMTRIGGER = 0x91;
const int FONTTRIGGER = 0x92;
const int SOUNDTRIGGER = 0x93;
const int PRESENTTRIGGER = 0x94;
const int VIDEOTRIGGER = 0x95;
const int APPDATATRIGGER = 0x96;
const int FIDOCTRL = 0xa0;
const int FIDOAREA = 0xa1;
const int FIDOSEENBY = 0xa2;
const int FIDOPATH = 0xa3;
const int FIDOMSGID = 0xa4;
const int FIDOREPLYID = 0xa5;
const int FIDOPID = 0xa6;
const int FIDOFLAGS = 0xa7;
const int RFC822HEADER = 0xb0;
const int RFC822MSGID = 0xb1;
const int RFC822REPLYID = 0xb2;
const int UNKNOWN = 0xf1;
const int UNKNOWNASCII = 0xf2;
const int UNUSED = 0xff;
// Valid dfield_t.types
const int TEXT_BODY = 0x00;
const int TEXT_SOUL = 0x01;
const int TEXT_TAIL = 0x02;
const int TEXT_WING = 0x03;
const int IMAGEEMBED = 0x20;
const int ANIMEMBED = 0x21;
const int FONTEMBED = 0x22;
const int SOUNDEMBED = 0x23;
const int PRESENTEMBED = 0x24;
const int VIDEOEMBED = 0x25;
const int APPDATAEMBED = 0x26;
//const int UNUSED = 0xff;
// Message attributes
const int MSG_PRIVATE = (1<<0);
const int MSG_READ = (1<<1);
const int MSG_PERMANENT = (1<<2);
const int MSG_LOCKED = (1<<3);
const int MSG_DELETE = (1<<4);
const int MSG_ANONYMOUS = (1<<5);
const int MSG_KILLREAD = (1<<6);
const int MSG_MODERATED = (1<<7);
const int MSG_VALIDATED = (1<<8);
// Auxillary header attributes
const int MSG_FILEREQUEST = (1<<0); // File request
const int MSG_FILEATTACH = (1<<1); // File(s) attached to Msg
const int MSG_TRUNCFILE = (1<<2); // Truncate file(s) when sent
const int MSG_KILLFILE = (1<<3); // Delete file(s) when sent
const int MSG_RECEIPTREQ = (1<<4); // Return receipt requested
const int MSG_CONFIRMREQ = (1<<5); // Confirmation receipt requested
const int MSG_NODISP = (1<<6); // Msg may not be displayed to user
// Message network attributes
const int MSG_LOCAL = (1<<0); // Msg created locally
const int MSG_INTRANSIT = (1<<1); // Msg is in-transit
const int MSG_SENT = (1<<2); // Sent to remote
const int MSG_KILLSENT = (1<<3); // Kill when sent
const int MSG_ARCHIVESENT = (1<<4); // Archive when sent
const int MSG_HOLD = (1<<5); // Hold for pick-up
const int MSG_CRASH = (1<<6); // Crash
const int MSG_IMMEDIATE = (1<<7); // Send Msg now, ignore restrictions
const int MSG_DIRECT = (1<<8); // Send directly to destination
const int MSG_GATE = (1<<9); // Send via gateway
const int MSG_ORPHAN = (1<<10); // Unknown destination
const int MSG_FPU = (1<<11); // Force pickup
const int MSG_TYPELOCAL = (1<<12); // Msg is for local use only
const int MSG_TYPEECHO = (1<<13); // Msg is for conference distribution
const int MSG_TYPENET = (1<<14); // Msg is direct network mail
enum {
NET_NONE,
NET_UNKNOWN,
NET_FIDO,
NET_POSTLINK,
NET_QWK,
NET_INTERNET,
NET_WWIV,
NET_MHS,
// Add new ones here
NET_TYPES
};
enum {
AGENT_PERSON,
AGENT_PROCESS,
// Add new ones here
AGENT_TYPES
};
enum {
XLAT_NONE, // No translation/End of translation list
XLAT_ENCRYPT, // Encrypted data
XLAT_ESCAPED, // 7-bit ASCII escaping for ctrl and 8-bit data
XLAT_HUFFMAN, // Static and adaptive Huffman coding compression
XLAT_LZW, // Limpel/Ziv/Welch compression
XLAT_MLZ78, // Modified LZ78 compression
XLAT_RLE, // Run length encoding compression
XLAT_IMPLODE, // Implode compression (PkZIP)
XLAT_SHRINK, // Shrink compression (PkZIP)
XLAT_LZH, // LHarc (LHA) Dynamic Huffman coding
// Add new ones here
XLAT_TYPES
};
// ------------------------------------------------------------------
#if defined(GOLD_CANPACK)
#pragma pack(1)
#endif
// ------------------------------------------------------------------
typedef struct {
time_t time; // Local time (unix format)
sword zone; // Time zone
} when_t;
typedef struct {
word to; // 16-bit CRC of recipient name (lower case)
word from; // 16-bit CRC of sender name (lower case)
word subj; // 16-bit CRC of subject (lower case, w/o RE:)
word attr; // attributes (read, permanent, etc.)
dword offset; // offset into header file
dword number; // number of message (1 based)
time_t time; // time/date message was imported/posted
} idxrec_t;
typedef struct {
uchar id[4]; // text or binary unique hdr ID
word version; // version number (initially 100h for 1.00)
word length; // length including this struct
} smbhdr_t;
typedef struct {
dword last_msg; // last message number
dword total_msgs; // total messages
dword header_offset; // byte offset to first header record
dword max_crcs; // Maximum number of CRCs to keep in history
dword max_msgs; // Maximum number of message to keep in sub
word max_age; // Maximum age of message to keep in sub (in days)
word attr; // Attributes for this message base (SMB_HYPER, etc)
} smbstatus_t;
typedef struct {
uchar id[4]; // SHD<^Z>
word type; // Message type (normally 0)
word version; // Version of type (initially 100h for 1.00)
word length; // Total length of fixed record + all fields
word attr; // Attributes (bit field) (duped in SID)
dword auxattr; // Auxillary attributes (bit field)
dword netattr; // Network attributes
when_t when_written; // Time message was written (unix format)
when_t when_imported; // Time message was imported
dword number; // Message number
dword thread_orig; // Original message number in thread
dword thread_next; // Next message in thread
dword thread_first; // First reply to this message
uchar reserved[16]; // Reserved for future use
dword offset; // Offset for buffer into data file (0 or mod 256)
word total_dfields; // Total number of data fields
} msghdr_t;
typedef struct {
word type; // Type of data field
dword offset; // Offset into buffer
dword length; // Length of data field
} dfield_t;
typedef struct {
word type;
word length; // Length of buffer
} hfield_t;
typedef struct {
word zone, net, node, point;
} fidoaddr_t;
typedef struct {
word type;
void *addr;
} net_t;
// ------------------------------------------------------------------
#if defined(GOLD_CANPACK)
#pragma pack()
#endif
// ------------------------------------------------------------------
typedef struct {
idxrec_t idx; // Index
msghdr_t hdr; // Header record (fixed portion)
uchar *to, // To name
*to_ext, // To extension
*from, // From name
*from_ext, // From extension
*replyto, // Reply-to name
*replyto_ext, // Reply-to extension */
*subj; // Subject
word to_agent, // Type of agent message is to
from_agent, // Type of agent message is from
replyto_agent; // Type of agent replies should be sent to
net_t to_net, // Destination network type and address
from_net, // Origin network address
replyto_net; // Network type and address for replies
word total_hfields; // Total number of header fields
hfield_t *hfield; // Header fields (fixed length portion)
void **hfield_dat; // Header fields (variable length portion)
dfield_t *dfield; // Data fields (fixed length portion)
dword offset; // Offset (number of records) into index
uchar forwarded; // Forwarded from agent to another
} smbmsg_t;
// ------------------------------------------------------------------
struct SMBData {
char shd_buf[SHD_BLOCK_LEN];
FILE *sdt_fp, *shd_fp, *sid_fp, *sda_fp, *sha_fp;
};
// ------------------------------------------------------------------
class SMBArea : public gmo_area {
protected:
SMBData* data;
void data_open();
void data_close();
void raw_scan(bool keep_index=false, bool scanpm=false);
FILE* smb_openexlusively(const char *file, int retry_time);
int smb_openexlusively2(const char *file, int retry_time);
int smb_open(int retry_time);
void smb_close(void);
int smb_open_da(int retry_time);
int smb_open_ha(int retry_time);
int smb_create(dword max_crcs, dword max_msgs, word max_age, word attr, int retry_time);
int smb_trunchdr(int retry_time);
int smb_locksmbhdr(int retry_time);
int smb_getstatus(smbstatus_t *status);
int smb_putstatus(smbstatus_t status);
int smb_unlocksmbhdr(void);
int smb_getmsgidx(smbmsg_t *msg);
int smb_getlastidx(idxrec_t *idx);
uint smb_getmsghdrlen(smbmsg_t msg);
dword smb_getmsgdatlen(smbmsg_t msg);
int smb_lockmsghdr(smbmsg_t msg, int retry_time);
int smb_getmsghdr(smbmsg_t *msg);
int smb_unlockmsghdr(smbmsg_t msg);
int smb_addcrc(dword max_crcs, dword crc, int retry_time);
int smb_hfield(smbmsg_t *msg, word type, word length, void *data);
int smb_dfield(smbmsg_t *msg, word type, dword length);
int smb_addmsghdr(smbmsg_t *msg, smbstatus_t *status, int storage, int retry_time);
int smb_putmsg(smbmsg_t msg);
int smb_putmsgidx(smbmsg_t msg);
int smb_putmsghdr(smbmsg_t msg);
void smb_freemsgmem(smbmsg_t msg);
dword smb_hdrblocks(dword length);
dword smb_datblocks(dword length);
long smb_allochdr(dword length);
long smb_fallochdr(dword length);
long smb_hallochdr(dword header_offset);
long smb_allocdat(dword length, word headers);
long smb_fallocdat(dword length, word headers);
long smb_hallocdat(void);
int smb_incdat(dword offset, dword length, word headers);
int smb_freemsg(smbmsg_t msg, smbstatus_t status);
int smb_freemsgdat(dword offset, dword length, word headers);
int smb_freemsghdr(dword offset, dword length);
int load_hdr(gmsg* __msg, smbmsg_t *msg);
public:
SMBArea() { data = NULL; }
virtual ~SMBArea() {}
// ----------------------------------------------------------------
// Messagebase member functions
void open();
void close();
void suspend();
void resume();
void lock();
void unlock();
void scan();
void scan_area();
void scan_area_pm();
int load_hdr(gmsg* msg) { return load_hdr(msg, NULL); }
int load_msg(gmsg* msg);
void save_hdr(int mode, gmsg* msg);
void save_msg(int mode, gmsg* msg);
void del_msg(gmsg* msg);
void new_msgno(gmsg* msg);
char* user_lookup(char* lookfor);
int renumber();
void update_timesread(gmsg* msg);
Line* make_dump_msg(Line*& lin, gmsg* msg, char* lng_head);
};
// ------------------------------------------------------------------
extern SMBData* smbdata;
extern int smbdatano;
// ------------------------------------------------------------------
#endif
// ------------------------------------------------------------------