|
|
|
|
@ -38,45 +38,45 @@ std::string CGroupHandler::m_gateway;
|
|
|
|
|
std::list<CGroupHandler *> CGroupHandler::m_Groups;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CSGSUser::CSGSUser(const std::string &callsign, unsigned int timeout) :
|
|
|
|
|
CSGSXLUser::CSGSXLUser(const std::string &callsign, unsigned int timeout) :
|
|
|
|
|
m_callsign(callsign),
|
|
|
|
|
m_timer(1000U, timeout)
|
|
|
|
|
{
|
|
|
|
|
m_timer.start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CSGSUser::~CSGSUser()
|
|
|
|
|
CSGSXLUser::~CSGSXLUser()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CSGSUser::clock(unsigned int ms)
|
|
|
|
|
bool CSGSXLUser::clock(unsigned int ms)
|
|
|
|
|
{
|
|
|
|
|
m_timer.clock(ms);
|
|
|
|
|
|
|
|
|
|
return m_timer.isRunning() && m_timer.hasExpired();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CSGSUser::hasExpired()
|
|
|
|
|
bool CSGSXLUser::hasExpired()
|
|
|
|
|
{
|
|
|
|
|
return m_timer.isRunning() && m_timer.hasExpired();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CSGSUser::reset()
|
|
|
|
|
void CSGSXLUser::reset()
|
|
|
|
|
{
|
|
|
|
|
m_timer.start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string CSGSUser::getCallsign() const
|
|
|
|
|
std::string CSGSXLUser::getCallsign() const
|
|
|
|
|
{
|
|
|
|
|
return m_callsign;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CTimer CSGSUser::getTimer() const
|
|
|
|
|
CTimer CSGSXLUser::getTimer() const
|
|
|
|
|
{
|
|
|
|
|
return m_timer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CSGSId::CSGSId(unsigned int id, unsigned int timeout, CSGSUser *user) :
|
|
|
|
|
CSGSXLId::CSGSXLId(unsigned int id, unsigned int timeout, CSGSXLUser *user) :
|
|
|
|
|
m_id(id),
|
|
|
|
|
m_timer(1000U, timeout),
|
|
|
|
|
m_login(false),
|
|
|
|
|
@ -91,80 +91,80 @@ m_textCollector()
|
|
|
|
|
m_timer.start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CSGSId::~CSGSId()
|
|
|
|
|
CSGSXLId::~CSGSXLId()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unsigned int CSGSId::getId() const
|
|
|
|
|
unsigned int CSGSXLId::getId() const
|
|
|
|
|
{
|
|
|
|
|
return m_id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CSGSId::reset()
|
|
|
|
|
void CSGSXLId::reset()
|
|
|
|
|
{
|
|
|
|
|
m_timer.start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CSGSId::setLogin()
|
|
|
|
|
void CSGSXLId::setLogin()
|
|
|
|
|
{
|
|
|
|
|
m_login = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CSGSId::setInfo()
|
|
|
|
|
void CSGSXLId::setInfo()
|
|
|
|
|
{
|
|
|
|
|
if (!m_login && !m_logoff)
|
|
|
|
|
m_info = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CSGSId::setLogoff()
|
|
|
|
|
void CSGSXLId::setLogoff()
|
|
|
|
|
{
|
|
|
|
|
if (!m_login && !m_info)
|
|
|
|
|
m_logoff = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CSGSId::setEnd()
|
|
|
|
|
void CSGSXLId::setEnd()
|
|
|
|
|
{
|
|
|
|
|
m_end = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CSGSId::clock(unsigned int ms)
|
|
|
|
|
bool CSGSXLId::clock(unsigned int ms)
|
|
|
|
|
{
|
|
|
|
|
m_timer.clock(ms);
|
|
|
|
|
|
|
|
|
|
return m_timer.isRunning() && m_timer.hasExpired();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CSGSId::hasExpired()
|
|
|
|
|
bool CSGSXLId::hasExpired()
|
|
|
|
|
{
|
|
|
|
|
return m_timer.isRunning() && m_timer.hasExpired();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CSGSId::isLogin() const
|
|
|
|
|
bool CSGSXLId::isLogin() const
|
|
|
|
|
{
|
|
|
|
|
return m_login;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CSGSId::isInfo() const
|
|
|
|
|
bool CSGSXLId::isInfo() const
|
|
|
|
|
{
|
|
|
|
|
return m_info;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CSGSId::isLogoff() const
|
|
|
|
|
bool CSGSXLId::isLogoff() const
|
|
|
|
|
{
|
|
|
|
|
return m_logoff;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CSGSId::isEnd() const
|
|
|
|
|
bool CSGSXLId::isEnd() const
|
|
|
|
|
{
|
|
|
|
|
return m_end;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CSGSUser* CSGSId::getUser() const
|
|
|
|
|
CSGSXLUser* CSGSXLId::getUser() const
|
|
|
|
|
{
|
|
|
|
|
return m_user;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CTextCollector& CSGSId::getTextCollector()
|
|
|
|
|
CTextCollector& CSGSXLId::getTextCollector()
|
|
|
|
|
{
|
|
|
|
|
return m_textCollector;
|
|
|
|
|
}
|
|
|
|
|
@ -262,7 +262,7 @@ CRemoteGroup *CGroupHandler::getInfo() const
|
|
|
|
|
CRemoteGroup *data = new CRemoteGroup(m_groupCallsign, m_offCallsign, m_repeater, m_infoText, m_linkReflector, m_linkStatus, m_userTimeout);
|
|
|
|
|
|
|
|
|
|
for (auto it=m_users.begin(); it!=m_users.end(); ++it) {
|
|
|
|
|
CSGSUser* user = it->second;
|
|
|
|
|
CSGSXLUser* user = it->second;
|
|
|
|
|
data->addUser(user->getCallsign(), user->getTimer().getTimer(), user->getTimer().getTimeout());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -369,7 +369,7 @@ void CGroupHandler::process(CHeaderData &header)
|
|
|
|
|
std::string your = header.getYourCall();
|
|
|
|
|
unsigned int id = header.getId();
|
|
|
|
|
|
|
|
|
|
CSGSUser *group_user = m_users[my]; // if not found, m_user[my] will be created and its value will be set to NULL
|
|
|
|
|
CSGSXLUser *group_user = m_users[my]; // if not found, m_user[my] will be created and its value will be set to NULL
|
|
|
|
|
bool islogin = false;
|
|
|
|
|
|
|
|
|
|
// Ensure that this user is in the cache.
|
|
|
|
|
@ -383,13 +383,13 @@ void CGroupHandler::process(CHeaderData &header)
|
|
|
|
|
if (group_user == NULL) {
|
|
|
|
|
printf("Adding %s to Smart Group %s\n", my.c_str(), your.c_str());
|
|
|
|
|
// This is a new user, add him to the list
|
|
|
|
|
group_user = new CSGSUser(my, m_userTimeout * 60U);
|
|
|
|
|
group_user = new CSGSXLUser(my, m_userTimeout * 60U);
|
|
|
|
|
m_users[my] = group_user;
|
|
|
|
|
|
|
|
|
|
logUser(LU_ON, your, my); // inform Quadnet
|
|
|
|
|
|
|
|
|
|
// add a new Id for this message
|
|
|
|
|
CSGSId* tx = new CSGSId(id, MESSAGE_DELAY, group_user);
|
|
|
|
|
CSGSXLId* tx = new CSGSXLId(id, MESSAGE_DELAY, group_user);
|
|
|
|
|
tx->setLogin();
|
|
|
|
|
m_ids[id] = tx;
|
|
|
|
|
islogin = true;
|
|
|
|
|
@ -397,7 +397,7 @@ void CGroupHandler::process(CHeaderData &header)
|
|
|
|
|
group_user->reset();
|
|
|
|
|
|
|
|
|
|
// Check that it isn't a duplicate header
|
|
|
|
|
CSGSId* tx = m_ids[id];
|
|
|
|
|
CSGSXLId* tx = m_ids[id];
|
|
|
|
|
if (tx) {
|
|
|
|
|
//printf("Duplicate header from %s, deleting userData...\n", my.c_str());
|
|
|
|
|
delete userData;
|
|
|
|
|
@ -405,7 +405,7 @@ void CGroupHandler::process(CHeaderData &header)
|
|
|
|
|
}
|
|
|
|
|
//printf("Updating %s on Smart Group %s\n", my.c_str(), your.c_str());
|
|
|
|
|
logUser(LU_ON, your, my); // this will be an update
|
|
|
|
|
m_ids[id] = new CSGSId(id, MESSAGE_DELAY, group_user);
|
|
|
|
|
m_ids[id] = new CSGSXLId(id, MESSAGE_DELAY, group_user);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// unsubscribe was sent by someone
|
|
|
|
|
@ -425,7 +425,7 @@ void CGroupHandler::process(CHeaderData &header)
|
|
|
|
|
// Remove the user from the user list
|
|
|
|
|
m_users.erase(my);
|
|
|
|
|
|
|
|
|
|
CSGSId* tx = new CSGSId(id, MESSAGE_DELAY, group_user);
|
|
|
|
|
CSGSXLId* tx = new CSGSXLId(id, MESSAGE_DELAY, group_user);
|
|
|
|
|
tx->setLogoff();
|
|
|
|
|
m_ids[id] = tx;
|
|
|
|
|
|
|
|
|
|
@ -467,7 +467,7 @@ void CGroupHandler::process(CHeaderData &header)
|
|
|
|
|
|
|
|
|
|
// Build new repeater list, based on users that are currently logged in
|
|
|
|
|
for (auto it = m_users.begin(); it != m_users.end(); ++it) {
|
|
|
|
|
CSGSUser *user = it->second;
|
|
|
|
|
CSGSXLUser *user = it->second;
|
|
|
|
|
if (user != NULL) {
|
|
|
|
|
// Find the user in the cache
|
|
|
|
|
userData = m_cache->findUser(user->getCallsign());
|
|
|
|
|
@ -518,13 +518,13 @@ void CGroupHandler::process(CAMBEData &data)
|
|
|
|
|
{
|
|
|
|
|
unsigned int id = data.getId();
|
|
|
|
|
|
|
|
|
|
CSGSId* tx = m_ids[id];
|
|
|
|
|
CSGSXLId* tx = m_ids[id];
|
|
|
|
|
if (tx == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
tx->reset();
|
|
|
|
|
|
|
|
|
|
CSGSUser* user = tx->getUser();
|
|
|
|
|
CSGSXLUser* user = tx->getUser();
|
|
|
|
|
user->reset();
|
|
|
|
|
|
|
|
|
|
// If we've just logged in, the LOGOFF and INFO commands are disabled
|
|
|
|
|
@ -606,7 +606,7 @@ bool CGroupHandler::logoff(const std::string &callsign)
|
|
|
|
|
{
|
|
|
|
|
if (0 == callsign.compare("ALL ")) {
|
|
|
|
|
for (auto it = m_users.begin(); it != m_users.end(); ++it) {
|
|
|
|
|
CSGSUser* user = it->second;
|
|
|
|
|
CSGSXLUser* user = it->second;
|
|
|
|
|
if (user) {
|
|
|
|
|
printf("Removing %s from Smart Group %s, logged off by remote control\n", user->getCallsign().c_str(), m_groupCallsign.c_str());
|
|
|
|
|
logUser(LU_OFF, m_groupCallsign, user->getCallsign()); // inform Quadnet
|
|
|
|
|
@ -628,7 +628,7 @@ bool CGroupHandler::logoff(const std::string &callsign)
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
CSGSUser* user = m_users[callsign];
|
|
|
|
|
CSGSXLUser* user = m_users[callsign];
|
|
|
|
|
if (user == NULL) {
|
|
|
|
|
printf("Invalid callsign asked to logoff");
|
|
|
|
|
return false;
|
|
|
|
|
@ -639,7 +639,7 @@ bool CGroupHandler::logoff(const std::string &callsign)
|
|
|
|
|
// Find any associated id structure associated with this use, and the logged off user is the
|
|
|
|
|
// currently relayed one, remove his id.
|
|
|
|
|
for (auto it = m_ids.begin(); it != m_ids.end(); ++it) {
|
|
|
|
|
CSGSId* id = it->second;
|
|
|
|
|
CSGSXLId* id = it->second;
|
|
|
|
|
if (id != NULL && id->getUser() == user) {
|
|
|
|
|
if (id->getId() == m_id)
|
|
|
|
|
m_id = 0x00U;
|
|
|
|
|
@ -692,7 +692,7 @@ bool CGroupHandler::process(CHeaderData &header, DIRECTION, AUDIO_SOURCE)
|
|
|
|
|
|
|
|
|
|
// Build new repeater list
|
|
|
|
|
for (auto it = m_users.begin(); it != m_users.end(); ++it) {
|
|
|
|
|
CSGSUser* user = it->second;
|
|
|
|
|
CSGSXLUser* user = it->second;
|
|
|
|
|
if (user) {
|
|
|
|
|
// Find the user in the cache
|
|
|
|
|
CUserData* userData = m_cache->findUser(user->getCallsign());
|
|
|
|
|
@ -729,7 +729,7 @@ bool CGroupHandler::process(CHeaderData &header, DIRECTION, AUDIO_SOURCE)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CSGSId *tx = m_ids[m_id];
|
|
|
|
|
CSGSXLId *tx = m_ids[m_id];
|
|
|
|
|
if (tx) {
|
|
|
|
|
if (!tx->isLogin())
|
|
|
|
|
sendToRepeaters(header);
|
|
|
|
|
@ -750,7 +750,7 @@ bool CGroupHandler::process(CAMBEData &data, DIRECTION, AUDIO_SOURCE)
|
|
|
|
|
|
|
|
|
|
m_linkTimer.start();
|
|
|
|
|
|
|
|
|
|
CSGSId *tx = m_ids[id];
|
|
|
|
|
CSGSXLId *tx = m_ids[id];
|
|
|
|
|
if (tx) {
|
|
|
|
|
if (!tx->isLogin())
|
|
|
|
|
sendToRepeaters(data);
|
|
|
|
|
@ -848,7 +848,7 @@ void CGroupHandler::clockInt(unsigned int ms)
|
|
|
|
|
|
|
|
|
|
// For each incoming id
|
|
|
|
|
for (auto it = m_ids.begin(); it != m_ids.end(); ++it) {
|
|
|
|
|
CSGSId* tx = it->second;
|
|
|
|
|
CSGSXLId* tx = it->second;
|
|
|
|
|
|
|
|
|
|
if (tx != NULL && tx->clock(ms)) {
|
|
|
|
|
std::string callsign = tx->getUser()->getCallsign();
|
|
|
|
|
@ -908,7 +908,7 @@ void CGroupHandler::clockInt(unsigned int ms)
|
|
|
|
|
|
|
|
|
|
// Individual user expiry, but not for the permanent entries
|
|
|
|
|
for (auto it = m_users.begin(); it != m_users.end(); ++it) {
|
|
|
|
|
CSGSUser* user = it->second;
|
|
|
|
|
CSGSXLUser* user = it->second;
|
|
|
|
|
if (user && m_permanent.find(user->getCallsign()) == m_permanent.end())
|
|
|
|
|
user->clock(ms);
|
|
|
|
|
}
|
|
|
|
|
@ -919,7 +919,7 @@ void CGroupHandler::clockInt(unsigned int ms)
|
|
|
|
|
|
|
|
|
|
// Individual user expiry
|
|
|
|
|
for (auto it = m_users.begin(); it != m_users.end(); ++it) {
|
|
|
|
|
CSGSUser* user = it->second;
|
|
|
|
|
CSGSXLUser* user = it->second;
|
|
|
|
|
if (user && user->hasExpired()) {
|
|
|
|
|
printf("Removing %s from Smart Group %s, user timeout\n", user->getCallsign().c_str(), m_groupCallsign.c_str());
|
|
|
|
|
|
|
|
|
|
|