// This is the SIP interface definition for QSocketDevice.
//
// 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>QSocketDevice (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>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 QSocketDevice : QIODevice
{
%TypeHeaderCode
#include <qsocketdevice.h>
%End

public:
	enum Type {
		Stream,
		Datagram
	};

%If (Qt_3_3_0 -)
	enum Protocol {
		IPv4,
		IPv6,
		Unknown
	};
%End

	QSocketDevice(Type = Stream);
%If (Qt_3_3_0 -)
	QSocketDevice(Type,Protocol,int);
%End
	QSocketDevice(int,Type);

	bool isValid() const;
	Type type() const;
%If (Qt_3_3_0 -)
	Protocol protocol() const;
%End

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

	bool open(int) /ReleaseGIL/;
	void close();
	void flush() /ReleaseGIL/;

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

	bool blocking() const;
	virtual void setBlocking(bool);

	bool addressReusable() const;
	virtual void setAddressReusable(bool);

	int receiveBufferSize() const;
	virtual void setReceiveBufferSize(uint);
	int sendBufferSize() const;
	virtual void setSendBufferSize(uint);

	virtual bool connect(const QHostAddress &,Q_UINT16);

	virtual bool bind(const QHostAddress &,Q_UINT16);
	virtual bool listen(int);
	virtual int accept();

%If (- Qt_3_0_0)
	int bytesAvailable() const;
	int waitForMore(int) const /ReleaseGIL/;
%End
%If (Qt_3_0_0 -)
	Q_LONG bytesAvailable() const;
	Q_LONG waitForMore(int) const /ReleaseGIL/;
%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->QSocketDevice::readBlock(buf, a0) : sipCpp->readBlock(buf, a0);
			Py_END_ALLOW_THREADS

			if (actlen < 0)
			{
				Py_INCREF(Py_None);
				sipRes = Py_None;
			}
			else if ((sipRes = PyString_FromStringAndSize(buf,actlen)) == NULL)
				sipIsErr = 1;

			sipFree((ANY *)buf);
		}
%End

	int writeBlock(const char * /Array/,uint /ArraySize/) /ReleaseGIL/;
	virtual int writeBlock(const char * /Array/,uint /ArraySize/,
			       const QHostAddress &,Q_UINT16) /ReleaseGIL/;
%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->QSocketDevice::readBlock(buf, a0) : sipCpp->readBlock(buf, a0);
			Py_END_ALLOW_THREADS

			if (actlen < 0)
			{
				Py_INCREF(Py_None);
				sipRes = Py_None;
			}
			else if ((sipRes = PyString_FromStringAndSize(buf,actlen)) == NULL)
				sipIsErr = 1;

			sipFree((ANY *)buf);
		}
%End


	Q_LONG writeBlock(const char * /Array/,
			  Q_ULONG /ArraySize/) /ReleaseGIL/;
	virtual Q_LONG writeBlock(const char * /Array/,Q_ULONG /ArraySize/,
				  const QHostAddress &,Q_UINT16) /ReleaseGIL/;
%End

	int getch();
	int putch(int);
	int ungetch(int);

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

	enum Error {
		NoError,
		AlreadyBound,
		Inaccessible,
		NoResources,
		Bug,
		Impossible,
		NoFiles,
		ConnectionRefused,
		NetworkFailure,
		UnknownError
	};

	Error error() const;

protected:
	void setError(Error);

private:
	QSocketDevice(const QSocketDevice &);
};

%End
