/*
 * Types for the ICF api
 *
 * Copyright 2007 Jeff Latimer
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 *
 */

import "wtypes.idl";

typedef enum NET_FW_PROFILE_TYPE_
{
    NET_FW_PROFILE_DOMAIN,
    NET_FW_PROFILE_STANDARD,
    NET_FW_PROFILE_CURRENT,
    NET_FW_PROFILE_TYPE_MAX
}   NET_FW_PROFILE_TYPE;

typedef enum NET_FW_IP_VERSION_
{
    NET_FW_IP_VERSION_V4,
    NET_FW_IP_VERSION_V6,
    NET_FW_IP_VERSION_ANY,
    NET_FW_IP_VERSION_MAX
}   NET_FW_IP_VERSION;

typedef enum NET_FW_POLICY_TYPE_
{
    NET_FW_POLICY_GROUP,
    NET_FW_POLICY_LOCAL,
    NET_FW_POLICY_EFFECTIVE,
    NET_FW_POLICY_TYPE_MAX
}   NET_FW_POLICY_TYPE;

typedef enum NET_FW_SCOPE_
{
    NET_FW_SCOPE_ALL,
    NET_FW_SCOPE_LOCAL_SUBNET,
    NET_FW_SCOPE_CUSTOM,
    NET_FW_SCOPE_MAX
}   NET_FW_SCOPE;

typedef enum NET_FW_SERVICE_TYPE_
{
    NET_FW_SERVICE_FILE_AND_PRINT,
    NET_FW_SERVICE_UPNP,
    NET_FW_SERVICE_REMOTE_DESKTOP,
    NET_FW_SERVICE_NONE,
    NET_FW_SERVICE_TYPE_MAX
}   NET_FW_SERVICE_TYPE;

typedef enum NET_FW_IP_PROTOCOL_
{
    NET_FW_IP_PROTOCOL_TCP =  6,
    NET_FW_IP_PROTOCOL_UDP = 17
}   NET_FW_IP_PROTOCOL;
