int CFollowScreenings::exec(CMenuTarget* /*parent*/, const std::string & actionKey)
{
	unsigned long a;
	if (1 == sscanf(actionKey.c_str(), "%lu", &a)) {
		int ix = 0;
		CChannelEventList::iterator e;
		for (e = followlist.begin(); e != followlist.end(); e++, ix++)
			if ((time_t)a == e->startTime) {
				time_t start = e->startTime - (ANNOUNCETIME + 120);
				time_t stop = e->startTime + e->duration;
				CTimerd::TimerList overlappingTimers = Timer.getOverlappingTimers(start, stop);
				CTimerd::TimerList::iterator i;
				for (i = overlappingTimers.begin(); i != overlappingTimers.end(); i++)
					if (i->eventType == CTimerd::TIMER_RECORD) {
						if (channel_id == i->channel_id && e->startTime == i->epg_starttime) {
							Timer.removeTimerEvent(i->eventID);
							if (!forwarders.empty())
								forwarders[ix]->iconName_Info_right = "";
#if 0
							else
								ShowMsg(LOCALE_TIMER_EVENTREMOVED_TITLE, LOCALE_TIMER_EVENTREMOVED_MSG,
									CMessageBox::mbrBack, CMessageBox::mbBack, NEUTRINO_ICON_INFO);
#endif
							return menu_return::RETURN_REPAINT;
						}
						if (!SAME_TRANSPONDER(channel_id, i->channel_id)) {
							if (!askUserOnTimerConflict(start, stop, channel_id))
								return menu_return::RETURN_REPAINT;
						}
					}

				if (g_Timerd->addRecordTimerEvent(channel_id, e->startTime, e->startTime + e->duration, e->eventID,
								  e->startTime, e->startTime - (ANNOUNCETIME + 120 ), apids, true, e->startTime - (ANNOUNCETIME + 120) > time(NULL), recDir, true) == -1) {
					//FIXME -- no error handling, but this shouldn't happen ...
				} else {
					if (!forwarders.empty())
						forwarders[ix]->iconName_Info_right = NEUTRINO_ICON_REC;
#if 0
					else
						ShowMsg(LOCALE_TIMER_EVENTRECORD_TITLE, LOCALE_TIMER_EVENTRECORD_MSG,
							CMessageBox::mbrBack, CMessageBox::mbBack, NEUTRINO_ICON_INFO);
#endif
					return menu_return::RETURN_REPAINT;
				}
				break; // for
			}
		return menu_return::RETURN_EXIT_ALL;
	}
	show();
	return menu_return::RETURN_EXIT_ALL;
}
void CFollowScreenings::updateRightIcon(int ix, time_t start, unsigned int duration) {
	time_t stop = start + duration;
	start -= (ANNOUNCETIME + 120);
	CTimerd::TimerList overlappingTimers = Timer.getOverlappingTimers(start, stop);
	start += (ANNOUNCETIME + 120);
	CTimerd::TimerList::iterator i;
	for (i = overlappingTimers.begin(); i != overlappingTimers.end(); i++)
		if (i->eventType == CTimerd::TIMER_RECORD) {
			if (channel_id == i->channel_id && start == i->epg_starttime) {
				forwarders[ix]->iconName_Info_right = NEUTRINO_ICON_REC;
				return;
			}
			if (!SAME_TRANSPONDER(channel_id, i->channel_id)) {
				forwarders[ix]->iconName_Info_right = NEUTRINO_ICON_IMPORTANT;
				return;
			}
		}
}
Example #3
0
bool CStreamManager::Parse(int fd, stream_pids_t &pids, t_channel_id &chid)
{
	char cbuf[512];
	char *bp;

	FILE * fp = fdopen(fd, "r+");
	if(fp == NULL) {
		perror("fdopen");
		return false;
	}
	cbuf[0] = 0;
	bp = &cbuf[0];

	/* read one line */
	while (bp - &cbuf[0] < (int) sizeof(cbuf)) {
		unsigned char c;
		int res = read(fd, &c, 1);
		if(res < 0) {
			perror("read");
			return false;
		}
		if ((*bp++ = c) == '\n')
			break;
	}

	*bp++ = 0;
	bp = &cbuf[0];

	printf("CStreamManager::Parse: got %s\n", cbuf);

	/* send response to http client */
	if (!strncmp(cbuf, "GET /", 5)) {
		fprintf(fp, "HTTP/1.1 200 OK\r\nServer: streamts (%s)\r\n\r\n", "ts" /*&argv[1][1]*/);
		fflush(fp);
		bp += 5;
	} else {
		printf("Received garbage\n");
		return false;
	}

#ifndef ENABLE_MULTI_CHANNEL
	/* parse stdin / url path, start dmx filters */
	do {
		int pid;
		int res = sscanf(bp, "%x", &pid);
		if(res == 1) {
			printf("New pid: 0x%x\n", pid);
			pids.insert(pid);
		}
	}
	while ((bp = strchr(bp, ',')) && (bp++));
#endif

	chid = CZapit::getInstance()->GetCurrentChannelID();
	CZapitChannel * channel = CZapit::getInstance()->GetCurrentChannel();

	int mode = CNeutrinoApp::getInstance()->getMode();
	if (mode == NeutrinoMessages::mode_standby && streams.empty()) {
		printf("CStreamManager::Parse: wakeup zapit..\n");
		cpuFreq->SetCpuFreq(g_settings.cpufreq * 1000 * 1000);
		g_Zapit->setStandby(false);
		g_Zapit->getMode();
	}
	if(pids.empty()) {
#ifdef ENABLE_MULTI_CHANNEL
		t_channel_id tmpid;
		bp = &cbuf[5];
		if (sscanf(bp, "id=%llx", &tmpid) == 1) {
			printf("############################# channel_id %llx\n", tmpid);

			CZapitChannel * tmpchan = CServiceManager::getInstance()->FindChannel(tmpid);
			if (tmpchan && (tmpid != chid) && SAME_TRANSPONDER(tmpid, chid)) {
				printf("############################# channel_id %llx -> zap\n", tmpid);
				bool ret = g_Zapit->zapTo_record(tmpid) > 0;
				if (ret) {
					channel = tmpchan;
					chid = tmpid;
				}
			}
		}
		if(CRecordManager::getInstance()->RecordingStatus(chid)) {
			printf("CStreamManager::Parse: channel %llx recorded, aborting..\n", chid);
			return false;
		}
#ifdef ENABLE_PIP
		t_channel_id pip_channel_id = CZapit::getInstance()->GetPipChannelID();
		if ((chid == pip_channel_id) && (channel->getRecordDemux() == channel->getPipDemux())) {
			printf("CStreamManager::Parse: channel %llx used for pip, aborting..\n", chid);
			return false;
		}
#endif
#endif

		printf("CStreamManager::Parse: no pids in url, using channel %llx pids\n", chid);
		if(!channel)
			return false;
		//pids.insert(0);
		//pids.insert(channel->getPmtPid());
		pids.insert(channel->getVideoPid());
		for (int i = 0; i <  channel->getAudioChannelCount(); i++)
			pids.insert(channel->getAudioChannel(i)->pid);

	}
	CGenPsi psi;
	for (stream_pids_t::iterator it = pids.begin(); it != pids.end(); ++it) {
		if (*it == channel->getVideoPid()) {
			printf("CStreamManager::Parse: genpsi vpid %x (%d)\n", *it, channel->type);
			psi.addPid(*it, channel->type ? EN_TYPE_AVC : EN_TYPE_VIDEO, 0);
		} else {
			for (int i = 0; i <  channel->getAudioChannelCount(); i++) {
				if (*it == channel->getAudioChannel(i)->pid) {
					CZapitAudioChannel::ZapitAudioChannelType atype = channel->getAudioChannel(i)->audioChannelType;
					printf("CStreamManager::Parse: genpsi apid %x (%d)\n", *it, atype);
					if(channel->getAudioChannel(i)->audioChannelType == CZapitAudioChannel::EAC3){
						psi.addPid(*it, EN_TYPE_AUDIO_EAC3, atype, channel->getAudioChannel(i)->description.c_str());
					}else{
						psi.addPid(*it, EN_TYPE_AUDIO, atype, channel->getAudioChannel(i)->description.c_str());
					}
				}
			}
		}
	}
	//add pcr pid
	if(channel->getPcrPid() != channel->getVideoPid()){
		pids.insert(channel->getPcrPid());
		psi.addPid(channel->getPcrPid(), EN_TYPE_PCR, 0);
	}
	//add teletext pid
	if (g_settings.recording_stream_vtxt_pid && channel->getTeletextPid() != 0){
		pids.insert(channel->getTeletextPid());
		psi.addPid(channel->getTeletextPid(), EN_TYPE_TELTEX, 0, channel->getTeletextLang());
	}
	//add dvb sub pid
	if (g_settings.recording_stream_subtitle_pids){
		for (int i = 0 ; i < (int)channel->getSubtitleCount() ; ++i) {
			CZapitAbsSub* s = channel->getChannelSub(i);
			if (s->thisSubType == CZapitAbsSub::DVB) {
				if(i>9)//max sub pids
					break;

				CZapitDVBSub* sd = reinterpret_cast<CZapitDVBSub*>(s);
				pids.insert(sd->pId);
				psi.addPid( sd->pId, EN_TYPE_DVBSUB, 0, sd->ISO639_language_code.c_str() );
			}
		}

	}

	psi.genpsi(fd);

	return !pids.empty();
}