// qprocess.sip generated by MetaSIP on Sun Nov  9 16:48:00 2014
//
// This file is part of the QtCore Python extension module.
//
// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>
// 
// This file is part of PyQt.
// 
// This file may be used under the terms of the GNU General Public
// License versions 2.0 or 3.0 as published by the Free Software
// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3
// included in the packaging of this file.  Alternatively you may (at
// your option) use any later version of the GNU General Public
// License if such license has been publicly approved by Riverbank
// Computing Limited (or its successors, if any) and the KDE Free Qt
// Foundation. In addition, as a special exception, Riverbank gives you
// certain additional rights. These rights are described in the Riverbank
// GPL Exception version 1.1, which can be found in the file
// GPL_EXCEPTION.txt in this package.
// 
// If you are unsure which license is appropriate for your use, please
// contact the sales department at sales@riverbankcomputing.com.
// 
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.


%If (WS_WIN)
typedef void *Q_PID;
%End
%If (WS_X11 || WS_MACX || WS_PM)
typedef qint64 Q_PID;
%End

class QProcess : QIODevice
{
%TypeHeaderCode
#include <qprocess.h>
%End

public:
    enum ExitStatus
    {
        NormalExit,
        CrashExit,
    };

    enum ProcessError
    {
        FailedToStart,
        Crashed,
        Timedout,
        ReadError,
        WriteError,
        UnknownError,
    };

    enum ProcessState
    {
        NotRunning,
        Starting,
        Running,
    };

    enum ProcessChannel
    {
        StandardOutput,
        StandardError,
    };

    enum ProcessChannelMode
    {
        SeparateChannels,
        MergedChannels,
        ForwardedChannels,
    };

    explicit QProcess(QObject *parent /TransferThis/ = 0);
    virtual ~QProcess();
    void start(const QString &program, const QStringList &arguments, QFlags<QIODevice::OpenModeFlag> mode = ReadWrite) /HoldGIL/;
    void start(const QString &program, QFlags<QIODevice::OpenModeFlag> mode = ReadWrite) /HoldGIL/;
    QProcess::ProcessChannelMode readChannelMode() const;
    void setReadChannelMode(QProcess::ProcessChannelMode mode);
    QProcess::ProcessChannel readChannel() const;
    void setReadChannel(QProcess::ProcessChannel channel);
    void closeReadChannel(QProcess::ProcessChannel channel);
    void closeWriteChannel();
    QString workingDirectory() const;
    void setWorkingDirectory(const QString &dir);
    void setEnvironment(const QStringList &environment);
    QStringList environment() const;
    QProcess::ProcessError error() const;
    QProcess::ProcessState state() const;
    Q_PID pid() const;
    bool waitForStarted(int msecs = 30000) /ReleaseGIL/;
    virtual bool waitForReadyRead(int msecs = 30000) /ReleaseGIL/;
    virtual bool waitForBytesWritten(int msecs = 30000) /ReleaseGIL/;
    bool waitForFinished(int msecs = 30000) /ReleaseGIL/;
    QByteArray readAllStandardOutput() /ReleaseGIL/;
    QByteArray readAllStandardError() /ReleaseGIL/;
    int exitCode() const;
    QProcess::ExitStatus exitStatus() const;
    virtual qint64 bytesAvailable() const;
    virtual qint64 bytesToWrite() const;
    virtual bool isSequential() const;
    virtual bool canReadLine() const;
    virtual void close();
    virtual bool atEnd() const;
    static int execute(const QString &program, const QStringList &arguments) /ReleaseGIL/;
    static int execute(const QString &program) /ReleaseGIL/;
%If (Qt_4_3_0 -)
    static bool startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory, qint64 *pid = 0);
%End
    static bool startDetached(const QString &program, const QStringList &arguments);
    static bool startDetached(const QString &program);
    static QStringList systemEnvironment();
%If (Qt_4_2_0 -)
    QProcess::ProcessChannelMode processChannelMode() const;
