/*
 * Copyright (C) 2012 Alistair Leslie-Hughes
 *
 * 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 "unknwn.idl";
import "objidl.idl";
import "oaidl.idl";

cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef CopyFile")
cpp_quote("#undef DeleteFile")
cpp_quote("#undef MoveFile")
cpp_quote("#endif")

[
  uuid(420B2830-E718-11CF-893D-00A0C9054228),
  version(1.0)
]
library Scripting
{
    importlib("stdole2.tlb");

    interface IDictionary;
    interface IDrive;
    interface IDriveCollection;
    interface IFile;
    interface IFileCollection;
    interface IFileSystem;
    interface IFileSystem3;
    interface IFolder;
    interface IFolderCollection;
    interface IScriptEncoder;
    interface ITextStream;

    typedef enum CompareMethod
    {
        BinaryCompare   = 0,
        TextCompare     = 1,
        DatabaseCompare = 2
    } CompareMethod;

    typedef enum IOMode
    {
        ForReading   = 1,
        ForWriting   = 2,
        ForAppending = 8
    } IOMode;

    typedef enum Tristate
    {
        TristateTrue       = 0xffffffff,
        TristateFalse      = 0,
        TristateUseDefault = 0xfffffffe,
        TristateMixed      = 0xfffffffe
    } Tristate;

    typedef enum FileAttribute
    {
        Normal = 0,
        ReadOnly = 1,
        Hidden = 2,
        System = 4,
        Volume = 8,
        Directory = 16,
        Archive = 32,
        Alias = 1024,
        Compressed = 2048
    } FileAttribute;

    typedef enum SpecialFolderConst
    {
        WindowsFolder = 0,
        SystemFolder = 1,
        TemporaryFolder = 2
    } SpecialFolderConst;

    typedef enum DriveTypeConst
    {
        UnknownType = 0,
        Removable = 1,
        Fixed = 2,
        Remote = 3,
        CDRom = 4,
        RamDisk = 5
    } DriveTypeConst;

    typedef enum StandardStreamTypes
    {
        StdIn  = 0,
        StdOut = 1,
        StdErr = 2
    } StandardStreamTypes;

    [
      odl,
      uuid(42C642C1-97E1-11CF-978F-00A02463E06F),
      hidden,
      dual,
      oleautomation
    ]
    interface IDictionary : IDispatch
    {
        [id(00000000), propputref]
        HRESULT Item([in] VARIANT* Key, [in] VARIANT* pRetItem);

        [id(00000000), propput]
        HRESULT Item([in] VARIANT* Key, [in] VARIANT* pRetItem);

        [id(00000000), propget]
        HRESULT Item([in] VARIANT* Key, [out, retval] VARIANT* pRetItem);

        [id(0x00000001)]
        HRESULT Add([in] VARIANT* Key, [in] VARIANT* Item);

        [id(0x00000002), propget]
        HRESULT Count([out, retval] long* pCount);

        [id(0x00000003)]
        HRESULT Exists([in] VARIANT* Key, [out, retval] VARIANT_BOOL* pExists);

        [id(0x00000004)]
        HRESULT Items([out, retval] VARIANT* pItemsArray);

        [id(0x00000005), propput]
        HRESULT Key([in] VARIANT* Key, [in] VARIANT* rhs);

        [id(0x00000006)]
        HRESULT Keys([out, retval] VARIANT* pKeysArray);

        [id(0x00000007)]
        HRESULT Remove([in] VARIANT* Key);

        [id(0x00000008)]
        HRESULT RemoveAll();

        [id(0x00000009), propput]
        HRESULT CompareMode([in] CompareMethod pcomp);

        [id(0x00000009), propget]
        HRESULT CompareMode([out, retval] CompareMethod* pcomp);

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

        [id(0x0000000a), propget, hidden]
        HRESULT HashVal([in] VARIANT* Key, [out, retval] VARIANT* HashVal);
    }

    [
      odl,
      uuid(0AB5A3D0-E5B6-11D0-ABF5-00A0C90FFFC0),
      hidden,
      dual,
      nonextensible,
      oleautomation
    ]
    interface IFileSystem : IDispatch
    {
        [id(0x0000271a), propget]
        HRESULT Drives([out, retval] IDriveCollection** ppdrives);

        [id(0x00002710)]
        HRESULT BuildPath([in] BSTR Path, [in] BSTR Name, [out, retval] BSTR* pbstrResult);

        [id(0x00002714)]
        HRESULT GetDriveName([in] BSTR Path, [out, retval] BSTR* pbstrResult);

        [id(0x00002715)]
        HRESULT GetParentFolderName([in] BSTR Path, [out, retval] BSTR* pbstrResult);

        [id(0x00002716)]
        HRESULT GetFileName([in] BSTR Path, [out, retval] BSTR* pbstrResult);

        [id(0x00002717)]
        HRESULT GetBaseName([in] BSTR Path, [out, retval] BSTR* pbstrResult);

        [id(0x00002718)]
        HRESULT GetExtensionName([in] BSTR Path, [out, retval] BSTR* pbstrResult);

        [id(0x00002712)]
        HRESULT GetAbsolutePathName([in] BSTR Path, [out, retval] BSTR* pbstrResult);

        [id(0x00002713)]
        HRESULT GetTempName([out, retval] BSTR* pbstrResult);

        [id(0x0000271f)]
        HRESULT DriveExists([in] BSTR DriveSpec, [out, retval] VARIANT_BOOL* pfExists);

        [id(0x00002720)]
        HRESULT FileExists([in] BSTR FileSpec, [out, retval] VARIANT_BOOL* pfExists);

        [id(0x00002721)]
        HRESULT FolderExists([in] BSTR FolderSpec, [out, retval] VARIANT_BOOL* pfExists);

        [id(0x0000271b)]
        HRESULT GetDrive([in] BSTR DriveSpec, [out, retval] IDrive** ppdrive);

        [id(0x0000271c)]
        HRESULT GetFile([in] BSTR FilePath, [out, retval] IFile** ppfile);

        [id(0x0000271d)]
        HRESULT GetFolder([in] BSTR FolderPath, [out, retval] IFolder** ppfolder);

        [id(0x0000271e)]
        HRESULT GetSpecialFolder([in] SpecialFolderConst SpecialFolder, [out, retval] IFolder** ppfolder);

        [id(0x000004b0)]
        HRESULT DeleteFile([in] BSTR FileSpec, [in, optional, defaultvalue(0)] VARIANT_BOOL Force);

        [id(0x000004b1)]
        HRESULT DeleteFolder([in] BSTR FolderSpec, [in, optional, defaultvalue(0)] VARIANT_BOOL Force);

        [id(0x000004b4), helpstring("Move a file"), helpcontext(0x00214bab)]
        HRESULT MoveFile([in] BSTR Source, [in] BSTR Destination);

        [id(0x000004b5)]
        HRESULT MoveFolder([in] BSTR Source, [in] BSTR Destination);

        [id(0x000004b2)]
        HRESULT CopyFile([in] BSTR Source, [in] BSTR Destination,
                         [in, optional, defaultvalue(-1)] VARIANT_BOOL OverWriteFiles);

        [id(0x000004b3)]
        HRESULT CopyFolder([in] BSTR Source, [in] BSTR Destination,
                           [in, optional, defaultvalue(-1)] VARIANT_BOOL OverWriteFiles);

        [id(0x00000460)]
        HRESULT CreateFolder([in] BSTR Path, [out, retval] IFolder** ppfolder);

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

        [id(0x0000044c)]
        HRESULT OpenTextFile([in] BSTR FileName, [in, optional, defaultvalue(1)] IOMode IOMode,
                        [in, optional, defaultvalue(0)] VARIANT_BOOL Create,
                        [in, optional, defaultvalue(0)] Tristate Format,
                        [out, retval] ITextStream** ppts);
    }

    [
      odl,
      uuid(C7C3F5A1-88A3-11D0-ABCB-00A0C90FFFC0),
      hidden,
      dual,
      nonextensible,
      oleautomation
    ]
    interface IDriveCollection : IDispatch {
        [id(00000000)]
        HRESULT Item([in] VARIANT Key, [out, retval] IDrive** ppdrive);

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

        [id(0x00000001), propget]
        HRESULT Count([out, retval] long* plCount);
    }

    [
      odl,
      uuid(C7C3F5A0-88A3-11D0-ABCB-00A0C90FFFC0),
      hidden,
      dual,
      nonextensible,
      oleautomation
    ]
    interface IDrive : IDispatch
    {
        [id(00000000), propget]
        HRESULT Path([out, retval] BSTR* pbstrPath);

        [id(0x00002710), propget]
        HRESULT DriveLetter([out, retval] BSTR* pbstrLetter)
;
        [id(0x00002711), propget]
        HRESULT ShareName([out, retval] BSTR* pbstrShareName);

        [id(0x00002712), propget]
        HRESULT DriveType([out, retval] DriveTypeConst* pdt);

        [id(0x00002713), propget]
        HRESULT RootFolder([out, retval] IFolder** ppfolder);

        [id(0x00002715), propget]
        HRESULT AvailableSpace([out, retval] VARIANT* pvarAvail);

        [id(0x00002714), propget]
        HRESULT FreeSpace([out, retval] VARIANT* pvarFree);

        [id(0x00002716), propget]
        HRESULT TotalSize([out, retval] VARIANT* pvarTotal);

        [id(0x00002717), propget]
        HRESULT VolumeName([out, retval] BSTR* pbstrName);

        [id(0x00002717), propput]
        HRESULT VolumeName([in] BSTR pbstrName);

        [id(0x00002718), propget]
        HRESULT FileSystem([out, retval] BSTR* pbstrFileSystem);

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

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

    [
      odl,
      uuid(C7C3F5A2-88A3-11D0-ABCB-00A0C90FFFC0),
      hidden,
      dual,
      nonextensible,
      oleautomation
    ]
    interface IFolder : IDispatch
    {
        [id(00000000), propget]
        HRESULT Path([out, retval] BSTR* pbstrPath);

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

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

        [id(0x000003ea), propget]
        HRESULT ShortPath([out, retval] BSTR* pbstrPath);

        [id(0x000003e9), propget]
        HRESULT ShortName([out, retval] BSTR* pbstrName);

        [id(0x000003ec), propget]
        HRESULT Drive([out, retval] IDrive** ppdrive);

        [id(0x000003ed), propget]
        HRESULT ParentFolder([out, retval] IFolder** ppfolder);

        [id(0x000003eb), propget]
        HRESULT Attributes([out, retval] FileAttribute* pfa);

        [id(0x000003eb), propput]
        HRESULT Attributes([in] FileAttribute pfa);

        [id(0x000003ee), propget]
        HRESULT DateCreated([out, retval] DATE* pdate);

        [id(0x000003ef), propget]
        HRESULT DateLastModified([out, retval] DATE* pdate);

        [id(0x000003f0), propget]
        HRESULT DateLastAccessed([out, retval] DATE* pdate);

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

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

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

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

        [id(0x00002710), propget]
        HRESULT IsRootFolder([out, retval] VARIANT_BOOL* pfRootFolder);

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

        [id(0x00002711), propget]
        HRESULT SubFolders([out, retval] IFolderCollection** ppfolders);

        [id(0x00002712), propget]
        HRESULT Files([out, retval] IFileCollection** ppfiles);

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

    [
      odl,
      uuid(C7C3F5A3-88A3-11D0-ABCB-00A0C90FFFC0),
      hidden,
      dual,
      nonextensible,
      oleautomation
    ]
    interface IFolderCollection : IDispatch
    {
        [id(0x00000002)]
        HRESULT Add([in] BSTR Name, [out, retval] IFolder** ppfolder);

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

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

        [id(0x00000001), propget]
        HRESULT Count([out, retval] long* plCount);
    }

    [
      odl,
      uuid(C7C3F5A5-88A3-11D0-ABCB-00A0C90FFFC0),
      hidden,
      dual,
      nonextensible,
      oleautomation
    ]
    interface IFileCollection : IDispatch
    {
        [id(00000000), propget]
        HRESULT Item([in] VARIANT Key, [out, retval] IFile** ppfile);

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

        [id(0x00000001), propget]
        HRESULT Count([out, retval] long* plCount);
    }

    [
      odl,
      uuid(C7C3F5A4-88A3-11D0-ABCB-00A0C90FFFC0),
      hidden,
      dual,
      nonextensible,
      oleautomation
    ]
    interface IFile : IDispatch
    {
        [id(00000000), propget]
        HRESULT Path([out, retval] BSTR* pbstrPath);

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

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

        [id(0x000003ea), propget]
        HRESULT ShortPath([out, retval] BSTR* pbstrPath);

        [id(0x000003e9), propget]
        HRESULT ShortName([out, retval] BSTR* pbstrName);

        [id(0x000003ec), propget]
        HRESULT Drive([out, retval] IDrive** ppdrive);

        [id(0x000003ed), propget]
        HRESULT ParentFolder([out, retval] IFolder** ppfolder);

        [id(0x000003eb), propget]
        HRESULT Attributes([out, retval] FileAttribute* pfa);

        [id(0x000003eb), propput]
        HRESULT Attributes([in] FileAttribute pfa);

        [id(0x000003ee), propget]
        HRESULT DateCreated([out, retval] DATE* pdate);

        [id(0x000003ef), propget]
        HRESULT DateLastModified([out, retval] DATE* pdate);

        [id(0x000003f0), propget]
        HRESULT DateLastAccessed([out, retval] DATE* pdate);

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

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

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

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

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

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

    [
      odl,
      uuid(53BAD8C1-E718-11CF-893D-00A0C9054228),
      hidden,
      dual,
      nonextensible,
      oleautomation
    ]
    interface ITextStream : IDispatch
    {
        [id(0x00002710), propget]
        HRESULT Line([out, retval] long* Line);

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

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

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

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

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

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

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

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

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

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

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

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

    [
      odl,
      uuid(2A0B9D10-4B87-11D3-A97A-00104B365C9F),
      dual,
      nonextensible,
      oleautomation
    ]
    interface IFileSystem3 : IFileSystem
    {
        [id(0x00004e20)]
        HRESULT GetStandardStream([in] StandardStreamTypes StandardStreamType,
                        [in, optional, defaultvalue(0)] VARIANT_BOOL Unicode, [out, retval] ITextStream** ppts);

        [id(0x00004e2a)]
        HRESULT GetFileVersion([in] BSTR FileName, [out, retval] BSTR* FileVersion);
    }

    [
      odl,
      uuid(AADC65F6-CFF1-11D1-B747-00C04FC2B085),
      dual,
      oleautomation
    ]
    interface IScriptEncoder : IDispatch
    {
        [id(00000000)]
        HRESULT EncodeScriptFile([in] BSTR szExt, [in] BSTR bstrStreamIn, [in] long cFlags,
                        [in] BSTR bstrDefaultLang, [out, retval] BSTR* pbstrStreamOut);
    }

    [
      uuid(EE09B103-97E0-11CF-978F-00A02463E06F),
      version(1.0),
      helpstring("Scripting.Dictionary"),
      threading(apartment),
      progid("Scripting.Dictionary")
    ]
    coclass Dictionary
    {
        [default] interface IDictionary;
    }

    [
      uuid(0D43FE01-F093-11CF-8940-00A0C9054228),
      version(1.0),
      helpstring("FileSystem Object"),
      threading(both),
      progid("Scripting.FileSystemObject")
    ]
    coclass FileSystemObject
    {
        [default] interface IFileSystem3;
    }

    [
      uuid(C7C3F5B1-88A3-11D0-ABCB-00A0C90FFFC0),
      noncreatable,
      version(1.0)
    ]
    coclass Drive
    {
        [default] interface IDrive;
    }

    [
      uuid(C7C3F5B2-88A3-11D0-ABCB-00A0C90FFFC0),
      noncreatable,
      version(1.0)
    ]
    coclass Drives
    {
        [default] interface IDriveCollection;
    }

    [
      uuid(C7C3F5B3-88A3-11D0-ABCB-00A0C90FFFC0),
      noncreatable,
      version(1.0)
    ]
    coclass Folder
    {
        [default] interface IFolder;
    }

    [
      uuid(C7C3F5B4-88A3-11D0-ABCB-00A0C90FFFC0),
      noncreatable,
      version(1.0)
    ]
    coclass Folders
    {
        [default] interface IFolderCollection;
    }

    [
      uuid(C7C3F5B5-88A3-11D0-ABCB-00A0C90FFFC0),
      noncreatable,
      version(1.0)
    ]
    coclass File
    {
        [default] interface IFile;
    }

    [
      uuid(C7C3F5B6-88A3-11D0-ABCB-00A0C90FFFC0),
      noncreatable,
      version(1.0)
    ]
    coclass Files
    {
        [default] interface IFileCollection;
    }

    [
      uuid(0BB02EC0-EF49-11CF-8940-00A0C9054228),
      noncreatable,
      version(1.0)
    ]
    coclass TextStream
    {
        [default] interface ITextStream;
    }

    [
      uuid(32DA2B15-CFED-11D1-B747-00C04FC2B085),
      version(1.0),
      helpstring("Script Encoder Object"),
      threading(apartment),
      progid("Scripting.Encoder")
    ]
    coclass Encoder
    {
        [default] interface IScriptEncoder;
    }
}
