2007-11-14 22:18:48 -05:00
/*
2008-01-25 01:36:40 -05:00
* libretroshare / src / pqi : pqipersongrp . cc
2007-11-14 22:18:48 -05:00
*
* 3 P / 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 " .
*
*/
# include "pqi/pqipersongrp.h"
2011-07-09 14:39:34 -04:00
# include "pqi/p3linkmgr.h"
2008-07-10 12:29:18 -04:00
# include "util/rsdebug.h"
2008-01-25 01:36:40 -05:00
2007-11-14 22:18:48 -05:00
# include <sstream>
2009-05-11 10:30:53 -04:00
# include <stdio.h>
2007-11-14 22:18:48 -05:00
const int pqipersongrpzone = 354 ;
2010-10-07 07:17:42 -04:00
# ifdef WINDOWS_SYS
///////////////////////////////////////////////////////////
// hack for too many connections
# include "retroshare/rsinit.h"
static std : : list < std : : string > waitingIds ;
# define MAX_CONNECT_COUNT 5
///////////////////////////////////////////////////////////
# endif
2008-04-03 08:51:28 -04:00
/****
2008-07-09 05:55:09 -04:00
* # define PGRP_DEBUG 1
* * * */
2010-10-31 09:53:28 -04:00
//#define PGRP_DEBUG 1
2007-11-14 22:18:48 -05:00
2008-11-22 08:15:07 -05:00
/* MUTEX NOTES:
* Functions like GetRsRawItem ( ) lock itself ( pqihandler ) and
* likewise ServiceServer and ConfigMgr mutex themselves .
* This means the only things we need to worry about are :
* pqilistener and when accessing pqihandlers data .
*/
2007-11-14 22:18:48 -05:00
// handle the tunnel services.
2007-12-11 20:29:14 -05:00
int pqipersongrp : : tickServiceRecv ( )
2007-11-14 22:18:48 -05:00
{
2007-12-11 20:29:14 -05:00
RsRawItem * pqi = NULL ;
2007-11-14 22:18:48 -05:00
int i = 0 ;
{
std : : ostringstream out ;
out < < " pqipersongrp::tickTunnelServer() " ;
pqioutput ( PQL_DEBUG_ALL , pqipersongrpzone , out . str ( ) ) ;
}
2007-12-11 20:29:14 -05:00
//p3ServiceServer::tick();
2007-11-14 22:18:48 -05:00
2007-12-11 20:29:14 -05:00
while ( NULL ! = ( pqi = GetRsRawItem ( ) ) )
2007-11-14 22:18:48 -05:00
{
+ + i ;
pqioutput ( PQL_DEBUG_BASIC , pqipersongrpzone ,
2007-12-11 20:29:14 -05:00
" pqipersongrp::tickTunnelServer() Incoming TunnelItem " ) ;
2007-11-14 22:18:48 -05:00
incoming ( pqi ) ;
}
2007-12-11 20:29:14 -05:00
if ( 0 < i )
2007-11-14 22:18:48 -05:00
{
2007-12-11 20:29:14 -05:00
return 1 ;
2007-11-14 22:18:48 -05:00
}
2007-12-11 20:29:14 -05:00
return 0 ;
}
// handle the tunnel services.
int pqipersongrp : : tickServiceSend ( )
{
RsRawItem * pqi = NULL ;
int i = 0 ;
{
std : : ostringstream out ;
out < < " pqipersongrp::tickServiceSend() " ;
pqioutput ( PQL_DEBUG_ALL , pqipersongrpzone , out . str ( ) ) ;
}
p3ServiceServer : : tick ( ) ;
2007-11-14 22:18:48 -05:00
2008-11-22 08:15:07 -05:00
while ( NULL ! = ( pqi = outgoing ( ) ) ) /* outgoing has own locking */
2007-11-14 22:18:48 -05:00
{
+ + i ;
pqioutput ( PQL_DEBUG_BASIC , pqipersongrpzone ,
2007-12-11 20:29:14 -05:00
" pqipersongrp::tickTunnelServer() OutGoing RsItem " ) ;
2007-11-14 22:18:48 -05:00
2008-11-22 08:15:07 -05:00
SendRsRawItem ( pqi ) ; /* Locked by pqihandler */
2007-11-14 22:18:48 -05:00
}
if ( 0 < i )
{
return 1 ;
}
return 0 ;
}
2008-01-25 01:36:40 -05:00
// init
pqipersongrp : : pqipersongrp ( SecurityPolicy * glob , unsigned long flags )
: pqihandler ( glob ) , pqil ( NULL ) , config ( NULL ) , initFlags ( flags )
2007-11-14 22:18:48 -05:00
{
}
2008-01-25 01:36:40 -05:00
2007-11-14 22:18:48 -05:00
int pqipersongrp : : tick ( )
{
/* could limit the ticking of listener / tunnels to 1/sec...
* but not to important .
*/
2008-11-22 08:15:07 -05:00
{ RsStackMutex stack ( coreMtx ) ; /**************** LOCKED MUTEX ****************/
2007-11-14 22:18:48 -05:00
if ( pqil )
{
pqil - > tick ( ) ;
}
2008-11-22 08:15:07 -05:00
} /* UNLOCKED */
2007-12-11 20:29:14 -05:00
int i = 0 ;
2008-04-03 08:51:28 -04:00
if ( tickServiceSend ( ) )
{
i = 1 ;
2008-07-09 05:55:09 -04:00
# ifdef PGRP_DEBUG
2008-04-03 08:51:28 -04:00
std : : cerr < < " pqipersongrp::tick() moreToTick from tickServiceSend() " < < std : : endl ;
# endif
}
if ( pqihandler : : tick ( ) ) /* does actual Send/Recv */
{
i = 1 ;
2008-07-09 05:55:09 -04:00
# ifdef PGRP_DEBUG
2008-04-03 08:51:28 -04:00
std : : cerr < < " pqipersongrp::tick() moreToTick from pqihandler::tick() " < < std : : endl ;
# endif
}
2007-11-14 22:18:48 -05:00
2007-12-11 20:29:14 -05:00
2008-04-03 08:51:28 -04:00
if ( tickServiceRecv ( ) )
{
i = 1 ;
2008-07-09 05:55:09 -04:00
# ifdef PGRP_DEBUG
2008-04-03 08:51:28 -04:00
std : : cerr < < " pqipersongrp::tick() moreToTick from tickServiceRecv() " < < std : : endl ;
# endif
}
2007-12-11 20:29:14 -05:00
2008-04-03 08:51:28 -04:00
return i ;
2007-11-14 22:18:48 -05:00
}
int pqipersongrp : : status ( )
{
2008-11-22 08:15:07 -05:00
{ RsStackMutex stack ( coreMtx ) ; /**************** LOCKED MUTEX ****************/
2007-11-14 22:18:48 -05:00
if ( pqil )
{
pqil - > status ( ) ;
}
2008-11-22 08:15:07 -05:00
} /* UNLOCKED */
2007-11-14 22:18:48 -05:00
return pqihandler : : status ( ) ;
}
2008-01-25 01:36:40 -05:00
/* Initialise pqilistener */
int pqipersongrp : : init_listener ( )
2007-11-14 22:18:48 -05:00
{
2008-01-25 01:36:40 -05:00
/* extract our information from the p3ConnectMgr */
if ( initFlags & PQIPERSON_NO_LISTENER )
2007-11-14 22:18:48 -05:00
{
2008-01-25 01:36:40 -05:00
pqil = NULL ;
}
else
{
/* extract details from
*/
2011-07-09 14:39:34 -04:00
struct sockaddr_in laddr = mLinkMgr - > getLocalAddress ( ) ;
2008-11-22 08:15:07 -05:00
RsStackMutex stack ( coreMtx ) ; /**************** LOCKED MUTEX ****************/
2011-07-09 14:39:34 -04:00
pqil = createListener ( laddr ) ;
2007-11-14 22:18:48 -05:00
}
2008-01-25 01:36:40 -05:00
return 1 ;
}
2007-11-14 22:18:48 -05:00
2010-07-31 14:14:10 -04:00
bool pqipersongrp : : resetListener ( struct sockaddr_in & local )
2008-01-25 01:36:40 -05:00
{
2010-02-07 16:28:40 -05:00
# ifdef PGRP_DEBUG
2010-07-31 14:14:10 -04:00
std : : cerr < < " pqipersongrp::resetListener() " < < std : : endl ;
2010-02-07 16:28:40 -05:00
# endif
2009-08-04 19:22:44 -04:00
2008-01-25 01:36:40 -05:00
// stop it,
// change the address.
// restart.
2008-11-22 08:15:07 -05:00
2010-07-31 14:14:10 -04:00
RsStackMutex stack ( coreMtx ) ; /**************** LOCKED MUTEX ****************/
2008-11-22 08:15:07 -05:00
2010-07-31 14:14:10 -04:00
if ( pqil ! = NULL )
2007-12-11 20:29:14 -05:00
{
2010-02-07 16:28:40 -05:00
# ifdef PGRP_DEBUG
2010-07-31 14:14:10 -04:00
std : : cerr < < " pqipersongrp::resetListener() haveListener " < < std : : endl ;
2010-02-07 16:28:40 -05:00
# endif
2009-08-04 19:22:44 -04:00
2008-01-25 01:36:40 -05:00
pqil - > resetlisten ( ) ;
2010-07-31 14:14:10 -04:00
pqil - > setListenAddr ( local ) ;
2008-01-25 01:36:40 -05:00
pqil - > setuplisten ( ) ;
2009-08-04 19:22:44 -04:00
2010-02-07 16:28:40 -05:00
# ifdef PGRP_DEBUG
2010-07-31 14:14:10 -04:00
std : : cerr < < " pqipersongrp::resetListener() done! " < < std : : endl ;
2010-02-07 16:28:40 -05:00
# endif
2009-08-04 19:22:44 -04:00
2007-12-11 20:29:14 -05:00
}
2008-01-25 01:36:40 -05:00
return 1 ;
}
2007-12-11 20:29:14 -05:00
2008-11-22 08:15:07 -05:00
/* NOT bothering to protect Config with a mutex.... it is not going to change
* and has its own internal mutexs .
*/
2008-01-25 01:36:40 -05:00
int pqipersongrp : : setConfig ( p3GeneralConfig * cfg )
{
config = cfg ;
2008-08-31 14:50:31 -04:00
return 1 ;
2008-01-25 01:36:40 -05:00
}
2007-12-11 20:29:14 -05:00
2008-01-25 01:36:40 -05:00
static const std : : string pqih_ftr ( " PQIH_FTR " ) ;
2007-12-11 20:29:14 -05:00
2008-01-25 01:36:40 -05:00
int pqipersongrp : : save_config ( )
{
char line [ 512 ] ;
2009-06-08 13:09:00 -04:00
sprintf ( line , " %f %f " , getMaxRate ( true ) , getMaxRate ( false ) ) ;
2008-01-25 01:36:40 -05:00
if ( config )
{
config - > setSetting ( pqih_ftr , std : : string ( line ) ) ;
}
return 1 ;
}
int pqipersongrp : : load_config ( )
{
std : : string line ;
if ( config )
{
line = config - > getSetting ( pqih_ftr ) ;
}
2007-11-14 22:18:48 -05:00
2009-06-08 13:09:00 -04:00
float mri , mro ;
if ( 2 = = sscanf ( line . c_str ( ) , " %f %f " , & mri , & mro ) )
2008-01-25 01:36:40 -05:00
{
setMaxRate ( true , mri ) ;
setMaxRate ( false , mro ) ;
}
else
{
pqioutput ( PQL_DEBUG_BASIC , pqipersongrpzone ,
" pqipersongrp::load_config() Loading Default Rates! " ) ;
2007-11-14 22:18:48 -05:00
2008-03-26 11:35:09 -04:00
setMaxRate ( true , 500.0 ) ;
setMaxRate ( false , 500.0 ) ;
2008-01-25 01:36:40 -05:00
}
2007-11-14 22:18:48 -05:00
2008-01-25 01:36:40 -05:00
return 1 ;
}
void pqipersongrp : : statusChange ( const std : : list < pqipeer > & plist )
{
/* iterate through, only worry about the friends */
std : : list < pqipeer > : : const_iterator it ;
for ( it = plist . begin ( ) ; it ! = plist . end ( ) ; it + + )
{
if ( it - > state & RS_PEER_S_FRIEND )
{
/* now handle add/remove */
if ( ( it - > actions & RS_PEER_NEW )
| | ( it - > actions & RS_PEER_MOVED ) )
{
addPeer ( it - > id ) ;
}
if ( it - > actions & RS_PEER_CONNECT_REQ )
{
connectPeer ( it - > id ) ;
}
}
else /* Not Friend */
{
if ( it - > actions & RS_PEER_MOVED )
{
removePeer ( it - > id ) ;
}
}
}
}
2007-11-14 22:18:48 -05:00
2010-10-07 07:17:42 -04:00
# ifdef WINDOWS_SYS
///////////////////////////////////////////////////////////
// hack for too many connections
void pqipersongrp : : statusChanged ( )
{
# warning "Windows connection limited hacked together - please fix"
if ( RsInit : : isWindowsXP ( ) = = false ) {
/* the problem only exist in Windows XP */
waitingIds . clear ( ) ;
return ;
}
2011-08-04 19:27:58 -04:00
/* there is no need for a mutex for waitingIds */
if ( waitingIds . empty ( ) ) {
/* nothing to do */
return ;
}
2010-10-07 07:17:42 -04:00
/* check for active connections and start waiting id's */
long connect_count = 0 ;
{
RsStackMutex stack ( coreMtx ) ; /**************** LOCKED MUTEX ****************/
/* get address from p3connmgr */
2011-07-09 14:39:34 -04:00
if ( ! mLinkMgr ) {
2010-10-07 07:17:42 -04:00
return ;
}
/* check for active connections and start waiting id's */
std : : list < std : : string > peers ;
2011-07-09 14:39:34 -04:00
mLinkMgr - > getFriendList ( peers ) ;
2010-10-07 07:17:42 -04:00
/* count connection attempts */
std : : list < std : : string > : : iterator peer ;
for ( peer = peers . begin ( ) ; peer ! = peers . end ( ) ; peer + + ) {
peerConnectState state ;
2011-07-09 14:39:34 -04:00
if ( mLinkMgr - > getFriendNetStatus ( * peer , state ) = = false ) {
2010-10-07 07:17:42 -04:00
continue ;
}
if ( state . inConnAttempt ) {
connect_count + + ;
if ( connect_count > = MAX_CONNECT_COUNT ) {
# ifdef PGRP_DEBUG
std : : cerr < < " pqipersongrp::connectPeer() Too many connections due to windows limitations. There are " < < waitingIds . size ( ) < < " waiting connections. " < < std : : endl ;
# endif
return ;
}
}
}
} /* UNLOCKED */
# ifdef PGRP_DEBUG
std : : cerr < < " pqipersongrp::connectPeer() There are " < < connect_count < < " connection attempts and " < < waitingIds . size ( ) < < " waiting connections. Can start " < < ( MAX_CONNECT_COUNT - connect_count ) < < " connection attempts. " < < std : : endl ;
# endif
/* start some waiting id's */
for ( int i = connect_count ; i < MAX_CONNECT_COUNT ; i + + ) {
if ( waitingIds . empty ( ) ) {
break ;
}
std : : string waitingId = waitingIds . front ( ) ;
waitingIds . pop_front ( ) ;
connectPeer ( waitingId , true ) ;
}
}
///////////////////////////////////////////////////////////
# endif
2007-11-14 22:18:48 -05:00
2008-01-25 01:36:40 -05:00
int pqipersongrp : : addPeer ( std : : string id )
{
{
std : : ostringstream out ;
out < < " pqipersongrp::addPeer() PeerId: " < < id ;
pqioutput ( PQL_DEBUG_BASIC , pqipersongrpzone , out . str ( ) ) ;
}
2011-07-11 08:11:58 -04:00
std : : cerr < < " pqipersongrp::addPeer() id: " < < id ;
2008-01-25 01:36:40 -05:00
std : : cerr < < std : : endl ;
2011-07-11 08:11:58 -04:00
# ifdef PGRP_DEBUG
2008-07-09 05:55:09 -04:00
# endif
2008-01-25 01:36:40 -05:00
SearchModule * sm = NULL ;
2010-01-14 17:50:27 -05:00
{ RsStackMutex stack ( coreMtx ) ; /**************** LOCKED MUTEX ****************/
2008-01-25 01:36:40 -05:00
std : : map < std : : string , SearchModule * > : : iterator it ;
it = mods . find ( id ) ;
if ( it ! = mods . end ( ) )
{
pqioutput ( PQL_DEBUG_BASIC , pqipersongrpzone ,
" pqipersongrp::addPeer() Peer already in Use! " ) ;
2011-07-11 08:11:58 -04:00
std : : cerr < < " pqipersongrp::addPeer() ERROR Peer already in use! id: " < < id ;
std : : cerr < < std : : endl ;
2008-01-25 01:36:40 -05:00
return - 1 ;
}
pqiperson * pqip = createPerson ( id , pqil ) ;
2007-11-14 22:18:48 -05:00
// attach to pqihandler
2008-01-25 01:36:40 -05:00
sm = new SearchModule ( ) ;
sm - > peerid = id ;
2007-11-14 22:18:48 -05:00
sm - > pqi = pqip ;
sm - > sp = secpolicy_create ( ) ;
// reset it to start it working.
2008-01-25 01:36:40 -05:00
pqip - > reset ( ) ;
2008-01-28 00:40:32 -05:00
pqip - > listen ( ) ;
2008-11-22 08:15:07 -05:00
} /* UNLOCKED */
2007-11-14 22:18:48 -05:00
return AddSearchModule ( sm ) ;
}
2008-01-25 01:36:40 -05:00
int pqipersongrp : : removePeer ( std : : string id )
2007-11-14 22:18:48 -05:00
{
2007-12-11 20:29:14 -05:00
std : : map < std : : string , SearchModule * > : : iterator it ;
2007-11-14 22:18:48 -05:00
2008-07-09 05:55:09 -04:00
# ifdef PGRP_DEBUG
# endif
2011-07-11 08:11:58 -04:00
std : : cerr < < " pqipersongrp::removePeer() id: " < < id ;
std : : cerr < < std : : endl ;
2008-01-25 01:36:40 -05:00
2008-11-22 08:15:07 -05:00
RsStackMutex stack ( coreMtx ) ; /**************** LOCKED MUTEX ****************/
2008-01-25 01:36:40 -05:00
it = mods . find ( id ) ;
if ( it ! = mods . end ( ) )
2007-11-14 22:18:48 -05:00
{
2008-01-25 01:36:40 -05:00
SearchModule * mod = it - > second ;
2008-02-27 10:43:02 -05:00
// Don't duplicate remove!!!
//RemoveSearchModule(mod);
2008-01-25 01:36:40 -05:00
secpolicy_delete ( mod - > sp ) ;
pqiperson * p = ( pqiperson * ) mod - > pqi ;
2010-06-25 18:00:38 -04:00
p - > stoplistening ( ) ;
2008-01-25 01:36:40 -05:00
p - > reset ( ) ;
delete p ;
mods . erase ( it ) ;
2007-11-14 22:18:48 -05:00
}
2011-07-11 08:11:58 -04:00
else
{
std : : cerr < < " pqipersongrp::removePeer() ERROR doesn't exist! id: " < < id ;
std : : cerr < < std : : endl ;
}
2007-11-14 22:18:48 -05:00
return 1 ;
}
2010-06-25 18:00:38 -04:00
int pqipersongrp : : tagHeartbeatRecvd ( std : : string id )
2009-12-13 16:59:26 -05:00
{
2010-06-25 18:00:38 -04:00
std : : map < std : : string , SearchModule * > : : iterator it ;
2009-12-13 16:59:26 -05:00
# ifdef PGRP_DEBUG
2010-06-25 18:00:38 -04:00
std : : cerr < < " pqipersongrp::tagHeartbeatRecvd() id: " < < id ;
std : : cerr < < std : : endl ;
2009-12-13 16:59:26 -05:00
# endif
2010-06-25 18:00:38 -04:00
RsStackMutex stack ( coreMtx ) ; /**************** LOCKED MUTEX ****************/
2009-12-13 16:59:26 -05:00
2010-06-25 18:00:38 -04:00
it = mods . find ( id ) ;
if ( it ! = mods . end ( ) )
{
SearchModule * mod = it - > second ;
pqiperson * p = ( pqiperson * ) mod - > pqi ;
p - > receiveHeartbeat ( ) ;
return 1 ;
}
return 0 ;
2009-12-13 16:59:26 -05:00
}
2010-06-25 18:00:38 -04:00
2010-10-07 07:17:42 -04:00
int pqipersongrp : : connectPeer ( std : : string id
# ifdef WINDOWS_SYS
///////////////////////////////////////////////////////////
// hack for too many connections
, bool bConnect /*= false*/
///////////////////////////////////////////////////////////
# endif
)
2007-11-14 22:18:48 -05:00
{
2008-01-25 01:36:40 -05:00
/* get status from p3connectMgr */
2008-07-09 05:55:09 -04:00
# ifdef PGRP_DEBUG
2008-01-25 01:36:40 -05:00
std : : cerr < < " pqipersongrp::connectPeer() id: " < < id < < " does nothing yet! " ;
std : : cerr < < std : : endl ;
2008-07-09 05:55:09 -04:00
# endif
2008-01-25 01:36:40 -05:00
2011-07-13 18:23:40 -04:00
{
RsStackMutex stack ( coreMtx ) ; /**************** LOCKED MUTEX ****************/
if ( id = = mLinkMgr - > getOwnId ( ) )
{
std : : cerr < < " pqipersongrp::connectPeer() ERROR Failed, connecting to own id. " < < std : : endl ;
2009-12-18 18:34:49 -05:00
# ifdef PGRP_DEBUG
2009-12-18 16:45:13 -05:00
# endif
return 0 ;
}
std : : map < std : : string , SearchModule * > : : iterator it ;
2008-01-25 01:36:40 -05:00
it = mods . find ( id ) ;
if ( it = = mods . end ( ) )
2007-11-14 22:18:48 -05:00
{
2008-01-25 01:36:40 -05:00
return 0 ;
2007-11-14 22:18:48 -05:00
}
2008-01-25 01:36:40 -05:00
/* get the connect attempt details from the p3connmgr... */
SearchModule * mod = it - > second ;
pqiperson * p = ( pqiperson * ) mod - > pqi ;
/* get address from p3connmgr */
2011-07-09 14:39:34 -04:00
if ( ! mLinkMgr )
2008-01-25 01:36:40 -05:00
return 0 ;
2010-10-07 07:17:42 -04:00
# ifdef WINDOWS_SYS
///////////////////////////////////////////////////////////
// hack for too many connections
if ( RsInit : : isWindowsXP ( ) ) {
/* the problem only exist in Windows XP */
if ( bConnect = = false ) {
/* check for id is waiting */
if ( std : : find ( waitingIds . begin ( ) , waitingIds . end ( ) , id ) ! = waitingIds . end ( ) ) {
/* id is waiting for a connection */
return 0 ;
}
/* add id to waiting */
waitingIds . push_back ( id ) ;
/* wait for call to connectPeer with empty id */
return 0 ;
}
/* remove id from waiting */
waitingIds . remove ( id ) ;
}
///////////////////////////////////////////////////////////
# endif
2008-01-25 01:36:40 -05:00
struct sockaddr_in addr ;
2008-02-26 21:32:20 -05:00
uint32_t delay ;
uint32_t period ;
2008-03-26 11:35:09 -04:00
uint32_t timeout ;
2008-01-25 01:36:40 -05:00
uint32_t type ;
2011-07-27 12:56:37 -04:00
uint32_t flags = 0 ;
2008-01-25 01:36:40 -05:00
2011-07-14 10:56:33 -04:00
struct sockaddr_in proxyaddr ;
struct sockaddr_in srcaddr ;
uint32_t bandwidth ;
if ( ! mLinkMgr - > connectAttempt ( id , addr , proxyaddr , srcaddr , delay , period , type , flags , bandwidth ) )
2008-01-28 00:40:32 -05:00
{
2008-07-09 05:55:09 -04:00
# ifdef PGRP_DEBUG
2008-01-28 00:40:32 -05:00
std : : cerr < < " pqipersongrp::connectPeer() No Net Address " ;
std : : cerr < < std : : endl ;
2008-07-09 05:55:09 -04:00
# endif
2008-01-28 00:40:32 -05:00
return 0 ;
}
2008-07-09 05:55:09 -04:00
# ifdef PGRP_DEBUG
2008-01-28 00:40:32 -05:00
std : : cerr < < " pqipersongrp::connectPeer() connectAttempt data id: " < < id ;
2010-07-10 16:34:03 -04:00
std : : cerr < < " addr: " < < rs_inet_ntoa ( addr . sin_addr ) < < " : " < < ntohs ( addr . sin_port ) ;
2008-02-26 21:32:20 -05:00
std : : cerr < < " delay: " < < delay ;
std : : cerr < < " period: " < < period ;
2008-01-28 00:40:32 -05:00
std : : cerr < < " type: " < < type ;
2011-07-13 18:23:40 -04:00
std : : cerr < < " flags: " < < flags ;
2008-01-28 00:40:32 -05:00
std : : cerr < < std : : endl ;
2008-07-09 05:55:09 -04:00
# endif
2008-01-28 00:40:32 -05:00
2008-01-25 01:36:40 -05:00
uint32_t ptype ;
if ( type & RS_NET_CONN_TCP_ALL )
{
ptype = PQI_CONNECT_TCP ;
2008-03-26 11:35:09 -04:00
timeout = RS_TCP_STD_TIMEOUT_PERIOD ;
2008-07-09 05:55:09 -04:00
# ifdef PGRP_DEBUG
2008-03-26 11:35:09 -04:00
std : : cerr < < " pqipersongrp::connectPeer() connecting with TCP: Timeout : " < < timeout ;
std : : cerr < < std : : endl ;
2008-07-09 05:55:09 -04:00
# endif
2008-01-25 01:36:40 -05:00
}
else if ( type & RS_NET_CONN_UDP_ALL )
2007-11-14 22:18:48 -05:00
{
2008-01-25 01:36:40 -05:00
ptype = PQI_CONNECT_UDP ;
2011-07-18 20:06:09 -04:00
timeout = period + RS_UDP_STD_TIMEOUT_PERIOD ; // Split of UNCERTAINTY + TIME FOR TTL to RISE to Connection.
2008-07-09 05:55:09 -04:00
# ifdef PGRP_DEBUG
2008-03-26 11:35:09 -04:00
std : : cerr < < " pqipersongrp::connectPeer() connecting with UDP: Timeout : " < < timeout ;
std : : cerr < < std : : endl ;
2009-12-13 16:59:26 -05:00
# endif
}
else if ( type & RS_NET_CONN_TUNNEL )
{
ptype = PQI_CONNECT_TUNNEL ;
timeout = period * 2 ;
# ifdef PGRP_DEBUG
2010-07-04 06:35:38 -04:00
std : : cerr < < " pqipersongrp::connectPeer() connecting with Tunnel: Timeout : " < < timeout ;
2009-12-13 16:59:26 -05:00
std : : cerr < < std : : endl ;
2008-07-09 05:55:09 -04:00
# endif
2007-11-14 22:18:48 -05:00
}
2008-01-25 01:36:40 -05:00
else
2010-07-04 06:35:38 -04:00
{
# ifdef PGRP_DEBUG
std : : cerr < < " pqipersongrp::connectPeer() Ignoring Unknown Type: " < < type ;
std : : cerr < < std : : endl ;
# endif
2008-01-25 01:36:40 -05:00
return 0 ;
2010-07-04 06:35:38 -04:00
}
2008-01-25 01:36:40 -05:00
2011-07-14 10:56:33 -04:00
p - > connect ( ptype , addr , proxyaddr , srcaddr , delay , period , timeout , flags , bandwidth ) ;
2008-01-25 01:36:40 -05:00
2008-11-22 08:15:07 -05:00
} /* UNLOCKED */
2008-01-25 01:36:40 -05:00
/* */
2007-11-14 22:18:48 -05:00
return 1 ;
}
2010-06-25 18:00:38 -04:00
bool pqipersongrp : : notifyConnect ( std : : string id , uint32_t ptype , bool success , struct sockaddr_in raddr )
2007-11-14 22:18:48 -05:00
{
2010-06-25 18:00:38 -04:00
uint32_t type = 0 ;
2008-03-26 11:35:09 -04:00
if ( ptype = = PQI_CONNECT_TCP )
{
type = RS_NET_CONN_TCP_ALL ;
}
2009-12-13 16:59:26 -05:00
else if ( ptype = = PQI_CONNECT_UDP )
2008-03-26 11:35:09 -04:00
{
type = RS_NET_CONN_UDP_ALL ;
}
2009-12-13 16:59:26 -05:00
else if ( ptype = = PQI_CONNECT_TUNNEL )
{
type = RS_NET_CONN_TUNNEL ;
}
2008-03-26 11:35:09 -04:00
2010-06-25 18:00:38 -04:00
2011-07-09 14:39:34 -04:00
if ( mLinkMgr )
mLinkMgr - > connectResult ( id , success , type , raddr ) ;
2008-01-25 01:36:40 -05:00
2011-07-09 14:39:34 -04:00
return ( NULL ! = mLinkMgr ) ;
2007-11-14 22:18:48 -05:00
}
2008-01-25 01:36:40 -05:00
/******************************** DUMMY Specific features ***************************/
2007-11-14 22:18:48 -05:00
2008-01-25 01:36:40 -05:00
# include "pqi/pqibin.h"
2007-11-14 22:18:48 -05:00
2008-01-25 01:36:40 -05:00
pqilistener * pqipersongrpDummy : : createListener ( struct sockaddr_in laddr )
2007-11-14 22:18:48 -05:00
{
2008-01-25 01:36:40 -05:00
pqilistener * listener = new pqilistener ( ) ;
return listener ;
2007-11-14 22:18:48 -05:00
}
2008-01-25 01:36:40 -05:00
pqiperson * pqipersongrpDummy : : createPerson ( std : : string id , pqilistener * listener )
2007-11-14 22:18:48 -05:00
{
{
2008-01-25 01:36:40 -05:00
std : : ostringstream out ;
out < < " pqipersongrpDummy::createPerson() PeerId: " < < id ;
pqioutput ( PQL_DEBUG_BASIC , pqipersongrpzone , out . str ( ) ) ;
2007-11-14 22:18:48 -05:00
}
2008-01-25 01:36:40 -05:00
pqiperson * pqip = new pqiperson ( id , this ) ;
2007-11-14 22:18:48 -05:00
2008-01-25 01:36:40 -05:00
// TCP
NetBinDummy * d1 = new NetBinDummy ( pqip , id , PQI_CONNECT_TCP ) ;
RsSerialiser * rss = new RsSerialiser ( ) ;
rss - > addSerialType ( new RsFileItemSerialiser ( ) ) ;
rss - > addSerialType ( new RsCacheItemSerialiser ( ) ) ;
rss - > addSerialType ( new RsServiceSerialiser ( ) ) ;
pqiconnect * pqic = new pqiconnect ( rss , d1 ) ;
pqip - > addChildInterface ( PQI_CONNECT_TCP , pqic ) ;
// UDP.
NetBinDummy * d2 = new NetBinDummy ( pqip , id , PQI_CONNECT_UDP ) ;
RsSerialiser * rss2 = new RsSerialiser ( ) ;
rss2 - > addSerialType ( new RsFileItemSerialiser ( ) ) ;
rss2 - > addSerialType ( new RsCacheItemSerialiser ( ) ) ;
rss2 - > addSerialType ( new RsServiceSerialiser ( ) ) ;
pqiconnect * pqic2 = new pqiconnect ( rss2 , d2 ) ;
pqip - > addChildInterface ( PQI_CONNECT_UDP , pqic2 ) ;
return pqip ;
2007-11-14 22:18:48 -05:00
}
2008-01-25 01:36:40 -05:00
/******************************** DUMMY Specific features ***************************/
2007-11-14 22:18:48 -05:00