/******************************************************************************* * libretroshare/src/gxs: rsgxsnetutils.h * * * * libretroshare: retroshare core library * * * * Copyright 2012-2013 by Christopher Evi-Parker * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser 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 . * * * *******************************************************************************/ #ifndef RSGXSNETUTILS_H_ #define RSGXSNETUTILS_H_ #include #include "retroshare/rsgxsifacetypes.h" #include "rsitems/rsnxsitems.h" #include "rsgixs.h" class p3ServiceControl; class PgpAuxUtils; /*! * This represents a transaction made * with the NxsNetService in all states * of operation until completion * */ class NxsTransaction { public: static const uint8_t FLAG_STATE_STARTING; // when static const uint8_t FLAG_STATE_RECEIVING; // begin receiving items for incoming trans static const uint8_t FLAG_STATE_SENDING; // begin sending items for outgoing trans static const uint8_t FLAG_STATE_COMPLETED; static const uint8_t FLAG_STATE_FAILED; static const uint8_t FLAG_STATE_WAITING_CONFIRM; NxsTransaction(); ~NxsTransaction(); uint32_t mFlag; // current state of transaction uint32_t mTimeOut; /*! * this contains who we * c what peer this transaction involves. * c The type of transaction * c transaction id * c timeout set for this transaction * c and itemCount */ RsNxsTransacItem* mTransaction; std::list mItems; // items received or sent }; /*! * An abstraction of the net manager * for retrieving Rs peers whom you will be synchronising * and also you own Id * Useful for testing also (abstracts away Rs's p3NetMgr) */ class RsNxsNetMgr { public: virtual ~RsNxsNetMgr(){}; virtual const RsPeerId& getOwnId() = 0; virtual void getOnlineList(const uint32_t serviceId, std::set& ssl_peers) = 0; }; class RsNxsNetMgrImpl : public RsNxsNetMgr { public: RsNxsNetMgrImpl(p3ServiceControl* sc); virtual ~RsNxsNetMgrImpl(){}; virtual const RsPeerId& getOwnId(); virtual void getOnlineList(const uint32_t serviceId, std::set& ssl_peers); private: // No need for mutex as this is constant in the class. p3ServiceControl* mServiceCtrl; }; /*! * Partial abstract class * which represents * items waiting to be vetted * on account of their author Id */ class AuthorPending { public: static const int MSG_PEND; static const int GRP_PEND; static const rstime_t EXPIRY_PERIOD_OFFSET; AuthorPending(RsGixsReputation* rep, rstime_t timeStamp); virtual ~AuthorPending(); virtual int getType() const = 0 ; /*! * @return true if all authors pass vetting and their messages * should be requested */ virtual bool accepted() = 0; /*! * @return true if message is past set expiry date */ bool expired() const; protected: /*! * Convenience function to get author reputation * @param rep reputation of author * @param authorId reputation to get * @return true if successfully retrieve repution */ bool getAuthorRep(GixsReputation& rep, const RsGxsId& authorId, const RsPeerId& peerId); private: RsGixsReputation* mRep; rstime_t mTimeStamp; }; class MsgAuthEntry { public: MsgAuthEntry(); RsGxsMessageId mMsgId; RsGxsGroupId mGrpId; RsGxsId mAuthorId; bool mPassedVetting; }; class GrpAuthEntry { public: GrpAuthEntry(); RsGxsGroupId mGrpId; RsGxsId mAuthorId; bool mPassedVetting; }; typedef std::vector MsgAuthorV; typedef std::vector GrpAuthorV; class MsgRespPending : public AuthorPending { public: MsgRespPending(RsGixsReputation* rep, const RsPeerId& peerId, const MsgAuthorV& msgAuthV, int cutOff = 0); int getType() const; bool accepted(); RsPeerId mPeerId; MsgAuthorV mMsgAuthV; int mCutOff; }; class GrpRespPending : public AuthorPending { public: GrpRespPending(RsGixsReputation* rep, const RsPeerId& peerId, const GrpAuthorV& grpAuthV, int cutOff = 0); int getType() const; bool accepted(); RsPeerId mPeerId; GrpAuthorV mGrpAuthV; int mCutOff; }; /////////////// class GrpIdCircleVet { public: GrpIdCircleVet(const RsGxsGroupId& grpId, const RsGxsCircleId& circleId, const RsGxsId& authId); RsGxsGroupId mGroupId; RsGxsCircleId mCircleId; RsGxsId mAuthorId; bool mCleared; bool mShouldEncrypt; }; class MsgIdCircleVet { public: MsgIdCircleVet(const RsGxsMessageId& grpId, const RsGxsId& authorId); RsGxsMessageId mMsgId; RsGxsId mAuthorId; }; class GrpItemCircleVet { public: RsNxsGrp* grpItem; RsGxsCircleId mCircleId; bool mCleared; }; class GrpCircleVetting { public: static const rstime_t EXPIRY_PERIOD_OFFSET; static const int GRP_ID_PEND; static const int GRP_ITEM_PEND; static const int MSG_ID_SEND_PEND; static const int MSG_ID_RECV_PEND; GrpCircleVetting(RsGcxs* const circles, PgpAuxUtils *pgpUtils); virtual ~GrpCircleVetting(); bool expired(); virtual int getType() const = 0; virtual bool cleared() = 0; protected: bool canSend(const RsPeerId& peerId, const RsGxsCircleId& circleId, bool& should_encrypt); RsGcxs* const mCircles; PgpAuxUtils *mPgpUtils; rstime_t mTimeStamp; }; class GrpCircleIdRequestVetting : public GrpCircleVetting { public: GrpCircleIdRequestVetting(RsGcxs* const circles, PgpAuxUtils *pgpUtils, std::vector mGrpCircleV, const RsPeerId& peerId); bool cleared(); int getType() const; std::vector mGrpCircleV; RsPeerId mPeerId; }; class MsgCircleIdsRequestVetting : public GrpCircleVetting { public: MsgCircleIdsRequestVetting(RsGcxs* const circles, PgpAuxUtils *auxUtils, std::vector msgs, const RsGxsGroupId& grpId, const RsPeerId& peerId, const RsGxsCircleId& circleId); bool cleared(); int getType() const; std::vector mMsgs; RsGxsGroupId mGrpId; RsPeerId mPeerId; RsGxsCircleId mCircleId; bool mShouldEncrypt; }; #endif /* RSGXSNETUTILS_H_ */