
/*
 *      C/C++ Run Time Library - Version 6.5
 *
 *      Copyright (c) 1994 by Borland International
 *      All Rights Reserved.
 *
 */

#ifndef _ATALKWSH_
#define _ATALKWSH_
#define __ATALKWSH_H

//
//  All protocol types should be specified in the Decimal base
//

#define DECIMAL_BASE                            10

//
//  Protocol number 0 is invalid in the Appletalk case
//

#define ATPROTO_BASE                            (1000 * AF_APPLETALK)
#define SOL_APPLETALK                           (ATPROTO_BASE)

#define DDPPROTO_RTMP                           (ATPROTO_BASE + 1)
#define DDPPROTO_NBP                            (ATPROTO_BASE + 2)
#define DDPPROTO_ATP                            (ATPROTO_BASE + 3)
#define DDPPROTO_AEP                            (ATPROTO_BASE + 4)
#define DDPPROTO_RTMPRQ                         (ATPROTO_BASE + 5)
#define DDPPROTO_ZIP                            (ATPROTO_BASE + 6)
#define DDPPROTO_ADSP                           (ATPROTO_BASE + 7)

#define DDPPROTO_MAX                            (ATPROTO_BASE + 255)

//
//  Define the higher layer appletalk protocol types
//

#define ATPROTO_ADSP                    (DDPPROTO_MAX + 1)
#define ATPROTO_ATP                     (DDPPROTO_MAX + 2)
#define ATPROTO_ASP                     (DDPPROTO_MAX + 3)
#define ATPROTO_PAP                     (DDPPROTO_MAX + 4)

#define SO_REGISTER_NAME                0xA000
#define SO_DEREGISTER_NAME              0xA001
#define SO_REMOVE_NAME                          SO_DEREGISTER_NAME
#define SO_LOOKUP_NAME                  0xA002
#define SO_CONFIRM_NAME                 0xA003
#define SO_LOOKUP_MYZONE                        0xA004
#define SO_GETMYZONE                            SO_LOOKUP_MYZONE
#define SO_LOOKUP_ZONES                 0xA005
#define SO_GETZONELIST                          SO_LOOKUP_ZONES
#define SO_LOOKUP_ZONES_ON_ADAPTER      0xA006
#define SO_GETLOCALZONES                        SO_LOOKUP_ZONES_ON_ADAPTER
#define SO_LOOKUP_NETDEF_ON_ADAPTER     0xA007
#define SO_GETNETINFO                           SO_LOOKUP_NETDEF_ON_ADAPTER

//
//  PAP-specific options
//

#define SO_PAP_SET_SERVER_STATUS        0xA007
#define SO_PAP_GET_SERVER_STATUS        0xA008
#define SO_PAP_PRIME_READ                       0xA009


#define ATADDR_ANY                      0            // Dynamic socket (=0)
#define ATADDR_BROADCAST                0xFF         // Broadcast node id (=ff)

//
//      Define flags/error codes peculiar to Appletalk
//

#define WSAEMSGPARTIAL                          (WSABASEERR+100)


//      Maximum pap status size
#define MAX_PAP_STATUS_SIZE                     255
#define MIN_PAP_READ_BUF_SIZE           4096

//      These are the unused 4 bytes returned in the PAP status packet. If ever
//      they are to be interpreted, they will be available.
#define PAP_UNUSED_STATUS_BYTES         4


//
//  SOCKADDR_AT structure
//

typedef struct sockaddr_at
{
    USHORT    sat_family;
    USHORT    sat_net;
    UCHAR     sat_node;
    UCHAR     sat_socket;
} SOCKADDR_AT, *PSOCKADDR_AT;


//
//      ***WARNING***
//      This is defined to be the same as the ATALK ADDRESS defined in atalktdi.h
//      Change this if the other changes.
//

typedef union
{
#if !defined(NO_ANONYMOUS_STRUCT)
    struct
    {
        USHORT      Network;
        UCHAR       Node;
        UCHAR       Socket;
    };
#endif
    struct
    {
        USHORT      Network;
        UCHAR       Node;
        UCHAR       Socket;
    } u;
    ULONG       Address;
} WSH_ATALK_ADDRESS, *PWSH_ATALK_ADDRESS;

//
//  Typedefs for the various options
//

//
//  ***WARNING***:
//  This should be exactly the same as NBP_NAME defined in atalktdi.h
//

#define MAX_ENTITY  32
typedef struct
{
    CHAR    ObjectNameLen;
    CHAR    ObjectName[MAX_ENTITY];
    CHAR    TypeNameLen;
    CHAR    TypeName[MAX_ENTITY];
    CHAR    ZoneNameLen;
    CHAR    ZoneName[MAX_ENTITY];
} WSH_NBP_NAME, *PWSH_NBP_NAME;

typedef struct
{
        WSH_ATALK_ADDRESS               Address;
        USHORT                                  Enumerator;
        WSH_NBP_NAME                    NbpName;
} WSH_NBP_TUPLE, *PWSH_NBP_TUPLE;

typedef WSH_NBP_NAME    WSH_REGISTER_NAME, *PWSH_REGISTER_NAME;
typedef WSH_NBP_NAME    WSH_DEREGISTER_NAME, *PWSH_DEREGISTER_NAME;
typedef WSH_NBP_NAME    WSH_REMOVE_NAME, *PWSH_REMOVE_NAME;

typedef struct _WSH_LOOKUP_ZONES
{
    ULONG   NoZones;

    //
    //  CHAR    Zones[] - null separated zones
    //

} WSH_LOOKUP_ZONES, *PWSH_LOOKUP_ZONES;

typedef struct _WSH_LOOKUP_NETDEF_ON_ADAPTER
{
        USHORT  NetworkRangeLowerEnd;
        USHORT  NetworkRangeUpperEnd;

        //      This will be followed by a null terminated ansi default zone.
        //      PUCHAR  DefaultZone[]

} WSH_LOOKUP_NETDEF_ON_ADAPTER , *PWSH_LOOKUP_NETDEF_ON_ADAPTER;

typedef struct _WSH_LOOKUP_NAME
{
    WSH_NBP_TUPLE    LookupTuple;
    ULONG   NoTuples;

    //
    //  Array of NoTuple WSH_NBP_TUPLEs
    //

} WSH_LOOKUP_NAME, *PWSH_LOOKUP_NAME;

typedef struct _WSH_PAP_GET_SERVER_STATUS
{
        SOCKADDR_AT                     ServerAddr;
        UCHAR                           Reserved[PAP_UNUSED_STATUS_BYTES];
        UCHAR                           ServerStatus[MAX_PAP_STATUS_SIZE+1];

} WSH_PAP_GET_SERVER_STATUS, *PWSH_PAP_GET_SERVER_STATUS;

#endif  // _ATALKWSH_

