mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
124 lines
2.9 KiB
C++
124 lines
2.9 KiB
C++
|
/*
|
||
|
* "$Id: p3PortService.cc,v 1.24 2007-05-05 16:10:06 rmf24 Exp $"
|
||
|
*
|
||
|
* Other Bits for RetroShare.
|
||
|
*
|
||
|
* Copyright 2004-2006 by Robert Fernie.
|
||
|
*
|
||
|
* 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 "services/p3portservice.h"
|
||
|
#include "serialiser/rsserviceids.h"
|
||
|
|
||
|
p3PortService::p3PortService(p3ConnectMgr *cm)
|
||
|
:p3Service(RS_SERVICE_TYPE_PORT), mConnMgr(cm), mEnabled(false)
|
||
|
{
|
||
|
/* For Version 1, we'll just use the very simple RsRawItem packets
|
||
|
* which are handled in the RsServiceSerialiser
|
||
|
*/
|
||
|
addSerialType(new RsServiceSerialiser());
|
||
|
}
|
||
|
|
||
|
int p3PortService::tick()
|
||
|
{
|
||
|
#ifdef PORT_DEBUG
|
||
|
std::cerr << "p3PortService::tick()";
|
||
|
std::cerr << std::endl;
|
||
|
#endif
|
||
|
|
||
|
/* discard data if not enabled */
|
||
|
if (!mEnabled)
|
||
|
{
|
||
|
RsItem *i;
|
||
|
while(NULL != (i = recvItem()))
|
||
|
{
|
||
|
delete i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Rough list of what might happen (once the sockets are opened!) */
|
||
|
|
||
|
|
||
|
/* check for data on sockets */
|
||
|
int sockfd;
|
||
|
RsRawItem *item;
|
||
|
|
||
|
//while(0 < (len = recv(sockfd, ....))) ... etc.
|
||
|
{
|
||
|
|
||
|
/* example of how to package data up
|
||
|
* We use RsRawItem as it'll handle a single binary chunk.
|
||
|
* This is enough for version 1.... but versions 2 + 3 will
|
||
|
* need their own serialiser.
|
||
|
*
|
||
|
* */
|
||
|
|
||
|
/* input data TODO! */
|
||
|
void *data;
|
||
|
uint32_t len;
|
||
|
|
||
|
uint32_t packetId = (((uint32_t) RS_PKT_VERSION_SERVICE) << 24) +
|
||
|
(((uint32_t) RS_SERVICE_TYPE_PORT) << 8);
|
||
|
|
||
|
/* create Packet for RS Transport */
|
||
|
RsRawItem *item = new RsRawItem(packetId, len);
|
||
|
void *item_data = item->getRawData();
|
||
|
memcpy(item_data, data, len);
|
||
|
|
||
|
/* set the correct peer destination. */
|
||
|
item->PeerId(mPeerId);
|
||
|
|
||
|
/* send data */
|
||
|
sendItem(item);
|
||
|
|
||
|
/* no delete -> packet cleaned up by RS internals */
|
||
|
}
|
||
|
|
||
|
|
||
|
/* get any incoming data */
|
||
|
while(NULL != (item = (RsRawItem*) recvItem()))
|
||
|
{
|
||
|
/* unpackage data */
|
||
|
std::string src = item->PeerId();
|
||
|
void *item_data = item->getRawData();
|
||
|
uint32_t item_len = item->getRawLength();
|
||
|
|
||
|
/* push out to the socket .... */
|
||
|
// send(sockfd, item_len, item_data....)
|
||
|
|
||
|
/* cleanup packet */
|
||
|
delete item;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
bool p3PortService::enablePortForwarding(uint32_t port, std::string peerId)
|
||
|
{
|
||
|
mPort = port;
|
||
|
mPeerId = peerId;
|
||
|
mEnabled = true;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
|