// This is the SIP interface definition for TQSocketDevice.
//
// Copyright (c) 2007
// 	Riverbank Computing Limited <info@riverbankcomputing.co.uk>
// 
// This file is part of PyTQt.
// 
// This copy of PyTQt 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.
// 
// PyTQt 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
// PyTQt; 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>TQSocketDevice (TQt v2.2+)</Title>
<FuncSynopsis>
        <FuncDef>TQ_LONG <Function>readBlock</Function></FuncDef>
        <ParamDef>char *<Parameter>data</Parameter></ParamDef>
        <ParamDef>TQ_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>TQ_LONG <Function>writeBlock</Function></FuncDef>
        <ParamDef>const char *<Parameter>data</Parameter></ParamDef>
        <ParamDef>TQ_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


class TQSocketDevice : TQIODevice
{
%TypeHeaderCode
#include <tqsocketdevice.h>
%End

public:
	enum Type {
		Stream,
		Datagram
	};

	enum Protocol {
		IPv4,
		IPv6,
		Unknown
	};

	TQSocketDevice(Type = Stream);
	TQSocketDevice(Type,Protocol,int);
	TQSocketDevice(int,Type);

	bool isValid() const;
	Type type() const;
	Protocol protocol() const;

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

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

	Offset size() const;
	Offset at() const;
	bool at(Offset);
	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 TQHostAddress &,TQ_UINT16);

	virtual bool bind(const TQHostAddress &,TQ_UINT16);
	virtual bool listen(int);
	virtual int accept();

	TQ_LONG bytesAvailable() const;
	TQ_LONG waitForMore(int) const /ReleaseGIL/;

	SIP_PYOBJECT readBlock(TQ_ULONG) /ReleaseGIL/ [TQ_LONG (char *,TQ_ULONG)];
%MethodCode
		char *buf;

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

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

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

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


	TQ_LONG writeBlock(const char * /Array/,
			  TQ_ULONG /ArraySize/) /ReleaseGIL/;
	virtual TQ_LONG writeBlock(const char * /Array/,TQ_ULONG /ArraySize/,
				  const TQHostAddress &,TQ_UINT16) /ReleaseGIL/;

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

	TQ_UINT16 port() const;
	TQ_UINT16 peerPort() const;
	TQHostAddress address() const;
	TQHostAddress peerAddress() const;

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

	Error error() const;

protected:
	void setError(Error);

private:
	TQSocketDevice(const TQSocketDevice &);
};
