2013-04-18 21:41:13 +00: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 21:13:42 +00:00
# include <QTimer>
2013-06-12 21:10:09 +00:00
# include <QCloseEvent>
2013-06-13 21:12:07 +00:00
# include <QMessageBox>
2014-05-27 08:40:23 +00:00
# include <unistd.h>
2013-06-17 21:58:26 +00:00
# include <retroshare/rsstatus.h>
2014-03-17 20:56:06 +00:00
# include <retroshare/rspeers.h>
2014-05-25 21:43:05 +00:00
# include <retroshare/rsidentity.h>
2013-06-17 21:58:26 +00:00
2013-06-12 21:10:09 +00:00
# include "RsAutoUpdatePage.h"
2013-04-16 21:13:42 +00:00
# include "PopupDistantChatDialog.h"
2015-06-30 16:44:58 +00:00
# define IMAGE_RED_LED ": / icons / bullet_red_64.png"
# define IMAGE_YEL_LED ": / icons / bullet_yellow_64.png"
# define IMAGE_GRN_LED ": / icons / bullet_green_64.png"
# define IMAGE_GRY_LED ": / icons / bullet_grey_64.png"
2013-04-23 22:43:19 +00:00
2013-06-12 21:10:09 +00:00
PopupDistantChatDialog : : ~ PopupDistantChatDialog ( )
{
_update_timer - > stop ( ) ;
delete _update_timer ;
2013-04-18 21:41:13 +00:00
}
2013-10-18 21:10:33 +00:00
PopupDistantChatDialog : : PopupDistantChatDialog ( QWidget * parent , Qt : : WindowFlags flags )
2013-04-16 21:13:42 +00:00
: PopupChatDialog ( parent , flags )
{
2013-06-12 21:10:09 +00:00
_status_label = new QLabel ;
_update_timer = new QTimer ;
2013-04-16 21:13:42 +00:00
2013-06-12 21:10:09 +00:00
_update_timer - > setInterval ( 1000 ) ;
QObject : : connect ( _update_timer , SIGNAL ( timeout ( ) ) , this , SLOT ( updateDisplay ( ) ) ) ;
2013-04-16 21:13:42 +00:00
2013-06-12 21:10:09 +00:00
_update_timer - > start ( ) ;
2013-04-23 22:43:19 +00:00
2014-01-02 00:56:46 +00:00
getChatWidget ( ) - > addChatBarWidget ( _status_label ) ;
2013-06-12 21:10:09 +00:00
updateDisplay ( ) ;
2013-04-16 21:13:42 +00:00
}
2014-12-29 21:41:05 +00:00
void PopupDistantChatDialog : : init ( const RsGxsId & gxs_id , const QString & title )
2013-04-16 21:13:42 +00:00
{
2014-12-29 21:41:05 +00:00
_pid = gxs_id ;
PopupChatDialog : : init ( ChatId ( gxs_id ) , title ) ;
2015-02-08 17:38:30 +00:00
RsGxsId own_gxs_id ;
uint32_t status ;
2015-02-14 20:55:05 +00:00
// do not use setOwnId, because we don't want the user to change the GXS avatar from the chat window
// it will not be transmitted.
2015-02-08 17:38:30 +00:00
if ( rsMsgs - > getDistantChatStatus ( gxs_id , status , & own_gxs_id ) )
2015-02-14 20:55:05 +00:00
ui . ownAvatarWidget - > setId ( ChatId ( own_gxs_id ) ) ;
2013-04-16 21:13:42 +00:00
}
2013-06-12 21:10:09 +00:00
void PopupDistantChatDialog : : updateDisplay ( )
2013-04-16 21:13:42 +00:00
{
2013-06-12 21:10:09 +00: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 21:13:42 +00:00
if ( ! isVisible ( ) )
return ;
2013-07-14 13:59:38 +00:00
//std::cerr << "Checking tunnel..." ;
2013-04-16 21:13:42 +00:00
// make sure about the tunnel status
//
2013-04-23 22:43:19 +00:00
uint32_t status = RS_DISTANT_CHAT_STATUS_UNKNOWN ;
2014-11-16 22:46:18 +00:00
rsMsgs - > getDistantChatStatus ( _pid , status ) ;
2013-04-16 21:13:42 +00:00
2015-02-14 20:55:05 +00:00
ui . avatarWidget - > setId ( ChatId ( _pid ) ) ;
2015-01-10 13:13:41 +00:00
QString msg ;
2013-04-16 21:13:42 +00:00
switch ( status )
{
2015-01-10 13:13:41 +00: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 13:59:38 +00:00
case RS_DISTANT_CHAT_STATUS_TUNNEL_DN : //std::cerr << "Tunnel asked. Waiting for reponse. " << std::endl;
2015-01-10 13:13:41 +00: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 13:59:38 +00:00
case RS_DISTANT_CHAT_STATUS_TUNNEL_OK : //std::cerr << "Tunnel is ok. " << std::endl;
2015-01-10 13:13:41 +00: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 13:59:38 +00:00
case RS_DISTANT_CHAT_STATUS_CAN_TALK : //std::cerr << "Tunnel is ok and data is transmitted." << std::endl;
2015-01-10 13:13:41 +00: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 21:13:42 +00:00
}
}
2013-06-12 21:10:09 +00:00
void PopupDistantChatDialog : : closeEvent ( QCloseEvent * e )
{
2014-03-17 20:56:06 +00:00
//std::cerr << "Closing window => closing distant chat for hash " << _pid << std::endl;
2013-06-13 21:12:07 +00:00
2014-11-16 22:46:18 +00:00
uint32_t status = RS_DISTANT_CHAT_STATUS_UNKNOWN ;
rsMsgs - > getDistantChatStatus ( _pid , status ) ;
2013-06-13 21:12:07 +00: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 20:56:06 +00:00
rsMsgs - > closeDistantChatConnexion ( _pid ) ;
2013-06-13 21:12:07 +00:00
else
{
e - > ignore ( ) ;
return ;
}
}
2013-06-12 21:10:09 +00:00
e - > accept ( ) ;
PopupChatDialog : : closeEvent ( e ) ;
}
2013-04-16 21:13:42 +00:00
2014-12-29 21:41:05 +00:00
QString PopupDistantChatDialog : : getPeerName ( const ChatId & id ) const
2013-06-18 20:13:58 +00:00
{
2014-11-17 21:56:41 +00:00
RsIdentityDetails details ;
2014-12-29 21:41:05 +00:00
if ( rsIdentity - > getIdDetails ( id . toGxsId ( ) , details ) )
2014-11-17 21:56:41 +00:00
return QString : : fromUtf8 ( details . mNickname . c_str ( ) ) ;
else
2014-12-29 21:41:05 +00:00
return QString : : fromStdString ( id . toGxsId ( ) . toStdString ( ) ) ;
2013-06-18 20:13:58 +00:00
}
2014-05-25 21:43:05 +00:00
2014-12-29 21:41:05 +00:00
QString PopupDistantChatDialog : : getOwnName ( ) const
{
2015-02-08 17:38:30 +00:00
uint32_t status = RS_DISTANT_CHAT_STATUS_UNKNOWN ;
RsGxsId from_gxs_id ;
rsMsgs - > getDistantChatStatus ( _pid , status , & from_gxs_id ) ;
RsIdentityDetails details ;
if ( rsIdentity - > getIdDetails ( from_gxs_id , details ) )
return QString : : fromUtf8 ( details . mNickname . c_str ( ) ) ;
else
return QString : : fromStdString ( from_gxs_id . toStdString ( ) ) ;
2014-12-29 21:41:05 +00:00
}