/******************************************************************************* * librssimulator/peer/: PeerNode.cc * * * * libretroshare: retroshare core library * * * * Copyright (C) 2018, Retroshare team * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Affero General Public License as * * published by the Free Software Foundation, either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public License * * along with this program. If not, see . * * * ******************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "PeerNode.h" #include "FakeLinkMgr.h" #include "FakePeerMgr.h" #include "FakeNetMgr.h" #include "FakePublisher.h" #include "FakeServiceControl.h" #include "FakeNxsNetMgr.h" PeerNode::PeerNode(const RsPeerId& id,const std::list& friends, bool online) : _id(id) { // add a service server. mLinkMgr = new FakeLinkMgr(id, friends, online) ; mPeerMgr = new FakePeerMgr(id, friends) ; mPublisher = new FakePublisher() ; mNxsNetMgr = new FakeNxsNetMgr(mLinkMgr); _service_control = new FakeServiceControl(mLinkMgr) ; _service_server = new p3ServiceServer(mPublisher,_service_control); } PeerNode::~PeerNode() { delete _service_server ; delete mPublisher; delete mPeerMgr; delete mLinkMgr; } void PeerNode::AddService(pqiService *service) { _service_server->addService(service, true); } void PeerNode::AddPqiMonitor(pqiMonitor *service) { mPqiMonitors.push_back(service); } void PeerNode::AddPqiServiceMonitor(pqiServiceMonitor *service) { mPqiServiceMonitors.push_back(service); } p3NetMgr *PeerNode::getNetMgr() { return mNetMgr; } p3LinkMgr *PeerNode::getLinkMgr() { return mLinkMgr; } p3PeerMgr *PeerNode::getPeerMgr() { return mPeerMgr; } RsNxsNetMgr *PeerNode::getNxsNetMgr() { return mNxsNetMgr; } void PeerNode::notifyOfFriends() { std::list friendList; mLinkMgr->getFriendList(friendList); std::list::iterator it; for(it = friendList.begin(); it != friendList.end(); it++) { pqipeer peer; peer.id = *it; peer.state = RS_PEER_S_FRIEND; peer.actions = RS_PEER_NEW; } } void PeerNode::bringOnline(std::list &onlineList) { std::list::iterator it; std::list pqiMonitorChanges; std::list pqiServiceMonitorChanges; for(it = onlineList.begin(); it != onlineList.end(); it++) { mLinkMgr->setOnlineStatus(*it, true); pqipeer peer; peer.id = *it; peer.state = RS_PEER_S_FRIEND | RS_PEER_S_CONNECTED; peer.actions = RS_PEER_CONNECTED; pqiMonitorChanges.push_back(peer); pqiServicePeer sp; sp.id = *it; sp.actions = RS_SERVICE_PEER_CONNECTED; pqiServiceMonitorChanges.push_back(sp); } std::list::iterator pit; for(pit = mPqiMonitors.begin(); pit != mPqiMonitors.end(); pit++) { (*pit)->statusChange(pqiMonitorChanges); } std::list::iterator spit; for(spit = mPqiServiceMonitors.begin(); spit != mPqiServiceMonitors.end(); spit++) { (*spit)->statusChange(pqiServiceMonitorChanges); } } void PeerNode::takeOffline(std::list &offlineList) { std::list::iterator it; std::list pqiMonitorChanges; std::list pqiServiceMonitorChanges; for(it = offlineList.begin(); it != offlineList.end(); it++) { mLinkMgr->setOnlineStatus(*it, false); pqipeer peer; peer.id = *it; peer.state = RS_PEER_S_FRIEND; peer.actions = RS_PEER_DISCONNECTED; pqiMonitorChanges.push_back(peer); pqiServicePeer sp; sp.id = *it; sp.actions = RS_SERVICE_PEER_DISCONNECTED; pqiServiceMonitorChanges.push_back(sp); } std::list::iterator pit; for(pit = mPqiMonitors.begin(); pit != mPqiMonitors.end(); pit++) { (*pit)->statusChange(pqiMonitorChanges); } std::list::iterator spit; for(spit = mPqiServiceMonitors.begin(); spit != mPqiServiceMonitors.end(); spit++) { (*spit)->statusChange(pqiServiceMonitorChanges); } } void PeerNode::tick() { #ifdef DEBUG std::cerr << " ticking peer node " << _id << std::endl; #endif _service_server->tick() ; } void PeerNode::incoming(RsRawItem *item) { #ifdef DEBUG std::cerr << "PeerNode::incoming()" << std::endl; #endif _service_server->recvItem(item) ; } RsRawItem *PeerNode::outgoing() { return mPublisher->outgoing() ; } bool PeerNode::haveOutgoingPackets() { return (!(mPublisher->outgoingEmpty())); }