/*++

Copyright (c) 1995  Microsoft Corporation

Module Name:

    msnapi.h

Abstract:

    This file contains the MSN Proxy server admin APIs.


Author:

    Alex Wetmore (t-alexwe)
    Vladimir Vulovic (vladimv) 16-August-95

Revision History:

--*/

#ifndef __MSNAPI_H__
#define __MSNAPI_H__

#ifdef __cplusplus
extern "C" {
#endif

#ifndef NET_API_FUNCTION
#define NET_API_FUNCTION __stdcall
#endif

//
// Structures for Admin APIs
//   These are the Data Structures that get passed over the
//   wire.  These are formed by the Admin. API layer which
//   calls the actual service code (i.e. CService).
//


//
// To avoid heap fragmentation, here are the maximum lengths of the User ID 
// strings.  If any string is longer it is truncated to fit
//
// Computer name is sized by the NETBEUI length 
#define COMPUTER_NAME_LENGTH    16+1
// Account name is sized by the NT account naming stuff - Domain\User
#define ACCOUNT_NAME_LENGTH     64+1
// Computer address length is sized by a string-izing of a SOCKADDR structure:
//  IP:  nnn.nnn.nnn.nnn#ppppp                   - 21 
//      (n is the dotted decimal IP address, p is port #)
//  IPX: nn nn nn nn#mm-mm-mm-mm-mm-mm,0xssss    - 40 
//      (n is the network number, mm is the MAC address, s is the socket)
//  NBF: ttttt#cccccccccccccccc                  - 26 
//      (t is the type enumeration, c is the ASCII name)
#define COMPUTER_ADDRESS_LENGTH 50+1

typedef struct _MSN_USER_INFO {
    DWORD   idUser; // User id
    char    szUser[ACCOUNT_NAME_LENGTH];    // User name
    char    inetHost[COMPUTER_NAME_LENGTH]; // Host Address (ComputerName)
    DWORD   tConnect;   // User Connection Time (elapsed seconds)
    DWORD   BytesTransmit;  // Read/Write Bytes transmitted since connection
} MSN_USER_INFO, *LMSN_USER_INFO, *LPMSN_USER_INFO;



//
// This is SHUTTLE_STATISTICS_0 plus some calculated sums
//
typedef struct _MSN_STATISTICS_0
{
    unsigned __int64 TotalBytesSent;
    unsigned __int64 TotalBytesReceived;
    unsigned __int64 TotalBytes;
    unsigned __int64 TotalRateSent;
    unsigned __int64 TotalRateReceived;
    unsigned __int64 TotalRate;
    DWORD         CurrentUsers;
    DWORD         MaxUsers;
    DWORD         TotalUsers;
    DWORD         SentBufferCommitted;
    DWORD         RecvBufferCommitted;
    DWORD         TotalBufferCommitted;
    DWORD         NumInFlowControl;
    DWORD         LogonFailures;
    DWORD         LogonSuccess;
    DWORD         LogonAttempts;
    DWORD         TotalConnections;
    DWORD         SentBufferInUse;
    DWORD         RecvBufferInUse;
    DWORD         TotalBufferInUse;
    DWORD         TimeOfLastClear;

} MSN_STATISTICS_0, * LPMSN_STATISTICS_0;


//
//      User Access Control data.
//

#define MSN_SERVICE_NO_ACCESS       0x00000000
#define MSN_SERVICE_READ_ACCESS     0x00000001
#define MSN_SERVICE_WRITE_ACCESS    0x00000002

typedef struct _MSN_ACCESS_ENTRY {
    ACCESS_MASK AccessRights;
#if defined(MIDL_PASS)
    PISID
#else
    PSID
#endif
    UserID;
} MSN_ACCESS_ENTRY, *LPMSN_ACCESS_ENTRY;

typedef struct _MSN_ACCESS_LIST {
    DWORD NumEntries;
#if defined(MIDL_PASS)
    [size_is(NumEntries)]
#endif // MIDL_PASS
    LPMSN_ACCESS_ENTRY AccessEntries;
} MSN_ACCESS_LIST, *LPMSN_ACCESS_LIST;

typedef  struct _MSN_USER_ENUM_LIST {
//
//  returns a flexible array of items
//
    DWORD  dwEntriesRead;

#if defined(MIDL_PASS)
    [size_is(dwEntriesRead)]
#endif // MIDL_PASS
    LPMSN_USER_INFO  lpUsers;
} MSN_USER_ENUM_LIST,  * LPMSN_USER_ENUM_LIST;

DWORD
NET_API_FUNCTION
MsnEnumerateUsers(
    IN      LPWSTR                  pszServer OPTIONAL,
    OUT     LPMSN_USER_ENUM_LIST *  lpUserBuffer
    );

DWORD
NET_API_FUNCTION
MsnDisconnectUser(
    IN      LPWSTR      pszServer  OPTIONAL,
    IN      DWORD       dwIdUser
    );

DWORD
NET_API_FUNCTION
MsnQueryStatistics(
    IN      LPWSTR      pszServer  OPTIONAL,
    IN      DWORD       Level,
    OUT     LPBYTE *    lpStatBuffer     
    );

DWORD
NET_API_FUNCTION
MsnClearStatistics(
    IN      LPWSTR      pszServer  OPTIONAL
    );

DWORD
NET_API_FUNCTION
MsnAddUserAccess(
    IN LPWSTR ServerAddress,
    IN LPWSTR ServiceName,
    IN LPMSN_ACCESS_LIST AccessList
    );

DWORD
NET_API_FUNCTION
MsnDeleteUserAccess(
    IN LPWSTR ServerAddress,
    IN LPWSTR ServiceName,
    IN LPMSN_ACCESS_LIST AccessList
    );

DWORD
NET_API_FUNCTION
MsnEnumUserAccess(
    IN LPWSTR ServerAddress,
    IN LPWSTR ServiceName,
    OUT LPMSN_ACCESS_LIST *AccessList
    );

#ifdef __cplusplus
}
#endif

#endif // __MSNAPI_H__