Improved the bootstrap Stun system.

* searching for STUN ID's continues until RS_STUN_FOUND_MIN are found (10).
 * abandon STUN search if Ext or Upnp mode.
 * add Bootstrap IDs to rear of mStunList. (bugfix)

Force saving of certificates after "oldFormat" loading.
Corrected printStunList() fn call.

Added a notification system: 
 (1) libretroshare System Notifications.
 	- System notification if Firewall Status is bad.
 (2) PopUp messages.
 	- Popup for a connected peer.
 	- Popup for a new message.
 * New interface (to be revised).



git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@376 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
drbob 2008-03-05 16:32:18 +00:00
parent 08860b25e6
commit 0bdc3522a6
13 changed files with 579 additions and 26 deletions

View File

@ -2079,6 +2079,7 @@ bool AuthXPGP::loadCertificates(bool &oldFormat, std::map<std::string, std::s
if (keyValueMap.size() > 0) if (keyValueMap.size() > 0)
{ {
oldFormat = true; oldFormat = true;
mToSaveCerts = true;
} }
mToSaveCerts = false; mToSaveCerts = false;

View File

@ -28,6 +28,7 @@
#include "util/rsprint.h" #include "util/rsprint.h"
#include "serialiser/rsconfigitems.h" #include "serialiser/rsconfigitems.h"
#include "rsiface/rsnotify.h"
/* Network setup States */ /* Network setup States */
@ -42,6 +43,7 @@ const uint32_t RS_NET_DONE = 0x0005;
const uint32_t RS_STUN_DHT = 0x0001; const uint32_t RS_STUN_DHT = 0x0001;
const uint32_t RS_STUN_DONE = 0x0002; const uint32_t RS_STUN_DONE = 0x0002;
const uint32_t RS_STUN_LIST_MIN = 100; const uint32_t RS_STUN_LIST_MIN = 100;
const uint32_t RS_STUN_FOUND_MIN = 10;
const uint32_t MAX_UPNP_INIT = 30; /* seconds UPnP timeout */ const uint32_t MAX_UPNP_INIT = 30; /* seconds UPnP timeout */
@ -100,7 +102,8 @@ peerConnectState::peerConnectState()
p3ConnectMgr::p3ConnectMgr(p3AuthMgr *am) p3ConnectMgr::p3ConnectMgr(p3AuthMgr *am)
:p3Config(CONFIG_TYPE_PEERS), :p3Config(CONFIG_TYPE_PEERS),
mAuthMgr(am), mDhtMgr(NULL), mUpnpMgr(NULL), mNetStatus(RS_NET_UNKNOWN), mAuthMgr(am), mDhtMgr(NULL), mUpnpMgr(NULL), mNetStatus(RS_NET_UNKNOWN),
mStunStatus(0), mStatusChanged(false) mStunStatus(0), mStunFound(0), mStunMoreRequired(true),
mStatusChanged(false)
{ {
mUpnpAddrValid = false; mUpnpAddrValid = false;
mStunAddrValid = false; mStunAddrValid = false;
@ -262,6 +265,8 @@ void p3ConnectMgr::netStartup()
std::cerr << "p3ConnectMgr::netStartup() disabling stunkeepalive() cos EXT" << std::endl; std::cerr << "p3ConnectMgr::netStartup() disabling stunkeepalive() cos EXT" << std::endl;
#endif #endif
tou_stunkeepalive(0); tou_stunkeepalive(0);
mStunMoreRequired = false; /* only need to validate address (EXT) */
break; break;
case RS_NET_MODE_TRY_UDP: case RS_NET_MODE_TRY_UDP:
@ -278,13 +283,11 @@ void p3ConnectMgr::netStartup()
break; break;
} }
/* add Bootstrap Peers if we've got none from config */
if (mStunList.size() < 1)
{
addBootstrapStunPeers();
}
connMtx.unlock(); /* UNLOCK MUTEX */ connMtx.unlock(); /* UNLOCK MUTEX */
/* add Bootstrap Peers ALWAYs (get stuck on the end) */
addBootstrapStunPeers();
} }
@ -413,6 +416,7 @@ void p3ConnectMgr::netTick()
#ifdef CONN_DEBUG #ifdef CONN_DEBUG
//std::cerr << "p3ConnectMgr::netTick() STATUS: DONE" << std::endl; //std::cerr << "p3ConnectMgr::netTick() STATUS: DONE" << std::endl;
#endif #endif
stunCheck(); /* Keep on stunning until its happy */
default: default:
break; break;
} }
@ -501,7 +505,7 @@ void p3ConnectMgr::netUpnpCheck()
mUpnpAddrValid = false; mUpnpAddrValid = false;
mNetStatus = RS_NET_UDP_SETUP; mNetStatus = RS_NET_UDP_SETUP;
#ifdef CONN_DEBUG #ifdef CONN_DEBUG
std::cerr << "p3ConnectMgr::netUpnpCheck() ensabling stunkeepalive() cos UDP" << std::endl; std::cerr << "p3ConnectMgr::netUpnpCheck() enabling stunkeepalive() cos UDP" << std::endl;
#endif #endif
tou_stunkeepalive(1); tou_stunkeepalive(1);
@ -522,6 +526,7 @@ void p3ConnectMgr::netUpnpCheck()
std::cerr << "p3ConnectMgr::netUpnpCheck() disabling stunkeepalive() cos uPnP" << std::endl; std::cerr << "p3ConnectMgr::netUpnpCheck() disabling stunkeepalive() cos uPnP" << std::endl;
#endif #endif
tou_stunkeepalive(0); tou_stunkeepalive(0);
mStunMoreRequired = false; /* only need to validate address (UPNP) */
connMtx.unlock(); /* UNLOCK MUTEX */ connMtx.unlock(); /* UNLOCK MUTEX */
} }
@ -532,15 +537,13 @@ void p3ConnectMgr::netUdpCheck()
#ifdef CONN_DEBUG #ifdef CONN_DEBUG
std::cerr << "p3ConnectMgr::netUdpCheck()" << std::endl; std::cerr << "p3ConnectMgr::netUdpCheck()" << std::endl;
#endif #endif
if (stunCheck() || (mUpnpAddrValid)) if (udpExtAddressCheck() || (mUpnpAddrValid))
{ {
bool extValid = false; bool extValid = false;
bool extAddrStable = false; bool extAddrStable = false;
struct sockaddr_in extAddr; struct sockaddr_in extAddr;
uint32_t mode = 0; uint32_t mode = 0;
connMtx.lock(); /* LOCK MUTEX */ connMtx.lock(); /* LOCK MUTEX */
mNetStatus = RS_NET_DONE; mNetStatus = RS_NET_DONE;
@ -588,6 +591,30 @@ void p3ConnectMgr::netUdpCheck()
ownState.netMode &= ~(RS_NET_MODE_ACTUAL); ownState.netMode &= ~(RS_NET_MODE_ACTUAL);
ownState.netMode |= RS_NET_MODE_UNREACHABLE; ownState.netMode |= RS_NET_MODE_UNREACHABLE;
tou_stunkeepalive(0); tou_stunkeepalive(0);
mStunMoreRequired = false; /* no point -> unreachable (EXT) */
/* send a system warning message */
if (rsNotify)
{
std::string title =
"Warning: Bad Firewall Configuration";
std::string msg;
msg += " **** WARNING **** \n";
msg += "Retroshare has detected that you are behind";
msg += " a restrictive Firewall\n";
msg += "\n";
msg += "You cannot connect to other firewalled peers\n";
msg += "\n";
msg += "You can fix this by:\n";
msg += " (1) opening an External Port\n";
msg += " (2) enabling UPnP, or\n";
msg += " (3) get a new (approved) Firewall/Router\n";
rsNotify->AddSysMessage(0, RS_SYS_WARNING,
title, msg);
}
} }
IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/ IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/
@ -771,6 +798,8 @@ void p3ConnectMgr::stunInit()
mDhtMgr->addStun(*it); mDhtMgr->addStun(*it);
} }
mStunStatus = RS_STUN_DHT; mStunStatus = RS_STUN_DHT;
mStunFound = 0;
mStunMoreRequired = true;
connMtx.unlock(); /* UNLOCK MUTEX */ connMtx.unlock(); /* UNLOCK MUTEX */
} }
@ -778,13 +807,30 @@ void p3ConnectMgr::stunInit()
bool p3ConnectMgr::stunCheck() bool p3ConnectMgr::stunCheck()
{ {
/* check if we've got a Stun result */ /* check if we've got a Stun result */
bool stunOk = false;
#ifdef CONN_DEBUG #ifdef CONN_DEBUG
std::cerr << "p3ConnectMgr::stunCheck()" << std::endl; std::cerr << "p3ConnectMgr::stunCheck()" << std::endl;
#endif #endif
{
RsStackMutex stack(connMtx); /********* LOCK STACK MUTEX ******/
if (udpExtAddressCheck()) /* if DONE -> return */
if (mStunStatus == RS_STUN_DONE)
{
return true;
}
if (mStunFound >= RS_STUN_FOUND_MIN)
{
mStunMoreRequired = false;
}
stunOk = (!mStunMoreRequired);
}
if (udpExtAddressCheck() && (stunOk))
{ {
/* set external UDP address */ /* set external UDP address */
mDhtMgr->doneStun(); mDhtMgr->doneStun();
@ -818,12 +864,16 @@ void p3ConnectMgr::stunStatus(std::string id, struct sockaddr_in raddr, uint3
{ {
if (stillStunning) if (stillStunning)
{ {
connMtx.lock(); /* LOCK MUTEX */
mStunFound++;
connMtx.unlock(); /* UNLOCK MUTEX */
#ifdef CONN_DEBUG #ifdef CONN_DEBUG
std::cerr << "p3ConnectMgr::stunStatus() Sending to UDP" << std::endl; std::cerr << "p3ConnectMgr::stunStatus() Sending to UDP" << std::endl;
#endif #endif
/* push to the UDP */ /* push to the UDP */
udpStunPeer(id, raddr); udpStunPeer(id, raddr);
} }
/* push to the stunCollect */ /* push to the stunCollect */
@ -862,8 +912,7 @@ void p3ConnectMgr::stunCollect(std::string id, struct sockaddr_in addr, uint32_t
/* add it in: /* add it in:
* if FRIEND / ONLINE or if list is short. * if FRIEND / ONLINE or if list is short.
*/ */
if ((flags & RS_STUN_ONLINE) || (flags & RS_STUN_FRIEND) if ((flags & RS_STUN_ONLINE) || (flags & RS_STUN_FRIEND))
|| (mStunList.size() < RS_STUN_LIST_MIN))
{ {
#ifdef CONN_DEBUG #ifdef CONN_DEBUG
std::cerr << "p3ConnectMgr::stunCollect() Id added to Front" << std::endl; std::cerr << "p3ConnectMgr::stunCollect() Id added to Front" << std::endl;
@ -871,6 +920,16 @@ void p3ConnectMgr::stunCollect(std::string id, struct sockaddr_in addr, uint32_t
/* push to the front */ /* push to the front */
mStunList.push_front(id); mStunList.push_front(id);
IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/
}
else if (mStunList.size() < RS_STUN_LIST_MIN)
{
#ifdef CONN_DEBUG
std::cerr << "p3ConnectMgr::stunCollect() Id added to Back" << std::endl;
#endif
/* push to the front */
mStunList.push_back(id);
IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/ IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/
} }
} }
@ -989,6 +1048,15 @@ void p3ConnectMgr::tickMonitors()
std::cerr << std::endl; std::cerr << std::endl;
#endif #endif
/* notify GUI */
if ((peer.actions & RS_PEER_CONNECTED) &&
(rsNotify))
{
rsNotify->AddPopupMessage(RS_POPUP_CONNECT,
peer.id, "Peer Online: ");
}
} }
} }
/* do the Others as well! */ /* do the Others as well! */
@ -1230,7 +1298,7 @@ bool p3ConnectMgr::connectResult(std::string id, bool success, uint32_t flags)
return false; return false;
} }
std::cerr << "p3ConnectMgr::connectAttempt() Success: "; std::cerr << "p3ConnectMgr::connectResult() Success: ";
std::cerr << " id: " << id; std::cerr << " id: " << id;
std::cerr << std::endl; std::cerr << std::endl;
std::cerr << " Success: " << success; std::cerr << " Success: " << success;
@ -2703,14 +2771,17 @@ void printConnectState(peerConnectState &peer)
bool p3ConnectMgr::addBootstrapStunPeers() bool p3ConnectMgr::addBootstrapStunPeers()
{ {
std::string id; std::string id;
struct sockaddr_in dummyaddr;
uint32_t flags = 0;
// Two Defaults for The Initial Release. // Two Defaults for The Initial Release.
id = "7ad672ea4d4af8560d5230aff3c88b59"; id = "7ad672ea4d4af8560d5230aff3c88b59";
mStunList.push_back(RsUtil::HashId(id, false)); stunCollect(RsUtil::HashId(id, false), dummyaddr, flags);
id = "8ad7c08e7778e0289de04843bf57a6ae"; id = "8ad7c08e7778e0289de04843bf57a6ae";
mStunList.push_back(RsUtil::HashId(id, false)); stunCollect(RsUtil::HashId(id, false), dummyaddr, flags);
return true;
} }

View File

@ -287,7 +287,11 @@ private:
time_t mNetInitTS; time_t mNetInitTS;
uint32_t mNetStatus; uint32_t mNetStatus;
uint32_t mStunStatus; uint32_t mStunStatus;
uint32_t mStunFound;
bool mStunMoreRequired;
bool mStatusChanged; bool mStatusChanged;
std::list<pqiMonitor *> clients; std::list<pqiMonitor *> clients;

View File

@ -391,6 +391,8 @@ void p3DhtMgr::run()
#ifdef DHT_DEBUG #ifdef DHT_DEBUG
std::cerr << "p3DhtMgr::run() state = ACTIVE -> do stuff" << std::endl; std::cerr << "p3DhtMgr::run() state = ACTIVE -> do stuff" << std::endl;
#endif #endif
doStun();
period = checkOwnDHTKeys(); period = checkOwnDHTKeys();
#ifdef DHT_DEBUG #ifdef DHT_DEBUG
std::cerr << "p3DhtMgr::run() checkOwnDHTKeys() period: " << period << std::endl; std::cerr << "p3DhtMgr::run() checkOwnDHTKeys() period: " << period << std::endl;
@ -792,18 +794,38 @@ int p3DhtMgr::checkNotifyDHT()
int p3DhtMgr::doStun() int p3DhtMgr::doStun()
{ {
#ifdef DHT_DEBUG
std::cerr << "p3DhtMgr::doStun()" << std::endl;
#endif
if (stunIds.size() < 1) if (stunIds.size() < 1)
{
#ifdef DHT_DEBUG
std::cerr << "p3DhtMgr::doStun() Failed -> no Ids left" << std::endl;
#endif
return 0; return 0;
}
dhtMtx.lock(); /* LOCK MUTEX */
bool stunRequired = mStunRequired;
dhtMtx.unlock(); /* UNLOCK MUTEX */
/* now loop through the peers */
if (!stunRequired)
{
#ifdef DHT_DEBUG
std::cerr << "p3DhtMgr::doStun() not Required" << std::endl;
#endif
return 0;
}
/* pop the front one */ /* pop the front one */
std::string activeStunId = stunIds.front(); std::string activeStunId = stunIds.front();
stunIds.pop_front(); stunIds.pop_front();
/* Don't recycle -> otherwise can end in an infinite (pointless) loop! */
//stunIds.push_back(activeStunId); #ifdef DHT_DEBUG
std::cerr << "p3DhtMgr::doStun() STUN: " << RsUtil::BinToHex(activeStunId);
std::cerr << std::endl;
#endif
/* look it up! */ /* look it up! */
dhtSearch(activeStunId, DHT_MODE_SEARCH); dhtSearch(activeStunId, DHT_MODE_SEARCH);

View File

@ -0,0 +1,76 @@
#ifndef RS_NOTIFY_GUI_INTERFACE_H
#define RS_NOTIFY_GUI_INTERFACE_H
/*
* libretroshare/src/rsiface: rsnotify.h
*
* RetroShare C++ Interface.
*
* Copyright 2007-2008 by Robert Fernie.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License Version 2 as published by the Free Software Foundation.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*
* Please report all bugs and problems to "retroshare@lunamutt.com".
*
*/
#include <map>
#include <list>
#include <iostream>
#include <string>
class RsNotify;
extern RsNotify *rsNotify;
const uint32_t RS_SYS_ERROR = 0x0001;
const uint32_t RS_SYS_WARNING = 0x0002;
const uint32_t RS_SYS_INFO = 0x0004;
const uint32_t RS_POPUP_MSG = 0x0001;
const uint32_t RS_POPUP_CHAT = 0x0002;
const uint32_t RS_POPUP_CALL = 0x0004;
const uint32_t RS_POPUP_CONNECT = 0x0008;
class RsNotify
{
public:
RsNotify() { return; }
virtual ~RsNotify() { return; }
/* Output for retroshare-gui */
virtual bool NotifySysMessage(uint32_t &sysid, uint32_t &type,
std::string &title, std::string &msg) = 0;
virtual bool NotifyPopupMessage(uint32_t &ptype, std::string &name, std::string &msg) = 0;
/* Control over Messages */
virtual bool GetSysMessageList(std::map<uint32_t, std::string> &list) = 0;
virtual bool GetPopupMessageList(std::map<uint32_t, std::string> &list) = 0;
virtual bool SetSysMessageMode(uint32_t sysid, uint32_t mode) = 0;
virtual bool SetPopupMessageMode(uint32_t ptype, uint32_t mode) = 0;
/* Input from libretroshare */
virtual bool AddPopupMessage(uint32_t ptype, std::string name, std::string msg) = 0;
virtual bool AddSysMessage(uint32_t sysid, uint32_t type,
std::string title, std::string msg) = 0;
};
#endif

View File

@ -11,6 +11,7 @@ RSOBJ = p3peers.o \
p3rank.o \ p3rank.o \
p3photo.o \ p3photo.o \
p3msgs.o \ p3msgs.o \
p3notify.o \
p3discovery.o \ p3discovery.o \
p3face-file.o \ p3face-file.o \
p3face-server.o \ p3face-server.o \

View File

@ -58,6 +58,7 @@
/* Implemented Rs Interfaces */ /* Implemented Rs Interfaces */
#include "rsserver/p3face.h" #include "rsserver/p3face.h"
#include "rsserver/p3notify.h"
#include "rsserver/p3peers.h" #include "rsserver/p3peers.h"
#include "rsserver/p3rank.h" #include "rsserver/p3rank.h"
#include "rsserver/p3msgs.h" #include "rsserver/p3msgs.h"
@ -482,6 +483,9 @@ int RsServer::StartupRetroShare(RsInit *config)
/* setup classes / structures */ /* setup classes / structures */
/**************************************************************************/ /**************************************************************************/
/* Setup Notify Early - So we can use it. */
rsNotify = new p3Notify();
mConnMgr = new p3ConnectMgr(mAuthMgr); mConnMgr = new p3ConnectMgr(mAuthMgr);
p3UpnpMgr *mUpnpMgr = new upnphandler(); p3UpnpMgr *mUpnpMgr = new upnphandler();
p3DhtMgr *mDhtMgr = new OpenDHTMgr(ownId, mConnMgr, config->basedir); p3DhtMgr *mDhtMgr = new OpenDHTMgr(ownId, mConnMgr, config->basedir);
@ -675,6 +679,7 @@ int RsServer::StartupRetroShare(RsInit *config)
rsDisc = new p3Discovery(ad); rsDisc = new p3Discovery(ad);
rsPhoto = new p3Photo(photoService); rsPhoto = new p3Photo(photoService);
/* put a welcome message in! */ /* put a welcome message in! */
if (config->firsttime_run) if (config->firsttime_run)
{ {

View File

@ -0,0 +1,129 @@
/*
* libretroshare/src/rsserver: p3notify.cc
*
* RetroShare C++ Interface.
*
* Copyright 2007-2008 by Robert Fernie.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License Version 2 as published by the Free Software Foundation.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*
* Please report all bugs and problems to "retroshare@lunamutt.com".
*
*/
#include "rsserver/p3notify.h"
/* external reference point */
RsNotify *rsNotify = NULL;
/* Output for retroshare-gui */
bool p3Notify::NotifySysMessage(uint32_t &sysid, uint32_t &type,
std::string &title, std::string &msg)
{
RsStackMutex stack(noteMtx); /************* LOCK MUTEX ************/
if (pendingSysMsgs.size() > 0)
{
p3NotifySysMsg smsg = pendingSysMsgs.front();
pendingSysMsgs.pop_front();
sysid = smsg.sysid;
type = smsg.type;
title = smsg.title;
msg = smsg.msg;
return true;
}
return false;
}
bool p3Notify::NotifyPopupMessage(uint32_t &ptype, std::string &name, std::string &msg)
{
RsStackMutex stack(noteMtx); /************* LOCK MUTEX ************/
if (pendingPopupMsgs.size() > 0)
{
p3NotifyPopupMsg pmsg = pendingPopupMsgs.front();
pendingPopupMsgs.pop_front();
ptype = pmsg.type;
name = pmsg.name;
msg = pmsg.msg;
return true;
}
return false;
}
/* Control over Messages */
bool p3Notify::GetSysMessageList(std::map<uint32_t, std::string> &list)
{
return false;
}
bool p3Notify::GetPopupMessageList(std::map<uint32_t, std::string> &list)
{
return false;
}
bool p3Notify::SetSysMessageMode(uint32_t sysid, uint32_t mode)
{
return false;
}
bool p3Notify::SetPopupMessageMode(uint32_t ptype, uint32_t mode)
{
return false;
}
/* Input from libretroshare */
bool p3Notify::AddPopupMessage(uint32_t ptype, std::string name, std::string msg)
{
RsStackMutex stack(noteMtx); /************* LOCK MUTEX ************/
p3NotifyPopupMsg pmsg;
pmsg.type = ptype;
pmsg.name = name;
pmsg.msg = msg;
pendingPopupMsgs.push_back(pmsg);
return true;
}
bool p3Notify::AddSysMessage(uint32_t sysid, uint32_t type,
std::string title, std::string msg)
{
RsStackMutex stack(noteMtx); /************* LOCK MUTEX ************/
p3NotifySysMsg smsg;
smsg.sysid = sysid;
smsg.type = type;
smsg.title = title;
smsg.msg = msg;
pendingSysMsgs.push_back(smsg);
return true;
}

View File

@ -0,0 +1,85 @@
#ifndef RS_P3_NOTIFY_INTERFACE_H
#define RS_P3_NOTIFY_INTERFACE_H
/*
* libretroshare/src/rsserver: p3notify.h
*
* RetroShare C++ Interface.
*
* Copyright 2007-2008 by Robert Fernie.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License Version 2 as published by the Free Software Foundation.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*
* Please report all bugs and problems to "retroshare@lunamutt.com".
*
*/
#include "rsiface/rsnotify.h"
#include "util/rsthreads.h"
class p3NotifySysMsg
{
public:
uint32_t sysid;
uint32_t type;
std::string title;
std::string msg;
};
class p3NotifyPopupMsg
{
public:
uint32_t type;
std::string name;
std::string msg;
};
class p3Notify: public RsNotify
{
public:
p3Notify() { return; }
virtual ~p3Notify() { return; }
/* Output for retroshare-gui */
virtual bool NotifySysMessage(uint32_t &sysid, uint32_t &type,
std::string &title, std::string &msg);
virtual bool NotifyPopupMessage(uint32_t &ptype, std::string &name, std::string &msg);
/* Control over Messages */
virtual bool GetSysMessageList(std::map<uint32_t, std::string> &list);
virtual bool GetPopupMessageList(std::map<uint32_t, std::string> &list);
virtual bool SetSysMessageMode(uint32_t sysid, uint32_t mode);
virtual bool SetPopupMessageMode(uint32_t ptype, uint32_t mode);
/* Input from libretroshare */
virtual bool AddPopupMessage(uint32_t ptype, std::string name, std::string msg);
virtual bool AddSysMessage(uint32_t sysid, uint32_t type,
std::string title, std::string msg);
private:
RsMutex noteMtx;
std::list<p3NotifySysMsg> pendingSysMsgs;
std::list<p3NotifyPopupMsg> pendingPopupMsgs;
};
#endif

View File

@ -30,6 +30,7 @@
#include "pqi/p3connmgr.h" #include "pqi/p3connmgr.h"
#include "services/p3msgservice.h" #include "services/p3msgservice.h"
#include "rsiface/rsnotify.h"
#include "util/rsdir.h" #include "util/rsdir.h"
@ -141,7 +142,13 @@ int p3MsgService::incomingMsgs()
/* from a peer */ /* from a peer */
MsgInfoSummary mis; MsgInfoSummary mis;
initRsMIS(mi, mis); initRsMIS(mi, mis);
msgNotifications.push_back(mis);
// msgNotifications.push_back(mis);
if (rsNotify)
{
rsNotify->AddPopupMessage(RS_POPUP_MSG, mi->PeerId(),
"New Message from: ");
}
} }
imsg[mi->msgId] = mi; imsg[mi->msgId] = mi;

View File

@ -653,8 +653,6 @@ bool UdpSorter::locked_recvdStun(const struct sockaddr_in &remote, const stru
std::cerr << out.str() << std::endl; std::cerr << out.str() << std::endl;
#endif #endif
locked_printStunList();
bool found = true; bool found = true;
std::list<TouStunPeer>::iterator it; std::list<TouStunPeer>::iterator it;
for(it = mStunList.begin(); it != mStunList.end(); it++) for(it = mStunList.begin(); it != mStunList.end(); it++)
@ -671,6 +669,8 @@ bool UdpSorter::locked_recvdStun(const struct sockaddr_in &remote, const stru
} }
} }
locked_printStunList();
if (!eaddrKnown) if (!eaddrKnown)
{ {
locked_checkExternalAddress(); locked_checkExternalAddress();

View File

@ -1,5 +1,7 @@
#include "rsiface/notifyqt.h" #include "rsiface/notifyqt.h"
#include "rsiface/rsnotify.h"
#include "rsiface/rspeers.h"
#include "gui/NetworkDialog.h" #include "gui/NetworkDialog.h"
#include "gui/PeersDialog.h" #include "gui/PeersDialog.h"
@ -10,6 +12,10 @@
#include "gui/ChannelsDialog.h" #include "gui/ChannelsDialog.h"
#include "gui/MessengerWindow.h" #include "gui/MessengerWindow.h"
#include "gui/toaster/MessageToaster.h"
#include "gui/toaster/ChatToaster.h"
#include "gui/toaster/CallToaster.h"
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
@ -158,9 +164,79 @@ static time_t lastTs = 0;
displayConfig(); displayConfig();
*/ */
/* Finally Check for PopupMessages / System Error Messages */
if (rsNotify)
{
uint32_t sysid;
uint32_t type;
std::string title, id, msg;
if (rsNotify->NotifyPopupMessage(type, id, msg))
{
/* id the name */
std::string name = rsPeers->getPeerName(id);
std::string realmsg = msg + name;
switch(type)
{
case RS_POPUP_MSG:
{
MessageToaster * msgToaster = new MessageToaster();
msgToaster->setMessage(QString::fromStdString(realmsg));
msgToaster->show();
break;
}
case RS_POPUP_CHAT:
{
ChatToaster * chatToaster = new ChatToaster();
chatToaster->setMessage(QString::fromStdString(realmsg));
chatToaster->show();
break;
}
case RS_POPUP_CALL:
{
CallToaster * callToaster = new CallToaster();
callToaster->setMessage(QString::fromStdString(realmsg));
callToaster->show();
break;
}
default:
case RS_POPUP_CONNECT:
{
MessageToaster * msgToaster = new MessageToaster();
msgToaster->setMessage(QString::fromStdString(realmsg));
msgToaster->show();
}
break;
} }
}
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;
}
}
}
}
void NotifyQt::displayNeighbours() void NotifyQt::displayNeighbours()

