// This is the SIP interface definition for QSocket.
//
// 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>QSocket (Qt v2.2+)</Title>
<FuncSynopsis>
	<FuncDef>Q_LONG <Function>readBlock</Function></FuncDef>
	<ParamDef>char *<Parameter>data</Parameter></ParamDef>
	<ParamDef>Q_ULONG <Parameter>len</Parameter></ParamDef>
</FuncSynopsis>
<Para>
This takes a single <Literal>len</Literal> parameter.  The
<Literal>data</Literal> is returned if there was no error, otherwise
<Literal>Py_None</Literal> is returned.
</Para>
 
<FuncSynopsis>
	<FuncDef>Q_LONG <Function>readLine</Function></FuncDef>
	<ParamDef>char *<Parameter>data</Parameter></ParamDef>
	<ParamDef>Q_ULONG <Parameter>maxlen</Parameter></ParamDef>
</FuncSynopsis>
<Para>
This takes a single <Literal>maxlen</Literal> parameter.  The
<Literal>data</Literal> is returned if there was no error, otherwise
<Literal>Py_None</Literal> is returned.
</Para>
 
<FuncSynopsis>
	<FuncDef>Q_LONG <Function>writeBlock</Function></FuncDef>
	<ParamDef>const char *<Parameter>data</Parameter></ParamDef>
	<ParamDef>Q_ULONG <Parameter>len</Parameter></ParamDef>
</FuncSynopsis>
<Para>
<Literal>len</Literal> is derived from <Literal>data</Literal> and not passed
as a parameter.
</Para>
</Sect2>
%End
 

%If (Qt_2_2_0 -)

class QSocket : QObject, QIODevice
{
%TypeHeaderCode
#include <qsocket.h>
%End

public:
	enum Error {
		ErrConnectionRefused,
		ErrHostNotFound,
		ErrSocketRead
	};

	QSocket(QObject * /TransferThis/ = 0,const char * = 0);

	enum State {
		Idle,
		HostLookup,
		Connecting,
%If (Qt_3_0_0 -)
		Connected,
%End
%If (- Qt_3_0_0)
		Listening,
%End
		Closing,
		Connection
	};

%ConvertToSubClassCode
	static struct class_graph {
		const char *name;
		sipWrapperType **type;
		int yes, no;
	} graph[] = {
		{sipName_QServerSocket,	&sipClass_QServerSocket,	-1, 1},
		{sipName_QSocket,	&sipClass_QSocket,		-1, 2},
		{sipName_QFtp,		&sipClass_QFtp,			-1, 3},
		{sipName_QLocalFs,	&sipClass_QLocalFs,		-1, 4},
#if QT_VERSION >= 0x030000
		{sipName_QHttp,		&sipClass_QHttp,		-1, 5},
#else
		{NULL,			NULL,				-1, 5},
#endif
		{sipName_QDns,		&sipClass_QDns,			-1, -1},
	};

	int i = 0;

	sipClass = NULL;

	do
	{
		struct class_graph *cg = &graph[i];

		if (cg->name != NULL && sipCpp->inherits(cg->name))
		{
			sipClass = *cg->type;
			i = cg->yes;
		}
		else
			i = cg->no;
	}
	while (i >= 0);
%End

	State state() const;

	int socket() const;
	virtual void setSocket(int);

%If (Qt_3_0_0 -)
	QSocketDevice *socketDevice();
	virtual void setSocketDevice(QSocketDevice *);
%End

%If (Qt_DNS)
	virtual void connectToHost(const QString &,Q_UINT16) /ReleaseGIL/;
%End
	QString peerName() const;

	bool open(int) /ReleaseGIL/;
	void close() /ReleaseGIL/;
	void flush() /ReleaseGIL/;
%If (Qt_3_0_0 -)
	Offset size() const;
	Offset at() const;
	bool at(Offset);
%End
%If (- Qt_3_0_0)
	uint size() const;
	int at() const;
	bool at(int);
%End
	bool atEnd() const;

%If (Qt_3_0_0 -)
	Q_ULONG bytesAvailable() const;
	Q_ULONG waitForMore(int) const /ReleaseGIL/;
	//Q_ULONG waitForMore(int,bool *) const /ReleaseGIL/;
	Q_ULONG bytesToWrite() const;
%End
%If (- Qt_3_0_0)
	int bytesAvailable() const;
	int waitForMore(int) const /ReleaseGIL/;
	int bytesToWrite() const;
%End
%If (Qt_3_1_0 -)
	void clearPendingData();
%End

%If (- Qt_3_0_0)
	SIP_PYOBJECT readBlock(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->QSocket::readBlock(buf, a0) : 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

	int writeBlock(const char * /Array/,uint /ArraySize/) /ReleaseGIL/;

	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 = 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
%End
%If (Qt_3_0_0 -)
	SIP_PYOBJECT readBlock(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->QSocket::readBlock(buf, a0) : 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

	Q_LONG writeBlock(const char * /Array/,
			  Q_ULONG /ArraySize/) /ReleaseGIL/;

	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 = 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
%End

	int getch() /ReleaseGIL/;
	int putch(int) /ReleaseGIL/;
	int ungetch(int);

	bool canReadLine() const;
	virtual QString readLine() /ReleaseGIL/;

	Q_UINT16 port() const;
	Q_UINT16 peerPort() const;
	QHostAddress address() const;
	QHostAddress peerAddress() const;

%If (Qt_3_2_0 -)
	void setReadBufferSize(Q_ULONG);
	Q_ULONG readBufferSize() const;
%End

signals:
	void hostFound();
	void connected();
	void connectionClosed();
	void delayedCloseFinished();
	void readyRead();
	void bytesWritten(int);
	void error(int);

protected:
%If (- Qt_3_0_0)
	QSocketDevice *socketDevice();
%End

private:
	QSocket(const QSocket &);
};

%End
