26
#include<qguardedptr.h>
27
#include"safedelete.h"
22
#include <QHostAddress>
27
//#include "safedelete.h"
31
#include"srvresolver.h"
31
#include "srvresolver.h"
37
39
#define READBUFSIZE 65536
39
41
// CS_NAMESPACE_BEGIN
43
class QTcpSocketSignalRelay : public QObject
47
QTcpSocketSignalRelay(QTcpSocket *sock, QObject *parent = 0)
50
qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError");
51
connect(sock, SIGNAL(hostFound()), SLOT(sock_hostFound()), Qt::QueuedConnection);
52
connect(sock, SIGNAL(connected()), SLOT(sock_connected()), Qt::QueuedConnection);
53
connect(sock, SIGNAL(disconnected()), SLOT(sock_disconnected()), Qt::QueuedConnection);
54
connect(sock, SIGNAL(readyRead()), SLOT(sock_readyRead()), Qt::QueuedConnection);
55
connect(sock, SIGNAL(bytesWritten(qint64)), SLOT(sock_bytesWritten(qint64)), Qt::QueuedConnection);
56
connect(sock, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(sock_error(QAbstractSocket::SocketError)), Qt::QueuedConnection);
64
void bytesWritten(qint64);
65
void error(QAbstractSocket::SocketError);
78
void sock_disconnected()
88
void sock_bytesWritten(qint64 x)
93
void sock_error(QAbstractSocket::SocketError x)
41
99
class BSocket::Private
109
QTcpSocketSignalRelay *qsock_relay;
79
139
void BSocket::reset(bool clear)
82
d->qsock->disconnect(this);
84
if(!clear && d->qsock->isOpen()) {
142
delete d->qsock_relay;
145
/*d->qsock->disconnect(this);
147
if(!clear && d->qsock->isOpen() && d->qsock->isValid()) {*/
85
148
// move remaining into the local queue
86
QByteArray block(d->qsock->bytesAvailable());
87
d->qsock->readBlock(block.data(), block.size());
149
QByteArray block(d->qsock->bytesAvailable(), 0);
150
d->qsock->read(block.data(), block.size());
88
151
appendRead(block);
91
d->sd.deleteLater(d->qsock);
154
//d->sd.deleteLater(d->qsock);
108
172
void BSocket::ensureSocket()
111
d->qsock = new QSocket;
175
d->qsock = new QTcpSocket;
112
176
#if QT_VERSION >= 0x030200
113
177
d->qsock->setReadBufferSize(READBUFSIZE);
115
connect(d->qsock, SIGNAL(hostFound()), SLOT(qs_hostFound()));
116
connect(d->qsock, SIGNAL(connected()), SLOT(qs_connected()));
117
connect(d->qsock, SIGNAL(connectionClosed()), SLOT(qs_connectionClosed()));
118
connect(d->qsock, SIGNAL(delayedCloseFinished()), SLOT(qs_delayedCloseFinished()));
119
connect(d->qsock, SIGNAL(readyRead()), SLOT(qs_readyRead()));
120
connect(d->qsock, SIGNAL(bytesWritten(int)), SLOT(qs_bytesWritten(int)));
121
connect(d->qsock, SIGNAL(error(int)), SLOT(qs_error(int)));
179
d->qsock_relay = new QTcpSocketSignalRelay(d->qsock);
180
connect(d->qsock_relay, SIGNAL(hostFound()), SLOT(qs_hostFound()));
181
connect(d->qsock_relay, SIGNAL(connected()), SLOT(qs_connected()));
182
connect(d->qsock_relay, SIGNAL(disconnected()), SLOT(qs_closed()));
183
connect(d->qsock_relay, SIGNAL(readyRead()), SLOT(qs_readyRead()));
184
connect(d->qsock_relay, SIGNAL(bytesWritten(qint64)), SLOT(qs_bytesWritten(qint64)));
185
connect(d->qsock_relay, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(qs_error(QAbstractSocket::SocketError)));
125
void BSocket::connectToHost(const QString &host, Q_UINT16 port)
189
void BSocket::connectToHost(const QString &host, quint16 port)
193
257
if(d->state != Connected)
197
cs.resize(a.size()+1);
198
memcpy(cs.data(), a.data(), a.size());
199
QString s = QString::fromUtf8(cs);
200
fprintf(stderr, "BSocket: writing [%d]: {%s}\n", a.size(), cs.data());
260
QString s = QString::fromUtf8(a);
261
fprintf(stderr, "BSocket: writing [%d]: {%s}\n", a.size(), s.latin1());
202
d->qsock->writeBlock(a.data(), a.size());
263
d->qsock->write(a.data(), a.size());
205
266
QByteArray BSocket::read(int bytes)
210
271
if(bytes <= 0 || bytes > max)
212
273
block.resize(bytes);
213
d->qsock->readBlock(block.data(), block.size());
274
d->qsock->read(block.data(), block.size());
216
277
block = ByteStream::read(bytes);
220
cs.resize(block.size()+1);
221
memcpy(cs.data(), block.data(), block.size());
222
QString s = QString::fromUtf8(cs);
280
QString s = QString::fromUtf8(block);
223
281
fprintf(stderr, "BSocket: read [%d]: {%s}\n", block.size(), s.latin1());
243
301
QHostAddress BSocket::address() const
246
return d->qsock->address();
304
return d->qsock->localAddress();
248
306
return QHostAddress();
251
Q_UINT16 BSocket::port() const
309
quint16 BSocket::port() const
254
return d->qsock->port();
312
return d->qsock->localPort();
329
387
fprintf(stderr, "BSocket: Connected.\n");
331
SafeDeleteLock s(&d->sd);
389
//SafeDeleteLock s(&d->sd);
335
void BSocket::qs_connectionClosed()
338
fprintf(stderr, "BSocket: Connection Closed.\n");
340
SafeDeleteLock s(&d->sd);
345
void BSocket::qs_delayedCloseFinished()
348
fprintf(stderr, "BSocket: Delayed Close Finished.\n");
350
SafeDeleteLock s(&d->sd);
352
delayedCloseFinished();
393
void BSocket::qs_closed()
395
if(d->state == Closing)
398
fprintf(stderr, "BSocket: Delayed Close Finished.\n");
400
//SafeDeleteLock s(&d->sd);
402
delayedCloseFinished();
355
406
void BSocket::qs_readyRead()
357
SafeDeleteLock s(&d->sd);
408
//SafeDeleteLock s(&d->sd);
361
void BSocket::qs_bytesWritten(int x)
412
void BSocket::qs_bytesWritten(qint64 x64)
364
416
fprintf(stderr, "BSocket: BytesWritten [%d].\n", x);
366
SafeDeleteLock s(&d->sd);
418
//SafeDeleteLock s(&d->sd);
370
void BSocket::qs_error(int x)
422
void BSocket::qs_error(QAbstractSocket::SocketError x)
424
if(x == QTcpSocket::RemoteHostClosedError) {
426
fprintf(stderr, "BSocket: Connection Closed.\n");
428
//SafeDeleteLock s(&d->sd);
373
435
fprintf(stderr, "BSocket: Error.\n");
375
SafeDeleteLock s(&d->sd);
437
//SafeDeleteLock s(&d->sd);
377
439
// connection error during SRV host connect? try next
378
if(d->state == HostLookup && (x == QSocket::ErrConnectionRefused || x == QSocket::ErrHostNotFound)) {
440
if(d->state == HostLookup && (x == QTcpSocket::ConnectionRefusedError || x == QTcpSocket::HostNotFoundError)) {
384
if(x == QSocket::ErrConnectionRefused)
446
if(x == QTcpSocket::ConnectionRefusedError)
385
447
error(ErrConnectionRefused);
386
else if(x == QSocket::ErrHostNotFound)
448
else if(x == QTcpSocket::HostNotFoundError)
387
449
error(ErrHostNotFound);
388
else if(x == QSocket::ErrSocketRead)
454
#include "bsocket.moc"
392
456
// CS_NAMESPACE_END