getservices and scan: testing provider name replace

Origin commit data
------------------
Commit: 5914752256
Author: [CST] Focus <focus.cst@gmail.com>
Date: 2012-01-19 (Thu, 19 Jan 2012)
This commit is contained in:
[CST] Focus
2012-01-19 21:51:42 +04:00
parent 6008f8d02f
commit 6e173aed63
3 changed files with 90 additions and 0 deletions

View File

@@ -35,6 +35,7 @@
#include <zapit/satconfig.h> #include <zapit/satconfig.h>
#include <map> #include <map>
#include <list>
#define zapped_chan_is_nvod 0x80 #define zapped_chan_is_nvod 0x80
struct transponder struct transponder
@@ -83,6 +84,18 @@ typedef channel_map_t::iterator channel_map_iterator_t;
typedef std::pair<t_channel_id, CZapitChannel> channel_pair_t; typedef std::pair<t_channel_id, CZapitChannel> channel_pair_t;
typedef std::pair<channel_map_iterator_t,bool> channel_insert_res_t; typedef std::pair<channel_map_iterator_t,bool> 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<provider_replace> prov_replace_map_t;
typedef prov_replace_map_t::iterator prov_replace_map_iterator_t;
class CServiceManager class CServiceManager
{ {
private: private:
@@ -167,5 +180,9 @@ class CServiceManager
} }
satellite_map_t & SatelliteList() { return satellitePositions; } satellite_map_t & SatelliteList() { return satellitePositions; }
xmlDocPtr ScanXml(); 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__ */ #endif /* __getservices_h__ */

View File

@@ -629,6 +629,7 @@ bool CServiceManager::LoadServices(bool only_current)
//FIXME copy, until global satellitePositions removed //FIXME copy, until global satellitePositions removed
//satelliteList = satellitePositions; //satelliteList = satellitePositions;
LoadProviderMap();
printf("[zapit] %d services loaded (%d)...\n", service_count, allchans.size()); printf("[zapit] %d services loaded (%d)...\n", service_count, allchans.size());
TIMER_STOP("[zapit] service loading took"); TIMER_STOP("[zapit] service loading took");
@@ -917,3 +918,74 @@ bool CServiceManager::SaveCurrentServices(transponder_id_t tpid)
return updated; 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;
}

View File

@@ -284,6 +284,7 @@ bool CSdt::ParseServiceDescriptor(ServiceDescription * service, ServiceDescripto
providerName = lastProviderName; providerName = lastProviderName;
} else { } else {
FixWhiteSpaces(providerName); FixWhiteSpaces(providerName);
CServiceManager::getInstance()->ReplaceProviderName(providerName, transport_stream_id, original_network_id);
lastProviderName = providerName; lastProviderName = providerName;
} }