/*++

Copyright (c) 1991  Microsoft Corporation

Module Name:

    msgstub.c

Abstract:

    These are the Messenger Service API RPC client stubs.

Author:

    Dan Lafferty    (danl)  06-Feb-1991

Environment:

    User Mode - Win32

Revision History:
    
    27-Aug-1992     Danl
        Added downlevel support & removed error mapping for RPC errors.

    06-Feb-1991     Danl
        Created

--*/

//
// INCLUDES
//

#include <nt.h>         // DbgPrint prototype
#include <ntrtl.h>      // DbgPrint prototype
#include <rpc.h>        // DataTypes and runtime APIs

#include <msgsvc.h>     // generated by the MIDL complier
#include <rpcutil.h>    // NetRpc utils

#include <lmsvc.h> 
#include <lmcons.h>     // NET_API_STATUS
#include <lmerr.h>      // NetError codes
#include <rxmsg.h>      // RxNetMessage API
#include <netlib.h>     // NetpServiceIsStarted() (needed by netrpc.h).
#include <netdebug.h>   // needed for netrpc.h
#include <netrpc.h>     // NET_REMOTE macros.



NET_API_STATUS NET_API_FUNCTION
NetMessageNameAdd (
    IN  LPCWSTR  servername,
    IN  LPCWSTR  msgname
    )

/*++

Routine Description:

    This is the DLL entrypoint for NetMessageNameAdd.  This API adds a name
    to the message name table.

Arguments:

    servername - Pointer to a string containing the name of the computer
        that is to execute the API function.

    msgname - Pointer to a string containing the name to be added.


Return Value:

    NERR_Success - The operation was successful.

--*/
{
    NET_API_STATUS          apiStatus;
    DWORD                   OptionsSupported = 0;


    NET_REMOTE_TRY_RPC

        apiStatus = NetrMessageNameAdd ((LPWSTR)servername,(LPWSTR)msgname);

    NET_REMOTE_RPC_FAILED("NetMessageNameAdd",
        (LPWSTR)servername,
        apiStatus,
        NET_REMOTE_FLAG_NORMAL,
        SERVICE_MESSENGER)

        //
        // Call downlevel version of the API.
        //
        apiStatus = RxNetMessageNameAdd((LPWSTR)servername,(LPWSTR)msgname);

    NET_REMOTE_END

    return(apiStatus);
}


NET_API_STATUS NET_API_FUNCTION
NetMessageNameEnum (
    IN  LPCWSTR     servername,
    IN  DWORD       level,
    OUT LPBYTE      *bufptr,
    IN  DWORD       prefmaxlen,
    OUT LPDWORD     entriesread,
    OUT LPDWORD     totalentries,
    IN OUT LPDWORD  resume_handle
    )
/*++

Routine Description:

    This is the DLL entrypoint for NetMessageNameEnum.

Arguments:

    servername - Pointer to a string containing the name of the computer
        that is to execute the API function.

    level - This indicates the level of information that is desired.

    bufptr - A pointer to the location where the pointer to the returned
        array of info structures is to be placed.

    prefmaxlen - Indicates a maximum size limit that the caller will allow
        for the return buffer.

    entriesread - A pointer to the location where the number of entries
        (data structures)read is to be returned.

    totalentries - A pointer to the location which upon return indicates
        the total number of entries in the table.

    resumehandle - Pointer to a value that indicates where to resume
        enumerating data.

Return Value:

    Nerr_Success - The operation was successful.


Note:


--*/
{
    NET_API_STATUS          apiStatus;
    GENERIC_ENUM_STRUCT     infoStruct;
    GENERIC_INFO_CONTAINER  genericInfoContainer;
    DWORD                   OptionsSupported = 0;

    if (level != 0 && level != 1)
    {
        //
        // Return ERROR_INVALID_LEVEL rather than the RPC
        // "invalid level" error when it tries to assemble
        // the union with a bogus level in the stub.
        //
        return ERROR_INVALID_LEVEL;
    }

    genericInfoContainer.Buffer = NULL;
    genericInfoContainer.EntriesRead = 0;

    infoStruct.Container = &genericInfoContainer;
    infoStruct.Level = level;


    NET_REMOTE_TRY_RPC

        apiStatus = NetrMessageNameEnum (
                (LPWSTR)servername,
                (LPMSG_ENUM_STRUCT) &infoStruct,
                prefmaxlen,
                totalentries,
                resume_handle);

        if (apiStatus == NERR_Success || apiStatus == ERROR_MORE_DATA) {
            *bufptr = (LPBYTE) genericInfoContainer.Buffer;
            *entriesread = genericInfoContainer.EntriesRead;
        }

    NET_REMOTE_RPC_FAILED("NetMessageNameEnum",
            (LPWSTR)servername,
            apiStatus,
            NET_REMOTE_FLAG_NORMAL,
            SERVICE_MESSENGER )

        //
        // Call downlevel version of the API.
        //
        apiStatus = RxNetMessageNameEnum(
                (LPWSTR)servername,
                level,
                bufptr,
                prefmaxlen,
                entriesread,
                totalentries,
                resume_handle);
        
    NET_REMOTE_END


    return(apiStatus);
}



