2010-07-23 14:52:58 -04:00
# include <QInputDialog>
# include <QMessageBox>
2009-12-28 17:40:45 -05:00
# include "notifyqt.h"
2010-08-06 05:40:23 -04:00
# include <retroshare/rsnotify.h>
# include <retroshare/rspeers.h>
# include <retroshare/rsphoto.h>
2010-11-21 10:22:41 -05:00
# include <retroshare/rsmsgs.h>
2009-12-28 17:40:45 -05:00
# ifdef TURTLE_HOPPING
2010-08-06 05:40:23 -04:00
# include <retroshare/rsturtle.h>
2009-12-28 17:40:45 -05:00
# endif
2010-05-02 20:09:55 -04:00
# include "gui/RsAutoUpdatePage.h"
2009-12-28 17:40:45 -05:00
2010-08-31 16:00:49 -04:00
# ifndef MINIMAL_RSGUI
2009-12-28 17:40:45 -05:00
# include "gui/toaster/OnlineToaster.h"
# include "gui/toaster/MessageToaster.h"
# include "gui/toaster/ChatToaster.h"
# include "gui/toaster/CallToaster.h"
2010-11-24 19:20:25 -05:00
# include "gui/toaster/DownloadToaster.h"
2010-08-31 16:00:49 -04:00
# endif // MINIMAL_RSGUI
2009-12-28 17:40:45 -05:00
# include "gui/settings/rsharesettings.h"
# include <iostream>
# include <sstream>
2010-01-20 17:02:43 -05:00
# include <time.h>
2009-12-28 17:40:45 -05:00
/*****
* # define NOTIFY_DEBUG
* * * */
2010-07-18 07:43:39 -04:00
/*static*/ NotifyQt * NotifyQt : : _instance = NULL ;
/*static*/ NotifyQt * NotifyQt : : Create ( )
{
if ( _instance = = NULL ) {
_instance = new NotifyQt ( ) ;
}
return _instance ;
}
/*static*/ NotifyQt * NotifyQt : : getInstance ( )
{
return _instance ;
}
2009-12-28 17:40:45 -05:00
void NotifyQt : : notifyErrorMsg ( int list , int type , std : : string msg )
{
2010-02-07 13:10:12 -05:00
emit errorOccurred ( list , type , QString : : fromStdString ( msg ) ) ;
2009-12-28 17:40:45 -05:00
}
void NotifyQt : : notifyOwnAvatarChanged ( )
{
2010-02-08 11:42:26 -05:00
# ifdef NOTIFY_DEBUG
2009-12-28 17:40:45 -05:00
std : : cerr < < " Notifyqt:: notified that own avatar changed " < < std : : endl ;
2010-02-08 11:42:26 -05:00
# endif
2009-12-28 17:40:45 -05:00
emit ownAvatarChanged ( ) ;
}
2010-04-19 17:50:03 -04:00
std : : string NotifyQt : : askForPassword ( const std : : string & key_details , bool prev_is_bad )
2009-12-28 17:40:45 -05:00
{
2010-02-09 14:10:15 -05:00
2010-04-19 17:50:03 -04:00
RsAutoUpdatePage : : lockAllEvents ( ) ;
std : : string res = QInputDialog : : getText ( NULL , tr ( " GPG key passphrase " ) ,
2010-09-12 16:27:03 -04:00
( prev_is_bad ? tr ( " Wrong password ! " ) + " \n \n " : QString ( ) ) +
tr ( " Please enter the password to unlock the following GPG key: " ) + " \n " + QString : : fromStdString ( key_details ) , QLineEdit : : Password , NULL , NULL ) . toStdString ( ) ;
2010-04-19 17:50:03 -04:00
RsAutoUpdatePage : : unlockAllEvents ( ) ;
return res ;
2009-12-28 17:40:45 -05:00
}
2010-11-05 18:46:40 -04:00
void NotifyQt : : notifyDiscInfoChanged ( )
{
std : : cerr < < " Notifyqt:: notified that discoveryInfo changed " < < std : : endl ;
emit discInfoChanged ( ) ;
}
2010-11-24 19:20:25 -05:00
void NotifyQt : : notifyDownloadComplete ( const std : : string & fileHash )
{
std : : cerr < < " Notifyqt::notifyDownloadComplete notified that a download is completed " < < std : : endl ;
emit downloadComplete ( QString : : fromStdString ( fileHash ) ) ;
}
void NotifyQt : : notifyDownloadCompleteCount ( uint32_t count )
{
std : : cerr < < " Notifyqt::notifyDownloadCompleteCount " < < count < < std : : endl ;
emit downloadCompleteCountChanged ( count ) ;
}
2010-05-21 16:49:48 -04:00
void NotifyQt : : notifyDiskFull ( uint32_t loc , uint32_t size_in_mb )
{
std : : cerr < < " Notifyqt:: notified that disk is full " < < std : : endl ;
emit diskFull ( loc , size_in_mb ) ;
}
2010-08-20 14:45:44 -04:00
/* peer has changed the state */
void NotifyQt : : notifyPeerStatusChanged ( const std : : string & peer_id , uint32_t state )
{
# ifdef NOTIFY_DEBUG
std : : cerr < < " Notifyqt:: notified that peer " < < peer_id < < " has changed the state to " < < state < < std : : endl ;
# endif
emit peerStatusChanged ( QString : : fromStdString ( peer_id ) , state ) ;
}
/* one or more peers has changed the states */
void NotifyQt : : notifyPeerStatusChangedSummary ( )
{
# ifdef NOTIFY_DEBUG
std : : cerr < < " Notifyqt:: notified that one peer has changed the state " < < std : : endl ;
# endif
emit peerStatusChangedSummary ( ) ;
}
2010-10-06 20:17:42 -04:00
void NotifyQt : : notifyChannelMsgReadSatusChanged ( const std : : string & channelId , const std : : string & msgId , uint32_t status )
{
emit channelMsgReadSatusChanged ( QString : : fromStdString ( channelId ) , QString : : fromStdString ( msgId ) , status ) ;
}
2009-12-28 17:40:45 -05:00
void NotifyQt : : notifyOwnStatusMessageChanged ( )
{
2010-02-08 11:42:26 -05:00
# ifdef NOTIFY_DEBUG
2009-12-28 17:40:45 -05:00
std : : cerr < < " Notifyqt:: notified that own avatar changed " < < std : : endl ;
2010-02-08 11:42:26 -05:00
# endif
2009-12-28 17:40:45 -05:00
emit ownStatusMessageChanged ( ) ;
}
void NotifyQt : : notifyPeerHasNewAvatar ( std : : string peer_id )
{
2010-02-08 11:42:26 -05:00
# ifdef NOTIFY_DEBUG
2009-12-28 17:40:45 -05:00
std : : cerr < < " notifyQt: notification of new avatar. " < < std : : endl ;
2010-02-08 11:42:26 -05:00
# endif
2009-12-28 17:40:45 -05:00
emit peerHasNewAvatar ( QString : : fromStdString ( peer_id ) ) ;
}
2010-09-02 06:15:13 -04:00
void NotifyQt : : notifyCustomState ( const std : : string & peer_id , const std : : string & status_string )
2009-12-28 17:40:45 -05:00
{
2010-02-08 11:42:26 -05:00
# ifdef NOTIFY_DEBUG
2009-12-28 17:40:45 -05:00
std : : cerr < < " notifyQt: Received custom status string notification " < < std : : endl ;
2010-02-08 11:42:26 -05:00
# endif
2010-09-02 06:15:13 -04:00
emit peerHasNewCustomStateString ( QString : : fromStdString ( peer_id ) , QString : : fromStdString ( status_string ) ) ;
2009-12-28 17:40:45 -05:00
}
void NotifyQt : : notifyChatStatus ( const std : : string & peer_id , const std : : string & status_string , bool is_private )
{
2010-02-08 11:42:26 -05:00
# ifdef NOTIFY_DEBUG
2009-12-28 17:40:45 -05:00
std : : cerr < < " notifyQt: Received chat status string: " < < status_string < < std : : endl ;
2010-02-08 11:42:26 -05:00
# endif
2009-12-28 17:40:45 -05:00
emit chatStatusChanged ( QString : : fromStdString ( peer_id ) , QString : : fromStdString ( status_string ) , is_private ) ;
}
void NotifyQt : : notifyTurtleSearchResult ( uint32_t search_id , const std : : list < TurtleFileInfo > & files )
{
2010-02-08 11:42:26 -05:00
# ifdef NOTIFY_DEBUG
2009-12-28 17:40:45 -05:00
std : : cerr < < " in notify search result... " < < std : : endl ;
2010-02-08 11:42:26 -05:00
# endif
2009-12-28 17:40:45 -05:00
for ( std : : list < TurtleFileInfo > : : const_iterator it ( files . begin ( ) ) ; it ! = files . end ( ) ; + + it )
{
FileDetail det ;
det . rank = 0 ;
det . age = 0 ;
det . name = ( * it ) . name ;
det . hash = ( * it ) . hash ;
det . size = ( * it ) . size ;
det . id = " Anonymous " ;
emit gotTurtleSearchResult ( search_id , det ) ;
}
}
2010-10-09 14:35:34 -04:00
void NotifyQt : : notifyHashingInfo ( uint32_t type , const std : : string & fileinfo )
{
QString info ;
switch ( type ) {
case NOTIFY_HASHTYPE_EXAMINING_FILES :
info = tr ( " Examining shared files... " ) ;
break ;
case NOTIFY_HASHTYPE_FINISH :
break ;
case NOTIFY_HASHTYPE_HASH_FILE :
info = tr ( " Hashing file " ) + " " + QString : : fromUtf8 ( fileinfo . c_str ( ) ) ;
break ;
case NOTIFY_HASHTYPE_SAVE_FILE_INDEX :
info = tr ( " Saving file index... " ) ;
break ;
}
emit hashingInfoChanged ( info ) ;
2009-12-28 17:40:45 -05:00
}
//void NotifyQt::notifyChat()
//{
// std::cerr << "Received chat notification" << std::endl ;
// return;
//}
void NotifyQt : : notifyListChange ( int list , int type )
{
# ifdef NOTIFY_DEBUG
std : : cerr < < " NotifyQt::notifyListChange() " < < std : : endl ;
# endif
switch ( list )
{
case NOTIFY_LIST_NEIGHBOURS :
2010-02-08 11:42:26 -05:00
# ifdef NOTIFY_DEBUG
2009-12-28 17:40:45 -05:00
std : : cerr < < " received neighbrs changed " < < std : : endl ;
# endif
emit neighborsChanged ( ) ;
break ;
case NOTIFY_LIST_FRIENDS :
2010-02-08 11:42:26 -05:00
# ifdef NOTIFY_DEBUG
2009-12-28 17:40:45 -05:00
std : : cerr < < " received friends changed " < < std : : endl ;
# endif
emit friendsChanged ( ) ;
break ;
case NOTIFY_LIST_DIRLIST_LOCAL :
2010-02-08 11:42:26 -05:00
# ifdef NOTIFY_DEBUG
2009-12-28 17:40:45 -05:00
std : : cerr < < " received files changed " < < std : : endl ;
# endif
emit filesPostModChanged ( true ) ; /* Local */
break ;
case NOTIFY_LIST_DIRLIST_FRIENDS :
2010-02-08 11:42:26 -05:00
# ifdef NOTIFY_DEBUG
2009-12-28 17:40:45 -05:00
std : : cerr < < " received files changed " < < std : : endl ;
# endif
emit filesPostModChanged ( false ) ; /* Local */
break ;
case NOTIFY_LIST_SEARCHLIST :
break ;
case NOTIFY_LIST_MESSAGELIST :
2010-02-08 11:42:26 -05:00
# ifdef NOTIFY_DEBUG
2009-12-28 17:40:45 -05:00
std : : cerr < < " received msg changed " < < std : : endl ;
# endif
emit messagesChanged ( ) ;
break ;
2010-08-22 18:12:26 -04:00
case NOTIFY_LIST_MESSAGE_TAGS :
# ifdef NOTIFY_DEBUG
std : : cerr < < " received msg tags changed " < < std : : endl ;
# endif
emit messagesTagsChanged ( ) ;
break ;
2009-12-28 17:40:45 -05:00
case NOTIFY_LIST_CHANNELLIST :
break ;
case NOTIFY_LIST_TRANSFERLIST :
2010-02-08 11:42:26 -05:00
# ifdef NOTIFY_DEBUG
2009-12-28 17:40:45 -05:00
std : : cerr < < " received transfer changed " < < std : : endl ;
# endif
emit transfersChanged ( ) ;
break ;
case NOTIFY_LIST_CONFIG :
2010-02-08 11:42:26 -05:00
# ifdef NOTIFY_DEBUG
2009-12-28 17:40:45 -05:00
std : : cerr < < " received config changed " < < std : : endl ;
# endif
emit configChanged ( ) ;
break ;
2010-08-09 17:20:34 -04:00
case NOTIFY_LIST_FORUMLIST_LOCKED :
# ifdef NOTIFY_DEBUG
std : : cerr < < " received forum msg changed " < < std : : endl ;
# endif
emit forumsChanged ( ) ; // use connect with Qt::QueuedConnection
break ;
2010-10-06 20:17:42 -04:00
case NOTIFY_LIST_CHANNELLIST_LOCKED :
# ifdef NOTIFY_DEBUG
std : : cerr < < " received channel msg changed " < < std : : endl ;
# endif
emit channelsChanged ( type ) ; // use connect with Qt::QueuedConnection
break ;
2010-09-01 13:56:15 -04:00
case NOTIFY_LIST_PUBLIC_CHAT :
2010-08-31 13:13:52 -04:00
# ifdef NOTIFY_DEBUG
2010-09-01 13:56:15 -04:00
std : : cerr < < " received public chat changed " < < std : : endl ;
2010-08-31 13:13:52 -04:00
# endif
2010-09-01 13:56:15 -04:00
emit publicChatChanged ( type ) ;
break ;
2010-09-20 20:08:06 -04:00
case NOTIFY_LIST_PRIVATE_INCOMING_CHAT :
case NOTIFY_LIST_PRIVATE_OUTGOING_CHAT :
2010-09-01 13:56:15 -04:00
# ifdef NOTIFY_DEBUG
std : : cerr < < " received private chat changed " < < std : : endl ;
# endif
2010-09-20 20:08:06 -04:00
emit privateChatChanged ( list , type ) ;
2010-08-31 13:13:52 -04:00
break ;
2010-09-22 18:37:57 -04:00
case NOTIFY_LIST_GROUPLIST :
# ifdef NOTIFY_DEBUG
std : : cerr < < " received groups changed " < < std : : endl ;
# endif
emit groupsChanged ( type ) ;
break ;
2009-12-28 17:40:45 -05:00
default :
break ;
}
return ;
}
void NotifyQt : : notifyListPreChange ( int list , int type )
{
# ifdef NOTIFY_DEBUG
std : : cerr < < " NotifyQt::notifyListPreChange() " < < std : : endl ;
# endif
switch ( list )
{
case NOTIFY_LIST_NEIGHBOURS :
break ;
case NOTIFY_LIST_FRIENDS :
emit friendsChanged ( ) ;
break ;
case NOTIFY_LIST_DIRLIST_FRIENDS :
emit filesPreModChanged ( false ) ; /* remote */
break ;
case NOTIFY_LIST_DIRLIST_LOCAL :
emit filesPreModChanged ( true ) ; /* local */
break ;
case NOTIFY_LIST_SEARCHLIST :
break ;
case NOTIFY_LIST_MESSAGELIST :
break ;
case NOTIFY_LIST_CHANNELLIST :
break ;
case NOTIFY_LIST_TRANSFERLIST :
break ;
default :
break ;
}
return ;
}
/* New Timer Based Update scheme ...
* means correct thread seperation
*
* uses Flags , to detect changes
*/
void NotifyQt : : UpdateGUI ( )
{
2010-08-31 16:00:49 -04:00
# ifndef MINIMAL_RSGUI
2009-12-28 17:40:45 -05:00
/* hack to force updates until we've fixed that part */
static time_t lastTs = 0 ;
// std::cerr << "Got update signal t=" << lastTs << std::endl ;
lastTs = time ( NULL ) ;
static bool already_updated = false ; // these only update once at start because they may already have been set before
// the gui is running, then they get updated by callbacks.
if ( ! already_updated )
{
emit messagesChanged ( ) ;
emit neighborsChanged ( ) ;
emit configChanged ( ) ;
already_updated = true ;
}
/* Finally Check for PopupMessages / System Error Messages */
if ( rsNotify )
{
uint32_t sysid ;
uint32_t type ;
std : : string title , id , msg ;
2010-11-24 19:20:25 -05:00
2010-06-13 17:02:29 -04:00
if ( rsNotify - > NotifyPopupMessage ( type , id , title , msg ) )
2009-12-28 17:40:45 -05:00
{
2010-05-20 17:53:27 -04:00
uint popupflags = Settings - > getNotifyFlags ( ) ;
2009-12-28 17:40:45 -05:00
/* id the name */
2010-11-24 19:20:25 -05:00
std : : string name ;
std : : string realmsg ;
if ( RS_POPUP_DOWNLOAD = = RS_POPUP_DOWNLOAD ) {
/* id = file hash */
} else {
name = rsPeers - > getPeerName ( id ) ;
realmsg = " <strong> " + name + " </strong> " ;
}
2010-11-21 10:22:41 -05:00
unsigned char * data = NULL ;
int size = 0 ;
rsMsgs - > getAvatarData ( id , data , size ) ;
2009-12-28 17:40:45 -05:00
switch ( type )
{
case RS_POPUP_MSG :
if ( popupflags & RS_POPUP_MSG )
{
MessageToaster * msgToaster = new MessageToaster ( ) ;
2010-06-13 17:02:29 -04:00
msgToaster - > setMessage ( QString : : fromStdString ( msg ) ) ;
2009-12-28 17:40:45 -05:00
msgToaster - > setName ( QString : : fromStdString ( realmsg ) ) ;
2010-06-13 17:02:29 -04:00
msgToaster - > setTitle ( QString : : fromStdString ( title ) ) ;
2009-12-28 17:40:45 -05:00
msgToaster - > displayPopup ( ) ;
}
break ;
case RS_POPUP_CHAT :
if ( popupflags & RS_POPUP_CHAT )
{
ChatToaster * chatToaster = new ChatToaster ( ) ;
chatToaster - > setMessage ( QString : : fromStdString ( realmsg ) ) ;
chatToaster - > show ( ) ;
}
break ;
case RS_POPUP_CALL :
if ( popupflags & RS_POPUP_CALL )
{
CallToaster * callToaster = new CallToaster ( ) ;
callToaster - > setMessage ( QString : : fromStdString ( realmsg ) ) ;
callToaster - > show ( ) ;
}
break ;
default :
case RS_POPUP_CONNECT :
if ( popupflags & RS_POPUP_CONNECT )
{
OnlineToaster * onlineToaster = new OnlineToaster ( ) ;
onlineToaster - > setMessage ( QString : : fromStdString ( realmsg ) ) ;
2010-11-21 10:22:41 -05:00
if ( size ! = 0 )
{
// set the image
QPixmap pix ;
pix . loadFromData ( data , size , " PNG " ) ;
onlineToaster - > setPixmap ( pix ) ;
delete [ ] data ;
}
else
{
onlineToaster - > setPixmap ( QPixmap ( " :/images/user/personal64.png " ) ) ;
}
2009-12-28 17:40:45 -05:00
onlineToaster - > show ( ) ;
2010-05-05 07:47:29 -04:00
onlineToaster - > play ( ) ;
2009-12-28 17:40:45 -05:00
}
break ;
2010-11-24 19:20:25 -05:00
case RS_POPUP_DOWNLOAD :
if ( popupflags & RS_POPUP_DOWNLOAD )
{
DownloadToaster * downloadToaster = new DownloadToaster ( ) ;
downloadToaster - > displayPopup ( id , QString : : fromUtf8 ( title . c_str ( ) ) ) ;
}
break ;
2009-12-28 17:40:45 -05:00
}
}
if ( rsNotify - > NotifySysMessage ( sysid , type , title , msg ) )
{
/* make a warning message */
switch ( type )
{
case RS_SYS_ERROR :
QMessageBox : : critical ( 0 ,
QString : : fromStdString ( title ) ,
QString : : fromStdString ( msg ) ) ;
break ;
case RS_SYS_WARNING :
QMessageBox : : warning ( 0 ,
QString : : fromStdString ( title ) ,
QString : : fromStdString ( msg ) ) ;
break ;
default :
case RS_SYS_INFO :
QMessageBox : : information ( 0 ,
QString : : fromStdString ( title ) ,
QString : : fromStdString ( msg ) ) ;
break ;
}
}
if ( rsNotify - > NotifyLogMessage ( sysid , type , title , msg ) )
{
/* make a log message */
std : : string logMesString = title + " " + msg ;
switch ( type )
{
case RS_SYS_ERROR :
case RS_SYS_WARNING :
case RS_SYS_INFO : emit logInfoChanged ( QString ( logMesString . c_str ( ) ) ) ;
default : ;
}
}
}
2010-08-31 16:00:49 -04:00
# endif // MINIMAL_RSGUI
2009-12-28 17:40:45 -05:00
}
2010-09-07 11:49:31 -04:00
void NotifyQt : : notifyChatStyleChanged ( int /*ChatStyle::enumStyleType*/ styleType )
{
emit chatStyleChanged ( styleType ) ;
}
2009-12-28 17:40:45 -05:00
//void NotifyQt::displaySearch()
//{
// iface->lockData(); /* Lock Interface */
//
//#ifdef NOTIFY_DEBUG
// std::ostringstream out;
// std::cerr << out.str();
//#endif
//
// iface->unlockData(); /* UnLock Interface */
//}
// void NotifyQt::displayChat()
// {
// iface->lockData(); /* Lock Interface */
//
// #ifdef NOTIFY_DEBUG
// std::ostringstream out;
// std::cerr << out.str();
// #endif
//
// iface->unlockData(); /* UnLock Interface */
//
// if (hDialog)
// hDialog -> insertChat();
// }
//
//
//void NotifyQt::displayChannels()
//{
// iface->lockData(); /* Lock Interface */
//
//#ifdef NOTIFY_DEBUG
// std::ostringstream out;
// std::cerr << out.str();
//#endif
//
// iface->unlockData(); /* UnLock Interface */
//
// if (sDialog)
// sDialog -> insertChannels();
//}
//
//
//void NotifyQt::displayTransfers()
//{
// /* Do the GUI */
// if (tDialog)
// tDialog->insertTransfers();
//}
//
//
//void NotifyQt::preDisplayNeighbours()
//{
//
//}
//
//void NotifyQt::preDisplayFriends()
//{
//
//}
//void NotifyQt::preDisplaySearch()
//{
//
//}
//
//void NotifyQt::preDisplayMessages()
//{
//
//}
//
//void NotifyQt::preDisplayChannels()
//{
//
//}
//
//void NotifyQt::preDisplayTransfers()
//{
//
//
//}