// This is the SIP interface definition for TQSocket.
//
// 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>TQSocket (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>Py_None</Literal> is returned.
</Para>
 
<FuncSynopsis>
	<FuncDef>TQ_LONG <Function>readLine</Function></FuncDef>
	<ParamDef>char *<Parameter>data</Parameter></ParamDef>
	<ParamDef>TQ_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>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 TQSocket : TQObject, TQIODevice
{
%TypeHeaderCode
#include <tqsocket.h>
%End

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

	TQSocket(TQObject * /TransferThis/ = 0,const char * = 0);

	enum State {
		Idle,
		HostLookup,
		Connecting,
		Connected,
		Closing,
		Connection
	};

%ConvertToSubClassCode
	static struct class_graph {
		const char *name;
		sipWrapperType **type;
		int yes, no;
	} graph[] = {
		{sipName_TQServerSocket,	&sipClass_TQServerSocket,	-1, 1},
		{sipName_TQSocket,	&sipClass_TQSocket,		-1, 2},
		{sipName_TQFtp,		&sipClass_TQFtp,			-1, 3},
		{sipName_TQLocalFs,	&sipClass_TQLocalFs,		-1, 4},
		{sipName_TQHttp,		&sipClass_TQHttp,		-1, 5},
		{sipName_TQDns,		&sipClass_TQDns,			-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);

	TQSocketDevice *socketDevice();
	virtual void setSocketDevice(TQSocketDevice *);

%If (TQt_DNS)
	virtual void connectToHost(const TQString &,TQ_UINT16) /ReleaseGIL/;
%End
	TQString peerName() const;

	bool open(int) /ReleaseGIL/;
	void close() /ReleaseGIL/;
	void flush() /ReleaseGIL/;
	Offset size() const;
	Offset at() const;
	bool at(Offset);
	bool atEnd() const;

	TQ_ULONG bytesAvailable() const;
	TQ_ULONG waitForMore(int) const /ReleaseGIL/;
	//TQ_ULONG waitForMore(int,bool *) const /ReleaseGIL/;
	TQ_ULONG bytesToWrite() const;
	void clearPendingData();

	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->TQSocket::readBlock(buf, a0) : sipCpp->readBlock(buf, a0);
			Py_END_ALLOW_THREADS

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

	TQ_LONG writeBlock(const char * /Array/,
			  TQ_ULONG /ArraySize/) /ReleaseGIL/;

	SIP_PYOBJECT readLine(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 = sipCpp -> readLine(buf,a0);
			Py_END_ALLOW_THREADS

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

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

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

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

	void setReadBufferSize(TQ_ULONG);
	TQ_ULONG readBufferSize() const;

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

protected:

private:
	TQSocket(const TQSocket &);
};
