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

import "oaidl.idl";
cpp_quote("#undef ExpandEnvironmentStrings")

[
    helpstring("Windows Script Host Object Model"),
    uuid(f935dc20-1cf0-11d0-adb9-00c04fd58a0b),
    version(1.0)
]
library IWshRuntimeLibrary
{
    importlib("stdole2.tlb");

    typedef enum {
        WshRunning  = 0,
        WshFinished,
        WshFailed
    } WshExecStatus;

    typedef enum {
        UnknownType = 0,
        Removable,
        Fixed,
        Remote,
        CDRom,
        RamDisk
    } DriveTypeConst;

    typedef enum {
        Normal     = 0x000,
        ReadOnly   = 0x001,
        Hidden     = 0x002,
        System     = 0x004,
        Volume     = 0x008,
        Directory  = 0x010,
        Archive    = 0x020,
        Alias      = 0x400,
        Compressed = 0x800
    } FileAttribute;

    typedef enum {
        ForReading   = 0x1,
        ForWriting   = 0x2,
        ForAppending = 0x8
    } IOMode;

    typedef enum {
        TristateTrue       = -1,
        TristateFalse      =  0,
        TristateUseDefault = -2,
        TristateMixed      = -2
    } Tristate;

    interface IFolder;
    interface IFolderCollection;

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

        [id(0xfffffdef), propget]
        HRESULT Column([out, retval] long* Column);

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

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

        [id(0x2714)]
        HRESULT Read([in] long Characters, [out, retval] BSTR* Text);

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

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

        [id(0x2717)]
        HRESULT Write([in] BSTR Text);

        [id(0x2718)]
        HRESULT WriteLine([in, defaultvalue("")] BSTR Text);

        [id(0x2719)]
        HRESULT WriteBlankLines([in] long Lines);

        [id(0x271a)]
        HRESULT Skip([in] long Characters);

        [id(0x271b)]
        HRESULT SkipLine();

        [id(0x271c)]
        HRESULT Close();
    };

    [
        uuid(c7c3f5a0-88a3-11d0-abcb-00a0c90fffc0),
        odl,
        hidden,
        dual,
        nonextensible,
        oleautomation
    ]
    interface IDrive : IDispatch {
        [id(DISPID_VALUE), propget]
        HRESULT Path([out, retval] BSTR* path);

        [id(0x2710), propget]
        HRESULT DriveLetter([out, retval] BSTR* letter);

        [id(0x2711), propget]
        HRESULT ShareName([out, retval] BSTR* ShareName);

        [id(0x2712), propget]
        HRESULT DriveType([out, retval] DriveTypeConst* type);

        [id(0x2713), propget]
        HRESULT RootFolder([out, retval] IFolder** folder);

        [id(0x2715), propget]
        HRESULT AvailableSpace([out, retval] VARIANT* Avail);

        [id(0x2714), propget]
        HRESULT FreeSpace([out, retval] VARIANT* pFree);

        [id(0x2716), propget]
        HRESULT TotalSize([out, retval] VARIANT* Total);

        [id(0x2717), propget]
        HRESULT VolumeName([out, retval] BSTR* Name);

        [id(0x2717), propput]
        HRESULT VolumeName([in] BSTR Name);

        [id(0x2718), propget]
        HRESULT FileSystem([out, retval] BSTR* pFileSystem);

        [id(0x2719), propget]
        HRESULT SerialNumber([out, retval] long* SerialNumber);

        [id(0x271a), propget]
        HRESULT IsReady([out, retval] VARIANT_BOOL* pfReady);
    };

    [
        uuid(c7c3f5a4-88a3-11d0-abcb-00a0c90fffc0),
        odl,
        hidden,
        dual,
        nonextensible,
        oleautomation
    ]
    interface IFile : IDispatch {
        [id(DISPID_VALUE), propget]
        HRESULT Path([out, retval] BSTR* path);

        [id(0x03e8), propget]
        HRESULT Name([out, retval] BSTR* Name);

        [id(0x03e8), propput]
        HRESULT Name([in] BSTR Name);

        [id(0x03ea), propget]
        HRESULT ShortPath([out, retval] BSTR* path);

        [id(0x03e9), propget]
        HRESULT ShortName([out, retval] BSTR* Name);

        [id(0x03ec), propget]
        HRESULT Drive([out, retval] IDrive** drive);

        [id(0x03ed), propget]
        HRESULT ParentFolder([out, retval] IFolder** folder);

        [id(0x03eb), propget]
        HRESULT Attributes([out, retval] FileAttribute* attr);

        [id(0x03eb), propput]
        HRESULT Attributes([in] FileAttribute attr);

        [id(0x03ee), propget]
        HRESULT DateCreated([out, retval] DATE* date);

        [id(0x03ef), propget]
        HRESULT DateLastModified([out, retval] DATE* date);

        [id(0x03f0), propget]
        HRESULT DateLastAccessed([out, retval] DATE* date);

        [id(0x03f1), propget]
        HRESULT Size([out, retval] VARIANT* Size);

        [id(0x03f2), propget]
        HRESULT Type([out, retval] BSTR* Type);

        [id(0x04b0)]
        HRESULT Delete([in, defaultvalue(0)] VARIANT_BOOL Force);

        [id(0x04b2)]
        HRESULT Copy(
                    [in] BSTR Destination,
                    [in, defaultvalue(-1)] VARIANT_BOOL OverWriteFiles);

        [id(0x04b4)]
        HRESULT Move([in] BSTR Destination);

        [id(0x044c)]
        HRESULT OpenAsTextStream(
                    [in, defaultvalue(1)] IOMode IOMode,
                    [in, defaultvalue(0)] Tristate Format,
                    [out, retval] ITextStream** ppts);
    };

    [
        uuid(c7c3f5a5-88a3-11d0-abcb-00a0c90fffc0),
        odl,
        hidden,
        dual,
        nonextensible,
        oleautomation
    ]
    interface IFileCollection : IDispatch {
        [id(DISPID_VALUE), propget]
        HRESULT Item(
                    [in] VARIANT Key,
                    [out, retval] IFile** ppfile);
        [id(DISPID_NEWENUM), propget, restricted, hidden]
        HRESULT _NewEnum([out, retval] IUnknown** ppenum);
        [id(1), propget]
        HRESULT Count([out, retval] long* count);
    };

    [
        uuid(c7c3f5a2-88a3-11d0-abcb-00a0c90fffc0),
        odl,
        hidden,
        dual,
        nonextensible,
        oleautomation
    ]
    interface IFolder : IDispatch {
        [id(DISPID_VALUE), propget]
        HRESULT Path([out, retval] BSTR* path);

        [id(0x03e8), propget]
        HRESULT Name([out, retval] BSTR* name);

        [id(0x03e8), propput]
        HRESULT Name([in] BSTR name);

        [id(0x03ea), propget]
        HRESULT ShortPath([out, retval] BSTR* path);

        [id(0x03e9), propget]
        HRESULT ShortName([out, retval] BSTR* name);

        [id(0x03ec), propget]
        HRESULT Drive([out, retval] IDrive** drive);

        [id(0x03ed), propget]
        HRESULT ParentFolder([out, retval] IFolder** folder);

        [id(0x03eb), propget]
        HRESULT Attributes([out, retval] FileAttribute* attr);

        [id(0x03eb), propput]
        HRESULT Attributes([in] FileAttribute attr);

        [id(0x03ee), propget]
        HRESULT DateCreated([out, retval] DATE* date);

        [id(0x03ef), propget]
        HRESULT DateLastModified([out, retval] DATE* date);

        [id(0x03f0), propget]
        HRESULT DateLastAccessed([out, retval] DATE* date);

        [id(0x03f2), propget]
        HRESULT Type([out, retval] BSTR* type);

        [id(0x04b1)]
        HRESULT Delete([in, defaultvalue(0)] VARIANT_BOOL force);

        [id(0x04b3)]
        HRESULT Copy(
                    [in] BSTR Destination,
                    [in, defaultvalue(-1)] VARIANT_BOOL OverWriteFiles);

        [id(0x04b5)]
        HRESULT Move([in] BSTR Destination);

        [id(0x2710), propget]
        HRESULT IsRootFolder([out, retval] VARIANT_BOOL* root);

        [id(0x03f1), propget]
        HRESULT Size([out, retval] VARIANT* size);

        [id(0x2711), propget]
        HRESULT SubFolders([out, retval] IFolderCollection** folders);

        [id(0x2712), propget]
        HRESULT Files([out, retval] IFileCollection** files);

        [id(0x044d)]
        HRESULT CreateTextFile(
                    [in] BSTR FileName,
                    [in, defaultvalue(-1)] VARIANT_BOOL Overwrite,
                    [in, defaultvalue(0)] VARIANT_BOOL Unicode,
                    [out, retval] ITextStream** ppts);
    };

    [
        uuid(c7c3f5a3-88a3-11d0-abcb-00a0c90fffc0),
        odl,
        hidden,
        dual,
        nonextensible,
        oleautomation
    ]
    interface IFolderCollection : IDispatch {
        [id(2)]
        HRESULT Add(
                    [in] BSTR Name,
                    [out, retval] IFolder** folder);

        [id(DISPID_VALUE), propget]
        HRESULT Item(
                    [in] VARIANT Key,
                    [out, retval] IFolder** folder);

        [id(DISPID_NEWENUM), propget, restricted, hidden]
        HRESULT _NewEnum([out, retval] IUnknown** ppenum);

        [id(1), propget]
        HRESULT Count([out, retval] long* count);
    };

    [
        uuid(f935dc27-1cf0-11d0-adb9-00c04fd58a0b),
        odl,
        dual,
        oleautomation
    ]
    interface IWshCollection : IDispatch {
        [id(DISPID_VALUE)]
        HRESULT Item(
                [in] VARIANT *Index,
                [out, retval] VARIANT *out_Value);

        [id(1)]
        HRESULT Count([out, retval] long *out_Count);

        [id(2), propget]
        HRESULT length([out, retval] long *out_Count);

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

    [
        uuid(f935dc29-1cf0-11d0-adb9-00c04fd58a0b),
        odl,
        dual,
        oleautomation
    ]
    interface IWshEnvironment : IDispatch {
        [id(DISPID_VALUE), propget]
        HRESULT Item(
                [in] BSTR Name,
                [out, retval] BSTR *out_Value);

        [id(DISPID_VALUE), propput]
        HRESULT Item(
                [in] BSTR Name,
                [in] BSTR Value);

        [id(1)]
        HRESULT Count([out, retval] long *out_Count);

        [id(2), propget]
        HRESULT length([out, retval] long *out_Count);

        [id(DISPID_NEWENUM)]
        HRESULT _NewEnum([out, retval] IUnknown **out_Enum);

        [id(0x03e9)]
        HRESULT Remove([in] BSTR Name);
    }

    [
        uuid(08fed190-be19-11d3-a28b-00104bd35090),
        odl,
        dual,
        oleautomation
    ]
    interface IWshExec : IDispatch {
        [id(0x0001), propget]
        HRESULT Status([out, retval] WshExecStatus* Status);

        [id(0x0003), propget]
        HRESULT StdIn([out, retval] ITextStream** stream);

        [id(0x0004), propget]
        HRESULT StdOut([out, retval] ITextStream** stream);

        [id(0x0005), propget]
        HRESULT StdErr([out, retval] ITextStream** stream);

        [id(0x0006), propget]
        HRESULT ProcessID([out, retval] long* pid);

        [id(0x0007), propget]
        HRESULT ExitCode([out, retval] long* ExitCode);

        [id(0x0008)]
        HRESULT Terminate();
    };

    [
        uuid(f935dc23-1cf0-11d0-adb9-00c04fd58a0b),
        odl,
        dual,
        oleautomation
    ]
    interface IWshShortcut : IDispatch {
        [id(DISPID_VALUE), propget]
        HRESULT FullName([out, retval] BSTR* name);

        [id(0x03e8), propget]
        HRESULT Arguments([out, retval] BSTR* Arguments);

        [id(0x03e8), propput]
        HRESULT Arguments([in] BSTR Arguments);

        [id(0x03e9), propget]
        HRESULT Description([out, retval] BSTR* Description);

        [id(0x03e9), propput]
        HRESULT Description([in] BSTR Description);

        [id(0x03ea), propget]
        HRESULT Hotkey([out, retval] BSTR* HotKey);

        [id(0x03ea), propput]
        HRESULT Hotkey([in] BSTR HotKey);

        [id(0x03eb), propget]
        HRESULT IconLocation([out, retval] BSTR* IconPath);

        [id(0x03eb), propput]
        HRESULT IconLocation([in] BSTR IconPath);

        [id(0x03ec), propput]
        HRESULT RelativePath([in] BSTR rhs);

        [id(0x03ed), propget]
        HRESULT TargetPath([out, retval] BSTR* Path);

        [id(0x03ed), propput]
        HRESULT TargetPath([in] BSTR Path);

        [id(0x03ee), propget]
        HRESULT WindowStyle([out, retval] int* ShowCmd);

        [id(0x03ee), propput]
        HRESULT WindowStyle([in] int ShowCmd);

        [id(0x03ef), propget]
        HRESULT WorkingDirectory([out, retval] BSTR* WorkingDirectory);

        [id(0x03ef), propput]
        HRESULT WorkingDirectory([in] BSTR WorkingDirectory);

        [id(0x07d0), hidden]
        HRESULT Load([in] BSTR PathLink);

        [id(0x07d1)]
        HRESULT Save();
    };

    [
        uuid(f935dc21-1cf0-11d0-adb9-00c04fd58a0b),
        odl,
        dual,
        oleautomation,
        hidden
    ]
    interface IWshShell : IDispatch {
        [id(0x0064), propget]
        HRESULT SpecialFolders([out, retval] IWshCollection** out_Folders);

        [id(0x00c8), propget]
        HRESULT Environment(
            [in, optional] VARIANT* Type,
            [out, retval] IWshEnvironment** out_Env);

        [id(0x03e8)]
        HRESULT Run(
            [in] BSTR Command,
            [in, optional] VARIANT* WindowStyle,
            [in, optional] VARIANT* WaitOnReturn,
            [out, retval] DWORD* out_ExitCode);

        [id(0x03e9)]
        HRESULT Popup(
            [in] BSTR Text,
            [in, optional] VARIANT* SecondsToWait,
            [in, optional] VARIANT* Title,
            [in, optional] VARIANT* Type,
            [out, retval] int* out_Button);

        [id(0x03ea)]
        HRESULT CreateShortcut(
            [in] BSTR PathLink,
            [out, retval] IDispatch** out_Shortcut);

        [id(0x03ee)]
        HRESULT ExpandEnvironmentStrings(
            [in] BSTR Src,
            [out, retval] BSTR* out_Dst);

        [id(0x07d0)]
        HRESULT RegRead(
            [in] BSTR Name,
            [out, retval] VARIANT* out_Value);

        [id(0x07d1)]
        HRESULT RegWrite(
            [in] BSTR Name,
            [in] VARIANT* Value,
            [in, optional] VARIANT* Type);

        [id(0x07d2)]
        HRESULT RegDelete([in] BSTR Name);
    };

    [
      uuid(24be5a30-edfe-11d2-b933-00104b365c9f),
      odl,
      dual,
      oleautomation,
      hidden
    ]
    interface IWshShell2 : IWshShell {
        [id(0x0bb8)]
        HRESULT LogEvent(
            [in] VARIANT* Type,
            [in] BSTR Message,
            [in, defaultvalue("")] BSTR Target,
            [out, retval] VARIANT_BOOL* out_Success);

        [id(0x0bc2)]
        HRESULT AppActivate(
            [in] VARIANT* App,
            [in, optional] VARIANT* Wait,
            [out, retval] VARIANT_BOOL* out_Success);

        [id(0x0bc3)]
        HRESULT SendKeys(
            [in] BSTR Keys,
            [in, optional] VARIANT* Wait);
    };

    [
        uuid(41904400-be18-11d3-a28b-00104bd35090),
        odl,
        dual,
        oleautomation
    ]
    interface IWshShell3 : IWshShell2 {
        [id(0x0bc4)]
        HRESULT Exec(
            [in] BSTR Command,
            [out, retval] IWshExec** out_Exec);

        [id(0x0bc5), propget]
        HRESULT CurrentDirectory([out, retval] BSTR* out_Directory);

        [id(0x0bc5), propput]
        HRESULT CurrentDirectory([in] BSTR out_Directory);
    };

    [
        uuid(24be5a31-edfe-11d2-b933-00104b365c9f),
        odl,
        dual,
        oleautomation
    ]
    interface IWshNetwork2 : IDispatch {
        [id(0x60020000), propget]
        HRESULT UserDomain([out, retval] BSTR *out_UserDomain);
    }

    [
        helpstring("Windows Script Host Shell Object"),
        uuid(f935dc22-1cf0-11d0-adb9-00c04fd58a0b),
        threading(apartment),
        progid("WScript.Shell.1"),
        vi_progid("WScript.Shell")
    ]
    coclass IWshShell_Class {
        [default] interface IWshShell3;
    }

    [
        helpstring("Windows Script Host Shell Object"),
        uuid(72c24dd5-d70a-438b-8a42-98424b88afb8),
        threading(apartment),
        progid("WScript.Shell.1"),
        vi_progid("WScript.Shell")
    ]
    coclass WshShell {
        [default] interface IWshShell3;
    }

    [
        helpstring("Windows Script Host Network Object"),
        uuid(f935dc26-1cf0-11d0-adb9-00c04fd58a0b),
        threading(apartment),
        progid("WScript.Network.1"),
        vi_progid("WScript.Network")
    ]
    coclass IWshNetwork_Class {
        [default] interface IWshNetwork2;
    }

    [
        helpstring("Windows Script Host Network Object"),
        uuid(093ff999-1ea0-4079-9525-9614c3504b74),
        threading(apartment),
        progid("WScript.Network.1"),
        vi_progid("WScript.Network")
    ]
    coclass WshNetwork {
        [default] interface IWshNetwork2;
    }
}
