/*++

Copyright (c) 1995 Microsoft Corporation

Module Name:

    ripgl.c

Abstract:

    IPX Router Console Monitoring and Configuration tool.
    RIP Global configuration.

Author:

    Vadim Eydelman  06/07/1996


--*/
#include "precomp.h"
#pragma hdrstop


DWORD
CfgSetRipGlInfo(
    IN DWORD    *pLogLevel OPTIONAL
);

DWORD
AdmSetRipGlInfo(
    IN DWORD    *pLogLevel OPTIONAL
);


DWORD
APIENTRY 
HelpRipGl (
    IN    int               argc,
    IN    WCHAR            *argv[]
) 
{
    DisplayMessage (g_hModule, HLP_IPX_RIPGL );
    return 0;
}


DWORD
APIENTRY 
ShowRipGl (
    IN    int               argc,
    IN    WCHAR            *argv[],
    IN    HANDLE            hFile
) 
{
    DWORD        rc;
    LPBYTE      pGlBlock;
    DWORD       sz;
    HANDLE      hTrCfg = NULL;

    if (g_hMprAdmin) 
    {
        rc = MprAdminTransportGetInfo(
                g_hMprAdmin, PID_IPX, &pGlBlock, &sz, NULL, NULL
                );
                
        if (rc == NO_ERROR)
        {
        }
        else
        {
            goto GetFromCfg;
        }
    }
    
    else 
    {
GetFromCfg:

        rc = MprConfigTransportGetHandle (
                g_hMprConfig, PID_IPX, &hTrCfg
                );
                
        if (rc == NO_ERROR) 
        {
            rc = MprConfigTransportGetInfo (
                    g_hMprConfig, hTrCfg, &pGlBlock, &sz,
                    NULL, NULL, NULL
                    );
        }
    }

    if (rc == NO_ERROR) 
    {
        PIPX_TOC_ENTRY pRipGlToc;

        pRipGlToc = GetIPXTocEntry (
                        (PIPX_INFO_BLOCK_HEADER)pGlBlock,
                        IPX_PROTOCOL_RIP
                        );
                        
        if ( pRipGlToc != NULL ) 
        {
            PRIP_GLOBAL_INFO    pRipGlInfo;
            PWCHAR              buffer;

            pRipGlInfo = (PRIP_GLOBAL_INFO)
                            (pGlBlock + pRipGlToc->Offset);

            buffer = GetEnumString(
                        g_hModule, pRipGlInfo->EventLogMask, 
                        NUM_TOKENS_IN_TABLE( LogLevels ),
                        LogLevels
                        );

            if ( buffer )
            {
                if ( hFile )
                {
                    DisplayMessageT( DMP_IPX_RIP_SET_GLOBAL, buffer );
                }

                else
                {
                    DisplayIPXMessage(
                        g_hModule, MSG_RIP_GLOBAL_FMT, buffer
                        );
                }
            }
            else
            {
                rc = ERROR_NOT_ENOUGH_MEMORY;
                if ( !hFile )
                {
                    DisplayError( g_hModule, rc );
                }
            }
        }
        else 
        {
            rc = ERROR_INVALID_DATA;
            if ( !hFile )
            {
                DisplayIPXMessage (g_hModule, MSG_ROUTER_INFO_CORRUPTED);
            }
        }
        
        if (hTrCfg != NULL)
        {
            MprConfigBufferFree (pGlBlock);
        }
        else
        {
            MprAdminBufferFree (pGlBlock);
        }
    }
    
    else
    {
        if ( !hFile )
        {
            DisplayError( g_hModule, rc );
        }
    }

    return rc;
}


DWORD
APIENTRY 
SetRipGl (
    IN    int                   argc,
    IN    WCHAR                *argv[]
) 
{
    DWORD        rc;

    if (argc >= 1) 
    {
        int         i;
        unsigned    n;
        DWORD       logLevel;
        DWORD       * pLogLevel = NULL;

        for (i = 0; i < argc; i++) 
        {
            if ( !_wcsicmp( argv[i], TOKEN_LOGLEVEL ) ) 
            {
                if ( (pLogLevel == NULL)
                     && (i < argc - 1)
                     && !MatchEnumTag( g_hModule, argv[i+1], 
                        NUM_TOKENS_IN_TABLE( LogLevels ), LogLevels,
                        &logLevel) ) 
                {
                    i += 1;
                    pLogLevel = &logLevel;
                    continue;
                }
                else
                {
                    break;
                }
            }

            if (pLogLevel == NULL) 
            {
                if (!MatchEnumTag( g_hModule, argv[i], 
                        NUM_TOKENS_IN_TABLE( LogLevels ), LogLevels,
                        &logLevel) ) 
                {
                    pLogLevel = &logLevel;
                }
            }
            else
            {
                break;
            }
        }

        
        if (i == argc) 
        {
            rc = CfgSetRipGlInfo (pLogLevel);
            
            if (rc == NO_ERROR) 
            {
                if (g_hMprAdmin) { AdmSetRipGlInfo (pLogLevel); }
            }
        }
        else 
        {
            DisplayMessage (g_hModule, HLP_IPX_RIPGL);
            rc = ERROR_INVALID_PARAMETER;
        }
    }
    else 
    {
        DisplayMessage (g_hModule, HLP_IPX_RIPGL);
        rc = ERROR_INVALID_PARAMETER;
    }
    
    return rc;
}


