29 #include <sys/types.h>
30 #include <sys/signal.h>
41 #include "kio/connection.h"
44 #include <tqsocketnotifier.h>
57 tasks.setAutoDelete(
true);
60 Connection::~Connection()
69 notifier->setEnabled(
false);
76 notifier->setEnabled(
true);
100 if (!
inited() || tasks.count() > 0) {
101 Task *task =
new Task();
110 void Connection::dequeue()
115 while (tasks.count())
118 Task *task = tasks.take();
119 sendnow( task->cmd, task->data );
128 #ifdef Q_OS_UNIX //TODO: not yet available on WIN32
131 fd_in = socket->socket();
132 f_out = KDE_fdopen( socket->socket(),
"wb" );
134 if (receiver && ( fd_in != -1 )) {
135 notifier =
new TQSocketNotifier(fd_in, TQSocketNotifier::Read);
139 TQObject::connect(notifier, TQT_SIGNAL(activated(
int)), receiver, member);
149 f_out = KDE_fdopen( fd_out,
"wb" );
150 if (receiver && ( fd_in != -1 )) {
151 notifier =
new TQSocketNotifier(fd_in, TQSocketNotifier::Read);
155 TQObject::connect(notifier, TQT_SIGNAL(activated(
int)), receiver, member);
161 void Connection::connect(TQObject *_receiver,
const char *_member)
163 receiver = _receiver;
167 if (receiver && (fd_in != -1 )) {
168 notifier =
new TQSocketNotifier(fd_in, TQSocketNotifier::Read);
171 TQObject::connect(notifier, TQT_SIGNAL(activated(
int)), receiver, member);
181 if (data.size() > 0xffffff)
184 static char buffer[ 64 ];
185 sprintf( buffer,
"%6x_%2x_", data.size(), _cmd );
187 size_t n = fwrite( buffer, 1, 10, f_out );
190 kdError(7017) <<
"Could not send header" << endl;
194 n = fwrite( data.data(), 1, data.size(), f_out );
196 if ( n != data.size() ) {
197 kdError(7017) <<
"Could not write data" << endl;
201 if (fflush( f_out )) {
202 kdError(7017) <<
"Could not write data" << endl;
212 kdError(7017) <<
"read: not yet inited" << endl;
216 static char buffer[ 10 ];
219 ssize_t n =
::read( fd_in, buffer, 10);
220 if ( n == -1 && errno == EINTR )
224 kdError(7017) <<
"Header read failed, errno=" << errno << endl;
229 kdError(7017) <<
"Header has invalid size (" << n <<
")" << endl;
237 while( *p ==
' ' ) p++;
238 long int len = strtol( p, 0L, 16 );
241 while( *p ==
' ' ) p++;
242 long int cmd = strtol( p, 0L, 16 );
247 size_t bytesToGo = len;
248 size_t bytesRead = 0;
250 n =
::read(fd_in, data.data()+bytesRead, bytesToGo);
255 kdError(7017) <<
"Data read failed, errno=" << errno << endl;
259 kdError(7017) <<
"Connection ended unexpectedly (" << n <<
"/" << bytesToGo <<
")" << endl;
273 #include "connection.moc"