From 3b7083b373c8112f987abbfe24edb44c6a8d10e2 Mon Sep 17 00:00:00 2001 From: John doe Date: Wed, 8 Apr 2020 16:21:35 +0900 Subject: [PATCH] Extended TypeRewrite --- Conf.cpp | 20 +++++++++++++++----- Conf.h | 1 + RewriteType.cpp | 37 +++++++++++++++++++++++++++---------- RewriteType.h | 8 +++++--- 4 files changed, 48 insertions(+), 18 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index e714a31..a38836a 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -381,13 +381,15 @@ bool CConf::read() char* p1 = ::strtok(value, ", "); char* p2 = ::strtok(NULL, ", "); char* p3 = ::strtok(NULL, ", "); - char* p4 = ::strtok(NULL, " \r\n"); + char* p4 = ::strtok(NULL, ", \r\n"); if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL) { CTypeRewriteStruct rewrite; rewrite.m_fromSlot = ::atoi(p1); rewrite.m_fromTG = ::atoi(p2); rewrite.m_toSlot = ::atoi(p3); rewrite.m_toId = ::atoi(p4); + char* p5 = ::strtok(NULL, " \r\n"); + rewrite.m_range = p5 != NULL ? ::atoi(p5) : 1; m_dmrNetwork1TypeRewrites.push_back(rewrite); } } else if (::strncmp(key, "SrcRewrite", 10U) == 0) { @@ -493,13 +495,15 @@ bool CConf::read() char* p1 = ::strtok(value, ", "); char* p2 = ::strtok(NULL, ", "); char* p3 = ::strtok(NULL, ", "); - char* p4 = ::strtok(NULL, " \r\n"); + char* p4 = ::strtok(NULL, ", \r\n"); if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL) { CTypeRewriteStruct rewrite; rewrite.m_fromSlot = ::atoi(p1); rewrite.m_fromTG = ::atoi(p2); rewrite.m_toSlot = ::atoi(p3); rewrite.m_toId = ::atoi(p4); + char* p5 = ::strtok(NULL, " \r\n"); + rewrite.m_range = p5 != NULL ? ::atoi(p5) : 1; m_dmrNetwork2TypeRewrites.push_back(rewrite); } } else if (::strncmp(key, "SrcRewrite", 10U) == 0) { @@ -605,13 +609,15 @@ bool CConf::read() char* p1 = ::strtok(value, ", "); char* p2 = ::strtok(NULL, ", "); char* p3 = ::strtok(NULL, ", "); - char* p4 = ::strtok(NULL, " \r\n"); + char* p4 = ::strtok(NULL, ", \r\n"); if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL) { CTypeRewriteStruct rewrite; rewrite.m_fromSlot = ::atoi(p1); rewrite.m_fromTG = ::atoi(p2); rewrite.m_toSlot = ::atoi(p3); rewrite.m_toId = ::atoi(p4); + char* p5 = ::strtok(NULL, " \r\n"); + rewrite.m_range = p5 != NULL ? ::atoi(p5) : 1; m_dmrNetwork3TypeRewrites.push_back(rewrite); } } else if (::strncmp(key, "SrcRewrite", 10U) == 0) { @@ -717,13 +723,15 @@ bool CConf::read() char* p1 = ::strtok(value, ", "); char* p2 = ::strtok(NULL, ", "); char* p3 = ::strtok(NULL, ", "); - char* p4 = ::strtok(NULL, " \r\n"); + char* p4 = ::strtok(NULL, ", \r\n"); if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL) { CTypeRewriteStruct rewrite; rewrite.m_fromSlot = ::atoi(p1); rewrite.m_fromTG = ::atoi(p2); rewrite.m_toSlot = ::atoi(p3); rewrite.m_toId = ::atoi(p4); + char* p5 = ::strtok(NULL, " \r\n"); + rewrite.m_range = p5 != NULL ? ::atoi(p5) : 1; m_dmrNetwork4TypeRewrites.push_back(rewrite); } } else if (::strncmp(key, "SrcRewrite", 10U) == 0) { @@ -829,13 +837,15 @@ bool CConf::read() char* p1 = ::strtok(value, ", "); char* p2 = ::strtok(NULL, ", "); char* p3 = ::strtok(NULL, ", "); - char* p4 = ::strtok(NULL, " \r\n"); + char* p4 = ::strtok(NULL, ", \r\n"); if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL) { CTypeRewriteStruct rewrite; rewrite.m_fromSlot = ::atoi(p1); rewrite.m_fromTG = ::atoi(p2); rewrite.m_toSlot = ::atoi(p3); rewrite.m_toId = ::atoi(p4); + char* p5 = ::strtok(NULL, " \r\n"); + rewrite.m_range = p5 != NULL ? ::atoi(p5) : 1; m_dmrNetwork5TypeRewrites.push_back(rewrite); } } else if (::strncmp(key, "SrcRewrite", 10U) == 0) { diff --git a/Conf.h b/Conf.h index 59c4100..c151dc1 100644 --- a/Conf.h +++ b/Conf.h @@ -43,6 +43,7 @@ struct CTypeRewriteStruct { unsigned int m_fromTG; unsigned int m_toSlot; unsigned int m_toId; + unsigned int m_range; }; struct CSrcRewriteStruct { diff --git a/RewriteType.cpp b/RewriteType.cpp index c069145..00fafdf 100644 --- a/RewriteType.cpp +++ b/RewriteType.cpp @@ -24,13 +24,15 @@ #include #include -CRewriteType::CRewriteType(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toId) : +CRewriteType::CRewriteType(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toId, unsigned int range) : CRewrite(), m_name(name), m_fromSlot(fromSlot), -m_fromTG(fromTG), +m_fromTGStart(fromTG), +m_fromTGEnd(fromTG + range - 1U), m_toSlot(toSlot), -m_toId(toId) +m_toIdStart(toId), +m_toIdEnd(toId + range - 1U) { assert(fromSlot == 1U || fromSlot == 2U); assert(toSlot == 1U || toSlot == 2U); @@ -46,23 +48,38 @@ PROCESS_RESULT CRewriteType::process(CDMRData& data, bool trace) unsigned int dstId = data.getDstId(); unsigned int slotNo = data.getSlotNo(); - if (flco != FLCO_GROUP || slotNo != m_fromSlot || dstId != m_fromTG) { - if (trace) - LogDebug("Rule Trace,\tRewriteType %s Slot=%u Dst=TG%u: not matched", m_name.c_str(), m_fromSlot, m_fromTG); - + if (flco != FLCO_GROUP || slotNo != m_fromSlot || dstId < m_fromTGStart || dstId > m_fromTGEnd) { + if (trace) { + if (m_fromTGStart == m_fromTGEnd) + LogDebug("Rule Trace,\tRewriteType from \"%s\" Slot=%u Dst=TG%u: not matched", m_name.c_str(), m_fromSlot, m_fromTGStart); + else + LogDebug("Rule Trace,\tRewriteType from \"%s\" Slot=%u Dst=TG%u-%u: not matched", m_name.c_str(), m_fromSlot, m_fromTGStart, m_fromTGEnd); + } return RESULT_UNMATCHED; } if (m_fromSlot != m_toSlot) data.setSlotNo(m_toSlot); - data.setDstId(m_toId); + if (m_fromTGStart != m_fromTGEnd) { + unsigned int newDstId = dstId + m_toIdStart - m_fromTGStart; + data.setDstId(newDstId); + } else + data.setDstId(toId); data.setFLCO(FLCO_USER_USER); processMessage(data); - if (trace) - LogDebug("Rule Trace,\tRewriteType %s Slot=%u Dst=TG%u: matched", m_name.c_str(), m_fromSlot, m_fromTG); + if (trace) { + if (m_fromTGStart == m_fromTGEnd) + LogDebug("Rule Trace,\tRewriteType to \"\s\" Slot=%u Dst=%u: matched", m_name.c_str(), m_fromSlot, m_fromTGStart); + else + LogDebug("Rule Trace,\tRewriteType to \"\s\" Slot=%u Dst=%u-%u: matched", m_name.c_str(), m_fromSlot, m_fromTGStart, m_fromTGEnd); + if (m_toIdStart == m_toIdEnd) + LogDebug("Rule Trace,\tRewriteType to \"\s\" Slot=%u Dst=%u: matched", m_name.c_str(), m_toSlot, m_toIdStart); + else + LogDebug("Rule Trace,\tRewriteType to \"\s\" Slot=%u Dst=%u-%u: matched", m_name.c_str(), m_toSlot, m_toIdStart, m_toIdTGEnd); + } return RESULT_MATCHED; } diff --git a/RewriteType.h b/RewriteType.h index 70399d0..07e7edd 100644 --- a/RewriteType.h +++ b/RewriteType.h @@ -26,7 +26,7 @@ class CRewriteType : public CRewrite { public: - CRewriteType(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toId); + CRewriteType(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toId, unsigned int range); virtual ~CRewriteType(); virtual PROCESS_RESULT process(CDMRData& data, bool trace); @@ -34,9 +34,11 @@ public: private: std::string m_name; unsigned int m_fromSlot; - unsigned int m_fromTG; + unsigned int m_fromTGStart; + unsigned int m_fromTGEnd; unsigned int m_toSlot; - unsigned int m_toId; + unsigned int m_toIdStart; + unsigned int m_toIdEnd; };