DWORD
CfgSetRipGlInfo (
    IN DWORD    *pLogLevel OPTIONAL
) 
{
    DWORD   rc;
    HANDLE  hTrCfg;

    rc = MprConfigTransportGetHandle(
            g_hMprConfig, PID_IPX, &hTrCfg
            );
            
    if (rc == NO_ERROR) 
    {
        DWORD   sz;
        LPBYTE  pGlBlock;

        rc = MprConfigTransportGetInfo(
                g_hMprConfig, hTrCfg, &pGlBlock, &sz, NULL, NULL, NULL
                );
                
        if ( rc == NO_ERROR ) 
        {
            PIPX_TOC_ENTRY pRipGlToc;

            pRipGlToc = GetIPXTocEntry(
                            (PIPX_INFO_BLOCK_HEADER)pGlBlock,
                            IPX_PROTOCOL_RIP
                            );
                            
            if (pRipGlToc != NULL) 
            {
                PRIP_GLOBAL_INFO    pRipGlInfo;

                pRipGlInfo = (PRIP_GLOBAL_INFO)
                                (pGlBlock + pRipGlToc->Offset);
                                
                if (pLogLevel)
                {
                    pRipGlInfo->EventLogMask = *pLogLevel;
                }
                
                rc = MprConfigTransportSetInfo(
                        g_hMprConfig, hTrCfg, pGlBlock, sz, NULL, 0, NULL
                        );
                        
                if (rc == NO_ERROR) 
                {
                    DisplayIPXMessage(
                        g_hModule, MSG_RIPGL_SET_CFG
                        );
                }
                else
                {
                    DisplayError( g_hModule, rc );
                }
            }
            else 
            {
                DisplayIPXMessage (g_hModule, MSG_ROUTER_INFO_CORRUPTED);
                rc = ERROR_INVALID_DATA;
            }
            
            MprConfigBufferFree (pGlBlock);
        }
        else
        {
            DisplayError( g_hModule, rc);
        }
    }
    else
    {
        DisplayError( g_hModule, rc);
    }

    return rc;
}




DWORD
AdmSetRipGlInfo (
IN DWORD    *pLogLevel OPTIONAL
) 
{
    DWORD    rc;
    LPBYTE    pGlBlock;
    DWORD   sz;

    rc = MprAdminTransportGetInfo(
            g_hMprAdmin, PID_IPX, &pGlBlock, &sz, NULL, NULL
            );
            
    if (rc == NO_ERROR) 
    {
        PIPX_TOC_ENTRY pRipGlToc;

        pRipGlToc = GetIPXTocEntry(
                        (PIPX_INFO_BLOCK_HEADER)pGlBlock,
                        IPX_PROTOCOL_RIP
                        );
                        
        if ( pRipGlToc != NULL ) 
        {
            PRIP_GLOBAL_INFO    pRipGlInfo;

            pRipGlInfo = (PRIP_GLOBAL_INFO)
                            (pGlBlock + pRipGlToc->Offset);
                            
            if (pLogLevel)
            {
                pRipGlInfo->EventLogMask = *pLogLevel;
            }

            rc = MprAdminTransportSetInfo(
                    g_hMprAdmin, PID_IPX, pGlBlock, sz, NULL, 0
                    );

            if (rc == NO_ERROR) 
            {
                DisplayIPXMessage (g_hModule, MSG_RIPGL_SET_ADM );
            }
            else
            {
                DisplayError( g_hModule, rc);
            }
        }
        else 
        {
            DisplayIPXMessage (g_hModule, MSG_ROUTER_INFO_CORRUPTED);
            rc = ERROR_INVALID_DATA;
        }
        
            MprConfigBufferFree (pGlBlock);
    }
    
    else
    {
        DisplayError( g_hModule, rc);
    }

    return rc;
}