diff --git a/Conf.cpp b/Conf.cpp index 02ac32b..7323979 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -81,6 +81,7 @@ m_dmrNetwork1TGRewrites(), m_dmrNetwork1PCRewrites(), m_dmrNetwork1TypeRewrites(), m_dmrNetwork1SrcRewrites(), +m_dmrNetwork1IdRewrites(), m_dmrNetwork1PassAllPC(), m_dmrNetwork1PassAllTG(), m_dmrNetwork2Enabled(false), @@ -97,6 +98,7 @@ m_dmrNetwork2TGRewrites(), m_dmrNetwork2PCRewrites(), m_dmrNetwork2TypeRewrites(), m_dmrNetwork2SrcRewrites(), +m_dmrNetwork2IdRewrites(), m_dmrNetwork2PassAllPC(), m_dmrNetwork2PassAllTG(), m_dmrNetwork3Enabled(false), @@ -113,6 +115,7 @@ m_dmrNetwork3TGRewrites(), m_dmrNetwork3PCRewrites(), m_dmrNetwork3TypeRewrites(), m_dmrNetwork3SrcRewrites(), +m_dmrNetwork3IdRewrites(), m_dmrNetwork3PassAllPC(), m_dmrNetwork3PassAllTG(), m_dmrNetwork4Enabled(false), @@ -129,6 +132,7 @@ m_dmrNetwork4TGRewrites(), m_dmrNetwork4PCRewrites(), m_dmrNetwork4TypeRewrites(), m_dmrNetwork4SrcRewrites(), +m_dmrNetwork4IdRewrites(), m_dmrNetwork4PassAllPC(), m_dmrNetwork4PassAllTG(), m_xlxNetworkEnabled(false), @@ -376,6 +380,15 @@ bool CConf::read() rewrite.m_range = ::atoi(p5); m_dmrNetwork1SrcRewrites.push_back(rewrite); } + } else if (::strncmp(key, "IdRewrite", 9U) == 0) { + char* rfId = ::strtok(value, ", "); + char* netId = ::strtok(NULL, " \r\n"); + if (rfId != NULL && netId != NULL) { + CIdRewriteStruct rewrite; + rewrite.m_rfId = ::atoi(rfId); + rewrite.m_netId = ::atoi(netId); + m_dmrNetwork1IdRewrites.push_back(rewrite); + } } else if (::strncmp(key, "PassAllPC", 9U) == 0) { unsigned int slotNo = (unsigned int)::atoi(value); m_dmrNetwork1PassAllPC.push_back(slotNo); @@ -462,6 +475,15 @@ bool CConf::read() rewrite.m_range = ::atoi(p5); m_dmrNetwork2SrcRewrites.push_back(rewrite); } + } else if (::strncmp(key, "IdRewrite", 9U) == 0) { + char* rfId = ::strtok(value, ", "); + char* netId = ::strtok(NULL, " \r\n"); + if (rfId != NULL && netId != NULL) { + CIdRewriteStruct rewrite; + rewrite.m_rfId = ::atoi(rfId); + rewrite.m_netId = ::atoi(netId); + m_dmrNetwork2IdRewrites.push_back(rewrite); + } } else if (::strncmp(key, "PassAllPC", 9U) == 0) { unsigned int slotNo = (unsigned int)::atoi(value); m_dmrNetwork2PassAllPC.push_back(slotNo); @@ -548,6 +570,15 @@ bool CConf::read() rewrite.m_range = ::atoi(p5); m_dmrNetwork3SrcRewrites.push_back(rewrite); } + } else if (::strncmp(key, "IdRewrite", 9U) == 0) { + char* rfId = ::strtok(value, ", "); + char* netId = ::strtok(NULL, " \r\n"); + if (rfId != NULL && netId != NULL) { + CIdRewriteStruct rewrite; + rewrite.m_rfId = ::atoi(rfId); + rewrite.m_netId = ::atoi(netId); + m_dmrNetwork3IdRewrites.push_back(rewrite); + } } else if (::strncmp(key, "PassAllPC", 9U) == 0) { unsigned int slotNo = (unsigned int)::atoi(value); m_dmrNetwork3PassAllPC.push_back(slotNo); @@ -634,6 +665,15 @@ bool CConf::read() rewrite.m_range = ::atoi(p5); m_dmrNetwork4SrcRewrites.push_back(rewrite); } + } else if (::strncmp(key, "IdRewrite", 9U) == 0) { + char* rfId = ::strtok(value, ", "); + char* netId = ::strtok(NULL, " \r\n"); + if (rfId != NULL && netId != NULL) { + CIdRewriteStruct rewrite; + rewrite.m_rfId = ::atoi(rfId); + rewrite.m_netId = ::atoi(netId); + m_dmrNetwork4IdRewrites.push_back(rewrite); + } } else if (::strncmp(key, "PassAllPC", 9U) == 0) { unsigned int slotNo = (unsigned int)::atoi(value); m_dmrNetwork4PassAllPC.push_back(slotNo); @@ -925,6 +965,11 @@ std::vector CConf::getDMRNetwork1SrcRewrites() const return m_dmrNetwork1SrcRewrites; } +std::vector CConf::getDMRNetwork1IdRewrites() const +{ + return m_dmrNetwork1IdRewrites; +} + std::vector CConf::getDMRNetwork1PassAllPC() const { return m_dmrNetwork1PassAllPC; @@ -1008,6 +1053,11 @@ std::vector CConf::getDMRNetwork2SrcRewrites() const return m_dmrNetwork2SrcRewrites; } +std::vector CConf::getDMRNetwork2IdRewrites() const +{ + return m_dmrNetwork2IdRewrites; +} + std::vector CConf::getDMRNetwork2PassAllPC() const { return m_dmrNetwork2PassAllPC; @@ -1091,6 +1141,11 @@ std::vector CConf::getDMRNetwork3SrcRewrites() const return m_dmrNetwork3SrcRewrites; } +std::vector CConf::getDMRNetwork3IdRewrites() const +{ + return m_dmrNetwork3IdRewrites; +} + std::vector CConf::getDMRNetwork3PassAllPC() const { return m_dmrNetwork3PassAllPC; @@ -1174,6 +1229,11 @@ std::vector CConf::getDMRNetwork4SrcRewrites() const return m_dmrNetwork4SrcRewrites; } +std::vector CConf::getDMRNetwork4IdRewrites() const +{ + return m_dmrNetwork4IdRewrites; +} + std::vector CConf::getDMRNetwork4PassAllPC() const { return m_dmrNetwork4PassAllPC; diff --git a/Conf.h b/Conf.h index f6468a5..7225feb 100644 --- a/Conf.h +++ b/Conf.h @@ -53,6 +53,11 @@ struct CSrcRewriteStruct { unsigned int m_range; }; +struct CIdRewriteStruct { + unsigned int m_rfId; + unsigned int m_netId; +}; + class CConf { public: @@ -110,6 +115,7 @@ public: std::vector getDMRNetwork1PCRewrites() const; std::vector getDMRNetwork1TypeRewrites() const; std::vector getDMRNetwork1SrcRewrites() const; + std::vector getDMRNetwork1IdRewrites() const; std::vector getDMRNetwork1PassAllPC() const; std::vector getDMRNetwork1PassAllTG() const; @@ -128,6 +134,7 @@ public: std::vector getDMRNetwork2PCRewrites() const; std::vector getDMRNetwork2TypeRewrites() const; std::vector getDMRNetwork2SrcRewrites() const; + std::vector getDMRNetwork2IdRewrites() const; std::vector getDMRNetwork2PassAllPC() const; std::vector getDMRNetwork2PassAllTG() const; @@ -146,6 +153,7 @@ public: std::vector getDMRNetwork3PCRewrites() const; std::vector getDMRNetwork3TypeRewrites() const; std::vector getDMRNetwork3SrcRewrites() const; + std::vector getDMRNetwork3IdRewrites() const; std::vector getDMRNetwork3PassAllPC() const; std::vector getDMRNetwork3PassAllTG() const; @@ -164,6 +172,7 @@ public: std::vector getDMRNetwork4PCRewrites() const; std::vector getDMRNetwork4TypeRewrites() const; std::vector getDMRNetwork4SrcRewrites() const; + std::vector getDMRNetwork4IdRewrites() const; std::vector getDMRNetwork4PassAllPC() const; std::vector getDMRNetwork4PassAllTG() const; @@ -230,6 +239,7 @@ private: std::vector m_dmrNetwork1PCRewrites; std::vector m_dmrNetwork1TypeRewrites; std::vector m_dmrNetwork1SrcRewrites; + std::vector m_dmrNetwork1IdRewrites; std::vector m_dmrNetwork1PassAllPC; std::vector m_dmrNetwork1PassAllTG; @@ -247,6 +257,7 @@ private: std::vector m_dmrNetwork2PCRewrites; std::vector m_dmrNetwork2TypeRewrites; std::vector m_dmrNetwork2SrcRewrites; + std::vector m_dmrNetwork2IdRewrites; std::vector m_dmrNetwork2PassAllPC; std::vector m_dmrNetwork2PassAllTG; @@ -264,6 +275,7 @@ private: std::vector m_dmrNetwork3PCRewrites; std::vector m_dmrNetwork3TypeRewrites; std::vector m_dmrNetwork3SrcRewrites; + std::vector m_dmrNetwork3IdRewrites; std::vector m_dmrNetwork3PassAllPC; std::vector m_dmrNetwork3PassAllTG; @@ -281,6 +293,7 @@ private: std::vector m_dmrNetwork4PCRewrites; std::vector m_dmrNetwork4TypeRewrites; std::vector m_dmrNetwork4SrcRewrites; + std::vector m_dmrNetwork4IdRewrites; std::vector m_dmrNetwork4PassAllPC; std::vector m_dmrNetwork4PassAllTG; diff --git a/DMRGateway.cpp b/DMRGateway.cpp index 6b6c4e2..4b58fb5 100644 --- a/DMRGateway.cpp +++ b/DMRGateway.cpp @@ -22,6 +22,8 @@ #include "DMRGateway.h" #include "StopWatch.h" #include "RewritePC.h" +#include "RewriteSrcId.h" +#include "RewriteDstId.h" #include "PassAllPC.h" #include "PassAllTG.h" #include "DMRFullLC.h" @@ -165,10 +167,16 @@ m_rptRewrite(NULL), m_xlxRewrite(NULL), m_dmr1NetRewrites(), m_dmr1RFRewrites(), +m_dmr1SrcRewrites(), m_dmr2NetRewrites(), m_dmr2RFRewrites(), +m_dmr2SrcRewrites(), m_dmr3NetRewrites(), m_dmr3RFRewrites(), +m_dmr3SrcRewrites(), +m_dmr4NetRewrites(), +m_dmr4RFRewrites(), +m_dmr4SrcRewrites(), m_dmr1Passalls(), m_dmr2Passalls(), m_dmr3Passalls() @@ -184,18 +192,36 @@ CDMRGateway::~CDMRGateway() for (std::vector::iterator it = m_dmr1RFRewrites.begin(); it != m_dmr1RFRewrites.end(); ++it) delete *it; + for (std::vector::iterator it = m_dmr1SrcRewrites.begin(); it != m_dmr1SrcRewrites.end(); ++it) + delete *it; + for (std::vector::iterator it = m_dmr2NetRewrites.begin(); it != m_dmr2NetRewrites.end(); ++it) delete *it; for (std::vector::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it) delete *it; + for (std::vector::iterator it = m_dmr2SrcRewrites.begin(); it != m_dmr2SrcRewrites.end(); ++it) + delete *it; + for (std::vector::iterator it = m_dmr3NetRewrites.begin(); it != m_dmr3NetRewrites.end(); ++it) delete *it; for (std::vector::iterator it = m_dmr3RFRewrites.begin(); it != m_dmr3RFRewrites.end(); ++it) delete *it; + for (std::vector::iterator it = m_dmr3SrcRewrites.begin(); it != m_dmr3SrcRewrites.end(); ++it) + delete *it; + + for (std::vector::iterator it = m_dmr4NetRewrites.begin(); it != m_dmr4NetRewrites.end(); ++it) + delete *it; + + for (std::vector::iterator it = m_dmr4RFRewrites.begin(); it != m_dmr4RFRewrites.end(); ++it) + delete *it; + + for (std::vector::iterator it = m_dmr4SrcRewrites.begin(); it != m_dmr4SrcRewrites.end(); ++it) + delete *it; + for (std::vector::iterator it = m_dmr1Passalls.begin(); it != m_dmr1Passalls.end(); ++it) delete *it; @@ -205,6 +231,9 @@ CDMRGateway::~CDMRGateway() for (std::vector::iterator it = m_dmr3Passalls.begin(); it != m_dmr3Passalls.end(); ++it) delete *it; + for (std::vector::iterator it = m_dmr4Passalls.begin(); it != m_dmr4Passalls.end(); ++it) + delete *it; + delete m_rptRewrite; delete m_xlxRewrite; @@ -576,6 +605,7 @@ int CDMRGateway::run() if (rewritten) { if (status[slotNo] == DMRGWS_NONE || status[slotNo] == DMRGWS_DMRNETWORK1) { + rewrite(m_dmr1SrcRewrites, data, trace); m_dmrNetwork1->write(data); status[slotNo] = DMRGWS_DMRNETWORK1; timer[slotNo]->setTimeout(rfTimeout); @@ -597,6 +627,7 @@ int CDMRGateway::run() if (rewritten) { if (status[slotNo] == DMRGWS_NONE || status[slotNo] == DMRGWS_DMRNETWORK2) { + rewrite(m_dmr2SrcRewrites, data, trace); m_dmrNetwork2->write(data); status[slotNo] = DMRGWS_DMRNETWORK2; timer[slotNo]->setTimeout(rfTimeout); @@ -618,6 +649,7 @@ int CDMRGateway::run() if (rewritten) { if (status[slotNo] == DMRGWS_NONE || status[slotNo] == DMRGWS_DMRNETWORK3) { + rewrite(m_dmr3SrcRewrites, data, trace); m_dmrNetwork3->write(data); status[slotNo] = DMRGWS_DMRNETWORK3; timer[slotNo]->setTimeout(rfTimeout); @@ -639,6 +671,7 @@ int CDMRGateway::run() if (rewritten) { if (status[slotNo] == DMRGWS_NONE || status[slotNo] == DMRGWS_DMRNETWORK4) { + rewrite(m_dmr4SrcRewrites, data, trace); m_dmrNetwork4->write(data); status[slotNo] = DMRGWS_DMRNETWORK4; timer[slotNo]->setTimeout(rfTimeout); @@ -662,6 +695,7 @@ int CDMRGateway::run() if (rewritten) { if (status[slotNo] == DMRGWS_NONE || status[slotNo] == DMRGWS_DMRNETWORK1) { + rewrite(m_dmr1SrcRewrites, data, trace); m_dmrNetwork1->write(data); status[slotNo] = DMRGWS_DMRNETWORK1; timer[slotNo]->setTimeout(rfTimeout); @@ -683,6 +717,7 @@ int CDMRGateway::run() if (rewritten) { if (status[slotNo] == DMRGWS_NONE || status[slotNo] == DMRGWS_DMRNETWORK2) { + rewrite(m_dmr2SrcRewrites, data, trace); m_dmrNetwork2->write(data); status[slotNo] = DMRGWS_DMRNETWORK2; timer[slotNo]->setTimeout(rfTimeout); @@ -704,6 +739,7 @@ int CDMRGateway::run() if (rewritten) { if (status[slotNo] == DMRGWS_NONE || status[slotNo] == DMRGWS_DMRNETWORK3) { + rewrite(m_dmr3SrcRewrites, data, trace); m_dmrNetwork3->write(data); status[slotNo] = DMRGWS_DMRNETWORK3; timer[slotNo]->setTimeout(rfTimeout); @@ -725,6 +761,7 @@ int CDMRGateway::run() if (rewritten) { if (status[slotNo] == DMRGWS_NONE || status[slotNo] == DMRGWS_DMRNETWORK4) { + rewrite(m_dmr4SrcRewrites, data, trace); m_dmrNetwork4->write(data); status[slotNo] = DMRGWS_DMRNETWORK4; timer[slotNo]->setTimeout(rfTimeout); @@ -1209,6 +1246,17 @@ bool CDMRGateway::createDMRNetwork1() m_dmr1NetRewrites.push_back(rewrite); } + std::vector idRewrites = m_conf.getDMRNetwork1IdRewrites(); + for (std::vector::const_iterator it = idRewrites.begin(); it != idRewrites.end(); ++it) { + LogInfo(" Rewrite Id: %u <-> %u", (*it).m_rfId, (*it).m_netId); + + CRewriteSrcId* rewriteSrcId = new CRewriteSrcId(m_dmr1Name, (*it).m_rfId, (*it).m_netId); + CRewriteDstId* rewriteDstId = new CRewriteDstId(m_dmr1Name, (*it).m_netId, (*it).m_rfId); + + m_dmr1SrcRewrites.push_back(rewriteSrcId); + m_dmr1NetRewrites.push_back(rewriteDstId); + } + std::vector tgPassAll = m_conf.getDMRNetwork1PassAllTG(); for (std::vector::const_iterator it = tgPassAll.begin(); it != tgPassAll.end(); ++it) { LogInfo(" Pass All TG: %u", *it); @@ -1336,6 +1384,17 @@ bool CDMRGateway::createDMRNetwork2() m_dmr2NetRewrites.push_back(rewrite); } + std::vector idRewrites = m_conf.getDMRNetwork2IdRewrites(); + for (std::vector::const_iterator it = idRewrites.begin(); it != idRewrites.end(); ++it) { + LogInfo(" Rewrite Id: %u <-> %u", (*it).m_rfId, (*it).m_netId); + + CRewriteSrcId* rewriteSrcId = new CRewriteSrcId(m_dmr2Name, (*it).m_rfId, (*it).m_netId); + CRewriteDstId* rewriteDstId = new CRewriteDstId(m_dmr2Name, (*it).m_netId, (*it).m_rfId); + + m_dmr2SrcRewrites.push_back(rewriteSrcId); + m_dmr2NetRewrites.push_back(rewriteDstId); + } + std::vector tgPassAll = m_conf.getDMRNetwork2PassAllTG(); for (std::vector::const_iterator it = tgPassAll.begin(); it != tgPassAll.end(); ++it) { LogInfo(" Pass All TG: %u", *it); @@ -1463,6 +1522,17 @@ bool CDMRGateway::createDMRNetwork3() m_dmr3NetRewrites.push_back(rewrite); } + std::vector idRewrites = m_conf.getDMRNetwork3IdRewrites(); + for (std::vector::const_iterator it = idRewrites.begin(); it != idRewrites.end(); ++it) { + LogInfo(" Rewrite Id: %u <-> %u", (*it).m_rfId, (*it).m_netId); + + CRewriteSrcId* rewriteSrcId = new CRewriteSrcId(m_dmr3Name, (*it).m_rfId, (*it).m_netId); + CRewriteDstId* rewriteDstId = new CRewriteDstId(m_dmr3Name, (*it).m_netId, (*it).m_rfId); + + m_dmr3SrcRewrites.push_back(rewriteSrcId); + m_dmr3NetRewrites.push_back(rewriteDstId); + } + std::vector tgPassAll = m_conf.getDMRNetwork3PassAllTG(); for (std::vector::const_iterator it = tgPassAll.begin(); it != tgPassAll.end(); ++it) { LogInfo(" Pass All TG: %u", *it); @@ -1590,6 +1660,17 @@ bool CDMRGateway::createDMRNetwork4() m_dmr4NetRewrites.push_back(rewrite); } + std::vector idRewrites = m_conf.getDMRNetwork4IdRewrites(); + for (std::vector::const_iterator it = idRewrites.begin(); it != idRewrites.end(); ++it) { + LogInfo(" Rewrite Id: %u <-> %u", (*it).m_rfId, (*it).m_netId); + + CRewriteSrcId* rewriteSrcId = new CRewriteSrcId(m_dmr4Name, (*it).m_rfId, (*it).m_netId); + CRewriteDstId* rewriteDstId = new CRewriteDstId(m_dmr4Name, (*it).m_netId, (*it).m_rfId); + + m_dmr4SrcRewrites.push_back(rewriteSrcId); + m_dmr4NetRewrites.push_back(rewriteDstId); + } + std::vector tgPassAll = m_conf.getDMRNetwork4PassAllTG(); for (std::vector::const_iterator it = tgPassAll.begin(); it != tgPassAll.end(); ++it) { LogInfo(" Pass All TG: %u", *it); @@ -1794,6 +1875,14 @@ void CDMRGateway::writeXLXLink(unsigned int srcId, unsigned int dstId, CDMRNetwo } } +bool CDMRGateway::rewrite(std::vector& rewrites, CDMRData & data, bool trace) +{ + for (std::vector::iterator it = rewrites.begin(); it != rewrites.end(); ++it) + if ((*it)->process(data, trace)) + return true; + return false; +} + unsigned int CDMRGateway::getConfig(const std::string& name, unsigned char* buffer) { assert(buffer != NULL); diff --git a/DMRGateway.h b/DMRGateway.h index 5b6ad0e..4f16d74 100644 --- a/DMRGateway.h +++ b/DMRGateway.h @@ -73,12 +73,16 @@ private: CRewriteTG* m_xlxRewrite; std::vector m_dmr1NetRewrites; std::vector m_dmr1RFRewrites; + std::vector m_dmr1SrcRewrites; std::vector m_dmr2NetRewrites; std::vector m_dmr2RFRewrites; + std::vector m_dmr2SrcRewrites; std::vector m_dmr3NetRewrites; std::vector m_dmr3RFRewrites; + std::vector m_dmr3SrcRewrites; std::vector m_dmr4NetRewrites; std::vector m_dmr4RFRewrites; + std::vector m_dmr4SrcRewrites; std::vector m_dmr1Passalls; std::vector m_dmr2Passalls; std::vector m_dmr3Passalls; @@ -95,6 +99,8 @@ private: void unlinkXLX(); void writeXLXLink(unsigned int srcId, unsigned int dstId, CDMRNetwork* network); + bool rewrite(std::vector& rewrites, CDMRData& data, bool trace); + unsigned int getConfig(const std::string& name, unsigned char* buffer); }; diff --git a/DMRGateway.vcxproj b/DMRGateway.vcxproj index ef04032..9108dcd 100644 --- a/DMRGateway.vcxproj +++ b/DMRGateway.vcxproj @@ -176,8 +176,10 @@ + + @@ -216,8 +218,10 @@ + + diff --git a/DMRGateway.vcxproj.filters b/DMRGateway.vcxproj.filters index 239becf..126a6ab 100644 --- a/DMRGateway.vcxproj.filters +++ b/DMRGateway.vcxproj.filters @@ -107,9 +107,15 @@ Header Files + + Header Files + Header Files + + Header Files + Header Files @@ -217,9 +223,15 @@ Source Files + + Source Files + Source Files + + Source Files + Source Files diff --git a/Makefile b/Makefile index b0ae9f3..a2614c9 100644 --- a/Makefile +++ b/Makefile @@ -5,8 +5,8 @@ LIBS = -lpthread LDFLAGS = -g OBJECTS = BPTC19696.o Conf.o CRC.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREmbeddedData.o DMREMB.o DMRFullLC.o DMRGateway.o DMRLC.o DMRNetwork.o DMRSlotType.o \ - Golay2087.o Hamming.o Log.o MMDVMNetwork.o PassAllPC.o PassAllTG.o QR1676.o Reflectors.o RepeaterProtocol.o Rewrite.o RewritePC.o RewriteSrc.o RewriteTG.o \ - RewriteType.o RS129.o SHA256.o StopWatch.o Sync.o Thread.o Timer.o UDPSocket.o Utils.o Voice.o + Golay2087.o Hamming.o Log.o MMDVMNetwork.o PassAllPC.o PassAllTG.o QR1676.o Reflectors.o RepeaterProtocol.o Rewrite.o RewriteDstId.o RewritePC.o RewriteSrc.o \ + RewriteSrcId.o RewriteTG.o RewriteType.o RS129.o SHA256.o StopWatch.o Sync.o Thread.o Timer.o UDPSocket.o Utils.o Voice.o all: DMRGateway diff --git a/RewriteDstId.cpp b/RewriteDstId.cpp new file mode 100644 index 0000000..ef796e3 --- /dev/null +++ b/RewriteDstId.cpp @@ -0,0 +1,60 @@ +/* +* Copyright (C) 2017 by Jonathan Naylor G4KLX +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "RewriteDstId.h" + +#include "DMRDefines.h" +#include "Log.h" + +#include + +CRewriteDstId::CRewriteDstId(const std::string& name, unsigned int fromId, unsigned int toId) : +CRewrite(), +m_name(name), +m_fromId(fromId), +m_toId(toId) +{ +} + +CRewriteDstId::~CRewriteDstId() +{ +} + +bool CRewriteDstId::process(CDMRData& data, bool trace) +{ + FLCO flco = data.getFLCO(); + unsigned int dstId = data.getDstId(); + + if (flco != FLCO_USER_USER || dstId != m_fromId) { + if (trace) + LogDebug("Rule Trace,\tRewriteDstId from %s Src=%u: not matched", m_name.c_str(), m_fromId); + + return false; + } + + data.setDstId(m_toId); + + processMessage(data); + + if (trace) { + LogDebug("Rule Trace,\tRewriteDstId from %s Src=%u: matched", m_name.c_str(), m_fromId); + LogDebug("Rule Trace,\tRewriteDstId to %s Src=%u", m_name.c_str(), m_toId); + } + + return true; +} diff --git a/RewriteDstId.h b/RewriteDstId.h new file mode 100644 index 0000000..8d066bd --- /dev/null +++ b/RewriteDstId.h @@ -0,0 +1,41 @@ +/* +* Copyright (C) 2017 by Jonathan Naylor G4KLX +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#if !defined(REWRITEDSTID_H) +#define REWRITEDSTID_H + +#include "Rewrite.h" +#include "DMRData.h" + +#include + +class CRewriteDstId : public CRewrite { +public: + CRewriteDstId(const std::string& name, unsigned int fromId, unsigned int toID); + virtual ~CRewriteDstId(); + + virtual bool process(CDMRData& data, bool trace); + +private: + std::string m_name; + unsigned int m_fromId; + unsigned int m_toId; +}; + + +#endif diff --git a/RewriteSrcId.cpp b/RewriteSrcId.cpp new file mode 100644 index 0000000..2382c75 --- /dev/null +++ b/RewriteSrcId.cpp @@ -0,0 +1,59 @@ +/* +* Copyright (C) 2017 by Jonathan Naylor G4KLX +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "RewriteSrcId.h" + +#include "DMRDefines.h" +#include "Log.h" + +#include + +CRewriteSrcId::CRewriteSrcId(const std::string& name, unsigned int fromId, unsigned int toId) : +CRewrite(), +m_name(name), +m_fromId(fromId), +m_toId(toId) +{ +} + +CRewriteSrcId::~CRewriteSrcId() +{ +} + +bool CRewriteSrcId::process(CDMRData& data, bool trace) +{ + unsigned int srcId = data.getSrcId(); + + if (srcId != m_fromId) { + if (trace) + LogDebug("Rule Trace,\tRewriteSrcId from %s Src=%u: not matched", m_name.c_str(), m_fromId); + + return false; + } + + data.setSrcId(m_toId); + + processMessage(data); + + if (trace) { + LogDebug("Rule Trace,\tRewriteSrcId from %s Src=%u: matched", m_name.c_str(), m_fromId); + LogDebug("Rule Trace,\tRewriteSrcId to %s Src=%u", m_name.c_str(), m_toId); + } + + return true; +} diff --git a/RewriteSrcId.h b/RewriteSrcId.h new file mode 100644 index 0000000..76bd17e --- /dev/null +++ b/RewriteSrcId.h @@ -0,0 +1,41 @@ +/* +* Copyright (C) 2017 by Jonathan Naylor G4KLX +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#if !defined(REWRITESRCID_H) +#define REWRITESRCID_H + +#include "Rewrite.h" +#include "DMRData.h" + +#include + +class CRewriteSrcId : public CRewrite { +public: + CRewriteSrcId(const std::string& name, unsigned int fromId, unsigned int toID); + virtual ~CRewriteSrcId(); + + virtual bool process(CDMRData& data, bool trace); + +private: + std::string m_name; + unsigned int m_fromId; + unsigned int m_toId; +}; + + +#endif