diff options
-rw-r--r-- | p2pvr/Jamfile.jam | 4 | ||||
-rw-r--r-- | p2pvr/ice/p2pvr.ice | 8 | ||||
-rw-r--r-- | p2pvr/lib/si.cpp | 20 | ||||
-rw-r--r-- | p2pvr/lib/si.h | 4 | ||||
-rw-r--r-- | p2pvr/lib/sql/SI_eventsInRange.sql | 28 | ||||
-rw-r--r-- | p2pvr/lib/sql/SI_eventsOnNow.sql | 27 | ||||
-rw-r--r-- | p2pvr/p2/Jamfile.jam | 18 | ||||
-rw-r--r-- | p2pvr/p2/config.cpp | 50 | ||||
-rw-r--r-- | p2pvr/p2/config.h | 31 | ||||
-rw-r--r-- | p2pvr/p2/pch.hpp | 25 | ||||
-rw-r--r-- | p2pvr/p2/views/events.cpp | 60 | ||||
-rw-r--r-- | p2pvr/p2/views/schedules.cpp | 29 | ||||
-rw-r--r-- | p2pvr/p2/views/services.cpp | 28 | ||||
-rw-r--r-- | p2pvr/util/dvbsiHelpers/event.cpp | 30 | ||||
-rw-r--r-- | p2pvr/util/p2Helpers.cpp | 8 | ||||
-rw-r--r-- | p2pvr/util/p2Helpers.h | 21 | ||||
-rw-r--r-- | p2pvr/util/p2pvrHelpers/schedule.cpp | 50 |
17 files changed, 423 insertions, 18 deletions
diff --git a/p2pvr/Jamfile.jam b/p2pvr/Jamfile.jam index a0948fc..8f82f35 100644 --- a/p2pvr/Jamfile.jam +++ b/p2pvr/Jamfile.jam @@ -24,8 +24,8 @@ alias p2daemonlib : glibmm : : : build-project daemon ; build-project carddaemon ; -install debuginstall : lib//p2pvrlib util//p2pvrutil carddaemon daemon ice : <location>./testing ; -package.install install : : : carddaemon daemon ; +install debuginstall : lib//p2pvrlib util//p2pvrutil p2//p2pvrp2 carddaemon daemon ice : <location>./testing ; +package.install install : : : carddaemon daemon p2//p2pvrp2 ; import type ; import generators ; diff --git a/p2pvr/ice/p2pvr.ice b/p2pvr/ice/p2pvr.ice index 2c827af..f6ed579 100644 --- a/p2pvr/ice/p2pvr.ice +++ b/p2pvr/ice/p2pvr.ice @@ -157,6 +157,7 @@ module DVBSI { optional(17) short UserCategory; optional(18) short Season; }; + sequence<Event> Events; }; module P2PVR { exception DeviceError { @@ -282,13 +283,16 @@ module P2PVR { sequence<DVBSI::Delivery> Deliveries; interface SI { - // Get any delivery suitable for SI reading + // Get delivery methods idempotent Deliveries GetAllDeliveries(short type); idempotent DVBSI::Delivery GetDeliveryForService(int id); idempotent DVBSI::Delivery GetDeliveryForTransport(int id); - // Get a list of services + // Get services idempotent DVBSI::ServiceList GetServices(); idempotent DVBSI::Service GetService(int id); + // Get events + idempotent DVBSI::Events EventsOnNow(); + idempotent DVBSI::Events EventsInRange(Common::DateTime from, Common::DateTime to); }; }; diff --git a/p2pvr/lib/si.cpp b/p2pvr/lib/si.cpp index ce55fbc..7c76ef4 100644 --- a/p2pvr/lib/si.cpp +++ b/p2pvr/lib/si.cpp @@ -8,6 +8,8 @@ ResourceString(SI_servicesSelectAll, lib_sql_SI_servicesSelectAll_sql); ResourceString(SI_servicesSelectById, lib_sql_SI_servicesSelectById_sql); +ResourceString(SI_eventsOnNow, lib_sql_SI_eventsOnNow_sql); +ResourceString(SI_eventsInRange, lib_sql_SI_eventsInRange_sql); P2PVR::Deliveries SI::GetAllDeliveries(short type, const Ice::Current &) @@ -83,3 +85,21 @@ SI::GetService(int id, const Ice::Current&) return rtn.front(); } +DVBSI::Events +SI::EventsOnNow(const Ice::Current &) +{ + DVBSI::Events rtn; + SqlContainerCreator<DVBSI::Events, DVBSI::Event> cc(rtn); + cc.populate(Select(SI_eventsOnNow)); + return rtn; +} + +DVBSI::Events +SI::EventsInRange(const Common::DateTime & from, const Common::DateTime & to, const Ice::Current &) +{ + DVBSI::Events rtn; + SqlContainerCreator<DVBSI::Events, DVBSI::Event> cc(rtn); + cc.populate(Select(SI_eventsInRange, from, to)); + return rtn; +} + diff --git a/p2pvr/lib/si.h b/p2pvr/lib/si.h index 053ac77..ca8e5b4 100644 --- a/p2pvr/lib/si.h +++ b/p2pvr/lib/si.h @@ -9,8 +9,12 @@ class SI : public P2PVR::SI, public DatabaseClient { P2PVR::Deliveries GetAllDeliveries(short type, const Ice::Current &); DVBSI::DeliveryPtr GetDeliveryForService(int id, const Ice::Current &); DVBSI::DeliveryPtr GetDeliveryForTransport(int id, const Ice::Current &); + DVBSI::ServiceList GetServices(const Ice::Current &); DVBSI::ServicePtr GetService(int id, const Ice::Current &); + + DVBSI::Events EventsOnNow(const Ice::Current &); + DVBSI::Events EventsInRange(const Common::DateTime &, const Common::DateTime &, const Ice::Current &); }; #endif diff --git a/p2pvr/lib/sql/SI_eventsInRange.sql b/p2pvr/lib/sql/SI_eventsInRange.sql new file mode 100644 index 0000000..0a2d6de --- /dev/null +++ b/p2pvr/lib/sql/SI_eventsInRange.sql @@ -0,0 +1,28 @@ +select e.serviceid, + e.eventid, + e.title, + e.titlelang, + e.subtitle, + e.description, + e.descriptionlang, + e.videoaspect, + e.videoframerate, + e.videohd, + e.audiochannels, + e.audiolanguage, + e.subtitlelanguage, + e.category, + e.subcategory, + e.usercategory, + e.dvbrating, + e.starttime, + e.stoptime, + e.episode, + e.episodes, + e.year, + e.flags, + e.season +from events e +where tsrange(?, ?, '[)') && tsrange(e.starttime, e.stoptime) +order by e.serviceid, e.starttime + diff --git a/p2pvr/lib/sql/SI_eventsOnNow.sql b/p2pvr/lib/sql/SI_eventsOnNow.sql new file mode 100644 index 0000000..36760b4 --- /dev/null +++ b/p2pvr/lib/sql/SI_eventsOnNow.sql @@ -0,0 +1,27 @@ +select e.serviceid, + e.eventid, + e.title, + e.titlelang, + e.subtitle, + e.description, + e.descriptionlang, + e.videoaspect, + e.videoframerate, + e.videohd, + e.audiochannels, + e.audiolanguage, + e.subtitlelanguage, + e.category, + e.subcategory, + e.usercategory, + e.dvbrating, + e.starttime, + e.stoptime, + e.episode, + e.episodes, + e.year, + e.flags, + e.season +from events e +where now()::timestamp without time zone <@ tsrange(e.starttime, e.stoptime) +order by e.serviceid diff --git a/p2pvr/p2/Jamfile.jam b/p2pvr/p2/Jamfile.jam new file mode 100644 index 0000000..f81ee60 --- /dev/null +++ b/p2pvr/p2/Jamfile.jam @@ -0,0 +1,18 @@ +cpp-pch pch : pch.hpp : + <library>../ice//p2pvrice + <library>..//p2common + <library>..//p2lib + <implicit-dependency>../ice//p2pvrice +; + +lib p2pvrp2 : + pch + [ glob-tree *.cpp ] + : + <library>../ice//p2pvrice + <library>../util//p2pvrutil + <library>..//p2common + <library>..//p2lib + <implicit-dependency>../ice//p2pvrice +; + diff --git a/p2pvr/p2/config.cpp b/p2pvr/p2/config.cpp new file mode 100644 index 0000000..49022b7 --- /dev/null +++ b/p2pvr/p2/config.cpp @@ -0,0 +1,50 @@ +#include "config.h" +#include <logger.h> +#include <Ice/Ice.h> + +std::string Config::DaemonAddress; +std::string Config::CommunicatorArgs; +Ice::CommunicatorPtr Config::ic; +Ice::ObjectAdapterPtr Config::adapter; + +DECLARE_OPTIONS(Config, "P2PVR Client options") +("p2pvr.client.daemonaddress", Options::value(&DaemonAddress), + "The ICE address of the P2PVR daemon") +("p2pvr.client.communicatorargs", Options::value(&CommunicatorArgs), + "Arguments to pass to the client's ICE Communicator") +END_OPTIONS(Config); + + +DECLARE_COMPONENT("P2PVR Client Config", Config); + +void +Config::onConfigLoad() +{ + if (ic) { + Logger()->messagef(LOG_DEBUG, "%s: Destroying existing ICE Communicator", __PRETTY_FUNCTION__); + ic->shutdown(); + } + Logger()->messagef(LOG_DEBUG, "%s: Creating new ICE Communicator", __PRETTY_FUNCTION__); + int argc = 0; + char ** argv = {}; + ic = Ice::initialize(argc, argv); + try { + if (!ic) { + Logger()->message(LOG_ERR, "Failed to initialize ICE Communicator"); + throw std::runtime_error("Failed to initialize ICE Communicator"); + } + Logger()->messagebf(LOG_DEBUG, "%s: Creating new default adapter for Communicator", __PRETTY_FUNCTION__); + adapter = ic->createObjectAdapterWithEndpoints("DefaultAdapter", "default -p 10002"); + if (!adapter) { + Logger()->message(LOG_ERR, "Failed to create new adapter"); + throw std::runtime_error("Failed to create new adapter"); + } + Logger()->messagef(LOG_DEBUG, "%s: Activating", __PRETTY_FUNCTION__); + adapter->activate(); + Logger()->messagef(LOG_DEBUG, "%s: Done", __PRETTY_FUNCTION__); + } + catch (const Ice::Exception & ie) { + Logger()->messagebf(LOG_DEBUG, "%s: ICE initialization failed (%s)", __PRETTY_FUNCTION__, ie); + } +} + diff --git a/p2pvr/p2/config.h b/p2pvr/p2/config.h new file mode 100644 index 0000000..56d8b53 --- /dev/null +++ b/p2pvr/p2/config.h @@ -0,0 +1,31 @@ +#ifndef P2PVRP2_CONFIG_H +#define P2PVRP2_CONFIG_H + +#include <options.h> +#include <componentLoader.h> +#include <Ice/Communicator.h> +#include <Ice/ObjectAdapter.h> + +class Config : public ComponentLoader { + public: + static Ice::ObjectAdapterPtr Adapter(); + static Ice::CommunicatorPtr Communicator(); + template <typename Proxy> + static Proxy GetProxy(const std::string & interface) + { + return Proxy::checkedCast(ic->stringToProxy(interface + ":" + DaemonAddress)); + } + + INITOPTIONS; + void onConfigLoad(); + + static std::string DaemonAddress; + static std::string CommunicatorArgs; + + private: + static Ice::CommunicatorPtr ic; + static Ice::ObjectAdapterPtr adapter; +}; + +#endif + diff --git a/p2pvr/p2/pch.hpp b/p2pvr/p2/pch.hpp new file mode 100644 index 0000000..5ba7bd7 --- /dev/null +++ b/p2pvr/p2/pch.hpp @@ -0,0 +1,25 @@ +#ifdef BOOST_BUILD_PCH_ENABLED +#ifndef P2PVRP2_PCH +#define P2PVRP2_PCH + +#include <Ice/Ice.h> +#include <boost/bind.hpp> +#include <boost/foreach.hpp> +#include <boost/function.hpp> +#include <boost/intrusive_ptr.hpp> +#include <boost/shared_ptr.hpp> + +#include <list> +#include <map> +#include <set> +#include <string> +#include <vector> + +#include <variableType.h> + +#include <p2pvr.h> + +#endif +#endif + + diff --git a/p2pvr/p2/views/events.cpp b/p2pvr/p2/views/events.cpp new file mode 100644 index 0000000..f435731 --- /dev/null +++ b/p2pvr/p2/views/events.cpp @@ -0,0 +1,60 @@ +#include <pch.hpp> +#include <p2pvr.h> +#include <p2Helpers.h> +#include <logger.h> +#include <rowSet.h> +#include <genLoader.h> +#include <execContext.h> +#include <objectRowState.h> +#include "../config.h" + +class EventsOnNow : public RowSet { + public: + EventsOnNow(ScriptNodePtr p) : + RowSet(p) + { + } + + void execute(const Glib::ustring &, const RowProcessorCallback & rp, ExecContext *) const + { + auto proxy = Config::GetProxy<P2PVR::SIPrx>("SI"); + auto services = proxy->EventsOnNow(); + ObjectRowState<DVBSI::EventPtr> rs; + BOOST_FOREACH(const auto & s, services) { + BindColumns(rs, s); + rs.process(rp); + } + } +}; + +DECLARE_LOADER("eventsonnow", EventsOnNow); + +class EventsInRange : public RowSet { + public: + EventsInRange(ScriptNodePtr p) : + RowSet(p), + From(p, "from"), + To(p, "to") + { + } + + void execute(const Glib::ustring &, const RowProcessorCallback & rp, ExecContext * ec) const + { + auto proxy = Config::GetProxy<P2PVR::SIPrx>("SI"); + Common::DateTime from, to; + From(ec) >> from; + To(ec) >> to; + auto services = proxy->EventsInRange(from, to); + ObjectRowState<DVBSI::EventPtr> rs; + BOOST_FOREACH(const auto & s, services) { + BindColumns(rs, s); + rs.process(rp); + } + } + private: + const Variable From; + const Variable To; +}; + +DECLARE_LOADER("eventsinrange", EventsInRange); + diff --git a/p2pvr/p2/views/schedules.cpp b/p2pvr/p2/views/schedules.cpp new file mode 100644 index 0000000..2c2d020 --- /dev/null +++ b/p2pvr/p2/views/schedules.cpp @@ -0,0 +1,29 @@ +#include <pch.hpp> +#include <p2pvr.h> +#include <logger.h> +#include <rowSet.h> +#include <genLoader.h> +#include <objectRowState.h> +#include "../config.h" + +class ScheduleList : public RowSet { + public: + ScheduleList(ScriptNodePtr p) : + RowSet(p) + { + } + + void execute(const Glib::ustring &, const RowProcessorCallback & rp, ExecContext *) const + { + auto proxy = Config::GetProxy<P2PVR::SchedulesPrx>("Schedules"); + auto schedules = proxy->GetSchedules(); + ObjectRowState<P2PVR::SchedulePtr> rs; + BOOST_FOREACH(const auto & s, schedules) { + BindColumns(rs, s); + rs.process(rp); + } + } +}; + +DECLARE_LOADER("schedulelist", ScheduleList); + diff --git a/p2pvr/p2/views/services.cpp b/p2pvr/p2/views/services.cpp new file mode 100644 index 0000000..2fb4c9d --- /dev/null +++ b/p2pvr/p2/views/services.cpp @@ -0,0 +1,28 @@ +#include <pch.hpp> +#include <p2pvr.h> +#include <logger.h> +#include <rowSet.h> +#include <genLoader.h> +#include <objectRowState.h> +#include "../config.h" + +class ServiceList : public RowSet { + public: + ServiceList(ScriptNodePtr p) : + RowSet(p) + { + } + + void execute(const Glib::ustring &, const RowProcessorCallback & rp, ExecContext *) const + { + auto proxy = Config::GetProxy<P2PVR::SIPrx>("SI"); + auto services = proxy->GetServices(); + ObjectRowState<DVBSI::ServicePtr> rs; + BOOST_FOREACH(const auto & s, services) { + BindColumns(rs, s); + rs.process(rp); + } + } +}; + +DECLARE_LOADER("servicelist", ServiceList); diff --git a/p2pvr/util/dvbsiHelpers/event.cpp b/p2pvr/util/dvbsiHelpers/event.cpp index decd2b9..ca072df 100644 --- a/p2pvr/util/dvbsiHelpers/event.cpp +++ b/p2pvr/util/dvbsiHelpers/event.cpp @@ -62,3 +62,33 @@ BindColumns(RowState & rs, const DVBSI::EventPtr & e) rs.fields[23] << e->Season; } +template<> +void +UnbindColumns(RowState & rs, const DVBSI::EventPtr & e) +{ + rs.fields[0] >> e->ServiceId; + rs.fields[1] >> e->EventId; + rs.fields[2] >> e->Title; + rs.fields[3] >> e->TitleLang; + rs.fields[4] >> e->Subtitle; + rs.fields[5] >> e->Description; + rs.fields[6] >> e->DescriptionLang; + rs.fields[7] >> e->VideoAspect; + rs.fields[8] >> e->VideoFrameRate; + rs.fields[9] >> e->VideoHD; + rs.fields[10] >> e->AudioChannels; + rs.fields[11] >> e->AudioLanguage; + rs.fields[12] >> e->SubtitleLanguage; + rs.fields[13] >> e->Category; + rs.fields[14] >> e->SubCategory; + rs.fields[15] >> e->UserCategory; + rs.fields[16] >> e->DvbRating; + rs.fields[17] >> e->StartTime; + rs.fields[18] >> e->StopTime; + rs.fields[19] >> e->Episode; + rs.fields[20] >> e->Episodes; + rs.fields[21] >> e->Year; + rs.fields[22] >> e->Flags; + rs.fields[23] >> e->Season; +} + diff --git a/p2pvr/util/p2Helpers.cpp b/p2pvr/util/p2Helpers.cpp index 0c1fe37..081905d 100644 --- a/p2pvr/util/p2Helpers.cpp +++ b/p2pvr/util/p2Helpers.cpp @@ -11,8 +11,8 @@ operator<<<Common::DateTime>(VariableType & vt, const Common::DateTime & dt) } template <> -VariableType & -operator>><Common::DateTime>(VariableType & vt, Common::DateTime & dt) +const VariableType & +operator>><Common::DateTime>(const VariableType & vt, Common::DateTime & dt) { const boost::posix_time::ptime & date = vt; dt.Year = date.date().year(); @@ -24,8 +24,8 @@ operator>><Common::DateTime>(VariableType & vt, Common::DateTime & dt) } template <> -VariableType & -operator>>(VariableType & vt, short int & v) +const VariableType & +operator>>(const VariableType & vt, short int & v) { v = (int)vt; return vt; diff --git a/p2pvr/util/p2Helpers.h b/p2pvr/util/p2Helpers.h index 7ea56de..e843692 100644 --- a/p2pvr/util/p2Helpers.h +++ b/p2pvr/util/p2Helpers.h @@ -5,33 +5,34 @@ #include <p2pvr.h> template <typename T> -VariableType & -operator>>(VariableType & vt, T & v) +const VariableType & +operator>>(const VariableType & vt, T & v) { v = vt.as<T>(); return vt; } template <> -VariableType & -operator>><Common::DateTime>(VariableType & vt, Common::DateTime & dt); +const VariableType & +operator>><Common::DateTime>(const VariableType & vt, Common::DateTime & dt); template <typename T> -VariableType & -operator>>(VariableType & vt, IceUtil::Optional<T> & v) +const VariableType & +operator>>(const VariableType & vt, IceUtil::Optional<T> & v) { if (vt.isNull()) { - v = NULL; + v = IceUtil::Optional<T>(); } else { - v = vt.as<T>(); + v = T(); + vt >> *v; } return vt; } template <> -VariableType & -operator>>(VariableType & vt, short int & v); +const VariableType & +operator>>(const VariableType & vt, short int & v); template <typename T> VariableType & diff --git a/p2pvr/util/p2pvrHelpers/schedule.cpp b/p2pvr/util/p2pvrHelpers/schedule.cpp new file mode 100644 index 0000000..264c132 --- /dev/null +++ b/p2pvr/util/p2pvrHelpers/schedule.cpp @@ -0,0 +1,50 @@ +#include <pch.hpp> +#include "../dvbsiHelpers.h" +#include "../p2Helpers.h" + +template<> +void +CreateColumns<P2PVR::SchedulePtr>(const ColumnCreator & cc) +{ + cc("scheduleid", true); + cc("serviceid", true); + cc("eventid", false); + cc("title", false); + cc("search", false); + cc("priority", false); + cc("early", false); + cc("late", false); + cc("repeats", false); +} + +template<> +void +BindColumns(RowState & rs, const P2PVR::SchedulePtr & s) +{ + rs.fields[0] << s->ScheduleId; + rs.fields[1] << s->ServiceId; + rs.fields[2] << s->EventId; + rs.fields[3] << s->Title; + rs.fields[4] << s->Search; + rs.fields[5] << s->Priority; + rs.fields[6] << s->Early; + rs.fields[7] << s->Late; + rs.fields[8] << s->Repeats; +} + +template<> +void +UnbindColumns(RowState & rs, P2PVR::SchedulePtr const & s) +{ + rs.fields[0] >> s->ScheduleId; + rs.fields[1] >> s->ServiceId; + rs.fields[2] >> s->EventId; + rs.fields[3] >> s->Title; + rs.fields[4] >> s->Search; + rs.fields[5] >> s->Priority; + rs.fields[6] >> s->Early; + rs.fields[7] >> s->Late; + rs.fields[8] >> s->Repeats; +} + + |