From d48205286a4350e2b84224342d26ef9062f1cdf1 Mon Sep 17 00:00:00 2001 From: drbob Date: Tue, 13 May 2008 15:41:40 +0000 Subject: [PATCH] * Improvements to Link Cloud Service. You can now vote anonymously on a Link, this will spread it to your friends anonymously. * Completed Mutex Locking on Connection Manager. git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@551 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- libretroshare/src/pqi/p3connmgr.cc | 203 ++++++++++-------------- libretroshare/src/rsiface/rsrank.h | 2 +- libretroshare/src/rsserver/p3rank.cc | 4 +- libretroshare/src/rsserver/p3rank.h | 2 +- libretroshare/src/services/p3ranking.cc | 35 +++- libretroshare/src/services/p3ranking.h | 2 +- 6 files changed, 124 insertions(+), 124 deletions(-) diff --git a/libretroshare/src/pqi/p3connmgr.cc b/libretroshare/src/pqi/p3connmgr.cc index 2611cf0d3..f0609dab0 100644 --- a/libretroshare/src/pqi/p3connmgr.cc +++ b/libretroshare/src/pqi/p3connmgr.cc @@ -245,7 +245,7 @@ void p3ConnectMgr::netStartup() /* decide which net setup mode we're going into */ - connMtx.lock(); /* LOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ mNetInitTS = time(NULL); @@ -283,12 +283,6 @@ void p3ConnectMgr::netStartup() mNetStatus = RS_NET_UPNP_INIT; break; } - - - connMtx.unlock(); /* UNLOCK MUTEX */ - - /* add Bootstrap Peers ALWAYs (get stuck on the end) */ - addBootstrapStunPeers(); } @@ -663,7 +657,8 @@ void p3ConnectMgr::netUnreachableCheck() #endif std::map::iterator it; - connMtx.lock(); /* LOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + for(it = mFriendList.begin(); it != mFriendList.end(); it++) { /* get last contact detail */ @@ -725,7 +720,6 @@ void p3ConnectMgr::netUnreachableCheck() } } - connMtx.unlock(); /* UNLOCK MUTEX */ } @@ -756,9 +750,10 @@ bool p3ConnectMgr::udpExtAddressCheck() if (0 < tou_extaddr((struct sockaddr *) &addr, &len, &stable)) { - /* update UDP information */ - connMtx.lock(); /* LOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + + /* update UDP information */ mStunExtAddr = addr; mStunAddrValid = true; mStunAddrStable = (stable != 0); @@ -771,9 +766,6 @@ bool p3ConnectMgr::udpExtAddressCheck() std::cerr << std::endl; #endif - - connMtx.unlock(); /* UNLOCK MUTEX */ - return true; } return false; @@ -805,7 +797,7 @@ void p3ConnectMgr::netStunInit() void p3ConnectMgr::stunInit() { - connMtx.lock(); /* LOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ /* push stun list to DHT */ std::list::iterator it; @@ -816,8 +808,6 @@ void p3ConnectMgr::stunInit() mStunStatus = RS_STUN_DHT; mStunFound = 0; mStunMoreRequired = true; - - connMtx.unlock(); /* UNLOCK MUTEX */ } bool p3ConnectMgr::stunCheck() @@ -851,12 +841,10 @@ bool p3ConnectMgr::stunCheck() /* set external UDP address */ mDhtMgr->doneStun(); - connMtx.lock(); /* LOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ mStunStatus = RS_STUN_DONE; - connMtx.unlock(); /* UNLOCK MUTEX */ - return true; } return false; @@ -911,8 +899,7 @@ OTHER void p3ConnectMgr::stunCollect(std::string id, struct sockaddr_in addr, uint32_t flags) { - /* if peer is online - move to the top */ - connMtx.lock(); /* LOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ #ifdef CONN_DEBUG std::cerr << "p3ConnectMgr::stunCollect() id: " << RsUtil::BinToHex(id) << std::endl; @@ -966,7 +953,6 @@ void p3ConnectMgr::stunCollect(std::string id, struct sockaddr_in addr, uint32_t } } - connMtx.unlock(); /* UNLOCK MUTEX */ } /******************************** Network Status ********************************* @@ -976,10 +962,8 @@ void p3ConnectMgr::stunCollect(std::string id, struct sockaddr_in addr, uint32_t void p3ConnectMgr::addMonitor(pqiMonitor *mon) { - /* - */ - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + std::list::iterator it; it = std::find(clients.begin(), clients.end(), mon); if (it != clients.end()) @@ -994,10 +978,8 @@ void p3ConnectMgr::addMonitor(pqiMonitor *mon) void p3ConnectMgr::removeMonitor(pqiMonitor *mon) { - /* - */ - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + std::list::iterator it; it = std::find(clients.begin(), clients.end(), mon); if (it == clients.end()) @@ -1013,16 +995,18 @@ void p3ConnectMgr::removeMonitor(pqiMonitor *mon) void p3ConnectMgr::tickMonitors() { + bool doStatusChange = false; std::list actionList; std::map::iterator it; + { + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + if (mStatusChanged) { #ifdef CONN_DEBUG std::cerr << "p3ConnectMgr::tickMonitors() StatusChanged! List:" << std::endl; #endif - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ /* assemble list */ for(it = mFriendList.begin(); it != mFriendList.end(); it++) { @@ -1121,7 +1105,18 @@ void p3ConnectMgr::tickMonitors() } } mStatusChanged = false; + doStatusChange = true; + } + } /****** UNLOCK STACK MUTEX ******/ + + /* NOTE - clients is accessed without mutex protection!!!! + * At the moment this is okay - as they are only added at the start. + * IF this changes ---- must fix with second Mutex. + */ + + if (doStatusChange) + { #ifdef CONN_DEBUG std::cerr << "Sending to " << clients.size() << " monitorClients"; std::cerr << std::endl; @@ -1153,25 +1148,23 @@ const std::string p3ConnectMgr::getOwnId() bool p3ConnectMgr::getOwnNetStatus(peerConnectState &state) { - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ state = ownState; return true; } bool p3ConnectMgr::isFriend(std::string id) { - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ return (mFriendList.end() != mFriendList.find(id)); } bool p3ConnectMgr::getFriendNetStatus(std::string id, peerConnectState &state) { + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + /* check for existing */ std::map::iterator it; - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ it = mFriendList.find(id); if (it == mFriendList.end()) { @@ -1185,10 +1178,10 @@ bool p3ConnectMgr::getFriendNetStatus(std::string id, peerConnectState &state) bool p3ConnectMgr::getOthersNetStatus(std::string id, peerConnectState &state) { + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + /* check for existing */ std::map::iterator it; - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ it = mOthersList.find(id); if (it == mOthersList.end()) { @@ -1202,10 +1195,10 @@ bool p3ConnectMgr::getOthersNetStatus(std::string id, peerConnectState &state) void p3ConnectMgr::getOnlineList(std::list &peers) { + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + /* check for existing */ std::map::iterator it; - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ for(it = mFriendList.begin(); it != mFriendList.end(); it++) { if (it->second.state & RS_PEER_S_CONNECTED) @@ -1218,10 +1211,10 @@ void p3ConnectMgr::getOnlineList(std::list &peers) void p3ConnectMgr::getFriendList(std::list &peers) { + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + /* check for existing */ std::map::iterator it; - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ for(it = mFriendList.begin(); it != mFriendList.end(); it++) { peers.push_back(it->first); @@ -1232,10 +1225,10 @@ void p3ConnectMgr::getFriendList(std::list &peers) void p3ConnectMgr::getOthersList(std::list &peers) { + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + /* check for existing */ std::map::iterator it; - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ for(it = mOthersList.begin(); it != mOthersList.end(); it++) { peers.push_back(it->first); @@ -1249,10 +1242,10 @@ bool p3ConnectMgr::connectAttempt(std::string id, struct sockaddr_in &addr, uint32_t &delay, uint32_t &period, uint32_t &type) { + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + /* check for existing */ std::map::iterator it; - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ it = mFriendList.find(id); if (it == mFriendList.end()) { @@ -1306,10 +1299,10 @@ bool p3ConnectMgr::connectAttempt(std::string id, struct sockaddr_in &addr, bool p3ConnectMgr::connectResult(std::string id, bool success, uint32_t flags) { + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + /* check for existing */ std::map::iterator it; - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ it = mFriendList.find(id); if (it == mFriendList.end()) { @@ -1396,6 +1389,22 @@ void p3ConnectMgr::peerStatus(std::string id, struct sockaddr_in laddr, struct sockaddr_in raddr, uint32_t type, uint32_t flags, uint32_t source) { + std::map::iterator it; + bool isFriend = true; + + time_t now = time(NULL); + + peerAddrInfo details; + details.type = type; + details.found = true; + details.laddr = laddr; + details.raddr = raddr; + details.ts = now; + + + { + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + std::cerr << "p3ConnectMgr::peerStatus()"; std::cerr << " id: " << id; std::cerr << " laddr: " << inet_ntoa(laddr.sin_addr); @@ -1408,10 +1417,6 @@ void p3ConnectMgr::peerStatus(std::string id, std::cerr << std::endl; /* look up the id */ - std::map::iterator it; - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ - bool isFriend = true; it = mFriendList.find(id); if (it == mFriendList.end()) { @@ -1434,14 +1439,6 @@ void p3ConnectMgr::peerStatus(std::string id, std::cerr << std::endl; /* update the status */ - time_t now = time(NULL); - - peerAddrInfo details; - details.type = type; - details.found = true; - details.laddr = laddr; - details.raddr = raddr; - details.ts = now; /* if source is DHT */ if (source == RS_CB_DHT) @@ -1693,14 +1690,18 @@ void p3ConnectMgr::peerStatus(std::string id, #endif // P3CONNMGR_NO_TCP_CONNECTIONS + } /****** STACK UNLOCK MUTEX *******/ + /* notify if they say we can, or we cannot connect ! */ if (details.type & RS_NET_CONN_UDP_DHT_SYNC) { retryConnectNotify(id); } - +#else + } // P3CONNMGR_NO_AUTO_CONNECTION /****** STACK UNLOCK MUTEX *******/ #endif // P3CONNMGR_NO_AUTO_CONNECTION + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ if (it->second.inConnAttempt) { @@ -1760,6 +1761,8 @@ void p3ConnectMgr::peerConnectRequest(std::string id, struct sockaddr_in radd /******************** UDP PART *****************************/ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + if (ownState.netMode & RS_NET_MODE_UNREACHABLE) { std::cerr << "p3ConnectMgr::peerConnectRequest() Unreachable - no UDP connection"; @@ -1769,8 +1772,6 @@ void p3ConnectMgr::peerConnectRequest(std::string id, struct sockaddr_in radd /* look up the id */ std::map::iterator it; - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ bool isFriend = true; it = mFriendList.find(id); if (it == mFriendList.end()) @@ -1864,9 +1865,6 @@ void p3ConnectMgr::peerConnectRequest(std::string id, struct sockaddr_in radd - -//void p3ConnectMgr::stunStatus(std::string id, struct sockaddr_in addr) - /*******************************************************************/ /*******************************************************************/ @@ -1883,7 +1881,7 @@ bool p3ConnectMgr::addFriend(std::string id, uint32_t netMode, uint32_t visState std::cerr << std::endl; #endif - connMtx.lock(); /* LOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ std::map::iterator it; @@ -1894,8 +1892,6 @@ bool p3ConnectMgr::addFriend(std::string id, uint32_t netMode, uint32_t visState std::cerr << std::endl; #endif /* (1) already exists */ - - connMtx.unlock(); /* UNLOCK MUTEX */ return true; } @@ -1907,8 +1903,6 @@ bool p3ConnectMgr::addFriend(std::string id, uint32_t netMode, uint32_t visState std::cerr << std::endl; #endif /* no auth */ - - connMtx.unlock(); /* UNLOCK MUTEX */ return false; } @@ -1948,8 +1942,6 @@ bool p3ConnectMgr::addFriend(std::string id, uint32_t netMode, uint32_t visState mDhtMgr->findPeer(id); } - connMtx.unlock(); /* UNLOCK MUTEX */ - IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/ return true; @@ -1964,8 +1956,6 @@ bool p3ConnectMgr::addFriend(std::string id, uint32_t netMode, uint32_t visState std::cerr << std::endl; #endif /* ERROR: no details */ - - connMtx.unlock(); /* UNLOCK MUTEX */ return false; } @@ -1996,8 +1986,6 @@ bool p3ConnectMgr::addFriend(std::string id, uint32_t netMode, uint32_t visState /* expect it to be a standard DHT */ mDhtMgr->findPeer(id); - connMtx.unlock(); /* UNLOCK MUTEX */ - IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/ return true; @@ -2014,7 +2002,7 @@ bool p3ConnectMgr::removeFriend(std::string id) mDhtMgr->dropPeer(id); - connMtx.lock(); /* LOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ /* move to othersList */ bool success = false; @@ -2037,8 +2025,6 @@ bool p3ConnectMgr::removeFriend(std::string id) success = true; } - connMtx.unlock(); /* UNLOCK MUTEX */ - IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/ return success; @@ -2060,20 +2046,18 @@ bool p3ConnectMgr::addNeighbour(std::string id) * (3) is non-existant -> create new one. */ - connMtx.lock(); /* LOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ std::map::iterator it; if (mFriendList.end() == mFriendList.find(id)) { /* (1) already exists */ - connMtx.unlock(); /* UNLOCK MUTEX */ return false; } if (mOthersList.end() == mOthersList.find(id)) { /* (2) already exists */ - connMtx.unlock(); /* UNLOCK MUTEX */ return true; } @@ -2081,7 +2065,6 @@ bool p3ConnectMgr::addNeighbour(std::string id) if (!mAuthMgr->isValid(id)) { /* no auth */ - connMtx.unlock(); /* UNLOCK MUTEX */ return false; } @@ -2090,7 +2073,6 @@ bool p3ConnectMgr::addNeighbour(std::string id) if (!mAuthMgr->getDetails(id, detail)) { /* no details */ - connMtx.unlock(); /* UNLOCK MUTEX */ return false; } @@ -2106,14 +2088,8 @@ bool p3ConnectMgr::addNeighbour(std::string id) pstate.netMode = RS_NET_MODE_UNKNOWN; /* addr & timestamps -> auto cleared */ - mOthersList[id] = pstate; - // Nothing to notify anyone about... as no new information - //mStatusChanged = true; - - connMtx.unlock(); /* UNLOCK MUTEX */ - return true; } @@ -2132,6 +2108,8 @@ bool p3ConnectMgr::retryConnect(std::string id) bool p3ConnectMgr::retryConnectTCP(std::string id) { + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + /* push addresses onto stack */ std::cerr << "p3ConnectMgr::retryConnectTCP()"; std::cerr << " id: " << id; @@ -2139,9 +2117,6 @@ bool p3ConnectMgr::retryConnectTCP(std::string id) /* look up the id */ std::map::iterator it; - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ - if (mFriendList.end() == (it = mFriendList.find(id))) { std::cerr << "p3ConnectMgr::retryConnectTCP() Peer is not Friend"; @@ -2300,6 +2275,8 @@ bool p3ConnectMgr::retryConnectTCP(std::string id) bool p3ConnectMgr::retryConnectNotify(std::string id) { + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + /* push addresses onto stack */ std::cerr << "p3ConnectMgr::retryConnectNotify()"; std::cerr << " id: " << id; @@ -2307,8 +2284,6 @@ bool p3ConnectMgr::retryConnectNotify(std::string id) /* look up the id */ std::map::iterator it; - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ if (mFriendList.end() == (it = mFriendList.find(id))) { @@ -2353,8 +2328,8 @@ bool p3ConnectMgr::retryConnectNotify(std::string id) bool p3ConnectMgr::setLocalAddress(std::string id, struct sockaddr_in addr) { - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + if (id == mAuthMgr->OwnId()) { ownState.localaddr = addr; @@ -2381,8 +2356,9 @@ bool p3ConnectMgr::setLocalAddress(std::string id, struct sockaddr_in addr) bool p3ConnectMgr::setExtAddress(std::string id, struct sockaddr_in addr) { - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + + if (id == mAuthMgr->OwnId()) { ownState.serveraddr = addr; @@ -2417,6 +2393,8 @@ bool p3ConnectMgr::setNetworkMode(std::string id, uint32_t netMode) return true; } + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + /* check if it is a friend */ std::map::iterator it; if (mFriendList.end() == (it = mFriendList.find(id))) @@ -2431,9 +2409,6 @@ bool p3ConnectMgr::setNetworkMode(std::string id, uint32_t netMode) it->second.netMode = netMode; IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/ - - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ return false; } @@ -2447,6 +2422,8 @@ bool p3ConnectMgr::setVisState(std::string id, uint32_t visState) return true; } + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + /* check if it is a friend */ std::map::iterator it; bool isFriend = false; @@ -2480,9 +2457,6 @@ bool p3ConnectMgr::setVisState(std::string id, uint32_t visState) IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/ - - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ return false; } @@ -2515,8 +2489,8 @@ bool p3ConnectMgr::checkNetAddress() std::list addrs = getLocalInterfaces(); std::list::iterator it; - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ + bool found = false; for(it = addrs.begin(); (!found) && (it != addrs.end()); it++) { @@ -2608,8 +2582,7 @@ std::list p3ConnectMgr::saveList(bool &cleanup) std::list saveData; cleanup = true; - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ RsPeerNetItem *item = new RsPeerNetItem(); item->clear(); @@ -2694,6 +2667,7 @@ bool p3ConnectMgr::loadList(std::list load) std::cerr << std::endl; #endif + /* load the list of peers */ std::list::iterator it; for(it = load.begin(); it != load.end(); it++) @@ -2732,6 +2706,7 @@ bool p3ConnectMgr::loadList(std::list load) } else if (sitem) { + RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/ #ifdef CONN_DEBUG std::cerr << "p3ConnectMgr::loadList() Stun Config Item:"; std::cerr << std::endl; @@ -2746,8 +2721,6 @@ bool p3ConnectMgr::loadList(std::list load) } } - connMtx.lock(); /* LOCK MUTEX */ - connMtx.unlock(); /* UNLOCK MUTEX */ delete (*it); } return true; diff --git a/libretroshare/src/rsiface/rsrank.h b/libretroshare/src/rsiface/rsrank.h index 4c56d513e..a69425c91 100644 --- a/libretroshare/src/rsiface/rsrank.h +++ b/libretroshare/src/rsiface/rsrank.h @@ -89,7 +89,7 @@ virtual bool getRankDetails(std::string rid, RsRankDetails &details) = 0; virtual std::string newRankMsg(std::wstring link, std::wstring title, std::wstring comment, int32_t score) = 0; virtual bool updateComment(std::string rid, std::wstring comment, int32_t score) = 0; -virtual std::string anonRankMsg(std::wstring link, std::wstring title) = 0; +virtual std::string anonRankMsg(std::string rid, std::wstring link, std::wstring title) = 0; }; diff --git a/libretroshare/src/rsserver/p3rank.cc b/libretroshare/src/rsserver/p3rank.cc index 88ec276b1..8dc613cff 100644 --- a/libretroshare/src/rsserver/p3rank.cc +++ b/libretroshare/src/rsserver/p3rank.cc @@ -97,8 +97,8 @@ bool p3Rank::updateComment(std::string rid, std::wstring comment, int32_t score) return mRank->updateComment(rid, comment, score); } -std::string p3Rank::anonRankMsg(std::wstring link, std::wstring title) +std::string p3Rank::anonRankMsg(std::string rid, std::wstring link, std::wstring title) { - return mRank->anonRankMsg(link, title); + return mRank->anonRankMsg(rid, link, title); } diff --git a/libretroshare/src/rsserver/p3rank.h b/libretroshare/src/rsserver/p3rank.h index 305495769..fc35c978b 100644 --- a/libretroshare/src/rsserver/p3rank.h +++ b/libretroshare/src/rsserver/p3rank.h @@ -54,7 +54,7 @@ virtual bool getRankDetails(std::string rid, RsRankDetails &details); /* Add New Comment / Msg */ virtual std::string newRankMsg(std::wstring link, std::wstring title, std::wstring comment, int32_t score); virtual bool updateComment(std::string rid, std::wstring comment, int32_t score); -virtual std::string anonRankMsg(std::wstring link, std::wstring title); +virtual std::string anonRankMsg(std::string rid, std::wstring link, std::wstring title); private: diff --git a/libretroshare/src/services/p3ranking.cc b/libretroshare/src/services/p3ranking.cc index af62e21e0..1a96e5fbe 100644 --- a/libretroshare/src/services/p3ranking.cc +++ b/libretroshare/src/services/p3ranking.cc @@ -997,10 +997,16 @@ bool p3Ranking::updateComment(std::string rid, std::wstring comment, int32_t sco /*************************************************************************/ /****************************** LINK SPECIFIC ****************************/ /*************************************************************************/ -std::string p3Ranking::anonRankMsg(std::wstring link, std::wstring title) +std::string p3Ranking::anonRankMsg(std::string rid, std::wstring link, std::wstring title) { - /* generate an id */ - std::string rid = generateRandomLinkId(); + bool alreadyExists = true; + + if (rid == "") + { + alreadyExists = false; + /* generate an id */ + rid = generateRandomLinkId(); + } RsRankLinkMsg *msg1 = new RsRankLinkMsg(); RsRankLinkMsg *msg2 = new RsRankLinkMsg(); @@ -1034,7 +1040,15 @@ std::string p3Ranking::anonRankMsg(std::wstring link, std::wstring title) msg2->linktype = RS_LINK_TYPE_WEB; msg2->link = link; - addRankMsg(msg1); + if (alreadyExists) + { + delete msg1; + } + else + { + addRankMsg(msg1); + } + addAnonToList(msg2); return rid; @@ -1202,6 +1216,19 @@ bool p3Ranking::addAnonToList(RsRankLinkMsg *msg) { { RsStackMutex stack(mRankMtx); /********** STACK LOCKED MTX ******/ + std::list::iterator it; + for(it = mAnon.begin(); it != mAnon.end(); it++) + { + if (msg->rid == (*it)->rid) + break; + } + + if (it != mAnon.end()) + { + delete msg; + return false; + } + mAnon.push_back(msg); mRepublishFriends = true; } diff --git a/libretroshare/src/services/p3ranking.h b/libretroshare/src/services/p3ranking.h index b74787ee9..2de11d731 100644 --- a/libretroshare/src/services/p3ranking.h +++ b/libretroshare/src/services/p3ranking.h @@ -103,7 +103,7 @@ virtual bool getRankDetails(std::string rid, RsRankDetails &details); /* Add New Comment / Msg */ virtual std::string newRankMsg(std::wstring link, std::wstring title, std::wstring comment, int32_t score); virtual bool updateComment(std::string rid, std::wstring comment, int32_t score); -virtual std::string anonRankMsg(std::wstring link, std::wstring title); +virtual std::string anonRankMsg(std::string rid, std::wstring link, std::wstring title); void tick();