/*
 * Copyright 2009 Jacek Caban for CodeWeavers
 *
 * 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
 */

#ifndef DO_NO_IMPORTS
import "oaidl.idl";
import "unknwn.idl";
import "wtypes.idl";
/* import "prsht.idl"; */
#endif

cpp_quote("DEFINE_GUID(CLSID_NetSharingManager,0x5c63c1ad,0x3956,0x4ff8,0x84,0x86,0x40,0x03,0x47,0x58,0x31,0x5b);")

[
    object,
    uuid(c08956a1-1cd3-11d1-b1c5-00805fc1270e),
    pointer_default(unique)
]
interface INetConnection : IUnknown
{
    typedef enum tagNETCON_CHARACTERISTIC_FLAGS
    {
        NCCF_NONE               = 0x0000,
        NCCF_ALL_USERS          = 0x0001,
        NCCF_ALLOW_DUPLICATION  = 0x0002,
        NCCF_ALLOW_REMOVAL      = 0x0004,
        NCCF_ALLOW_RENAME       = 0x0008,
        NCCF_INCOMING_ONLY      = 0x0020,
        NCCF_OUTGOING_ONLY      = 0x0040,
        NCCF_BRANDED            = 0x0080,
        NCCF_SHARED             = 0x0100,
        NCCF_BRIDGED            = 0x0200,
        NCCF_FIREWALLED         = 0x0400,
        NCCF_DEFAULT            = 0x0800,
        NCCF_HOMENET_CAPABLE    = 0x1000,
        NCCF_SHARED_PRIVATE     = 0x2000,
        NCCF_QUARANTINED        = 0x4000,
        NCCF_RESERVED           = 0x8000,
        NCCF_BLUETOOTH_MASK  = 0x000F0000,
        NCCF_LAN_MASK        = 0x00F00000
    } NETCON_CHARACTERISTIC_FLAGS;

    typedef enum tagNETCON_STATUS
    {
        NCS_DISCONNECTED,
        NCS_CONNECTING,
        NCS_CONNECTED,
        NCS_DISCONNECTING,
        NCS_HARDWARE_NOT_PRESENT,
        NCS_HARDWARE_DISABLED,
        NCS_HARDWARE_MALFUNCTION,
        NCS_MEDIA_DISCONNECTED,
        NCS_AUTHENTICATING,
        NCS_AUTHENTICATION_SUCCEEDED,
        NCS_AUTHENTICATION_FAILED,
        NCS_INVALID_ADDRESS,
        NCS_CREDENTIALS_REQUIRED
    } NETCON_STATUS;

    typedef enum tagNETCON_TYPE
    {
        NCT_DIRECT_CONNECT,
        NCT_INBOUND,
        NCT_INTERNET,
        NCT_LAN,
        NCT_PHONE,
        NCT_TUNNEL,
        NCT_BRIDGE
    } NETCON_TYPE;

    typedef enum tagNETCON_MEDIATYPE
    {
        NCM_NONE,
        NCM_DIRECT,
        NCM_ISDN,
        NCM_LAN,
        NCM_PHONE,
        NCM_TUNNEL,
        NCM_PPPOE,
        NCM_BRIDGE,
        NCM_SHAREDACCESSHOST_LAN,
        NCM_SHAREDACCESSHOST_RAS
    } NETCON_MEDIATYPE;

    typedef struct tagNETCON_PROPERTIES
    {
        GUID              guidId;
        [string] LPWSTR   pszwName;
        [string] LPWSTR   pszwDeviceName;
        NETCON_STATUS     Status;
        NETCON_MEDIATYPE  MediaType;
        DWORD             dwCharacter;
        CLSID             clsidThisObject;
        CLSID             clsidUiObject;
    } NETCON_PROPERTIES;

    HRESULT Connect();

    HRESULT Disconnect();

    HRESULT Delete();

    HRESULT Duplicate(
            [in, string] LPCWSTR pszwDuplicateName,
            [out]        INetConnection **ppCon);

    HRESULT GetProperties([out] NETCON_PROPERTIES **ppProps);

    HRESULT GetUiObjectClassId([out, ref] CLSID *pclsid);

    HRESULT Rename([in, string] LPCWSTR pszwNewName);
}

[
    object,
    uuid(24b7e9b5-e38f-4685-851b-00892cf5f940),
    oleautomation,
    dual,
    pointer_default(unique)
]
interface INetSharingPortMappingProps : IDispatch
{
    [propget, id(1)]
    HRESULT Name([out, retval] BSTR *pbstrName);