%End
%If (Qt_4_2_0 -)
    void setProcessChannelMode(QProcess::ProcessChannelMode mode);
%End
%If (Qt_4_2_0 -)
    void setStandardInputFile(const QString &fileName);
%End
%If (Qt_4_2_0 -)
    void setStandardOutputFile(const QString &fileName, QFlags<QIODevice::OpenModeFlag> mode = Truncate);
%End
%If (Qt_4_2_0 -)
    void setStandardErrorFile(const QString &fileName, QFlags<QIODevice::OpenModeFlag> mode = Truncate);
%End
%If (Qt_4_2_0 -)
    void setStandardOutputProcess(QProcess *destination);
%End

public slots:
    void terminate();
    void kill();

signals:
    void started();
    void finished(int exitCode, QProcess::ExitStatus exitStatus);
    void finished(int exitCode);
    void error(QProcess::ProcessError error);
    void stateChanged(QProcess::ProcessState state);
    void readyReadStandardOutput();
    void readyReadStandardError();

protected:
    void setProcessState(QProcess::ProcessState state);
    virtual void setupChildProcess();
    virtual SIP_PYOBJECT readData(qint64 maxlen) /DocType="Py_v3:bytes;str",ReleaseGIL/ [qint64 (char *data, qint64 maxlen)];
%MethodCode
        // Return the data read or None if there was an error.
        if (a0 < 0)
        {
            PyErr_SetString(PyExc_ValueError, "maximum length of data to be read cannot be negative");
            sipIsErr = 1;
        }
        else
        {
            char *s = new char[a0];
            qint64 len;
        
            Py_BEGIN_ALLOW_THREADS
        #if defined(SIP_PROTECTED_IS_PUBLIC)
            len = sipSelfWasArg ? sipCpp->QProcess::readData(s, a0) : sipCpp->readData(s, a0);
        #else
            len = sipCpp->sipProtectVirt_readData(sipSelfWasArg, s, a0);
        #endif
            Py_END_ALLOW_THREADS
        
            if (len < 0)
            {
                Py_INCREF(Py_None);
                sipRes = Py_None;
            }
            else
            {
                sipRes = SIPBytes_FromStringAndSize(s, len);
        
                if (!sipRes)
                    sipIsErr = 1;
            }
        
            delete[] s;
        }
%End

    virtual qint64 writeData(const char *data /Array/, qint64 len /ArraySize/) /ReleaseGIL/;

public:
%If (Qt_4_6_0 -)
    void setProcessEnvironment(const QProcessEnvironment &environment);
%End
%If (Qt_4_6_0 -)
    QProcessEnvironment processEnvironment() const;
%End
%If (Qt_5_0_0 -)
    QString program() const;
%End
%If (Qt_5_0_0 -)
    QStringList arguments() const;
%End

private:
    QProcess(const QProcess &);
};

%If (Qt_4_6_0 -)

class QProcessEnvironment
{
%TypeHeaderCode
#include <qprocess.h>
%End

public:
    QProcessEnvironment();
    QProcessEnvironment(const QProcessEnvironment &other);
    ~QProcessEnvironment();
    bool operator==(const QProcessEnvironment &other) const;
    bool operator!=(const QProcessEnvironment &other) const;
    bool isEmpty() const;
    void clear();
    bool contains(const QString &name) const;
    void insert(const QString &name, const QString &value);
%If (Qt_4_8_0 -)
    void insert(const QProcessEnvironment &e);
%End
    void remove(const QString &name);
    QString value(const QString &name, const QString &defaultValue /DocValue="Py_v3:''"/ = QString()) const;
    QStringList toStringList() const;
    static QProcessEnvironment systemEnvironment();
%If (Qt_4_8_0 -)
    QStringList keys() const;
%End
%If (Qt_5_0_0 -)
    void swap(QProcessEnvironment &other);
%End
};

%End
