diff options
author | randomdan <randomdan@localhost> | 2014-03-04 23:16:09 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2014-03-04 23:16:09 +0000 |
commit | dc226d8dec948a104f9c6ecb9f08f1efacc4b214 (patch) | |
tree | 17d84c075a7bfdf03aa485dbb26504b76ff56e69 | |
parent | Add an SI function to get a transport suitable for getting SI based on the de... (diff) | |
download | p2pvr-dc226d8dec948a104f9c6ecb9f08f1efacc4b214.tar.bz2 p2pvr-dc226d8dec948a104f9c6ecb9f08f1efacc4b214.tar.xz p2pvr-dc226d8dec948a104f9c6ecb9f08f1efacc4b214.zip |
Incorperate proper datetimes and durations now the core does
-rw-r--r-- | p2pvr/ice/common.ice | 2 | ||||
-rw-r--r-- | p2pvr/ice/commonHelpers.cpp | 55 | ||||
-rw-r--r-- | p2pvr/ice/commonHelpers.h | 12 | ||||
-rw-r--r-- | p2pvr/ice/p2pvr.ice | 6 | ||||
-rw-r--r-- | p2pvr/lib/recorder.cpp | 6 | ||||
-rw-r--r-- | p2pvr/lib/sql/Schedules_selectAll.sql | 2 | ||||
-rw-r--r-- | p2pvr/lib/sql/Schedules_selectById.sql | 2 | ||||
-rw-r--r-- | p2pvr/util/p2Helpers.cpp | 25 | ||||
-rw-r--r-- | p2pvr/util/p2Helpers.h | 8 |
9 files changed, 67 insertions, 51 deletions
diff --git a/p2pvr/ice/common.ice b/p2pvr/ice/common.ice index 8296f93..14ca155 100644 --- a/p2pvr/ice/common.ice +++ b/p2pvr/ice/common.ice @@ -10,7 +10,7 @@ module Common { short Minute; }; - struct TimeOfDay { + struct Duration { short Hour; short Minute; }; diff --git a/p2pvr/ice/commonHelpers.cpp b/p2pvr/ice/commonHelpers.cpp index 64a1c61..46c7fad 100644 --- a/p2pvr/ice/commonHelpers.cpp +++ b/p2pvr/ice/commonHelpers.cpp @@ -1,46 +1,37 @@ #include "commonHelpers.h" #include <misc.h> -#include <boost/format.hpp> +#include <boost/numeric/conversion/cast.hpp> namespace Common { - std::string operator-(const Common::DateTime & a, const Common::DateTime & b) + boost::posix_time::ptime operator*(const Common::DateTime & dt) { - struct tm tma { - 0, a.Minute, a.Hour, - a.Day, a.Month - 1, a.Year - 1900, - 0, 0, 0, 0, 0}; - struct tm tmb { - 0, b.Minute, b.Hour, - b.Day, b.Month - 1, b.Year - 1900, - 0, 0, 0, 0, 0}; - auto secs = mktime(&tma) - mktime(&tmb); - return stringbf("%02d:%02d:%02d", secs / 3600, (secs / 60) % 60, secs % 60); + return boost::posix_time::ptime( + boost::gregorian::date(dt.Year, dt.Month, dt.Day), + boost::posix_time::time_duration(dt.Hour, dt.Minute, 0)); } - time_t operator-(const Common::DateTime & cdt, const std::string & interval) + boost::posix_time::time_duration operator*(const Common::Duration & d) { - struct tm dt { - 0, cdt.Minute, cdt.Hour, - cdt.Day, cdt.Month - 1, cdt.Year - 1900, - 0, 0, 0, 0, 0}; - unsigned short hours, minutes, seconds; - if (sscanf(interval.c_str(), "%hu:%hu:%hu", &hours, &minutes, &seconds) < 3) { - throw std::runtime_error("Couldn't parse interval"); - } - return mktime(&dt) - (seconds + (60 * (minutes + (60 * hours)))); + return boost::posix_time::time_duration(d.Hour, d.Minute, 0); } +} - time_t operator+(const Common::DateTime & cdt, const std::string & interval) - { - struct tm dt { - 0, cdt.Minute, cdt.Hour, - cdt.Day, cdt.Month - 1, cdt.Year - 1900, - 0, 0, 0, 0, 0}; - unsigned short hours, minutes, seconds; - if (sscanf(interval.c_str(), "%hu:%hu:%hu", &hours, &minutes, &seconds) < 3) { - throw std::runtime_error("Couldn't parse interval"); +namespace boost { + namespace posix_time { + Common::DateTime operator*(const boost::posix_time::ptime & dt) + { + return { + dt.date().year(), dt.date().month(), dt.date().day(), + boost::numeric_cast<short>(dt.time_of_day().hours()), + boost::numeric_cast<short>(dt.time_of_day().minutes()) }; + } + + Common::Duration operator*(const boost::posix_time::time_duration & d) + { + return { + boost::numeric_cast<short>(d.hours()), + boost::numeric_cast<short>(d.minutes()) }; } - return mktime(&dt) + (seconds + (60 * (minutes + (60 * hours)))); } } diff --git a/p2pvr/ice/commonHelpers.h b/p2pvr/ice/commonHelpers.h index 645ad1c..cc3cac1 100644 --- a/p2pvr/ice/commonHelpers.h +++ b/p2pvr/ice/commonHelpers.h @@ -4,6 +4,7 @@ #include <common.h> #include <ostream> #include <iomanip> +#include <boost/date_time/posix_time/posix_time_types.hpp> namespace Common { template<typename C, typename T> @@ -17,9 +18,14 @@ namespace Common { << ":" << std::setw(2) << std::setfill('0') << dt.Minute; return o; } - time_t operator-(const Common::DateTime & cdt, const std::string & interval); - time_t operator+(const Common::DateTime & cdt, const std::string & interval); - std::string operator-(const Common::DateTime & a, const Common::DateTime & b); + boost::posix_time::ptime operator*(const Common::DateTime &); + boost::posix_time::time_duration operator*(const Common::Duration &); +} +namespace boost { + namespace posix_time { + Common::DateTime operator*(const boost::posix_time::ptime &); + Common::Duration operator*(const boost::posix_time::time_duration &); + } } #endif diff --git a/p2pvr/ice/p2pvr.ice b/p2pvr/ice/p2pvr.ice index 984f18a..75bfbf8 100644 --- a/p2pvr/ice/p2pvr.ice +++ b/p2pvr/ice/p2pvr.ice @@ -16,7 +16,7 @@ module P2PVR { optional(2) string Subtitle; optional(3) string Description; Common::DateTime StartTime; - string Duration; + Common::Duration Duration; }; sequence<Recording> RecordingList; @@ -28,8 +28,8 @@ module P2PVR { optional(3) string Title; optional(4) string Search; int Priority; - string Early; - string Late; + Common::Duration Early; + Common::Duration Late; bool Repeats; }; sequence<Schedule> ScheduleList; diff --git a/p2pvr/lib/recorder.cpp b/p2pvr/lib/recorder.cpp index 98c7c4e..bdd18c6 100644 --- a/p2pvr/lib/recorder.cpp +++ b/p2pvr/lib/recorder.cpp @@ -47,7 +47,7 @@ Recorder::RefreshSchedules(const Ice::Current &) auto service = si->GetService(s->ServiceId); auto event = si->GetEvent(s->ServiceId, s->EventId); - auto startIn = std::max<time_t>(event->StartTime - schedule->Early - time(NULL), 0); + auto startIn = std::max<time_t>((*event->StartTime - *schedule->Early - boost::posix_time::second_clock::universal_time()).total_seconds(), 0); IceUtil::TimerTaskPtr startTimer = new BindTimerTask(boost::bind(&Recorder::StartRecording, this, schedule, service, event)); timer->schedule(startTimer, IceUtil::Time::seconds(startIn)); pendingRecordings.push_back(startTimer); @@ -75,11 +75,11 @@ Recorder::StartRecording(P2PVR::SchedulePtr schedule, DVBSI::ServicePtr service, service->Name ? *service->Name : "<no name>", service->ServiceId); recordings->NewRecording(new P2PVR::Recording(0, storage->ice_toString(), id, schedule->ScheduleId, event->Title, event->Subtitle, - event->Description, event->StartTime, event->StopTime - event->StartTime)); + event->Description, event->StartTime, *(*event->StopTime - *event->StartTime))); auto newCurrent = CurrentPtr(new Current({muxer, store, ss, schedule, service, event, IceUtil::TimerTaskPtr()})); currentRecordings.insert(newCurrent); - auto stopIn = event->StopTime + schedule->Late - time(NULL); + auto stopIn = (*event->StopTime + *schedule->Late - boost::posix_time::second_clock::universal_time()).total_seconds(); newCurrent->stopTimer = new BindTimerTask(boost::bind(&Recorder::StopRecording, this, newCurrent)); timer->schedule(newCurrent->stopTimer, IceUtil::Time::seconds(stopIn)); Logger()->messagebf(LOG_DEBUG, "Recording %s scheduled stop in %s seconds", event->Title, stopIn); diff --git a/p2pvr/lib/sql/Schedules_selectAll.sql b/p2pvr/lib/sql/Schedules_selectAll.sql index 5970dc1..e9e500e 100644 --- a/p2pvr/lib/sql/Schedules_selectAll.sql +++ b/p2pvr/lib/sql/Schedules_selectAll.sql @@ -1,3 +1,3 @@ -SELECT scheduleid, serviceid, eventid, title, search, priority, early::text early, late::text late, repeats +SELECT scheduleid, serviceid, eventid, title, search, priority, early, late, repeats FROM schedules ORDER BY scheduleId diff --git a/p2pvr/lib/sql/Schedules_selectById.sql b/p2pvr/lib/sql/Schedules_selectById.sql index 2eb7b0b..4990418 100644 --- a/p2pvr/lib/sql/Schedules_selectById.sql +++ b/p2pvr/lib/sql/Schedules_selectById.sql @@ -1,4 +1,4 @@ -SELECT scheduleid, serviceid, eventid, title, search, priority, early::text early, late::text late, repeats +SELECT scheduleid, serviceid, eventid, title, search, priority, early, late, repeats FROM schedules WHERE scheduleid = ? ORDER BY scheduleId diff --git a/p2pvr/util/p2Helpers.cpp b/p2pvr/util/p2Helpers.cpp index 081905d..c58ff1a 100644 --- a/p2pvr/util/p2Helpers.cpp +++ b/p2pvr/util/p2Helpers.cpp @@ -1,12 +1,27 @@ #include <pch.hpp> #include "p2Helpers.h" +#include <commonHelpers.h> + +template <> +VariableType & +operator<<<Common::Duration>(VariableType & vt, const Common::Duration & d) +{ + return (vt = *d); +} template <> VariableType & operator<<<Common::DateTime>(VariableType & vt, const Common::DateTime & dt) { - vt = boost::posix_time::ptime(boost::gregorian::date(dt.Year, dt.Month, dt.Day), - boost::posix_time::time_duration(dt.Hour, dt.Minute, 0)); + return (vt = *dt); +} + +template <> +const VariableType & +operator>><Common::Duration>(const VariableType & vt, Common::Duration & d) +{ + const boost::posix_time::time_duration & dur = vt; + d = *dur; return vt; } @@ -15,11 +30,7 @@ const VariableType & operator>><Common::DateTime>(const VariableType & vt, Common::DateTime & dt) { const boost::posix_time::ptime & date = vt; - dt.Year = date.date().year(); - dt.Month = date.date().month(); - dt.Day = date.date().day(); - dt.Hour = date.time_of_day().hours(); - dt.Minute = date.time_of_day().minutes(); + dt = *date; return vt; } diff --git a/p2pvr/util/p2Helpers.h b/p2pvr/util/p2Helpers.h index f01be78..3b73f1b 100644 --- a/p2pvr/util/p2Helpers.h +++ b/p2pvr/util/p2Helpers.h @@ -14,6 +14,10 @@ operator>>(const VariableType & vt, T & v) template <> const VariableType & +operator>><Common::Duration>(const VariableType & vt, Common::Duration & d); + +template <> +const VariableType & operator>><Common::DateTime>(const VariableType & vt, Common::DateTime & dt); template <typename T> @@ -44,6 +48,10 @@ operator<<(VariableType & vt, const T & v) template <> VariableType & +operator<<<Common::Duration>(VariableType & vt, const Common::Duration & d); + +template <> +VariableType & operator<<<Common::DateTime>(VariableType & vt, const Common::DateTime & dt); template <typename T> |