    [propget, id(2)]
    HRESULT IPProtocol([out, retval] UCHAR *pucIPProt);

    [propget, id(3)]
    HRESULT ExternalPort([out, retval] long *pusPort);

    [propget, id(4)]
    HRESULT InternalPort([out, retval] long *pusPort);

    [propget, id(5)]
    HRESULT Options([out, retval] long *pdwOptions);

    [propget, id(6)]
    HRESULT TargetName([out, retval] BSTR *pbstrTargetName);

    [propget, id(7)]
    HRESULT TargetIPAddress([out, retval] BSTR *pbstrTargetIPAddress);

    [propget, id(8)]
    HRESULT Enabled([out, retval] VARIANT_BOOL *pbool);
}

[
    object,
    uuid(c08956b1-1cd3-11d1-b1c5-00805fc1270e),
    oleautomation,
    dual,
    pointer_default(unique)
]
interface INetSharingPortMapping : IDispatch
{
    [id(1)]
    HRESULT Disable();

    [id(2)]
    HRESULT Enable();

    [propget, id(3)]
    HRESULT Properties([out, retval] INetSharingPortMappingProps **ppNSPMP);

    [id(4)]
    HRESULT Delete();
};
[
    object,
    uuid(02e4a2de-da20-4e34-89c8-ac22275a010b),
    oleautomation,
    dual,
    pointer_default(unique)
]
interface INetSharingPortMappingCollection : IDispatch
{
    [propget, id(DISPID_NEWENUM), restricted]
    HRESULT _NewEnum([out, retval] IUnknown **pVal);

    [propget, id(1)]
    HRESULT Count([out, retval] long *pVal);
}

[
    object,
    uuid(c08956b6-1cd3-11d1-b1c5-00805fc1270e),
    oleautomation,
    dual,
    pointer_default(unique)
]
interface INetSharingConfiguration : IDispatch
{
    typedef enum tagSHARINGCONNECTIONTYPE {
        ICSSHARINGTYPE_PUBLIC,
        ICSSHARINGTYPE_PRIVATE
    } SHARINGCONNECTIONTYPE, *LPSHARINGCONNECTIONTYPE;

    typedef enum tagSHARINGCONNECTION_ENUM_FLAGS {
            ICSSC_DEFAULT,
            ICSSC_ENABLED
    } SHARINGCONNECTION_ENUM_FLAGS;

    typedef enum tagICS_TARGETTYPE {
            ICSTT_NAME,
            ICSTT_IPADDRESS
    }ICS_TARGETTYPE;

    [propget, id(1)]
    HRESULT SharingEnabled([out, retval] VARIANT_BOOL *pbEnabled);

    [propget, id(2)]
    HRESULT SharingConnectionType([out, retval] SHARINGCONNECTIONTYPE *pType);

    [id(3)]
    HRESULT DisableSharing();

    [id(4)]
    HRESULT EnableSharing([in] SHARINGCONNECTIONTYPE Type);

    [propget, id(5)]
    HRESULT InternetFirewallEnabled([out, retval] VARIANT_BOOL *pbEnabled);

    [id(6)]
    HRESULT DisableInternetFirewall();

    [id(7)]
    HRESULT EnableInternetFirewall();

    [propget, id(8)]
    HRESULT EnumPortMappings(
        [in] SHARINGCONNECTION_ENUM_FLAGS Flags,
        [out, retval] INetSharingPortMappingCollection **ppColl);

    [id(9)]
    HRESULT AddPortMapping(
            [in] BSTR bstrName,
            [in] UCHAR ucIPProtocol,
            [in] USHORT usExternalPort,
            [in] USHORT usInternalPort,
            [in] DWORD dwOptions,
            [in] BSTR bstrTargetNameOrIPAddress,
            [in] ICS_TARGETTYPE eTargetType,
            [out, retval] INetSharingPortMapping **ppMapping );

    [id(10)]
    HRESULT RemovePortMapping([in] INetSharingPortMapping *pMapping);
}

[
    object,
    uuid(c08956b4-1cd3-11d1-b1c5-00805fc1270e),
    pointer_default(unique)
]
interface IEnumNetSharingPublicConnection : IUnknown
{
    HRESULT Next(
            [in] ULONG celt,
            [out, size_is(celt), length_is(*pceltFetched)] VARIANT *rgVar,
            [out] ULONG *pceltFetched);

