/*
 * Copyright 2013 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 regtypelib

import "oaidl.idl";

#include "vbscript_defs.h"

[
    helpstring("Microsoft VBScript Regular Expressions 5.5"),
    id(3),
    uuid(3f4daca7-160d-11d2-a8e9-00104b365c9f),
    version(5.5)
]
library VBScript_RegExp_55
{
    importlib("stdole2.tlb");

    [
        dual,
        hidden,
        nonextensible,
        odl,
        oleautomation,
        uuid(3f4daca0-160d-11d2-a8e9-00104b365c9f),
    ]
    interface IRegExp : IDispatch
    {
        [id(DISPID_REGEXP_PATTERN), propget]
        HRESULT Pattern([out, retval] BSTR *pPattern);

        [id(DISPID_REGEXP_PATTERN), propput]
        HRESULT Pattern([in] BSTR pPattern);

        [id(DISPID_REGEXP_IGNORECASE), propget]
        HRESULT IgnoreCase([out, retval] VARIANT_BOOL *pIgnoreCase);

        [id(DISPID_REGEXP_IGNORECASE), propput]
        HRESULT IgnoreCase([in] VARIANT_BOOL pIgnoreCase);

        [id(DISPID_REGEXP_GLOBAL), propget]
        HRESULT Global([out, retval] VARIANT_BOOL *pGlobal);

        [id(DISPID_REGEXP_GLOBAL), propput]
        HRESULT Global([in] VARIANT_BOOL pGlobal);

        [id(DISPID_REGEXP_EXECUTE)]
        HRESULT Execute(
                [in] BSTR sourceString,
                [out, retval] IDispatch **ppMatches);

        [id(DISPID_REGEXP_TEST)]
        HRESULT Test(
                [in] BSTR sourceString,
                [out, retval] VARIANT_BOOL *pMatch);

        [id(DISPID_REGEXP_REPLACE)]
        HRESULT Replace(
                [in] BSTR sourceString,
                [in] BSTR replaceString,
                [out, retval] BSTR *pDestString);
    }

    [
        dual,
        hidden,
        nonextensible,
        odl,
        oleautomation,
        uuid(3f4dacb0-160d-11d2-a8e9-00104b365c9f)
    ]
    interface IRegExp2 : IDispatch
    {
        [id(DISPID_REGEXP_PATTERN), propget]
        HRESULT Pattern([out, retval] BSTR *pPattern);

        [id(DISPID_REGEXP_PATTERN), propput]
        HRESULT Pattern([in] BSTR pPattern);

        [id(DISPID_REGEXP_IGNORECASE), propget]
        HRESULT IgnoreCase([out, retval] VARIANT_BOOL *pIgnoreCase);

        [id(DISPID_REGEXP_IGNORECASE), propput]
        HRESULT IgnoreCase([in] VARIANT_BOOL pIgnoreCase);

        [id(DISPID_REGEXP_GLOBAL), propget]
        HRESULT Global([out, retval] VARIANT_BOOL *pGlobal);

        [id(DISPID_REGEXP_GLOBAL), propput]
        HRESULT Global([in] VARIANT_BOOL pGlobal);

        [id(DISPID_REGEXP_MULTILINE), propget]
        HRESULT Multiline([out, retval] VARIANT_BOOL *pMultiline);

        [id(DISPID_REGEXP_MULTILINE), propput]
        HRESULT Multiline([in] VARIANT_BOOL pMultiline);

        [id(DISPID_REGEXP_EXECUTE)]
        HRESULT Execute(
                [in] BSTR sourceString,
                [out, retval] IDispatch **ppMatches);

        [id(DISPID_REGEXP_TEST)]
        HRESULT Test(
                [in] BSTR sourceString,
                [out, retval] VARIANT_BOOL *pMatch);

        [id(DISPID_REGEXP_REPLACE)]
        HRESULT Replace(
                [in] BSTR sourceString,
                [in] VARIANT replaceVar,
                [out, retval] BSTR *pDestString);
    }

    [
        dual,
        hidden,
        nonextensible,
        odl,
        oleautomation,
        uuid(3f4daca1-160d-11d2-a8e9-00104b365c9f)
    ]
    interface IMatch : IDispatch
    {
        [id(DISPID_VALUE), propget]
        HRESULT Value([out, retval] BSTR *pValue);

        [id(DISPID_MATCH_FIRSTINDEX), propget]
        HRESULT FirstIndex([out, retval] LONG *pFirstIndex);

        [id(DISPID_MATCH_LENGTH), propget]
        HRESULT Length([out, retval] LONG *pLength);
    }

    [
        odl,
        uuid(3f4dacb1-160d-11d2-a8e9-00104b365c9f),
        hidden,
        dual,
        nonextensible,
        oleautomation
    ]
    interface IMatch2 : IDispatch
    {
        [id(DISPID_VALUE), propget]
        HRESULT Value([out, retval] BSTR *pValue);

        [id(DISPID_MATCH_FIRSTINDEX), propget]
        HRESULT FirstIndex([out, retval] LONG *pFirstIndex);

        [id(DISPID_MATCH_LENGTH), propget]
        HRESULT Length([out, retval] LONG *pLength);

        [id(DISPID_MATCH_SUBMATCHES), propget]
        HRESULT SubMatches([out, retval] IDispatch **ppSubMatches);
    }

    [
        dual,
        hidden,
        nonextensible,
        odl,
        oleautomation,
        uuid(3f4daca2-160d-11d2-a8e9-00104b365c9f)
    ]
    interface IMatchCollection : IDispatch
    {
        [id(DISPID_VALUE), propget]
        HRESULT Item(
                [in] LONG index,
                [out, retval] IDispatch **ppMatch);

        [id(DISPID_MATCHCOLLECTION_COUNT), propget]
        HRESULT Count([out, retval] LONG *pCount);

        [id(DISPID_NEWENUM), propget]
        HRESULT _NewEnum([out, retval] IUnknown **ppEnum);
    }

    [
        dual,
        hidden,
        nonextensible,
        odl,
        oleautomation,
        uuid(3f4dacb2-160d-11d2-a8e9-00104b365c9f)
    ]
    interface IMatchCollection2 : IDispatch
    {
        [id(DISPID_VALUE), propget]
        HRESULT Item(
                [in] LONG index,
                [out, retval] IDispatch **ppMatch);

        [id(DISPID_MATCHCOLLECTION_COUNT), propget]
        HRESULT Count([out, retval] LONG *pCount);

        [id(DISPID_NEWENUM), propget]
        HRESULT _NewEnum([out, retval] IUnknown **ppEnum);
    }

    [
        dual,
        hidden,
        nonextensible,
        odl,
        oleautomation,
        uuid(3f4dacb3-160d-11d2-a8e9-00104b365c9f)
    ]
    interface ISubMatches : IDispatch
    {
        [id(DISPID_VALUE), propget]
        HRESULT Item(
                [in] LONG index,
                [out, retval] VARIANT *pSubMatch);

        [id(DISPID_SUBMATCHES_COUNT), propget]
        HRESULT Count([out, retval] LONG *pCount);

        [id(DISPID_NEWENUM), propget]
        HRESULT _NewEnum([out, retval] IUnknown **ppEnum);
    }

    [
        uuid(3f4daca4-160d-11d2-a8e9-00104b365c9f)
    ]
    coclass RegExp
    {
        [default] interface IRegExp2;
    }

    [
        noncreatable,
        uuid(3f4daca5-160d-11d2-a8e9-00104b365c9f)
    ]
    coclass Match
    {
        [default] interface IMatch2;
    }

    [
        noncreatable,
        uuid(3f4daca6-160d-11d2-a8e9-00104b365c9f)
    ]
    coclass MatchCollection
    {
        [default] interface IMatchCollection2;
    }

    [
        noncreatable,
        uuid(3f4dacc0-160d-11d2-a8e9-00104b365c9f)
    ]
    coclass SubMatches {
        [default] interface ISubMatches;
    }
}
