diff --git a/libresapi/src/api/ApiServerLocal.cpp b/libresapi/src/api/ApiServerLocal.cpp
index 5d89ed2d0..ec1812af7 100644
--- a/libresapi/src/api/ApiServerLocal.cpp
+++ b/libresapi/src/api/ApiServerLocal.cpp
@@ -16,6 +16,7 @@
* along with this program. If not, see .
*/
+#include
#include "ApiServerLocal.h"
#include "JsonStream.h"
diff --git a/libresapi/src/api/PeersHandler.cpp b/libresapi/src/api/PeersHandler.cpp
index 3b8c075db..4631ccf7c 100644
--- a/libresapi/src/api/PeersHandler.cpp
+++ b/libresapi/src/api/PeersHandler.cpp
@@ -25,6 +25,7 @@
#include
#include
#include
+#include
#include
@@ -219,6 +220,8 @@ PeersHandler::PeersHandler(StateTokenServer* sts, RsNotify* notify, RsPeers *pee
addResourceHandler("set_state_string", this, &PeersHandler::handleSetStateString);
addResourceHandler("get_custom_state_string", this, &PeersHandler::handleGetCustomStateString);
addResourceHandler("set_custom_state_string", this, &PeersHandler::handleSetCustomStateString);
+ addResourceHandler("get_network_options", this, &PeersHandler::handleGetNetworkOptions);
+ addResourceHandler("set_network_options", this, &PeersHandler::handleSetNetworkOptions);
addResourceHandler("get_pgp_options", this, &PeersHandler::handleGetPGPOptions);
addResourceHandler("set_pgp_options", this, &PeersHandler::handleSetPGPOptions);
addResourceHandler("get_node_options", this, &PeersHandler::handleGetNodeOptions);
@@ -653,6 +656,198 @@ void PeersHandler::handleExamineCert(Request &req, Response &resp)
}
}
+void PeersHandler::handleGetNetworkOptions(Request& req, Response& resp)
+{
+ RsPeerDetails detail;
+ if (!mRsPeers->getPeerDetails(mRsPeers->getOwnId(), detail))
+ return;
+
+ resp.mDataStream << makeKeyValue("local_address", detail.localAddr);
+ resp.mDataStream << makeKeyValue("local_port", (int)detail.localPort);
+ resp.mDataStream << makeKeyValue("external_address", detail.extAddr);
+ resp.mDataStream << makeKeyValue("external_port", (int)detail.extPort);
+ resp.mDataStream << makeKeyValue("dyn_dns", detail.dyndns);
+
+ int netIndex = 0;
+ switch(detail.netMode)
+ {
+ case RS_NETMODE_EXT:
+ netIndex = 2;
+ break;
+ case RS_NETMODE_UDP:
+ netIndex = 1;
+ break;
+ case RS_NETMODE_UPNP:
+ netIndex = 0;
+ break;
+ }
+
+ resp.mDataStream << makeKeyValue("nat_mode", netIndex);
+
+ int discoveryIndex = 3; // NONE.
+ if(detail.vs_dht != RS_VS_DHT_OFF)
+ {
+ if(detail.vs_disc != RS_VS_DISC_OFF)
+ discoveryIndex = 0; // PUBLIC
+ else
+ discoveryIndex = 2; // INVERTED
+ }
+ else
+ {
+ if(detail.vs_disc != RS_VS_DISC_OFF)
+ discoveryIndex = 1; // PRIVATE
+ else
+ discoveryIndex = 3; // NONE
+ }
+
+ resp.mDataStream << makeKeyValue("discovery_mode", discoveryIndex);
+
+ int dlrate = 0;
+ int ulrate = 0;
+ rsConfig->GetMaxDataRates(dlrate, ulrate);
+ resp.mDataStream << makeKeyValue("download_limit", dlrate);
+ resp.mDataStream << makeKeyValue("upload_limit", ulrate);
+
+ bool checkIP = mRsPeers->getAllowServerIPDetermination();
+ resp.mDataStream << makeKeyValue("check_ip", checkIP);
+
+ StreamBase& previousIPsStream = resp.mDataStream.getStreamToMember("previous_ips");
+ previousIPsStream.getStreamToMember();
+ for(std::list::const_iterator it = detail.ipAddressList.begin(); it != detail.ipAddressList.end(); ++it)
+ previousIPsStream.getStreamToMember() << makeKeyValue("ip_address", *it);
+
+ std::list ip_servers;
+ mRsPeers->getIPServersList(ip_servers);
+
+ StreamBase& websitesStream = resp.mDataStream.getStreamToMember("websites");
+ websitesStream.getStreamToMember();
+
+ for(std::list::const_iterator it = ip_servers.begin(); it != ip_servers.end(); ++it)
+ websitesStream.getStreamToMember() << makeKeyValue("website", *it);
+
+ std::string proxyaddr;
+ uint16_t proxyport;
+ uint32_t status ;
+ // Tor
+ mRsPeers->getProxyServer(RS_HIDDEN_TYPE_TOR, proxyaddr, proxyport, status);
+ resp.mDataStream << makeKeyValue("tor_address", proxyaddr);
+ resp.mDataStream << makeKeyValue("tor_port", (int)proxyport);
+
+ // I2P
+ mRsPeers->getProxyServer(RS_HIDDEN_TYPE_I2P, proxyaddr, proxyport, status);
+ resp.mDataStream << makeKeyValue("i2p_address", proxyaddr);
+ resp.mDataStream << makeKeyValue("i2p_port", (int)proxyport);
+
+ resp.setOk();
+}
+
+void PeersHandler::handleSetNetworkOptions(Request& req, Response& resp)
+{
+ RsPeerDetails detail;
+ if (!mRsPeers->getPeerDetails(mRsPeers->getOwnId(), detail))
+ return;
+
+ int netIndex = 0;
+ uint32_t natMode = 0;
+ req.mStream << makeKeyValueReference("nat_mode", netIndex);
+
+ switch(netIndex)
+ {
+ case 3:
+ natMode = RS_NETMODE_HIDDEN;
+ break;
+ case 2:
+ natMode = RS_NETMODE_EXT;
+ break;
+ case 1:
+ natMode = RS_NETMODE_UDP;
+ break;
+ default:
+ case 0:
+ natMode = RS_NETMODE_UPNP;
+ break;
+ }
+
+ if (detail.netMode != natMode)
+ mRsPeers->setNetworkMode(mRsPeers->getOwnId(), natMode);
+
+ int discoveryIndex;
+ uint16_t vs_disc = 0;
+ uint16_t vs_dht = 0;
+ req.mStream << makeKeyValueReference("discovery_mode", discoveryIndex);
+
+ switch(discoveryIndex)
+ {
+ case 0:
+ vs_disc = RS_VS_DISC_FULL;
+ vs_dht = RS_VS_DHT_FULL;
+ break;
+ case 1:
+ vs_disc = RS_VS_DISC_FULL;
+ vs_dht = RS_VS_DHT_OFF;
+ break;
+ case 2:
+ vs_disc = RS_VS_DISC_OFF;
+ vs_dht = RS_VS_DHT_FULL;
+ break;
+ case 3:
+ default:
+ vs_disc = RS_VS_DISC_OFF;
+ vs_dht = RS_VS_DHT_OFF;
+ break;
+ }
+
+ if ((vs_disc != detail.vs_disc) || (vs_dht != detail.vs_dht))
+ mRsPeers->setVisState(mRsPeers->getOwnId(), vs_disc, vs_dht);
+
+ if (0 != netIndex)
+ {
+ std::string localAddr;
+ int localPort;
+ std::string extAddr;
+ int extPort;
+
+ req.mStream << makeKeyValueReference("local_address", localAddr);
+ req.mStream << makeKeyValueReference("local_port", localPort);
+ req.mStream << makeKeyValueReference("external_address", extAddr);
+ req.mStream << makeKeyValueReference("external_port", extPort);
+
+ mRsPeers->setLocalAddress(mRsPeers->getOwnId(), localAddr, (uint16_t)localPort);
+ mRsPeers->setExtAddress(mRsPeers->getOwnId(), extAddr, (uint16_t)extPort);
+ }
+
+ std::string dynDNS;
+ req.mStream << makeKeyValueReference("dyn_dns", dynDNS);
+ mRsPeers->setDynDNS(mRsPeers->getOwnId(), dynDNS);
+
+ int dlrate = 0;
+ int ulrate = 0;
+ req.mStream << makeKeyValueReference("download_limit", dlrate);
+ req.mStream << makeKeyValueReference("upload_limit", ulrate);
+ rsConfig->SetMaxDataRates(dlrate, ulrate);
+
+ bool checkIP;
+ req.mStream << makeKeyValueReference("check_ip", checkIP);
+ rsPeers->allowServerIPDetermination(checkIP) ;
+
+ // Tor
+ std::string toraddr;
+ int torport;
+ req.mStream << makeKeyValueReference("tor_address", toraddr);
+ req.mStream << makeKeyValueReference("tor_port", torport);
+ mRsPeers->setProxyServer(RS_HIDDEN_TYPE_TOR, toraddr, (uint16_t)torport);
+
+ // I2P
+ std::string i2paddr;
+ int i2pport;
+ req.mStream << makeKeyValueReference("i2p_address", i2paddr);
+ req.mStream << makeKeyValueReference("i2p_port", i2pport);
+ mRsPeers->setProxyServer(RS_HIDDEN_TYPE_I2P, i2paddr, (uint16_t)i2pport);
+
+ resp.mStateToken = getCurrentStateToken();
+ resp.setOk();
+}
+
void PeersHandler::handleGetPGPOptions(Request& req, Response& resp)
{
std::string pgp_id;
diff --git a/libresapi/src/api/PeersHandler.h b/libresapi/src/api/PeersHandler.h
index 7eac06f42..852c26c90 100644
--- a/libresapi/src/api/PeersHandler.h
+++ b/libresapi/src/api/PeersHandler.h
@@ -64,6 +64,9 @@ private:
void handleGetCustomStateString(Request& req, Response& resp);
void handleSetCustomStateString(Request& req, Response& resp);
+ void handleGetNetworkOptions(Request& req, Response& resp);
+ void handleSetNetworkOptions(Request& req, Response& resp);
+
void handleGetPGPOptions(Request& req, Response& resp);
void handleSetPGPOptions(Request& req, Response& resp);
diff --git a/libretroshare/src/chat/p3chatservice.cc b/libretroshare/src/chat/p3chatservice.cc
index 851b2983d..64c4e9534 100644
--- a/libretroshare/src/chat/p3chatservice.cc
+++ b/libretroshare/src/chat/p3chatservice.cc
@@ -169,6 +169,12 @@ class p3ChatService::AvatarInfo
void toUnsignedChar(unsigned char *& data,uint32_t& size) const
{
+ if(_image_size == 0)
+ {
+ size = 0 ;
+ data = NULL ;
+ return ;
+ }
data = (unsigned char *)rs_malloc(_image_size) ;
size = _image_size ;
memcpy(data,_image_data,size*sizeof(unsigned char)) ;
diff --git a/libretroshare/src/gxs/rsgenexchange.cc b/libretroshare/src/gxs/rsgenexchange.cc
index 55eea22a6..e236961b1 100644
--- a/libretroshare/src/gxs/rsgenexchange.cc
+++ b/libretroshare/src/gxs/rsgenexchange.cc
@@ -190,52 +190,54 @@ void RsGenExchange::tick()
now = time(NULL);
if(mChecking || (mLastCheck + INTEGRITY_CHECK_PERIOD < now))
{
- if(mIntegrityCheck)
+ mLastCheck = time(NULL);
+
{
- if(mIntegrityCheck->isDone())
+ RS_STACK_MUTEX(mGenMtx) ;
+
+ if(!mIntegrityCheck)
{
- std::list grpIds;
- std::map > msgIds;
- mIntegrityCheck->getDeletedIds(grpIds, msgIds);
-
- if (!grpIds.empty())
- {
- RS_STACK_MUTEX(mGenMtx) ;
-
- RsGxsGroupChange* gc = new RsGxsGroupChange(RsGxsNotify::TYPE_PROCESSED, false);
- gc->mGrpIdList = grpIds;
-#ifdef GEN_EXCH_DEBUG
- std::cerr << " adding the following grp ids to notification: " << std::endl;
- for(std::list::const_iterator it(grpIds.begin());it!=grpIds.end();++it)
- std::cerr << " " << *it << std::endl;
-#endif
- mNotifications.push_back(gc);
-
- // also notify the network exchange service that these groups no longer exist.
-
- if(mNetService)
- mNetService->removeGroups(grpIds) ;
- }
-
- if (!msgIds.empty()) {
- RS_STACK_MUTEX(mGenMtx) ;
-
- RsGxsMsgChange* c = new RsGxsMsgChange(RsGxsNotify::TYPE_PROCESSED, false);
- c->msgChangeMap = msgIds;
- mNotifications.push_back(c);
- }
-
- delete mIntegrityCheck;
- mIntegrityCheck = NULL;
- mLastCheck = time(NULL);
- mChecking = false;
+ mIntegrityCheck = new RsGxsIntegrityCheck(mDataStore,this,mGixs);
+ mIntegrityCheck->start("gxs integrity");
+ mChecking = true;
}
}
- else
+
+ if(mIntegrityCheck->isDone())
{
- mIntegrityCheck = new RsGxsIntegrityCheck(mDataStore,this,mGixs);
- mIntegrityCheck->start("gxs integrity");
- mChecking = true;
+ RS_STACK_MUTEX(mGenMtx) ;
+
+ std::list grpIds;
+ std::map > msgIds;
+ mIntegrityCheck->getDeletedIds(grpIds, msgIds);
+
+ if (!grpIds.empty())
+ {
+ RsGxsGroupChange* gc = new RsGxsGroupChange(RsGxsNotify::TYPE_PROCESSED, false);
+ gc->mGrpIdList = grpIds;
+#ifdef GEN_EXCH_DEBUG
+ std::cerr << " adding the following grp ids to notification: " << std::endl;
+ for(std::list::const_iterator it(grpIds.begin());it!=grpIds.end();++it)
+ std::cerr << " " << *it << std::endl;
+#endif
+ mNotifications.push_back(gc);
+
+ // also notify the network exchange service that these groups no longer exist.
+
+ if(mNetService)
+ mNetService->removeGroups(grpIds) ;
+ }
+
+ if (!msgIds.empty())
+ {
+ RsGxsMsgChange* c = new RsGxsMsgChange(RsGxsNotify::TYPE_PROCESSED, false);
+ c->msgChangeMap = msgIds;
+ mNotifications.push_back(c);
+ }
+
+ delete mIntegrityCheck;
+ mIntegrityCheck = NULL;
+ mChecking = false;
}
}
}
@@ -1752,8 +1754,18 @@ void RsGenExchange::deleteGroup(uint32_t& token, const RsGxsGroupId& grpId)
}
void RsGenExchange::deleteMsgs(uint32_t& token, const GxsMsgReq& msgs)
{
+ RS_STACK_MUTEX(mGenMtx) ;
+
token = mDataAccess->generatePublicToken();
mMsgDeletePublish.push_back(MsgDeletePublish(msgs, token));
+
+ // This code below will suspend any requests of the deleted messages for 24 hrs. This of course only works
+ // if all friend nodes consistently delete the messages in the mean time.
+
+ if(mNetService != NULL)
+ for(GxsMsgReq::const_iterator it(msgs.begin());it!=msgs.end();++it)
+ for(uint32_t i=0;isecond.size();++i)
+ mNetService->rejectMessage(it->second[i]) ;
}
void RsGenExchange::publishMsg(uint32_t& token, RsGxsMsgItem *msgItem)
diff --git a/libretroshare/src/gxs/rsgxsnetservice.cc b/libretroshare/src/gxs/rsgxsnetservice.cc
index 789a77441..91a915f40 100644
--- a/libretroshare/src/gxs/rsgxsnetservice.cc
+++ b/libretroshare/src/gxs/rsgxsnetservice.cc
@@ -268,7 +268,7 @@ static const uint32_t RS_NXS_ITEM_ENCRYPTION_STATUS_GXS_KEY_MISSING = 0x05 ;
static const RsPeerId peer_to_print = RsPeerId(std::string("")) ;
static const RsGxsGroupId group_id_to_print = RsGxsGroupId(std::string("")) ; // use this to allow to this group id only, or "" for all IDs
-static const uint32_t service_to_print = 0x215 ; // use this to allow to this service id only, or 0 for all services
+static const uint32_t service_to_print = RS_SERVICE_TYPE_GXS_TRANS ; // use this to allow to this service id only, or 0 for all services
// warning. Numbers should be SERVICE IDS (see serialiser/rsserviceids.h. E.g. 0x0215 for forums)
class nullstream: public std::ostream {};
@@ -447,6 +447,9 @@ void RsGxsNetService::rejectMessage(const RsGxsMessageId& msg_id)
{
RS_STACK_MUTEX(mNxsMutex) ;
+#ifdef NXS_NET_DEBUG_0
+ GXSNETDEBUG___ << "adding message " << msg_id << " to rejection list for 24hrs." << std::endl;
+#endif
mRejectedMessages[msg_id] = time(NULL) ;
}
void RsGxsNetService::cleanRejectedMessages()
@@ -595,9 +598,9 @@ void RsGxsNetService::syncWithPeers()
#ifdef NXS_NET_DEBUG_0
GXSNETDEBUG_PG(peerId,grpId) << " peer can send messages for group " << grpId ;
if(!encrypt_to_this_circle_id.isNull())
- std::cerr << " request should be encrypted for circle ID " << encrypt_to_this_circle_id << std::endl;
+ GXSNETDEBUG_PG(peerId,grpId) << " request should be encrypted for circle ID " << encrypt_to_this_circle_id << std::endl;
else
- std::cerr << " request should be sent in clear." << std::endl;
+ GXSNETDEBUG_PG(peerId,grpId) << " request should be sent in clear." << std::endl;
#endif
// On default, the info has never been received so the TS is 0, meaning the peer has sent that it had no information.
@@ -1839,7 +1842,7 @@ void RsGxsNetService::debugDump()
GXSNETDEBUG_PG(it->first,it2->first) << " group " << it2->first << " - last updated at peer (secs ago): " << nice_time_stamp(time(NULL),it2->second.time_stamp) << ". Message count=" << it2->second.message_count << std::endl;
}
- GXSNETDEBUG___<< " List of rejected message ids: " << mRejectedMessages.size() << std::endl;
+ GXSNETDEBUG___<< " List of rejected message ids: " << std::dec << mRejectedMessages.size() << std::endl;
#endif
}
diff --git a/libretroshare/src/gxs/rsgxsutil.cc b/libretroshare/src/gxs/rsgxsutil.cc
index 21d7d3d3e..8a853e789 100644
--- a/libretroshare/src/gxs/rsgxsutil.cc
+++ b/libretroshare/src/gxs/rsgxsutil.cc
@@ -136,6 +136,9 @@ RsGxsIntegrityCheck::RsGxsIntegrityCheck(RsGeneralDataService* const dataService
void RsGxsIntegrityCheck::run()
{
check();
+
+ RsStackMutex stack(mIntegrityMutex);
+ mDone = true;
}
bool RsGxsIntegrityCheck::check()
@@ -286,71 +289,72 @@ bool RsGxsIntegrityCheck::check()
mDs->removeMsgs(msgsToDel);
- RsStackMutex stack(mIntegrityMutex);
- mDone = true;
+ {
+ RsStackMutex stack(mIntegrityMutex);
- std::vector::iterator grpIt;
- for(grpIt = grpsToDel.begin(); grpIt != grpsToDel.end(); ++grpIt)
- {
- mDeletedGrps.push_back(*grpIt);
- }
- mDeletedMsgs = msgsToDel;
+ std::vector::iterator grpIt;
+ for(grpIt = grpsToDel.begin(); grpIt != grpsToDel.end(); ++grpIt)
+ {
+ mDeletedGrps.push_back(*grpIt);
+ }
+ mDeletedMsgs = msgsToDel;
#ifdef DEBUG_GXSUTIL
- GXSUTIL_DEBUG() << "At end of pass, this is the list used GXS ids: " << std::endl;
- GXSUTIL_DEBUG() << " requesting them to GXS identity service to enforce loading." << std::endl;
+ GXSUTIL_DEBUG() << "At end of pass, this is the list used GXS ids: " << std::endl;
+ GXSUTIL_DEBUG() << " requesting them to GXS identity service to enforce loading." << std::endl;
#endif
- std::list connected_friends ;
- rsPeers->getOnlineList(connected_friends) ;
+ std::list connected_friends ;
+ rsPeers->getOnlineList(connected_friends) ;
- std::vector > gxs_ids ;
+ std::vector > gxs_ids ;
- for(std::map::const_iterator it(used_gxs_ids.begin());it!=used_gxs_ids.end();++it)
- {
- gxs_ids.push_back(*it) ;
+ for(std::map::const_iterator it(used_gxs_ids.begin());it!=used_gxs_ids.end();++it)
+ {
+ gxs_ids.push_back(*it) ;
#ifdef DEBUG_GXSUTIL
- GXSUTIL_DEBUG() << " " << *it << std::endl;
+ GXSUTIL_DEBUG() << " " << *it << std::endl;
#endif
- }
- uint32_t nb_requested_not_in_cache = 0;
+ }
+ uint32_t nb_requested_not_in_cache = 0;
#ifdef DEBUG_GXSUTIL
- GXSUTIL_DEBUG() << " issuing random get on friends for non existing IDs" << std::endl;
+ GXSUTIL_DEBUG() << " issuing random get on friends for non existing IDs" << std::endl;
#endif
- // now request a cache update for them, which triggers downloading from friends, if missing.
+ // now request a cache update for them, which triggers downloading from friends, if missing.
- for(;nb_requested_not_in_cachehaveKey(gxs_ids[n].first)) // checks if we have it already in the cache (conservative way to ensure that we atually have it)
- {
- mGixs->requestKey(gxs_ids[n].first,connected_friends,gxs_ids[n].second);
+ if(!mGixs->haveKey(gxs_ids[n].first)) // checks if we have it already in the cache (conservative way to ensure that we atually have it)
+ {
+ mGixs->requestKey(gxs_ids[n].first,connected_friends,gxs_ids[n].second);
- ++nb_requested_not_in_cache ;
+ ++nb_requested_not_in_cache ;
#ifdef DEBUG_GXSUTIL
- GXSUTIL_DEBUG() << " ... from cache/net" << std::endl;
+ GXSUTIL_DEBUG() << " ... from cache/net" << std::endl;
#endif
- }
- else
- {
+ }
+ else
+ {
#ifdef DEBUG_GXSUTIL
- GXSUTIL_DEBUG() << " ... already in cache" << std::endl;
+ GXSUTIL_DEBUG() << " ... already in cache" << std::endl;
#endif
- }
- mGixs->timeStampKey(gxs_ids[n].first,gxs_ids[n].second);
+ }
+ mGixs->timeStampKey(gxs_ids[n].first,gxs_ids[n].second);
- gxs_ids[n] = gxs_ids[gxs_ids.size()-1] ;
- gxs_ids.pop_back() ;
- }
+ gxs_ids[n] = gxs_ids[gxs_ids.size()-1] ;
+ gxs_ids.pop_back() ;
+ }
#ifdef DEBUG_GXSUTIL
- GXSUTIL_DEBUG() << " total actual cache requests: "<< nb_requested_not_in_cache << std::endl;
+ GXSUTIL_DEBUG() << " total actual cache requests: "<< nb_requested_not_in_cache << std::endl;
#endif
+ }
return true;
}
diff --git a/libretroshare/src/gxstrans/p3gxstrans.cc b/libretroshare/src/gxstrans/p3gxstrans.cc
index cdd011450..5804c91cc 100644
--- a/libretroshare/src/gxstrans/p3gxstrans.cc
+++ b/libretroshare/src/gxstrans/p3gxstrans.cc
@@ -390,8 +390,14 @@ void p3GxsTrans::GxsTransIntegrityCleanupThread::run()
RS_STACK_MUTEX(mMtx) ;
mMsgToDel = msgsToDel ;
+ mDone = true;
}
+bool p3GxsTrans::GxsTransIntegrityCleanupThread::isDone()
+{
+ RS_STACK_MUTEX(mMtx) ;
+ return mDone ;
+}
void p3GxsTrans::service_tick()
{
GxsTokenQueue::checkRequests();
@@ -417,7 +423,7 @@ void p3GxsTrans::service_tick()
// now grab collected messages to delete
- if(mCleanupThread != NULL && !mCleanupThread->isRunning())
+ if(mCleanupThread != NULL && mCleanupThread->isDone())
{
GxsMsgReq msgToDel ;
@@ -426,7 +432,8 @@ void p3GxsTrans::service_tick()
if(!msgToDel.empty())
{
std::cerr << "p3GxsTrans::service_tick(): deleting messages." << std::endl;
- getDataStore()->removeMsgs(msgToDel);
+ uint32_t token ;
+ deleteMsgs(token,msgToDel);
}
RS_STACK_MUTEX(mPerUserStatsMutex);
@@ -575,6 +582,7 @@ void p3GxsTrans::notifyChanges(std::vector& changes)
}
}
}
+ RsGxsIfaceHelper::receiveChanges(changes);
}
uint32_t p3GxsTrans::AuthenPolicy()
diff --git a/libretroshare/src/gxstrans/p3gxstrans.h b/libretroshare/src/gxstrans/p3gxstrans.h
index 28060ad0f..3dd0a7567 100644
--- a/libretroshare/src/gxstrans/p3gxstrans.h
+++ b/libretroshare/src/gxstrans/p3gxstrans.h
@@ -291,7 +291,7 @@ private:
enum CheckState { CheckStart, CheckChecking };
public:
- GxsTransIntegrityCleanupThread(RsGeneralDataService *const dataService): mDs(dataService),mMtx("GxsTransIntegrityCheck") {}
+ GxsTransIntegrityCleanupThread(RsGeneralDataService *const dataService): mDs(dataService),mMtx("GxsTransIntegrityCheck") { mDone=false;}
bool isDone();
void run();
@@ -307,6 +307,7 @@ private:
GxsMsgReq mMsgToDel ;
std::map total_message_size_and_count;
+ bool mDone ;
};
// Overloaded from RsGenExchange.
diff --git a/libretroshare/src/gxstunnel/p3gxstunnel.cc b/libretroshare/src/gxstunnel/p3gxstunnel.cc
index 90e601ed3..46d9179b1 100644
--- a/libretroshare/src/gxstunnel/p3gxstunnel.cc
+++ b/libretroshare/src/gxstunnel/p3gxstunnel.cc
@@ -211,7 +211,7 @@ void p3GxsTunnelService::flush()
if(it->second.last_contact+20+GXS_TUNNEL_KEEP_ALIVE_TIMEOUT < now && it->second.status == RS_GXS_TUNNEL_STATUS_CAN_TALK)
{
#ifdef DEBUG_GXS_TUNNEL
- std::cerr << "(II) GxsTunnelService:: connexion interrupted with peer." << std::endl;
+ std::cerr << "(II) GxsTunnelService:: connection interrupted with peer." << std::endl;
#endif
it->second.status = RS_GXS_TUNNEL_STATUS_TUNNEL_DN ;
diff --git a/libretroshare/src/pqi/p3peermgr.cc b/libretroshare/src/pqi/p3peermgr.cc
index cad91f30b..ece94650e 100644
--- a/libretroshare/src/pqi/p3peermgr.cc
+++ b/libretroshare/src/pqi/p3peermgr.cc
@@ -1528,7 +1528,7 @@ bool p3PeerMgrIMPL::addCandidateForOwnExternalAddress(const RsPeerId &from, cons
if((!rsBanList->isAddressAccepted(addr_filtered,RSBANLIST_CHECKING_FLAGS_WHITELIST)) && (!sockaddr_storage_sameip(own_addr,addr_filtered)))
{
- std::cerr << " Peer " << from << " reports a connexion address (" << sockaddr_storage_iptostring(addr_filtered) <<") that is not your current external address (" << sockaddr_storage_iptostring(own_addr) << "). This is weird." << std::endl;
+ std::cerr << " Peer " << from << " reports a connection address (" << sockaddr_storage_iptostring(addr_filtered) <<") that is not your current external address (" << sockaddr_storage_iptostring(own_addr) << "). This is weird." << std::endl;
RsServer::notify()->AddFeedItem(RS_FEED_ITEM_SEC_IP_WRONG_EXTERNAL_IP_REPORTED, from.toStdString(), sockaddr_storage_iptostring(own_addr), sockaddr_storage_iptostring(addr));
}
diff --git a/libretroshare/src/tests/network_simulator/README.txt b/libretroshare/src/tests/network_simulator/README.txt
index cf5838545..2a669d3c3 100644
--- a/libretroshare/src/tests/network_simulator/README.txt
+++ b/libretroshare/src/tests/network_simulator/README.txt
@@ -51,7 +51,7 @@ together. The routers will talk to a fake link manager, which reports the peers
Required components:
===================
- NetworkGraph: a set of friends, with connexions. Should be able to be saved to a file for debugging.
+ NetworkGraph: a set of friends, with connections. Should be able to be saved to a file for debugging.
GraphNode: a RS peer, represented by a random SSL id, a link manager, and possibly components such as file transfer, etc.
diff --git a/libretroshare/src/util/rsthreads.cc b/libretroshare/src/util/rsthreads.cc
index 1db86f17e..8899ee01c 100644
--- a/libretroshare/src/util/rsthreads.cc
+++ b/libretroshare/src/util/rsthreads.cc
@@ -179,6 +179,7 @@ void RsThread::start(const std::string &threadName)
THREAD_DEBUG << "pqithreadstreamer::start() initing should_stop=0" << std::endl;
#endif
mShouldStopSemaphore.set(0) ;
+ mHasStoppedSemaphore.set(0) ;
int err ;
diff --git a/retroshare-android-service/src/service.cpp b/retroshare-android-service/src/service.cpp
index d67ca1bef..6729768cc 100644
--- a/retroshare-android-service/src/service.cpp
+++ b/retroshare-android-service/src/service.cpp
@@ -45,16 +45,11 @@ int main(int argc, char *argv[])
dynamic_cast(&ctrl_mod),
&resource_api::RsControlModule::handleRequest);
-#if defined(Q_OS_WIN) && defined(QT_DEBUG)
- QString sockPath = "RS/";
-#elif defined(Q_OS_WIN)
- QString sockPath = QCoreApplication::applicationDirPath();
-#else
- QString sockPath = QDir::homePath() + "/.retroshare";
-#endif
+ QString sockPath = QDir::homePath() + "/.retroshare";
sockPath.append("/libresapi.sock");
qDebug() << "Listening on:" << sockPath;
+
ApiServerLocal apiServerLocal(&api, sockPath); (void) apiServerLocal;
while (!ctrl_mod.processShouldExit())
diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp
index 2c0e1af84..46a3943e5 100644
--- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp
+++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp
@@ -185,8 +185,9 @@ bool GxsChannelPostItem::setGroup(const RsGxsChannelGroup &group, bool doFill)
mGroup = group;
// if not publisher, hide the edit button. Without the publish key, there's no way to edit a message.
-
+#ifdef DEBUG_ITEM
std::cerr << "Group subscribe flags = " << std::hex << mGroup.mMeta.mSubscribeFlags << std::dec << std::endl;
+#endif
if(!IS_GROUP_PUBLISHER(mGroup.mMeta.mSubscribeFlags))
ui->editButton->hide();
diff --git a/retroshare-gui/src/gui/statistics/GxsTransportStatistics.cpp b/retroshare-gui/src/gui/statistics/GxsTransportStatistics.cpp
index 39c6b1c84..7233b6981 100644
--- a/retroshare-gui/src/gui/statistics/GxsTransportStatistics.cpp
+++ b/retroshare-gui/src/gui/statistics/GxsTransportStatistics.cpp
@@ -73,7 +73,7 @@ static const int GXSTRANS_STATISTICS_DELAY_BETWEEN_GROUP_REQ = 30 ; // never req
#define DEBUG_GXSTRANS_STATS 1
GxsTransportStatistics::GxsTransportStatistics(QWidget *parent)
- : RsAutoUpdatePage(2000,parent)
+ : RsGxsUpdateBroadcastPage(rsGxsTrans,parent)
{
setupUi(this) ;
@@ -93,6 +93,7 @@ GxsTransportStatistics::GxsTransportStatistics(QWidget *parent)
// load settings
processSettings(true);
+ updateDisplay(true);
}
GxsTransportStatistics::~GxsTransportStatistics()
@@ -139,19 +140,14 @@ void GxsTransportStatistics::CustomPopupMenu( QPoint )
contextMnu.exec(QCursor::pos());
}
-void GxsTransportStatistics::updateDisplay()
+void GxsTransportStatistics::updateDisplay(bool)
{
- time_t now = time(NULL) ;
+ time_t now = time(NULL) ;
- if(mLastGroupReqTS + GXSTRANS_STATISTICS_DELAY_BETWEEN_GROUP_REQ < now)
- {
- requestGroupMeta();
- mLastGroupReqTS = now ;
- }
+ std::cerr << "GxsTransportStatistics::updateDisplay()" << std::endl;
- //_tst_CW->updateContent() ;
-
- updateContent();
+ requestGroupMeta();
+ mLastGroupReqTS = now ;
}
QString GxsTransportStatistics::getPeerName(const RsPeerId &peer_id)
@@ -319,6 +315,8 @@ void GxsTransportStatistics::loadRequest(const TokenQueue *queue, const TokenReq
std::cerr << std::endl;
break;
}
+
+ updateContent();
}
void GxsTransportStatistics::requestGroupMeta()
diff --git a/retroshare-gui/src/gui/statistics/GxsTransportStatistics.h b/retroshare-gui/src/gui/statistics/GxsTransportStatistics.h
index 576aadd26..c57d63c11 100644
--- a/retroshare-gui/src/gui/statistics/GxsTransportStatistics.h
+++ b/retroshare-gui/src/gui/statistics/GxsTransportStatistics.h
@@ -30,6 +30,7 @@
#include "util/TokenQueue.h"
#include "RsAutoUpdatePage.h"
#include "ui_GxsTransportStatistics.h"
+#include "gui/gxs/RsGxsUpdateBroadcastPage.h"
class GxsTransportStatisticsWidget ;
class UIStateHelper;
@@ -45,7 +46,7 @@ public:
std::vector messages_metas ;
};
-class GxsTransportStatistics: public RsAutoUpdatePage, public TokenResponse, public Ui::GxsTransportStatistics
+class GxsTransportStatistics: public RsGxsUpdateBroadcastPage, public TokenResponse, public Ui::GxsTransportStatistics
{
Q_OBJECT
@@ -66,6 +67,7 @@ private slots:
void personDetails();
private:
+ void updateDisplay(bool complete) ;
void loadGroupMeta(const uint32_t& token);
void loadGroupStat(const uint32_t& token);
void loadMsgMeta(const uint32_t& token);
@@ -77,8 +79,6 @@ private:
void processSettings(bool bLoad);
bool m_bProcessSettings;
- virtual void updateDisplay() ;
-
GxsTransportStatisticsWidget *_tst_CW ;
TokenQueue *mTransQueue ;
UIStateHelper *mStateHelper;
diff --git a/retroshare-gui/src/gui/statistics/GxsTransportStatistics.ui b/retroshare-gui/src/gui/statistics/GxsTransportStatistics.ui
index 2fe43f576..78653b5ae 100644
--- a/retroshare-gui/src/gui/statistics/GxsTransportStatistics.ui
+++ b/retroshare-gui/src/gui/statistics/GxsTransportStatistics.ui
@@ -13,51 +13,8 @@
Router Statistics
-
- -
-
-
- Gxs Transport Groups:
-
-
-
-
-
-
- Qt::Vertical
-
-
-
-
- Group ID / Author
-
-
-
-
- Number of messages / Publish TS
-
-
-
-
- Total size of messages
-
-
-
-
- Subscribed
-
-
-
-
- Popularity
-
-
-
-
-
-
-
-
- -
+
+
-
GroupBox
@@ -65,6 +22,12 @@
-
+
+
+ 0
+ 0
+
+
Qt::CustomContextMenu
@@ -114,6 +77,49 @@
+ -
+
+
+ Gxs Transport Groups:
+
+
+
-
+
+
+ Qt::Vertical
+
+
+
+
+ Group ID / Author
+
+
+
+
+ Number of messages / Publish TS
+
+
+
+
+ Total size of messages
+
+
+
+
+ Subscribed
+
+
+
+
+ Popularity
+
+
+
+
+
+
+
+
diff --git a/retroshare-gui/src/gui/statistics/TurtleRouterDialog.cpp b/retroshare-gui/src/gui/statistics/TurtleRouterDialog.cpp
index a76b5b5c3..8f35f6d57 100644
--- a/retroshare-gui/src/gui/statistics/TurtleRouterDialog.cpp
+++ b/retroshare-gui/src/gui/statistics/TurtleRouterDialog.cpp
@@ -142,7 +142,7 @@ void TurtleRouterDialog::updateTunnelRequests( const std::vector [" + QString::fromUtf8(tunnels_info[i][1].c_str()) + "]\t\t " + tr("last transfer") + ": " + QString::fromStdString(tunnels_info[i][4]) + " " + "\t " + tr("Speed") + ": " + QString::fromStdString(tmp) ;
+ QString str = tr("Tunnel id") + ": " + QString::fromUtf8(tunnels_info[i][0].c_str()) + "\t" + tr("Speed") + ": " + QString::fromStdString(tmp) + "\t " + tr("last transfer") + ": " + QString::fromStdString(tunnels_info[i][4])+ "\t" + QString::fromUtf8(tunnels_info[i][2].c_str()) + " -> " + QString::fromUtf8(tunnels_info[i][1].c_str());
stl.clear() ;
stl.push_back(str) ;
QTreeWidgetItem *item = new QTreeWidgetItem(stl);