    HRESULT Skip([in] ULONG celt);

    HRESULT Reset();

    HRESULT Clone([out] IEnumNetSharingPublicConnection **ppenum);
}

[
    object,
    uuid(c08956b5-1cd3-11d1-b1c5-00805fc1270e),
    pointer_default(unique)
]
interface IEnumNetSharingPrivateConnection : IUnknown
{
    HRESULT Next(
            [in] ULONG celt,
            [out, size_is(celt), length_is(*pCeltFetched)] VARIANT *rgVar,
            [out] ULONG *pCeltFetched);

    HRESULT Skip([in] ULONG celt);

    HRESULT Reset();

    HRESULT Clone([out] IEnumNetSharingPrivateConnection **ppenum);
}

[
    object,
    uuid(f4277c95-ce5b-463d-8167-5662d9bcaa72),
    oleautomation,
    dual,
    pointer_default(unique)
]
interface INetConnectionProps : IDispatch
{
    [propget, id(1)]
    HRESULT Guid([out, retval] BSTR *pbstrGuid);

    [propget, id(2)]
    HRESULT Name([out, retval] BSTR *pbstrName);

    [propget, id(3)]
    HRESULT DeviceName([out, retval] BSTR *pbstrDeviceName);

    [propget, id(4)]
    HRESULT Status([out, retval] NETCON_STATUS *pStatus);

    [propget, id(5)]
    HRESULT MediaType([out, retval] NETCON_MEDIATYPE *pMediaType);

    [propget, id(6)]
    HRESULT Characteristics([out, retval] DWORD *pdwFlags);
}

[
    object,
    uuid(7d7a6355-f372-4971-a149-bfc927be762a),
    oleautomation,
    dual,
    pointer_default(unique)
]
interface INetSharingPublicConnectionCollection : IDispatch
{
    [propget, id(DISPID_NEWENUM), restricted]
    HRESULT _NewEnum([out, retval] IUnknown **pVal);

    [propget, id(1)]
    HRESULT Count([out, retval] long *pVal);
}

[
    object,
    uuid(33c4643c-7811-46fa-a89a-768597bd7223),
    oleautomation,
    dual,
    pointer_default(unique)
 ]
interface INetSharingEveryConnectionCollection : IDispatch
{
    [propget, id(DISPID_NEWENUM), restricted]
    HRESULT _NewEnum([out, retval] IUnknown **pVal);

    [propget, id(1)]
    HRESULT Count([out, retval] long *pVal);
}

[
    object,
    uuid(38ae69e0-4409-402a-a2cb-e965c727f840),
    oleautomation,
    dual,
    pointer_default(unique)
 ]
interface INetSharingPrivateConnectionCollection : IDispatch
{
    [propget, id(DISPID_NEWENUM), restricted]
    HRESULT _NewEnum([out, retval] IUnknown **pVal);

    [propget, id(1)]
    HRESULT Count([out, retval] long *pVal);
}

[
    object,
    uuid(c08956b7-1cd3-11d1-b1c5-00805fc1270e),
    oleautomation,
    dual,
    pointer_default(unique)
]
interface INetSharingManager : IDispatch
{
    [propget, id(1)]
    HRESULT SharingInstalled([out, retval] VARIANT_BOOL *pbInstalled);

    [propget, id(2)]
    HRESULT EnumPublicConnections(
            [in]  SHARINGCONNECTION_ENUM_FLAGS Flags,
            [out, retval] INetSharingPublicConnectionCollection **ppColl);

    [propget, id(3)]
    HRESULT EnumPrivateConnections(
            [in]  SHARINGCONNECTION_ENUM_FLAGS Flags,
            [out, retval] INetSharingPrivateConnectionCollection **ppColl);

    [propget, id(6)]
    HRESULT INetSharingConfigurationForINetConnection(
            [in] INetConnection *pNetConnection,
            [out, retval] INetSharingConfiguration **ppNetSharingConfiguration);

    [propget, id(7)]
    HRESULT EnumEveryConnection([out, retval] INetSharingEveryConnectionCollection **ppColl);

    [propget, id(8)]
    HRESULT NetConnectionProps(
            [in] INetConnection *pNetConnection,
            [out, retval] INetConnectionProps **ppProps);
}