mirror of
https://invent.kde.org/network/krfb
synced 2024-07-05 09:28:35 +00:00
implemented configurable SLP lifetimes in kinet
svn path=/trunk/kdenetwork/krfb/; revision=191284
This commit is contained in:
parent
bdc64b9b64
commit
38f4d170f5
2
TODO
2
TODO
|
@ -6,8 +6,6 @@ For 3.2:
|
|||
- set desktop name (username@hostname)
|
||||
- apply multi-desktop patch
|
||||
- trayicon mouse-over text
|
||||
- configurable slp lifetime in kinetd
|
||||
- slp registration refresh in kinetd when lifetime expired
|
||||
- when krfb is started with URL arguments and without connection
|
||||
quality, add some kind of smart algorithm to determine whether the
|
||||
other host is local (maybe using SLP to announce the connectivity
|
||||
|
|
|
@ -93,7 +93,8 @@ void PortListener::loadConfig(KService::Ptr s) {
|
|||
m_argument = QString::null;
|
||||
m_multiInstance = false;
|
||||
|
||||
QVariant vid, vport, vautoport, venabled, vargument, vmultiInstance, vurl, vsattributes;
|
||||
QVariant vid, vport, vautoport, venabled, vargument, vmultiInstance, vurl,
|
||||
vsattributes, vslifetime;
|
||||
|
||||
m_execPath = s->exec().utf8();
|
||||
vid = s->property("X-KDE-KINETD-id");
|
||||
|
@ -104,6 +105,7 @@ void PortListener::loadConfig(KService::Ptr s) {
|
|||
vmultiInstance = s->property("X-KDE-KINETD-multiInstance");
|
||||
vurl = s->property("X-KDE-KINETD-serviceURL");
|
||||
vsattributes = s->property("X-KDE-KINETD-serviceAttributes");
|
||||
vslifetime = s->property("X-KDE-KINETD-serviceLifetime");
|
||||
|
||||
if (!vid.isValid()) {
|
||||
kdDebug() << "Kinetd cannot load service "<<m_serviceName
|
||||
|
@ -120,6 +122,9 @@ void PortListener::loadConfig(KService::Ptr s) {
|
|||
}
|
||||
|
||||
m_serviceName = vid.toString();
|
||||
m_serviceLifetime = vslifetime.toInt();
|
||||
if (m_serviceLifetime < 120) // never less than 120 s
|
||||
m_serviceLifetime = 120;
|
||||
m_portBase = vport.toInt();
|
||||
if (vautoport.isValid())
|
||||
m_autoPortRange = vautoport.toInt();
|
||||
|
@ -143,6 +148,7 @@ void PortListener::loadConfig(KService::Ptr s) {
|
|||
else
|
||||
m_serviceAttributes = "";
|
||||
|
||||
m_slpLifetimeEnd = QDateTime::currentDateTime().addSecs(m_serviceLifetime);
|
||||
m_defaultPortBase = m_portBase;
|
||||
m_defaultAutoPortRange = m_autoPortRange;
|
||||
|
||||
|
@ -193,7 +199,7 @@ bool PortListener::isValid() {
|
|||
}
|
||||
|
||||
bool PortListener::isEnabled() {
|
||||
return m_enabled;
|
||||
return m_enabled && m_valid;
|
||||
}
|
||||
|
||||
int PortListener::port() {
|
||||
|
@ -289,19 +295,36 @@ void PortListener::setServiceRegistrationEnabledInternal(bool e) {
|
|||
m_registeredServiceURL = processServiceTemplate(m_serviceURL);
|
||||
m_serviceRegistered = m_srvreg->registerService(
|
||||
m_registeredServiceURL,
|
||||
processServiceTemplate(m_serviceAttributes));
|
||||
processServiceTemplate(m_serviceAttributes),
|
||||
m_serviceLifetime);
|
||||
if (!m_serviceRegistered)
|
||||
kdDebug(7021) << "Failure registering SLP service (no slpd running?)"<< endl;
|
||||
// make lifetime 30s shorter, because the timeout is not precise
|
||||
m_slpLifetimeEnd = QDateTime::currentDateTime().addSecs(m_serviceLifetime-30);
|
||||
} else {
|
||||
m_srvreg->unregisterService(m_registeredServiceURL);
|
||||
m_serviceRegistered = false;
|
||||
}
|
||||
}
|
||||
|
||||
void PortListener::refreshRegistration() {
|
||||
if (m_serviceRegistered && (m_slpLifetimeEnd.addSecs(-90) < QDateTime::currentDateTime())) {
|
||||
setServiceRegistrationEnabledInternal(false);
|
||||
setServiceRegistrationEnabledInternal(true);
|
||||
}
|
||||
}
|
||||
|
||||
QDateTime PortListener::expiration() {
|
||||
return m_expirationTime;
|
||||
}
|
||||
|
||||
QDateTime PortListener::serviceLifetimeEnd() {
|
||||
if (m_serviceRegistered)
|
||||
return m_slpLifetimeEnd;
|
||||
else
|
||||
return QDateTime();
|
||||
}
|
||||
|
||||
QString PortListener::name() {
|
||||
return m_serviceName;
|
||||
}
|
||||
|
@ -325,6 +348,7 @@ KInetD::KInetD(QCString &n) :
|
|||
m_portListeners.setAutoDelete(true);
|
||||
connect(&m_expirationTimer, SIGNAL(timeout()), SLOT(setExpirationTimer()));
|
||||
connect(&m_portRetryTimer, SIGNAL(timeout()), SLOT(portRetryTimer()));
|
||||
connect(&m_reregistrationTimer, SIGNAL(timeout()), SLOT(reregistrationTimer()));
|
||||
loadServiceList();
|
||||
}
|
||||
|
||||
|
@ -342,10 +366,18 @@ void KInetD::loadServiceList()
|
|||
PortListener *pl = new PortListener(s, m_config, m_srvreg);
|
||||
if (pl->isValid())
|
||||
m_portListeners.append(pl);
|
||||
else
|
||||
delete pl;
|
||||
}
|
||||
|
||||
setExpirationTimer();
|
||||
setPortRetryTimer(true);
|
||||
setReregistrationTimer();
|
||||
}
|
||||
|
||||
void KInetD::expirationTimer() {
|
||||
setExpirationTimer();
|
||||
setReregistrationTimer();
|
||||
}
|
||||
|
||||
void KInetD::setExpirationTimer() {
|
||||
|
@ -359,6 +391,42 @@ void KInetD::setExpirationTimer() {
|
|||
|
||||
void KInetD::portRetryTimer() {
|
||||
setPortRetryTimer(true);
|
||||
setReregistrationTimer();
|
||||
}
|
||||
|
||||
void KInetD::setReregistrationTimer() {
|
||||
QDateTime d;
|
||||
PortListener *pl = m_portListeners.first();
|
||||
while (pl) {
|
||||
QDateTime d2 = pl->serviceLifetimeEnd();
|
||||
if (!d2.isNull()) {
|
||||
if (d2 < QDateTime::currentDateTime()) {
|
||||
m_reregistrationTimer.start(0, true);
|
||||
return;
|
||||
}
|
||||
else if (d.isNull() || (d2 < d))
|
||||
d = d2;
|
||||
}
|
||||
pl = m_portListeners.next();
|
||||
}
|
||||
|
||||
if (!d.isNull()) {
|
||||
int s = QDateTime::currentDateTime().secsTo(d);
|
||||
if (s < 30)
|
||||
s = 30; // max frequency 30s
|
||||
m_reregistrationTimer.start(s*1000, true);
|
||||
}
|
||||
else
|
||||
m_reregistrationTimer.stop();
|
||||
}
|
||||
|
||||
void KInetD::reregistrationTimer() {
|
||||
PortListener *pl = m_portListeners.first();
|
||||
while (pl) {
|
||||
pl->refreshRegistration();
|
||||
pl = m_portListeners.next();
|
||||
}
|
||||
setReregistrationTimer();
|
||||
}
|
||||
|
||||
void KInetD::setPortRetryTimer(bool retry) {
|
||||
|
@ -366,12 +434,12 @@ void KInetD::setPortRetryTimer(bool retry) {
|
|||
|
||||
PortListener *pl = m_portListeners.first();
|
||||
while (pl) {
|
||||
if (pl->isEnabled() && (pl->port() == -1))
|
||||
if (pl->isEnabled() && (pl->port() < 0))
|
||||
if (retry) {
|
||||
if (!pl->acquirePort())
|
||||
unmappedPorts++;
|
||||
}
|
||||
else if (pl->port() == -1)
|
||||
else if (pl->port() < 0)
|
||||
unmappedPorts++;
|
||||
pl = m_portListeners.next();
|
||||
}
|
||||
|
@ -448,6 +516,7 @@ bool KInetD::setPort(QString service, int port, int autoPortRange)
|
|||
|
||||
bool s = pl->setPort(port, autoPortRange);
|
||||
setPortRetryTimer(false);
|
||||
setReregistrationTimer();
|
||||
return s;
|
||||
}
|
||||
|
||||
|
@ -465,6 +534,7 @@ void KInetD::setEnabled(QString service, bool enable)
|
|||
|
||||
pl->setEnabled(enable);
|
||||
setExpirationTimer();
|
||||
setReregistrationTimer();
|
||||
}
|
||||
|
||||
void KInetD::setEnabled(QString service, QDateTime expiration)
|
||||
|
@ -475,6 +545,7 @@ void KInetD::setEnabled(QString service, QDateTime expiration)
|
|||
|
||||
pl->setEnabled(expiration);
|
||||
setExpirationTimer();
|
||||
setReregistrationTimer();
|
||||
}
|
||||
|
||||
void KInetD::setServiceRegistrationEnabled(QString service, bool enable)
|
||||
|
@ -484,6 +555,7 @@ void KInetD::setServiceRegistrationEnabled(QString service, bool enable)
|
|||
return;
|
||||
|
||||
pl->setServiceRegistrationEnabled(enable);
|
||||
setReregistrationTimer();
|
||||
}
|
||||
|
||||
bool KInetD::isServiceRegistrationEnabled(QString service)
|
||||
|
|
|
@ -36,6 +36,7 @@ private:
|
|||
bool m_valid;
|
||||
QString m_serviceName;
|
||||
QString m_serviceURL, m_serviceAttributes, m_registeredServiceURL;
|
||||
int m_serviceLifetime;
|
||||
int m_port;
|
||||
int m_portBase, m_autoPortRange;
|
||||
int m_defaultPortBase, m_defaultAutoPortRange;
|
||||
|
@ -45,6 +46,7 @@ private:
|
|||
bool m_enabled;
|
||||
bool m_serviceRegistered, m_registerService;
|
||||
QDateTime m_expirationTime;
|
||||
QDateTime m_slpLifetimeEnd;
|
||||
|
||||
KServerSocket *m_socket;
|
||||
KProcess m_process;
|
||||
|
@ -69,10 +71,12 @@ public:
|
|||
void setServiceRegistrationEnabled(bool enabled);
|
||||
bool isServiceRegistrationEnabled();
|
||||
QDateTime expiration();
|
||||
QDateTime serviceLifetimeEnd();
|
||||
bool isEnabled();
|
||||
int port();
|
||||
QString processServiceTemplate(const QString &a);
|
||||
bool setPort(int port = -1, int autoProbeRange = 1);
|
||||
void refreshRegistration();
|
||||
|
||||
private slots:
|
||||
void accepted(KSocket*);
|
||||
|
@ -162,16 +166,20 @@ k_dcop:
|
|||
private:
|
||||
QDateTime getNextExpirationTime();
|
||||
void setPortRetryTimer(bool retry);
|
||||
void setReregistrationTimer();
|
||||
void setExpirationTimer();
|
||||
|
||||
KConfig *m_config;
|
||||
KServiceRegistry *m_srvreg;
|
||||
QPtrList<PortListener> m_portListeners;
|
||||
QTimer m_expirationTimer;
|
||||
QTimer m_portRetryTimer;
|
||||
QTimer m_reregistrationTimer;
|
||||
|
||||
private slots:
|
||||
void setExpirationTimer();
|
||||
void expirationTimer();
|
||||
void portRetryTimer();
|
||||
void reregistrationTimer();
|
||||
|
||||
public:
|
||||
KInetD(QCString &n);
|
||||
|
|
|
@ -88,3 +88,9 @@ Type=QString
|
|||
[PropertyDef::X-KDE-KINETD-serviceAttributes]
|
||||
Type=QString
|
||||
|
||||
# the lifetime of a service in seconds. kinets will renew the service
|
||||
# automatically. Max 65535, never use anything under 2 min. Something like
|
||||
# 5-20 minutes is a sane value for most desktop applications.
|
||||
[PropertyDef::X-KDE-KINETD-serviceLifetime]
|
||||
Type=int
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@ X-KDE-KINETD-argument=--kinetd
|
|||
X-KDE-KINETD-multiInstance=false
|
||||
X-KDE-KINETD-serviceURL=service:remotedesktop.kde:vnc://%h:%p;(type=shared),(username=%u),(fullname=%f)
|
||||
X-KDE-KINETD-serviceAttributes=(type=shared),(username=%u),(fullname=%f)
|
||||
X-KDE-KINETD-serviceLifetime=1200
|
||||
|
||||
Name=KRfb Desktop Sharing
|
||||
Name[bg]=Споделяне на Работно място KRfb
|
||||
|
|
Loading…
Reference in New Issue
Block a user