+static void eraseHbbTVApplications(HbbTVApplicationInfoList *applications)
+{
+ if(applications->size() == 0)
+ return;
+ for(HbbTVApplicationInfoListConstIterator info = applications->begin() ; info != applications->end() ; ++info)
+ delete(*info);
+ applications->clear();
+}
+
+void saveData(int orgid, unsigned char* data, int sectionLength)
+{
+ int fd = 0, rc = 0;
+ char fileName[255] = {0};
+ sprintf(fileName, "/tmp/ait.%d", orgid);
+ if((fd = open(fileName, O_RDWR|O_CREAT|O_TRUNC)) < 0)
+ {
+ eDebug("Fail to save a AIT Data.");
+ return;
+ }
+ rc = write(fd, data, sectionLength);
+ eDebug("Save Data Len : [%d]", rc);
+ close(fd);
+}
+
+void eDVBServicePMTHandler::AITready(int error)
+{
+ eDebug("AITready");
+ ePtr<eTable<ApplicationInformationSection> > ptr;
+ if (!m_AIT.getCurrent(ptr))
+ {
+ int orgid = 0, appid = 0;
+ m_ApplicationName = m_HBBTVUrl = "";
+
+ eraseHbbTVApplications(&m_HbbTVApplications);
+
+ memcpy(m_AITData, ptr->getBufferData(), 4096);
+
+ int sectionLength = 0;
+ for (std::vector<ApplicationInformationSection*>::const_iterator it = ptr->getSections().begin(); it != ptr->getSections().end(); ++it)
+ {
+ std::list<ApplicationInformation *>::const_iterator i = (*it)->getApplicationInformation()->begin();
+ sectionLength += (*it)->getSectionLength();
+ eDebug("Section Length : %d, Total Section Length : %d", (*it)->getSectionLength(), sectionLength);
+ for (; i != (*it)->getApplicationInformation()->end(); ++i)
+ {
+ std::string hbbtvUrl = "", applicaionName = "";
+
+ int controlCode = (*i)->getApplicationControlCode();
+ ApplicationIdentifier * applicationIdentifier = (*i)->getApplicationIdentifier();
+ orgid = applicationIdentifier->getOrganisationId();
+ appid = applicationIdentifier->getApplicationId();
+ eDebug("found applicaions ids >> pid : %x, orgid : %d, appid : %d", m_ait_pid, orgid, appid);
+ if (controlCode == 1 || controlCode == 2) /* 1:AUTOSTART, 2:ETC */
+ {
+ for (DescriptorConstIterator desc = (*i)->getDescriptors()->begin();
+ desc != (*i)->getDescriptors()->end(); ++desc)
+ {
+ switch ((*desc)->getTag())
+ {
+ case APPLICATION_DESCRIPTOR:
+ break;
+ case APPLICATION_NAME_DESCRIPTOR:
+ {
+ ApplicationNameDescriptor *nameDescriptor = (ApplicationNameDescriptor*)(*desc);
+ ApplicationNameConstIterator interactionit = nameDescriptor->getApplicationNames()->begin();
+ for(; interactionit != nameDescriptor->getApplicationNames()->end(); ++interactionit)
+ {
+ applicaionName = (*interactionit)->getApplicationName();
+ if(controlCode == 1) m_ApplicationName = applicaionName;
+ break;
+ }
+ break;
+ }
+ case TRANSPORT_PROTOCOL_DESCRIPTOR:
+ {
+ TransportProtocolDescriptor *transport = (TransportProtocolDescriptor*)(*desc);
+ switch (transport->getProtocolId())
+ {
+ case 1: /* object carousel */
+ if (m_dsmcc_pid >= 0)
+ {
+ m_OC.begin(eApp, eDVBDSMCCDLDataSpec(m_dsmcc_pid), m_demux);
+ }
+ break;
+ case 2: /* ip */
+ break;
+ case 3: /* interaction */
+ {
+ InterActionTransportConstIterator interactionit = transport->getInteractionTransports()->begin();
+ for(; interactionit != transport->getInteractionTransports()->end(); ++interactionit)
+ {
+ hbbtvUrl = (*interactionit)->getUrlBase()->getUrl();
+ if(controlCode == 1) m_HBBTVUrl = hbbtvUrl;
+ break;
+ }
+ break;
+ }
+ }
+ break;
+ }
+ case GRAPHICS_CONSTRAINTS_DESCRIPTOR:
+ break;
+ case SIMPLE_APPLICATION_LOCATION_DESCRIPTOR:
+ {
+ SimpleApplicationLocationDescriptor *applicationlocation = (SimpleApplicationLocationDescriptor*)(*desc);
+ hbbtvUrl += applicationlocation->getInitialPath();
+ break;
+ }
+ case APPLICATION_USAGE_DESCRIPTOR:
+ break;
+ case SIMPLE_APPLICATION_BOUNDARY_DESCRIPTOR:
+ break;
+ }
+ }
+ }
+ m_HbbTVApplications.push_back(new HbbTVApplicationInfo(controlCode, orgid, appid, hbbtvUrl, applicaionName));
+ }
+ }
+
+ if (m_HbbTVApplications.size())
+ {
+ saveData(orgid, m_AITData, sectionLength);//4096);
+ for(HbbTVApplicationInfoListConstIterator infoiter = m_HbbTVApplications.begin() ; infoiter != m_HbbTVApplications.end() ; ++infoiter)
+ eDebug("Found : control[%d], name[%s], url[%s]",
+ (*infoiter)->m_ControlCode, (*infoiter)->m_ApplicationName.c_str(), (*infoiter)->m_HbbTVUrl.c_str());
+ serviceEvent(eventHBBTVInfo);
+ }
+ else eDebug("No found anything.");
+ }
+ /* for now, do not keep listening for table updates */
+ m_AIT.stop();
+}
+
+void eDVBServicePMTHandler::OCready(int error)
+{
+ eDebug("OCready");
+ ePtr<eTable<OCSection> > ptr;
+ if (!m_OC.getCurrent(ptr))
+ {
+ for (std::vector<OCSection*>::const_iterator it = ptr->getSections().begin(); it != ptr->getSections().end(); ++it)
+ {
+ unsigned char* sectionData = (*it)->getData();
+ }
+ }
+ /* for now, do not keep listening for table updates */
+ m_OC.stop();
+}
+