View File

@ -0,0 +1,76 @@
#ifndef RS_NOTIFY_GUI_INTERFACE_H
#define RS_NOTIFY_GUI_INTERFACE_H
/*
* libretroshare/src/rsiface: rsnotify.h
*
* RetroShare C++ Interface.
*
* Copyright 2007-2008 by Robert Fernie.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License Version 2 as published by the Free Software Foundation.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*
* Please report all bugs and problems to "retroshare@lunamutt.com".
*
*/
#include <map>
#include <list>
#include <iostream>
#include <string>
class RsNotify;
extern RsNotify *rsNotify;
const uint32_t RS_SYS_ERROR = 0x0001;
const uint32_t RS_SYS_WARNING = 0x0002;
const uint32_t RS_SYS_INFO = 0x0004;
const uint32_t RS_POPUP_MSG = 0x0001;
const uint32_t RS_POPUP_CHAT = 0x0002;
const uint32_t RS_POPUP_CALL = 0x0004;
const uint32_t RS_POPUP_CONNECT = 0x0008;
class RsNotify
{
public:
RsNotify() { return; }
virtual ~RsNotify() { return; }
/* Output for retroshare-gui */
virtual bool NotifySysMessage(uint32_t &sysid, uint32_t &type,
std::string &title, std::string &msg) = 0;
virtual bool NotifyPopupMessage(uint32_t &ptype, std::string &name, std::string &msg) = 0;
/* Control over Messages */
virtual bool GetSysMessageList(std::map<uint32_t, std::string> &list) = 0;
virtual bool GetPopupMessageList(std::map<uint32_t, std::string> &list) = 0;
virtual bool SetSysMessageMode(uint32_t sysid, uint32_t mode) = 0;
virtual bool SetPopupMessageMode(uint32_t ptype, uint32_t mode) = 0;
/* Input from libretroshare */
virtual bool AddPopupMessage(uint32_t ptype, std::string name, std::string msg) = 0;
virtual bool AddSysMessage(uint32_t sysid, uint32_t type,
std::string title, std::string msg) = 0;
};
#endif