1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
|
/*
* SMAPI; Modified Squish MSGAPI
*
* Squish MSGAPI0 is copyright 1991 by Scott J. Dudley. All rights reserved.
* Modifications released to the public domain.
*
* Use of this file is subject to the restrictions contain in the Squish
* MSGAPI0 licence agreement. Please refer to licence.txt for complete
* details of the licencing restrictions. If you do not find the text
* of this agreement in licence.txt, or if you do not have this file,
* you should contact Scott Dudley at FidoNet node 1:249/106 or Internet
* e-mail Scott.Dudley@f106.n249.z1.fidonet.org.
*
* In no event should you proceed to use any of the source files in this
* archive without having accepted the terms of the MSGAPI0 licensing
* agreement, or such other agreement as you are able to reach with the
* author.
*/
#ifdef __cplusplus
extern "C" {
#endif
#ifndef MSGAPI
#define MSGAPI
#include "compiler.h"
#include "typedefs.h"
#include "stamp.h"
#ifdef __BEOS__
#include <OS.h>
#endif
#define MSGAREA_NORMAL 0x00
#define MSGAREA_CREATE 0x01
#define MSGAREA_CRIFNEC 0x02
/* Message & messagebase types (FIDO/OPUS, jam, squish, passthrough, ...) */
/* - types by storage type */
#define MSGTYPE_STORAGES 0x0F /* MSGTYPE_SDM | MSGTYPE_SQUISH | MSGTYPE_PASSTHROUGH | MSGTYPE_JAM */
#define MSGTYPE_SDM 0x01
#define MSGTYPE_SQUISH 0x02
#define MSGTYPE_PASSTHROUGH 0x04
#define MSGTYPE_JAM 0x08
/* - types by area type (echo, net, ...) */
#define MSGTYPE_AREAS 0x1C0 /* MSGTYPE_ECHO | ... */
#define MSGTYPE_ECHO 0x80
#define MSGTYPE_NOTH 0x0100 /* What is it ?... unknown... */
/* Special message number values */
#define MSGNUM_CUR ((dword)-1L)
#define MSGNUM_PREV ((dword)-2L)
#define MSGNUM_NEXT ((dword)-3L)
#define MSGNUM_current MSGNUM_CUR
#define MSGNUM_previous MSGNUM_PREV
#define MSGNUM_next MSGNUM_NEXT
#define MOPEN_CREATE 0
#define MOPEN_READ 1
#define MOPEN_WRITE 2
#define MOPEN_RW 3
#ifdef __UNIX__
#define FILEMODE_NETMAIL (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)
#define FILEMODE_ECHOMAIL (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
#else
#define FILEMODE_NETMAIL (S_IREAD | S_IWRITE)
#define FILEMODE_ECHOMAIL (S_IREAD | S_IWRITE)
#endif
#define FILEMODE(a) ((a) ? FILEMODE_ECHOMAIL : FILEMODE_NETMAIL)
struct _msgapi;
struct _msgh;
struct _xmsg;
struct _netaddr;
typedef struct _msgapi MSGA;
typedef struct _msgapi *HAREA;
typedef struct _msgh MSGH;
typedef struct _msgh *HMSG;
typedef struct _xmsg *PXMSG;
typedef struct _netaddr NETADDR;
typedef NETADDR *PNETADDR;
typedef dword UMSGID;
#define MSGAPI_VERSION 2
#define MSGAPI_SUBVERSION 0x240
#define SMAPI_VERSION "2.4.0"
struct _minf
{
word req_version;
word def_zone;
word haveshare; /* filled in by msgapi routines - no need to set this */
/* Version 2 Information */
word smapi_version;
word smapi_subversion;
};
/*
* The network address structure. The zone/net/node/point fields are
* always maintained in parallel to the 'ascii' field, which is simply
* an ASCII representation of the address. In addition, the 'ascii' field
* can be used for other purposes (such as Internet addresses), so the
* contents of this field are implementation-defined, but for most cases,
* should be in the format "1:123/456.7" for Fido addresses.
*/
struct _netaddr
{
word zone;
word net;
word node;
word point;
};
/*
* The eXtended message structure. Translation between this structure,
* and the structure used by the individual message base formats, is done
* on-the-fly by the API routines.
*/
typedef struct _xmsg
{
/* Bitmasks for 'attr' */
#define MSGPRIVATE 0x0001
#define MSGCRASH 0x0002
#define MSGREAD 0x0004
#define MSGSENT 0x0008
#define MSGFILE 0x0010
#define MSGFWD 0x0020 /* is also called intransit flag */
#define MSGORPHAN 0x0040
#define MSGKILL 0x0080
#define MSGLOCAL 0x0100
#define MSGHOLD 0x0200
#define MSGXX2 0x0400 /* you can use this flag as "Direct" attribute */
#define MSGFRQ 0x0800
#define MSGRRQ 0x1000
#define MSGCPT 0x2000
#define MSGARQ 0x4000
#define MSGURQ 0x8000
#define MSGSCANNED 0x00010000L
#define MSGUID 0x00020000L /* xmsg.uid field contains umsgid of msg */
#define MSGIMM 0x00040000L /* Use only if msgtype == MSGTYPE_JAM !
Used to map the Jam "immediate" attribute. */
#define MSGLOCKED 0x40000000L /* this seems to be a feature of golded */
dword attr;
#define XMSG_FROM_SIZE 36
#define XMSG_TO_SIZE 36
#define XMSG_SUBJ_SIZE 72
byte from[XMSG_FROM_SIZE];
byte to[XMSG_TO_SIZE];
byte subj[XMSG_SUBJ_SIZE];
NETADDR orig; /* Origination and destination addresses */
NETADDR dest;
struct _stamp date_written; /* When user wrote the msg (UTC) */
struct _stamp date_arrived; /* When msg arrived on-line (UTC) */
sword utc_ofs; /* Offset from UTC of message writer, in
* minutes. */
#define MAX_REPLY 9 /* Max number of stored replies to one msg */
UMSGID replyto;
UMSGID replies[MAX_REPLY];
dword umsgid; /* UMSGID of this message, if (attr&MSGUID) */
/* This field is only stored on disk -- it *
* is not read into memory. */
byte __ftsc_date[20]; /* Obsolete date information. If it weren't
* for the fact that FTSC standards say that
* one cannot modify an in-transit message,
* I'd be VERY tempted to axe this field
* entirely, and recreate an FTSC-compatible
* date field using the information in
* 'date_written' upon export. Nobody should
* use this field, except possibly for tossers
* and scanners. All others should use one
* of the two binary datestamps, above. */
}
XMSG;
/* XMSG_SIZE is not sizeof(XMSG) but size of squish message header.
* This value used for disk i/o operations with squish messagebase.
*/
#define XMSG_SIZE (94 + XMSG_FROM_SIZE + XMSG_TO_SIZE + XMSG_SUBJ_SIZE)
#define xmreply1st replies[0]
#define xmreplynext replies[MAX_REPLY-1]
#define xmtimesread replies[MAX_REPLY-2]
#define xmcost replies[MAX_REPLY-3]
/*
* This is a 'message area handle', as returned by MsgOpenArea(), and
* required by calls to all other message functions. This structure must
* always be accessed through the API functions, and never modified
* directly.
*/
struct _msgapi
{
#define MSGAPI_ID 0x0201414DL
dword id; /* Must always equal MSGAPI_ID */
word len; /* LENGTH OF THIS STRUCTURE! */
word type;
dword num_msg;
dword cur_msg;
dword high_msg;
dword high_water;
word sz_xmsg;
byte locked; /* Base is locked from use by other tasks */
byte isecho; /* Is this an EchoMail area? */
/* Function pointers for manipulating messages within this area. */
struct _apifuncs
{
sword(_XPENTRY * CloseArea) (HAREA mh);
MSGH *(_XPENTRY * OpenMsg) (HAREA mh, word mode, dword n);
sword(_XPENTRY * CloseMsg) (MSGH * msgh);
dword(_XPENTRY * ReadMsg) (MSGH * msgh, XMSG * msg, dword ofs, dword bytes, byte * text, dword cbyt, byte * ctxt);
sword(_XPENTRY * WriteMsg) (MSGH * msgh, word append, XMSG * msg, byte * text, dword textlen, dword totlen, dword clen, byte * ctxt);
sword(_XPENTRY * KillMsg) (HAREA mh, dword msgnum);
sword(_XPENTRY * Lock) (HAREA mh);
sword(_XPENTRY * Unlock) (HAREA mh);
sword(_XPENTRY * SetCurPos) (MSGH * msgh, dword pos);
dword(_XPENTRY * GetCurPos) (MSGH * msgh);
UMSGID(_XPENTRY * MsgnToUid) (HAREA mh, dword msgnum);
dword(_XPENTRY * UidToMsgn) (HAREA mh, UMSGID umsgid, word type);
dword(_XPENTRY * GetHighWater) (HAREA mh);
sword(_XPENTRY * SetHighWater) (HAREA mh, dword hwm);
dword(_XPENTRY * GetTextLen) (MSGH * msgh);
dword(_XPENTRY * GetCtrlLen) (MSGH * msgh);
/* Version 1 Functions */
UMSGID (_XPENTRY * GetNextUid)(HAREA harea);
/* Version 2 Functions */
dword (_XPENTRY * GetHash)(HAREA harea, dword msgnum);
} *api;
/*
* Pointer to application-specific data. API_SQ.C and API_SDM.C use
* this for different things, so again, no applications should muck
* with anything in here.
*/
void *apidata;
#ifdef ALTLOCKING
char *lck_path;
int lck_handle;
#endif
};
/*
* This is a 'dummy' message handle. The other message handlers (contained
* in API_SQ.C and API_SDM.C) will define their own structures, with some
* application-specified variables instead of other[]. Applications should
* not mess with anything inside the _msgh (or MSGH) structure.
*/
#define MSGH_ID 0x0302484DL
#if !defined(MSGAPI_HANDLERS) /*&& !defined(NO_MSGH_DEF) *//* NO_MSGH_DEF unused */
struct _msgh
{
MSGA *sq;
dword id;
dword bytes_written;
dword cur_pos;
};
#endif
#include "api_brow.h"
/*
* This variable is modified whenever an error occurs with the MsgXxx()
* functions. If msgapierr == 0, then no error occurred.
*/
SMAPI_EXT word _stdc msgapierr;
extern struct _minf _stdc mi;
#define palloc(s) malloc(s)
#define pfree(s) { if (s) { free(s); s = NULL; } }
#define farpalloc(s) farmalloc(s)
#define farpfree(s) { if (s) { farfree(s); s = NULL; } }
/* Constants for 'type' argument of MsgUidToMsgn() */
#define UID_EXACT 0x00
#define UID_NEXT 0x01
#define UID_PREV 0x02
/* Values for 'msgapierr', above. */
#define MERR_NONE 0 /* No error */
#define MERR_BADH 1 /* Invalid handle passed to function */
#define MERR_BADF 2 /* Invalid or corrupted file */
#define MERR_NOMEM 3 /* Not enough memory for specified operation */
#define MERR_NODS 4 /* Maybe not enough disk space for operation */
#define MERR_NOENT 5 /* File/message does not exist */
#define MERR_BADA 6 /* Bad argument passed to msgapi function */
#define MERR_EOPEN 7 /* Couldn't close - messages still open */
#define MERR_NOLOCK 8 /* Base needs to be locked to perform operation */
#define MERR_SHARE 9 /* Resource in use by other process */
#define MERR_EACCES 10 /* Access denied (can't write to read-only, etc) */
#define MERR_BADMSG 11 /* Bad message frame (Squish) */
#define MERR_TOOBIG 12 /* Too much text/ctrlinfo to fit in frame (Squish)*/
#define MERR_BADNAME 13 /* Bad area name or file name */
/*
* Now, a set of macros, which call the specified API function. These
* will map calls for 'MsgOpenMsg()' into 'SquishOpenMsg()', 'SdmOpenMsg()',
* or '<insert fave message type here>'. Applications should always call
* these macros, instead of trying to call the manipulation functions
* directly.
*/
#define MsgCloseArea(mh) (*(mh)->api->CloseArea) (mh)
#define MsgOpenMsg(mh,mode,n) (*(mh)->api->OpenMsg)(mh,mode,n)
#define MsgCloseMsg(msgh) ((*(((struct _msgh *)msgh)->sq->api->CloseMsg))(msgh))
#define MsgReadMsg(msgh,msg,ofs,b,t,cl,ct) (*(((struct _msgh *)msgh)->sq->api->ReadMsg))(msgh,msg,ofs,b,t,cl,ct)
#define MsgWriteMsg(gh,a,m,t,tl,ttl,cl,ct) (*(((struct _msgh *)gh)->sq->api->WriteMsg))(gh,a,m,t,tl,ttl,cl,ct)
#define MsgKillMsg(mh,msgnum) (*(mh)->api->KillMsg)(mh,msgnum)
#define MsgLock(mh) (*(mh)->api->Lock)(mh)
#define MsgUnlock(mh) (*(mh)->api->Unlock)(mh)
#define MsgGetCurPos(msgh) (*(((struct _msgh *)msgh)->sq->api->GetCurPos))(msgh)
#define MsgSetCurPos(msgh,pos) (*(((struct _msgh *)msgh)->sq->api->SetCurPos))(msgh,pos)
#define MsgMsgnToUid(mh,msgn) (*(mh)->api->MsgnToUid)(mh,msgn)
#define MsgUidToMsgn(mh,umsgid,t) (*(mh)->api->UidToMsgn)(mh,umsgid,t)
#define MsgGetHighWater(mh) (*(mh)->api->GetHighWater)(mh)
#define MsgSetHighWater(mh,n) (*(mh)->api->SetHighWater)(mh,n)
#define MsgGetTextLen(msgh) (*(((struct _msgh *)msgh)->sq->api->GetTextLen))(msgh)
#define MsgGetCtrlLen(msgh) (*(((struct _msgh *)msgh)->sq->api->GetCtrlLen))(msgh)
#define MsgGetNextUid(ha) (*(ha)->api->GetNextUid)(ha)
/*
* These don't actually call any functions, but are macros used to access
* private data inside the _msgh structure.
*/
#define MsgCurMsg(mh) ((mh)->cur_msg)
#define MsgNumMsg(mh) ((mh)->num_msg)
#define MsgHighMsg(mh) ((mh)->high_msg)
#define MsgGetCurMsg(mh) ((mh)->cur_msg)
#define MsgGetNumMsg(mh) ((mh)->num_msg)
#define MsgGetHighMsg(mh) ((mh)->high_msg)
#define MsgStripDebris(str) StripNasties(str)
#define MsgCreateCtrlBuf(t, n, l) CopyToControlBuf(t, n, l)
#define MsgGetCtrlToken(where, what) GetCtrlToken(where, what)
#define MsgCvt4D(c, o, d) ConvertControlInfo(c, o, d)
#define MsgCvtCtrlToKludge(ctrl) CvtCtrlToKludge(ctrl)
#define MsgRemoveToken(c, w) RemoveFromCtrl(c, w)
#define MsgGetNumKludges(txt) NumKludges(txt)
#define MsgWrite4D(msg, wf, ctrl) WriteZPInfo(msg, wf, ctrl)
#define MsgInvalidHmsg(mh) InvalidMsgh(mh)
#define MsgInvalidHarea(mh) InvalidMh(mh)
#define MsgCvtFTSCDateToBinary(a, b) ASCII_Date_To_Binary(a,b)
SMAPI_EXT sword _XPENTRY MsgOpenApi(struct _minf *minf);
SMAPI_EXT sword _XPENTRY MsgCloseApi(void);
SMAPI_EXT MSGA *_XPENTRY MsgOpenArea(byte * name, word mode, word type);
SMAPI_EXT int MsgDeleteBase(char * name, word type);
sword _XPENTRY MsgValidate(word type, byte * name);
sword _XPENTRY MsgBrowseArea(BROWSE * b);
sword MSGAPI InvalidMsgh(MSGH * msgh);
sword MSGAPI InvalidMh(MSGA * mh);
sword MSGAPI InvalidMsg(XMSG * msg);
void _XPENTRY SquishSetMaxMsg(MSGA * sq, dword max_msgs, dword skip_msgs, dword age);
SMAPI_EXT dword _XPENTRY SquishHash(byte * f);
MSGA *MSGAPI SdmOpenArea(byte * name, word mode, word type);
sword MSGAPI SdmValidate(byte * name);
int SdmDeleteBase(char * name);
MSGA *MSGAPI SquishOpenArea(byte * name, word mode, word type);
sword MSGAPI SquishValidate(byte * name);
int SquishDeleteBase(char * name);
MSGA *MSGAPI JamOpenArea(byte * name, word mode, word type);
sword MSGAPI JamValidate(byte * name);
int JamDeleteBase(char * name);
void JamCloseOpenAreas();
SMAPI_EXT byte *_XPENTRY CvtCtrlToKludge(byte * ctrl);
SMAPI_EXT byte *_XPENTRY GetCtrlToken(byte * where, byte * what);
SMAPI_EXT byte *_XPENTRY CopyToControlBuf(byte * txt, byte ** newtext, unsigned *length);
void _XPENTRY ConvertControlInfo(byte * ctrl, NETADDR * orig, NETADDR * dest);
word _XPENTRY NumKludges(char *txt);
SMAPI_EXT void _XPENTRY RemoveFromCtrl(byte * ctrl, byte * what);
SMAPI_EXT dword _XPENTRY GenMsgId(char *seqdir, unsigned long max_outrun);
SMAPI_EXT dword _XPENTRY GenMsgIdEx(char *seqdir, unsigned long max_outrun, dword (*altGenMsgId)(void), char **errstr);
/* Check version of smapi library
* return zero if test passed
* test cvs need for DLL version only, using #include <smapi/cvsdate.h>
const char *smapidate(){
static const
#include "../smapi/cvsdate.h"
return cvs_date;
}
CheckSmapiVersion( ..., smapidate());
*/
SMAPI_EXT int _XPENTRY CheckSmapiVersion( int need_major, int need_minor,
int need_patch, const char *cvs_date_string );
/* Return MSGAPI error text (string constant).
*/
SMAPI_EXT char * _XPENTRY strmerr(int msgapierr);
#if !defined(__FLAT__)
#ifndef farread
sword far pascal farread(sword handle, byte far * buf, word len);
#endif
#ifndef farwrite
sword far pascal farwrite(sword handle, byte far * buf, word len);
#endif
#endif
byte *_fast Address(NETADDR * a);
byte *StripNasties(byte * str);
#if defined(__DOS__)
sword far pascal shareloaded(void);
#elif defined(__OS2__) || defined(__NT__) || defined(__UNIX__)
#define shareloaded() TRUE
#else
#define shareloaded() FALSE
#endif
#endif
#ifdef __cplusplus
}
#endif
|