33 #include "private/ArnServerRemote_p.hpp" 46 : QObject( arnServerRemote)
48 _arnServerSession = arnServerSession;
49 _arnServerRemote = arnServerRemote;
53 QTcpSocket* socket = _arnServerSession->
socket();
54 QHostAddress remAddr = socket->peerAddress();
55 quint32 remAddrV4 = remAddr.toIPv4Address();
57 remAddr = QHostAddress( remAddrV4);
59 QString remIp = remAddr.toString();
60 QString remIpPort = remIp +
":" + QString::number( socket->peerPort());
66 _clientHostName = remIpPort;
69 connect( _arnServerSession, SIGNAL(infoReceived(
int)),
this, SLOT(onInfoReceived(
int)));
70 connect( _arnServerSession, SIGNAL(loginCompleted()),
this, SLOT(onLoginCompleted()));
71 connect( _arnServerSession, SIGNAL(destroyed(QObject*)), SLOT(shutdown()));
73 int lookupId = QHostInfo::lookupHost( remIp,
this, SLOT(onIpLookup(QHostInfo)));
76 _timerPoll =
new QTimer(
this);
77 _timerPoll->start( 1000);
78 connect( _timerPoll, SIGNAL(timeout()),
this, SLOT(doPoll()));
80 _arnTraffic.
open( _sessionPath +
"Traffic/value");
81 _arnTrafficIn.
open( _sessionPath +
"Traffic/In/value");
82 _arnTrafficOut.
open( _sessionPath +
"Traffic/Out/value");
84 _arnKill.
open( _sessionPath +
"Kill/value");
86 ArnM::setValue( _sessionPath +
"Kill/set", KillMode::txt().getEnumSet());
87 connect( &_arnKill, SIGNAL(changed()),
this, SLOT(doKillChanged()));
90 _arnChatPv.
open( _sessionPath +
"Chat!");
91 connect( &_arnChatPv, SIGNAL(changed(QString)),
this, SLOT(doChatAdd(QString)));
95 connect( &_arnChatAllPv, SIGNAL(changed(QString)),
this, SLOT(doChatAdd(QString)));
97 connect( _arnServerSession, SIGNAL(messageReceived(
int,QByteArray)),
98 this, SLOT(onMessageReceived(
int,QByteArray)));
100 _startTime = QDateTime::currentDateTimeUtc();
101 _arnUpTime.
open( _sessionPath +
"UpTime/value");
102 ArnM::setValue( _sessionPath +
"UpTime/property",
"prec=2 unit=h");
106 void ArnServerRemoteSession::updateSessionValue()
108 if (_sessionPath.isNull())
return;
110 _sessionValue = _clientUserName.isEmpty() ? _clientAgent : _clientUserName;
111 if (!_clientHostName.isEmpty()) {
112 if (!_sessionValue.isEmpty())
113 _sessionValue +=
" ";
114 _sessionValue +=
"@ " + _clientHostName;
120 void ArnServerRemoteSession::onInfoReceived(
int type)
122 if (_sessionPath.isNull())
return;
125 case ArnSync::InfoType::WhoIAm:
130 updateSessionValue();
131 for (
int i = 0; i < wimXsm.
size(); ++i) {
141 void ArnServerRemoteSession::onLoginCompleted()
143 if (_sessionPath.isNull())
return;
149 void ArnServerRemoteSession::onIpLookup(
const QHostInfo& host)
151 if (_sessionPath.isNull())
return;
153 if (host.error() == QHostInfo::NoError) {
154 _clientHostName = host.hostName();
155 updateSessionValue();
156 ArnM::setValue( _sessionPath +
"HostName/value", _clientHostName);
159 qDebug() <<
"ServerRemoteSession Lookup failed:" << host.errorString();
164 void ArnServerRemoteSession::doKillChanged()
166 if (_sessionPath.isNull())
return;
185 if (_killCountdown > 0) {
186 txt = QString(
"Arn Connection kill countdown started (%1 sec)").arg( _killCountdown);
189 txt =
"Arn Connection kill Aborted at server";
192 _arnChatAllPv = _sessionValue +
": " + txt;
193 _arnServerSession->
sendMessage( ArnSync::MessageType::ChatPrio, txt.toUtf8());
197 void ArnServerRemoteSession::doPoll()
199 if (_sessionPath.isNull())
return;
201 if (_killCountdown > 0) {
205 if ((_killCountdown % 5 == 0) || (_killCountdown < 10)) {
206 txt = QString(
"Arn Connection kill in %1 sec.").arg( _killCountdown);
208 _arnServerSession->
sendMessage( ArnSync::MessageType::ChatPrio, txt.toUtf8());
210 if (_killCountdown == 0) {
211 txt =
"Arn Connection kill Request from server";
213 _arnChatAllPv = _sessionValue +
": " + txt;
214 _arnServerSession->
sendMessage( ArnSync::MessageType::ChatPrio, txt.toUtf8());
215 _arnServerSession->
sendMessage( ArnSync::MessageType::KillRequest);
219 if (_pollCount % 5 == 0) {
221 ARNREAL upTime =
ARNREAL( _startTime.secsTo( QDateTime::currentDateTimeUtc())) / 3600.;
227 bool isOk = _arnServerSession->
getTraffic( trafficIn, trafficOut);
229 _arnTraffic.
setValue( trafficIn + trafficOut);
231 _arnTrafficOut.
setValue( trafficOut);
239 void ArnServerRemoteSession::doChatAdd(
const QString& txt)
241 if (_sessionPath.isNull())
return;
243 _arnServerSession->
sendMessage( ArnSync::MessageType::ChatNormal, txt.toUtf8());
247 void ArnServerRemoteSession::onMessageReceived(
int type,
const QByteArray& data)
249 if (_sessionPath.isNull())
return;
257 case ArnSync::MessageType::KillRequest:
260 case ArnSync::MessageType::AbortKillRequest:
262 txt =
"Arn Connection kill Abort request from client";
264 _arnChatAllPv = _sessionValue +
": " + txt;
268 case ArnSync::MessageType::ChatPrio:
270 case ArnSync::MessageType::ChatNormal:
272 _arnChatPv =
"Client ==>" + QString::fromUtf8( data.constData(), data.size());
273 _arnChatAllPv = _sessionValue +
" ==>" + QString::fromUtf8( data.constData(), data.size());
282 void ArnServerRemoteSession::shutdown()
285 _sessionPath = QString();
291 ArnServerRemotePrivate::ArnServerRemotePrivate()
293 _arnServer = arnNullptr;
299 ArnServerRemotePrivate::~ArnServerRemotePrivate()
305 void ArnServerRemote::init()
312 , d_ptr( new ArnServerRemotePrivate)
336 if (!arnServer)
return;
338 d->_arnServer = arnServer;
339 connect( arnServer, SIGNAL(newSession()),
this, SLOT(onNewSession()));
341 d->_timerPoll.start(5000);
342 connect( &d->_timerPoll, SIGNAL(timeout()),
this, SLOT(doPoll()));
344 d->_startTime = QDateTime::currentDateTimeUtc();
352 void ArnServerRemote::onNewSession()
357 d->_arnSessionCount = d->_sessionCount;
359 d->_arnSessionNum = d->_sessionNum;
361 Q_ASSERT(d->_arnServer);
365 connect( serverSession, SIGNAL(destroyed(QObject*)), SLOT(onDelSession(QObject*)));
369 void ArnServerRemote::onDelSession( QObject* sessionObj)
376 d->_arnSessionNum = d->_sessionNum;
380 void ArnServerRemote::doPoll()
384 ARNREAL upTime =
ARNREAL( d->_startTime.secsTo( QDateTime::currentDateTimeUtc())) / 3600.;
385 d->_arnUpTime.setValue( upTime);
void setValue(const ArnBasicItem &other, int ignoreSame=Arn::SameValue::DefaultAction)
static void setValue(const QString &path, int value)
Assign an integer to an Arn Data Object at path
Arn::XStringMap remoteWhoIAm() const
QTcpSocket * socket() const
bool open(const QString &path)
Open a handle to an Arn Data Object
Class for making an Arn Server.
ArnItem & setPipeMode()
Set general mode as Pipe for this Arn Data Object
Container class with string representation for serialized data.
bool getTraffic(quint64 &in, quint64 &out) const
ArnServerRemoteSession(ArnServerSession *arnServerSession, ArnServerRemote *arnServerRemote)
QByteArray value(int i, const char *def=arnNullptr) const
bool open(const QString &path)
Open a handle to an Arn Data Object
void startUseServer(ArnServer *arnServer)
Start making remote control objects for the ArnServer.
ArnServerRemoteSessionKillMode KillMode
QString valueString(int i, const QString &def=QString()) const
QByteArray key(int i, const char *def=arnNullptr) const
Class for remote controlling an Arn Server.
const QString pathServerSessions
QString loginUserName() const
Convenience, allow read & write.
static void destroyLink(const QString &path, bool isGlobal=true)
Destroy the Arn Data Object at path
int toInt(bool *isOk=arnNullptr) const
void sendMessage(int type, const QByteArray &data=QByteArray())
ArnServerRemote(QObject *parent=arnNullptr)
Arn::Allow getAllow() const