#include "precomp.h"

extern LPWSTR PolicyDNAttributes[];

DWORD
ValidateWirelessPSData(
    PWIRELESS_PS_DATA pWirelessPSData,
    DWORD dwNetworkType
    )
{
    DWORD dwError = 0;
    DWORD dwSSIDLen = 0;
    DWORD dwPSLen = 0;
    DWORD dwDescriptionLen = 0;
    DWORD dwEAPDataLen = 0;
    
    if (!pWirelessPSData) {
        dwError = ERROR_INVALID_PARAMETER;
    }
    BAIL_ON_WIN32_ERROR(dwError);
    
    if (pWirelessPSData->dwNetworkType != dwNetworkType) {
    	  dwError = ERROR_INVALID_PARAMETER;
    }
    BAIL_ON_WIN32_ERROR(dwError);
    
    dwSSIDLen = wcslen(pWirelessPSData->pszWirelessSSID);
    if (dwSSIDLen == 0) {
        dwError = ERROR_INVALID_PARAMETER;
    }
    BAIL_ON_WIN32_ERROR(dwError);
    
    if (dwSSIDLen < pWirelessPSData->dwWirelessSSIDLen) {
        dwError = ERROR_INVALID_PARAMETER;
    }    
    BAIL_ON_WIN32_ERROR(dwError);

    if (pWirelessPSData->pszDescription) {
        dwDescriptionLen = wcslen(pWirelessPSData->pszDescription);
    }

    dwEAPDataLen = pWirelessPSData->dwEAPDataLen;
    if (dwEAPDataLen) {
    	if (!(pWirelessPSData->pbEAPData)) {
    		dwError = ERROR_INVALID_PARAMETER;
    	}
    }
    BAIL_ON_WIN32_ERROR(dwError);
    
    dwPSLen = (sizeof(WIRELESS_PS_DATA) - sizeof(DWORD) -sizeof(LPWSTR)) + sizeof(WCHAR) * dwDescriptionLen
    	- sizeof(LPWSTR) + dwEAPDataLen;

    if (dwPSLen != pWirelessPSData->dwPSLen) {
        dwError = ERROR_INVALID_PARAMETER;
    }
    BAIL_ON_WIN32_ERROR(dwError);

error:
    	
    return(dwError);
}


DWORD
ValidateWirelessPolicyData(
    PWIRELESS_POLICY_DATA pWirelessPolicyData
    )
{
    PWIRELESS_PS_DATA *ppWirelessPSData = NULL;
    PWIRELESS_PS_DATA pWirelessPSData = NULL;
    DWORD dwError = 0;
    DWORD dwNumPreferredSettings = 0;
    DWORD dwNumAPNetworks = 0;
    DWORD dwSSIDLen = 0;
    DWORD dwPSLen = 0;
    DWORD i=0;
    
    if (!pWirelessPolicyData) {
    	dwError = ERROR_INVALID_PARAMETER;
    }
    BAIL_ON_WIN32_ERROR(dwError);

    if (!pWirelessPolicyData->pszWirelessName) {
    	dwError = ERROR_INVALID_PARAMETER;
    }
    BAIL_ON_WIN32_ERROR(dwError);

    dwNumPreferredSettings = pWirelessPolicyData->dwNumPreferredSettings;
    dwNumAPNetworks = pWirelessPolicyData->dwNumAPNetworks;

    if (dwNumPreferredSettings) {

        ppWirelessPSData = pWirelessPolicyData->ppWirelessPSData;
        if (!ppWirelessPSData) {
        	dwError = ERROR_INVALID_PARAMETER;
        }
        BAIL_ON_WIN32_ERROR(dwError);

        
        if (dwNumPreferredSettings < dwNumAPNetworks) {
        	dwError = ERROR_INVALID_PARAMETER;
        }
        BAIL_ON_WIN32_ERROR(dwError);
        
        for (i=0; i < dwNumAPNetworks ; ++i) {
            pWirelessPSData = ppWirelessPSData[i];

            dwError = ValidateWirelessPSData(pWirelessPSData, WIRELESS_NETWORK_TYPE_AP);
            BAIL_ON_WIN32_ERROR(dwError);
        }

        
        for (i=dwNumAPNetworks; i < dwNumPreferredSettings; ++i) {

            pWirelessPSData = ppWirelessPSData[i];

            dwError = ValidateWirelessPSData(pWirelessPSData, WIRELESS_NETWORK_TYPE_ADHOC);
            BAIL_ON_WIN32_ERROR(dwError);
        }
    	}

error:
	
	return(dwError);
	
}