NET_API_STATUS NET_API_FUNCTION
NetMessageNameGetInfo (
    IN  LPCWSTR  servername,
    IN  LPCWSTR  msgname,
    IN  DWORD    level,
    OUT LPBYTE   *bufptr
    )

/*++

Routine Description:

    This is the DLL entrypoint for NetMessageNameGetInfo.

Arguments:

    servername - Pointer to a string containing the name of the computer
        that is to execute the API function.  Since this function is
        executing on that computer, this information is not useful
        by the time it gets here.  It is really only useful on the RPC
        client side.

    msgname - Pointer to a string containing the name in the table
        for which information is desired.

    level - This indicates the level of information that is desired.

    bufptr - Pointer to a Location where the pointer to the returned
        information structure is to be placed.

Return Value:

    NERR_Success - The operation was successful.


--*/

{
    NET_API_STATUS          apiStatus;
    DWORD                   OptionsSupported = 0;


    *bufptr = NULL;         // Must be NULL so RPC knows to till it in.

    NET_REMOTE_TRY_RPC

        apiStatus = NetrMessageNameGetInfo (
            (LPWSTR)servername,
            (LPWSTR)msgname,
            level,
            (LPMSG_INFO) bufptr);

    NET_REMOTE_RPC_FAILED("NetMessageNameGetInfo",
            (LPWSTR)servername,
            apiStatus,
            NET_REMOTE_FLAG_NORMAL,
            SERVICE_MESSENGER)

        //
        // Call downlevel version of the API.
        //
        apiStatus = RxNetMessageNameGetInfo(
                        (LPWSTR)servername,
                        (LPWSTR)msgname,
                        level,
                        bufptr);
    NET_REMOTE_END


    return(apiStatus);
}


NET_API_STATUS NET_API_FUNCTION
NetMessageNameDel (
    IN  LPCWSTR  servername,
    IN  LPCWSTR  msgname
    )
/*++

Routine Description:

    This is the DLL entrypoint for NetMessageNameDel.  This API deletes
    a name from the message name table.

Arguments:

    servername - Points to a string containing the name of the computer
        that is to execute the API function.

    msgname - Points to a string containing the name that is to be deleted
        from the message name table.


Return Value:

    NERR_Success - The operation was successful



--*/

{
    NET_API_STATUS          apiStatus;
    DWORD                   OptionsSupported = 0;



    NET_REMOTE_TRY_RPC

        apiStatus = NetrMessageNameDel ((LPWSTR)servername, (LPWSTR)msgname);

    NET_REMOTE_RPC_FAILED("NetMessageNameDel",
        (LPWSTR)servername,
        apiStatus,
        NET_REMOTE_FLAG_NORMAL,
        SERVICE_MESSENGER)

        //
        // Call downlevel version of the API.
        //
        apiStatus = RxNetMessageNameDel((LPWSTR)servername,(LPWSTR)msgname);

    NET_REMOTE_END

    return(apiStatus);
}


