From 6e173aed6361f7801c11a084c48754e22c51155b Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Thu, 19 Jan 2012 21:51:42 +0400 Subject: [PATCH] getservices and scan: testing provider name replace Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/5914752256efce583595775af2c6cc1dccc2dcf5 Author: [CST] Focus Date: 2012-01-19 (Thu, 19 Jan 2012) --- src/zapit/include/zapit/getservices.h | 17 +++++++ src/zapit/src/getservices.cpp | 72 +++++++++++++++++++++++++++ src/zapit/src/scansdt.cpp | 1 + 3 files changed, 90 insertions(+) diff --git a/src/zapit/include/zapit/getservices.h b/src/zapit/include/zapit/getservices.h index 530f36d12..e03451128 100644 --- a/src/zapit/include/zapit/getservices.h +++ b/src/zapit/include/zapit/getservices.h @@ -35,6 +35,7 @@ #include #include +#include #define zapped_chan_is_nvod 0x80 struct transponder @@ -83,6 +84,18 @@ typedef channel_map_t::iterator channel_map_iterator_t; typedef std::pair channel_pair_t; typedef std::pair channel_insert_res_t; +struct provider_replace +{ + t_transport_stream_id transport_stream_id; + t_original_network_id original_network_id; + int frequency; + std::string name; + std::string newname; +}; + +typedef std::list prov_replace_map_t; +typedef prov_replace_map_t::iterator prov_replace_map_iterator_t; + class CServiceManager { private: @@ -167,5 +180,9 @@ class CServiceManager } satellite_map_t & SatelliteList() { return satellitePositions; } xmlDocPtr ScanXml(); + + prov_replace_map_t replace_map; + bool LoadProviderMap(); + bool ReplaceProviderName(std::string &name, t_transport_stream_id tsid, t_original_network_id onid); }; #endif /* __getservices_h__ */ diff --git a/src/zapit/src/getservices.cpp b/src/zapit/src/getservices.cpp index 3dcb612f3..526fd8cef 100644 --- a/src/zapit/src/getservices.cpp +++ b/src/zapit/src/getservices.cpp @@ -629,6 +629,7 @@ bool CServiceManager::LoadServices(bool only_current) //FIXME copy, until global satellitePositions removed //satelliteList = satellitePositions; + LoadProviderMap(); printf("[zapit] %d services loaded (%d)...\n", service_count, allchans.size()); TIMER_STOP("[zapit] service loading took"); @@ -917,3 +918,74 @@ bool CServiceManager::SaveCurrentServices(transponder_id_t tpid) return updated; } + +#define PROVIDER_MAP_XML CONFIGDIR "/zapit/providermap.xml" +bool CServiceManager::LoadProviderMap() +{ + xmlDocPtr parser; + + replace_map.clear(); + parser = parseXmlFile(PROVIDER_MAP_XML); + if (parser != NULL) { + xmlNodePtr node = xmlDocGetRootElement(parser)->xmlChildrenNode; + while ((node = xmlGetNextOccurence(node, "TS")) != NULL) { + provider_replace replace; + replace.transport_stream_id = xmlGetNumericAttribute(node, "id", 16); + replace.original_network_id = xmlGetNumericAttribute(node, "on", 16); + replace.frequency = xmlGetNumericAttribute(node, "frq", 0); + + char * n = xmlGetAttribute(node, "name"); + char * tn = xmlGetAttribute(node, "newname"); + if(n) + replace.name = n; + if(tn) + replace.newname = tn; + +printf("prov map: tsid %04x onid %04x freq %d name [%s] to [%s]\n", replace.transport_stream_id, replace.original_network_id, replace.frequency, replace.name.c_str(), replace.newname.c_str()); + replace_map.push_back(replace); + node = node->xmlNextNode; + } + xmlFreeDoc(parser); + return true; + } + return false; +} + +bool CServiceManager::ReplaceProviderName(std::string &name, t_transport_stream_id tsid, t_original_network_id onid) +{ + std::string newname; + + prov_replace_map_iterator_t it; + for (it = replace_map.begin(); it != replace_map.end(); ++it) { + provider_replace replace = *it; + /* if replace map has tsid and onid */ + if(replace.transport_stream_id && replace.original_network_id) { + /* compare tsid/onid */ + if(replace.transport_stream_id == tsid && replace.original_network_id == onid) { + /* if new name present, old name should be present */ + if(!replace.newname.empty()) { + if (name == replace.name) + newname = replace.newname; + } else { + newname = replace.name; + } + } + } else { + /* no tsid/onid, only names. if new name present, old name should be present */ + if(!replace.newname.empty()) { + if(name == replace.name) + newname = replace.newname; + } + /* no tsid/onid, no newname, only name. compare name without case */ + else if(!strcasecmp(replace.name.c_str(), name.c_str())) + newname = replace.name; + } + + } + if(!newname.empty()) { + printf("ReplaceProviderName: old [%s] new [%s]\n", name.c_str(), newname.c_str()); + name = newname; + return true; + } + return false; +} diff --git a/src/zapit/src/scansdt.cpp b/src/zapit/src/scansdt.cpp index 806dc6020..9af520eb3 100644 --- a/src/zapit/src/scansdt.cpp +++ b/src/zapit/src/scansdt.cpp @@ -284,6 +284,7 @@ bool CSdt::ParseServiceDescriptor(ServiceDescription * service, ServiceDescripto providerName = lastProviderName; } else { FixWhiteSpaces(providerName); + CServiceManager::getInstance()->ReplaceProviderName(providerName, transport_stream_id, original_network_id); lastProviderName = providerName; }