void SaveMotorPositions() { FILE * fd; sat_iterator_t sit; dprintf(DEBUG_NORMAL, "[getservices] saving motor positions...\n"); fd = fopen(SATCONFIG, "w"); if(fd == NULL) { printf("[zapit] cannot open %s\n", SATCONFIG); return; } fprintf(fd, "# sat position, stored rotor, diseqc, commited, uncommited, low, high, switch, use in full scan, use usals\n"); for(sit = satellitePositions.begin(); sit != satellitePositions.end(); sit++) { if(sit->second.type == DVB_S) fprintf(fd, "%d %d %d %d %d %d %d %d %d %d\n", sit->first, sit->second.motor_position, sit->second.diseqc, sit->second.commited, sit->second.uncommited, sit->second.lnbOffsetLow, sit->second.lnbOffsetHigh, sit->second.lnbSwitch, sit->second.use_in_scan, sit->second.use_usals); } fdatasync(fileno(fd)); fclose(fd); }
int loadMotorPositions(void) { FILE *fd = NULL; char buffer[256] = ""; t_satellite_position satellitePosition; int spos = 0, mpos = 0, diseqc = 0, uncom = 0, com = 0, usals = 0, inuse; int offH = 10600, offL = 9750, sw = 11700; dprintf(DEBUG_NORMAL, "getservices:loadingmotorpositions...\n"); if ((fd = fopen(SATCONFIG, "r"))) { fgets(buffer, 255, fd); while(!feof(fd)) { sscanf(buffer, "%d %d %d %d %d %d %d %d %d %d", &spos, &mpos, &diseqc, &com, &uncom, &offL, &offH, &sw, &inuse, &usals); satellitePosition = spos; sat_iterator_t sit = satellitePositions.find(satellitePosition); if(sit != satellitePositions.end()) { sit->second.motor_position = mpos; sit->second.diseqc = diseqc; sit->second.commited = com; sit->second.uncommited = uncom; sit->second.lnbOffsetLow = offL; sit->second.lnbOffsetHigh = offH; sit->second.lnbSwitch = sw; sit->second.use_in_scan = inuse; sit->second.use_usals = usals; } fgets(buffer, 255, fd); } fclose(fd); } else printf("[getservices] %s not found.\n", SATCONFIG); return 0; }
void SaveServices(bool tocopy) { transponder_id_t tpid = 0; FILE * fd = 0; bool updated = 0; tallchans_iterator ccI; tallchans_iterator dI; transponder_list_t::iterator tI; char tpstr[256]; bool tpdone = 0; bool satdone = 0; int processed = 0; sat_iterator_t spos_it; updated = 0; dprintf(DEBUG_INFO, "total channels: %d\n", allchans.size()); fd = fopen(SERVICES_TMP, "w"); if(!fd) { perror(SERVICES_TMP); return; } // headers fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<zapit api=\"3\">\n"); // loop througth satpos for (spos_it = satellitePositions.begin(); spos_it != satellitePositions.end(); spos_it++) { satdone = 0; // loop througth TPs for(tI = transponders.begin(); tI != transponders.end(); tI++) { t_satellite_position satpos = GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first) & 0xFFF; tpdone = 0; if(GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first) & 0xF000) satpos = -satpos; if(satpos != spos_it->first) { dprintf(DEBUG_DEBUG, "Sat position %d not found !!\n", satpos); continue; } switch(spos_it->second.type) { case DVB_S: sprintf(tpstr, "\t\t<TS id=\"%04x\" on=\"%04x\" frq=\"%u\" inv=\"%hu\" sr=\"%u\" fec=\"%hu\" pol=\"%hu\">\n", tI->second.transport_stream_id, tI->second.original_network_id, tI->second.feparams.frequency, tI->second.feparams.inversion, tI->second.feparams.u.qpsk.symbol_rate, tI->second.feparams.u.qpsk.fec_inner, tI->second.polarization); break; case DVB_C: sprintf(tpstr, "\t\t<TS id=\"%04x\" on=\"%04x\" frq=\"%u\" inv=\"%hu\" sr=\"%u\" fec=\"%hu\" mod=\"%hu\">\n", tI->second.transport_stream_id, tI->second.original_network_id, tI->second.feparams.frequency, tI->second.feparams.inversion, tI->second.feparams.u.qam.symbol_rate, tI->second.feparams.u.qam.fec_inner, tI->second.feparams.u.qam.modulation); break; case DVB_T: sprintf(tpstr, "\t\t<TS id=\"%04x\" on=\"%04x\" frq=\"%u\" inv=\"%hu\" band=\"%hu\" HP=\"%hu\" LP=\"%hu\" const=\"%hu\" trans=\"%hu\" guard=\"%hu\" hierarchy=\"%hu\">\n", tI->second.transport_stream_id, tI->second.original_network_id, tI->second.feparams.frequency, tI->second.feparams.inversion, tI->second.feparams.u.ofdm.bandwidth, tI->second.feparams.u.ofdm.code_rate_HP, tI->second.feparams.u.ofdm.code_rate_LP, tI->second.feparams.u.ofdm.constellation,tI->second.feparams.u.ofdm.transmission_mode, tI->second.feparams.u.ofdm.guard_interval, tI->second.feparams.u.ofdm.hierarchy_information); break; default: break; } tpid = tI->first; // loop througth channels for (ccI = allchans.begin(); ccI != allchans.end(); ccI++) { if(ccI->second.getTransponderId() == tpid) { if(!satdone) { switch(spos_it->second.type) { case DVB_S: { fprintf(fd, "\t<sat name=\"%s\" position=\"%hd\" diseqc=\"%hd\" uncommited=\"%hd\">\n",spos_it->second.name.c_str(), spos_it->first, spos_it->second.diseqc, spos_it->second.uncommited); } break; case DVB_C: { fprintf(fd, "\t<cable name=\"%s\">\n", spos_it->second.name.c_str()); } break; case DVB_T: { fprintf(fd, "\t<terrestrial name=\"%s\">\n", spos_it->second.name.c_str()); } break; default: break; } satdone = 1; } if(!tpdone) { fprintf(fd, "%s", tpstr); tpdone = 1; } if(ccI->second.getPidsFlag()) { fprintf(fd, "\t\t\t<S i=\"%04x\" n=\"%s\" v=\"%x\" a=\"%x\" p=\"%x\" pmt=\"%x\" tx=\"%x\" t=\"%x\" vt=\"%d\" s=\"%d\"/>\n", ccI->second.getServiceId(), convert_UTF8_To_UTF8_XML(ccI->second.getName().c_str()).c_str(), ccI->second.getVideoPid(), ccI->second.getPreAudioPid(), ccI->second.getPcrPid(), ccI->second.getPmtPid(), ccI->second.getTeletextPid(), ccI->second.getServiceType(true), ccI->second.videoType, ccI->second.scrambled); } else { fprintf(fd, "\t\t\t<S i=\"%04x\" n=\"%s\" t=\"%x\" s=\"%d\"/>\n", ccI->second.getServiceId(), convert_UTF8_To_UTF8_XML(ccI->second.getName().c_str()).c_str(), ccI->second.getServiceType(true), ccI->second.scrambled); } processed++; } } if(tpdone) fprintf(fd, "\t\t</TS>\n"); } if(satdone) { switch(spos_it->second.type) { case DVB_S: fprintf(fd, "\t</sat>\n"); break; case DVB_C: fprintf(fd, "\t</cable>\n"); break; case DVB_T: fprintf(fd, "\t</terrestrial>\n"); break; default: break; } } } fprintf(fd, "</zapit>\n"); fclose(fd); // create zapit ordner if missed struct stat statInfo; int res = stat(CONFIGDIR "/zapit", &statInfo); if (res == -1) { if (errno == ENOENT) { res = safe_mkdir((char *)CONFIGDIR "/zapit"); if (res != 0) perror("[getservices] mkdir"); } else { perror("[getservices] stat"); } } if(tocopy) { zapit_cp((char *) SERVICES_TMP, (char *) SERVICES_XML); unlink(SERVICES_TMP); } dprintf(DEBUG_INFO, "processed channels: %d\n", processed); }
// load services int loadServices(bool only_current) { xmlDocPtr parser; scnt = 0; dprintf(DEBUG_NORMAL, "getServices:loadServices:\n"); if(only_current) goto do_current; // parse services.xml parser = parseXmlFile(SERVICES_XML); if (parser != NULL) { xmlNodePtr search = xmlDocGetRootElement(parser)->xmlChildrenNode; while (search) { if (!(strcmp(xmlGetName(search), "sat"))) { // position t_satellite_position position = xmlGetSignedNumericAttribute(search, "position", 10); char * name = xmlGetAttribute(search, "name"); if(satellitePositions.find(position) == satellitePositions.end()) { init_sat(position); satellitePositions[position].name = name; } } // jump to the next node search = search->xmlNextNode; } FindTransponder( xmlDocGetRootElement(parser)->xmlChildrenNode ); xmlFreeDoc(parser); } // load motor position for(int i = 0; i < FrontendCount; i++) { if( getFE(i)->getInfo()->type == FE_QPSK) { loadMotorPositions(); break; } } dprintf(DEBUG_NORMAL, "[zapit] %d services loaded (%d)...\n", scnt, allchans.size()); do_current: dprintf(DEBUG_DEBUG, "loading current services\n"); if (scanSDT && (parser = parseXmlFile(CURRENTSERVICES_XML))) { newfound = 0; dprintf(DEBUG_INFO, "[getservices] " CURRENTSERVICES_XML " found.\n"); FindTransponder( xmlDocGetRootElement(parser)->xmlChildrenNode ); xmlFreeDoc(parser); unlink(CURRENTSERVICES_XML); if(newfound) SaveServices(true); //FIXME for second tuner } if(!only_current) { parser = parseXmlFile(MYSERVICES_XML); if (parser != NULL) { FindTransponder(xmlDocGetRootElement(parser)->xmlChildrenNode); xmlFreeDoc(parser); } } return 0; }
// load transponders int loadTransponders() { bool satcleared = 0; scnt = 0; t_satellite_position position = 0; //first postion dprintf(DEBUG_NORMAL, "getServices:loadTransponders:\n"); select_transponders.clear(); fake_tid = fake_nid = 0; if(!satcleared) satellitePositions.clear(); satcleared = 1; fe_type_t fe_type = FE_QAM; // parse sat tp for(int i = 0; i < FrontendCount; i++) { CFrontend * fe = getFE(i); fe_type = fe->getInfo()->type; //parseScanInputXml(i); parseScanInputXml(fe_type); if ( scanInputParser != NULL ) { xmlNodePtr search = xmlDocGetRootElement(scanInputParser)->xmlChildrenNode; while (search) { if (!(strcmp(xmlGetName(search), "sat"))) { // position position = xmlGetSignedNumericAttribute(search, "position", 10); char * name = xmlGetAttribute(search, "name"); if(satellitePositions.find(position) == satellitePositions.end()) { init_sat(position); } // name satellitePositions[position].name = name; // type satellitePositions[position].type = DVB_S; } else if(!(strcmp(xmlGetName(search), "cable"))) { //flags ??? //satfeed ??? char * name = xmlGetAttribute(search, "name"); if(satellitePositions.find(position) == satellitePositions.end()) { init_sat(position); } // name satellitePositions[position].name = name; // type //needed to resort list for scan menue satellitePositions[position].type = DVB_C; } else if(!(strcmp(xmlGetName(search), "terrestrial"))) { char * name = xmlGetAttribute(search, "name"); if(satellitePositions.find(position) == satellitePositions.end()) { init_sat(position); } // name satellitePositions[position].name = name; // type //needed to resort list for scan menue satellitePositions[position].type = DVB_T; } // parse sat TP ParseSatTransponders(fe_type, search, position); position++; search = search->xmlNextNode; } } } // satip if(g_settings.satip_allow_satip) { if(g_settings.satip_serverbox_type == DVB_C) fe_type = FE_QAM; else if(g_settings.satip_serverbox_type == DVB_S) fe_type = FE_QPSK; else if(g_settings.satip_serverbox_type == DVB_T) fe_type = FE_OFDM; parseScanInputXml(fe_type); if ( scanInputParser != NULL ) { xmlNodePtr search = xmlDocGetRootElement(scanInputParser)->xmlChildrenNode; while (search) { if (!(strcmp(xmlGetName(search), "sat"))) { // position position = xmlGetSignedNumericAttribute(search, "position", 10); char * name = xmlGetAttribute(search, "name"); if(satellitePositions.find(position) == satellitePositions.end()) { init_sat(position); } // name satellitePositions[position].name = name; // type satellitePositions[position].type = DVB_S; } else if(!(strcmp(xmlGetName(search), "cable"))) { //flags ??? //satfeed ??? char * name = xmlGetAttribute(search, "name"); if(satellitePositions.find(position) == satellitePositions.end()) { init_sat(position); } // name satellitePositions[position].name = name; // type //needed to resort list for scan menue satellitePositions[position].type = DVB_C; } else if(!(strcmp(xmlGetName(search), "terrestrial"))) { char * name = xmlGetAttribute(search, "name"); if(satellitePositions.find(position) == satellitePositions.end()) { init_sat(position); } // name satellitePositions[position].name = name; // type //needed to resort list for scan menue satellitePositions[position].type = DVB_T; } // parse sat TP ParseSatTransponders(fe_type, search, position); position++; search = search->xmlNextNode; } } } return 0; }
// scan services.xml void FindTransponder(xmlNodePtr search) { t_satellite_position satellitePosition = 0; uint8_t Source; newtpid = 0xC000; bool have_s = false; bool have_c = false; bool have_t = false; // frontend type for(int i = 0; i < FrontendCount; i++) { CFrontend * fe = getFE(i); if( fe->getDeliverySystem() == DVB_S ) have_s = true; if( fe->getDeliverySystem() == DVB_C ) have_c = true; if( fe->getDeliverySystem() == DVB_T ) have_t = true; } // satip if(g_settings.satip_allow_satip) { if(g_settings.satip_serverbox_type == DVB_C) have_c = true; else if(g_settings.satip_serverbox_type == DVB_S) have_s = true; else if(g_settings.satip_serverbox_type == DVB_T) have_t = true; } while (search) { if ( !(strcmp(xmlGetName(search), "cable")) && have_c) { Source = DVB_C; for (sat_iterator_t spos_it = satellitePositions.begin(); spos_it != satellitePositions.end(); spos_it++) { if( !strcmp(spos_it->second.name.c_str(), xmlGetAttribute(search, "name")) ) { satellitePosition = spos_it->first; break; } } dprintf(DEBUG_NORMAL, "getservices:FindTransponder: going to parse dvb-%c provider %s\n", xmlGetName(search)[0], xmlGetAttribute(search, "name")); } else if ( !(strcmp(xmlGetName(search), "terrestrial")) && have_t) { Source = DVB_T; for (sat_iterator_t spos_it = satellitePositions.begin(); spos_it != satellitePositions.end(); spos_it++) { if( !strcmp(spos_it->second.name.c_str(), xmlGetAttribute(search, "name")) ) { satellitePosition = spos_it->first; break; } } dprintf(DEBUG_NORMAL, "getservices:FindTransponder: going to parse dvb-%c provider %s\n", xmlGetName(search)[0], xmlGetAttribute(search, "name")); } else if ( !(strcmp(xmlGetName(search), "sat")) && have_s) { Source = DVB_S; satellitePosition = xmlGetSignedNumericAttribute(search, "position", 10); dprintf(DEBUG_NORMAL, "getservices:FindTransponder: going to parse dvb-%c provider %s position %d\n", xmlGetName(search)[0], xmlGetAttribute(search, "name"), satellitePosition); } else // unknow { search = search->xmlNextNode; continue; } // parse TP ParseTransponders(search->xmlChildrenNode, satellitePosition, Source ); newfound++; search = search->xmlNextNode; } }
void ParseChannels(xmlNodePtr node, const t_transport_stream_id transport_stream_id, const t_original_network_id original_network_id, t_satellite_position satellitePosition, freq_id_t freq, uint8_t polarisation) { t_service_id service_id; std::string name; uint8_t service_type; unsigned short vpid, apid, pcrpid, pmtpid, txpid, vtype, scrambled; std::string desc = ""; desc += "Preset"; t_channel_id chid; int dummy; int * have_ptr = &dummy; sat_iterator_t sit = satellitePositions.find(satellitePosition); if(sit != satellitePositions.end()) have_ptr = &sit->second.have_channels; while ((node = xmlGetNextOccurence(node, "S")) != NULL) { *have_ptr = 1; service_id = xmlGetNumericAttribute(node, "i", 16); name = xmlGetAttribute(node, "n"); service_type = xmlGetNumericAttribute(node, "t", 16); vpid = xmlGetNumericAttribute(node, "v", 16); apid = xmlGetNumericAttribute(node, "a", 16); pcrpid = xmlGetNumericAttribute(node, "p", 16); pmtpid = xmlGetNumericAttribute(node, "pmt", 16); txpid = xmlGetNumericAttribute(node, "tx", 16); vtype = xmlGetNumericAttribute(node, "vt", 16); scrambled = xmlGetNumericAttribute(node, "s", 16); chid = CREATE_CHANNEL_ID; char *ptr = xmlGetAttribute(node, "action"); bool remove = ptr ? (!strcmp(ptr, "remove") || !strcmp(ptr, "replace")) : false; bool add = ptr ? (!strcmp(ptr, "add") || !strcmp(ptr, "replace")) : true; if (remove) { int result = allchans.erase(chid); dprintf(DEBUG_INFO, "%s '%s' (sid=0x%x): %s", add ? "replacing" : "removing", name.c_str(), service_id, result ? "succeded.\n" : "FAILED!\n"); } if(!add) { node = node->xmlNextNode; continue; } map<t_channel_id, audio_map_set_t>::iterator audio_map_it; audio_map_it = audio_map.find(chid); if((audio_map_it != audio_map.end()) && (audio_map_it->second.apid != 0)) { apid = audio_map_it->second.apid; } pair<map<t_channel_id, CZapitChannel>::iterator, bool> ret; ret = allchans.insert (std::pair <t_channel_id, CZapitChannel> (chid, CZapitChannel( name, service_id, transport_stream_id, original_network_id, service_type, satellitePosition, freq))); if(ret.second == false) { dprintf(DEBUG_DEBUG, "getSevices:ParseChannels: duplicate channel %s id %llx freq %d (old %s at %d)\n", name.c_str(), chid, freq, ret.first->second.getName().c_str(), ret.first->second.getFreqId()); } else { scnt++; tallchans_iterator cit1 = ret.first; cit1->second.scrambled = scrambled; service_type = cit1->second.getServiceType(); cit1->second.polarization = polarisation; if(pmtpid != 0 && (((service_type == ST_DIGITAL_RADIO_SOUND_SERVICE) && (apid > 0)) || ( (service_type == ST_DIGITAL_TELEVISION_SERVICE) && (vpid > 0) && (apid > 0))) ) { cit1->second.setVideoPid(vpid); cit1->second.setAudioPid(apid); cit1->second.setPcrPid(pcrpid); cit1->second.setPmtPid(pmtpid); cit1->second.setTeletextPid(txpid); cit1->second.setPidsFlag(); cit1->second.videoType = vtype; } } node = node->xmlNextNode; } return; }
bool CServiceManager::SaveCurrentServices(transponder_id_t tpid) { channel_map_iterator_t ccI; channel_map_iterator_t dI; transponder_list_t::iterator tI; char satstr[256]; char buffer[256]; FILE * fd = 0; FILE * fd1 = 0; bool updated = 0; bool tpdone = 0; bool satfound = 0; tI = transponders.find(tpid); if(tI == transponders.end()) { printf("[sdt monitor] tp not found ?!\n"); return false; } t_satellite_position satellitePosition = GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tpid) & 0xFFF; if(GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tpid) & 0xF000) satellitePosition = -satellitePosition; fd = fopen(CURRENTSERVICES_TMP, "w"); if(!fd) { printf("[sdt monitor] " CURRENTSERVICES_TMP ": cant open!\n"); return false; } sat_iterator_t spos_it = satellitePositions.find(satellitePosition); if(spos_it == satellitePositions.end()){ fclose(fd); return false; } switch (CFrontend::getInstance()->getInfo()->type) { case FE_QPSK: /* satellite */ sprintf(satstr, "\t<%s name=\"%s\" position=\"%hd\">\n", "sat", spos_it->second.name.c_str(), satellitePosition); break; case FE_QAM: /* cable */ sprintf(satstr, "\t<%s name=\"%s\"\n", "cable", spos_it->second.name.c_str()); break; case FE_OFDM: default: break; } fd1 = fopen(CURRENTSERVICES_XML, "r"); if(!fd1) { fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<zapit>\n"); } else { fgets(buffer, 255, fd1); while(!feof(fd1) && !strstr(buffer, satfound ? "</sat>" : "</zapit>")) { if(!satfound && !strcmp(buffer, satstr)) satfound = 1; fputs(buffer, fd); fgets(buffer, 255, fd1); } } for (channel_map_iterator_t cI = curchans.begin(); cI != curchans.end(); cI++) { ccI = allchans.find(cI->second.getChannelID()); if(ccI == allchans.end()) { WriteCurrentService(fd, satfound, tpdone, updated, satstr, tI->second, cI->second, "add"); } else { if(strcmp(cI->second.getName().c_str(), ccI->second.getName().c_str()) || cI->second.scrambled != ccI->second.scrambled) { WriteCurrentService(fd, satfound, tpdone, updated, satstr, tI->second, cI->second, "replace"); } } } for (ccI = allchans.begin(); ccI != allchans.end(); ccI++) { if(ccI->second.getTransponderId() == tpid) { dI = curchans.find(ccI->second.getChannelID()); if(dI == curchans.end()) WriteCurrentService(fd, satfound, tpdone, updated, satstr, tI->second, ccI->second, "remove"); } } if(tpdone) { fprintf(fd, "\t\t</TS>\n"); fprintf(fd, "\t</sat>\n"); } else if(satfound) fprintf(fd, "\t</sat>\n"); if(fd1) { fgets(buffer, 255, fd1); while(!feof(fd1)) { fputs(buffer, fd); fgets(buffer, 255, fd1); } if(!satfound) fprintf(fd, "</zapit>\n"); fclose(fd1); } else fprintf(fd, "</zapit>\n"); fclose(fd); rename(CURRENTSERVICES_TMP, CURRENTSERVICES_XML); return updated; }
void CServiceManager::SaveServices(bool tocopy) { transponder_id_t tpid = 0; FILE * fd = 0; bool updated = 0; channel_map_iterator_t ccI; channel_map_iterator_t dI; transponder_list_t::iterator tI; bool tpdone = 0; bool satdone = 0; int processed = 0; sat_iterator_t spos_it; updated = 0; #ifdef SAVE_DEBUG set<t_channel_id> chans_processed; DBG("\nChannel size: %d\n", sizeof(CZapitChannel)); #endif printf("total channels: %d\n", allchans.size()); fd = fopen(SERVICES_TMP, "w"); if(!fd) { perror(SERVICES_TMP); return; } fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<zapit api=\"3\">\n"); for (spos_it = satellitePositions.begin(); spos_it != satellitePositions.end(); spos_it++) { satdone = 0; #ifdef SAVE_DEBUG printf("Process sat: %s\n", spos_it->second.name.c_str()); printf("processed channels: %d\n", chans_processed.size()); printf("tp count: %d\n", transponders.size()); #endif for(tI = transponders.begin(); tI != transponders.end(); tI++) { t_satellite_position satpos = GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first) & 0xFFF; tpdone = 0; if(GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first) & 0xF000) satpos = -satpos; if(satpos != spos_it->first) { #ifdef SAVE_DEBUG printf("Sat position %d not found !!\n", satpos); #endif continue; } tpid = tI->first; for (ccI = allchans.begin(); ccI != allchans.end(); ccI++) { if(ccI->second.getTransponderId() == tpid) { if(!satdone) { WriteSatHeader(fd, spos_it->second); satdone = 1; } if(!tpdone) { WriteTransponderHeader(fd, tI->second); tpdone = 1; } ccI->second.dumpServiceXml(fd); processed++; #ifdef SAVE_DEBUG chans_processed.insert(ccI->second.getChannelID()); #endif } } if(tpdone) fprintf(fd, "\t\t</TS>\n"); } if(satdone) { switch (CFrontend::getInstance()->getInfo()->type) { case FE_QPSK: fprintf(fd, "\t</sat>\n"); break; case FE_QAM: fprintf(fd, "\t</cable>\n"); break; default: break; } } } fprintf(fd, "</zapit>\n"); fclose(fd); if(tocopy) { CopyFile((char *) SERVICES_TMP, (char *) SERVICES_XML); unlink(SERVICES_TMP); } #ifdef SAVE_DEBUG printf("processed channels: %d\n", chans_processed.size()); int i = 0; for (channel_map_iterator_t it = allchans.begin(); it != allchans.end(); it++) if (chans_processed.find(it->first) == chans_processed.end()) printf("unused channel %d sat %d freq %d sid %04X: %s\n", ++i, it->second.getSatellitePosition(), it->second.getFreqId(), it->second.getServiceId(), it->second.getName().c_str()); chans_processed.clear(); #endif printf("processed channels: %d\n", processed); }
bool CServiceManager::LoadServices(bool only_current) { xmlDocPtr parser; static bool satcleared = 0;//clear only once, because menu is static service_count = 0; printf("[zapit] Loading services, channel size %d ..\n", sizeof(CZapitChannel)); fe_type_t frontendType = CFrontend::getInstance()->getInfo()->type; if(only_current) goto do_current; TIMER_START(); allchans.clear(); transponders.clear(); select_transponders.clear(); fake_tid = fake_nid = 0; if (ParseScanXml()) { t_satellite_position position = 0; if(!satcleared) satellitePositions.clear(); satcleared = 1; xmlNodePtr search = xmlDocGetRootElement(scanInputParser)->xmlChildrenNode; while (search) { if (!(strcmp(xmlGetName(search), "sat"))) { position = xmlGetSignedNumericAttribute(search, "position", 10); char * name = xmlGetAttribute(search, "name"); /* FIXME reuse this */ if(satellitePositions.find(position) == satellitePositions.end()) { InitSatPosition(position); } satellitePositions[position].name = name; } else if(!(strcmp(xmlGetName(search), "cable"))) { char * name = xmlGetAttribute(search, "name"); if(satellitePositions.find(position) == satellitePositions.end()) { InitSatPosition(position); } satellitePositions[position].name = name; } ParseSatTransponders(frontendType, search, position); position++; search = search->xmlNextNode; } } parser = parseXmlFile(SERVICES_XML); if (parser != NULL) { xmlNodePtr search = xmlDocGetRootElement(parser)->xmlChildrenNode; while (search) { if (!(strcmp(xmlGetName(search), "sat"))) { t_satellite_position position = xmlGetSignedNumericAttribute(search, "position", 10); char * name = xmlGetAttribute(search, "name"); if(satellitePositions.find(position) == satellitePositions.end()) { InitSatPosition(position); satellitePositions[position].name = name; } } search = search->xmlNextNode; } FindTransponder(xmlDocGetRootElement(parser)->xmlChildrenNode); xmlFreeDoc(parser); } if(frontendType == FE_QPSK) { LoadMotorPositions(); } printf("[zapit] %d services loaded (%d)...\n", service_count, allchans.size()); TIMER_STOP("[zapit] service loading took"); if(0) { //zapit_debug) {//FIXME sat_iterator_t sit; for(sit = satellitePositions.begin(); sit != satellitePositions.end(); sit++) printf("satelliteName = %s (%d), satellitePosition = %d motor position = %d usals %d\n", sit->second.name.c_str(), sit->second.name.size(), sit->first, sit->second.motor_position, sit->second.use_usals); } do_current: DBG("Loading current..\n"); if (CZapit::getInstance()->scanSDT() && (parser = parseXmlFile(CURRENTSERVICES_XML))) { newfound = 0; printf("[getservices] " CURRENTSERVICES_XML " found.\n"); FindTransponder(xmlDocGetRootElement(parser)->xmlChildrenNode); xmlFreeDoc(parser); unlink(CURRENTSERVICES_XML); if(newfound) SaveServices(true); } if(!only_current) { parser = parseXmlFile(MYSERVICES_XML); if (parser != NULL) { FindTransponder(xmlDocGetRootElement(parser)->xmlChildrenNode); xmlFreeDoc(parser); } } return true; }
void CServiceManager::ParseChannels(xmlNodePtr node, const t_transport_stream_id transport_stream_id, const t_original_network_id original_network_id, t_satellite_position satellitePosition, freq_id_t freq) { t_service_id service_id; std::string name; uint8_t service_type; unsigned short vpid, apid, pcrpid, pmtpid, txpid, vtype, scrambled; std::string desc = ""; desc += "Preset"; t_channel_id chid; int dummy; int * have_ptr = &dummy; sat_iterator_t sit = satellitePositions.find(satellitePosition); if(sit != satellitePositions.end()) have_ptr = &sit->second.have_channels; while ((node = xmlGetNextOccurence(node, "S")) != NULL) { *have_ptr = 1; service_id = xmlGetNumericAttribute(node, "i", 16); name = xmlGetAttribute(node, "n"); service_type = xmlGetNumericAttribute(node, "t", 16); vpid = xmlGetNumericAttribute(node, "v", 16); apid = xmlGetNumericAttribute(node, "a", 16); pcrpid = xmlGetNumericAttribute(node, "p", 16); pmtpid = xmlGetNumericAttribute(node, "pmt", 16); txpid = xmlGetNumericAttribute(node, "tx", 16); vtype = xmlGetNumericAttribute(node, "vt", 16); scrambled = xmlGetNumericAttribute(node, "s", 16); chid = CREATE_CHANNEL_ID64; char *ptr = xmlGetAttribute(node, "action"); bool remove = ptr ? (!strcmp(ptr, "remove") || !strcmp(ptr, "replace")) : false; bool add = ptr ? (!strcmp(ptr, "add") || !strcmp(ptr, "replace")) : true; if (remove) { int result = allchans.erase(chid); printf("[getservices]: %s '%s' (sid=0x%x): %s", add ? "replacing" : "removing", name.c_str(), service_id, result ? "succeded.\n" : "FAILED!\n"); } if(!add) { node = node->xmlNextNode; continue; } audio_map_set_t * pidmap = CZapit::getInstance()->GetSavedPids(chid); if(pidmap) apid = pidmap->apid; CZapitChannel * channel = new CZapitChannel ( name, service_id, transport_stream_id, original_network_id, service_type, satellitePosition, freq); bool ret = AddChannel(channel); //printf("INS CHANNEL %s %x\n", name.c_str(), (int) &ret.first->second); if(ret == false) { printf("[zapit] duplicate channel %s id %llx freq %d (old %s at %d)\n", name.c_str(), chid, freq, channel->getName().c_str(), channel->getFreqId()); } else { service_count++; channel->scrambled = scrambled; service_type = channel->getServiceType(); if(pmtpid != 0 && (((service_type == 2) && (apid > 0)) || ( (service_type == 1) && (vpid > 0) && (apid > 0))) ) { DBG("[getserv] preset chan %s vpid %X sid %X tpid %X onid %X\n", name.c_str(), vpid, service_id, transport_stream_id, transport_stream_id); channel->setVideoPid(vpid); channel->setAudioPid(apid); channel->setPcrPid(pcrpid); channel->setPmtPid(pmtpid); channel->setTeletextPid(txpid); channel->setPidsFlag(); channel->type = vtype; } } node = node->xmlNextNode; } return; }