// This is the SIP interface definition for QIODevice.
//
// Copyright (c) 2007
// 	Riverbank Computing Limited <info@riverbankcomputing.co.uk>
// 
// This file is part of PyQt.
// 
// This copy of PyQt is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2, or (at your option) any later
// version.
// 
// PyQt is supplied 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 General Public License for more
// details.
// 
// You should have received a copy of the GNU General Public License along with
// PyQt; see the file LICENSE.  If not, write to the Free Software Foundation,
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.


%ExportedDoc
<Sect2><Title>QIODevice</Title>
<Para>
<Literal>QIODevice</Literal> is fully implemented.
</Para>
</Sect2>
%End


%ModuleHeaderCode
#include <qiodevice.h>
%End


// Device access types.

const int IO_Direct;
const int IO_Sequential;
const int IO_Combined;
const int IO_TypeMask;

// Handling modes.

const int IO_Raw;
const int IO_Async;

// Device open modes.

const int IO_ReadOnly;
const int IO_WriteOnly;
const int IO_ReadWrite;
const int IO_Append;
const int IO_Truncate;
const int IO_Translate;
const int IO_ModeMask;

// Device state.

const int IO_Open;
const int IO_StateMask;

// Device status.

const int IO_Ok;
const int IO_ReadError;
const int IO_WriteError;
const int IO_FatalError;
const int IO_ResourceError;
const int IO_OpenError;
const int IO_ConnectError;
const int IO_AbortError;
const int IO_TimeOutError;
%If (Qt_2_00 -)
const int IO_UnspecifiedError;
%End


class QIODevice
{
%TypeHeaderCode
#include <qiodevice.h>
%End

public:
%If (Qt_3_0_0 -)
	typedef Q_ULONG Offset;
%End

	QIODevice();

	int flags() const;
	int mode() const;
	int state() const;
	bool isDirectAccess() const;
	bool isSequentialAccess() const;
	bool isCombinedAccess() const;
	bool isBuffered() const;
	bool isRaw() const;
	bool isSynchronous() const;
	bool isAsynchronous() const;
	bool isTranslated() const;
	bool isReadable() const;
	bool isWritable() const;
	bool isReadWrite() const;
	bool isInactive() const;
	bool isOpen() const;

	int status() const;
	void resetStatus();

	virtual bool open(int) = 0 /ReleaseGIL/;
	virtual void close() = 0;
	virtual void flush() = 0 /ReleaseGIL/;

%If (- Qt_3_0_0)
	virtual uint size() const = 0;
	virtual int at() const;
	virtual bool at(int);
%End
%If (Qt_3_0_0 -)
	virtual Offset size() const = 0;
	virtual Offset at() const;
	virtual bool at(Offset);
%End
	virtual bool atEnd() const;
	bool reset();

%If (- Qt_3_0_0)
	virtual SIP_PYOBJECT readBlock(uint) = 0 /ReleaseGIL/ [int (char *,uint)];
%MethodCode
		char *buf;

		if ((buf = (char *)sipMalloc(a0)) == NULL)
			sipIsErr = 1;
		else
		{
			int actlen;

			Py_BEGIN_ALLOW_THREADS
			actlen = sipCpp -> readBlock(buf,a0);
			Py_END_ALLOW_THREADS

			if (actlen < 0)
			{
				sipFree((ANY *)buf);

				Py_INCREF(Py_None);
				sipRes = Py_None;
			}
			else
			{
				sipRes = PyString_FromStringAndSize(buf,actlen);

				sipFree((ANY *)buf);

				if (sipRes == NULL)
					sipIsErr = 1;
			}
		}
%End
%VirtualCatcherCode
		PyObject *result = sipCallMethod(&sipIsErr,sipMethod,"i",a1);

		if (result != NULL)
		{
			PyObject *buf;

			sipParseResult(&sipIsErr,sipMethod,result,"O",&buf);

			if (buf == Py_None)
				sipRes = -1;
			else if (!PyString_Check(buf))
			{
				sipBadCatcherResult(sipMethod);
				sipIsErr = 1;
			}
			else
			{
				memcpy(a0,PyString_AS_STRING(buf),PyString_GET_SIZE(buf));
				sipRes = PyString_GET_SIZE(buf);
			}

			Py_DECREF(buf);
			Py_DECREF(result);
		}
%End
%End
%If (Qt_3_0_0 -)
	virtual SIP_PYOBJECT readBlock(Q_ULONG) = 0 /ReleaseGIL/ [Q_LONG (char *,Q_ULONG)];
%MethodCode
		char *buf;

		if ((buf = (char *)sipMalloc(a0)) == NULL)
			sipIsErr = 1;
		else
		{
			Q_LONG actlen;

			Py_BEGIN_ALLOW_THREADS
			actlen = sipCpp -> readBlock(buf,a0);
			Py_END_ALLOW_THREADS

			if (actlen < 0)
			{
				sipFree((ANY *)buf);

				Py_INCREF(Py_None);
				sipRes = Py_None;
			}
			else
			{
				sipRes = PyString_FromStringAndSize(buf,actlen);

				sipFree((ANY *)buf);

				if (sipRes == NULL)
					sipIsErr = 1;
			}
		}
%End
%VirtualCatcherCode
		PyObject *result = sipCallMethod(&sipIsErr,sipMethod,"l",a1);

