void CVCRControl::CFileDevice::appendEPGTitle(char *buf, unsigned int size, const event_id_t epgid, const std::string& epgTitleTimer) { CSectionsdClient sdc; CShortEPGData epgdata; std::string epgTitle; if (size > 0) buf[0] = '\0'; if (sdc.getEPGidShort(epgid, &epgdata)) epgTitle = epgdata.title; else epgTitle = epgTitleTimer; if (!(epgTitle.empty()) && epgTitle.size() < size) { #warning fixme sectionsd should deliver data in UTF-8 format // strcpy(&(filename[pos]), Latin1_to_UTF8(epgdata.title).c_str()); // all characters with code >= 128 will be discarded anyway strcpy(buf, epgTitle.c_str()); char * p_act = buf; do { p_act += strspn(p_act, FILENAME_ALLOWED_CHARS); if (*p_act) { *p_act++ = '_'; } } while (*p_act); } }
void CTimerEvent_Record::fireEvent() { // Set EPG-ID if not set if(eventInfo.epgID == 0) { dprintf("EPG-ID not set, trying now\n"); CSectionsdClient* sdc = new CSectionsdClient(); CEPGData e; sdc->getActualEPGServiceKey(eventInfo.channel_id, &e ); dprintf("EPG-ID found %llu:%d(%s)\n",e.eventID,(int)e.epg_times.startzeit,e.title.c_str()); eventInfo.epgID = e.eventID ; } CTimerManager::getInstance()->getEventServer()->sendEvent( CTimerdClient::EVT_RECORD_START, CEventServer::INITID_TIMERD, &eventInfo, sizeof(CTimerd::EventInfo)); dprintf("Record Timer fired\n"); }
//------------------------------------------------------------------------- bool CVCRControl::CServerDevice::sendCommand(CVCRCommand command, const t_channel_id channel_id, unsigned long long epgid, uint apid) { printf("Send command: %d channel_id: %x epgid: %llx\n",command, channel_id, epgid); if(serverConnect()) { char tmp[40]; string extCommand="unknown"; string ext_channel_id = "error"; string ext_channel_name = "unknown"; string extEpgid="error"; string extVideoPID="error"; string extAudioPID="error"; string extEPGTitle="not available"; sprintf(tmp,"%u", channel_id); ext_channel_id = tmp; sprintf(tmp,"%llu", epgid); extEpgid = tmp; // sprintf(tmp,"%u", g_RemoteControl->current_PIDs.PIDs.vpid ); CZapitClient::responseGetPIDs pids; g_Zapit->getPIDS (pids); CZapitClient::CCurrentServiceInfo si = g_Zapit->getCurrentServiceInfo (); sprintf(tmp,"%u", si.vdid ); extVideoPID = tmp; // sprintf(tmp,"%u", g_RemoteControl->current_PIDs.APIDs[g_RemoteControl->current_PIDs.PIDs.selected_apid].pid); if(apid==0) apid=(uint)si.apid; sprintf(tmp,"%u", apid); extAudioPID = tmp; CZapitClient::BouquetChannelList channellist; g_Zapit->getChannels(channellist); CZapitClient::BouquetChannelList::iterator channel = channellist.begin(); for(; channel != channellist.end();channel++) { if(channel->channel_id==channel_id) { ext_channel_name=channel->name; break; } } CSectionsdClient sections; CSectionsdClient::responseGetCurrentNextInfoChannelID current_next; if(sections.getCurrentNextServiceKey(channel_id, current_next)) { extEPGTitle=current_next.current_name; } switch(command) { case CMD_VCR_RECORD: extCommand="record"; break; case CMD_VCR_STOP: extCommand="stop"; break; case CMD_VCR_PAUSE: extCommand="pause"; break; case CMD_VCR_RESUME: extCommand="resume"; break; case CMD_VCR_AVAILABLE: extCommand="available"; break; case CMD_VCR_UNKNOWN: default: printf("CVCRControl: Unknown Command\n"); } string extMessage = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n\n"; extMessage +="<neutrino commandversion=\"1\">\n"; extMessage +=" <record command=\"" + extCommand + "\">\n"; extMessage +=" <channelname>" + ext_channel_name + "</channelname>\n"; extMessage +=" <epgtitle>" + extEPGTitle + "</epgtitle>\n"; extMessage +=" <onidsid>" + ext_channel_id + "</onidsid>\n"; extMessage +=" <epgid>" + extEpgid + "</epgid>\n"; extMessage +=" <videopid>" + extVideoPID + "</videopid>\n"; extMessage +=" <audiopids selected=\"" + extAudioPID + "\">\n"; // super hack :-), der einfachste weg an die apid descriptions ranzukommen g_RemoteControl->current_PIDs = pids; g_RemoteControl->processAPIDnames(); bool apidFound=false; for(unsigned int i= 0; i< pids.APIDs.size(); i++) { sprintf(tmp, "%u", pids.APIDs[i].pid ); extMessage +=" <audio pid=\"" + string(tmp) + "\" name=\"" + string(g_RemoteControl->current_PIDs.APIDs[i].desc) + "\">\n"; if(pids.APIDs[i].pid==apid) apidFound=true; } if(!apidFound) { // add spec apid to available extMessage +=" <audio pid=\"" + extAudioPID + "\" name=\"" + extAudioPID + "\"/>\n"; } extMessage +=" </audiopids>\n"; extMessage +=" </record>\n"; extMessage +="</neutrino>\n"; printf("sending to vcr-client:\n\n%s\n", extMessage.c_str()); write(sock_fd, extMessage.c_str() , extMessage.length() ); serverDisconnect(); deviceState = command; return true; } else return false; }
//------------------------------------------------------------------------- // Template 1:classname, 2:zAlarmTime, 3: zStopTime, 4:zRep, 5:zRepCouunt // 6:zType, 7:sAddData, 8:timer->eventID, 9:timer->eventID //------------------------------------------------------------------------- std::string CNeutrinoYParser::func_get_timer_list(CyhookHandler *, std::string para) { std::string yresult; CTimerd::TimerList timerlist; // List of bouquets timerlist.clear(); NeutrinoAPI->Timerd->getTimerList(timerlist); sort(timerlist.begin(), timerlist.end()); CZapitClient::BouquetChannelList channellist_tv; CZapitClient::BouquetChannelList channellist_radio; channellist_tv.clear(); channellist_radio.clear(); int i = 1; char classname= 'a'; CTimerd::TimerList::iterator timer = timerlist.begin(); for(; timer != timerlist.end();timer++) { classname = (i++&1)?'a':'b'; // build alarm/stoptime char zAlarmTime[25] = {0}; struct tm *alarmTime = localtime(&(timer->alarmTime)); strftime(zAlarmTime,20,"%d.%m. %H:%M",alarmTime); char zAnnounceTime[25] = {0}; struct tm *announceTime = localtime(&(timer->announceTime)); strftime(zAnnounceTime,20,"%d.%m. %H:%M",announceTime); char zStopTime[25] = {0}; if(timer->stopTime > 0) { struct tm *stopTime = localtime(&(timer->stopTime)); strftime(zStopTime,20,"%d.%m. %H:%M",stopTime); } // repeat std::string zRep = NeutrinoAPI->timerEventRepeat2Str(timer->eventRepeat); std::string zRepCount; if (timer->eventRepeat == CTimerd::TIMERREPEAT_ONCE) zRepCount = "-"; else zRepCount = (timer->repeatCount == 0) ? "∞" : string_printf("%dx",timer->repeatCount); // timer type std::string zType = NeutrinoAPI->timerEventType2Str(timer->eventType); // Add Data std::string sAddData=""; switch(timer->eventType) { case CTimerd::TIMER_NEXTPROGRAM : case CTimerd::TIMER_ZAPTO : case CTimerd::TIMER_RECORD : { sAddData = NeutrinoAPI->GetServiceName(timer->channel_id); if (sAddData.empty()) sAddData = NeutrinoAPI->Zapit->isChannelTVChannel(timer->channel_id) ? "Unknown TV-Channel" : "Unknown Radio-Channel"; if( timer->apids != TIMERD_APIDS_CONF) { std::string separator = ""; sAddData += '('; if( timer->apids & TIMERD_APIDS_STD ) { sAddData += "STD"; separator = "/"; } if( timer->apids & TIMERD_APIDS_ALT ) { sAddData += separator; sAddData += "ALT"; separator = "/"; } if( timer->apids & TIMERD_APIDS_AC3 ) { sAddData += separator; sAddData += "AC3"; separator = "/"; } sAddData += ')'; } if(timer->epgID!=0) { CSectionsdClient sdc; CEPGData epgdata; if (sdc.getEPGid(timer->epgID, timer->epg_starttime, &epgdata)) sAddData+="<br/>" + epgdata.title; else sAddData+=std::string("<br/>")+timer->epgTitle; } else sAddData+=std::string("<br/>")+timer->epgTitle; } break; case CTimerd::TIMER_STANDBY : { sAddData = "Standby: "; if(timer->standby_on) sAddData+= "An"; else sAddData+="Aus"; } break; case CTimerd::TIMER_REMIND : sAddData = std::string(timer->message).substr(0,20); break; case CTimerd::TIMER_EXEC_PLUGIN : sAddData = std::string(timer->pluginName); break; default:{} } yresult += string_printf(para.c_str(), classname, zAlarmTime, zStopTime, zRep.c_str(), zRepCount.c_str(), zType.c_str(), sAddData.c_str(),timer->eventID,timer->eventID); } classname = (i++&1)?'a':'b'; return yresult; }
int main(int argc, char **argv) { int listenfd, connfd; struct sockaddr_un servaddr; int clilen; bool do_fork = true; bool no_wait = false; doLoop=true; dprintf("startup!!!\n\n"); if(argc > 1) { for(int i = 1; i < argc; i++) { if(strncmp(argv[i], "-f", 2) == 0) { do_fork = false; } else if(strncmp(argv[i], "-w", 2) == 0) { no_wait=true; } } } if(do_fork) { switch(fork()) { case -1: perror("[timerd] fork"); return -1; case 0: break; default: return 0; } if(setsid() == -1) { perror("[timerd] setsid"); return -1; } } memset(&servaddr, 0, sizeof(struct sockaddr_un)); servaddr.sun_family = AF_UNIX; strcpy(servaddr.sun_path, TIMERD_UDS_NAME); clilen = sizeof(servaddr.sun_family) + strlen(servaddr.sun_path); unlink(TIMERD_UDS_NAME); //network-setup if((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { dperror("error while socket create"); } if( bind(listenfd, (struct sockaddr*) &servaddr, clilen) <0 ) { dperror("bind failed..."); exit(-1); } if(listen(listenfd, 15) !=0) { perror("listen failed..."); exit( -1 ); } if(!no_wait) { // wait for correct date to be set... CSectionsdClient sectionsd; while(!sectionsd.getIsTimeSet()) sleep(1); } loadTimersFromConfig(); //startup Timer try { CBasicMessage::Header rmessage; while(doLoop) // wait for incomming messages { connfd = accept(listenfd, (struct sockaddr*) &servaddr, (socklen_t*) &clilen); memset(&rmessage, 0, sizeof(rmessage)); read(connfd,&rmessage,sizeof(rmessage)); parse_command(connfd, &rmessage); close(connfd); } } catch(std::exception& e) { dprintf("caught std-exception in main-thread %s!\n", e.what()); } catch(...) { dprintf("caught exception in main-thread!\n"); } }
std::string CVCRControl::CFileAndServerDevice::getCommandString(const CVCRCommand command, const t_channel_id channel_id, const event_id_t epgid, const std::string& epgTitle, unsigned char apids) { char tmp[40]; std::string apids_selected; const char * extCommand; // std::string extAudioPID= "error"; std::string info1, info2; std::string extMessage = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<neutrino commandversion=\"1\">\n\t<record command=\""; switch(command) { case CMD_VCR_RECORD: extCommand = "record"; break; case CMD_VCR_STOP: extCommand = "stop"; break; case CMD_VCR_PAUSE: extCommand = "pause"; break; case CMD_VCR_RESUME: extCommand = "resume"; break; case CMD_VCR_AVAILABLE: extCommand = "available"; break; case CMD_VCR_UNKNOWN: default: extCommand = "unknown"; printf("[CVCRControl] Unknown Command\n"); } extMessage += extCommand; extMessage += "\">\n" "\t\t<channelname>"; CZapitClient::responseGetPIDs pids; g_Zapit->getPIDS (pids); CZapitClient::CCurrentServiceInfo si = g_Zapit->getCurrentServiceInfo (); APIDList apid_list; getAPIDs(apids,apid_list); apids_selected=""; for(APIDList::iterator it = apid_list.begin(); it != apid_list.end(); it++) { if(it != apid_list.begin()) apids_selected += " "; sprintf(tmp, "%u", it->apid); apids_selected += tmp; } std::string tmpstring = g_Zapit->getChannelName(channel_id); if (tmpstring.empty()) extMessage += "unknown"; else extMessage += ZapitTools::UTF8_to_UTF8XML(tmpstring.c_str()); extMessage += "</channelname>\n\t\t<epgtitle>"; // CSectionsdClient::responseGetCurrentNextInfoChannelID current_next; tmpstring = "not available"; if (epgid != 0) { CSectionsdClient sdc; CShortEPGData epgdata; if (sdc.getEPGidShort(epgid, &epgdata)) { #warning fixme sectionsd should deliver data in UTF-8 format tmpstring = Latin1_to_UTF8(epgdata.title); info1 = Latin1_to_UTF8(epgdata.info1); info2 = Latin1_to_UTF8(epgdata.info2); } else if (!epgTitle.empty()) { tmpstring = epgTitle; } } else if (!epgTitle.empty()) { tmpstring = epgTitle; } extMessage += ZapitTools::UTF8_to_UTF8XML(tmpstring.c_str()); extMessage += "</epgtitle>\n\t\t<id>"; sprintf(tmp, PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS, channel_id); extMessage += tmp; extMessage += "</id>\n\t\t<info1>"; extMessage += ZapitTools::UTF8_to_UTF8XML(info1.c_str()); extMessage += "</info1>\n\t\t<info2>"; extMessage += ZapitTools::UTF8_to_UTF8XML(info2.c_str()); extMessage += "</info2>\n\t\t<epgid>"; sprintf(tmp, "%llu", epgid); extMessage += tmp; extMessage += "</epgid>\n\t\t<mode>"; sprintf(tmp, "%d", g_Zapit->getMode()); extMessage += tmp; extMessage += "</mode>\n\t\t<videopid>"; sprintf(tmp, "%u", si.vpid); extMessage += tmp; extMessage += "</videopid>\n\t\t<audiopids selected=\""; extMessage += apids_selected; extMessage += "\">\n"; // super hack :-), der einfachste weg an die apid descriptions ranzukommen g_RemoteControl->current_PIDs = pids; g_RemoteControl->processAPIDnames(); for(unsigned int i= 0; i< pids.APIDs.size(); i++) { extMessage += "\t\t\t<audio pid=\""; sprintf(tmp, "%u", pids.APIDs[i].pid); extMessage += tmp; extMessage += "\" name=\""; extMessage += ZapitTools::UTF8_to_UTF8XML(g_RemoteControl->current_PIDs.APIDs[i].desc); extMessage += "\"/>\n"; } extMessage += "\t\t</audiopids>\n" "\t\t<vtxtpid>"; sprintf(tmp, "%u", si.vtxtpid); extMessage += tmp; extMessage += "</vtxtpid>\n" "\t</record>\n" "</neutrino>\n"; return extMessage; }
std::string CVCRControl::CFileAndServerDevice::getMovieInfoString(const t_channel_id channel_id, const event_id_t epgid, const time_t epg_time) { std::string extMessage; CMovieInfo cMovieInfo; MI_MOVIE_INFO movieInfo; std::string info1, info2; cMovieInfo.clearMovieInfo(&movieInfo); CZapitClient::responseGetPIDs pids; g_Zapit->getPIDS (pids); CZapitClient::CCurrentServiceInfo si = g_Zapit->getCurrentServiceInfo (); std::string tmpstring = g_Zapit->getChannelName(channel_id); if (tmpstring.empty()) movieInfo.epgChannel = "unknown"; else movieInfo.epgChannel = ZapitTools::UTF8_to_UTF8XML(tmpstring.c_str()); tmpstring = "not available"; if (epgid != 0) { //#define SHORT_EPG #ifdef SHORT_EPG CSectionsdClient sdc; CShortEPGData epgdata; if (sdc.getEPGidShort(epgid, &epgdata)) { #warning fixme sectionsd should deliver data in UTF-8 format tmpstring = Latin1_to_UTF8(epgdata.title); info1 = Latin1_to_UTF8(epgdata.info1); info2 = Latin1_to_UTF8(epgdata.info2); } #else CSectionsdClient sdc; CEPGData epgdata; if (sdc.getEPGid(epgid, epg_time,&epgdata)) { #warning fixme sectionsd should deliver data in UTF-8 format tmpstring = Latin1_to_UTF8(epgdata.title); info1 = Latin1_to_UTF8(epgdata.info1); info2 = Latin1_to_UTF8(epgdata.info2); movieInfo.parentalLockAge = epgdata.fsk; if(epgdata.contentClassification.size() > 0 ) movieInfo.genreMajor = epgdata.contentClassification[0]; movieInfo.length = epgdata.epg_times.dauer / 60; printf("fsk:%d, Genre:%d, Dauer: %d\r\n",movieInfo.parentalLockAge,movieInfo.genreMajor,movieInfo.length); } #endif } movieInfo.epgTitle = ZapitTools::UTF8_to_UTF8XML(tmpstring.c_str()); movieInfo.epgId = channel_id; movieInfo.epgInfo1 = ZapitTools::UTF8_to_UTF8XML(info1.c_str()); movieInfo.epgInfo2 = ZapitTools::UTF8_to_UTF8XML(info2.c_str()); movieInfo.epgEpgId = epgid ; movieInfo.epgMode = g_Zapit->getMode(); movieInfo.epgVideoPid = si.vpid; EPG_AUDIO_PIDS audio_pids; // super hack :-), der einfachste weg an die apid descriptions ranzukommen g_RemoteControl->current_PIDs = pids; g_RemoteControl->processAPIDnames(); for(unsigned int i= 0; i< pids.APIDs.size(); i++) { audio_pids.epgAudioPid = pids.APIDs[i].pid; audio_pids.epgAudioPidName = ZapitTools::UTF8_to_UTF8XML(g_RemoteControl->current_PIDs.APIDs[i].desc); movieInfo.audioPids.push_back(audio_pids); } movieInfo.epgVTXPID = si.vtxtpid; cMovieInfo.encodeMovieInfoXml(&extMessage,movieInfo); movieInfo.audioPids.clear(); return extMessage; }