2025-04-27 07:49:33 -04:00

596 lines
21 KiB
C

/***************************************************************************
Name : AWNSFCOR.H
Comment : NSF related definitions that _must_ be kept the same.
EVERYTHING in this file affects what is sent across the
wire. For full compatibility with all versions of Microsoft
At Work NSFs, _nothing_ in here should be changed.
The NSF protocol can be extended by adding new groups
and by appending fields at the end of existing groups.
Interfaces, structures and constants that only affect one
machine (i.e. not what is on the wire) should not be in
this file
Copyright (c) 1993 Microsoft Corp.
Revision Log
Date Name Description
-------- ----- ---------------------------------------------------------
12/31/93 arulm Created this. Verified in matches Snowball.rc
***************************************************************************/
#ifndef _AWNSFCOR_H
#define _AWNSFCOR_H
/***********************************************************************
* *
* NOTICE: This file has to be ANSI compilable, under GCC on UNIX *
* and other ANSI compiles. Be sure to use no MS C specific features *
* In particular, don't use // for comments!!!! *
* *
***********************************************************************/
/** Microsoft At Work NSF signature **/
#define SIG_USA 0xB5 /** defiend by CCITT **/
#define SIG_ATWORK1 0x00 /** 00--first (low) byte **/
#define SIG_ATWORK2 0x76 /** 76--second (high) byte **/
#define MAXNSCPOLLREQ 5
#ifndef NOCHALL
# define POLL_CHALLENGE_LEN 10
#endif
/** NSF Group Numbers. Cant have duplicates. Max 5 bits. **/
#define GROUPNUM_FIRST 1
#define GROUPNUM_STD 1
#define GROUPNUM_POLLCAPS 2
#define GROUPNUM_POLLREQ 3
#define GROUPNUM_IMAGE 4
#define GROUPNUM_TEXTID 5
#define GROUPNUM_MACHINEID 6
#define GROUPNUM_NSS 7
#define GROUPNUM_LAST 7
#ifndef PORTABLE /* Microsoft C only */
#pragma pack(1) /** MUST ensure packed structures here **/
// Note that all these structures have a fixed size (as defined here)
// in memory, but a variable size when encoded in the NSF on the wire
// During transmission, only the smallest non-zero prefix of each
// capability group is sent. For example if the STD group is
// zero from the 7th byte onward, only 6 bytes are sent.
//
// Similarly strings that are variable length on the wire are fixed
// length in the in-memory structures, for ease of manipulation
typedef struct
{
WORD GroupLength :6;
WORD GroupNum :5;
WORD Reserved :5;
}
BCHDR, near* NPBCHDR, far* LPBCHDR;
/********
@doc EXTERNAL DATATYPES OEMNSF
@types BCSTD | Standard Capabilities Group
@field BITFIELD | GroupLength | Must be set to sizeof(BCSTD).
@field BITFIELD | GroupNum | Must be set to GROUPNUM_STD.
@field BITFIELD | vMsgProtocol | Linearizer version. Set to 0 if linearized
messages are not accepted. Set to vMSG_SNOW if using
Snowball/WFW3.11 linearizer/delinearizer. Set to vMSG_IFAX if
using IFAX release 1.00 linearizer/delinearizer.
@field BITFIELD | fBinaryData | Set to 1 if binary files are accepted
inside linearized messages. Otherwise set to 0. (Currently
must set to 1 if vMsgProtocol is non-zero).
@field BITFIELD | fInwardRouting | Currently set to 0
@field BITFIELD | vSecurity | Set to vSECURE_SNOW if using Snowball/WFW3.11
version of linearized message security
@field BITFIELD | vMsgCompress | Currently set to 0
@field BITFIELD | fDontCache | If this is set, the DIS & NSF capabilities
should not be cached, because they are not constant. This will
be set, for example, in machines that are part of a "hunt group"
i.e. a poll of fax possibly heterogenous machines connected to
multiple lines on a single inward-dial number. When a call comes
in any random available machine is assigned the call. If the
machines are heterogenous, then callers that cache capabilities
will run into trouble on subsequent calls to the same number.
The same might be the case for numbers shared by a (say) PC with a
modem running the At Work protocol and a ordinary G3 fax. When the
PC is powered up & running, At Work features are available. When the
PC is shutdown the G3 fax acts as a "backup". Etc..
@field BITFIELD | OperatingSys | Set to OS_WIN16 if based on 16bit Windows
(Win3.1 or earlier, WFW3.1, WFW3.11 etc). OS_WIN32 if based on
WIN32 API (NT and WIN95). OS_ARADOR if based on the AT Work
device OSs. Values for non-Microsoft OSs TBD.
Please contact Microsoft if you need this.
@field BITFIELD | vShortFlags | Currently set to 0
@field BITFIELD | vInteractive | Currently set to 0
@field BITFIELD | DataSpeed | Currently set to 0
@field BITFIELD | DataLink | Currently set to 0
@xref <t BC>
********/
typedef struct
{
WORD GroupLength :6; // length of this group in bytes 00=grp invalid
WORD GroupNum :5; // must be GROUPNUM_STD
WORD vMsgProtocol :3; // 00==Doesnt accept linearized msgs
// vMSG_SNOW==Current (WFW) version of linearizer
WORD fBinaryData :1; // accept binary files inside linearized msgs
WORD fInwardRouting :1; // 00==no inward routing
//2bytes
BYTE vSecurity :3; // 00==none vSECURE_SNOW==snowball security
BYTE vMsgCompress :2; // 00==none
BYTE fDontCache :1; // 1=DIS/NSF caps should not be cached!!
BYTE Reserved :2;
//3bytes
BYTE OperatingSys :3; // OS_WIN16==16bit Windows(Win3.1, WFW etc)
// OS_ARADOR==AtWork based OSs (IFAX etc)
// OS_WIN32== WIN32 OSs (NT, WIN95)
BYTE vShortFlags :2; // 00==not supported
BYTE vInteractive :3; // 00==No interactive protocol support
//4bytes
BYTE DataSpeed :5; //Data modem modulations/speeds. 00000==none
BYTE DataLink :3; //Data-link protocols. 000==none
//5bytes
}
BCSTD, near* NPBCSTD, far* LPBCSTD;
typedef struct
{
WORD GroupLength :6; // length of this group in bytes 00=grp invalid
WORD GroupNum :5; // must be GROUPNUM_TEXTID
WORD TextEncoding:5; // Text code. TEXTCODE_ASCII==ascii
//2bytes
BYTE bTextId[MAXTOTALIDLEN+2]; // zero-terminated
}
BCTEXTID, near* NPBCTEXTID, far* LPBCTEXTID;
typedef struct
{
WORD GroupLength :6; // length of this group in bytes 00=grp invalid
WORD GroupNum :5; // must be GROUPNUM_MACHINEID
WORD Reserved :5;
//2bytes
BYTE bMachineId[MAXTOTALIDLEN+2]; // machine ID
}
BCMACHINEID, near* NPBCMACHINEID, far* LPBCMACHINEID;
/********
@doc EXTERNAL DATATYPES OEMNSF
@types BCIMAGE | Image Capabilities Group
@field BITFIELD | GroupLength | Must be set to sizeof(BCIMAGE).
@field BITFIELD | GroupNum | Must be set to GROUPNUM_IMAGE.
@field BITFIELD | fAnyWidth | Currently set to 0.
@field BITFIELD | vRamboVer | At Work Resource-based rendering technology
(a.k.a. Rambo) version number. Set to 0 if Rambo format is not
supported. Set to vRAMBO_VER1 if using IFAX release 1.00 Rambo
rasterizer.
@field BITFIELD | vCoverAttach | Currently set to 0.
@field BITFIELD | vAddrAttach | Currently set to 0.
@field BITFIELD | vMetaFile | Currently set to 0.
@field BITFIELD | HiResolution | Currently set to 0.
@field BITFIELD | HiEncoding | Currently set to 0.
@field BITFIELD | CutSheetSizes| Currently set to 0.
@field BITFIELD | fOddCutSheet | Currently set to 0.
@xref <t BC>
********/
typedef struct
{
WORD GroupLength :6; // length of this group in bytes 00=grp invalid
WORD GroupNum :5; // group number--must be GROUPNUM_IMAGE
WORD fAnyWidth :1; // page pixel widths dont have to be exactly T.4
WORD vRamboVer :4; // Rambo: 00==not supported
//2bytes
BYTE vCoverAttach:3; // 00==no digital cover page renderer
BYTE vAddrAttach :2; // 00==cannot accept address bk attachmnts
BYTE vMetaFile :2; // 00==metafiles not accepted
BYTE Reserved1 :1;
//3bytes
BYTE HiResolution :4; // one or more of the HRES_ #defines below
BYTE HiEncoding :4; // one or more of the HENCODE_ #defines below
//4bytes
BYTE CutSheetSizes; // one or more of the PSIZE_ #defines below
//5bytes
BYTE fOddCutSheet:1; // Cut-sheet sizes other than ones listed below
// are available. (To get list req. ext caps)
BYTE Reserved2 :7;
//6bytes
}
BCIMAGE, far* LPBCIMAGE, near* NPBCIMAGE;
/********
@doc EXTERNAL DATATYPES OEMNSF
@types BCPOLLCAPS | Polling Capabilities Group
@field BITFIELD | GroupLength | Must be set to sizeof(BCPOLLCAPS).
@field BITFIELD | GroupNum | Must be set to GROUPNUM_POLLCAPS.
@field BITFIELD | fLowSpeedPoll | Set to 1 if NSC poll requests are accepted,
and there are poll-stored messages/files available for polling.
@field BITFIELD | fHighSpeedPoll | Set to 1 if Phase-C poll requests are
accepted, and there are poll-stored messages/files available
for polling.
@field BITFIELD | fPollByNameAvail | Set to 1 if polling for documents by
title and optional password is supported and there are some
such poll-stored documents available.
@field BITFIELD | fPollByRecipAvail | Set to 1 if polling for contents of
a registered user's Message folder is supported and active.
@field BITFIELD | fFilePolling | Set to 1 if polling for arbitrary disk
files by path name is supported.
@field BITFIELD | fExtCapsAvail | Set to 1 if extended capabalities are
supported and there are some registered extended capabilities
available for polling. If this is non-zero, the ExtCapsCRC field
must also be set.
@field BITFIELD | fNoShortTurn | Set to 1 if polling is supported, but the
poller is required to wait for the T2 (6 sec) timeout followed
by NSF-DIS before sending NSC-DTC. If this is 0, Pollers are
free to send an NSC-DTC immediately after EOM-MCF.
@field BITFIELD | vMsgRelay | Currently set to 0.
@field WORD | ExtCapsCRC | Set iff fExtCapsAvail is 1. This is a
CCITT-CRC16 of the registered extended capabailities on the
the machine.
@xref <t BC>
********/
typedef struct
{
WORD GroupLength :6; // length of this group in bytes 00=grp invalid
WORD GroupNum :5; // must be GROUPNUM_POLLCAPS
WORD fLowSpeedPoll :1; // SEP/PWD/NSC poll reqs accepted
WORD fHighSpeedPoll :1; // PhaseC pollreqs accepted
// if both the above 00, poll reqs not accepted
WORD fPollByNameAvail :1;// Poll-by-MessageName msgs available
WORD fPollByRecipAvail:1;// Poll-by-Recipient msgs available
WORD fFilePolling :1;// Supports polling for arbitrary files
//2bytes
BYTE fExtCapsAvail :1; // Extended capabiities available
BYTE fNoShortTurn :1; // NOT OK recving NSC-DTC immediately after EOM-MCF
BYTE vMsgRelay :3; // Msg relay ver. 0==no support
BYTE Reserved :3;
//3bytes
WORD ExtCapsCRC; // CRC of machines extended capabilities
//5bytes
}
BCPOLLCAPS, far *LPBCPOLLCAPS, near* NPBCPOLLCAPS;
/********
@doc EXTERNAL DATATYPES OEMNSF
@types BCPOLLREQ | Poll Request stucture
@field BITFIELD | GroupLength | Must be set to sizeof(BCPOLLREQ).
@field BITFIELD | GroupNum | Must be set to GROUPNUM_POLLREQ.
@field BITFIELD | fReturnControl | 1=return control when done 0=hangup when done
@field BITFIELD | PollType | Poll type. See <t POLLTYPE> for details.
@field BYTE | b[] | Variable length name and (optionally) password.
The exact contents and layout depends on the POLLTYPE as follows
@flag POLLTYPE_NAMED_DOC | b[] contains a Poll Document Name. If there
is no password, the Document Name is not null-terminated. If there
is a password, the document name is null-terminated and followed
by the "Poll Challenge Response" generated using the algorithm
below.
@flag POLLTYPE_BYRECIPNAME | b[] contains a Recipient Mailbox Address.
If there is no password, the Mailbox Address is not null-terminated.
If there is a password, the mailbox address is null-terminated and
followed by the "Poll Challenge Response".
@flag POLLTYPE_BYPATHNAME | b[] contains a file pathname. If there
is no password, the pathname is not null-terminated. If there
is a password, the pathname is null-terminated and followed
by the "Poll Challenge Response".
@flag POLLTYPE_EXTCAPS | If no password is supplied b[] is 0 length,
otherwise b[0] is 0, and is followed by the "Poll Challenge
Response".
@flag POLLTYPE_DONE | b[0] is the poll error code. A code of 0 means
success. If b[] is zero length, that is equivalent to success.
@flag POLLTYPE_WAIT | b[] must be 0 length
@flag POLLTYPE_PHASEC | b[] must be 0 length
@comm
At Work Fax uses a Challenge-Response protocol for password
verification during polling. The scheme used is as follows.
On the POLLER'S side, bytes 3 to 3 + POLL_CHALLENGE_LEN of the actual
encrypted bytes of the FIF of the last MS NSF received prior to polling is
used as a challenge string. (This corresponds to the first
POLL_CHALLENGE_LEN bytes of the FIF after skipping the USA & MS codes).
If the received NSFs FIF had fewer than 3+POLL_CHALLENGE_LEN bytes then
as many bytes as were received are used. These bytes are the "Challenge".
This challenge string is encrypted using the actual Poll-Password as the
key. The enctypted result is the "Challenge Response". This is what is
actually sent on the wire. The actual poll password is not sent.
On the POLLEE'S side password verification is done as follows. The
relevant bytes of the last NSF sent are always saved as teh "Challenge".
On receiving a poll-req, the requested poll document name is used to look
up the expected password. Encrypt the saved "Challenge" the expected
password to get the "Expected Challenge Response". Compare the "Expected
Challenge Response" with the actual received "Challenge Response". Allow
the poll request to proceed only if they are identical (and identical is
length).
Note: The Challenge, and the challenge-response may both contain embedded
nuls. However the Poll Document-Name cannot contain embedded nuls.
@xref <t BC>
********/
#pragma warning (disable: 4200)
typedef struct
{
WORD GroupLength :6; // length of this group in bytes 00=grp invalid
WORD GroupNum :5; // must be GROUPNUM_POLLREQ
WORD fReturnControl :1; // 1=return control when done 0=hangup when done
WORD PollType :4; // one of the POLLTYPE_ defines below
//2bytes
BYTE b[]; // var length name and (optionally) password
}
BCPOLLREQ, far *LPBCPOLLREQ, near* NPBCPOLLREQ;
#pragma warning (default: 4200)
/********
@doc EXTERNAL DATATYPES OEMNSF
@types BCNSS | BC NSS struct
@field BITFIELD | GroupLength | Must be set to sizeof(BCNSS).
@field BITFIELD | GroupNum | Must be set to GROUPNUM_NSS.
@field BITFIELD | vMsgProtocol | Version of linearizer used to
encode the version of the message that immediately follows.
@field BITFIELD | vInteractive | Command to switch to the Microsoft
At Work Interactive Protocol. Version of that protocol to use.
@xref <t BC>
********/
typedef struct
{
WORD GroupLength :6; // length of this group in bytes 00=grp invalid
WORD GroupNum :5; // must be GROUPNUM_NSS
WORD vMsgProtocol :3; // non-zero: linearized msg follows
// vMSG_SNOW current linearized format
WORD Reserved1 :2;
// 2 bytes
BYTE vInteractive :3; // non-zero: Interactive prot being invoked
BYTE Reserved2 :5;
// 3 bytes
}
BCNSS, far *LPBCNSS, near* NPBCNSS;
#pragma pack() /** MUST ensure packed structures here **/
#endif /* !PORTABLE */
#define vMSG_SNOW 1 /* Snowball Linearizer version */
#define vMSG_IFAX100 2 /* IFAX linearizer version */
#define vSECURE_SNOW 1 /* vSecurity for Snowball (v1.00 of MAW) */
#define vRAMBO_VER1 1 /* Rambo ver on IFS66 */
#define OS_WIN16 0 /* OperatingSys for Win3.0, 3.1, WFW3.1, 3.11*/
#define OS_ARADOR 1 /* OperatingSys for Arador-based systems */
#define OS_WIN32 2 /* OperatingsSys for WIN32 (NT, WIN95) */
#define TEXTCODE_ASCII 0 /* TextEncoding for 7-bit ASCII */
#define vADDRBK_VER1 1 /* Address book attachments ver 1.00 */
/********
@doc EXTERNAL OEMNSF DATATYPES AWNSFAPI
@type VOID | POLLTYPE | PollType values
@emem POLLTYPE_WAIT | Poll request being processed--wait
@emem POLLTYPE_PHASEC | Poll request was already sent in PhaseC
@emem POLLTYPE_EXTCAPS | Extended capabilities poll request
@emem POLLTYPE_NAMED_DOC | Named document poll request
@emem POLLTYPE_BYRECIPNAME| Poll-by-Recip Mailbox Address
@emem POLLTYPE_BYPATHNAME | Poll-by-File Pathname
@emem POLLTYPE_DONE | poll request done or failed. Control being returned
********/
#define POLLTYPE_WAIT 0
#define POLLTYPE_PHASEC 1
#define POLLTYPE_EXTCAPS 2
#define POLLTYPE_NAMED_DOC 3
#define POLLTYPE_BYRECIPNAME 4
#define POLLTYPE_BYPATHNAME 5
#define POLLTYPE_DONE 8
#define POLLTYPE_LAST /* last valie POLLTYPE_ value */
#ifdef PORTABLE /** ANSI C version **/
#define GroupLength(lp) ((((LPBYTE)(lp))[0]) & 0x3F)
#define GroupNum(lp) ((((((LPBYTE)(lp))[0]) >> 6) & 0x03) | (((((LPBYTE)(lp))[1]) & 0x07) << 2))
#define SetGroupLength(lp, n) ((((LPBYTE)(lp))[0]) = (((((LPBYTE)(lp))[0]) & 0xC0) | ((n) & 0x3F)))
#define SetupTextIdHdr(lp, l, n, t) \
(((LPBYTE)(lp))[0]) = ((((l) & 0x3F) << 0) | (((n) & 0x03) << 6)); \
(((LPBYTE)(lp))[1]) = ((((n) & 0x1C) >> 2) | (((t) & 0x1F) << 3));
#else /** Microsoft C version **/
#define GroupLength(lp) (((LPBCHDR)(lp))->GroupLength)
#define GroupNum(lp) (((LPBCHDR)(lp))->GroupNum)
#define SetGroupLength(lp, n) (((LPBCHDR)(lp))->GroupLength = (n))
#define SetupTextIdHdr(lp, l, n, t) \
(((LPBCTEXTID)(lp))->GroupNum = (n)); \
(((LPBCTEXTID)(lp))->GroupLength = (l)); \
(((LPBCTEXTID)(lp))->TextEncoding = (t));
#endif /* PORTABLE */
#define AWRES_ALLT30 (AWRES_mm080_038 | AWRES_mm080_077 | AWRES_mm080_154 | AWRES_mm160_154 | AWRES_200_200 | AWRES_300_300 | AWRES_400_400)
/********
@doc EXTERNAL OEMNSF DATATYPES
@type VOID | FAX_PAGE_WIDTHS | Fax Page Width values
@emem WIDTH_A4 | A4 width, 1728 pixels at 8 lines/mm horizontal resolution.
@emem WIDTH_B4 | B4 width, 2048 pixels at 8 lines/mm horizontal resolution.
@emem WIDTH_A3 | A3 width, 2432 pixels at 8 lines/mm horizontal resolution.
@comm
Widths in pixels must be exactly correct for MH/MR/MMR decoding to work.
The width above are for NORMAL, FINE, 200dpi and SUPER resolutions.
At 400dpi or SUPER_SUPER exactly twice as many pixels must be supplied
and at 300dpi exactly 1.5 times.
@flag Number of Pixels/Bytes per line at each page width and resolution |
. A4 B4 A3
200 1728/216 2048/256 2432/304
300 2592/324 3072/384 3648/456
400 3456/432 4096/512 4864/608
@xref <t BCFAX>
********/
#define WIDTH_A4 0
#define WIDTH_B4 1
#define WIDTH_A3 2
#define WIDTH_MAX WIDTH_A3
#define WIDTH_A5 16 /* 1216 pixels */
#define WIDTH_A6 32 /* 864 pixels */
#define WIDTH_A5_1728 64 /* 1216 pixels */
#define WIDTH_A6_1728 128 /* 864 pixels */
/********
@doc EXTERNAL OEMNSF DATATYPES
@type VOID | FAX_PAGE_LENGTHS | Fax Page Width values
@emem LENGTH_A4 | A4 length.
@emem LENGTH_B4 | B4 length.
@emem LENGTH_UNLIMITED| Unknown/Unlimited length.
@xref <t BCFAX>
********/
#define LENGTH_A4 0
#define LENGTH_B4 1
#define LENGTH_UNLIMITED 2
#endif /* _AWNSFCOR_H */
/****************************************************************************
Note, line is kept open during poll requests as follows:-
(1) Successful poll request
Caller Callee Notes
....
<SendPhaseC>
EOM
MCF previous operation is now done
NSC/DTC TurnReason=TURN_POLL (may be accompanied by SEP etc)
(should contain all NSF caps etc)
NSC/DTC TurnReason=TURN_WAIT (response is not yet ready)
(minimal NSC, only beginning of POLLREQ grp, no other grps)
NSC/DTC TurnReason=TURN_POLL (dont resend SEP etc)
(minimal NSC, only beginning of POLLREQ grp, no other grps)
NSC/DTC TurnReason=TURN_WAIT
NSC/DTC TurnReason=TURN_POLL
NSS/DCS
<TCF, CFR, Phase C etc>
EOM
MCF
NSC/DTC TurnReason=TURN_DONE (req done. Return control if req)
(if control is not requested back, send DCN here)
.....
(2) Unsuccessful poll request
Caller Callee Notes
....
<SendPhaseC>
EOM
MCF previous operation is now done
NSC/DTC TurnReason=TURN_POLL (may be accompanied by SEP etc)
(should contain all NSF caps etc)
NSC/DTC TurnReason=TURN_WAIT (response is not yet ready)
(minimal NSC, only beginning of POLLREQ grp, no other grps)
NSC/DTC TurnReason=TURN_POLL (dont resend SEP etc)
(minimal NSC, only beginning of POLLREQ grp, no other grps)
NSC/DTC TurnReason=TURN_WAIT (response is not yet ready)
NSC/DTC TurnReason=TURN_POLL (dont resend SEP etc)
NSC/DTC TurnReason=TURN_FAIL (response is not available)
DCN (or continue with other operations)
*****************************************************************************/