84
85
class SlavePrivate {
86
bool derived; // true if this instance of Slave is actually an
87
// instance of a derived class.
89
SlavePrivate(bool derived) : derived(derived) {}
93
89
void Slave::accept()
96
91
KStreamSocket *socket = serv->accept();
97
92
slaveconn.init(socket);
99
93
serv->deleteLater();
101
95
slaveconn.connect(this, SLOT(gotInput()));
144
138
Slave::Slave(KServerSocket *socket, const QString &protocol, const QString &socketname)
145
: SlaveInterface(&slaveconn), serv(socket), contacted(false),
146
d(new SlavePrivate(false))
149
m_protocol = protocol;
150
m_slaveProtocol = protocol;
151
m_socket = socketname;
153
contact_started = time(0);
154
idle_since = contact_started;
158
serv->setAcceptBuffered(false);
159
connect(serv, SIGNAL(readyAccept()),
164
Slave::Slave(bool /*derived*/, KServerSocket *socket, const QString &protocol,
165
const QString &socketname)
166
: SlaveInterface(&slaveconn), serv(socket), contacted(false),
167
d(new SlavePrivate(true))
169
// FIXME: hmm, duplicating code here from public ctor, no good (LS)
139
: SlaveInterface(&slaveconn), serv(socket), contacted(false)
171
142
m_protocol = protocol;
172
143
m_slaveProtocol = protocol;
181
serv->setAcceptBuffered(false);
182
connect(serv, SIGNAL(readyAccept()),
151
serv->setAcceptBuffered(false);
152
connect(serv, SIGNAL(readyAccept()),
247
207
void Slave::suspend()
249
if (d->derived) { // TODO: clean up before KDE 4
250
virtual_hook(VIRTUAL_SUSPEND, 0);
254
209
slaveconn.suspend();
257
212
void Slave::resume()
259
if (d->derived) { // TODO: clean up before KDE 4
260
virtual_hook(VIRTUAL_RESUME, 0);
264
214
slaveconn.resume();
267
217
bool Slave::suspended()
269
if (d->derived) { // TODO: clean up before KDE 4
270
SuspendedParams params;
271
virtual_hook(VIRTUAL_SUSPENDED, ¶ms);
272
return params.retval;
275
219
return slaveconn.suspended();
278
222
void Slave::send(int cmd, const QByteArray &arr) {
279
if (d->derived) { // TODO: clean up before KDE 4
283
virtual_hook(VIRTUAL_SEND, ¶ms);
287
223
slaveconn.send(cmd, arr);
348
284
Slave* Slave::createSlave( const QString &protocol, const KUrl& url, int& error, QString& error_text )
350
//kDebug(7002) << "createSlave '" << protocol << "' for " << url.prettyUrl() << endl;
286
kDebug(7002) << "createSlave '" << protocol << "' for " << url.prettyUrl() << endl;
351
287
// Firstly take into account all special slaves
352
288
if (protocol == "data")
353
289
return new DataProtocol();
355
QString prefix = KStandardDirs::locateLocal("socket", KGlobal::instance()->instanceName());
356
KTempFile socketfile(prefix, QLatin1String(".slave-socket"));
357
if ( socketfile.status() != 0 )
291
// localhost could not resolved yet, this s a bug in kdecore network resolver stuff
292
// autoselect free tcp port
293
KServerSocket *kss = new KServerSocket(getenv("COMPUTERNAME"),"0");
294
kss->setFamily(KResolver::InetFamily);
296
QString sockname = kss->localAddress().serviceName();
298
QString prefix = KStandardDirs::locateLocal("socket", KGlobal::mainComponent().componentName());
299
KTemporaryFile *socketfile = new KTemporaryFile();
300
socketfile->setPrefix(prefix);
301
socketfile->setSuffix(QLatin1String(".slave-socket"));
302
if ( !socketfile->open() )
359
error_text = i18n("Unable to create io-slave: %1", strerror(errno));
360
error = KIO::ERR_CANNOT_LAUNCH_PROCESS;
304
error_text = i18n("Unable to create io-slave: %1", strerror(errno));
305
error = KIO::ERR_CANNOT_LAUNCH_PROCESS;
364
QString sockname = socketfile.name();
369
socketfile.unlink(); // can't bind if there is such a file
310
QString sockname = socketfile->fileName();
311
delete socketfile; // can't bind if there is such a file
372
313
KServerSocket *kss = new KServerSocket(QFile::encodeName(sockname));
373
314
kss->setFamily(KResolver::LocalFamily);
376
317
Slave *slave = new Slave(kss, protocol, sockname);
381
319
// WABA: if the dcopserver is running under another uid we don't ask
382
320
// klauncher for a slave, because the slave might have that other uid
391
329
if (!bForkSlaves)
393
331
// check the UID of klauncher
394
QDBusReply<uint> reply = QDBus::sessionBus().interface()->serviceUid(KToolInvocation::klauncher()->service());
332
QDBusReply<uint> reply = QDBusConnection::sessionBus().interface()->serviceUid(KToolInvocation::klauncher()->service());
395
333
if (reply.isValid() && getuid() != reply)
396
334
bForkSlaves = true;
402
341
QString _name = KProtocolInfo::exec(protocol);
432
371
org::kde::KLauncher* klauncher = KToolInvocation::klauncher();
433
372
QString errorStr;
373
qDebug() << __FUNCTION__ << protocol << " " << url.host() << " " << sockname;
434
374
QDBusReply<int> reply = klauncher->requestSlave(protocol, url.host(), sockname, errorStr);
435
375
if (!reply.isValid()) {
436
376
error_text = i18n("Cannot talk to klauncher: %1", klauncher->lastError().message() );
459
397
// Firstly take into account all special slaves
460
398
if (protocol == "data")
463
QString prefix = KStandardDirs::locateLocal("socket", KGlobal::instance()->instanceName());
464
KTempFile socketfile(prefix, QLatin1String(".slave-socket"));
465
if ( socketfile.status() != 0 )
474
KServerSocket *kss = new KServerSocket(QFile::encodeName(socketfile.name()));
476
Slave *slave = new Slave(kss, protocol, socketfile.name());
401
// localhost could not resolved yet, this s a bug in kdecore network resolver stuff
402
// autoselect free tcp port
403
KServerSocket *kss = new KServerSocket(getenv("COMPUTERNAME"),"0");
404
QString sockname = kss->localAddress().serviceName();
406
QString prefix = KStandardDirs::locateLocal("socket", KGlobal::mainComponent().componentName());
407
KTemporaryFile *socketfile = new KTemporaryFile();
408
socketfile->setPrefix(prefix);
409
socketfile->setSuffix(QLatin1String(".slave-socket"));
410
if ( !socketfile->open() ) {
415
QString sockname = socketfile->fileName();
416
delete socketfile; // can't bind if there is such a file
418
KServerSocket *kss = new KServerSocket(QFile::encodeName(sockname));
481
QDBusReply<int> reply = KToolInvocation::klauncher()->requestHoldSlave(url.url(), socketfile.name());
420
Slave *slave = new Slave(kss, protocol, sockname);
421
QDBusReply<int> reply = KToolInvocation::klauncher()->requestHoldSlave(url.url(), sockname);
482
422
if (!reply.isValid()) {
493
432
slave->setPID(pid);
494
433
QTimer::singleShot(1000*SLAVE_CONNECTION_TIMEOUT_MIN, slave, SLOT(timeout()));
499
void Slave::virtual_hook( int id, void* data ) {
500
KIO::SlaveInterface::virtual_hook( id, data );
503
437
#include "slave.moc"