MoreInterfaceLib/RemoteAccessInterface.h

/*
    File:       RemoteAccessInterface.h
 
    Contains:   Interface for making remote access calls.
 
    Written by: Quinn (conversion to Universal Interfaces 3.2 format)
 
    Copyright:  Copyright © 1991-1998 by Apple Computer, Inc., all rights reserved.
 
    Change History (most recent first):
 
         <2>    22/11/00    Quinn   Switch to "MacTypes.h".
         <1>     22/4/99    Quinn   First checked in.
*/
 
#ifndef __REMOTEACCESSINTERFACE__
#define __REMOTEACCESSINTERFACE__
 
#ifndef __TYPES__
#include <MacTypes.h>
#endif
#ifndef __FILES__
#include <Files.h>
#endif
#ifndef __APPLETALK__
#include <AppleTalk.h>
#endif
 
#if PRAGMA_ONCE
#pragma once
#endif
 
#ifdef __cplusplus
extern "C" {
#endif
 
#if PRAGMA_IMPORT
#pragma import on
#endif
 
#if PRAGMA_STRUCT_ALIGN
    #pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
    #pragma pack(2)
#endif
 
/* **** These callbacks are yet to be Universal Interfaced... **** */
 
typedef     pascal void (*UserStatusProcPtr)(UInt8 *, UInt8 *);
typedef     pascal long (*PacketFilterProcPtr)(UInt8 *, UInt32, UInt32, UInt8 *, UInt32);
typedef     pascal void (*RemmaperProcPtr)(UInt32, UInt32, UInt32, UInt8 *, UInt8 *);
typedef     pascal void (*CallBackHookProcPtr)(UInt8 *, UInt32);
typedef     pascal void (*CallBackCompHookProcPtr)(UInt8 *);
typedef     pascal UInt32 (*NetValidProcPtr)(UInt8 *,AddrBlock);
 
 
#define REMOTEACCESSNAME        "\pRemote Access"
#define REMOTEACCESSID          'strm'                  // *** NOTE: "Network Extension" uses this id for its _Gestalt call
 
#define gestaltRemoteAccessAttr REMOTEACCESSID
#define gestaltRemoteAccessExists   0
 
#define gestaltRemoteAccessCallOnly 1                   /* Remote Access Client */
#define gestaltRemoteAccessMPServer 2                   /* Remote Access multi-port server */
#define gestaltRemoteAccessVers2    3                   /* ARA 2.0 features are available */
 
#define MAXSTATUSMSGSIZE        256
#define USERNAMESIZE            34
#define PASSWORDSIZE            8
#define PASSWORDBUFSIZE         PASSWORDSIZE+1
 
#define TIME_UNLIMITED          0xffffffff              /* indicates unlimited time allowed on connection */
 
 
#define ctlir_getConnectInfo 0x01                       /* will get connect info if address is remote */
#define ctlir_disposeConnectInfo 0x02                   /* will dispose info in connectInfoPtr properly */
 
 
/* control codes
*/
#define RAM_EXTENDED_CALL               23              /* make an extended call (use TRemoteAccessParamBlock)  */
 
/* extended codes (must have control code set to RAM_EXTENDED_CALL)
*/
/* the first group of calls can be issued without doing a load */
#define CmdRemoteAccess_Load            1               /* loads main section of remote access */
#define CmdRemoteAccess_Unload          2               /* unloads main section */
#define CmdRemoteAccess_PassWordMunger  6               /* create a munged password */
#define CmdRemoteAccess_GetCodeHooks    7               /* get code hooks */        
 
/* calls that will not work until CmdRemoteAccess_Load has been done */
#define CmdRemoteAccess_DoConnect               40              /* main thread only */
#define CmdRemoteAccess_Disconnect              42              /* disconnect */
#define CmdRemoteAccess_Status                  45              /* get status information */
#define CmdRemoteAccess_IsAddressRemote         53              /* main thread only when getting/setting connect pb info */                     
 
/* Remote Access errors */
#define ERR_BASE                        -5800
 
#define ERR_NOTCONNECTED                (ERR_BASE-0)
#define ERR_CONNECTIONABORTED           (ERR_BASE-1)
#define ERR_ALREADYCONNECTED            (ERR_BASE-2)
#define ERR_COMMANDALREADYINPROGRESS    (ERR_BASE-3)
#define ERR_BADVERSION                  (ERR_BASE-4)
#define ERR_INSHUTDOWN                  (ERR_BASE-5)
#define ERR_CONNECTIONABORTING          (ERR_BASE-6)
#define ERR_ALREADYENABLED              (ERR_BASE-7)
#define ERR_ZONEBUFBADSIZE              (ERR_BASE-8)
#define ERR_CONNECTTIMEDOUT             (ERR_BASE-9)
#define ERR_CONNECTUSERTIMEDOUT         (ERR_BASE-10)
#define ERR_BADPARAMETER                (ERR_BASE-11)
#define ERR_NOMULTINODE                 (ERR_BASE-12)
#define ERR_ATALKNOTACTIVE              (ERR_BASE-13)
#define ERR_NOCALLBACKSUPPORT           (ERR_BASE-14)
#define ERR_NOTOPENEDBYTHISPB           (ERR_BASE-15)
#define ERR_NOGLOBALS                   (ERR_BASE-16)
#define ERR_NOSMARTBUFFER               (ERR_BASE-17)
#define ERR_BADATALKVERS                (ERR_BASE-18)
#define ERR_VLD8_CONNECT                0
#define ERR_VLD8_CALLBACK               (ERR_BASE-19)
#define ERR_VLD8_BADVERSION             (ERR_BASE-20)
#define ERR_VLD8_BADUSER                (ERR_BASE-21)
#define ERR_VLD8_BADPASSWORD            (ERR_BASE-22)
#define ERR_VLD8_BADLINK                (ERR_BASE-23)
#define ERR_VLD8_NOCALLBACKALLOWED      (ERR_BASE-24)
#define ERR_VLD8_ALLCBSERVERSBUSY       (ERR_BASE-25)
#define ERR_VLD8_GUESTNOTALLOWED        (ERR_BASE-26)
#define ERR_VLD8_SERVERISIMPOSTER       (ERR_BASE-27)
#define ERR_VLD8_LOGINNOTENABLED        (ERR_BASE-28)
#define ERR_REMOTEPORTALREADYEXISTS     (ERR_BASE-29)
#define ERR_OPENNOTALLOWED              (ERR_BASE-30)
#define ERR_NOUSERSANDGROUPS            (ERR_BASE-31)
#define ERR_PORTSHUTDOWN                (ERR_BASE-32)
#define ERR_PORTDOESNOTEXIST            (ERR_BASE-33)
#define ERR_PWNEEDEDFORENABLE           (ERR_BASE-34)
#define ERR_DAMAGED                     (ERR_BASE-35)
#define ERR_NETCONFIGCHANGED            (ERR_BASE-36)
/* 2.0 and above onlyÉ */
#define ERR_NOSUPPORT_ATREMOTE          (ERR_BASE-37)
#define ERR_CONFLICTING_REQUEST         (ERR_BASE-38)
#define ERR_VLD8_INVALIDAUTHMETHOD      (ERR_BASE-39)
#define ERR_VLD8_CONTINUE               (ERR_BASE-40)
#define ERR_PWCHANGECANCEL              (ERR_BASE-41)
#define ERR_VLD8_MANUALPASSWORDREQUIRED (ERR_BASE-50)
 
#define ERR_END                         ERR_VLD8_MANUALPASSWORDREQUIRED /* must be last error */
 
 
#define kTemplateVers           1       /* current version understood by remote access for the connect template */
 
/* forward defs */
typedef union TRemoteAccessParamBlock TRemoteAccessParamBlock;
typedef TRemoteAccessParamBlock *TPRemoteAccessParamBlock;
 
 
/* network transition */
struct TNetworkTransition
{
    unsigned char               *privateVars;           /* pointer used internally by Remote Access */
    NetValidProcPtr             netValidProc;           /* pointer to the network valid procedure */
    Boolean                     newConnectivity;        /* set to true if new connectivity, false if loss of connectivity */
};
typedef struct TNetworkTransition TNetworkTransition;
typedef TNetworkTransition *TPNetworkTransition;
 
 
#define DControlParamHeader \
    QElem                       *qLink;                 /*next queue entry*/\
    short                       qType;                  /*queue type*/\
    short                       ioTrap;                 /*routine trap*/\
    Ptr                         ioCmdAddr;              /*routine address*/\
    ProcPtr                     ioCompletion;           /*completion routine*/\
    OSErr                       ioResult;               /*result code*/\
    long                        userData;               /*for use by the user */\
    short                       unused;                 /*unused field */\
    short                       ioRefNum;               /*driver reference number*/\
    short                       csCode;                 /*Call command code*/
 
#define DExtendedParam \
    DControlParamHeader \
    Ptr                         hReserved1; \
    Ptr                         hReserved2; \
    Ptr                         resultStrPtr; \
    Ptr                         extendedType;           /* pointer to identifier string */
 
 
#define DRemoteAccessParmHeader \
    DExtendedParam \
    short                       extendedCode;           /* for use by extended call proc */\
    Ptr                         portGlobalsPtr;         /* pointer to globals for this port (0=userport) */\
 
 
struct TRemoteAccessParmHeader
{
    DRemoteAccessParmHeader
};
typedef struct TRemoteAccessParmHeader TRemoteAccessParmHeader;
 
 
struct TRAConnectInfoTemplate
{
    unsigned long               version;                /* version of this format           */
    unsigned long               ltType;                 /* Link Tool type                   */
    long                        addressInfoLength;      /* length of the address information */
    Ptr                         addressInfoPtr;         /* pointer to connect address info */
    long                        ltSpecificTemplateLength;/* length of the ltspecific information */
    Ptr                         ltSpecificTemplatePtr;  /* pointer to link tool specific params */
    unsigned char               passWord[PASSWORDBUFSIZE];  /* user password                    */
    unsigned char               userName[USERNAMESIZE]; /* user name                        */
    unsigned long               connectReminderTimer;   /* value for connection reminder in seconds */
    unsigned long               connectOKWaitTimer;     /* how long to wait for OK on reminder timer    */
    Boolean                     guestLogin;             /* try to log in as a guest         */
    Boolean                     passwordSaved;          /* set if password is saved         */
    Boolean                     guaranteedAccess;       /* flag to guarantee access to servers internet */
 
};
typedef struct TRAConnectInfoTemplate TRAConnectInfoTemplate;
typedef TRAConnectInfoTemplate *TPRAConnectInfoTemplate;
 
 
/* connect option flags
*/
#define kNSCanInteract          0x00000001              // User interaction (password prompt) is OK 
#define kNSShowStatus           0x00000002              // show the status of the connect or disconnect call 
#define kNSConnectDocument      0x00000004              // connect using the specified document 
#define kNSPassWordSet          0x00000010              // use the specified password field when connecting by document 
// 2.0 and aboveÉ
#define kNS2SavvyFlags          0x40000000              // Set to use the next 2 flags below for only ARA 2.0 aware applications.
#define kNSAR2Connection        0x00000020              // connecting to a 2.0 server. 
#define kNSNotifyWhileConnected 0x00000040              // display cute notification icon while connected.
 
struct TRemoteAccessConnectParam
{
    DRemoteAccessParmHeader
    TRAConnectInfoTemplate      connectInfo;            /* The connection infomation template */
    unsigned long               optionFlags;            // bit mapped connect option flags 
    FSSpec                      fileInfo;               // file info for connect document 
};
typedef struct TRemoteAccessConnectParam TRemoteAccessConnectParam;
 
 
#define kNumWarnEntriesMax      5                       /* number of entries in warn array */
struct TRemoteAccessDisconnectParam
{
    DRemoteAccessParmHeader
    unsigned long               disconnectin;           /* server mode: disconnect in # of seconds */
    TPRemoteAccessParamBlock    abortOnlyThisPB;        /* only abort a connection opened by this pb */
    unsigned long               warnArr[kNumWarnEntriesMax];    /* set warn times here in seconds (zero all if no warnings) */
    unsigned long               optionFlags;            /* bit mapped connect option flags */
};
typedef struct TRemoteAccessDisconnectParam TRemoteAccessDisconnectParam;
 
 
/* bits passed back in status call */
#define CctlConnected               0x00000001      /* set when connected */
#define CctlAnswerEnable            0x00000004      /* set when we are set to answer calls */
#define CctlServerMode              0x00000008      /* set for server mode, clear for remote mode */
#define CctlConnectionAborting      0x00000010      /* connection is being torn down */
#define CctlConnectInProg           0x00000020      /* set when connection in progress or fully connected */
#define CctlDisconnectInStarted     0x00008000      /* somebody has started a disconnectIn */
#define CctlGuestMode               0x00080000      /* set if this port is logged on with guest access */
#define ctlAR2Connection            0x02000000      /* set when this connection is to a 2.0 server */
#define ctlNotifyWhileConnected     0x04000000      /* set when the user wants to be reminded while connected */
#define ctlConnectedToMPS           0x08000000      /* set when client is connected to a multi-port server */
#define CctlMultiNodeReady          0x80000000      /* shows if we currently have a multinode address */
struct TRemoteAccessStatusParam
{
    DRemoteAccessParmHeader
    unsigned long               statusBits;             /* bits for current status */
    unsigned long               timeConnected;          /* number of seconds we have been connected */
    unsigned long               timeLeft;               /* number of seconds remaining in connection (0xffffffff infinite) */
    unsigned char               *userNamePtr;           /* returns user name, expects pointer to buffer of USERNAMESIZE if non nil */
    unsigned char               *connectedToNamePtr;    /* returns name of where we connected to, expects pointer to buffer of USERNAMESIZE if non nil */
    TPRemoteAccessParamBlock    connectedByParamPtr;    /* a pointer to the parameter block "initiating" the connection if we are connected */  
    TPRemoteAccessParamBlock    statusConnectedByParamPtr;  /* a pointer to the parameter block "initiating" the connection when status was posted */
    unsigned char               *theLastStatusMsgPtr;   /* expects pointer to buffer of size MAXSTATUSMSGSIZE */
    unsigned char               *statusUserNamePtr;     /* pointer to buffer of size USERNAMESIZE */
    long                        statuslttype;           /* link tool type */
    long                        statusmsgOptionFlags;   /* classification of message type */
    long                        statusMsgNum;           /* specific message number */
    long                        statusMsgSeqNum;        /* pass in zero if always want status, otherwise use last value, if status is new, new number is returned */
    unsigned long               userSignature;          /* signature of port creator */
    unsigned long               userRefCon;             /* refcon of port creator */
};
typedef struct TRemoteAccessStatusParam TRemoteAccessStatusParam;
 
 
struct TRemoteAccessIsRemoteParms
{
    DRemoteAccessParmHeader
    long                        theAddress;             /* address that is to be checked */
    unsigned long               optionFlags;            /* Set to ctlir_getConnectInfo or ctlir_disposeConnectInfo, if zero only checks address */
    Boolean                     locationIsRemoteFlag;   /* returns true if address is remote */ 
    long                        ConnectInfoLength;      /* length of the following data */
    TPRAConnectInfoTemplate     connectInfoPtr;         /* The connection information template pointer */
};
typedef struct TRemoteAccessIsRemoteParms TRemoteAccessIsRemoteParms;
 
struct TRemoteAccessPasswordMunger
{
    DRemoteAccessParmHeader
    unsigned char               *userNamePtr;           /* pointer to username string */
    unsigned char               *passWordPtr;           /* user password */ 
    unsigned short              reserved;               /* must set to zero */
};
typedef struct TRemoteAccessPasswordMunger TRemoteAccessPasswordMunger;
 
 
struct TRemoteAccessGetCodeHooks
{
    DRemoteAccessParmHeader
    RemmaperProcPtr             remapperProc;           /* quick vector to remapper code */
};
 
typedef struct TRemoteAccessGetCodeHooks TRemoteAccessGetCodeHooks;
 
/* this is the union of all the different command types */
union TRemoteAccessParamBlock
{
    TRemoteAccessParmHeader     HDR;                    /* header pb */
    TRemoteAccessParmHeader     LOAD;                   /* load pb */
    TRemoteAccessParmHeader     UNLOAD;                 /* unload pb */
    TRemoteAccessConnectParam   CONNECT;                /* connect pb */
    TRemoteAccessDisconnectParam DISCONNECT;            /* disconnect pb */
    TRemoteAccessStatusParam    STATUS;                 /* get current status */
    TRemoteAccessIsRemoteParms  ISREMOTE;               /* used to check network address location */
    TRemoteAccessPasswordMunger MUNGEPW;                /* run password through munger */
    TRemoteAccessGetCodeHooks   CODEHOOKS;              /* get internal code hooks */
 
    unsigned char               filler[256];            /* set the minimum size of this parameter block */
};
 
EXTERN_API ( OSErr ) PBRemoteAccess(TPRemoteAccessParamBlock paramBlock, Boolean async)
    TWOWORDINLINE(0x7000,0xAA5B);
 
#if PRAGMA_STRUCT_ALIGN
    #pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
    #pragma pack()
#endif
 
#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif
 
#ifdef __cplusplus
}
#endif
 
#endif /* __REMOTEACCESSINTERFACE__ */