#include <lib/service/event.h>
#include <lib/base/estring.h>
+#include <lib/base/encoding.h>
#include <lib/dvb/dvbtime.h>
#include <dvbsi++/event_information_section.h>
#include <dvbsi++/short_event_descriptor.h>
#include <dvbsi++/extended_event_descriptor.h>
+#include <dvbsi++/linkage_descriptor.h>
#include <dvbsi++/descriptor_tag.h>
DEFINE_REF(eServiceEvent);
};
/* search for the presence of language from given EIT event descriptors*/
-bool eServiceEvent::loadLanguage(Event *evt, std::string lang)
+bool eServiceEvent::loadLanguage(Event *evt, std::string lang, int tsidonid)
{
bool retval=0;
for (DescriptorConstIterator desc = evt->getDescriptors()->begin(); desc != evt->getDescriptors()->end(); ++desc)
{
switch ((*desc)->getTag())
{
+ case LINKAGE_DESCRIPTOR:
+ m_linkage_services.clear();
+ break;
case SHORT_EVENT_DESCRIPTOR:
{
const ShortEventDescriptor *sed = (ShortEventDescriptor*)*desc;
- if (lang.empty() || sed->getIso639LanguageCode() == lang)
+ const std::string &cc = sed->getIso639LanguageCode();
+ int table=encodingHandler.getCountryCodeDefaultMapping(cc);
+ if (lang.empty() || cc == lang)
{
- m_event_name = convertDVBUTF8(sed->getEventName());
- m_short_description = convertDVBUTF8(sed->getText());
+ m_event_name = convertDVBUTF8(sed->getEventName(), table, tsidonid);
+ m_short_description = convertDVBUTF8(sed->getText(), table, tsidonid);
retval=1;
}
break;
case EXTENDED_EVENT_DESCRIPTOR:
{
const ExtendedEventDescriptor *eed = (ExtendedEventDescriptor*)*desc;
- if (lang.empty() || eed->getIso639LanguageCode() == lang)
+ const std::string &cc = eed->getIso639LanguageCode();
+ int table=encodingHandler.getCountryCodeDefaultMapping(cc);
+ if (lang.empty() || cc == lang)
{
- m_extended_description += convertDVBUTF8(eed->getText());
+ m_extended_description += convertDVBUTF8(eed->getText(), table, tsidonid);
retval=1;
}
+#if 0
const ExtendedEventList *itemlist = eed->getItems();
for (ExtendedEventConstIterator it = itemlist->begin(); it != itemlist->end(); ++it)
{
+ m_extended_description += '\n';
m_extended_description += convertDVBUTF8((*it)->getItemDescription());
m_extended_description += ' ';
m_extended_description += convertDVBUTF8((*it)->getItem());
}
+#endif
break;
}
default:
break;
}
}
+ if ( retval == 1 )
+ {
+ for (DescriptorConstIterator desc = evt->getDescriptors()->begin(); desc != evt->getDescriptors()->end(); ++desc)
+ {
+ switch ((*desc)->getTag())
+ {
+ case LINKAGE_DESCRIPTOR:
+ {
+ const LinkageDescriptor *ld = (LinkageDescriptor*)*desc;
+ if ( ld->getLinkageType() == 0xB0 )
+ {
+ linkage_service s;
+ s.onid = ld->getOriginalNetworkId();
+ s.tsid = ld->getTransportStreamId();
+ s.sid = ld->getServiceId();
+ const PrivateDataByteVector *privateData =
+ ld->getPrivateDataBytes();
+ s.description.assign((const char*)&((*privateData)[0]), privateData->size());
+ m_linkage_services.push_back(s);
+ }
+ break;
+ }
+ }
+ }
+ }
+ if ( m_extended_description.find(m_short_description) == 0 )
+ m_short_description="";
return retval;
}
-RESULT eServiceEvent::parseFrom(Event *evt)
+RESULT eServiceEvent::parseFrom(Event *evt, int tsidonid)
{
uint16_t stime_mjd = evt->getStartTimeMjd();
uint32_t stime_bcd = evt->getStartTimeBcd();
std::string country="de_DE"; // TODO use local data here
for (int i=0; i < MAX_LANG; i++)
if (country==ISOtbl[i][0])
- if (loadLanguage(evt,ISOtbl[i][1]))
+ if (loadLanguage(evt, ISOtbl[i][1], tsidonid))
return 0;
- if (loadLanguage(evt,"eng"))
+ if (loadLanguage(evt, "eng", tsidonid))
return 0;
- if (loadLanguage(evt,std::string()))
+ if (loadLanguage(evt, std::string(), tsidonid))
return 0;
return 0;
}