/*   nbp.h,  /appletalk/ins,  Garth Conboy,  11/01/88  */
/*   Copyright (c) 1988 by Pacer Software Inc., La Jolla, CA  */

/*   GC - Initial coding.

     *** Make the PVCS source control system happy:
     $Header$
     $Log$
     ***

     NBP specific declarations.

*/

/* Each "OpenSocket" structure has a "RegsiteredName" field which is the list
   of Network Visible Entities (NVE) available on that socket.  Each NVE is
   made up of three fields: object, type, zone For example:
   "Sidhu:MailBox:Bandley3".  We don't have to store the zone in the NVE
   structure because each entity must be registered in the zone that the node
   resides in. */

#define MaximumEntityFieldLength 32

/* NBP entity multiple character wildcard. */

#define NbpWildCharacter 0xC5

/* The largest "on the wire" NBP tuple: */

#define MaximumNbpTupleLength (2 + 1 + 1 + 1 + \
                               3 * (1 + MaximumEntityFieldLength))
#define MinimumNbpTupleLength (2 + 1 + 1 + 1 + 3 * (1 + 1))

/* We want to register a name on each of the ports: */

#if (IamNot a WindowsNT)
  #define OurPortNameDefaultRouter    "PacerTalk Router"
  #define OurPortNameDefaultNonRouter "PacerTalk Node"

  #define OurPortNameTail    " 000"
  #define OurPortNameType    "AppleTalk Node"
#else
  #define OurPortNameDefaultRouter    "WinNT ROUTER"
  #define OurPortNameDefaultNonRouter "WinNT NONROUTER"

  #define OurPortNameTail    " 000"
  #define OurPortNameType    "Windows NT"
#endif



typedef struct nve {struct nve far *next;
                    char object[MaximumEntityFieldLength + 1];
                    char type[MaximumEntityFieldLength + 1];
                    short enumerator;       /* Unique within both the registed
                                               and pending lists within each
                                               socket. */
                   } far *RegisteredName;

/* When we're doing NBP registers, lookups, or confirms we need to have a
   concept of "pending" NVE's. */

typedef enum {ForRegister, ForConfirm, ForLookup} WhyPending;

typedef
void far
#if (Iam a WindowsNT)
_cdecl
#endif
        NbpCompletionHandler(AppleTalkErrorCode errorCode,
                                      long unsigned userData,
                                      int reason,
                                      long onWhosBehalf,
                                      int nbpId,
                                      ...);

typedef struct pnve {
                struct pnve far *next;
                WhyPending whyPending;
                long id;                     /* To identify in list. */
                long socket;                 /* Internet address of the node
                                                that is registering/confiming/
                                                looking-up. */
                char object[MaximumEntityFieldLength + 1];
                char type[MaximumEntityFieldLength + 1];
                char zone[MaximumEntityFieldLength + 1];
                                             /* This field is only used in
                                                confirm requests; registers
                                                are always in the "current"
                                                zone. */
                short enumerator;            /* Unique within both the registed
                                                and pending lists within each
                                                socket. */
                short broadcastInterval;     /* How often do we broadcast NBP
                                                requests? */
                short remainingBroadcasts;   /* How many more till we assume
                                                we're finished? */
                AppleTalkAddress confirming; /* The expected internet address
                                                that we're trying to confirm. */
                short nbpId;                 /* So we can sort out answers! */
                long unsigned timerId;       /* Broadcast timer that we're
                                                using, so we can cancel it. */
                short maximumTuples;         /* For lookup, what is the maximum
                                                number of NBP tuples our client
                                                is expecting? */
                short totalTuples;           /* For lookup, how many tuples have
                                                we stored so far? */
                void far *opaqueBuffer;      /* Start of caller's "buffer" used
                                                to recieve tuples. */
                int bufferSize;              /* Buffer size, in bytes. */
                int nextTupleOffset;         /* Next position available in the
                                                buffer for storing the next
                                                tuple. */
                char datagram[NbpFirstTupleOffset + MaximumNbpTupleLength];
                                             /* The DDP datagram that we use
                                                to broadcast the request. */
                short datagramLength;        /* Length of above datagram. */
                NbpCompletionHandler *completionRoutine;
                                             /* User routine that is called when
                                                the NBP operation completes
                                                (e.g. time exhusted or confirm
                                                succesful). */
                long unsigned userData;      /* Passed on to the completion
                                                routine. */
               } far *PendingName;

/* Default values for NBP timers: */

#define NbpBroadcastIntervalSeconds  1
#define NbpNumberOfBroadcasts        10

/* The three NBP command types: */

#define NbpBroadcastRequest  1
#define NbpLookup            2
#define NbpLookupReply       3
#define NbpForwardRequest    4

/* An internal representation of an NBP tuple.  This structure is never
   actually put out on the wire so it can be in a convienient form to work
   with.  See "Inside AppleTalk" for further information. */

typedef struct {AppleTalkAddress address;
                short enumerator;
                char object[MaximumEntityFieldLength + 1];
                char type[MaximumEntityFieldLength + 1];
                char zone[MaximumEntityFieldLength + 1];
               } NbpTuple;
