/*
 * COM Classes for inetcomm
 *
 * Copyright 2010 Alexandre Julliard
 *
 * 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
 */

[
    helpstring("CLSID_IMimeBody"),
    threading(both),
    uuid(fd853cdb-7f86-11d0-8252-00c04fd85ab4)
]
coclass IMimeBody { interface IMimeBody; }

[
    helpstring("CLSID_IMimeAllocator"),
    threading(both),
    uuid(fd853cdd-7f86-11d0-8252-00c04fd85ab4)
]
coclass IMimeAllocator { interface IMimeAllocator; }

[
    helpstring("CLSID_IMimeSecurity"),
    threading(both),
    uuid(fd853cde-7f86-11d0-8252-00c04fd85ab4)
]
coclass IMimeSecurity { interface IMimeSecurity; }

[
    helpstring("CLSID_IVirtualStream"),
    threading(both),
    uuid(fd853cdf-7f86-11d0-8252-00c04fd85ab4)
]
coclass IVirtualStream { interface IVirtualStream; }

[
    helpstring("CLSID_IMimeMessage"),
    threading(both),
    uuid(fd853ce3-7f86-11d0-8252-00c04fd85ab4)
]
coclass IMimeMessage { interface IMimeMessage; }

[
    helpstring("CLSID_ISMTPTransport"),
    threading(both),
    uuid(fd853ce6-7f86-11d0-8252-00c04fd85ab4)
]
coclass ISMTPTransport { interface ISMTPTransport; }

[
    helpstring("CLSID_IPOP3Transport"),
    threading(both),
    uuid(fd853ce7-7f86-11d0-8252-00c04fd85ab4)
]
coclass IPOP3Transport { interface IPOP3Transport; }

[
    helpstring("CLSID_INNTPTransport"),
    threading(both),
    uuid(fd853ce8-7f86-11d0-8252-00c04fd85ab4)
]
coclass INNTPTransport { interface INNTPTransport; }

[
    helpstring("CLSID_IRASTransport"),
    threading(both),
    uuid(fd853ce9-7f86-11d0-8252-00c04fd85ab4)
]
coclass IRASTransport { interface IRASTransport; }

[
    helpstring("CLSID_IRangeList"),
    threading(both),
    uuid(fd853cea-7f86-11d0-8252-00c04fd85ab4)
]
coclass IRangeList { interface IRangeList; }

[
    helpstring("CLSID_IIMAPTransport"),
    threading(both),
    uuid(fd853ceb-7f86-11d0-8252-00c04fd85ab4)
]
coclass IIMAPTransport { interface IIMAPTransport; }

[
    helpstring("CLSID_IHTTPMailTransport"),
    threading(both),
    uuid(5a580c11-e5eb-11d1-a86e-0000f8084f96)
]
coclass IHTTPMailTransport { interface IHTTPMailTransport; }

[
    helpstring("CLSID_ISMTPTransport2"),
    threading(both),
    uuid(0df2c7ec-3435-11d0-81d0-00c04fd85ab4)
]
coclass ISMTPTransport2 { interface ISMTPTransport2; }

[
    helpstring("CLSID_IPropFindRequest"),
    threading(both),
    uuid(bb847b8a-054a-11d2-a894-0000f8084f96)
]
coclass IPropFindRequest { interface IPropFindRequest; }

[
    helpstring("CLSID_IPropPatchRequest"),
    threading(both),
    uuid(ea678830-235d-11d2-a8b6-0000f8084f96)
]
coclass IPropPatchRequest { interface IPropPatchRequest; }
