mirror of
https://github.com/LX3JL/xlxd.git
synced 2026-04-07 23:43:43 +00:00
xlxd v1.4.2 / db v2.3.4
This commit is contained in:
parent
ae8477ba53
commit
edde49c1af
20 changed files with 274 additions and 88 deletions
|
|
@ -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 = ' ';
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue