VDRClient::~VDRClient()
{
logger->debug("VDRClient destructor");
- saveEpgFilter();
}
bool VDRClient::process(std::string& request, PFMap& postFields, std::string& returnString)
else if (request == "getscheduleevent") success = getscheduleevent(postFields, returnJSON);
else if (request == "epgsearch") success = epgsearch(postFields, returnJSON);
else if (request == "epgsearchsame") success = epgsearchsame(postFields, returnJSON);
+ else if (request == "epgsearchotherhalf")success = epgsearchotherhalf(postFields, returnJSON);
else if (request == "timerset") success = timerset(postFields, returnJSON);
else if (request == "recinfo") success = recinfo(postFields, returnJSON);
else if (request == "recstop") success = recstop(postFields, returnJSON);
return true;
}
+bool VDRClient::epgsearchotherhalf(PFMap& postFields, Json::Value& js) // RETHROWS
+{
+ logger->debug("epgsearchotherhalf");
+ int channelNumber = getVarInt(postFields, "channelnumber");
+ int eventID = getVarInt(postFields, "eventid");
+
+ cChannel* channel = NULL;
+ for (channel = Channels.First(); channel; channel = Channels.Next(channel))
+ {
+ if (channel->GroupSep()) continue;
+ if (channel->Number() == channelNumber) break;
+ }
+
+ if (!channel)
+ {
+ logger->error("epgsearchotherhalf: Could not find requested channel: {}", channelNumber);
+ js["Result"] = false;
+ js["Error"] = "Could not find channel";
+ return true;
+ }
+
+ cSchedulesLock MutexLock;
+ const cSchedules *Schedules = cSchedules::Schedules(MutexLock);
+ if (!Schedules)
+ {
+ logger->error("epgsearchotherhalf: Could not find requested channel: {}", channelNumber);
+ js["Result"] = false;
+ js["Error"] = "Internal schedules error (1)";
+ return true;
+ }
+ const cSchedule *Schedule = Schedules->GetSchedule(channel->GetChannelID());
+ if (!Schedule)
+ {
+ logger->error("epgsearchotherhalf: Could not find requested channel: {}", channelNumber);
+ js["Result"] = false;
+ js["Error"] = "Internal schedules error (2)";
+ return true;
+ }
+
+ js["OtherEventFound"] = false;
+
+ const cEvent* eventM1 = NULL;
+ const cEvent* eventM2 = NULL;
+ const cEvent* otherEvent = NULL;
+
+ for (const cEvent* event = Schedule->Events()->First(); event; event = Schedule->Events()->Next(event))
+ {
+ if (event->EventID() == (unsigned long)eventID)
+ {
+ if ((eventM2 != NULL) && (!strcmp(eventM2->Title(), event->Title())))
+ {
+ otherEvent = eventM2;
+ }
+ else
+ {
+ const cEvent* eventP1 = Schedule->Events()->Next(event);
+ if (eventP1)
+ {
+ const cEvent* eventP2 = Schedule->Events()->Next(eventP1);
+
+ if (eventP2 && (!strcmp(eventP2->Title(), event->Title())))
+ {
+ otherEvent = eventP2;
+ }
+ }
+ }
+
+ if (otherEvent)
+ {
+ Json::Value oneEvent;
+ oneEvent["ID"] = otherEvent->EventID();
+ oneEvent["ChannelNumber"] = channel->Number();
+ oneEvent["Time"] = (Json::UInt)otherEvent->StartTime();
+ oneEvent["Duration"] = otherEvent->Duration();
+ oneEvent["Title"] = otherEvent->Title() ? otherEvent->Title() : "";
+ oneEvent["HasTimer"] = otherEvent->HasTimer();
+ js["Event"] = oneEvent;
+ js["OtherEventFound"] = true;
+ }
+
+ break;
+ }
+
+ eventM2 = eventM1;
+ eventM1 = event;
+ }
+
+ js["Result"] = true;
+ return true;
+}
+
bool VDRClient::tunersstatus(PFMap& postFields, Json::Value& js)
{
logger->debug("tunerstatus");
logger->debug("epgFilterAdd: {} {}", channel, programme);
- if (!loadEpgFilter())
+ libconfig::Config epgFilter;
+ if (!loadEpgFilter(epgFilter))
{
js["Result"] = false;
js["Error"] = "Error initialising EPG filter";
libconfig::Setting& newProgramme = newPair.add("p", libconfig::Setting::Type::TypeString);
newProgramme = programme;
+ if (!saveEpgFilter(epgFilter))
+ {
+ js["Result"] = false;
+ js["Error"] = "Failed to save EPG filter";
+ return true;
+ }
+
js["Result"] = true;
return true;
}
logger->debug("epgFilterDel: {} {}", channel, programme);
- if (!loadEpgFilter())
+ libconfig::Config epgFilter;
+ if (!loadEpgFilter(epgFilter))
{
js["Result"] = false;
js["Error"] = "Error initialising EPG filter";
if ((c == channel) && (p == programme))
{
setting.remove(x);
+
+ if (!saveEpgFilter(epgFilter))
+ {
+ js["Result"] = false;
+ js["Error"] = "Failed to save EPG filter";
+ return true;
+ }
+
logger->debug("Found and deleted: {} {}", c, p);
- break;
+ js["Result"] = true;
+ return true;
}
}
- if (x == numFilters)
- {
- js["Result"] = false;
- js["Error"] = "Channel/Programme not found";
- return true;
- }
+
+ js["Result"] = false;
+ js["Error"] = "Channel/Programme not found";
+ return true;
}
catch (std::exception e)
{
js["Error"] = "Unknown error";
return true;
}
-
- js["Result"] = true;
- return true;
}
bool VDRClient::epgfilterget(PFMap& postFields, Json::Value& js) // RETHROWS
{
logger->debug("epgFilterget");
- if (!loadEpgFilter())
+ libconfig::Config epgFilter;
+ if (!loadEpgFilter(epgFilter))
{
js["Result"] = false;
js["Error"] = "Error initialising EPG filter";
oneFilter["p"] = p;
jsfilters.append(oneFilter);
}
- js["EPG Filters"] = jsfilters;
+ js["EPGFilters"] = jsfilters;
}
catch (std::exception e)
{
return i->second;
}
-bool VDRClient::loadEpgFilter()
+bool VDRClient::loadEpgFilter(libconfig::Config& epgFilter)
{
- if (epgFilterLoaded) return true;
-
const char* configDir = cPlugin::ConfigDirectory("jsonserver");
if (!configDir)
{
setting.add("filters", libconfig::Setting::Type::TypeList);
}
- epgFilterLoaded = true;
return true;
}
-void VDRClient::saveEpgFilter()
+bool VDRClient::saveEpgFilter(libconfig::Config& epgFilter)
{
- if (!epgFilterLoaded) return;
-
const char* configDir = cPlugin::ConfigDirectory("jsonserver");
if (!configDir)
{
logger->error("saveEpgFilter: Error: Could not get config dir from VDR");
- return;
+ return false;
}
std::string epgFilterFile(std::string(configDir) + std::string("/epgfilter.conf"));
{
epgFilter.writeFile(epgFilterFile.c_str());
logger->debug("saveEpgFilter: EPG filter saved");
+ return true;
}
catch (const libconfig::FileIOException& e)
{
logger->error("saveEpgFilter: Error: File write error");
+ return false;
}
}