2010-05-14 07:48:20 -04:00
/****************************************************************
2007-11-14 22:18:48 -05:00
* RetroShare is distributed under the following license :
*
* Copyright ( C ) 2006 , 2007 crypton
*
* 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
2009-07-13 15:58:11 -04:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor ,
2007-11-14 22:18:48 -05:00
* Boston , MA 02110 - 1301 , USA .
2008-11-24 09:07:26 -05:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-11-14 22:18:48 -05:00
2008-11-24 09:07:26 -05:00
# include <QFile>
2007-11-14 22:18:48 -05:00
# include <QFileInfo>
2008-11-24 09:07:26 -05:00
# include "common/vmessagebox.h"
2010-01-18 17:44:09 -05:00
# include <gui/mainpagestack.h>
2010-03-10 16:38:26 -05:00
# include <gui/RetroShareLink.h>
2008-11-24 09:07:26 -05:00
# include "rshare.h"
# include "PeersDialog.h"
2007-11-14 22:18:48 -05:00
# include "rsiface/rsiface.h"
2008-01-25 03:49:40 -05:00
# include "rsiface/rspeers.h"
2008-04-28 08:09:26 -04:00
# include "rsiface/rsstatus.h"
2008-07-10 06:34:49 -04:00
# include "rsiface/rsmsgs.h"
2008-12-07 09:19:13 -05:00
# include "rsiface/rsnotify.h"
2010-05-11 16:02:52 -04:00
# include "settings/rsharesettings.h"
2008-01-25 03:49:40 -05:00
2007-11-14 22:18:48 -05:00
# include "chat/PopupChatDialog.h"
2010-05-23 15:13:41 -04:00
# include "msgs/MessageComposer.h"
2007-11-14 22:18:48 -05:00
# include "connect/ConfCertDialog.h"
2009-01-22 20:58:56 -05:00
# include "profile/ProfileView.h"
2009-09-25 21:10:25 -04:00
# include "profile/ProfileWidget.h"
2009-10-08 15:08:44 -04:00
# include "profile/StatusMessage.h"
2009-09-22 18:47:49 -04:00
# include "gui/connect/ConnectFriendWizard.h"
2010-01-16 20:36:50 -05:00
# include "gui/forums/CreateForum.h"
2010-05-02 07:41:23 -04:00
# include "gui/channels/CreateChannel.h"
2008-12-07 09:19:13 -05:00
2010-05-02 20:09:55 -04:00
# include "MainWindow.h"
2007-11-14 22:18:48 -05:00
# include <sstream>
2010-01-20 17:02:43 -05:00
# include <time.h>
2010-01-31 17:29:30 -05:00
# include <sys/stat.h>
2007-11-14 22:18:48 -05:00
2010-05-05 07:47:29 -04:00
# include <QSound>
2008-11-24 09:07:26 -05:00
/* Images for context menu icons */
2007-11-14 22:18:48 -05:00
# define IMAGE_REMOVEFRIEND ": / images / removefriend16.png"
# define IMAGE_EXPIORTFRIEND ": / images / exportpeers_16x16.png"
2008-04-07 20:31:46 -04:00
# define IMAGE_PEERINFO ": / images / peerdetails_16x16.png"
2007-11-14 22:18:48 -05:00
# define IMAGE_CHAT ": / images / chat.png"
2008-04-03 17:32:45 -04:00
# define IMAGE_MSG ": / images / message-mail.png"
2009-01-22 20:58:56 -05:00
# define IMAGE_CONNECT ": / images / connect_friend.png"
2007-11-14 22:18:48 -05:00
/* Images for Status icons */
2008-07-10 06:34:49 -04:00
# define IMAGE_ONLINE ": / images / user / identity24.png"
2010-06-05 18:42:32 -04:00
# define IMAGE_AWAY ": / images / user / identity24away.png"
# define IMAGE_BUSY ": / images / user / identity24busy.png"
2010-06-05 19:27:08 -04:00
# define IMAGE_INACTIVE ": / images / user / identity24idle.png"
2008-07-11 11:51:49 -04:00
# define IMAGE_OFFLINE ": / images / user / identityoffline24.png"
2008-11-24 09:07:26 -05:00
# define IMAGE_OFFLINE2 ": / images / user / identitylightgrey24.png"
2009-04-29 11:48:01 -04:00
# define IMAGE_AVAIBLE ": / images / user / identityavaiblecyan24.png"
2009-10-15 12:39:21 -04:00
# define IMAGE_UNREACHABLE ": / images / user / identityunreachable24.png"
2009-04-29 11:48:01 -04:00
# define IMAGE_CONNECT2 ": / images / reload24.png"
2008-11-24 09:07:26 -05:00
2010-06-08 17:38:36 -04:00
# define COLUMN_COUNT 3
# define COLUMN_NAME 0
# define COLUMN_STATE 1
# define COLUMN_INFO 2
# define COLUMN_ID 3
// states for sorting (equal values are possible)
// used in BuildSortString - state + name
# define PEER_STATE_ONLINE 1
# define PEER_STATE_AWAY 2
# define PEER_STATE_BUSY 3
# define PEER_STATE_AVAILABLE 4
# define PEER_STATE_INACTIVE 5
# define PEER_STATE_OFFLINE 6
2008-07-09 05:53:47 -04:00
/******
* # define PEERS_DEBUG 1
* * * * */
2010-06-08 17:38:36 -04:00
// quick and dirty for sorting, better use QTreeView and QSortFilterProxyModel
class MyTreeWidgetItem : public QTreeWidgetItem
{
public :
MyTreeWidgetItem ( QTreeWidget * pWidget , int type ) : QTreeWidgetItem ( type )
{
m_pWidget = pWidget ; // can't access the member "view"
}
bool operator < ( const QTreeWidgetItem & other ) const
{
2010-06-11 19:28:05 -04:00
int role = Qt : : DisplayRole ;
2010-06-08 17:38:36 -04:00
int column = m_pWidget ? m_pWidget - > sortColumn ( ) : 0 ;
2010-06-11 19:28:05 -04:00
switch ( column ) {
case COLUMN_STATE :
// sort by state set in user role
role = Qt : : UserRole ;
// no break;
case COLUMN_NAME :
{
const QVariant v1 = data ( column , role ) ;
const QVariant v2 = other . data ( column , role ) ;
return ( v1 . toString ( ) . compare ( v2 . toString ( ) , Qt : : CaseInsensitive ) < 0 ) ;
}
2010-06-08 17:38:36 -04:00
}
// let the standard do the sort
return QTreeWidgetItem : : operator < ( other ) ;
}
private :
QTreeWidget * m_pWidget ; // the member "view" is private
} ;
2008-07-09 05:53:47 -04:00
2008-11-24 09:07:26 -05:00
/** Constructor */
PeersDialog : : PeersDialog ( QWidget * parent )
2010-01-02 16:45:46 -05:00
: RsAutoUpdatePage ( 1500 , parent ) ,
2010-05-12 15:03:30 -04:00
historyKeeper ( Rshare : : dataDirectory ( ) + " /his1.xml " ) ,
smWidget ( 0 )
2008-11-24 09:07:26 -05:00
{
/* Invoke the Qt Designer generated object setup routine */
ui . setupUi ( this ) ;
2009-10-08 15:08:44 -04:00
2009-09-30 18:30:57 -04:00
last_status_send_time = 0 ;
2010-01-18 17:44:09 -05:00
2008-11-24 09:07:26 -05:00
connect ( ui . peertreeWidget , SIGNAL ( customContextMenuRequested ( QPoint ) ) , this , SLOT ( peertreeWidgetCostumPopupMenu ( QPoint ) ) ) ;
2010-04-15 08:02:23 -04:00
connect ( ui . peertreeWidget , SIGNAL ( itemDoubleClicked ( QTreeWidgetItem * , int ) ) , this , SLOT ( chatfriend ( QTreeWidgetItem * ) ) ) ;
connect ( this , SIGNAL ( startChat ( QTreeWidgetItem * ) ) , this , SLOT ( chatfriend ( QTreeWidgetItem * ) ) ) ;
2007-11-14 22:18:48 -05:00
2009-09-02 18:42:31 -04:00
connect ( ui . avatartoolButton , SIGNAL ( clicked ( ) ) , SLOT ( getAvatar ( ) ) ) ;
2009-10-08 15:08:44 -04:00
connect ( ui . mypersonalstatuslabel , SIGNAL ( clicked ( ) ) , SLOT ( statusmessage ( ) ) ) ;
2010-01-16 20:36:50 -05:00
connect ( ui . actionSet_your_Avatar , SIGNAL ( triggered ( ) ) , this , SLOT ( getAvatar ( ) ) ) ;
connect ( ui . actionSet_your_Personal_Message , SIGNAL ( triggered ( ) ) , this , SLOT ( statusmessage ( ) ) ) ;
2010-01-31 17:29:30 -05:00
connect ( ui . addfileButton , SIGNAL ( clicked ( ) ) , this , SLOT ( addExtraFile ( ) ) ) ;
connect ( ui . msgText , SIGNAL ( anchorClicked ( const QUrl & ) ) , SLOT ( anchorClicked ( const QUrl & ) ) ) ;
2010-01-16 20:36:50 -05:00
2010-01-19 16:43:40 -05:00
connect ( ui . hide_unconnected , SIGNAL ( clicked ( ) ) , this , SLOT ( insertPeers ( ) ) ) ;
2010-01-31 17:29:30 -05:00
ui . peertabWidget - > setTabPosition ( QTabWidget : : North ) ;
2009-09-25 21:10:25 -04:00
ui . peertabWidget - > addTab ( new ProfileWidget ( ) , QString ( tr ( " Profile " ) ) ) ;
2010-01-03 08:54:38 -05:00
ui . peertreeWidget - > setColumnCount ( 4 ) ;
2010-01-02 16:45:46 -05:00
ui . peertreeWidget - > setColumnHidden ( 3 , true ) ;
2010-01-13 16:16:18 -05:00
ui . peertreeWidget - > setColumnHidden ( 2 , true ) ;
2010-01-18 17:42:10 -05:00
ui . peertreeWidget - > sortItems ( 0 , Qt : : AscendingOrder ) ;
2009-07-13 15:58:11 -04:00
2010-06-08 17:38:36 -04:00
// set header text aligment
QTreeWidgetItem * headerItem = ui . peertreeWidget - > headerItem ( ) ;
headerItem - > setTextAlignment ( COLUMN_NAME , Qt : : AlignHCenter | Qt : : AlignVCenter ) ;
headerItem - > setTextAlignment ( COLUMN_STATE , Qt : : AlignLeft | Qt : : AlignVCenter ) ;
headerItem - > setTextAlignment ( COLUMN_INFO , Qt : : AlignHCenter | Qt : : AlignVCenter ) ;
2008-07-12 07:57:09 -04:00
2008-07-10 06:34:49 -04:00
connect ( ui . lineEdit , SIGNAL ( textChanged ( ) ) , this , SLOT ( checkChat ( ) ) ) ;
connect ( ui . Sendbtn , SIGNAL ( clicked ( ) ) , this , SLOT ( sendMsg ( ) ) ) ;
2008-11-24 09:07:26 -05:00
connect ( ui . emoticonBtn , SIGNAL ( clicked ( ) ) , this , SLOT ( smileyWidgetgroupchat ( ) ) ) ;
2008-07-10 06:34:49 -04:00
2010-03-17 11:34:36 -04:00
ui . lineEdit - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
connect ( ui . lineEdit , SIGNAL ( customContextMenuRequested ( QPoint ) ) , this , SLOT ( contextMenu ( QPoint ) ) ) ;
pasteLinkAct = new QAction ( QIcon ( " :/images/pasterslink.png " ) , tr ( " Paste retroshare Link " ) , this ) ;
connect ( pasteLinkAct , SIGNAL ( triggered ( ) ) , this , SLOT ( pasteLink ( ) ) ) ;
2009-07-13 15:58:11 -04:00
2008-07-10 06:34:49 -04:00
connect ( ui . msgText , SIGNAL ( customContextMenuRequested ( const QPoint & ) ) , this , SLOT ( displayInfoChatMenu ( const QPoint & ) ) ) ;
2009-07-13 15:58:11 -04:00
connect ( ui . textboldChatButton , SIGNAL ( clicked ( ) ) , this , SLOT ( setFont ( ) ) ) ;
connect ( ui . textunderlineChatButton , SIGNAL ( clicked ( ) ) , this , SLOT ( setFont ( ) ) ) ;
2008-07-10 06:34:49 -04:00
connect ( ui . textitalicChatButton , SIGNAL ( clicked ( ) ) , this , SLOT ( setFont ( ) ) ) ;
2009-07-13 15:58:11 -04:00
connect ( ui . fontsButton , SIGNAL ( clicked ( ) ) , this , SLOT ( getFont ( ) ) ) ;
2008-07-10 06:34:49 -04:00
connect ( ui . colorChatButton , SIGNAL ( clicked ( ) ) , this , SLOT ( setColor ( ) ) ) ;
2010-04-27 18:08:38 -04:00
connect ( ui . actionSave_History , SIGNAL ( triggered ( ) ) , this , SLOT ( fileSaveAs ( ) ) ) ;
2009-07-13 15:58:11 -04:00
2008-07-10 06:34:49 -04:00
ui . fontsButton - > setIcon ( QIcon ( QString ( " :/images/fonts.png " ) ) ) ;
2009-07-13 15:58:11 -04:00
2008-07-10 06:34:49 -04:00
_currentColor = Qt : : black ;
2009-01-22 20:58:56 -05:00
QPixmap pxm ( 16 , 16 ) ;
2008-07-10 06:34:49 -04:00
pxm . fill ( _currentColor ) ;
ui . colorChatButton - > setIcon ( pxm ) ;
2009-07-13 15:58:11 -04:00
2010-05-20 17:53:27 -04:00
Settings - > beginGroup ( QString ( " Chat " ) ) ;
mCurrentFont . fromString ( Settings - > value ( QString : : fromUtf8 ( " ChatScreenFont " ) ) . toString ( ) ) ;
2008-07-10 06:34:49 -04:00
ui . lineEdit - > setFont ( mCurrentFont ) ;
2010-05-20 17:53:27 -04:00
2010-05-18 14:02:51 -04:00
setChatInfo ( tr ( " Welcome to RetroShare's group chat. " ) , QString : : fromUtf8 ( " blue " ) ) ;
2010-05-11 16:02:52 -04:00
2010-05-20 17:53:27 -04:00
if ( Settings - > value ( QString : : fromUtf8 ( " GroupChat_History " ) , true ) . toBool ( ) )
2010-05-03 17:17:36 -04:00
{
2010-05-18 14:02:51 -04:00
QStringList him ;
2010-05-03 17:17:36 -04:00
historyKeeper . getMessages ( him , " " , " THIS " , 8 ) ;
foreach ( QString mess , him )
ui . msgText - > append ( mess ) ;
}
2010-05-20 17:53:27 -04:00
Settings - > endGroup ( ) ;
2009-07-13 15:58:11 -04:00
2010-05-03 17:17:36 -04:00
//setChatInfo(mess, "green");
2009-07-13 15:58:11 -04:00
2008-11-24 09:07:26 -05:00
QMenu * grpchatmenu = new QMenu ( ) ;
2008-07-10 06:34:49 -04:00
grpchatmenu - > addAction ( ui . actionClearChat ) ;
2010-04-27 18:08:38 -04:00
grpchatmenu - > addAction ( ui . actionSave_History ) ;
2010-05-03 17:17:36 -04:00
//grpchatmenu->addAction(ui.actionDisable_Emoticons);
2008-07-10 06:34:49 -04:00
ui . menuButton - > setMenu ( grpchatmenu ) ;
2009-07-13 15:58:11 -04:00
2008-11-24 09:07:26 -05:00
_underline = false ;
2008-07-10 06:34:49 -04:00
QTimer * timer = new QTimer ( this ) ;
timer - > connect ( timer , SIGNAL ( timeout ( ) ) , this , SLOT ( insertChat ( ) ) ) ;
timer - > start ( 500 ) ; /* half a second */
2009-09-22 18:47:49 -04:00
QMenu * menu = new QMenu ( ) ;
2010-01-18 17:44:09 -05:00
menu - > addAction ( ui . actionAdd_Friend ) ;
2010-01-16 20:36:50 -05:00
menu - > addSeparator ( ) ;
menu - > addAction ( ui . actionCreate_New_Forum ) ;
2010-02-06 15:49:24 -05:00
# ifndef RS_RELEASE_VERSION
2010-01-16 20:36:50 -05:00
menu - > addAction ( ui . actionCreate_New_Channel ) ;
2010-02-06 15:49:24 -05:00
# endif
2010-01-16 20:36:50 -05:00
menu - > addAction ( ui . actionSet_your_Avatar ) ;
menu - > addAction ( ui . actionSet_your_Personal_Message ) ;
2009-09-22 18:47:49 -04:00
ui . menupushButton - > setMenu ( menu ) ;
2010-01-16 21:27:32 -05:00
2010-02-07 07:36:37 -05:00
//ui.msgText->setOpenExternalLinks ( false );
//ui.msgText->setOpenLinks ( false );
2010-01-31 17:29:30 -05:00
setAcceptDrops ( true ) ;
ui . lineEdit - > setAcceptDrops ( false ) ;
2009-09-02 18:42:31 -04:00
updateAvatar ( ) ;
2009-09-29 18:52:46 -04:00
loadmypersonalstatus ( ) ;
2010-01-31 17:29:30 -05:00
loadEmoticonsgroupchat ( ) ;
2008-11-24 09:07:26 -05:00
2010-06-08 17:38:36 -04:00
// load settings
processSettings ( true ) ;
2010-05-06 10:39:50 -04:00
// workaround for Qt bug, should be solved in next Qt release 4.7.0
// http://bugreports.qt.nokia.com/browse/QTBUG-8270
QShortcut * Shortcut = new QShortcut ( QKeySequence ( Qt : : Key_Delete ) , ui . peertreeWidget , 0 , 0 , Qt : : WidgetShortcut ) ;
connect ( Shortcut , SIGNAL ( activated ( ) ) , this , SLOT ( removefriend ( ) ) ) ;
2008-11-24 09:07:26 -05:00
/* Hide platform specific features */
# ifdef Q_WS_WIN
# endif
}
2007-11-14 22:18:48 -05:00
2010-05-11 16:02:52 -04:00
PeersDialog : : ~ PeersDialog ( )
{
2010-06-08 17:38:36 -04:00
// save settings
processSettings ( false ) ;
2010-05-11 16:02:52 -04:00
std : : map < std : : string , PopupChatDialog * > : : iterator it ;
for ( it = chatDialogs . begin ( ) ; it ! = chatDialogs . end ( ) ; it + + ) {
if ( it - > second ) {
delete ( it - > second ) ;
}
}
2010-05-12 15:03:30 -04:00
delete smWidget ;
2010-05-11 16:02:52 -04:00
}
2010-06-08 17:38:36 -04:00
void PeersDialog : : processSettings ( bool bLoad )
{
QHeaderView * header = ui . peertreeWidget - > header ( ) ;
Settings - > beginGroup ( QString ( " PeersDialog " ) ) ;
if ( bLoad ) {
// load settings
// state of peer tree
header - > restoreState ( Settings - > value ( " PeerTree " ) . toByteArray ( ) ) ;
// state of splitter
ui . splitter - > restoreState ( Settings - > value ( " Splitter " ) . toByteArray ( ) ) ;
} else {
// save settings
// state of peer tree
Settings - > setValue ( " PeerTree " , header - > saveState ( ) ) ;
// state of splitter
Settings - > setValue ( " Splitter " , ui . splitter - > saveState ( ) ) ;
}
Settings - > endGroup ( ) ;
}
2010-03-17 11:34:36 -04:00
void PeersDialog : : pasteLink ( )
{
ui . lineEdit - > insertHtml ( RSLinkClipboard : : toHtml ( ) ) ;
}
void PeersDialog : : contextMenu ( QPoint point )
{
if ( RSLinkClipboard : : empty ( ) )
return ;
QMenu contextMnu ( this ) ;
contextMnu . addAction ( pasteLinkAct ) ;
2010-05-14 16:55:44 -04:00
contextMnu . exec ( QCursor : : pos ( ) ) ;
2010-03-17 11:34:36 -04:00
}
2008-11-24 09:07:26 -05:00
void PeersDialog : : peertreeWidgetCostumPopupMenu ( QPoint point )
{
2010-02-14 09:17:58 -05:00
QTreeWidgetItem * c = getCurrentPeer ( ) ;
if ( ! c ) {
//no peer selected
return ;
}
2008-11-24 09:07:26 -05:00
2010-01-18 17:44:40 -05:00
QAction * expandAll = new QAction ( tr ( " Expand all " ) , this ) ;
connect ( expandAll , SIGNAL ( triggered ( ) ) , ui . peertreeWidget , SLOT ( expandAll ( ) ) ) ;
QAction * collapseAll = new QAction ( tr ( " Collapse all " ) , this ) ;
connect ( collapseAll , SIGNAL ( triggered ( ) ) , ui . peertreeWidget , SLOT ( collapseAll ( ) ) ) ;
2008-11-24 09:07:26 -05:00
chatAct = new QAction ( QIcon ( IMAGE_CHAT ) , tr ( " Chat " ) , this ) ;
2010-04-15 08:02:23 -04:00
connect ( chatAct , SIGNAL ( triggered ( ) ) , this , SLOT ( chatfriendproxy ( ) ) ) ;
2007-11-14 22:18:48 -05:00
2008-11-24 09:07:26 -05:00
msgAct = new QAction ( QIcon ( IMAGE_MSG ) , tr ( " Message Friend " ) , this ) ;
2007-11-14 22:18:48 -05:00
connect ( msgAct , SIGNAL ( triggered ( ) ) , this , SLOT ( msgfriend ( ) ) ) ;
2009-01-22 20:58:56 -05:00
connectfriendAct = new QAction ( QIcon ( IMAGE_CONNECT ) , tr ( " Connect To Friend " ) , this ) ;
2008-11-24 09:07:26 -05:00
connect ( connectfriendAct , SIGNAL ( triggered ( ) ) , this , SLOT ( connectfriend ( ) ) ) ;
2009-07-13 15:58:11 -04:00
2008-11-24 09:07:26 -05:00
configurefriendAct = new QAction ( QIcon ( IMAGE_PEERINFO ) , tr ( " Peer Details " ) , this ) ;
2007-11-14 22:18:48 -05:00
connect ( configurefriendAct , SIGNAL ( triggered ( ) ) , this , SLOT ( configurefriend ( ) ) ) ;
2009-01-22 20:58:56 -05:00
profileviewAct = new QAction ( QIcon ( IMAGE_PEERINFO ) , tr ( " Profile View " ) , this ) ;
connect ( profileviewAct , SIGNAL ( triggered ( ) ) , this , SLOT ( viewprofile ( ) ) ) ;
2009-07-13 15:58:11 -04:00
2008-11-24 09:07:26 -05:00
exportfriendAct = new QAction ( QIcon ( IMAGE_EXPIORTFRIEND ) , tr ( " Export Friend " ) , this ) ;
2007-11-14 22:18:48 -05:00
connect ( exportfriendAct , SIGNAL ( triggered ( ) ) , this , SLOT ( exportfriend ( ) ) ) ;
2009-07-13 15:58:11 -04:00
2010-01-13 16:32:56 -05:00
if ( c - > type ( ) = = 0 ) {
2010-01-18 17:42:10 -05:00
//this is a GPG key
2010-01-13 16:32:56 -05:00
removefriendAct = new QAction ( QIcon ( IMAGE_REMOVEFRIEND ) , tr ( " Deny Friend " ) , this ) ;
} else {
removefriendAct = new QAction ( QIcon ( IMAGE_REMOVEFRIEND ) , tr ( " Remove Friend Location " ) , this ) ;
}
2008-11-24 09:07:26 -05:00
connect ( removefriendAct , SIGNAL ( triggered ( ) ) , this , SLOT ( removefriend ( ) ) ) ;
2007-11-14 22:18:48 -05:00
2009-09-24 17:38:40 -04:00
QWidget * widget = new QWidget ( ) ;
widget - > setStyleSheet ( " .QWidget{background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,stop:0 #FEFEFE, stop:1 #E8E8E8); border: 1px solid #CCCCCC;} " ) ;
QHBoxLayout * hbox = new QHBoxLayout ( ) ;
hbox - > setMargin ( 0 ) ;
hbox - > setSpacing ( 6 ) ;
iconLabel = new QLabel ( this ) ;
iconLabel - > setPixmap ( QPixmap : : QPixmap ( " :/images/user/friends24.png " ) ) ;
iconLabel - > setMaximumSize ( iconLabel - > frameSize ( ) . height ( ) + 24 , 24 ) ;
hbox - > addWidget ( iconLabel ) ;
2010-01-18 17:42:10 -05:00
if ( c - > type ( ) = = 0 ) {
//this is a GPG key
textLabel = new QLabel ( tr ( " <strong>GPG Key</strong> " ) , this ) ;
} else {
2010-01-30 06:24:06 -05:00
textLabel = new QLabel ( tr ( " <strong>RetroShare instance</strong> " ) , this ) ;
2010-01-18 17:42:10 -05:00
}
2009-09-24 17:38:40 -04:00
hbox - > addWidget ( textLabel ) ;
spacerItem = new QSpacerItem ( 40 , 20 , QSizePolicy : : Expanding , QSizePolicy : : Minimum ) ;
hbox - > addItem ( spacerItem ) ;
widget - > setLayout ( hbox ) ;
QWidgetAction * widgetAction = new QWidgetAction ( this ) ;
widgetAction - > setDefaultWidget ( widget ) ;
2010-05-14 16:55:44 -04:00
QMenu contextMnu ( this ) ;
2009-09-24 17:38:40 -04:00
contextMnu . addAction ( widgetAction ) ;
2010-01-18 17:50:14 -05:00
contextMnu . addAction ( chatAct ) ;
contextMnu . addAction ( msgAct ) ;
2007-11-14 22:18:48 -05:00
contextMnu . addAction ( configurefriendAct ) ;
2010-02-04 16:21:56 -05:00
//contextMnu.addAction( profileviewAct);
2010-01-18 17:42:10 -05:00
if ( c - > type ( ) ! = 0 ) {
//this is a SSL key
contextMnu . addAction ( connectfriendAct ) ;
}
2008-11-24 09:07:26 -05:00
contextMnu . addAction ( removefriendAct ) ;
2010-01-18 17:42:10 -05:00
//contextMnu.addAction( exportfriendAct);
2010-01-19 16:21:11 -05:00
contextMnu . addSeparator ( ) ;
contextMnu . addAction ( expandAll ) ;
contextMnu . addAction ( collapseAll ) ;
2010-05-14 16:55:44 -04:00
contextMnu . exec ( QCursor : : pos ( ) ) ;
2008-11-24 09:07:26 -05:00
}
2010-05-06 10:39:50 -04:00
// replaced by shortcut
//void PeersDialog::keyPressEvent(QKeyEvent *e)
//{
// if(e->key() == Qt::Key_Delete)
// {
// removefriend() ;
// e->accept() ;
// }
// else
// MainPage::keyPressEvent(e) ;
//}
2010-01-17 12:58:28 -05:00
2009-11-17 07:45:06 -05:00
void PeersDialog : : updateDisplay ( )
{
2010-01-19 16:43:13 -05:00
// add self nick and Avatar to Friends.
RsPeerDetails pd ;
if ( rsPeers - > getPeerDetails ( rsPeers - > getOwnId ( ) , pd ) ) {
QString titleStr ( " <span style= \" font-size:16pt; font-weight:500; "
" color:#32cd32; \" >%1</span> " ) ;
ui . nicklabel - > setText ( titleStr . arg ( QString : : fromStdString ( pd . name ) + tr ( " (me) " ) + QString : : fromStdString ( pd . location ) ) ) ;
}
insertPeers ( ) ;
2009-11-17 07:45:06 -05:00
}
2007-11-14 22:18:48 -05:00
2010-06-08 17:38:36 -04:00
static QString BuildSortString ( QTreeWidgetItem * pItem , int nState )
{
return QString ( " %1 " ) . arg ( nState ) + " " + pItem - > text ( COLUMN_NAME ) ;
}
2007-11-14 22:18:48 -05:00
/* get the list of peers from the RsIface. */
void PeersDialog : : insertPeers ( )
{
2010-02-08 09:06:43 -05:00
# ifdef PEERS_DEBUG
std : : cerr < < " PeersDialog::insertPeers() called. " < < std : : endl ;
# endif
2010-01-13 16:16:18 -05:00
std : : list < std : : string > gpgFriends ;
2010-06-05 18:42:32 -04:00
std : : list < std : : string > : : iterator it ;
2010-06-08 17:38:36 -04:00
2010-06-05 18:42:32 -04:00
std : : list < StatusInfo > statusInfo ;
rsStatus - > getStatus ( statusInfo ) ;
2007-11-14 22:18:48 -05:00
2010-01-03 08:54:38 -05:00
if ( ! rsPeers ) {
2008-01-25 03:49:40 -05:00
/* not ready yet! */
2010-01-19 16:43:13 -05:00
std : : cerr < < " PeersDialog::insertPeers() not ready yet : rsPeers unintialized. " < < std : : endl ;
2008-01-25 03:49:40 -05:00
return ;
}
2010-06-08 17:38:36 -04:00
bool bHideUnconnected = ui . hide_unconnected - > isChecked ( ) ;
2010-01-13 16:22:52 -05:00
rsPeers - > getGPGAcceptedList ( gpgFriends ) ;
2007-11-14 22:18:48 -05:00
2010-01-13 19:38:36 -05:00
//add own gpg id, if we have more than on location (ssl client)
std : : list < std : : string > ownSslContacts ;
2010-05-29 17:56:34 -04:00
std : : string ownId = rsPeers - > getGPGOwnId ( ) ;
rsPeers - > getSSLChildListOfGPGId ( ownId , ownSslContacts ) ;
2010-01-13 19:38:36 -05:00
if ( ownSslContacts . size ( ) > 0 ) {
2010-05-29 17:56:34 -04:00
gpgFriends . push_back ( ownId ) ;
2010-01-13 19:38:36 -05:00
}
2007-11-14 22:18:48 -05:00
/* get a link to the table */
2010-01-13 16:25:18 -05:00
QTreeWidget * peertreeWidget = ui . peertreeWidget ;
2010-01-02 16:45:46 -05:00
2010-03-06 16:30:18 -05:00
//remove items that are not friends anymore
2010-01-13 16:25:18 -05:00
int index = 0 ;
while ( index < peertreeWidget - > topLevelItemCount ( ) ) {
2010-06-08 17:38:36 -04:00
std : : string gpg_widget_id = ( peertreeWidget - > topLevelItem ( index ) ) - > text ( COLUMN_ID ) . toStdString ( ) ;
2010-01-19 08:09:11 -05:00
std : : list < std : : string > : : iterator gpgfriendIt ;
bool found = false ;
for ( gpgfriendIt = gpgFriends . begin ( ) ; gpgfriendIt ! = gpgFriends . end ( ) ; gpgfriendIt + + ) {
if ( gpg_widget_id = = * gpgfriendIt ) {
found = true ;
break ;
}
}
if ( ! found ) {
2010-05-02 20:09:55 -04:00
delete ( peertreeWidget - > takeTopLevelItem ( index ) ) ;
2010-01-13 16:25:18 -05:00
} else {
index + + ;
}
}
2010-01-13 16:16:18 -05:00
//add the gpg friends
for ( it = gpgFriends . begin ( ) ; it ! = gpgFriends . end ( ) ; it + + ) {
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
std : : cerr < < " PeersDialog::insertPeers() inserting gpg_id : " < < * it < < std : : endl ;
# endif
2009-07-13 15:58:11 -04:00
2010-01-13 16:22:52 -05:00
/* make a widget per friend */
2010-05-12 16:10:22 -04:00
QTreeWidgetItem * gpg_item = NULL ;
2010-06-08 17:38:36 -04:00
QList < QTreeWidgetItem * > list = peertreeWidget - > findItems ( QString : : fromStdString ( * it ) , Qt : : MatchExactly , COLUMN_ID ) ;
2010-05-12 16:10:22 -04:00
if ( list . size ( ) > 0 ) {
2010-01-13 16:25:18 -05:00
gpg_item = list . front ( ) ;
2010-01-13 16:22:52 -05:00
}
2009-07-13 15:58:11 -04:00
2010-01-13 16:25:18 -05:00
RsPeerDetails detail ;
2010-01-13 19:38:36 -05:00
if ( ( ! rsPeers - > getPeerDetails ( * it , detail ) | | ! detail . accept_connection )
2010-05-29 17:56:34 -04:00
& & detail . gpg_id ! = ownId ) {
2010-01-13 16:25:18 -05:00
//don't accept anymore connection, remove from the view
2010-05-12 16:10:22 -04:00
if ( gpg_item ) {
delete ( peertreeWidget - > takeTopLevelItem ( peertreeWidget - > indexOfTopLevelItem ( gpg_item ) ) ) ;
}
2010-01-13 16:25:18 -05:00
continue ;
}
2007-11-14 22:18:48 -05:00
2010-05-12 16:10:22 -04:00
if ( gpg_item = = NULL ) {
2010-06-08 17:38:36 -04:00
gpg_item = new MyTreeWidgetItem ( peertreeWidget , 0 ) ; //set type to 0 for custom popup menu
2010-05-12 16:10:22 -04:00
gpg_item - > setChildIndicatorPolicy ( QTreeWidgetItem : : DontShowIndicatorWhenChildless ) ;
}
2010-06-08 17:38:36 -04:00
gpg_item - > setText ( COLUMN_NAME , QString : : fromStdString ( detail . name ) ) ;
gpg_item - > setSizeHint ( COLUMN_NAME , QSize ( 26 , 26 ) ) ;
2010-05-25 11:47:12 -04:00
2010-01-02 16:45:46 -05:00
2010-06-08 17:38:36 -04:00
gpg_item - > setTextAlignment ( COLUMN_NAME , Qt : : AlignLeft | Qt : : AlignVCenter ) ;
2009-07-13 15:58:11 -04:00
2010-01-13 16:16:18 -05:00
2010-01-13 16:25:18 -05:00
/* not displayed, used to find back the item */
2010-06-08 17:38:36 -04:00
gpg_item - > setText ( COLUMN_ID , QString : : fromStdString ( detail . id ) ) ;
2010-01-13 16:25:18 -05:00
//remove items that are not friends anymore
int childIndex = 0 ;
while ( childIndex < gpg_item - > childCount ( ) ) {
2010-06-08 17:38:36 -04:00
std : : string ssl_id = ( gpg_item - > child ( childIndex ) ) - > text ( COLUMN_ID ) . toStdString ( ) ;
2010-01-13 16:25:18 -05:00
if ( ! rsPeers - > isFriend ( ssl_id ) ) {
2010-05-02 20:09:55 -04:00
delete ( gpg_item - > takeChild ( childIndex ) ) ;
2010-01-13 16:25:18 -05:00
} else {
childIndex + + ;
}
}
2010-01-13 16:16:18 -05:00
2010-01-13 16:25:18 -05:00
//update the childs (ssl certs)
2010-01-18 17:42:10 -05:00
bool gpg_connected = false ;
bool gpg_online = false ;
2010-01-13 16:22:52 -05:00
std : : list < std : : string > sslContacts ;
rsPeers - > getSSLChildListOfGPGId ( detail . gpg_id , sslContacts ) ;
for ( std : : list < std : : string > : : iterator sslIt = sslContacts . begin ( ) ; sslIt ! = sslContacts . end ( ) ; sslIt + + ) {
2010-05-12 16:10:22 -04:00
QTreeWidgetItem * sslItem = NULL ;
2010-01-13 16:25:18 -05:00
//find the corresponding sslItem child item of the gpg item
bool newChild = true ;
for ( int childIndex = 0 ; childIndex < gpg_item - > childCount ( ) ; childIndex + + ) {
2010-06-08 17:38:36 -04:00
if ( gpg_item - > child ( childIndex ) - > text ( COLUMN_ID ) . toStdString ( ) = = * sslIt ) {
2010-01-13 16:25:18 -05:00
sslItem = gpg_item - > child ( childIndex ) ;
newChild = false ;
2010-01-13 16:22:52 -05:00
break ;
2010-01-03 08:54:38 -05:00
}
2010-01-13 16:22:52 -05:00
}
2010-01-13 16:25:18 -05:00
RsPeerDetails sslDetail ;
if ( ! rsPeers - > getPeerDetails ( * sslIt , sslDetail ) | | ! rsPeers - > isFriend ( * sslIt ) ) {
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2010-01-13 16:25:18 -05:00
std : : cerr < < " Removing widget from the view : id : " < < * sslIt < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2010-01-13 16:25:18 -05:00
//child has disappeared, remove it from the gpg_item
2010-05-12 16:10:22 -04:00
if ( sslItem ) {
gpg_item - > removeChild ( sslItem ) ;
}
}
if ( newChild ) {
2010-06-08 17:38:36 -04:00
sslItem = new MyTreeWidgetItem ( peertreeWidget , 1 ) ; //set type to 1 for custom popup menu
2010-01-13 16:25:18 -05:00
}
2010-01-13 16:22:52 -05:00
/* not displayed, used to find back the item */
2010-06-08 17:38:36 -04:00
sslItem - > setText ( COLUMN_ID , QString : : fromStdString ( sslDetail . id ) ) ;
2010-01-13 16:16:18 -05:00
2010-05-29 17:56:34 -04:00
QString sText ;
std : : string customStateString = rsMsgs - > getCustomStateString ( sslDetail . id ) ;
2010-06-08 17:38:36 -04:00
sText = tr ( " location : " ) + QString : : fromStdString ( sslDetail . location ) ;
2010-05-29 17:56:34 -04:00
if ( customStateString . empty ( ) = = false ) {
2010-06-08 17:38:36 -04:00
sText + = tr ( " - " ) + QString : : fromStdString ( customStateString ) ;
2010-01-13 16:22:52 -05:00
}
2010-06-08 17:38:36 -04:00
sslItem - > setText ( COLUMN_NAME , sText ) ;
sslItem - > setToolTip ( COLUMN_NAME , sText ) ;
2010-01-13 16:22:52 -05:00
2010-01-16 13:03:35 -05:00
/* not displayed, used to find back the item */
2010-06-08 17:38:36 -04:00
sslItem - > setText ( COLUMN_STATE , QString : : fromStdString ( sslDetail . autoconnect ) ) ;
// sort location
sslItem - > setData ( COLUMN_STATE , Qt : : UserRole , sText ) ;
2010-01-13 16:22:52 -05:00
/* change color and icon */
int i ;
if ( sslDetail . state & RS_PEER_STATE_CONNECTED ) {
2010-01-19 16:43:40 -05:00
sslItem - > setHidden ( false ) ;
2010-01-18 17:42:10 -05:00
gpg_connected = true ;
2010-06-08 17:38:36 -04:00
sslItem - > setIcon ( COLUMN_NAME , ( QIcon ( " :/images/connect_established.png " ) ) ) ;
sslItem - > setIcon ( COLUMN_STATE , ( QIcon ( " :/images/encrypted32.png " ) ) ) ;
2010-01-13 16:22:52 -05:00
QFont font ;
font . setBold ( true ) ;
2010-06-08 17:38:36 -04:00
for ( i = 0 ; i < COLUMN_COUNT ; i + + ) {
2010-01-17 16:41:22 -05:00
sslItem - > setTextColor ( i , ( Qt : : darkBlue ) ) ;
2010-01-13 16:22:52 -05:00
sslItem - > setFont ( i , font ) ;
}
2010-01-18 17:42:10 -05:00
} else if ( sslDetail . state & RS_PEER_STATE_ONLINE ) {
2010-06-08 17:38:36 -04:00
sslItem - > setHidden ( bHideUnconnected ) ;
2010-01-18 17:42:10 -05:00
gpg_online = true ;
2010-01-17 06:59:49 -05:00
2010-01-13 16:22:52 -05:00
QFont font ;
font . setBold ( true ) ;
2010-06-08 17:38:36 -04:00
for ( i = 0 ; i < COLUMN_COUNT ; i + + ) {
2010-01-18 17:42:10 -05:00
sslItem - > setTextColor ( i , ( Qt : : black ) ) ;
2010-01-13 16:22:52 -05:00
sslItem - > setFont ( i , font ) ;
}
} else {
2010-06-08 17:38:36 -04:00
sslItem - > setHidden ( bHideUnconnected ) ;
if ( sslDetail . autoconnect ! = " Offline " ) {
sslItem - > setIcon ( COLUMN_NAME , ( QIcon ( " :/images/connect_creating.png " ) ) ) ;
2010-01-03 08:54:38 -05:00
} else {
2010-06-08 17:38:36 -04:00
sslItem - > setIcon ( COLUMN_NAME , ( QIcon ( " :/images/connect_no.png " ) ) ) ;
2010-01-03 08:54:38 -05:00
}
2010-01-18 17:42:10 -05:00
2010-01-13 16:22:52 -05:00
QFont font ;
font . setBold ( false ) ;
2010-06-08 17:38:36 -04:00
for ( i = 0 ; i < COLUMN_COUNT ; i + + ) {
2010-01-13 16:22:52 -05:00
sslItem - > setTextColor ( i , ( Qt : : black ) ) ;
sslItem - > setFont ( i , font ) ;
2010-01-03 08:54:38 -05:00
}
2010-01-13 16:16:18 -05:00
}
2010-01-13 16:22:52 -05:00
# ifdef PEERS_DEBUG
std : : cerr < < " PeersDialog::insertPeers() inserting sslItem. " < < std : : endl ;
# endif
2010-06-08 17:38:36 -04:00
/* add ssl child to the list. If item is already in the list, it won't be duplicated thanks to Qt */
2010-01-13 16:25:18 -05:00
if ( newChild ) {
2010-05-12 16:10:22 -04:00
gpg_item - > addChild ( sslItem ) ;
2010-01-13 16:25:18 -05:00
gpg_item - > setExpanded ( true ) ;
2010-01-13 16:22:52 -05:00
}
2010-01-13 16:16:18 -05:00
}
2010-01-13 16:25:18 -05:00
2010-01-18 17:42:10 -05:00
int i = 0 ;
if ( gpg_connected ) {
2010-01-19 16:43:40 -05:00
gpg_item - > setHidden ( false ) ;
2010-06-08 17:38:36 -04:00
gpg_item - > setIcon ( COLUMN_NAME , ( QIcon ( IMAGE_ONLINE ) ) ) ;
gpg_item - > setText ( COLUMN_STATE , tr ( " Online " ) ) ;
gpg_item - > setData ( COLUMN_STATE , Qt : : UserRole , BuildSortString ( gpg_item , PEER_STATE_ONLINE ) ) ;
std : : list < StatusInfo > : : iterator it ;
for ( it = statusInfo . begin ( ) ; it ! = statusInfo . end ( ) ; it + + ) {
std : : list < std : : string > : : iterator cont_it ;
// don't forget the kids
for ( cont_it = sslContacts . begin ( ) ; cont_it ! = sslContacts . end ( ) ; cont_it + + ) {
if ( ( it - > id = = * cont_it ) & & ( rsPeers - > isOnline ( * cont_it ) ) ) {
std : : string status ;
rsStatus - > getStatusString ( it - > status , status ) ;
gpg_item - > setText ( COLUMN_INFO , QString : : fromStdString ( status ) ) ;
QFont font ;
font . setBold ( true ) ;
if ( it - > status = = RS_STATUS_INACTIVE )
{
gpg_item - > setIcon ( COLUMN_NAME , ( QIcon ( IMAGE_INACTIVE ) ) ) ;
gpg_item - > setToolTip ( COLUMN_NAME , tr ( " Peer Idle " ) ) ;
gpg_item - > setText ( COLUMN_STATE , tr ( " Idle " ) ) ;
gpg_item - > setData ( COLUMN_STATE , Qt : : UserRole , BuildSortString ( gpg_item , PEER_STATE_INACTIVE ) ) ;
for ( i = 0 ; i < COLUMN_COUNT ; i + + ) {
gpg_item - > setTextColor ( i , ( Qt : : gray ) ) ;
gpg_item - > setFont ( i , font ) ;
}
}
else if ( it - > status = = RS_STATUS_ONLINE )
{
gpg_item - > setIcon ( COLUMN_NAME , ( QIcon ( IMAGE_ONLINE ) ) ) ;
gpg_item - > setToolTip ( COLUMN_NAME , tr ( " Peer Online " ) ) ;
gpg_item - > setText ( COLUMN_STATE , tr ( " Online " ) ) ;
gpg_item - > setData ( COLUMN_STATE , Qt : : UserRole , BuildSortString ( gpg_item , PEER_STATE_ONLINE ) ) ;
for ( i = 0 ; i < COLUMN_COUNT ; i + + ) {
gpg_item - > setTextColor ( i , ( Qt : : darkBlue ) ) ;
gpg_item - > setFont ( i , font ) ;
}
}
else if ( it - > status = = RS_STATUS_AWAY )
{
gpg_item - > setIcon ( COLUMN_NAME , ( QIcon ( IMAGE_AWAY ) ) ) ;
gpg_item - > setToolTip ( COLUMN_NAME , tr ( " Peer Away " ) ) ;
gpg_item - > setText ( COLUMN_STATE , tr ( " Away " ) ) ;
gpg_item - > setData ( COLUMN_STATE , Qt : : UserRole , BuildSortString ( gpg_item , PEER_STATE_AWAY ) ) ;
for ( i = 0 ; i < COLUMN_COUNT ; i + + ) {
gpg_item - > setTextColor ( i , ( Qt : : gray ) ) ;
gpg_item - > setFont ( i , font ) ;
}
}
else if ( it - > status = = RS_STATUS_BUSY )
{
gpg_item - > setIcon ( COLUMN_NAME , ( QIcon ( IMAGE_BUSY ) ) ) ;
gpg_item - > setToolTip ( COLUMN_NAME , tr ( " Peer Busy " ) ) ;
gpg_item - > setText ( COLUMN_STATE , tr ( " Busy " ) ) ;
gpg_item - > setData ( COLUMN_STATE , Qt : : UserRole , BuildSortString ( gpg_item , PEER_STATE_BUSY ) ) ;
for ( i = 0 ; i < COLUMN_COUNT ; i + + ) {
gpg_item - > setTextColor ( i , ( Qt : : gray ) ) ;
gpg_item - > setFont ( i , font ) ;
}
}
}
2010-06-05 18:42:32 -04:00
}
2010-01-18 17:42:10 -05:00
}
} else if ( gpg_online ) {
2010-06-08 17:38:36 -04:00
gpg_item - > setHidden ( bHideUnconnected ) ;
gpg_item - > setIcon ( COLUMN_NAME , ( QIcon ( IMAGE_AVAIBLE ) ) ) ;
gpg_item - > setText ( COLUMN_STATE , tr ( " Available " ) ) ;
gpg_item - > setData ( COLUMN_STATE , Qt : : UserRole , BuildSortString ( gpg_item , PEER_STATE_AVAILABLE ) ) ;
2010-01-18 17:42:10 -05:00
QFont font ;
font . setBold ( true ) ;
2010-06-08 17:38:36 -04:00
for ( i = 0 ; i < COLUMN_COUNT ; i + + ) {
2010-01-18 17:42:10 -05:00
gpg_item - > setTextColor ( i , ( Qt : : black ) ) ;
gpg_item - > setFont ( i , font ) ;
}
} else {
2010-06-08 17:38:36 -04:00
gpg_item - > setHidden ( bHideUnconnected ) ;
gpg_item - > setIcon ( COLUMN_NAME , ( QIcon ( IMAGE_OFFLINE ) ) ) ;
gpg_item - > setText ( COLUMN_STATE , tr ( " Offline " ) ) ;
gpg_item - > setData ( COLUMN_STATE , Qt : : UserRole , BuildSortString ( gpg_item , PEER_STATE_OFFLINE ) ) ;
2010-01-18 17:42:10 -05:00
QFont font ;
font . setBold ( false ) ;
2010-06-08 17:38:36 -04:00
for ( i = 0 ; i < COLUMN_COUNT ; i + + ) {
2010-01-18 17:42:10 -05:00
gpg_item - > setTextColor ( i , ( Qt : : black ) ) ;
gpg_item - > setFont ( i , font ) ;
}
}
2010-01-13 16:25:18 -05:00
2010-01-18 17:42:10 -05:00
/* add gpg item to the list. If item is already in the list, it won't be duplicated thanks to Qt */
peertreeWidget - > addTopLevelItem ( gpg_item ) ;
2010-01-13 16:22:52 -05:00
}
2007-11-14 22:18:48 -05:00
}
/* Utility Fns */
std : : string getPeerRsCertId ( QTreeWidgetItem * i )
{
2010-06-08 17:38:36 -04:00
std : : string id = ( i - > text ( COLUMN_ID ) ) . toStdString ( ) ;
2007-11-14 22:18:48 -05:00
return id ;
}
/** Open a QFileDialog to browse for export a file. */
void PeersDialog : : exportfriend ( )
{
QTreeWidgetItem * c = getCurrentPeer ( ) ;
2008-07-09 05:53:47 -04:00
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2007-11-14 22:18:48 -05:00
std : : cerr < < " PeersDialog::exportfriend() " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2007-11-14 22:18:48 -05:00
if ( ! c )
{
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2010-01-13 16:16:18 -05:00
std : : cerr < < " PeersDialog::exportfriend() None Selected -- sorry " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2007-11-14 22:18:48 -05:00
return ;
}
std : : string id = getPeerRsCertId ( c ) ;
QString fileName = QFileDialog : : getSaveFileName ( this , tr ( " Save Certificate " ) , " " ,
tr ( " Certificates (*.pqi) " ) ) ;
std : : string file = fileName . toStdString ( ) ;
if ( file ! = " " )
{
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::exportfriend() Saving to: " < < file < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2008-01-25 03:49:40 -05:00
if ( rsPeers )
{
2010-01-13 16:22:52 -05:00
rsPeers - > saveCertificateToFile ( id , file ) ;
2008-01-25 03:49:40 -05:00
}
2007-11-14 22:18:48 -05:00
}
}
2010-04-15 08:02:23 -04:00
void PeersDialog : : chatfriendproxy ( ) {
2007-11-14 22:18:48 -05:00
2010-04-15 08:02:23 -04:00
QTreeWidgetItem * i = getCurrentPeer ( ) ;
if ( ! i )
return ;
emit startChat ( i ) ;
}
void PeersDialog : : chatfriend ( QTreeWidgetItem * currPeer )
{
// QTreeWidgetItem *currPeer = getCurrentPeer();
if ( ! currPeer ) {
return ;
}
2007-11-14 22:18:48 -05:00
2010-01-18 17:50:14 -05:00
//std::string name = (i -> text(2)).toStdString();
2010-06-08 17:38:36 -04:00
std : : string id = ( currPeer - > text ( COLUMN_ID ) ) . toStdString ( ) ;
2009-07-13 15:58:11 -04:00
2010-01-18 17:50:14 -05:00
bool oneLocationConnected = false ;
2008-01-26 08:08:28 -05:00
RsPeerDetails detail ;
2010-01-18 17:50:14 -05:00
if ( ! rsPeers - > getPeerDetails ( id , detail ) ) {
2008-01-26 08:08:28 -05:00
return ;
}
2007-11-14 22:18:48 -05:00
2010-01-18 17:50:14 -05:00
if ( detail . isOnlyGPGdetail ) {
//let's get the ssl child details, and open all the chat boxes
std : : list < std : : string > sslIds ;
rsPeers - > getSSLChildListOfGPGId ( detail . gpg_id , sslIds ) ;
for ( std : : list < std : : string > : : iterator it = sslIds . begin ( ) ; it ! = sslIds . end ( ) ; it + + ) {
RsPeerDetails sslDetails ;
if ( rsPeers - > getPeerDetails ( * it , sslDetails ) ) {
if ( sslDetails . state & RS_PEER_STATE_CONNECTED ) {
oneLocationConnected = true ;
getPrivateChat ( * it , sslDetails . name + " - " + sslDetails . location , RS_CHAT_REOPEN ) ;
}
}
}
} else {
if ( detail . state & RS_PEER_STATE_CONNECTED ) {
oneLocationConnected = true ;
getPrivateChat ( id , detail . name + " - " + detail . location , RS_CHAT_REOPEN ) ;
}
2008-07-10 14:52:56 -04:00
}
2010-01-18 17:50:14 -05:00
if ( ! oneLocationConnected ) {
2007-11-14 22:18:48 -05:00
/* info dialog */
2010-02-04 18:12:35 -05:00
if ( ( QMessageBox : : question ( this , tr ( " Friend Not Online " ) , tr ( " Your Friend is offline \n Do you want to send them a Message instead " ) , QMessageBox : : Yes | QMessageBox : : No , QMessageBox : : Yes ) ) = = QMessageBox : : Yes )
{
msgfriend ( ) ;
}
2008-07-10 14:52:56 -04:00
}
2007-11-14 22:18:48 -05:00
}
2008-01-26 08:08:28 -05:00
2007-11-14 22:18:48 -05:00
void PeersDialog : : msgfriend ( )
{
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2007-11-14 22:18:48 -05:00
std : : cerr < < " SharedFilesDialog::msgfriend() " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2007-11-14 22:18:48 -05:00
QTreeWidgetItem * i = getCurrentPeer ( ) ;
if ( ! i )
return ;
2010-06-08 17:38:36 -04:00
std : : string id = ( i - > text ( COLUMN_ID ) ) . toStdString ( ) ;
2007-11-14 22:18:48 -05:00
rsicontrol - > ClearInMsg ( ) ;
rsicontrol - > SetInMsg ( id , true ) ;
2010-01-18 17:50:14 -05:00
std : : list < std : : string > sslIds ;
rsPeers - > getSSLChildListOfGPGId ( id , sslIds ) ;
for ( std : : list < std : : string > : : iterator it = sslIds . begin ( ) ; it ! = sslIds . end ( ) ; it + + ) {
//put all sslChilds in message list
rsicontrol - > SetInMsg ( * it , true ) ;
}
2007-11-14 22:18:48 -05:00
/* create a message */
2010-05-25 05:32:14 -04:00
MessageComposer * nMsgDialog = new MessageComposer ( ) ;
2007-11-14 22:18:48 -05:00
nMsgDialog - > newMsg ( ) ;
nMsgDialog - > show ( ) ;
2010-05-02 20:09:55 -04:00
/* window will destroy itself! */
2007-11-14 22:18:48 -05:00
}
QTreeWidgetItem * PeersDialog : : getCurrentPeer ( )
{
/* get the current, and extract the Id */
/* get a link to the table */
QTreeWidget * peerWidget = ui . peertreeWidget ;
QTreeWidgetItem * item = peerWidget - > currentItem ( ) ;
if ( ! item )
{
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2007-11-14 22:18:48 -05:00
std : : cerr < < " Invalid Current Item " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2007-11-14 22:18:48 -05:00
return NULL ;
}
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2007-11-14 22:18:48 -05:00
/* Display the columns of this item. */
std : : ostringstream out ;
out < < " CurrentPeerItem: " < < std : : endl ;
2010-06-08 17:38:36 -04:00
for ( int i = 1 ; i < COLUMN_COUNT ; i + + )
2007-11-14 22:18:48 -05:00
{
QString txt = item - > text ( i ) ;
out < < " \t " < < i < < " : " < < txt . toStdString ( ) < < std : : endl ;
}
std : : cerr < < out . str ( ) ;
2008-07-09 05:53:47 -04:00
# endif
2007-11-14 22:18:48 -05:00
return item ;
}
/* So from the Peers Dialog we can call the following control Functions:
* ( 1 ) Remove Current . FriendRemove ( id )
* ( 2 ) Allow / DisAllow . FriendStatus ( id , accept )
* ( 2 ) Connect . FriendConnectAttempt ( id , accept )
* ( 3 ) Set Address . FriendSetAddress ( id , str , port )
* ( 4 ) Set Trust . FriendTrustSignature ( id , bool )
* ( 5 ) Configure ( GUI Only ) - > 3 / 4
*
* All of these rely on the finding of the current Id .
*/
2009-07-13 15:58:11 -04:00
2007-11-14 22:18:48 -05:00
2008-11-24 09:07:26 -05:00
void PeersDialog : : removefriend ( )
2007-11-14 22:18:48 -05:00
{
QTreeWidgetItem * c = getCurrentPeer ( ) ;
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2007-11-14 22:18:48 -05:00
std : : cerr < < " PeersDialog::removefriend() " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2007-11-14 22:18:48 -05:00
if ( ! c )
{
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2010-04-15 08:02:23 -04:00
std : : cerr < < " PeersDialog::removefriend() None Selected -- sorry " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2007-11-14 22:18:48 -05:00
return ;
}
2008-01-25 03:49:40 -05:00
if ( rsPeers )
{
2010-05-06 13:04:09 -04:00
if ( ( QMessageBox : : question ( this , tr ( " RetroShare " ) , tr ( " Do you want to remove this Friend? " ) , QMessageBox : : Yes | QMessageBox : : No , QMessageBox : : Yes ) ) = = QMessageBox : : Yes )
{
rsPeers - > removeFriend ( getPeerRsCertId ( c ) ) ;
emit friendsUpdated ( ) ;
}
else
return ;
2008-01-25 03:49:40 -05:00
}
2007-11-14 22:18:48 -05:00
}
2008-11-24 09:07:26 -05:00
void PeersDialog : : connectfriend ( )
2007-11-14 22:18:48 -05:00
{
QTreeWidgetItem * c = getCurrentPeer ( ) ;
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2007-11-14 22:18:48 -05:00
std : : cerr < < " PeersDialog::connectfriend() " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2008-04-07 18:54:15 -04:00
if ( ! c )
{
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2008-04-07 18:54:15 -04:00
std : : cerr < < " PeersDialog::connectfriend() Noone Selected -- sorry " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2008-04-07 18:54:15 -04:00
return ;
}
2008-01-25 03:49:40 -05:00
if ( rsPeers )
{
rsPeers - > connectAttempt ( getPeerRsCertId ( c ) ) ;
2010-06-08 17:38:36 -04:00
c - > setIcon ( COLUMN_NAME , ( QIcon ( IMAGE_CONNECT2 ) ) ) ;
2008-01-25 03:49:40 -05:00
}
2007-11-14 22:18:48 -05:00
}
/* GUI stuff -> don't do anything directly with Control */
2008-11-24 09:07:26 -05:00
void PeersDialog : : configurefriend ( )
2007-11-14 22:18:48 -05:00
{
2009-05-07 18:43:11 -04:00
ConfCertDialog : : show ( getPeerRsCertId ( getCurrentPeer ( ) ) ) ;
2007-11-14 22:18:48 -05:00
}
2009-09-30 18:30:57 -04:00
void PeersDialog : : resetStatusBar ( )
{
2010-02-08 11:42:26 -05:00
# ifdef PEERS_DEBUG
2009-09-30 18:30:57 -04:00
std : : cerr < < " PeersDialog: reseting status bar. " < < std : : endl ;
2010-02-08 11:42:26 -05:00
# endif
2009-09-30 18:30:57 -04:00
ui . statusStringLabel - > setText ( QString ( " " ) ) ;
}
void PeersDialog : : updateStatusTyping ( )
{
if ( time ( NULL ) - last_status_send_time > 5 ) // limit 'peer is typing' packets to at most every 10 sec
{
2010-02-10 05:56:54 -05:00
# ifdef PEERS_DEBUG
2009-09-30 18:30:57 -04:00
std : : cerr < < " PeersDialog: sending group chat typing info. " < < std : : endl ;
2010-02-10 05:56:54 -05:00
# endif
2009-09-30 18:30:57 -04:00
rsMsgs - > sendGroupChatStatusString ( rsiface - > getConfig ( ) . ownName + " is typing... " ) ;
last_status_send_time = time ( NULL ) ;
}
}
// Called by libretroshare through notifyQt to display the peer's status
//
void PeersDialog : : updateStatusString ( const QString & status_string )
{
2010-02-10 16:53:37 -05:00
# ifdef PEERS_DEBUG
2009-09-30 18:30:57 -04:00
std : : cerr < < " PeersDialog: received group chat typing info. updating gui. " < < std : : endl ;
2010-02-10 16:53:37 -05:00
# endif
2009-09-30 18:30:57 -04:00
ui . statusStringLabel - > setText ( status_string ) ; // displays info for 5 secs.
QTimer : : singleShot ( 5000 , this , SLOT ( resetStatusBar ( ) ) ) ;
}
2009-10-04 18:27:42 -04:00
void PeersDialog : : updatePeersCustomStateString ( const QString & peer_id )
{
# ifdef JUST_AN_EXAMPLE
// This is an example of how to retrieve the custom string.
//
std : : cerr < < " PeersDialog: Got notified that state string changed for peer " < < peer_id . toStdString ( ) < < std : : endl ;
std : : cerr < < " New state string for this peer is : " < < rsMsgs - > getCustomStateString ( peer_id . toStdString ( ) ) < < std : : endl ;
QMessageBox : : information ( NULL , " Notification " , peer_id + " has new custom string: " + QString : : fromStdString ( rsMsgs - > getCustomStateString ( peer_id . toStdString ( ) ) ) ) ;
# endif
}
2009-09-30 16:53:18 -04:00
void PeersDialog : : updatePeersAvatar ( const QString & peer_id )
{
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2009-09-30 16:53:18 -04:00
std : : cerr < < " PeersDialog: Got notified of new avatar for peer " < < peer_id . toStdString ( ) < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2009-09-30 16:53:18 -04:00
PopupChatDialog * pcd = getPrivateChat ( peer_id . toStdString ( ) , rsPeers - > getPeerName ( peer_id . toStdString ( ) ) , 0 ) ;
pcd - > updatePeerAvatar ( peer_id . toStdString ( ) ) ;
}
2009-09-29 16:37:20 -04:00
void PeersDialog : : updatePeerStatusString ( const QString & peer_id , const QString & status_string , bool is_private_chat )
2009-05-05 15:15:32 -04:00
{
2009-09-29 16:37:20 -04:00
if ( is_private_chat )
{
PopupChatDialog * pcd = getPrivateChat ( peer_id . toStdString ( ) , rsPeers - > getPeerName ( peer_id . toStdString ( ) ) , 0 ) ;
pcd - > updateStatusString ( status_string ) ;
}
else
{
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2009-09-29 16:37:20 -04:00
std : : cerr < < " Updating public chat msg from peer " < < rsPeers - > getPeerName ( peer_id . toStdString ( ) ) < < " : " < < status_string . toStdString ( ) < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2009-09-30 18:30:57 -04:00
updateStatusString ( status_string ) ;
2009-09-29 16:37:20 -04:00
}
2009-05-05 15:15:32 -04:00
}
2007-11-14 22:18:48 -05:00
2008-07-10 06:34:49 -04:00
void PeersDialog : : insertChat ( )
{
if ( ! rsMsgs - > chatAvailable ( ) )
{
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2009-06-08 13:09:00 -04:00
std : : cerr < < " no chat available. " < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2008-07-10 06:34:49 -04:00
return ;
}
std : : list < ChatInfo > newchat ;
if ( ! rsMsgs - > getNewChat ( newchat ) )
{
2010-02-08 11:42:26 -05:00
# ifdef PEERS_DEBUG
2009-05-05 15:15:32 -04:00
std : : cerr < < " could not get new chat. " < < std : : endl ;
2010-02-08 11:42:26 -05:00
# endif
2008-07-10 06:34:49 -04:00
return ;
}
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
std : : cerr < < " got new chat. " < < std : : endl ;
# endif
QTextEdit * msgWidget = ui . msgText ;
2008-07-10 06:34:49 -04:00
std : : list < ChatInfo > : : iterator it ;
2010-05-20 17:53:27 -04:00
uint chatflags = Settings - > getChatFlags ( ) ;
2008-07-10 06:34:49 -04:00
/* add in lines at the bottom */
for ( it = newchat . begin ( ) ; it ! = newchat . end ( ) ; it + + )
{
2010-02-07 07:36:37 -05:00
std : : string msg ( it - > msg . begin ( ) , it - > msg . end ( ) ) ;
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2008-07-10 14:52:56 -04:00
std : : cerr < < " PeersDialog::insertChat(): " < < msg < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2008-07-10 06:34:49 -04:00
/* are they private? */
if ( it - > chatflags & RS_CHAT_PRIVATE )
{
2008-12-07 09:19:13 -05:00
PopupChatDialog * pcd = getPrivateChat ( it - > rsid , it - > name , chatflags ) ;
2008-07-10 06:34:49 -04:00
pcd - > addChatMsg ( & ( * it ) ) ;
2010-05-05 07:47:29 -04:00
playsound ( ) ;
2009-07-13 15:58:11 -04:00
QApplication : : alert ( pcd ) ;
2008-07-10 06:34:49 -04:00
continue ;
}
std : : ostringstream out ;
QString extraTxt ;
2010-02-07 07:36:37 -05:00
QString timestamp = QDateTime : : currentDateTime ( ) . toString ( " hh:mm:ss " ) ;
QString name = QString : : fromStdString ( it - > name ) ;
QString line = " <span style= \" color:#C00000 \" > " + timestamp + " </span> " +
" <span style= \" color:#2D84C9 \" ><strong> " + " " + name + " </strong></span> " ;
2010-05-11 20:17:10 -04:00
QString msgContents = QString : : fromStdWString ( it - > msg ) ;
2010-02-07 07:36:37 -05:00
//std::cerr << "PeersDialog::insertChat(): 1.11\n";
2010-05-11 20:17:10 -04:00
historyKeeper . addMessage ( name , " THIS " , msgContents ) ;
2010-02-07 07:36:37 -05:00
//std::cerr << "PeersDialog::insertChat(): 1.12\n";
extraTxt + = line ;
// notify with a systray icon msg
if ( it - > rsid ! = rsPeers - > getOwnId ( ) )
{
// This is a trick to translate HTML into text.
QTextEdit editor ;
editor . setHtml ( QString : : fromStdWString ( it - > msg ) ) ;
QString notifyMsg ( QString : : fromStdString ( it - > name ) + " : " + editor . toPlainText ( ) ) ;
if ( notifyMsg . length ( ) > 30 )
emit notifyGroupChat ( QString ( " New group chat " ) , notifyMsg . left ( 30 ) + QString ( " ... " ) ) ;
else
emit notifyGroupChat ( QString ( " New group chat " ) , notifyMsg ) ;
}
2008-07-10 06:34:49 -04:00
2010-05-11 20:17:10 -04:00
// create a DOM tree object from the message and embed contents with HTML tags
QDomDocument doc ;
doc . setContent ( msgContents ) ;
2010-02-07 07:36:37 -05:00
2010-05-11 20:17:10 -04:00
// embed links
QDomElement body = doc . documentElement ( ) ;
RsChat : : embedHtml ( doc , body , defEmbedAhref ) ;
2010-02-07 07:36:37 -05:00
2010-05-11 20:17:10 -04:00
// embed smileys
2010-05-20 17:53:27 -04:00
Settings - > beginGroup ( " Chat " ) ;
if ( Settings - > value ( QString : : fromUtf8 ( " Emoteicons_GroupChat " ) , true ) . toBool ( ) )
2010-05-11 20:17:10 -04:00
RsChat : : embedHtml ( doc , body , defEmbedImg ) ;
2010-05-20 17:53:27 -04:00
Settings - > endGroup ( ) ;
2010-05-11 20:17:10 -04:00
msgContents = doc . toString ( - 1 ) ; // -1 removes any annoying carriage return misinterpreted by QTextEdit
extraTxt + = msgContents ;
2010-05-03 17:17:36 -04:00
2010-02-07 07:36:37 -05:00
if ( ( msgWidget - > verticalScrollBar ( ) - > maximum ( ) - 30 ) < msgWidget - > verticalScrollBar ( ) - > value ( ) ) {
msgWidget - > append ( extraTxt ) ;
} else {
//the vertical scroll is not at the bottom, so just update the text, the scroll will stay at the current position
int scroll = msgWidget - > verticalScrollBar ( ) - > value ( ) ;
msgWidget - > setHtml ( msgWidget - > toHtml ( ) + extraTxt ) ;
msgWidget - > verticalScrollBar ( ) - > setValue ( scroll ) ;
msgWidget - > update ( ) ;
}
}
2008-07-10 06:34:49 -04:00
}
void PeersDialog : : checkChat ( )
{
/* if <return> at the end of the text -> we can send it! */
QTextEdit * chatWidget = ui . lineEdit ;
std : : string txt = chatWidget - > toPlainText ( ) . toStdString ( ) ;
if ( ' \n ' = = txt [ txt . length ( ) - 1 ] )
{
//std::cerr << "Found <return> found at end of :" << txt << ": should send!";
//std::cerr << std::endl;
if ( txt . length ( ) - 1 = = txt . find ( ' \n ' ) ) /* only if on first line! */
{
/* should remove last char ... */
sendMsg ( ) ;
}
}
else
{
2009-09-30 18:30:57 -04:00
updateStatusTyping ( ) ;
2008-07-10 06:34:49 -04:00
//std::cerr << "No <return> found in :" << txt << ":";
//std::cerr << std::endl;
}
}
void PeersDialog : : sendMsg ( )
{
QTextEdit * lineWidget = ui . lineEdit ;
ChatInfo ci ;
//ci.msg = lineWidget->Text().toStdWString();
ci . msg = lineWidget - > toHtml ( ) . toStdWString ( ) ;
ci . chatflags = RS_CHAT_PUBLIC ;
2009-03-12 10:14:55 -04:00
//historyKeeper.addMessage("THIS", "ALL", lineWidget->toHtml() );
2009-07-13 15:58:11 -04:00
2008-07-10 06:34:49 -04:00
std : : string msg ( ci . msg . begin ( ) , ci . msg . end ( ) ) ;
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2008-07-10 14:52:56 -04:00
std : : cerr < < " PeersDialog::sendMsg(): " < < msg < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2008-07-10 06:34:49 -04:00
rsMsgs - > ChatSend ( ci ) ;
ui . lineEdit - > clear ( ) ;
setFont ( ) ;
/* redraw send list */
insertSendList ( ) ;
}
void PeersDialog : : insertSendList ( )
{
2010-05-12 16:10:22 -04:00
# ifdef false
2008-07-10 06:34:49 -04:00
std : : list < std : : string > peers ;
std : : list < std : : string > : : iterator it ;
if ( ! rsPeers )
{
/* not ready yet! */
return ;
}
rsPeers - > getOnlineList ( peers ) ;
/* get a link to the table */
//QTreeWidget *sendWidget = ui.msgSendList;
QList < QTreeWidgetItem * > items ;
for ( it = peers . begin ( ) ; it ! = peers . end ( ) ; it + + )
{
RsPeerDetails details ;
if ( ! rsPeers - > getPeerDetails ( * it , details ) )
{
continue ; /* BAD */
}
/* make a widget per friend */
QTreeWidgetItem * item = new QTreeWidgetItem ( ( QTreeWidget * ) 0 ) ;
/* add all the labels */
/* (0) Person */
item - > setText ( 0 , QString : : fromStdString ( details . name ) ) ;
item - > setFlags ( Qt : : ItemIsUserCheckable | Qt : : ItemIsEnabled ) ;
//item -> setFlags(Qt::ItemIsUserCheckable);
item - > setCheckState ( 0 , Qt : : Checked ) ;
if ( rsicontrol - > IsInChat ( * it ) )
{
item - > setCheckState ( 0 , Qt : : Checked ) ;
}
else
{
item - > setCheckState ( 0 , Qt : : Unchecked ) ;
}
/* disable for the moment */
item - > setFlags ( Qt : : ItemIsUserCheckable ) ;
item - > setCheckState ( 0 , Qt : : Checked ) ;
/* add to the list */
items . append ( item ) ;
}
/* remove old items */
//sendWidget->clear();
//sendWidget->setColumnCount(1);
/* add the items in! */
//sendWidget->insertTopLevelItems(0, items);
//sendWidget->update(); /* update display */
2010-05-12 16:10:22 -04:00
# endif
2008-07-10 06:34:49 -04:00
}
/* to toggle the state */
void PeersDialog : : toggleSendItem ( QTreeWidgetItem * item , int col )
{
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2008-07-10 06:34:49 -04:00
std : : cerr < < " ToggleSendItem() " < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2008-07-10 06:34:49 -04:00
/* extract id */
std : : string id = ( item - > text ( 4 ) ) . toStdString ( ) ;
/* get state */
bool inChat = ( Qt : : Checked = = item - > checkState ( 0 ) ) ; /* alway column 0 */
/* call control fns */
rsicontrol - > SetInChat ( id , inChat ) ;
return ;
}
2009-03-12 13:57:30 -04:00
//============================================================================
PopupChatDialog *
PeersDialog : : getPrivateChat ( std : : string id , std : : string name , uint chatflags )
2008-07-10 06:34:49 -04:00
{
/* see if it exists already */
PopupChatDialog * popupchatdialog = NULL ;
2008-12-07 09:19:13 -05:00
bool show = false ;
if ( chatflags & RS_CHAT_REOPEN )
{
show = true ;
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
std : : cerr < < " reopen flag so: enable SHOW popupchatdialog() " < < std : : endl ;
# endif
2008-12-07 09:19:13 -05:00
}
2008-07-10 06:34:49 -04:00
std : : map < std : : string , PopupChatDialog * > : : iterator it ;
if ( chatDialogs . end ( ) ! = ( it = chatDialogs . find ( id ) ) )
{
/* exists already */
popupchatdialog = it - > second ;
}
2009-07-13 15:58:11 -04:00
else
2008-07-10 06:34:49 -04:00
{
popupchatdialog = new PopupChatDialog ( id , name ) ;
chatDialogs [ id ] = popupchatdialog ;
2008-12-07 09:19:13 -05:00
if ( chatflags & RS_CHAT_OPEN_NEW )
{
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
std : : cerr < < " new chat so: enable SHOW popupchatdialog() " < < std : : endl ;
# endif
2008-12-07 09:19:13 -05:00
show = true ;
}
2008-07-10 06:34:49 -04:00
}
if ( show )
{
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
std : : cerr < < " SHOWING popupchatdialog() " < < std : : endl ;
# endif
2008-12-07 09:19:13 -05:00
popupchatdialog - > show ( ) ;
2008-07-10 06:34:49 -04:00
}
2008-12-07 09:19:13 -05:00
/* now only do these if the window is visible */
if ( popupchatdialog - > isVisible ( ) )
{
if ( chatflags & RS_CHAT_FOCUS )
{
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
std : : cerr < < " focus chat flag so: GETFOCUS popupchatdialog() " < < std : : endl ;
# endif
2008-12-07 09:19:13 -05:00
popupchatdialog - > getfocus ( ) ;
}
else
{
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
std : : cerr < < " no focus chat flag so: FLASH popupchatdialog() " < < std : : endl ;
# endif
2008-12-07 09:19:13 -05:00
popupchatdialog - > flash ( ) ;
}
2009-07-13 15:58:11 -04:00
}
2008-12-07 09:19:13 -05:00
else
{
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
std : : cerr < < " not visible ... so leave popupchatdialog() " < < std : : endl ;
# endif
2008-12-07 09:19:13 -05:00
}
2009-07-13 15:58:11 -04:00
2008-07-10 06:34:49 -04:00
return popupchatdialog ;
}
2009-03-12 13:57:30 -04:00
//============================================================================
2008-12-07 09:19:13 -05:00
2008-07-10 06:34:49 -04:00
void PeersDialog : : clearOldChats ( )
{
/* nothing yet */
}
void PeersDialog : : setColor ( )
{
2009-07-13 15:58:11 -04:00
2008-07-10 06:34:49 -04:00
bool ok ;
QRgb color = QColorDialog : : getRgba ( ui . lineEdit - > textColor ( ) . rgba ( ) , & ok , this ) ;
if ( ok ) {
_currentColor = QColor ( color ) ;
2009-01-22 20:58:56 -05:00
QPixmap pxm ( 16 , 16 ) ;
2008-07-10 06:34:49 -04:00
pxm . fill ( _currentColor ) ;
ui . colorChatButton - > setIcon ( pxm ) ;
}
setFont ( ) ;
}
void PeersDialog : : getFont ( )
{
bool ok ;
mCurrentFont = QFontDialog : : getFont ( & ok , mCurrentFont , this ) ;
setFont ( ) ;
}
void PeersDialog : : setFont ( )
{
mCurrentFont . setBold ( ui . textboldChatButton - > isChecked ( ) ) ;
mCurrentFont . setUnderline ( ui . textunderlineChatButton - > isChecked ( ) ) ;
mCurrentFont . setItalic ( ui . textitalicChatButton - > isChecked ( ) ) ;
ui . lineEdit - > setFont ( mCurrentFont ) ;
ui . lineEdit - > setTextColor ( _currentColor ) ;
2010-05-20 17:53:27 -04:00
Settings - > beginGroup ( " Chat " ) ;
Settings - > setValue ( QString : : fromUtf8 ( " ChatScreenFont " ) , mCurrentFont . toString ( ) ) ;
Settings - > endGroup ( ) ;
2010-05-14 12:54:30 -04:00
2008-07-10 06:34:49 -04:00
2008-11-24 09:07:26 -05:00
ui . lineEdit - > setFocus ( ) ;
2009-07-13 15:58:11 -04:00
2008-07-10 06:34:49 -04:00
}
2009-07-13 15:58:11 -04:00
void PeersDialog : : underline ( )
2008-11-24 09:07:26 -05:00
{
_underline = ! _underline ;
ui . lineEdit - > setFontUnderline ( _underline ) ;
2008-07-10 06:34:49 -04:00
}
2009-07-13 15:58:11 -04:00
2008-07-10 06:34:49 -04:00
2008-11-24 09:07:26 -05:00
// Update Chat Info information
2009-07-13 15:58:11 -04:00
void PeersDialog : : setChatInfo ( QString info , QColor color )
2008-11-24 09:07:26 -05:00
{
static unsigned int nbLines = 0 ;
+ + nbLines ;
// Check log size, clear it if too big
if ( nbLines > 200 ) {
ui . msgText - > clear ( ) ;
nbLines = 1 ;
}
ui . msgText - > append ( QString : : fromUtf8 ( " <font color='grey'> " ) + QTime : : currentTime ( ) . toString ( QString : : fromUtf8 ( " hh:mm:ss " ) ) + QString : : fromUtf8 ( " </font> - <font color=' " ) + color . name ( ) + QString : : fromUtf8 ( " '><i> " ) + info + QString : : fromUtf8 ( " </i></font> " ) ) ;
}
2009-07-13 15:58:11 -04:00
void PeersDialog : : on_actionClearChat_triggered ( )
2008-11-24 09:07:26 -05:00
{
ui . msgText - > clear ( ) ;
}
2009-07-13 15:58:11 -04:00
void PeersDialog : : displayInfoChatMenu ( const QPoint & pos )
2008-11-24 09:07:26 -05:00
{
// Log Menu
QMenu myChatMenu ( this ) ;
myChatMenu . addAction ( ui . actionClearChat ) ;
// XXX: Why mapToGlobal() is not enough?
myChatMenu . exec ( mapToGlobal ( pos ) + QPoint ( 0 , 80 ) ) ;
2008-07-10 06:34:49 -04:00
}
void PeersDialog : : loadEmoticonsgroupchat ( )
{
2009-01-05 21:47:42 -05:00
QString sm_codes ;
2009-03-12 10:14:55 -04:00
# if defined(Q_OS_WIN32)
QFile sm_file ( QApplication : : applicationDirPath ( ) + " /emoticons/emotes.acs " ) ;
# else
QFile sm_file ( QString ( " :/smileys/emotes.acs " ) ) ;
2009-01-25 13:25:36 -05:00
# endif
2009-01-25 09:09:05 -05:00
if ( ! sm_file . open ( QIODevice : : ReadOnly ) )
{
2010-05-11 20:17:10 -04:00
std : : cerr < < " Could not open resouce file :/emoticons/emotes.acs " < < std : : endl ;
2009-01-25 09:09:05 -05:00
return ;
}
2009-01-05 21:47:42 -05:00
sm_codes = sm_file . readAll ( ) ;
sm_file . close ( ) ;
sm_codes . remove ( " \n " ) ;
sm_codes . remove ( " \r " ) ;
int i = 0 ;
QString smcode ;
QString smfile ;
while ( sm_codes [ i ] ! = ' { ' )
2008-07-10 06:34:49 -04:00
{
2009-01-05 21:47:42 -05:00
i + + ;
2009-07-13 15:58:11 -04:00
2009-01-05 21:47:42 -05:00
}
while ( i < sm_codes . length ( ) - 2 )
{
smcode = " " ;
smfile = " " ;
while ( sm_codes [ i ] ! = ' \" ' )
{
i + + ;
}
i + + ;
while ( sm_codes [ i ] ! = ' \" ' )
{
smcode + = sm_codes [ i ] ;
i + + ;
2009-07-13 15:58:11 -04:00
2009-01-05 21:47:42 -05:00
}
i + + ;
2009-07-13 15:58:11 -04:00
2009-01-05 21:47:42 -05:00
while ( sm_codes [ i ] ! = ' \" ' )
{
i + + ;
}
i + + ;
while ( sm_codes [ i ] ! = ' \" ' & & sm_codes [ i + 1 ] ! = ' ; ' )
2008-07-10 06:34:49 -04:00
{
2009-01-05 21:47:42 -05:00
smfile + = sm_codes [ i ] ;
i + + ;
2008-07-10 06:34:49 -04:00
}
2009-01-05 21:47:42 -05:00
i + + ;
if ( ! smcode . isEmpty ( ) & & ! smfile . isEmpty ( ) )
2009-01-25 14:02:52 -05:00
# if defined(Q_OS_WIN32)
2009-01-25 13:25:36 -05:00
smileys . insert ( smcode , smfile ) ;
2009-01-25 14:02:52 -05:00
# else
smileys . insert ( smcode , " :/ " + smfile ) ;
2009-01-25 13:25:36 -05:00
# endif
2008-07-10 06:34:49 -04:00
}
2010-05-11 20:17:10 -04:00
// init <img> embedder
defEmbedImg . InitFromAwkwardHash ( smileys ) ;
2008-11-24 09:07:26 -05:00
}
2008-07-10 06:34:49 -04:00
void PeersDialog : : smileyWidgetgroupchat ( )
2009-07-13 15:58:11 -04:00
{
2008-07-10 06:34:49 -04:00
qDebug ( " MainWindow::smileyWidget() " ) ;
2010-05-12 15:03:30 -04:00
if ( smWidget = = 0 ) {
smWidget = new QWidget ( this , Qt : : Popup ) ;
smWidget - > setWindowTitle ( " Emoticons " ) ;
smWidget - > setWindowIcon ( QIcon ( QString ( " :/images/rstray3.png " ) ) ) ;
//smWidget->setFixedSize(256,256);
smWidget - > setBaseSize ( 4 * 24 , ( smileys . size ( ) / 4 ) * 24 ) ;
//Warning: this part of code was taken from kadu instant messenger;
// It was EmoticonSelector::alignTo(QWidget* w) function there
// comments are Polish, I dont' know how does it work...
// oblicz pozycj<63> widgetu do kt<6B> rego r<> wnamy
QWidget * w = ui . emoticonBtn ;
QPoint w_pos = w - > mapToGlobal ( QPoint ( 0 , 0 ) ) ;
// oblicz rozmiar selektora
QSize e_size = smWidget - > sizeHint ( ) ;
// oblicz rozmiar pulpitu
QSize s_size = QApplication : : desktop ( ) - > size ( ) ;
// oblicz dystanse od widgetu do lewego brzegu i do prawego
int l_dist = w_pos . x ( ) ;
int r_dist = s_size . width ( ) - ( w_pos . x ( ) + w - > width ( ) ) ;
// oblicz pozycj<63> w zale<6C> no<6E> ci od tego czy po lewej stronie
// jest wi<77> cej miejsca czy po prawej
int x ;
if ( l_dist > = r_dist )
x = w_pos . x ( ) - e_size . width ( ) ;
else
x = w_pos . x ( ) + w - > width ( ) ;
// oblicz pozycj<63> y - centrujemy w pionie
int y = w_pos . y ( ) + w - > height ( ) / 2 - e_size . height ( ) / 2 ;
// je<6A> li wychodzi poza doln<6C> kraw<61> d<EFBFBD> to r<> wnamy do niej
if ( y + e_size . height ( ) > s_size . height ( ) )
y = s_size . height ( ) - e_size . height ( ) ;
// je<6A> li wychodzi poza g<> rn<72> kraw<61> d<EFBFBD> to r<> wnamy do niej
if ( y < 0 )
y = 0 ;
// ustawiamy selektor na wyliczonej pozycji
smWidget - > move ( x , y ) ;
x = 0 ;
y = 0 ;
QHashIterator < QString , QString > i ( smileys ) ;
while ( i . hasNext ( ) )
2008-07-10 06:34:49 -04:00
{
2010-05-12 15:03:30 -04:00
i . next ( ) ;
QPushButton * smButton = new QPushButton ( " " , smWidget ) ;
smButton - > setGeometry ( x * 24 , y * 24 , 24 , 24 ) ;
smButton - > setIconSize ( QSize ( 24 , 24 ) ) ;
smButton - > setIcon ( QPixmap ( i . value ( ) ) ) ;
smButton - > setToolTip ( i . key ( ) ) ;
//smButton->setFixedSize(24,24);
+ + x ;
if ( x > 4 )
{
x = 0 ;
y + + ;
}
connect ( smButton , SIGNAL ( clicked ( ) ) , this , SLOT ( addSmileys ( ) ) ) ;
connect ( smButton , SIGNAL ( clicked ( ) ) , smWidget , SLOT ( close ( ) ) ) ;
2008-07-10 06:34:49 -04:00
}
}
2009-07-13 15:58:11 -04:00
2008-07-10 06:34:49 -04:00
smWidget - > show ( ) ;
2008-11-24 09:07:26 -05:00
}
2008-07-10 06:34:49 -04:00
void PeersDialog : : addSmileys ( )
{
2009-01-05 21:47:42 -05:00
ui . lineEdit - > setText ( ui . lineEdit - > toHtml ( ) + qobject_cast < QPushButton * > ( sender ( ) ) - > toolTip ( ) . split ( " | " ) . first ( ) ) ;
2008-07-10 06:34:49 -04:00
}
2007-11-14 22:18:48 -05:00
2009-01-22 20:58:56 -05:00
/* GUI stuff -> don't do anything directly with Control */
void PeersDialog : : viewprofile ( )
{
/* display Dialog */
QTreeWidgetItem * c = getCurrentPeer ( ) ;
static ProfileView * profileview = new ProfileView ( ) ;
if ( ! c )
return ;
/* set the Id */
std : : string id = getPeerRsCertId ( c ) ;
profileview - > setPeerId ( id ) ;
profileview - > show ( ) ;
}
2009-09-02 18:42:31 -04:00
void PeersDialog : : updateAvatar ( )
{
unsigned char * data = NULL ;
int size = 0 ;
rsMsgs - > getOwnAvatarData ( data , size ) ;
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2009-09-02 18:42:31 -04:00
std : : cerr < < " Image size = " < < size < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2009-09-02 18:42:31 -04:00
if ( size = = 0 )
std : : cerr < < " Got no image " < < std : : endl ;
// set the image
QPixmap pix ;
2009-09-07 09:59:38 -04:00
pix . loadFromData ( data , size , " PNG " ) ;
ui . avatartoolButton - > setIcon ( pix ) ; // writes image into ba in PNG format
2009-09-02 18:42:31 -04:00
2009-09-30 18:30:57 -04:00
for ( std : : map < std : : string , PopupChatDialog * > : : const_iterator it ( chatDialogs . begin ( ) ) ; it ! = chatDialogs . end ( ) ; + + it )
it - > second - > updateAvatar ( ) ;
2009-09-02 18:42:31 -04:00
delete [ ] data ;
}
void PeersDialog : : getAvatar ( )
{
2010-02-22 07:53:24 -05:00
QString fileName = QFileDialog : : getOpenFileName ( this , " Load File " , QDir : : homePath ( ) , " Pictures (*.png *.xpm *.jpg *.tiff *.gif) " ) ;
2009-09-02 18:42:31 -04:00
if ( ! fileName . isEmpty ( ) )
{
2010-05-14 07:17:19 -04:00
QPixmap picture ;
2010-02-23 09:11:47 -05:00
picture = QPixmap ( fileName ) . scaled ( 82 , 82 , Qt : : IgnoreAspectRatio , Qt : : SmoothTransformation ) ;
2009-09-02 18:42:31 -04:00
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2009-09-02 18:42:31 -04:00
std : : cerr < < " Sending avatar image down the pipe " < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2009-09-02 18:42:31 -04:00
// send avatar down the pipe for other peers to get it.
QByteArray ba ;
QBuffer buffer ( & ba ) ;
buffer . open ( QIODevice : : WriteOnly ) ;
2009-09-07 09:59:38 -04:00
picture . save ( & buffer , " PNG " ) ; // writes image into ba in PNG format
2009-09-02 18:42:31 -04:00
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2009-09-02 18:42:31 -04:00
std : : cerr < < " Image size = " < < ba . size ( ) < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2009-09-02 18:42:31 -04:00
rsMsgs - > setOwnAvatarData ( ( unsigned char * ) ( ba . data ( ) ) , ba . size ( ) ) ; // last char 0 included.
2009-09-30 18:30:57 -04:00
// I suppressed this because it gets called already by rsMsgs->setOwnAvatarData() through a Qt notification signal
//updateAvatar() ;
2009-09-02 18:42:31 -04:00
}
}
void PeersDialog : : changeAvatarClicked ( )
{
updateAvatar ( ) ;
2009-09-22 18:47:49 -04:00
}
void PeersDialog : : on_actionAdd_Friend_activated ( )
{
2010-05-02 20:09:55 -04:00
ConnectFriendWizard connectwiz ( this ) ;
2009-09-22 18:47:49 -04:00
2010-05-02 20:09:55 -04:00
connectwiz . exec ( ) ;
2009-09-22 18:47:49 -04:00
}
2010-01-16 20:36:50 -05:00
void PeersDialog : : on_actionCreate_New_Forum_activated ( )
{
2010-05-02 20:09:55 -04:00
MainWindow : : activatePage ( MainWindow : : Forums ) ;
CreateForum cf ( this ) ;
cf . exec ( ) ;
2010-01-16 20:36:50 -05:00
}
void PeersDialog : : on_actionCreate_New_Channel_activated ( )
{
2010-05-02 20:09:55 -04:00
# ifndef RS_RELEASE_VERSION
MainWindow : : activatePage ( MainWindow : : Channels ) ;
2010-05-02 07:41:23 -04:00
2010-05-02 20:09:55 -04:00
CreateChannel cf ( this ) ;
cf . setWindowTitle ( tr ( " Create a new Channel " ) ) ;
cf . ui . labelicon - > setPixmap ( QPixmap ( " :/images/add_channel64.png " ) ) ;
2010-01-16 20:36:50 -05:00
QString titleStr ( " <span style= \" font-size:24pt; font-weight:500; "
" color:#32CD32; \" >%1</span> " ) ;
2010-05-02 20:09:55 -04:00
cf . ui . textlabelcreatforums - > setText ( titleStr . arg ( tr ( " New Channel " ) ) ) ;
cf . exec ( ) ;
# endif
2010-01-16 20:36:50 -05:00
}
2010-05-02 20:09:55 -04:00
2009-09-29 18:52:46 -04:00
/** Loads own personal status */
void PeersDialog : : loadmypersonalstatus ( )
{
2009-09-30 09:29:45 -04:00
ui . mypersonalstatuslabel - > setText ( QString : : fromStdString ( rsMsgs - > getCustomStateString ( ) ) ) ;
2009-09-29 18:52:46 -04:00
}
2009-10-08 15:08:44 -04:00
void PeersDialog : : statusmessage ( )
{
2010-05-02 20:09:55 -04:00
StatusMessage statusmsgdialog ( this ) ;
statusmsgdialog . exec ( ) ;
2009-10-08 15:08:44 -04:00
}
2010-01-31 17:29:30 -05:00
void PeersDialog : : addExtraFile ( )
{
// select a file
QString qfile = QFileDialog : : getOpenFileName ( this , tr ( " Add Extra File " ) , " " , " " , 0 ,
QFileDialog : : DontResolveSymlinks ) ;
std : : string filePath = qfile . toStdString ( ) ;
if ( filePath ! = " " )
{
PeersDialog : : addAttachment ( filePath ) ;
}
}
void PeersDialog : : addAttachment ( std : : string filePath ) {
/* add a AttachFileItem to the attachment section */
2010-02-07 18:01:46 -05:00
std : : cerr < < " PopupChatDialog::addExtraFile() hashing file. " < < std : : endl ;
2010-01-31 17:29:30 -05:00
/* add widget in for new destination */
AttachFileItem * file = new AttachFileItem ( filePath ) ;
//file->
ui . verticalLayout - > addWidget ( file , 1 , 0 ) ;
//when the file is local or is finished hashing, call the fileHashingFinished method to send a chat message
if ( file - > getState ( ) = = AFI_STATE_LOCAL ) {
fileHashingFinished ( file ) ;
} else {
QObject : : connect ( file , SIGNAL ( fileFinished ( AttachFileItem * ) ) , SLOT ( fileHashingFinished ( AttachFileItem * ) ) ) ;
}
}
void PeersDialog : : fileHashingFinished ( AttachFileItem * file ) {
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::fileHashingFinished() started. " < < std : : endl ;
2010-01-31 17:29:30 -05:00
//check that the file is ok tos end
if ( file - > getState ( ) = = AFI_STATE_ERROR ) {
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
std : : cerr < < " PopupChatDialog::fileHashingFinished error file is not hashed. " < < std : : endl ;
# endif
2010-01-31 17:29:30 -05:00
return ;
}
ChatInfo ci ;
{
rsiface - > lockData ( ) ; /* Lock Interface */
const RsConfig & conf = rsiface - > getConfig ( ) ;
ci . rsid = conf . ownId ;
ci . name = conf . ownName ;
rsiface - > unlockData ( ) ; /* Unlock Interface */
}
2010-02-07 18:01:46 -05:00
//convert fileSize from uint_64 to string for html link
2010-05-11 20:17:10 -04:00
// char fileSizeChar [100];
// sprintf(fileSizeChar, "%lld", file->FileSize());
// std::string fileSize = *(&fileSizeChar);
2010-01-31 17:29:30 -05:00
2010-03-17 11:34:36 -04:00
std : : string mesgString = RetroShareLink ( QString : : fromStdString ( file - > FileName ( ) ) ,
2010-05-11 20:17:10 -04:00
file - > FileSize ( ) ,
QString : : fromStdString ( file - > FileHash ( ) ) ) . toHtml ( ) . toStdString ( ) ;
2010-03-17 11:34:36 -04:00
// std::string mesgString = "<a href='retroshare://file|" + (file->FileName()) + "|" + fileSize + "|" + (file->FileHash()) + "'>"
// + "retroshare://file|" + (file->FileName()) + "|" + fileSize + "|" + (file->FileHash()) + "</a>";
# ifdef PEERS_DEBUG
std : : cerr < < " PeersDialog::fileHashingFinished mesgString : " < < mesgString < < std : : endl ;
# endif
2010-01-31 17:29:30 -05:00
const char * messageString = mesgString . c_str ( ) ;
//convert char massageString to w_char
wchar_t * message ;
2010-05-11 20:17:10 -04:00
size_t requiredSize = mbstowcs ( NULL , messageString , 0 ) ; // C4996
2010-01-31 17:29:30 -05:00
/* Add one to leave room for the NULL terminator */
message = ( wchar_t * ) malloc ( ( requiredSize + 1 ) * sizeof ( wchar_t ) ) ;
if ( ! message ) {
std : : cerr < < ( " Memory allocation failure. \n " ) ;
}
2010-05-11 20:17:10 -04:00
size_t size = mbstowcs ( message , messageString , requiredSize + 1 ) ; // C4996
2010-01-31 17:29:30 -05:00
if ( size = = ( size_t ) ( - 1 ) ) {
printf ( " Couldn't convert string--invalid multibyte character. \n " ) ;
}
ci . msg = message ;
ci . chatflags = RS_CHAT_PUBLIC ;
rsMsgs - > ChatSend ( ci ) ;
setFont ( ) ;
}
void PeersDialog : : anchorClicked ( const QUrl & link )
{
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
std : : cerr < < " PeersDialog::anchorClicked link.scheme() : " < < link . scheme ( ) . toStdString ( ) < < std : : endl ;
# endif
2010-01-31 17:29:30 -05:00
if ( link . scheme ( ) = = " retroshare " )
{
2010-03-10 18:09:35 -05:00
RetroShareLink rslnk ( link ) ;
2010-01-31 17:29:30 -05:00
2010-03-10 16:38:26 -05:00
if ( rslnk . valid ( ) )
2010-01-31 17:29:30 -05:00
{
std : : list < std : : string > srcIds ;
2010-03-10 16:38:26 -05:00
if ( rsFiles - > FileRequest ( rslnk . name ( ) . toStdString ( ) , rslnk . hash ( ) . toStdString ( ) , rslnk . size ( ) , " " , RS_FILE_HINTS_NETWORK_WIDE , srcIds ) )
2010-01-31 17:29:30 -05:00
{
QMessageBox mb ( tr ( " File Request Confirmation " ) , tr ( " The file has been added to your download list. " ) , QMessageBox : : Information , QMessageBox : : Ok , 0 , 0 ) ;
mb . setButtonText ( QMessageBox : : Ok , " OK " ) ;
2010-02-01 12:26:22 -05:00
mb . setWindowIcon ( QIcon ( QString : : fromUtf8 ( " :/images/rstray3.png " ) ) ) ;
2010-01-31 17:29:30 -05:00
mb . exec ( ) ;
}
else
{
QMessageBox mb ( tr ( " File Request canceled " ) , tr ( " The file has not been added to your download list, because you already have it. " ) , QMessageBox : : Information , QMessageBox : : Ok , 0 , 0 ) ;
mb . setButtonText ( QMessageBox : : Ok , " OK " ) ;
2010-02-01 12:26:22 -05:00
mb . setWindowIcon ( QIcon ( QString : : fromUtf8 ( " :/images/rstray3.png " ) ) ) ;
2010-01-31 17:29:30 -05:00
mb . exec ( ) ;
}
}
else
{
QMessageBox mb ( tr ( " File Request Error " ) , tr ( " The file link is malformed. " ) , QMessageBox : : Information , QMessageBox : : Ok , 0 , 0 ) ;
mb . setButtonText ( QMessageBox : : Ok , " OK " ) ;
mb . exec ( ) ;
}
}
else if ( link . scheme ( ) = = " http " )
{
QDesktopServices : : openUrl ( link ) ;
}
else if ( link . scheme ( ) = = " " )
{
//it's probably a web adress, let's add http:// at the beginning of the link
QString newAddress = link . toString ( ) ;
newAddress . prepend ( " http:// " ) ;
QDesktopServices : : openUrl ( QUrl ( newAddress ) ) ;
}
}
void PeersDialog : : dropEvent ( QDropEvent * event )
{
if ( ! ( Qt : : CopyAction & event - > possibleActions ( ) ) )
{
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::dropEvent() Rejecting uncopyable DropAction " < < std : : endl ;
2010-01-31 17:29:30 -05:00
/* can't do it */
return ;
}
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::dropEvent() Formats " < < std : : endl ;
2010-01-31 17:29:30 -05:00
QStringList formats = event - > mimeData ( ) - > formats ( ) ;
QStringList : : iterator it ;
for ( it = formats . begin ( ) ; it ! = formats . end ( ) ; it + + )
{
2010-02-07 18:01:46 -05:00
std : : cerr < < " Format: " < < ( * it ) . toStdString ( ) < < std : : endl ;
2010-01-31 17:29:30 -05:00
}
if ( event - > mimeData ( ) - > hasUrls ( ) )
{
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::dropEvent() Urls: " < < std : : endl ;
2010-01-31 17:29:30 -05:00
QList < QUrl > urls = event - > mimeData ( ) - > urls ( ) ;
QList < QUrl > : : iterator uit ;
for ( uit = urls . begin ( ) ; uit ! = urls . end ( ) ; uit + + )
{
std : : string localpath = uit - > toLocalFile ( ) . toStdString ( ) ;
2010-02-07 18:01:46 -05:00
std : : cerr < < " Whole URL: " < < uit - > toString ( ) . toStdString ( ) < < std : : endl ;
std : : cerr < < " or As Local File: " < < localpath < < std : : endl ;
2010-01-31 17:29:30 -05:00
if ( localpath . size ( ) > 0 )
{
struct stat buf ;
//Check that the file does exist and is not a directory
if ( ( - 1 = = stat ( localpath . c_str ( ) , & buf ) ) ) {
std : : cerr < < " PeersDialog::dropEvent() file does not exists. " < < std : : endl ;
QMessageBox mb ( tr ( " Drop file error. " ) , tr ( " File not found or file name not accepted. " ) , QMessageBox : : Information , QMessageBox : : Ok , 0 , 0 ) ;
mb . setButtonText ( QMessageBox : : Ok , " OK " ) ;
mb . exec ( ) ;
} else if ( S_ISDIR ( buf . st_mode ) ) {
std : : cerr < < " PeersDialog::dropEvent() directory not accepted. " < < std : : endl ;
QMessageBox mb ( tr ( " Drop file error. " ) , tr ( " Directory can't be dropped, only files are accepted. " ) , QMessageBox : : Information , QMessageBox : : Ok , 0 , 0 ) ;
mb . setButtonText ( QMessageBox : : Ok , " OK " ) ;
mb . exec ( ) ;
} else {
PeersDialog : : addAttachment ( localpath ) ;
}
}
}
}
event - > setDropAction ( Qt : : CopyAction ) ;
event - > accept ( ) ;
}
void PeersDialog : : dragEnterEvent ( QDragEnterEvent * event )
{
/* print out mimeType */
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::dragEnterEvent() Formats " < < std : : endl ;
2010-01-31 17:29:30 -05:00
QStringList formats = event - > mimeData ( ) - > formats ( ) ;
QStringList : : iterator it ;
for ( it = formats . begin ( ) ; it ! = formats . end ( ) ; it + + )
{
2010-02-07 18:01:46 -05:00
std : : cerr < < " Format: " < < ( * it ) . toStdString ( ) < < std : : endl ;
2010-01-31 17:29:30 -05:00
}
if ( event - > mimeData ( ) - > hasUrls ( ) )
{
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::dragEnterEvent() Accepting Urls " < < std : : endl ;
2010-01-31 17:29:30 -05:00
event - > acceptProposedAction ( ) ;
}
else
{
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::dragEnterEvent() No Urls " < < std : : endl ;
2010-01-31 17:29:30 -05:00
}
}
2010-04-27 18:08:38 -04:00
bool PeersDialog : : fileSave ( )
{
if ( fileName . isEmpty ( ) )
return fileSaveAs ( ) ;
QFile file ( fileName ) ;
if ( ! file . open ( QFile : : WriteOnly ) )
return false ;
QTextStream ts ( & file ) ;
ts . setCodec ( QTextCodec : : codecForName ( " UTF-8 " ) ) ;
ts < < ui . msgText - > document ( ) - > toPlainText ( ) ;
ui . msgText - > document ( ) - > setModified ( false ) ;
return true ;
}
bool PeersDialog : : fileSaveAs ( )
{
QString fn = QFileDialog : : getSaveFileName ( this , tr ( " Save as... " ) ,
QString ( ) , tr ( " Text File (*.txt );;All Files (*) " ) ) ;
if ( fn . isEmpty ( ) )
return false ;
setCurrentFileName ( fn ) ;
return fileSave ( ) ;
}
void PeersDialog : : setCurrentFileName ( const QString & fileName )
{
this - > fileName = fileName ;
ui . msgText - > document ( ) - > setModified ( false ) ;
setWindowModified ( false ) ;
2010-05-02 07:41:23 -04:00
}
2010-05-05 07:47:29 -04:00
////play sound when recv a message
void PeersDialog : : playsound ( ) {
2010-05-20 17:53:27 -04:00
Settings - > beginGroup ( " Sound " ) ;
Settings - > beginGroup ( " SoundFilePath " ) ;
QString OnlineSound = Settings - > value ( " NewChatMessage " , " " ) . toString ( ) ;
Settings - > endGroup ( ) ;
Settings - > beginGroup ( " Enable " ) ;
bool flag = Settings - > value ( " NewChatMessage " , false ) . toBool ( ) ;
Settings - > endGroup ( ) ;
Settings - > endGroup ( ) ;
2010-05-05 07:47:29 -04:00
if ( ! OnlineSound . isEmpty ( ) & & flag )
if ( QSound : : isAvailable ( ) )
2010-05-11 16:02:52 -04:00
QSound : : play ( OnlineSound ) ;
2010-05-05 07:47:29 -04:00
}