//============================================================================
// Copyright(c) 1996, Microsoft Corporation
//
// File:    rtrfiltr.cpp
//
// History:
//  08/30/96	Ram Cherala		Created
//
// Implementation of Router Packet Filters Configuration
// Defines initialization routines for the rtrfiltr.dll
//============================================================================

#include "stdafx.h"
#include "rtrfiltr.h"
#include "mprfltr.h"
#include "ipaddr.h"
#include "dialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CRtrfiltrApp

BEGIN_MESSAGE_MAP(CRtrfiltrApp, CWinApp)
	//{{AFX_MSG_MAP(CRtrfiltrApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRtrfiltrApp construction

CRtrfiltrApp::CRtrfiltrApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CRtrfiltrApp object

CRtrfiltrApp theApp;

BOOL CRtrfiltrApp::InitInstance() 
{
	BOOL bRet = CWinApp::InitInstance();

	// Setup the proper help file
	free((void *) m_pszHelpFilePath);
	m_pszHelpFilePath = _tcsdup(_T("mprsnap.hlp"));
	
	// Setup the global help function
	extern DWORD * RtrfiltrSnapHelpMap(DWORD dwIDD);
	SetGlobalHelpMapFunction(RtrfiltrSnapHelpMap);
   
	// initialize IP address control once

    if (bRet)
    {
        if (m_pszHelpFilePath != NULL)
            free((void*)m_pszHelpFilePath);
        m_pszHelpFilePath = _tcsdup(_T("mprsnap.hlp"));
//        IpAddrInit(AfxGetInstanceHandle(), 0, 0);
        IPAddrInit(AfxGetInstanceHandle());
//        InitCommonLibrary ();
    }

	return bRet;
}

//----------------------------------------------------------------------------
// Function:    MprUIFilterConfig
//
// Called to configure Filter for the transport interface.
//----------------------------------------------------------------------------

DWORD APIENTRY
MprUIFilterConfig(
    IN  CWnd*       pParent,
    IN  LPCWSTR     pwsMachineName,
	IN	LPCWSTR		pwsInterfaceName,
	IN  DWORD       dwTransportId,
	IN	DWORD		dwFilterType	// FILTER_INBOUND, FILTER_OUTBOUND
    ) {

    DWORD dwErr = NO_ERROR;

    AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO IPX filter config will pass in NULL for the interface name
	// to configure filters for Client Interface. Ignore this for now
	// and add code to deal with IPX Client interface config.

	if(pwsInterfaceName == NULL)
		return dwErr;

	switch ( dwTransportId )	{
	case PID_IP:
		dwErr = IpFilterConfig( pParent, 
								pwsMachineName,
								pwsInterfaceName,
								dwFilterType );
		break;
	case PID_IPX:
		dwErr = IpxFilterConfig( pParent, 
								 pwsMachineName,
								 pwsInterfaceName,
								 dwFilterType );
		break;
		
	default:
		dwErr = ERROR_INVALID_PARAMETER;
	}

	return dwErr;
}


HRESULT APIENTRY
MprUIFilterConfigInfoBase(
	IN	HWND		hwndParent,
	IN	IInfoBase *	pInfoBase,
	IN	IRtrMgrInterfaceInfo *pRmIf,
	IN  DWORD       dwTransportId,
	IN	DWORD		dwFilterType	// FILTER_INBOUND, FILTER_OUTBOUND
    ) {

    AFX_MANAGE_STATE(AfxGetStaticModuleState());
	
	HRESULT		hr = hrOK;

	COM_PROTECT_TRY
	{

		if (pInfoBase == NULL)
			CORg(E_INVALIDARG);

		// TODO IPX filter config will pass in NULL for the interface name
		// to configure filters for Client Interface. Ignore this for now
		// and add code to deal with IPX Client interface config.
		
		switch ( dwTransportId )
		{
			case PID_IP:
				hr = IpFilterConfigInfoBase( hwndParent,
											 pInfoBase,
											 pRmIf,
											 dwFilterType );
				break;
			case PID_IPX:
				hr = IpxFilterConfigInfoBase( hwndParent,
											  pInfoBase,
											  pRmIf,
											  dwFilterType );
				break;
				
			default:
				hr = E_INVALIDARG;
		}

		COM_PROTECT_ERROR_LABEL;
	}
	COM_PROTECT_CATCH;

	return hr;
}