		if (result != NULL)
		{
			PyObject *buf;

			sipParseResult(&sipIsErr,sipMethod,result,"O",&buf);

			if (buf == Py_None)
				sipRes = -1L;
			else if (!PyString_Check(buf))
			{
				sipBadCatcherResult(sipMethod);
				sipIsErr = 1;
			}
			else
			{
				memcpy(a0,PyString_AS_STRING(buf),PyString_GET_SIZE(buf));
				sipRes = PyString_GET_SIZE(buf);
			}

			Py_DECREF(buf);
			Py_DECREF(result);
		}
%End
%End

%If (- Qt_3_0_0)
	virtual int writeBlock(const char * /Array/,
			       uint /ArraySize/) = 0 /ReleaseGIL/;
%End
%If (Qt_3_0_0 -)
	virtual Q_LONG writeBlock(const char * /Array/,
				  Q_ULONG /ArraySize/) = 0 /ReleaseGIL/;
%End

%If (- Qt_3_0_0)
	virtual SIP_PYOBJECT readLine(uint) /ReleaseGIL/ [int (char *,uint)];
%MethodCode
		char *buf;

		if ((buf = (char *)sipMalloc(a0)) == NULL)
			sipIsErr = 1;
		else
		{
			int actlen;

			Py_BEGIN_ALLOW_THREADS
			actlen = sipSelfWasArg ? sipCpp->QIODevice::readLine(buf, a0) : sipCpp->readLine(buf, a0);
			Py_END_ALLOW_THREADS

			if (actlen < 0)
			{
				sipFree((ANY *)buf);

				Py_INCREF(Py_None);
				sipRes = Py_None;
			}
			else
			{
				sipRes = PyString_FromStringAndSize(buf,actlen);

				sipFree((ANY *)buf);

				if (sipRes == NULL)
					sipIsErr = 1;
			}
		}
%End
%VirtualCatcherCode
		PyObject *result = sipCallMethod(&sipIsErr,sipMethod,"i",a1);

		if (result != NULL)
		{
			PyObject *buf;

			sipParseResult(&sipIsErr,sipMethod,result,"O",&buf);

			if (buf == Py_None)
				sipRes = -1;
			else if (!PyString_Check(buf))
			{
				sipBadCatcherResult(sipMethod);
				sipIsErr = 1;
			}
			else
			{
				memcpy(a0,PyString_AS_STRING(buf),PyString_GET_SIZE(buf));
				sipRes = PyString_GET_SIZE(buf);
			}

			Py_DECREF(buf);
			Py_DECREF(result);
		}
%End
%End
%If (Qt_3_0_0 -)
	virtual SIP_PYOBJECT readLine(Q_ULONG) /ReleaseGIL/ [Q_LONG (char *,Q_ULONG)];
%MethodCode
		char *buf;

		if ((buf = (char *)sipMalloc(a0)) == NULL)
			sipIsErr = 1;
		else
		{
			Q_LONG actlen;

			Py_BEGIN_ALLOW_THREADS
			actlen = sipSelfWasArg ? sipCpp->QIODevice::readLine(buf, a0) : sipCpp->readLine(buf, a0);
			Py_END_ALLOW_THREADS

			if (actlen < 0)
			{
				sipFree((ANY *)buf);

				Py_INCREF(Py_None);
				sipRes = Py_None;
			}
			else
			{
				sipRes = PyString_FromStringAndSize(buf,actlen);

				sipFree((ANY *)buf);

				if (sipRes == NULL)
					sipIsErr = 1;
			}
		}
%End
%VirtualCatcherCode
		PyObject *result = sipCallMethod(&sipIsErr,sipMethod,"l",a1);

		if (result != NULL)
		{
			PyObject *buf;

			sipParseResult(&sipIsErr,sipMethod,result,"O",&buf);

			if (buf == Py_None)
				sipRes = -1L;
			else if (!PyString_Check(buf))
			{
				sipBadCatcherResult(sipMethod);
				sipIsErr = 1;
			}
			else
			{
				memcpy(a0,PyString_AS_STRING(buf),PyString_GET_SIZE(buf));
				sipRes = PyString_GET_SIZE(buf);
			}

			Py_DECREF(buf);
			Py_DECREF(result);
		}
%End
%End

%If (Qt_2_00 - Qt_3_0_0)
	int writeBlock(const QByteArray &) /ReleaseGIL/;
%End
%If (Qt_3_0_0 -)
	Q_LONG writeBlock(const QByteArray &) /ReleaseGIL/;
%End

%If (Qt_2_00 - Qt_3_0_0)
	QByteArray readAll() /ReleaseGIL/;
%End
%If (Qt_3_0_0 -)
	virtual QByteArray readAll() /ReleaseGIL/;
%End

	virtual int getch() = 0 /ReleaseGIL/;
	virtual int putch(int) = 0 /ReleaseGIL/;
	virtual int ungetch(int) = 0;

protected:
	void setFlags(int);
	void setType(int);
	void setMode(int);
	void setState(int);
	void setStatus(int);

private:
	QIODevice(const QIODevice &);
};
