/*
 * 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 header

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;
    }
}
