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

import "oaidl.idl";

#include "vbscript_defs.h"

[
    helpstring("Microsoft VBScript Regular Expressions 1.0"),
    id(2),
    uuid(3f4daca7-160d-11d2-a8e9-00104b365c9f),
    version(1.0)
]
library VBScript_RegExp_10
{
    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(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);
    }

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

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

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

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