/*
 * Copyright 2010 Jacek 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
 */

#include "ihost_dispid.h"

import "oaidl.idl";

[
    uuid(60254ca0-953b-11cf-8c96-00aa00b8708c),
    version(5.6),
]
library IHost
{
    importlib("stdole2.tlb");

    [
        odl,
        uuid(2cc5a9d1-b1e5-11d3-a286-00104bd35090),
        dual,
        oleautomation
    ]
    interface IArguments2 : IDispatch {
        [id(DISPID_VALUE)]
        HRESULT Item(
            [in] LONG Index,
            [out, retval] BSTR *out_Value);

        [id(IARGUMENTS2_COUNT_DISPID)]
        HRESULT Count([out, retval] LONG *out_Count);

        [id(IARGUMENTS2_LENGTH_DISPID), propget]
        HRESULT length([out, retval] LONG *out_Count);
    }

    [
        odl,
        uuid(53bad8c1-e718-11cf-893d-00a0c9054228),
        hidden,
        dual,
        nonextensible,
        oleautomation
    ]
    interface ITextStream : IDispatch {
        [id(ITEXTSTREAM_LINE_DISPID), propget]
        HRESULT Line([out, retval] LONG *Line);

        [id(ITEXTSTREAM_COLUMN_DISPID), propget]
        HRESULT Column([out, retval] LONG *Column);

        [id(ITEXTSTREAM_ATENDOFSTREAM_DISPID), propget]
        HRESULT AtEndOfStream([out, retval] VARIANT_BOOL *EOS);

        [id(ITEXTSTREAM_ATENDOFLINE_DISPID), propget]
        HRESULT AtEndOfLine([out, retval] VARIANT_BOOL *EOL);

        [id(ITEXTSTREAM_READ_DISPID)]
        HRESULT Read(
            [in] LONG Characters,
            [out, retval] BSTR *Text);

        [id(ITEXTSTREAM_READLINE_DISPID)]
        HRESULT ReadLine([out, retval] BSTR *Text);

        [id(ITEXTSTREAM_READALL_DISPID)]
        HRESULT ReadAll([out, retval] BSTR *Text);

        [id(ITEXTSTREAM_WRITE_DISPID)]
        HRESULT Write([in] BSTR Text);

        [id(ITEXTSTREAM_WRITELINE_DISPID)]
        HRESULT WriteLine([in, optional, defaultvalue("")] BSTR Text);

        [id(ITEXTSTREAM_WRITEBLANKLINES_DISPID)]
        HRESULT WriteBlankLines([in] LONG Lines);

        [id(ITEXTSTREAM_SKIP_DISPID)]
        HRESULT Skip([in] LONG Characters);

        [id(ITEXTSTREAM_SKIPLINE_DISPID)]
        HRESULT SkipLine();

        [id(ITEXTSTREAM_CLOSE_DISPID)]
        HRESULT Close();
    }

    [
        odl,
        uuid(91afbd1b-5feb-43f5-b028-e2ca960617ec),
        dual,
        oleautomation
    ]
    interface IHost : IDispatch {
        [id(IHOST_NAME_DISPID), propget]
        HRESULT Name([out, retval] BSTR *out_Name);

        [id(IHOST_APPLICATION_DISPID), propget]
        HRESULT Application([out, retval] IDispatch **out_Dispatch);

        [id(IHOST_FULLNAME_DISPID), propget]
        HRESULT FullName([out, retval] BSTR *out_Path);

        [id(IHOST_PATH_DISPID), propget]
        HRESULT Path([out, retval] BSTR* out_Path);

        [id(IHOST_INTERACTIVE_DISPID), propget]
        HRESULT Interactive([out, retval] VARIANT_BOOL *out_Interactive);

        [id(IHOST_INTERACTIVE_DISPID), propput]
        HRESULT Interactive([in] VARIANT_BOOL out_Interactive);

        [id(IHOST_QUIT_DISPID)]
        HRESULT Quit([in, optional, defaultvalue(0)] int ExitCode);

        [id(IHOST_SCRIPTNAME_DISPID), propget]
        HRESULT ScriptName([out, retval] BSTR *out_ScriptName);

        [id(IHOST_SCRIPTFULLNAME_DISPID), propget]
        HRESULT ScriptFullName([out, retval] BSTR* out_ScriptFullName);

        [id(IHOST_ARGUMENTS_DISPID), propget]
        HRESULT Arguments([out, retval] IArguments2 **out_Arguments);

        [id(IHOST_VERSION_DISPID), propget]
        HRESULT Version([out, retval] BSTR *out_Version);

        [id(IHOST_BUILDVERSION_DISPID), propget]
        HRESULT BuildVersion([out, retval] int *out_Build);

        [id(IHOST_TIMEOUT_DISPID), propget]
        HRESULT Timeout([out, retval] LONG *out_Timeout);

        [id(IHOST_TIMEOUT_DISPID), propput]
        HRESULT Timeout([in] LONG out_Timeout);

        [id(IHOST_CREATEOBJECT_DISPID)]
        HRESULT CreateObject(
                [in] BSTR ProgID,
                [in, optional, defaultvalue("")] BSTR Prefix,
                [out, retval] IDispatch **out_Dispatch);

        [id(IHOST_ECHO_DISPID), vararg]
        HRESULT Echo([in] SAFEARRAY(VARIANT) pArgs);

        [id(IHOST_GETOBJECT_DISPID)]
        HRESULT GetObject(
            [in] BSTR Pathname,
            [in, optional, defaultvalue("")] BSTR ProgID,
            [in, optional, defaultvalue("")] BSTR Prefix,
            [out, retval] IDispatch **out_Dispatch);

        [id(IHOST_DISCONNECTOBJECT_DISPID)]
        HRESULT DisconnectObject([in] IDispatch *Object);

        [id(IHOST_SLEEP_DISPID)]
        HRESULT Sleep([in] LONG Time);

        [id(IHOST_CONNECTOBJECT_DISPID)]
        HRESULT ConnectObject(
            [in] IDispatch *Object,
            [in] BSTR Prefix);

        [id(IHOST_STDIN_DISPID), propget]
        HRESULT StdIn([out, retval] ITextStream **out_ppts);

        [id(IHOST_STDOUT_DISPID), propget]
        HRESULT StdOut([out, retval] ITextStream **ppts);

        [id(IHOST_STDERR_DISPID), propget]
        HRESULT StdErr([out, retval] ITextStream **ppts);
    }
}
