//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992 - 1995
//
//  File:       mtscript.idl
//
//  Contents:   Definition of Script engine interfacets
//
//----------------------------------------------------------------------------

#include "dispid.h"

#define RC_INVOKED

#undef ASSERT

#define DEFAULTVALUE_(x)    ,defaultvalue(x)
#ifndef MTSCRIPT_DROP
#define MTSCRIPT_QFENUMBER   0
#define MTSCRIPT_BUILDNUMBER 0
#endif

#define VERSIONNUMBER MTSCRIPT_BUILDNUMBER.MTSCRIPT_QFENUMBER
// *************  Script Engine Interfaces *****************

[uuid(854c3169-c854-4a77-b189-606859e4391b), version(1.0)]
library MTScriptEngine
{
    importlib("stdole2.tlb");
    const long IConnectedMachine_lVersionMajor = MTSCRIPT_BUILDNUMBER;
    const long IConnectedMachine_lVersionMinor = MTSCRIPT_QFENUMBER;

    // ****************************************************************
    //  DUAL INTERFACES
    // ****************************************************************

    [uuid(854c3181-c854-4a77-b189-606859e4391b), dual]
    interface IRemoteMTScriptProxy : IDispatch
    {
        HRESULT Connect([in, defaultvalue("")] BSTR bstrMachine);
        HRESULT Disconnect();
        HRESULT DownloadFile([in] BSTR bstrUrl,
                             [out, retval] BSTR *bstrFile);
    }

    [uuid(854c316c-c854-4a77-b189-606859e4391b), dual, version(VERSIONNUMBER)]
    interface IConnectedMachine : IDispatch
    {
        [helpstring("Fires an OnRemoteExec event on the script engine")]
        HRESULT Exec([in]  BSTR bstrCmd,
                     [in]  BSTR bstrParams,
                     [out, retval] VARIANT *pvData);

        [propget,
         helpstring("Returns the data that was published by the script engine")]
        HRESULT PublicData([out, retval] VARIANT *pvData);

        [propget,
         helpstring("The machine name")]
         HRESULT Name([out, retval] BSTR *name);

        [propget,
         helpstring("The machine platform (intel, alpha, etc)")]
         HRESULT Platform([out, retval] BSTR *platform);

        [propget,
         helpstring("The machine operating system (WinNT, Win95, Win98, etc)")]
         HRESULT OS([out, retval] BSTR *os);

        [propget,
         helpstring("Major OS Version (Raw data from OSVERSIONINFO)")]
         HRESULT MajorVer([out, retval] long *majorver);

        [propget,
         helpstring("Minor OS Version (Raw data from OSVERSIONINFO)")]
         HRESULT MinorVer([out, retval] long *minorver);

        [propget,
         helpstring("OS Build number (Raw data from OSVERSIONINFO)")]
         HRESULT BuildNum([out, retval] long *buildnum);

        [propget,
         helpstring("Returns true if the machine is running NT")]
         HRESULT PlatformIsNT([out, retval] VARIANT_BOOL *pfIsNT);

        [propget,
         helpstring("Returns any service pack string for OS")]
         HRESULT ServicePack([out, retval] BSTR *servicepack);

        [propget,
         helpstring("IConnectedMachine Major Version")]
         HRESULT HostMajorVer([out, retval] long *majorver);

        [propget,
         helpstring("IConnectedMachine Minor Version")]
         HRESULT HostMinorVer([out, retval] long *minorver);

        [propget,
         helpstring("Get status value by index.")]
         HRESULT StatusValue([in] long nIndex, [out, retval] long *pnStatus);
    }

    // This interface is not intended to ever be remoted or marshalled
    [uuid(854c316b-c854-4a77-b189-606859e4391b), dual, local]
    interface IGlobalMTScript : IDispatch
    {
        [propget,
         helpstring("MTScript Major Version")]
         HRESULT HostMajorVer([out, retval] long *majorver);

        [propget,
         helpstring("MTScript Minor Version")]
         HRESULT HostMinorVer([out, retval] long *minorver);

        [propget,
         helpstring("A place to store global data that is visible to other clients which connect to this machine")]
        HRESULT PublicData([out, retval] VARIANT *pvData);

        [propput]
        HRESULT PublicData([in] VARIANT vData);

        [propget,
         helpstring("A place to store global data that should not be made visible to clients which connect")]
        HRESULT PrivateData([out, retval] VARIANT *pvData);

        [propput]
        HRESULT PrivateData([in] VARIANT vData);

        [helpstring("Quits the MTScript process")]
        HRESULT ExitProcess();

        [helpstring("Shuts down all running scripts and restarts")]
        HRESULT Restart();

        [propget,
        helpstring("Returns the local machine's name")]
        HRESULT LocalMachine([out, retval] BSTR *pbstrName);

        [helpstring("Behaves similar to the C/C++ #include. Parses in the given script file.")]
        HRESULT Include(BSTR bstrPath);

        [helpstring("Execute script file in the same thread as the caller. Param is available to script as 'ScriptParam'.")]
        HRESULT CallScript(
                [in] BSTR Path,
                [optional, in] VARIANT *Param);

        [helpstring("Execute script file in a new thread. Param is available to script as 'ScriptParam'.")]
        HRESULT SpawnScript(
                [in] BSTR Path,
                [optional, in] VARIANT *Param);

        [propget,
        helpstring("Argument passed to 'CallScript' or 'SpawnScript'")]
        HRESULT ScriptParam(
                [out, retval] VARIANT *Param);

        [propget,
        helpstring("Returns the path of the scripts used by the script engine")]
        HRESULT ScriptPath([out, retval] BSTR *pbstrPath);

        [helpstring("Call external function in specified DLL")]
        HRESULT CallExternal([in]          BSTR bstrDLLName,
                             [in]          BSTR bstrFunctionName,
                             [in,optional] VARIANT *pParam,
                             [out,retval]  long *pdwRetVal);

        [helpstring("Resets multiple ThreadSyncs with the given name to non-signaled. On error, reset no ThreadSyncs.")]
        HRESULT ResetSync([in] const BSTR bstrName);

        [helpstring("Waits for a ThreadSync with the given name to be signaled")]
        HRESULT WaitForSync([in] BSTR bstrName,                      // Name of ThreadSync
                            [in] long nTimeout,                      // Timeout in ms
                            [out, retval] VARIANT_BOOL *pfSignaled); // TRUE if event was signaled, FALSE on timeout

        [helpstring("Waits for multiple ThreadSyncs with the given names to be signaled")]
        HRESULT WaitForMultipleSyncs([in] const BSTR     bstrNameList,   // Comma separated list of ThreadSync names
                                     [in] VARIANT_BOOL   fWaitForAll,    // If TRUE, all listed syncs must be signaled
                                     [in] long           nTimeout,       // Timeout in millisec
                                     [out, retval] long *plSignal);      // Index of signaled ThreadSync. 0 if timed-out, 1 if fWaitForAll=true

        [helpstring("Sets the given (1 or more) ThreadSyncs to signaled. They stays signaled until ResetSync is called")]
        HRESULT SignalThreadSync([in] BSTR bstrName);

        [helpstring("Obtains a thread lock with the given name (a.k.a. critical section")]
        HRESULT TakeThreadLock([in] BSTR bstrName);

        [helpstring("Obtains a thread lock with the given name (a.k.a. critical section")]
        HRESULT ReleaseThreadLock([in] BSTR bstrName);

        [helpstring("Gives the script thread a chance to handle cross-thread communication")]
        HRESULT DoEvents();

        // BUGBUG -- Need to design better feedback/error UI

        [helpstring("Puts up a messagebox.")]
        HRESULT MessageBoxTimeout([in] BSTR bstrMessage,           // Message Text
                                  [in] long cButtons,              // Number of buttons (max 5)
                                  [in] BSTR bstrButtonText,        // Comma separated list of button text. Number must match cButtons
                                  [in] long lTimeout,              // Timeout in minutes. If zero then no timeout.
                                  [in] long lEventInterval,        // Fire a OnMessageBoxInterval event every lEventInterval minutes
                                  [in] VARIANT_BOOL fCanCancel,    // If TRUE then timeout can be canceled.
                                  [in] VARIANT_BOOL fConfirm,      // If TRUE then confirm the button pushed before returning.
                                  [out, retval] long *plSelected); // Returns button pushed. 0=timeout, 1=Button1, 2=Button2, etc.

        [helpstring("Runs a command on the local machine")]
        HRESULT RunLocalCommand([in] BSTR               bstrCommand,               // Command to run (does not wrap it in a shell)
                                [in] BSTR               bstrDir,                   // Directory to use as working directory.
                                [in, DEFAULTVALUE_("")] BSTR         bstrTitle,    // The window title to use (if bstrCommand invokes a shell)
                                [in, DEFAULTVALUE_(0)]  VARIANT_BOOL fMinimize,    // If TRUE, the new process is started minimized
                                [in, DEFAULTVALUE_(0)]  VARIANT_BOOL fGetOutput,   // If TRUE, capture STDOUT and STDERR and make available using GetProcessOutput()
                                [in, DEFAULTVALUE_(-1)] VARIANT_BOOL fWait,        // If TRUE, doesn't return until finished
                                [in, DEFAULTVALUE_(-1)] VARIANT_BOOL fNoCrashPopup,// If TRUE, unhandled exceptions in the child process just terminate the process
                                [in, DEFAULTVALUE_(0)]  VARIANT_BOOL fNoEnviron,   // If TRUE, invoke it with an empty environment
                                [out, retval]           long        *plProcessID); // ID of new process, 0 on error.

        [helpstring("Returns the error code from RunLocalCommand if it failed")]
        HRESULT GetLastRunLocalError([out, retval] long *plErrorCode);

        [helpstring("Returns the STDOUT & STDERR data for the process up to this point")]
        HRESULT GetProcessOutput([in] long     lProcessID,
                                 [out, retval] BSTR *pbstrData);

        [helpstring("Returs the exit code for the given process")]
        HRESULT GetProcessExitCode([in] long lProcessID, [out, retval] long *plExitCode);

        [helpstring("Terminates the given running process")]
        HRESULT TerminateProcess([in] long lProcessID);   // Calls IScriptedProcessSink::RequestExit first if the process is connected

        [helpstring("Sends information to a process connected through IScriptedProcess")]
        HRESULT SendToProcess([in] long lProcessID,
                              [in] BSTR bstrType,
                              [in] BSTR bstrData,
                              [out, retval] long *plReturn);

        [helpstring("Sends email using MAPI")]
        HRESULT SendMail([in] BSTR bstrTo,    // To line, separated by spaces
                         [in] BSTR bstrCC,    // CC line, separated by spaces
                         [in] BSTR bstrBCC,   // BCC line, separated by spaces
                         [in] BSTR bstrSubject,
                         [in] BSTR bstrMessage,
                         [in, DEFAULTVALUE_("")] BSTR bstrAttachmentPath,
                         [in, DEFAULTVALUE_("")] BSTR bstrUsername, // Login username
                         [in, DEFAULTVALUE_("")] BSTR bstrPassword, // Login password
                         [out, retval]  long *plErrorCode);

        [helpstring("Sends email using SMTP")]
        HRESULT SendSMTPMail([in] BSTR bstrFrom,     // Sender - must be a valid address w/ domain. e.g. "lylec@microsoft.com"
                             [in] BSTR bstrTo,       // To line, separated by spaces, must have domain
                             [in] BSTR bstrCC,       // CC line, separated by spaces, must have domain
                             [in] BSTR bstrSubject,
                             [in] BSTR bstrMessage,
                             [in] BSTR bstrSMTPHost, // Name of SMTP Host to send mail through
                             [out, retval]  long *plErrorCode);

        [helpstring("If 'Assertion' = True then Assert with 'Message'.")]
        HRESULT ASSERT(
                [in] VARIANT_BOOL Assertion,
                [in] BSTR Message);

        [helpstring("Output 'Message' to debug console.")]
        HRESULT OUTPUTDEBUGSTRING(
                [in] BSTR Message);

        [helpstring("Uneval the string")]
        HRESULT UnevalString([in] BSTR bstrIn,
                             [out, retval] BSTR *bstrOut);

        [helpstring("Copy or append one file to another. Return lastbytecopied+1")]
        HRESULT CopyOrAppendFile(
                        [in] BSTR bstrSrc,    // File to READ
                        [in] BSTR bstrDst,    // File to WRITE
                        [in] long nSrcOffset, // Offset in READ file to start reading from
                        [in] long nSrcLength, // Max # of bytes to READ (pass -1 to read to EOF)
                        [in] VARIANT_BOOL  fAppend, // If true, append to WRITE file, else always create WRITE file
                        [out, retval] long *nSrcFilePosition); // The resultant position in the READ file. Pass this as nSrcOffset on the next call to this function to continue reading.

        [helpstring("Sleeps n milliseconds")]
        HRESULT Sleep([in] int nTimeout);

        [helpstring("Reboots the local machine")]
        HRESULT Reboot();

        [helpstring("Fires the OnScriptNotify event to any clients connected to us through the RemoteMTScript object")]
        HRESULT NotifyScript(BSTR bstrEvent, VARIANT vData);

        [helpstring("Registers the given object so that events can be hooked up")]
        HRESULT RegisterEventSource([in] IDispatch *pDisp, [in, DEFAULTVALUE_("")] BSTR bstrProgID);

        [helpstring("Unregisters an object registered with RegisterEventSource")]
        HRESULT UnregisterEventSource([in] IDispatch *pDisp);

        [propget,
         helpstring("Get status value by index.")]
         HRESULT StatusValue([in] long nIndex, [out, retval] long *pnStatus);

        [propput,
         helpstring("Get status value by index.")]
         HRESULT StatusValue([in] long nIndex, [in] long nStatus);
    }

    // ****************************************************************
    //  EVENT INTERFACES
    // ****************************************************************


    [uuid(854c316a-c854-4a77-b189-606859e4391b)]
    dispinterface DLocalMTScriptEvents
    {
    properties:
    methods:    // Events
        //
        //
        [helpstring("Main function called when script is loaded"),
         id(DISPID_MTScript_ScriptMain)] void ScriptMain();

        [helpstring("Fired when another machine connects to this machine through the RemoteMTScript object with the intent of controlling us"),
         id(DISPID_MTScript_OnMachineConnect)]
        void OnMachineConnect();

        [helpstring("Fired when a connected machines calls Exec()"),
         id(DISPID_MTScript_OnRemoteExec)]
        void OnRemoteExec([in] BSTR bstrCmd,
                          [in] BSTR bstrParams,
                          [out, retval] VARIANT *pvDataReturn);

        // This event is only fired on the thread that received the call to
        //   RegisterEventSource for that object.
        [helpstring("Fired when the object fires an event"),
         id(DISPID_MTScript_OnEventSourceEvent)]
        void OnEventSourceEvent([in] IDispatch *pDisp,
                                [in] long lDispid);

        // This event is only fired on the thread that called RunLocalCommand
        //  for that process.
        [helpstring("Fired to give info on a process created with RunLocalCommand"),
         id(DISPID_MTScript_OnProcessEvent)]
        void OnProcessEvent([in] long     lProcessID,      // Process ID
                            [in] BSTR     bstrEvent,       // String giving event name
                            [in] VARIANT  vData,           // Data associated with the event
                            [out, retval] long *plReturn); // Return value

        // This event is only fired on the script thread that made the call
        //    to MessageBoxTimeout.
        [helpstring("Fired by MessageBoxTimeout() every specified number of minutes when timing out."),
         id(DISPID_MTScript_OnMessageBoxInterval)]
        void OnMessageBoxInterval();

        // This event is fired when a script error occurs.
        // A return value is expected.
        // If 0 is returned, mtscript.exe displays a dialog
        // If 1 is returned mtscript invokes the script debugger (if present)
        // else the error is ignored.
        // MTScript.exe always records the error via OUTPUTDEBUGSTRING.
        [helpstring("Invoked on script error"),
         id(DISPID_MTScript_OnScriptError)]
        void OnScriptError([in] BSTR bstrFile,
                           [in] long nLine,
                           [in] long nChar,
                           [in] BSTR bstrText,
                           [in] long sCode,
                           [in] BSTR bstrSource,
                           [in] BSTR bstrDescription,
                           [out, retval] VARIANT *pvDataReturn);
    }

    [uuid(854c3170-c854-4a77-b189-606859e4391b)]
    dispinterface DRemoteMTScriptEvents
    {
    properties:
    methods:    // Events
        //
        //
        [helpstring("Fired when a connected machine calls NotifyScript event"),
         id(DISPID_RemoteMTScript_OnScriptNotify)]
        void OnScriptNotify(BSTR bstrIdent, VARIANT vInfo);
    }

    // ****************************************************************
    //  COCLASSES
    // ****************************************************************

    [uuid(854c316e-c854-4a77-b189-606859e4391b),
     noncreatable]
    coclass LocalMTScript
    {
        [default]         interface     IGlobalMTScript;
        [default, source] dispinterface DLocalMTScriptEvents;
    }


    [uuid(854c316d-c854-4a77-b189-606859e4391b)]
    coclass RemoteMTScript
    {
        [default]         interface     IConnectedMachine;
        [default, source] dispinterface DRemoteMTScriptEvents;
    }


    [uuid(854c3182-c854-4a77-b189-606859e4391b)]
    coclass RemoteMTScriptProxy
    {
        [default]         interface     IRemoteMTScriptProxy;
        [default, source] dispinterface DRemoteMTScriptEvents;
    }
}
