2013-04-18 17:41:13 -04:00
/****************************************************************
* RetroShare is distributed under the following license :
*
* Copyright ( C ) 2013 , Cyril Soler
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor ,
* Boston , MA 02110 - 1301 , USA .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2013-04-16 17:13:42 -04:00
# include <QTimer>
2013-06-12 17:10:09 -04:00
# include <QCloseEvent>
2013-06-13 17:12:07 -04:00
# include <QMessageBox>
2014-05-27 04:40:23 -04:00
# include <unistd.h>
2013-06-17 17:58:26 -04:00
# include <retroshare/rsstatus.h>
2014-03-17 16:56:06 -04:00
# include <retroshare/rspeers.h>
2014-05-25 17:43:05 -04:00
# include <retroshare/rsidentity.h>
2013-06-17 17:58:26 -04:00
2013-06-12 17:10:09 -04:00
# include "RsAutoUpdatePage.h"
2013-04-16 17:13:42 -04:00
# include "PopupDistantChatDialog.h"
2013-04-23 18:43:19 -04:00
# define IMAGE_RED_LED ": / images / redled.png"
# define IMAGE_YEL_LED ": / images / yellowled.png"
# define IMAGE_GRN_LED ": / images / greenled.png"
# define IMAGE_GRY_LED ": / images / grayled.png"
2013-06-12 17:10:09 -04:00
PopupDistantChatDialog : : ~ PopupDistantChatDialog ( )
{
_update_timer - > stop ( ) ;
delete _update_timer ;
2013-04-18 17:41:13 -04:00
}
2013-10-18 17:10:33 -04:00
PopupDistantChatDialog : : PopupDistantChatDialog ( QWidget * parent , Qt : : WindowFlags flags )
2013-04-16 17:13:42 -04:00
: PopupChatDialog ( parent , flags )
{
2013-06-12 17:10:09 -04:00
_status_label = new QLabel ;
_update_timer = new QTimer ;
2013-04-16 17:13:42 -04:00
2013-06-12 17:10:09 -04:00
_update_timer - > setInterval ( 1000 ) ;
QObject : : connect ( _update_timer , SIGNAL ( timeout ( ) ) , this , SLOT ( updateDisplay ( ) ) ) ;
2013-04-16 17:13:42 -04:00
2013-06-12 17:10:09 -04:00
_update_timer - > start ( ) ;
2013-04-23 18:43:19 -04:00
2014-01-01 19:56:46 -05:00
getChatWidget ( ) - > addChatBarWidget ( _status_label ) ;
2013-06-12 17:10:09 -04:00
updateDisplay ( ) ;
2013-04-16 17:13:42 -04:00
}
2014-12-29 16:41:05 -05:00
void PopupDistantChatDialog : : init ( const RsGxsId & gxs_id , const QString & title )
2013-04-16 17:13:42 -04:00
{
2014-12-29 16:41:05 -05:00
_pid = gxs_id ;
PopupChatDialog : : init ( ChatId ( gxs_id ) , title ) ;
// hide avatar frame, because it does not have funcntionality for gxs
showAvatarFrame ( false ) ;
2013-04-16 17:13:42 -04:00
}
2013-06-12 17:10:09 -04:00
void PopupDistantChatDialog : : updateDisplay ( )
2013-04-16 17:13:42 -04:00
{
2013-06-12 17:10:09 -04:00
if ( RsAutoUpdatePage : : eventsLocked ( ) ) // we need to do that by end, because it's not possible to derive from both PopupChatDialog and RsAutoUpdatePage
return ; // which both derive from QObject. Signals-slot connexions won't work anymore.
2013-04-16 17:13:42 -04:00
if ( ! isVisible ( ) )
return ;
2013-07-14 09:59:38 -04:00
//std::cerr << "Checking tunnel..." ;
2013-04-16 17:13:42 -04:00
// make sure about the tunnel status
//
2013-04-23 18:43:19 -04:00
uint32_t status = RS_DISTANT_CHAT_STATUS_UNKNOWN ;
2014-11-16 17:46:18 -05:00
rsMsgs - > getDistantChatStatus ( _pid , status ) ;
2013-04-16 17:13:42 -04:00
2015-01-10 08:13:41 -05:00
QString msg ;
2013-04-16 17:13:42 -04:00
switch ( status )
{
2015-01-10 08:13:41 -05:00
case RS_DISTANT_CHAT_STATUS_UNKNOWN : //std::cerr << "Unknown hash. Error!" << std::endl;
_status_label - > setPixmap ( QPixmap ( IMAGE_GRY_LED ) ) ;
msg = tr ( " Hash Error. No tunnel. " ) ;
_status_label - > setToolTip ( msg ) ;
getChatWidget ( ) - > updateStatusString ( " %1 " , msg , true ) ;
getChatWidget ( ) - > blockSending ( tr ( " Can't send message, because there is no tunnel. " ) ) ;
setPeerStatus ( RS_STATUS_OFFLINE ) ;
break ;
case RS_DISTANT_CHAT_STATUS_REMOTELY_CLOSED : std : : cerr < < " Chat remotely closed. " < < std : : endl ;
_status_label - > setPixmap ( QPixmap ( IMAGE_RED_LED ) ) ;
_status_label - > setToolTip ( QObject : : tr ( " Distant peer has closed the chat " ) ) ;
getChatWidget ( ) - > updateStatusString ( " %1 " , tr ( " The person you're talking to has deleted the secured chat tunnel. You may remove the chat window now. " ) , true ) ;
getChatWidget ( ) - > blockSending ( tr ( " Can't send message, because the chat partner deleted the secure tunnel. " ) ) ;
setPeerStatus ( RS_STATUS_OFFLINE ) ;
break ;
2013-07-14 09:59:38 -04:00
case RS_DISTANT_CHAT_STATUS_TUNNEL_DN : //std::cerr << "Tunnel asked. Waiting for reponse. " << std::endl;
2015-01-10 08:13:41 -05:00
_status_label - > setPixmap ( QPixmap ( IMAGE_RED_LED ) ) ;
msg = QObject : : tr ( " Tunnel is pending... " ) ;
_status_label - > setToolTip ( msg ) ;
getChatWidget ( ) - > updateStatusString ( " %1 " , msg , true ) ;
getChatWidget ( ) - > blockSending ( msg ) ;
setPeerStatus ( RS_STATUS_OFFLINE ) ;
break ;
2013-07-14 09:59:38 -04:00
case RS_DISTANT_CHAT_STATUS_TUNNEL_OK : //std::cerr << "Tunnel is ok. " << std::endl;
2015-01-10 08:13:41 -05:00
_status_label - > setPixmap ( QPixmap ( IMAGE_YEL_LED ) ) ;
msg = QObject : : tr ( " Secured tunnel established. Waiting for ACK... " ) ;
_status_label - > setToolTip ( msg ) ;
getChatWidget ( ) - > updateStatusString ( " %1 " , msg , true ) ;
getChatWidget ( ) - > blockSending ( msg ) ;
setPeerStatus ( RS_STATUS_ONLINE ) ;
break ;
2013-07-14 09:59:38 -04:00
case RS_DISTANT_CHAT_STATUS_CAN_TALK : //std::cerr << "Tunnel is ok and data is transmitted." << std::endl;
2015-01-10 08:13:41 -05:00
_status_label - > setPixmap ( QPixmap ( IMAGE_GRN_LED ) ) ;
msg = QObject : : tr ( " Secured tunnel is working. You can talk! " ) ;
_status_label - > setToolTip ( msg ) ;
getChatWidget ( ) - > unblockSending ( ) ;
setPeerStatus ( RS_STATUS_ONLINE ) ;
break ;
2013-04-16 17:13:42 -04:00
}
}
2013-06-12 17:10:09 -04:00
void PopupDistantChatDialog : : closeEvent ( QCloseEvent * e )
{
2014-03-17 16:56:06 -04:00
//std::cerr << "Closing window => closing distant chat for hash " << _pid << std::endl;
2013-06-13 17:12:07 -04:00
2014-11-16 17:46:18 -05:00
uint32_t status = RS_DISTANT_CHAT_STATUS_UNKNOWN ;
rsMsgs - > getDistantChatStatus ( _pid , status ) ;
2013-06-13 17:12:07 -04:00
if ( status ! = RS_DISTANT_CHAT_STATUS_REMOTELY_CLOSED )
{
QString msg = tr ( " Closing this window will end the conversation, notify the peer and remove the encrypted tunnel. " ) ;
if ( QMessageBox : : Ok = = QMessageBox : : critical ( NULL , tr ( " Kill the tunnel? " ) , msg , QMessageBox : : Ok | QMessageBox : : Cancel ) )
2014-03-17 16:56:06 -04:00
rsMsgs - > closeDistantChatConnexion ( _pid ) ;
2013-06-13 17:12:07 -04:00
else
{
e - > ignore ( ) ;
return ;
}
}
2013-06-12 17:10:09 -04:00
e - > accept ( ) ;
PopupChatDialog : : closeEvent ( e ) ;
}
2013-04-16 17:13:42 -04:00
2014-12-29 16:41:05 -05:00
QString PopupDistantChatDialog : : getPeerName ( const ChatId & id ) const
2013-06-18 16:13:58 -04:00
{
2014-11-17 16:56:41 -05:00
RsIdentityDetails details ;
2014-12-29 16:41:05 -05:00
if ( rsIdentity - > getIdDetails ( id . toGxsId ( ) , details ) )
2014-11-17 16:56:41 -05:00
return QString : : fromUtf8 ( details . mNickname . c_str ( ) ) ;
else
2014-12-29 16:41:05 -05:00
return QString : : fromStdString ( id . toGxsId ( ) . toStdString ( ) ) ;
2013-06-18 16:13:58 -04:00
}
2014-05-25 17:43:05 -04:00
2014-12-29 16:41:05 -05:00
QString PopupDistantChatDialog : : getOwnName ( ) const
{
return QString ( " me (TODO: gxs-name) " ) ;
}