/*
 * Copyright 2009 Piotr 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
 */

#pragma makedep proxy
#pragma makedep register

#include "urlmon.idl"

[
    helpstring("URL Moniker"),
    threading(apartment),
    uuid(79eac9e0-baf9-11ce-8c82-00aa004ba90b)
]
coclass StdURLMoniker { interface IMoniker; }

[
    helpstring("http: Asynchronous Pluggable Protocol Handler"),
    threading(apartment),
    uuid(79eac9e2-baf9-11ce-8c82-00aa004ba90b)
]
coclass HttpProtocol { interface IInternetProtocolEx; interface IInternetPriority; }

[
    helpstring("ftp: Asynchronous Pluggable Protocol Handler"),
    threading(apartment),
    uuid(79eac9e3-baf9-11ce-8c82-00aa004ba90b)
]
coclass FtpProtocol { interface IInternetProtocolEx; interface IInternetPriority; }

[
    helpstring("gopher: Asynchronous Pluggable Protocol Handler"),
    threading(apartment),
    uuid(79eac9e4-baf9-11ce-8c82-00aa004ba90b)
]
coclass GopherProtocol { interface IInternetProtocolEx; interface IInternetPriority; }

[
    helpstring("https: Asynchronous Pluggable Protocol Handler"),
    threading(apartment),
    uuid(79eac9e5-baf9-11ce-8c82-00aa004ba90b)
]
coclass HttpsProtocol { interface IInternetProtocolEx; interface IInternetPriority; }

[
    helpstring("mk: Asynchronous Pluggable Protocol Handler"),
    threading(apartment),
    uuid(79eac9e6-baf9-11ce-8c82-00aa004ba90b)
]
coclass MkProtocol { interface IInternetProtocolEx; interface IInternetPriority; }

[
    helpstring("file:, local: Asynchronous Pluggable Protocol Handler"),
    threading(apartment),
    uuid(79eac9e7-baf9-11ce-8c82-00aa004ba90b)
]
coclass FileProtocol { interface IInternetProtocolEx; interface IInternetPriority; }

[
    helpstring("CDL: Asynchronous Pluggable Protocol Handler"),
    threading(apartment),
    uuid(3dd53d40-7b8b-11d0-b013-00aa0059ce02)
]
coclass CdlProtocol { interface IInternetProtocolEx; interface IInternetPriority; }

[
    helpstring("Security Manager"),
    threading(both),
    uuid(7b8a2d94-0ac9-11d1-896c-00c04fb6bfc4)
]
coclass InternetSecurityManager { interface IInternetSecurityManager; }

[
    helpstring("URL Zone Manager"),
    threading(both),
    uuid(7b8a2d95-0ac9-11d1-896c-00c04fb6bfc4)
]
coclass InternetZoneManager { interface IInternetZoneManagerEx2; }

[
    helpstring("URLMoniker ProxyStub Factory"),
    threading(apartment),
    uuid(79eac9f1-baf9-11ce-8c82-00aa004ba90b)
]
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }

[
    helpstring("AP lzdhtml encoding/decoding Filter"),
    threading(apartment),
    uuid(8f6b0360-b80d-11d0-a9b3-006097942311)
]
coclass DeCompMimeFilter { interface IInternetProtocol; interface IInternetProtocolSink; }

[
    helpstring("CUri"),
    threading(apartment),
    uuid(df2fce13-25ec-45bb-9d4c-cecd47c2430c)
]
coclass CUri { interface IUri; }
