1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
#include "LocalConnection.h"
#include <boost/format.hpp>
#include "Exception.h"
namespace netcode {
// static stuff
unsigned CLocalConnection::Instances = 0;
std::deque< boost::shared_ptr<const RawPacket> > CLocalConnection::Data[2];
boost::mutex CLocalConnection::Mutex[2];
CLocalConnection::CLocalConnection()
{
if (Instances > 1)
{
throw network_error("Opening a third local connection is not allowed");
}
instance = Instances;
Instances++;
}
CLocalConnection::~CLocalConnection()
{
Instances--;
}
void CLocalConnection::SendData(boost::shared_ptr<const RawPacket> data)
{
dataSent += data->length;
boost::mutex::scoped_lock scoped_lock(Mutex[OtherInstance()]);
Data[OtherInstance()].push_back(data);
}
boost::shared_ptr<const RawPacket> CLocalConnection::Peek(unsigned ahead) const
{
boost::mutex::scoped_lock scoped_lock(Mutex[instance]);
if (ahead < Data[instance].size())
return Data[instance][ahead];
else
{
boost::shared_ptr<const RawPacket> empty;
return empty;
}
}
boost::shared_ptr<const RawPacket> CLocalConnection::GetData()
{
boost::mutex::scoped_lock scoped_lock(Mutex[instance]);
if (!Data[instance].empty())
{
boost::shared_ptr<const RawPacket> next = Data[instance].front();
Data[instance].pop_front();
dataRecv += next->length;
return next;
}
else
{
boost::shared_ptr<const RawPacket> empty;
return empty;
}
}
void CLocalConnection::Flush(const bool forced)
{
}
bool CLocalConnection::CheckTimeout() const
{
return false;
}
std::string CLocalConnection::Statistics() const
{
std::string msg = "Statistics for local connection:\n";
msg += str( boost::format("Received: %1% bytes\n") %dataRecv );
msg += str( boost::format("Sent: %1% bytes\n") %dataSent );
return msg;
}
bool CLocalConnection::HasIncomingData() const
{
boost::mutex::scoped_lock scoped_lock(Mutex[instance]);
return (!Data[instance].empty());
}
unsigned CLocalConnection::OtherInstance() const
{
if (instance == 0)
return 1;
else
return 0;
}
} // namespace netcode
|