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

#pragma makedep typelib

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