#include "p2p.h" // This file is part of MRCI. // MRCI is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // MRCI 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 General Public License for more details. // You should have received a copy of the GNU General Public License // along with MRCI under the LICENSE.md file. If not, see // . ToPeer::ToPeer(QObject *parent) : InternCommand(parent) {} P2PRequest::P2PRequest(QObject *parent) : InternCommand(parent) {} P2POpen::P2POpen(QObject *parent) : InternCommand(parent) {} P2PClose::P2PClose(QObject *parent) : InternCommand(parent) {} LsP2P::LsP2P(QObject *parent) : InternCommand(parent) {} QString ToPeer::cmdName() {return "to_peer";} QString P2PRequest::cmdName() {return "p2p_request";} QString P2POpen::cmdName() {return "p2p_open";} QString P2PClose::cmdName() {return "p2p_close";} QString LsP2P::cmdName() {return "ls_p2p";} void ToPeer::procBin(const SharedObjs *sharedObjs, const QByteArray &binIn, uchar dType) { QByteArray peerId = binIn.left(28); if (!sharedObjs->p2pAccepted->contains(peerId)) { errTxt("err: You don't current have an open p2p connection with the requested peer."); } else { emit toPeer(peerId, binIn.mid(28), dType); } } void P2PRequest::procBin(const SharedObjs *sharedObjs, const QByteArray &binIn, uchar dType) { if (dType == SESSION_ID) { if (binIn.size() != 28) { errTxt("err: The given client session id does not equal 28 bytes."); } else if (sharedObjs->p2pAccepted->contains(binIn)) { errTxt("err: You already have an open p2p connection with the requested peer."); } else if (sharedObjs->p2pPending->contains(binIn)) { errTxt("err: There is already a pending p2p request for this peer."); } else { emit toPeer(binIn, QByteArray(), P2P_REQUEST); } } } void P2POpen::procBin(const SharedObjs *sharedObjs, const QByteArray &binIn, uchar dType) { if (dType == SESSION_ID) { if (binIn.size() != 28) { errTxt("err: The given client session id does not equal 28 bytes."); } else if (sharedObjs->p2pAccepted->contains(binIn)) { errTxt("err: You already have an open p2p connection with the requested peer."); } else if (!sharedObjs->p2pPending->contains(binIn)) { errTxt("err: There is no pending p2p request for the given peer."); } else { emit toPeer(binIn, QByteArray(), P2P_OPEN); } } } void P2PClose::procBin(const SharedObjs *sharedObjs, const QByteArray &binIn, uchar dType) { if (dType == SESSION_ID) { if (binIn.size() != 28) { errTxt("err: The given client session id does not equal 28 bytes."); } else if (!sharedObjs->p2pAccepted->contains(binIn) && !sharedObjs->p2pPending->contains(binIn)) { errTxt("err: There is no pending p2p request or p2p connection with the given peer."); } else { emit toPeer(binIn, QByteArray(), P2P_CLOSE); } } } void LsP2P::procBin(const SharedObjs *sharedObjs, const QByteArray &binIn, uchar dType) { Q_UNUSED(binIn); if (dType == TEXT) { QList peerIds = *sharedObjs->p2pAccepted + *sharedObjs->p2pPending; QList tableData; QStringList separators; QList justLens; for (int i = 0; i < 2; ++i) { justLens.append(7); separators.append("-------"); } tableData.append(QStringList() << "peer_id" << "pending"); tableData.append(separators); for (auto&& peerId: peerIds) { QString pending = "0"; QStringList columnData; if (sharedObjs->p2pPending->contains(peerId)) { pending = "1"; } columnData.append(peerId.toHex()); columnData.append(pending); for (int k = 0; k < justLens.size(); ++k) { if (justLens[k] < columnData[k].size()) justLens[k] = columnData[k].size(); } tableData.append(columnData); } mainTxt("\n"); for (auto&& row : tableData) { for (int i = 0; i < row.size(); ++i) { mainTxt(row[i].leftJustified(justLens[i] + 2, ' ')); } mainTxt("\n"); } } }