The branch, master has been updated via 48611f11e64cd0a26dbd92483c522b711068d0d1 (commit) from 110bbeba16404474f940ea66658b818dcbea220a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 48611f11e64cd0a26dbd92483c522b711068d0d1 Author: Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> Date: Tue Apr 2 17:54:30 2013 +0200 x2goclient can start and resume x2go sessions now ----------------------------------------------------------------------- Summary of changes: sessionlistframe.ui | 7 +- sessionselecter.cpp | 5 +- sessionselecter.h | 2 +- sessionstatusframe.ui | 2 +- sessionstatusframestatus.cpp | 13 +- sessionstatusframestatus.ui | 4 +- sshprocess.cpp | 2 +- x2goapplication.cpp | 2 +- x2gosession.cpp | 449 ++++++++++++++++++++++++++++++++++++++++-- x2gosession.h | 28 ++- x2gosessiondata.cpp | 2 +- x2gosessiondata.h | 3 +- 12 files changed, 479 insertions(+), 40 deletions(-) The diff of changes is: diff --git a/sessionlistframe.ui b/sessionlistframe.ui index 0c38cee..1da36ff 100644 --- a/sessionlistframe.ui +++ b/sessionlistframe.ui @@ -82,7 +82,7 @@ </column> <column> <property name="text"> - <string>Status</string> + <string>State</string> </property> </column> <column> @@ -97,6 +97,11 @@ </column> <column> <property name="text"> + <string>Color depth</string> + </property> + </column> + <column> + <property name="text"> <string>Client IP</string> </property> </column> diff --git a/sessionselecter.cpp b/sessionselecter.cpp index d1d6851..b935ece 100644 --- a/sessionselecter.cpp +++ b/sessionselecter.cpp @@ -67,9 +67,8 @@ SessionSelecter::SessionSelecter(const QList<X2GoSessionData>& sessions, Profile item->setText(STATUS, tr("Running")); } item->setText(DISPLAY, data.get_display()); - - QDateTime dt=QDateTime::fromString(data.get_creationTime(), Qt::ISODate); - item->setText(CRTIME, dt.toString(Qt::SystemLocaleShortDate)); + item->setText(DEPTH, QString::number(data.get_colorDepth())); + item->setText(CRTIME, data.get_creationTime().toString(Qt::SystemLocaleShortDate)); item->setText(CLIENT, data.get_clientIp()); item->setText(ID, data.get_sessionId()); } diff --git a/sessionselecter.h b/sessionselecter.h index dfb93fd..fcb8e9f 100644 --- a/sessionselecter.h +++ b/sessionselecter.h @@ -34,7 +34,7 @@ class SessionSelecter: public MessageBox { Q_OBJECT public: - enum {NAME, TYPE, STATUS, DISPLAY, CRTIME, CLIENT, ID}; + enum {NAME, TYPE, STATUS, DISPLAY, CRTIME, DEPTH, CLIENT, ID}; SessionSelecter(const QList< X2GoSessionData >& sessions, Profile* profile); ~SessionSelecter(); virtual Buttons exec(); diff --git a/sessionstatusframe.ui b/sessionstatusframe.ui index b748ad4..6c9db4c 100644 --- a/sessionstatusframe.ui +++ b/sessionstatusframe.ui @@ -43,7 +43,7 @@ <string notr="true">border-image:url(:svg/frame.svg);border-top:5px;border-left:5px;border-right:5px;border-bottom:5px</string> </property> <property name="text"> - <string>Status</string> + <string>Session status</string> </property> <property name="checkable"> <bool>true</bool> diff --git a/sessionstatusframestatus.cpp b/sessionstatusframestatus.cpp index 9178742..6ae8b4a 100644 --- a/sessionstatusframestatus.cpp +++ b/sessionstatusframestatus.cpp @@ -64,15 +64,18 @@ void SessionStatusFrameStatus::setSession(X2GoSession* session) SLOT(slotSessionStatusChanged(X2GoSession::SessionStatus))); this->session=session; slotSessionStatusChanged(session->get_status()); - lServer->setText(session->get_profile()->get_server()); - lLogin->setText(session->get_profile()->get_user()); - lSID->setText(QString::null); - lDisplay->setText(QString::null); - lCrTime->setText(QString::null); } void SessionStatusFrameStatus::slotSessionStatusChanged(X2GoSession::SessionStatus status) { + lServer->setText(session->get_profile()->get_server()); + lLogin->setText(session->get_profile()->get_user()); + lSID->setText(session->get_sessionData().get_sessionId()); + lDisplay->setText(session->get_sessionData().get_display()); + if(!session->get_sessionData().get_creationTime().isNull()) + lCrTime->setText(session->get_sessionData().get_creationTime().toString(Qt::DefaultLocaleShortDate)); + else + lCrTime->setText(QString::null); switch(status) { case X2GoSession::NOTRUNNING: diff --git a/sessionstatusframestatus.ui b/sessionstatusframestatus.ui index 9a89d54..cab7ebb 100644 --- a/sessionstatusframestatus.ui +++ b/sessionstatusframestatus.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>624</width> - <height>257</height> + <height>258</height> </rect> </property> <property name="windowTitle"> @@ -182,7 +182,7 @@ <string notr="true">border-top:0px;border-left:0px;border-right:0px;border-bottom:0px</string> </property> <property name="text"> - <string>Status:</string> + <string>State:</string> </property> </widget> </item> diff --git a/sshprocess.cpp b/sshprocess.cpp index f382f64..2d4ddb1 100644 --- a/sshprocess.cpp +++ b/sshprocess.cpp @@ -232,7 +232,7 @@ void SshProcess::tunnelLoop() } listen(serverSocket,5); addrlen=sizeof(struct sockaddr_in); - QTimer* timer=new QTimer(); + QTimer* timer=new QTimer(this); connect(timer,SIGNAL(timeout()),this,SLOT(slotCheckNewConnection())); timer->start(100); emit signalSshTunnelOk(pid); diff --git a/x2goapplication.cpp b/x2goapplication.cpp index fe67f1c..c42cbb3 100644 --- a/x2goapplication.cpp +++ b/x2goapplication.cpp @@ -153,7 +153,7 @@ void X2GoApplication::slotInitApplication() clientConfig->loadConfigFiles(); if(!clientConfig->parseCommandLineArguments(arguments())) { - QMessageBox::critical(0,tr("Error"), tr("Error parsing command line arguments")); + QMessageBox::critical(0,tr("Error"), tr("Error parsing command line arguments")+arguments().join(":")); exit(-1); return; } diff --git a/x2gosession.cpp b/x2gosession.cpp index e1df84b..fd29f14 100644 --- a/x2gosession.cpp +++ b/x2gosession.cpp @@ -28,16 +28,22 @@ #include "x2gobroker.h" #include "sessionselecter.h" +#include <QDesktopWidget> +#include <QFileInfo> +#include <QDir> +#include <QProcess> + X2GoSession::X2GoSession(Profile* profile) { this->profile=profile; status=NOTRUNNING; sshConnection=0; + nxproxy=0; } X2GoSession::~X2GoSession() { - + terminateConnections(); } @@ -53,8 +59,7 @@ void X2GoSession::slotStartSession() } void X2GoSession::startSession() { - if(sshConnection) - delete sshConnection; + resetSession(); QString proxyPassword; if(X2GoApplication::instance()->get_broker() && profile->get_useBrokerPassForProxy()) proxyPassword=X2GoApplication::instance()->get_broker()->get_password(); @@ -74,28 +79,68 @@ void X2GoSession::startSession() sshConnection->start(); } +void X2GoSession::slotSshConnectionOk(QString) +{ + qDebug()<<"SSH Connection established"; + if(profile->get_desktop()=="SHADOW") + { + //get desktops + return; + } + if(profile->get_desktop()=="RDP" && profile->get_directRDP()) + { + //start rdp session + return; + } + if(X2GoApplication::instance()->get_broker()) + { + //start broker session; + return; + } + sshConnection->executeCommand("export HOSTNAME && x2golistsessions", this,SLOT (slotListSessions(bool, QString, int))); +} + -void X2GoSession::setSessionNotRunning() +void X2GoSession::resetSession() { + terminateConnections(); status=NOTRUNNING; emit signalStatusChanged(status); +} + +void X2GoSession::terminateConnections() +{ + notCheckExitStatus=true; if(sshConnection) { delete sshConnection; sshConnection=0; } + if(nxproxy) + { + if(nxproxy->state()==QProcess::Running) + { + qDebug()<<"terminating nxproxy"; + nxproxy->terminate(); + nxproxy->waitForFinished(3000); + } + delete nxproxy; + nxproxy=0; + } + } void X2GoSession::slotSshConnectionFailed(int, QString) { - setSessionNotRunning(); + resetSession(); } void X2GoSession::slotListSessions(bool success, QString answer, int id) { if(!success) { + MessageBox::critical(tr("<b>Error:</b><br>")+answer, MessageBox::OK); slotSshConnectionFailed(id, answer); return; } @@ -113,7 +158,7 @@ void X2GoSession::slotListSessions(bool success, QString answer, int id) } if(sessions.size()==1) { - if(sessions[0].get_status()=="S") + if(sessions[0].get_status()=="S" &&isColorDepthOk(sessions[0].get_colorDepth())) { resumeSession(sessions[0]); return; @@ -134,49 +179,411 @@ void X2GoSession::selectSession(const QList<X2GoSessionData>& sessions) if(!sel->getSelectedSession()) { qDebug()<<"selected session is NULL, aborting..."; - setSessionNotRunning(); + resetSession(); } else - { resumeSession(*(sel->getSelectedSession())); - } break; default: qDebug()<<"canceling session"; - setSessionNotRunning(); + resetSession(); break; } delete sel; } -void X2GoSession::resumeSession(const X2GoSessionData& sessionData) +void X2GoSession::createNewSession() +{ + newSession=true; + sessionData.set_status("S"); + sessionData.set_server(profile->get_server()); + sessionData.set_creationTime(QDateTime::currentDateTime()); + sessionData.set_clientIp("localhost"); + sessionData.set_command(profile->get_desktop()); + sessionData.set_sessionType(X2GoSessionData::DESKTOP); + if(profile->get_rootless()) + sessionData.set_sessionType(X2GoSessionData::ROOTLESS); + /*implement shadow + sessionData.set_sessionType(X2GoSessionData::SHADOW);*/ + sessionData.set_fullscreen(profile->get_fullscreen()); + QDesktopWidget wd; + sessionData.set_colorDepth(wd.depth()); + emit signalStatusChanged(status); + initX2GoSession(); +} + + +void X2GoSession::initX2GoSession() { + QString geometry; + if(profile->get_fullscreen()) + geometry="fullscreen"; + else + geometry=QString::number ( profile->get_displayWidth() ) +"x"+ + QString::number ( profile->get_displayHeight() ); + QString link; + switch (profile->get_speed()) + { + case Profile::MODEM: + link="modem"; + break; + case Profile::ISDN: + link="isdn"; + break; + case Profile::ADSL: + link="adsl"; + break; + case Profile::WAN: + link="wan"; + break; + case Profile::LAN: + link="lan"; + break; + } + QString pack=profile->get_method()+"-"+QString::number(profile->get_quality()); + + QString cmd; + + QString sessTypeStr; + + if(newSession) + { + + QDesktopWidget wd; + QString depth=QString::number ( wd.depth() ); + sessTypeStr="D "; + if ( profile->get_rootless() ) + sessTypeStr="R "; + + /*implement shadow, published, DMCP, RDP session*/ + QString xdmcpEnv; + + + QString dpiEnv; + if ( profile->get_changeDPI() ) + { + dpiEnv="X2GODPI="+QString::number ( profile->get_dpi() ) +" "; + } + cmd=dpiEnv+xdmcpEnv+"x2gostartagent "+ + geometry+" "+link+" "+pack+ + " unix-kde-depth_"+depth+" "+profile->get_keyboardLayout()+" "+profile->get_keyboardModel()+" "; + } + else + { + cmd="x2goresume-session "+sessionData.get_sessionId()+" "+geometry+ + " "+link+" "+pack+" "+profile->get_keyboardLayout()+ + " "+profile->get_keyboardModel()+" "; + } + if ( profile->get_changeKeyboard()) + cmd += "1 "; + else + cmd += "0 "; + + if(newSession) + { + QFileInfo f ( profile->get_desktop() ); + cmd+=sessTypeStr+f.fileName(); + sshConnection->executeCommand(cmd, this, SLOT(slotX2GoAgentStarted(bool, QString, int))); + } + else + sshConnection->executeCommand(cmd, this, SLOT(slotSessionResumed(bool, QString, int))); + qDebug()<<cmd; } -void X2GoSession::createNewSession() + +void X2GoSession::slotX2GoAgentStarted(bool success, QString answer, int id) { + qDebug()<<"x2gostartagent:"<<answer; + if(!success) + { + if(answer.indexOf("LIMIT")!=-1) + MessageBox::critical(tr("<b>Error:</b><br>")+tr("Sessions limit reached"), MessageBox::OK); + else + MessageBox::critical(tr("<b>Error:</b><br>")+answer, MessageBox::OK); + slotSshConnectionFailed(id, answer); + return; + } + + answer.replace ( " ","" ); + QStringList lst=answer.split ( '\n' ); + sessionData.set_display(lst[0]); + sessionData.set_cookie(lst[1]); + sessionData.set_agentPid(lst[2]); + sessionData.set_sessionId(lst[3]); + sessionData.set_grPort(lst[4]); + sessionData.set_sndPort(lst[5]); + if ( lst.count() >6 ) + sessionData.set_fsPort(lst[6]); + emit signalStatusChanged(status); + connectSession(); } -void X2GoSession::slotSshConnectionOk(QString) +bool X2GoSession::isColorDepthOk(int sessionDepth) { - qDebug()<<"SSH Connection established"; - if(profile->get_desktop()=="SHADOW") + QDesktopWidget wd; + if ( sessionDepth==0 ) + return true; + if ( wd.depth()==sessionDepth ) + return true; + if ( ( wd.depth() == 24 || wd.depth() == 32 ) && ( sessionDepth == 24 || sessionDepth == 32 ) ) + return true; + return false; +} + +void X2GoSession::resumeSession(X2GoSessionData data) +{ + + if(!isColorDepthOk(data.get_colorDepth())) { - //get desktops + if(MessageBox::warning( + tr ("<b>Warning</b><br>" + "Your current color depth is " + "different to the color depth of your " + "x2go-session. This may cause problems " + "reconnecting to this session and in most " + "cases <b>you will loose the session</b> " + "and have to start a new one! It's highly " + "recommended to change the color depth of " + "your Display to " ) +tr ( "24 or 32" ) + + tr ( + " bit and restart your X-server before you " + "reconnect to this x2go-session.<br>Resume " + "this session anyway?" ),MessageBox::YES|MessageBox::NO)==MessageBox::NO) + { + resetSession(); + return; + } + } + newSession=false; + sessionData=data; + status=RESUMING; + emit signalStatusChanged(status); + if(sessionData.get_status()=="R") + { + suspendSession(); return; } - if(profile->get_desktop()=="RDP" && profile->get_directRDP()) + initX2GoSession(); +} + +void X2GoSession::slotSessionResumed(bool success, QString answer, int id) +{ + qDebug()<<"x2goresume-session:"<<answer; + if(!success) { - //start rdp session + MessageBox::critical(tr("<b>Error:</b><br>")+answer, MessageBox::OK); + slotSshConnectionFailed(id, answer); return; } - if(X2GoApplication::instance()->get_broker()) + answer.replace(" ",""); + QStringList outputLines=answer.split("\n",QString::SkipEmptyParts); + foreach(QString line,outputLines) { - //start broker session; + if (line.indexOf("gr_port=")!=-1) + { + sessionData.set_grPort(line.replace("gr_port=","")); + } + if (line.indexOf("sound_port=")!=-1) + { + sessionData.set_sndPort(line.replace("sound_port=",""));; + } + if (line.indexOf("fs_port=")!=-1) + { + sessionData.set_fsPort(line.replace("fs_port=","")); + } + } + connectSession(); +} + +void X2GoSession::connectSession() +{ + localGraphicPort=sessionData.get_grPort(); + int iport=localGraphicPort.toInt() +1000; + while ( iport == sessionData.get_sndPort().toInt() || + iport == sessionData.get_fsPort().toInt() || + X2GoApplication::isPortBusy(iport) ) + ++iport; + localGraphicPort=QString::number ( iport ); + sshConnection->startTunnel("localhost",sessionData.get_grPort().toInt(),"localhost", + localGraphicPort.toInt(), false, this, SLOT(slotGrTunnelOk(int)), + SLOT(slotGrTunnelFinished(bool, QString, int))); +} + +void X2GoSession::slotGrTunnelFinished(bool success, QString answer, int ) +{ + if (! success ) + { + QString message=tr ( "<b>Error</b><br>Unable to create SSH tunnel:<br>" ) + +answer; + MessageBox::critical ( message, MessageBox::OK); + resetSession(); + } +} + +void X2GoSession::slotGrTunnelOk(int) +{ + qDebug()<<"tunnel ready, starting nxproxy"; + QString nxroot=QDir::homePath() +"/.x2go"; + QString dirpath=nxroot+"/S-"+sessionData.get_sessionId(); + QDir d ( dirpath ); + if ( !d.exists() ) + if ( !d.mkpath ( dirpath ) ) + { + QString message=tr ( "Unable to create folder:" ) + + dirpath; + MessageBox::critical (message, MessageBox::OK); + resetSession(); + return; + } + QFile file ( dirpath+"/options" ); + if ( !file.open ( QIODevice::WriteOnly | QIODevice::Text ) ) + { + QString message=tr ( "Unable to write file:" ) + + dirpath+"/options"; + MessageBox::critical ( message, MessageBox::OK); + resetSession(); return; } - sshConnection->executeCommand("export HOSTNAME && x2golistsessions", this,SLOT (slotListSessions(bool, QString, int))); + + QTextStream out ( &file ); + out << "nx/nx,root="<<nxroot<<",connect=localhost,cookie="<< + sessionData.get_cookie()<<",port=" + <<localGraphicPort<<",errors="<<dirpath<<"/sessions:"<< + sessionData.get_display(); + file.close(); + + nxproxy=new QProcess; + notCheckExitStatus=false; + proxyErrString=""; + QStringList env = QProcess::systemEnvironment(); + QString x2golibpath="/usr/lib/x2go"; + for ( int l=0; l<env.size(); ++l ) + { + if ( env[l].indexOf ( "X2GO_LIB" ) ==0 ) + { + x2golibpath=env[l].split ( "=" ) [1]; + } + } + env << "LD_LIBRARY_PATH="+x2golibpath; + env << "NX_CLIENT="+QCoreApplication::applicationFilePath (); + + nxproxy->setEnvironment ( env ); + connect ( nxproxy,SIGNAL ( error ( QProcess::ProcessError ) ),this, + SLOT ( slotProxyError ( QProcess::ProcessError ) ) ); + connect ( nxproxy,SIGNAL ( finished ( int,QProcess::ExitStatus ) ),this, + SLOT ( slotProxyFinished ( int,QProcess::ExitStatus ) ) ); + connect ( nxproxy,SIGNAL ( readyReadStandardError() ),this, + SLOT ( slotProxyStderr() ) ); + connect ( nxproxy,SIGNAL ( readyReadStandardOutput() ),this, + SLOT ( slotProxyStdout() ) ); + + QString proxyCmd="nxproxy -S nx/nx,options="+dirpath+"/options:"+ + sessionData.get_display(); + qDebug()<<"starting nxproxy with: "<<proxyCmd<<endl; + nxproxy->start ( proxyCmd ); + + +#warning check, that proxy connection is ok!!! + //QTimer::singleShot ( 30000,this,SLOT ( slotRestartProxy() ) ); +} + +void X2GoSession::suspendSession() +{ +} + +void X2GoSession::slotProxyError(QProcess::ProcessError ) +{ + slotProxyFinished ( -1,QProcess::CrashExit ); +} + +void X2GoSession::slotProxyFinished(int, QProcess::ExitStatus ) +{ + if(!notCheckExitStatus) + checkExitStatus(); +} + +void X2GoSession::checkExitStatus() +{ + sshConnection->executeCommand ( "x2gocmdexitmessage "+ + sessionData.get_sessionId() , this, SLOT(slotStatusReturned(bool, QString))); +} + + +void X2GoSession::slotStatusReturned(bool success, QString errorMessage) +{ + if ( !success ) + { + MessageBox::critical (tr ( "<b>Error</b><br>" )+errorMessage, MessageBox::OK); + resetSession(); + return; + } + if ( errorMessage.indexOf ( "X2GORUNCOMMAND ERR NOEXEC:" ) !=-1 ) + { + QString cmd=errorMessage; + cmd.replace ( "X2GORUNCOMMAND ERR NOEXEC:","" ); + MessageBox::critical ( tr ( "<b>Error</b><br>" )+tr ( "Unable to execute: " ) + cmd, MessageBox::OK); + } + resetSession(); +} + +void X2GoSession::slotProxyStderr() +{ + QString reserr; + if ( nxproxy ) + reserr= nxproxy->readAllStandardError(); + proxyErrString+=reserr; + + + if ( proxyErrString.indexOf ( + "Established X server connection" ) !=-1 ) + { + status=RUNNING; + emit(signalStatusChanged(status)); + if ( newSession ) + { + runCommand(); + newSession=false; + } + } +} + +void X2GoSession::slotProxyStdout() +{ + +} + +void X2GoSession::runCommand() +{ + QString command; + QString sessionType="D"; + bool rootless=false; + command=profile->get_desktop(); + rootless=profile->get_rootless(); + if ( rootless ) + sessionType="R"; + + QString cmd; + + command.replace ( " ","X2GO_SPACE_CHAR" ); + + cmd="setsid x2goruncommand "+sessionData.get_display()+" "+ + sessionData.get_agentPid() + " " + + sessionData.get_sessionId()+" "+ + sessionData.get_sndPort()+ " "+ command+" nosnd "+ + sessionType +" 1> /dev/null 2>/dev/null & exit"; + + sshConnection->executeCommand ( cmd, this, SLOT(slotRunCommandFinished(bool, QString))); +} + +void X2GoSession::slotRunCommandFinished(bool success, QString errorMessage) +{ + qDebug()<<errorMessage<<success; + if(!success) + { + MessageBox::critical(tr("<b>Error:</b><br>")+errorMessage, MessageBox::OK); + resetSession(); + } } diff --git a/x2gosession.h b/x2gosession.h index 870073f..f5c37a2 100644 --- a/x2gosession.h +++ b/x2gosession.h @@ -22,6 +22,7 @@ #define X2GOSESSION_H #include <QObject> +#include <QProcess> #include "x2goapplication.h" #include "sshconnection.h" #include "x2gosessiondata.h" @@ -39,19 +40,42 @@ public: X2GoSession(Profile* profile); virtual ~X2GoSession(); void startSession(); - void resumeSession(const X2GoSessionData& sessionData); + void resumeSession(X2GoSessionData data); + void suspendSession(); void createNewSession(); - void setSessionNotRunning(); + void initX2GoSession(); + void resetSession(); + void terminateConnections(); private: void selectSession(const QList<X2GoSessionData> & sessions); + bool isColorDepthOk(int sessionDepth); + void connectSession(); + void runCommand(); public slots: void slotStartSession(); private slots: void slotSshConnectionOk(QString); void slotSshConnectionFailed(int, QString errorMessage); void slotListSessions(bool success, QString answer, int); + void slotX2GoAgentStarted(bool success, QString answer, int); + void slotSessionResumed(bool success, QString answer, int); + void slotGrTunnelFinished(bool success, QString answer, int); + void slotGrTunnelOk(int); + void slotProxyError ( QProcess::ProcessError err ); + void slotProxyFinished ( int result,QProcess::ExitStatus st ); + void slotRunCommandFinished(bool success, QString errorMessage); + void slotStatusReturned(bool success, QString errorMessage); + void slotProxyStderr(); + void slotProxyStdout(); + void checkExitStatus(); signals: void signalStatusChanged(X2GoSession::SessionStatus status); +private: + QString localGraphicPort; + QProcess* nxproxy; + QString proxyErrString; + bool newSession; + bool notCheckExitStatus; }; #endif // X2GOSESSION_H diff --git a/x2gosessiondata.cpp b/x2gosessiondata.cpp index 2bc3840..a0e496d 100644 --- a/x2gosessiondata.cpp +++ b/x2gosessiondata.cpp @@ -58,7 +58,7 @@ X2GoSessionData X2GoSessionData::getSessionFromString(const QString& string) s.set_display(lst[2]); s.set_server(lst[3]); s.set_status(lst[4]); - s.set_creationTime(lst[5]); + s.set_creationTime(QDateTime::fromString(lst[5],Qt::ISODate)); s.set_cookie(lst[6]); s.set_clientIp(lst[7]); s.set_grPort(lst[8]); diff --git a/x2gosessiondata.h b/x2gosessiondata.h index d96603d..d0e3759 100644 --- a/x2gosessiondata.h +++ b/x2gosessiondata.h @@ -23,6 +23,7 @@ #define X2GOSESSIONDATA_H #include "x2goapplication.h" +#include <QDateTime> class X2GoSessionData { public: @@ -32,7 +33,7 @@ public: X2GO_PROPERTY(QString, display); X2GO_PROPERTY(QString, server); X2GO_PROPERTY(QString, status); - X2GO_PROPERTY(QString, creationTime); + X2GO_PROPERTY(QDateTime, creationTime); X2GO_PROPERTY(QString, cookie); X2GO_PROPERTY(QString, clientIp); X2GO_PROPERTY(QString, grPort); hooks/post-receive -- x2goclient2.git (X2Go Client 2 (rewrite of x2goclient.git)) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "x2goclient2.git" (X2Go Client 2 (rewrite of x2goclient.git)).