void CDPlusHandler::writeHeaderInt(IReflectorCallback* handler, CHeaderData& header, DIRECTION direction) { wxASSERT(handler != NULL); if (m_linkState != DPLUS_LINKED) return; if (direction != m_direction) return; // Already is use? if (m_dPlusId != 0x00U) return; switch (m_direction) { case DIR_OUTGOING: if (m_destination == handler) { header.setRepeaters(m_callsign, m_reflector); header.setDestination(m_yourAddress, m_yourPort); m_handler->writeHeader(header); m_rptrId = header.getId(); } break; case DIR_INCOMING: header.setDestination(m_yourAddress, m_yourPort); m_handler->writeHeader(header); break; } }
void CXReflectorDPlusHandler::processInt(CHeaderData& header) { wxString rpt1 = header.getRptCall1(); wxString rpt2 = header.getRptCall2(); unsigned int id = header.getId(); if (!m_linked) return; // Convert the callsign(s) from the DPlus call to the repeater call wxString rpt = m_dplusCallsign; wxChar band = rpt2.GetChar(LONG_CALLSIGN_LENGTH - 1U); rpt.SetChar(LONG_CALLSIGN_LENGTH - 1U, band); // Check the destination callsign m_destination = CXReflectorReflectorHandler::findReflector(rpt); if (m_destination == NULL) { band = rpt1.GetChar(LONG_CALLSIGN_LENGTH - 1U); rpt.SetChar(LONG_CALLSIGN_LENGTH - 1U, band); m_destination = CXReflectorReflectorHandler::findReflector(rpt); if (m_destination == NULL) { wxLogMessage(wxT("Incoming unmatched D-Plus header, RPT1=%s, RPT2=%s"), rpt1.c_str(), rpt2.c_str()); return; } } if (m_dPlusId != 0x00) return; m_dPlusId = id; m_inactivityTimer.start(); m_pollInactivityTimer.reset(); header.setCQCQCQ(); header.setFlag1(0x00U); bool ret = m_destination->process(m_dPlusId, header); // Write to Users.log if it's enabled if (ret && m_userLogger != NULL) m_userLogger->write(header.getMyCall1(), header.getRptCall2(), m_reflector, PROTO_DPLUS); }
void CDExtraHandler::writeHeaderInt(const wxString& callsign, CHeaderData& header, DIRECTION direction) { if (m_linkState != DEXTRA_LINKED) return; // Is it link in the right direction if (m_direction != direction) return; // Reject on invalid callsign if not a dongle link if (!m_repeater.IsEmpty()) { // Do the callsigns match? if (!callsign.IsSameAs(m_repeater)) return; } // Already in use? if (m_dExtraId != 0x00) return; header.setDestination(m_address, m_port); m_handler->writeHeader(header); m_rptrId = header.getId(); }
void CG2Handler::process(CHeaderData& header) { // Is this a busy reply? unsigned char flag1 = header.getFlag1(); if (flag1 == 0x01) { // Don't check the incoming stream // wxLogMessage(wxT("G2 busy message received")); return; } // Check to see if this is for StarNet CStarNetHandler* handler = CStarNetHandler::findStarNet(header); if (handler != NULL) { // Write to Header.log if it's enabled if (m_headerLogger != NULL) m_headerLogger->write(wxT("StarNet"), header); handler->process(header); return; } // No need to go any further if (m_maxRoutes == 0U) return; in_addr address = header.getYourAddress(); unsigned int id = header.getId(); for (unsigned int i = 0U; i < m_maxRoutes; i++) { CG2Handler* route = m_routes[i]; if (route != NULL) { // Is this a duplicate header, ignore it if (route->m_id == id) return; } } // Find the destination repeater CRepeaterHandler* repeater = CRepeaterHandler::findDVRepeater(header.getRptCall2()); if (repeater == NULL) { wxLogMessage(wxT("Incoming G2 header from %s to unknown repeater - %s"), header.getMyCall1().c_str(), header.getRptCall2().c_str()); return; // Not found, ignore } CG2Handler* route = new CG2Handler(repeater, address, id); for (unsigned int i = 0U; i < m_maxRoutes; i++) { if (m_routes[i] == NULL) { m_routes[i] = route; // Write to Header.log if it's enabled if (m_headerLogger != NULL) m_headerLogger->write(wxT("G2"), header); repeater->process(header, DIR_INCOMING, AS_G2); return; } } wxLogMessage(wxT("No space to add new G2 route, ignoring")); delete route; }
bool CStarNetHandler::process(CHeaderData &header, AUDIO_SOURCE source) { if (m_id != 0x00U) return false; wxString my = header.getMyCall1(); m_id = header.getId(); m_linkTimer.start(); // Change the Your callsign to CQCQCQ header.setCQCQCQ(); header.setFlag1(0x00); header.setFlag2(0x00); header.setFlag3(0x00); // Build new repeater list for (CStarNetUsersHashMap::const_iterator it = m_users.begin(); it != m_users.end(); ++it) { CStarNetUser* user = it->second; if (user != NULL) { // Find the user in the cache CUserData* userData = m_cache->findUser(user->getCallsign()); if (userData != NULL) { // Find the users repeater in the repeater list, add it otherwise CStarNetRepeater* repeater = m_repeaters[userData->getRepeater()]; if (repeater == NULL) { // Add a new repeater entry repeater = new CStarNetRepeater; repeater->m_destination = wxT("/") + userData->getRepeater().Left(6U) + userData->getRepeater().Right(1U); repeater->m_repeater = userData->getRepeater(); repeater->m_gateway = userData->getGateway(); repeater->m_address = userData->getAddress(); repeater->m_local = CRepeaterHandler::findDVRepeater(userData->getRepeater()); m_repeaters[userData->getRepeater()] = repeater; } delete userData; userData = NULL; } } } switch (m_callsignSwitch) { case SCS_GROUP_CALLSIGN: // Change the My Callsign 1 to be that of the StarNet group header.setMyCall1(m_groupCallsign); header.setMyCall2(wxT("SNET")); break; case SCS_USER_CALLSIGN: // Change the My Callsign 2 to be that of the StarNet group header.setMyCall1(my); header.setMyCall2(m_shortCallsign); break; default: break; } sendToRepeaters(header); if (m_txMsgSwitch) sendFromText(my); return true; }
void CStarNetHandler::process(CHeaderData &header) { wxString my = header.getMyCall1(); wxString your = header.getYourCall(); unsigned int id = header.getId(); CStarNetUser* user = m_users[my]; // Ensure that this user is in the cache CUserData* userData = m_cache->findUser(my); if (userData == NULL) m_irc->findUser(my); if (your.IsSameAs(m_groupCallsign)) { // This is a normal message for logging in/relaying if (user == NULL) { // This is a new user, add them to the list if (m_logFile != NULL) { time_t timeNow = ::time(NULL); struct tm* tm = ::gmtime(&timeNow); wxString text; text.Printf(wxT("%04d-%02d-%02d %02d:%02d:%02d: Adding %s to StarNet group %s\n"), tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, my.c_str(), m_groupCallsign.c_str()); m_logFile->Write(text); m_logFile->Flush(); } // Start the StarNet group timer if not already running if (!m_groupTimer.isRunning()) m_groupTimer.start(); user = new CStarNetUser(my, m_userTimeout * 60U); m_users[my] = user; CStarNetId* tx = new CStarNetId(id, MESSAGE_DELAY, user); tx->setLogin(); m_ids[id] = tx; } else { user->reset(); // Check that it isn't a duplicate header CStarNetId* tx = m_ids[id]; if (tx != NULL) { delete userData; return; } m_ids[id] = new CStarNetId(id, MESSAGE_DELAY, user); } } else { delete userData; userData = NULL; // This is a logoff message if (user == NULL) // Not a known user, ignore return; if (m_logFile != NULL) { time_t timeNow = ::time(NULL); struct tm* tm = ::gmtime(&timeNow); wxString text; text.Printf(wxT("%04d-%02d-%02d %02d:%02d:%02d: Removing %s from StarNet group %s, logged off\n"), tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, user->getCallsign().c_str(), m_groupCallsign.c_str()); m_logFile->Write(text); m_logFile->Flush(); } // Remove the user from the user list m_users.erase(my); CStarNetId* tx = new CStarNetId(id, MESSAGE_DELAY, user); tx->setLogoff(); m_ids[id] = tx; return; } m_groupTimer.reset(); if (m_id != 0x00U) { delete userData; return; } m_id = id; // Change the Your callsign to CQCQCQ header.setCQCQCQ(); header.setFlag1(0x00); header.setFlag2(0x00); header.setFlag3(0x00); #if defined(DEXTRA_LINK) header.setRepeaters(m_linkGateway, m_linkReflector); CDExtraHandler::writeHeader(this, header, DIR_OUTGOING); #endif #if defined(DCS_LINK) header.setRepeaters(m_linkGateway, m_linkReflector); CDCSHandler::writeHeader(this, header, DIR_OUTGOING); #endif // Get the home repeater of the user wxString exclude; if (userData != NULL) { exclude = userData->getRepeater(); delete userData; userData = NULL; } // Build new repeater list for (CStarNetUsersHashMap::const_iterator it = m_users.begin(); it != m_users.end(); ++it) { CStarNetUser* user = it->second; if (user != NULL) { // Find the user in the cache CUserData* userData = m_cache->findUser(user->getCallsign()); if (userData != NULL) { // Check for the excluded repeater if (!userData->getRepeater().IsSameAs(exclude)) { // Find the users repeater in the repeater list, add it otherwise CStarNetRepeater* repeater = m_repeaters[userData->getRepeater()]; if (repeater == NULL) { // Add a new repeater entry repeater = new CStarNetRepeater; repeater->m_destination = wxT("/") + userData->getRepeater().Left(6U) + userData->getRepeater().Right(1U); repeater->m_repeater = userData->getRepeater(); repeater->m_gateway = userData->getGateway(); repeater->m_address = userData->getAddress(); repeater->m_local = CRepeaterHandler::findDVRepeater(userData->getRepeater()); m_repeaters[userData->getRepeater()] = repeater; } } delete userData; userData = NULL; } } } switch (m_callsignSwitch) { case SCS_GROUP_CALLSIGN: // Change the My Callsign 1 to be that of the StarNet group header.setMyCall1(m_groupCallsign); header.setMyCall2(wxT("SNET")); break; case SCS_USER_CALLSIGN: // Change the My Callsign 2 to be that of the StarNet group header.setMyCall1(my); header.setMyCall2(m_shortCallsign); break; default: break; } sendToRepeaters(header); if (m_txMsgSwitch) sendFromText(my); }
void CDExtraHandler::processInt(CHeaderData& header) { unsigned int id = header.getId(); wxString rpt1 = header.getRptCall1(); wxString rpt2 = header.getRptCall2(); if (m_linkState != DEXTRA_LINKED) return; switch (m_direction) { case DIR_OUTGOING: { // Always a repeater connection if (!m_reflector.IsSameAs(rpt2) && !m_reflector.IsSameAs(rpt1)) return; // If we're already processing, ignore the new header if (m_dExtraId != 0x00U) return; // Write to Header.log if it's enabled if (m_headerLogger != NULL) m_headerLogger->write(wxT("DExtra"), header); m_dExtraId = id; m_dExtraSeq = 0x00U; m_inactivityTimer.start(); delete m_header; m_header = new CHeaderData(header); m_header->setCQCQCQ(); m_header->setFlags(0x00U, 0x00U, 0x00U); m_destination->process(*m_header, AS_DEXTRA); } break; case DIR_INCOMING: if (!m_repeater.IsEmpty()) { // A repeater connection if (!m_repeater.IsSameAs(rpt2) && !m_repeater.IsSameAs(rpt1)) return; // If we're already processing, ignore the new header if (m_dExtraId != 0x00U) return; // Write to Header.log if it's enabled if (m_headerLogger != NULL) m_headerLogger->write(wxT("DExtra"), header); m_dExtraId = id; m_dExtraSeq = 0x00U; m_inactivityTimer.start(); delete m_header; m_header = new CHeaderData(header); m_header->setCQCQCQ(); m_header->setFlags(0x00U, 0x00U, 0x00U); m_destination->process(*m_header, AS_DEXTRA); } else { // A Dongle connection // Check the destination callsign m_destination = CRepeaterHandler::findDVRepeater(rpt2); if (m_destination == NULL) { m_destination = CRepeaterHandler::findDVRepeater(rpt1); if (m_destination == NULL) return; } // If we're already processing, ignore the new header if (m_dExtraId != 0x00U) return; // Write to Header.log if it's enabled if (m_headerLogger != NULL) m_headerLogger->write(wxT("DExtra"), header); m_dExtraId = id; m_dExtraSeq = 0x00U; m_inactivityTimer.start(); delete m_header; m_header = new CHeaderData(header); m_header->setCQCQCQ(); m_header->setFlags(0x00U, 0x00U, 0x00U); m_destination->process(*m_header, AS_DEXTRA); } break; } }
void CDPlusHandler::processInt(CHeaderData& header) { wxString rpt1 = header.getRptCall1(); wxString rpt2 = header.getRptCall2(); unsigned int id = header.getId(); if (m_linkState != DPLUS_LINKED) return; switch (m_direction) { case DIR_OUTGOING: if (m_reflector.IsSameAs(rpt1) || m_reflector.IsSameAs(rpt2)) { // If we're already processing, ignore the new header if (m_dPlusId != 0x00U) return; // Write to Header.log if it's enabled if (m_headerLogger != NULL) m_headerLogger->write(wxT("DPlus"), header); m_dPlusId = id; m_dPlusSeq = 0x00U; m_inactivityTimer.start(); m_pollInactivityTimer.reset(); delete m_header; m_header = new CHeaderData(header); m_header->setCQCQCQ(); m_header->setFlags(0x00U, 0x00U, 0x00U); m_destination->process(*m_header, AS_DPLUS); } break; case DIR_INCOMING: { m_destination = CRepeaterHandler::findDVRepeater(rpt1); if (m_destination == NULL) { m_destination = CRepeaterHandler::findDVRepeater(rpt2); if (m_destination == NULL) return; } if (m_dPlusId != 0x00U) return; // Write to Header.log if it's enabled if (m_headerLogger != NULL) m_headerLogger->write(wxT("DPlus"), header); m_dPlusId = id; m_dPlusSeq = 0x00U; m_inactivityTimer.start(); m_pollInactivityTimer.reset(); delete m_header; m_header = new CHeaderData(header); m_header->setCQCQCQ(); m_header->setFlags(0x00U, 0x00U, 0x00U); m_destination->process(*m_header, AS_DPLUS); } break; } }