2007-11-14 22:18:48 -05:00
|
|
|
/*
|
2007-12-11 20:29:14 -05:00
|
|
|
* libretroshare/src/pqi pqistreamer.h
|
2007-11-14 22:18:48 -05:00
|
|
|
*
|
|
|
|
* 3P/PQI network interface for RetroShare.
|
|
|
|
*
|
2007-12-11 20:29:14 -05:00
|
|
|
* Copyright 2004-2008 by Robert Fernie.
|
2007-11-14 22:18:48 -05:00
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License Version 2 as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This library 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
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
|
|
* USA.
|
|
|
|
*
|
|
|
|
* Please report all bugs and problems to "retroshare@lunamutt.com".
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef MRK_PQI_STREAMER_HEADER
|
|
|
|
#define MRK_PQI_STREAMER_HEADER
|
|
|
|
|
|
|
|
// Only dependent on the base stuff.
|
|
|
|
#include "pqi/pqi_base.h"
|
2009-03-11 16:36:51 -04:00
|
|
|
#include "util/rsthreads.h"
|
2007-11-14 22:18:48 -05:00
|
|
|
|
|
|
|
#include <list>
|
|
|
|
|
|
|
|
// Fully implements the PQInterface.
|
|
|
|
// and communicates with peer etc via the BinInterface.
|
|
|
|
//
|
|
|
|
// The interface does not handle connection, just communication.
|
2008-02-05 08:45:04 -05:00
|
|
|
// possible bioflags: BIN_FLAGS_NO_CLOSE | BIN_FLAGS_NO_DELETE
|
2007-11-14 22:18:48 -05:00
|
|
|
|
|
|
|
class pqistreamer: public PQInterface
|
|
|
|
{
|
2011-09-04 16:01:30 -04:00
|
|
|
public:
|
|
|
|
pqistreamer(RsSerialiser *rss, std::string peerid, BinInterface *bio_in, int bio_flagsin);
|
|
|
|
virtual ~pqistreamer();
|
|
|
|
|
|
|
|
// PQInterface
|
|
|
|
virtual int SendItem(RsItem *item)
|
|
|
|
{
|
|
|
|
std::cerr << "Warning pqistreamer::sendItem(RsItem*) should not be called. Plz call SendItem(RsItem *,uint32_t& serialized_size) instead." << std::endl;
|
|
|
|
uint32_t serialized_size ;
|
|
|
|
return SendItem(item,serialized_size) ;
|
|
|
|
}
|
|
|
|
virtual int SendItem(RsItem *,uint32_t& serialized_size);
|
|
|
|
virtual RsItem *GetItem();
|
|
|
|
|
|
|
|
virtual int tick();
|
|
|
|
virtual int status();
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2012-01-19 11:23:57 -05:00
|
|
|
time_t getLastIncomingTS(); // Time of last data packet, for checking a connection is alive.
|
2012-06-21 21:35:32 -04:00
|
|
|
virtual void getRates(RsBwRates &rates);
|
|
|
|
virtual int getQueueSize(bool in); // extracting data.
|
2007-11-14 22:18:48 -05:00
|
|
|
private:
|
2011-09-04 16:01:30 -04:00
|
|
|
/* Implementation */
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2011-09-04 16:01:30 -04:00
|
|
|
// to filter functions - detect filecancel/data and act!
|
|
|
|
int queue_outpqi( RsItem *i,uint32_t& serialized_size);
|
|
|
|
int handleincomingitem(RsItem *i);
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2011-09-04 16:01:30 -04:00
|
|
|
// ticked regularly (manages out queues and sending
|
|
|
|
// via above interfaces.
|
|
|
|
int handleoutgoing();
|
|
|
|
int handleincoming();
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2011-09-04 16:01:30 -04:00
|
|
|
// Bandwidth/Streaming Management.
|
|
|
|
float outTimeSlice();
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2011-09-04 16:01:30 -04:00
|
|
|
int outAllowedBytes();
|
|
|
|
void outSentBytes(int );
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2011-09-04 16:01:30 -04:00
|
|
|
int inAllowedBytes();
|
|
|
|
void inReadBytes(int );
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2011-09-04 16:01:30 -04:00
|
|
|
// RsSerialiser - determines which packets can be serialised.
|
|
|
|
RsSerialiser *rsSerialiser;
|
|
|
|
// Binary Interface for IO, initialisated at startup.
|
|
|
|
BinInterface *bio;
|
|
|
|
unsigned int bio_flags; // BIN_FLAGS_NO_CLOSE | BIN_FLAGS_NO_DELETE
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2011-09-04 16:01:30 -04:00
|
|
|
void *pkt_wpending; // storage for pending packet to write.
|
|
|
|
int pkt_rpend_size; // size of pkt_rpending.
|
|
|
|
void *pkt_rpending; // storage for read in pending packets.
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2011-09-04 16:01:30 -04:00
|
|
|
enum {reading_state_packet_started=1,
|
2009-03-03 14:40:42 -05:00
|
|
|
reading_state_initial=0 } ;
|
|
|
|
|
2011-09-04 16:01:30 -04:00
|
|
|
int reading_state ;
|
|
|
|
int failed_read_attempts ;
|
2009-03-03 14:40:42 -05:00
|
|
|
|
2011-09-04 16:01:30 -04:00
|
|
|
// Temp Storage for transient data.....
|
|
|
|
std::list<void *> out_pkt; // Cntrl / Search / Results queue
|
|
|
|
std::list<RsItem *> incoming;
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2011-09-04 16:01:30 -04:00
|
|
|
// data for network stats.
|
|
|
|
int totalRead;
|
|
|
|
int totalSent;
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2011-09-04 16:01:30 -04:00
|
|
|
// these are representative (but not exact)
|
|
|
|
int currRead;
|
|
|
|
int currSent;
|
|
|
|
int currReadTS; // TS from which these are measured.
|
|
|
|
int currSentTS;
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2011-09-04 16:01:30 -04:00
|
|
|
int avgLastUpdate; // TS from which these are measured.
|
|
|
|
float avgReadCount;
|
|
|
|
float avgSentCount;
|
2009-03-11 16:36:51 -04:00
|
|
|
|
2012-01-19 11:23:57 -05:00
|
|
|
time_t mLastIncomingTs;
|
|
|
|
|
|
|
|
RsMutex streamerMtx ; // WHAT IS THIS PROTECTING. XXX
|
|
|
|
// pthread_t thread_id;A
|
|
|
|
|
|
|
|
|
2007-11-14 22:18:48 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif //MRK_PQI_STREAMER_HEADER
|