xlxd v1.4.2 / db v2.3.4

This commit is contained in:
LX3JL 2017-02-02 16:37:38 +01:00
parent ae8477ba53
commit edde49c1af
20 changed files with 274 additions and 88 deletions

View file

@ -176,37 +176,48 @@ CPacketStream *CReflector::OpenStream(CDvHeaderPacket *DvHeader, CClient *client
// check if client is valid candidate
if ( m_Clients.IsClient(client) && !client->IsAMaster() )
{
// get the module's queue
char module = DvHeader->GetRpt2Module();
CPacketStream *stream = GetStream(module);
if ( stream != NULL )
// check if no stream with same streamid already open
// to prevent loops
if ( !IsStreamOpen(DvHeader) )
{
// lock it
stream->Lock();
// is it available ?
if ( stream->Open(*DvHeader, client) )
// get the module's queue
char module = DvHeader->GetRpt2Module();
CPacketStream *stream = GetStream(module);
if ( stream != NULL )
{
// stream open, mark client as master
// so that it can't be deleted
client->SetMasterOfModule(module);
// lock it
stream->Lock();
// is it available ?
if ( stream->Open(*DvHeader, client) )
{
// stream open, mark client as master
// so that it can't be deleted
client->SetMasterOfModule(module);
// update last heard time
client->Heard();
retStream = stream;
// update last heard time
client->Heard();
retStream = stream;
// and push header packet
stream->Push(DvHeader);
// and push header packet
stream->Push(DvHeader);
// report
std::cout << "Opening stream on module " << module << " for client " << client->GetCallsign()
<< " with sid " << DvHeader->GetStreamId() << std::endl;
// report
std::cout << "Opening stream on module " << module << " for client " << client->GetCallsign()
<< " with sid " << DvHeader->GetStreamId() << std::endl;
// notify
g_Reflector.OnStreamOpen(stream->GetUserCallsign());
// notify
g_Reflector.OnStreamOpen(stream->GetUserCallsign());
}
// unlock now
stream->Unlock();
}
// unlock now
stream->Unlock();
}
else
{
// report
std::cout << "Detected stream loop on module " << DvHeader->GetRpt2Module() << " for client " << client->GetCallsign()
<< " with sid " << DvHeader->GetStreamId() << std::endl;
}
}
@ -525,6 +536,17 @@ CPacketStream *CReflector::GetStream(char module)
return stream;
}
bool CReflector::IsStreamOpen(const CDvHeaderPacket *DvHeader)
{
bool open = false;
for ( int i = 0; (i < m_Streams.size()) && !open; i++ )
{
open = ( (m_Streams[i].GetStreamId() == DvHeader->GetStreamId()) &&
(m_Streams[i].IsOpen()));
}
return open;
}
char CReflector::GetStreamModule(CPacketStream *stream)
{
char module = ' ';