diff options
author | lado <herrlado@gmail.com> | 2012-03-23 10:20:20 +0100 |
---|---|---|
committer | lado <herrlado@gmail.com> | 2012-03-23 10:20:20 +0100 |
commit | 603aafd44f65af6230917985e4c93f518f7a4798 (patch) | |
tree | 7ce9288adf6970e3a5e6e0f6cc9b5fbee635ebc8 | |
parent | 421a5adede3d223019d27bd20460a7e9eca296fb (diff) | |
download | vdr-manager-603aafd44f65af6230917985e4c93f518f7a4798.tar.gz vdr-manager-603aafd44f65af6230917985e4c93f518f7a4798.tar.bz2 |
Timer stuff
-rw-r--r-- | vdr-vdrmanager/helpers.cpp | 345 | ||||
-rw-r--r-- | vdr-vdrmanager/helpers.h | 4 |
2 files changed, 191 insertions, 158 deletions
diff --git a/vdr-vdrmanager/helpers.cpp b/vdr-vdrmanager/helpers.cpp index 5d6dd42..5a7e21e 100644 --- a/vdr-vdrmanager/helpers.cpp +++ b/vdr-vdrmanager/helpers.cpp @@ -225,10 +225,9 @@ string cHelpers::DelRecordingIntern(string args) { int index = atoi(args.c_str()); cRecording * r; - if (index < 0 || index >= Recordings.Count() - || (r = Recordings.Get(index)) == NULL) { - return "!ERROR:DelRecording;Wrong recording index -> " + args + "\r\n"; - } + if (index < 0|| index >= Recordings.Count() + || (r = Recordings.Get(index)) == NULL) {return "!ERROR:DelRecording;Wrong recording index -> " + args + "\r\n"; +} if (r->Delete()) { Recordings.DelByName(r->FileName()); @@ -296,7 +295,6 @@ string cHelpers::SetTimerIntern(char op, string param) { return Error("Timers are being edited - try again later"); } - string sep = string(TIMER_SEP); size_t idx = param.find(sep); @@ -307,11 +305,10 @@ string cHelpers::SetTimerIntern(char op, string param) { string newt = param.substr(0, idx); string oldt = param.substr(idx + sep.size()); - auto_ptr<cTimer> otimer(new cTimer); - if (!otimer->Parse(oldt.c_str())) { - return Error("Error in timer settings"); - } + if (!otimer->Parse(oldt.c_str())) { + return Error("Error in timer settings"); + } cTimer* oldTimer = Timers.GetTimer(otimer.get()); if (oldTimer == 0) { @@ -458,15 +455,15 @@ string cHelpers::ToText(cRecording * recording) { time_t startTime = event->StartTime(); time_t endTime = event->EndTime(); - snprintf(buf, sizeof(buf)-1, "%d", recording->Index()); + snprintf(buf, sizeof(buf) - 1, "%d", recording->Index()); result = buf; result += ":"; - snprintf(buf, sizeof(buf)-1, "%lu", startTime); + snprintf(buf, sizeof(buf) - 1, "%lu", startTime); result += buf; result += ":"; - snprintf(buf, sizeof(buf)-1, "%lu", endTime); + snprintf(buf, sizeof(buf) - 1, "%lu", endTime); result += buf; result += ":"; @@ -477,9 +474,9 @@ string cHelpers::ToText(cRecording * recording) { } result += ":"; - if(info->Title()){ + if (info->Title()) { result += MapSpecialChars(info->Title()); - } else if(event->Title()){ + } else if (event->Title()) { result += MapSpecialChars(event->Title()); } else { result += "<unknown>"; @@ -495,7 +492,7 @@ string cHelpers::ToText(cRecording * recording) { result += MapSpecialChars(recording->FileName()); result += ":"; - snprintf(buf, sizeof(buf)-1, "%d", DirSizeMB(recording->FileName())); + snprintf(buf, sizeof(buf) - 1, "%d", DirSizeMB(recording->FileName())); result += buf; result += ":"; @@ -505,7 +502,7 @@ string cHelpers::ToText(cRecording * recording) { int length = RecordingLengthInSeconds(recording); - snprintf(buf, sizeof(buf)-1, "%d", length); + snprintf(buf, sizeof(buf) - 1, "%d", length); result += buf; result += "\r\n"; @@ -536,33 +533,59 @@ string cHelpers::ToText(cTimer * timer) { string result; char buf[100]; - snprintf(buf, sizeof(buf)-1, "T%d", timer->Index()); + snprintf(buf, sizeof(buf) - 1, "T%d", timer->Index()); result = buf; result += ":"; - snprintf(buf, sizeof(buf)-1, "%u", timer->Flags()); + snprintf(buf, sizeof(buf) - 1, "%u", timer->Flags()); result += buf; result += ":"; - snprintf(buf, sizeof(buf)-1, "%d", timer->Channel()->Number()); + snprintf(buf, sizeof(buf) - 1, "%d", timer->Channel()->Number()); result += buf; result += ":"; result += MapSpecialChars(channelName); result += ":"; - snprintf(buf, sizeof(buf)-1, "%lu", timer->StartTime()); + snprintf(buf, sizeof(buf) - 1, "%lu", timer->StartTime()); result += buf; result += ":"; - snprintf(buf, sizeof(buf)-1, "%lu", timer->StopTime()); + snprintf(buf, sizeof(buf) - 1, "%lu", timer->StopTime()); result += buf; result += ":"; - snprintf(buf, sizeof(buf)-1, "%d", timer->Priority()); + snprintf(buf, sizeof(buf) - 1, "%d", timer->Priority()); result += buf; result += ":"; - snprintf(buf, sizeof(buf)-1, "%d", timer->Lifetime()); + snprintf(buf, sizeof(buf) - 1, "%d", timer->Lifetime()); result += buf; result += ":"; result += MapSpecialChars(timer->File()); result += ":"; result += MapSpecialChars(timer->Aux() ? timer->Aux() : ""); const cEvent * event = timer->Event(); + dsyslog("[vdrmanager] timer's event is NULL. Try find it"); + if (!event) { + cChannel * channel = Channels.GetByChannelID( + timer->Channel()->GetChannelID()); + if (channel) { + cSchedulesLock schedulesLock; + const cSchedules * schedules = cSchedules::Schedules(schedulesLock); + const cSchedule * schedule = schedules->GetSchedule( + channel->GetChannelID()); + if (schedule) { + const cList<cEvent> * events = schedule->Events(); + for (cEvent * ev = events->First(); event; + ev = events->Next(ev)) { + if (timer->StartTime() <= ev->StartTime() + && timer->StopTime() + >= ev->StartTime() + ev->Duration()) { + event = ev; + dsyslog( + "[vdrmanager] timer's event was NULL, but found via time!"); + break; + } + } + } + } + } + if (event) { result += ":"; result += event->ShortText() ? MapSpecialChars(event->ShortText()) : ""; @@ -573,6 +596,7 @@ string cHelpers::ToText(cTimer * timer) { } else { result += "::"; } + result += ":"; result += MapSpecialChars(timer->Channel()->GetChannelID().ToString()); @@ -595,22 +619,24 @@ string cHelpers::ToText(const cEvent * event) { for (cTimer * timer = Timers.First(); timer; timer = Timers.Next(timer)) { if (timer->Channel() == channel && timer->StartTime() <= event->StartTime() - && timer->StopTime() >= event->StartTime() + event->Duration()) { + && timer->StopTime() + >= event->StartTime() + event->Duration()) { eventTimer = timer; } } char buf[100]; string result; - snprintf(buf, sizeof(buf)-1, "E%d", channel->Number()); + snprintf(buf, sizeof(buf) - 1, "E%d", channel->Number()); result = buf; result += ":"; result += MapSpecialChars(channel->Name()); result += ":"; - snprintf(buf, sizeof(buf)-1, "%lu", event->StartTime()); + snprintf(buf, sizeof(buf) - 1, "%lu", event->StartTime()); result += buf; result += ":"; - snprintf(buf, sizeof(buf)-1, "%lu", event->StartTime() + event->Duration()); + snprintf(buf, sizeof(buf) - 1, "%lu", + event->StartTime() + event->Duration()); result += buf; result += ":"; result += MapSpecialChars(event->Title()); @@ -719,13 +745,13 @@ string cHelpers::Trim(string str) { return str.substr(a, (b - a) + 1); } -string cHelpers::SafeCall(string(*f)()) { +string cHelpers::SafeCall(string (*f)()) { // loop, if vdr modified list and we crash for (int i = 0; i < 3; i++) { try { return f(); - } catch(exception &ex){ + } catch (exception &ex) { esyslog("[vdrmanager] catch an exception: %s", ex.what()); } catch (...) { esyslog("[vdrmanager] catch an exception"); @@ -736,7 +762,7 @@ string cHelpers::SafeCall(string(*f)()) { return ""; } -string cHelpers::SafeCall(string(*f)(string arg), string arg) { +string cHelpers::SafeCall(string (*f)(string arg), string arg) { // loop, if vdr modified list and we crash for (int i = 0; i < 3; i++) { try { @@ -752,13 +778,13 @@ string cHelpers::SafeCall(string(*f)(string arg), string arg) { return ""; } -string cHelpers::SafeCall(string(*f)(string arg1, string arg2), string arg1, +string cHelpers::SafeCall(string (*f)(string arg1, string arg2), string arg1, string arg2) { // loop, if vdr modified list and we crash for (int i = 0; i < 3; i++) { try { return f(arg1, arg2); - } catch (exception &ex){ + } catch (exception &ex) { esyslog("[vdrmanager] catch an exception 2: %s", ex.what()); } catch (...) { esyslog("[vdrmanager] catch an exception 2"); @@ -770,7 +796,7 @@ string cHelpers::SafeCall(string(*f)(string arg1, string arg2), string arg1, } string cHelpers::MapSpecialChars(cString text) { - return MapSpecialChars((const char *)text); + return MapSpecialChars((const char *) text); } string cHelpers::MapSpecialChars(const string text) { @@ -823,163 +849,170 @@ string cHelpers::UnMapSpecialChars(string text) { /** * based on vdr-restfulapi's RecordingLengthInSeconds */ -int cHelpers::RecordingLengthInSeconds(cRecording* recording) -{ +int cHelpers::RecordingLengthInSeconds(cRecording* recording) { #if APIVERSNUM < 10721 return -1; #endif - int nf = recording->NumFrames(); - if (nf >= 0) + int nf = recording->NumFrames(); + if (nf >= 0) #if APIVERSNUM >= 10703 - return int(((double)nf / recording->FramesPerSecond())); + return int(((double) nf / recording->FramesPerSecond())); #else - return int((double)nf / FRAMESPERSEC)); + return int((double)nf / FRAMESPERSEC)); #endif - return -1; + return -1; } - - - /** Compress a STL string using zlib with given compression level and return - * the binary data. */ -string cHelpers::compress_string(const string& str, int compressionlevel) -{ - z_stream zs; // z_stream is zlib's control structure - memset(&zs, 0, sizeof(zs)); + * the binary data. */ +string cHelpers::compress_string(const string& str, int compressionlevel) { + z_stream zs; // z_stream is zlib's control structure + memset(&zs, 0, sizeof(zs)); - if (deflateInit(&zs, compressionlevel) != Z_OK) - throw(runtime_error("deflateInit failed while compressing.")); + if (deflateInit(&zs, compressionlevel) != Z_OK) + throw(runtime_error("deflateInit failed while compressing.")); - zs.next_in = (Bytef*)str.data(); - zs.avail_in = str.size(); // set the z_stream's input + zs.next_in = (Bytef*) str.data(); + zs.avail_in = str.size(); // set the z_stream's input - int ret; - char outbuffer[32768]; - string outstring; + int ret; + char outbuffer[32768]; + string outstring; - // retrieve the compressed bytes blockwise - do { - zs.next_out = reinterpret_cast<Bytef*>(outbuffer); - zs.avail_out = sizeof(outbuffer); + // retrieve the compressed bytes blockwise + do { + zs.next_out = reinterpret_cast<Bytef*>(outbuffer); + zs.avail_out = sizeof(outbuffer); - ret = deflate(&zs, Z_FINISH); + ret = deflate(&zs, Z_FINISH); - if (outstring.size() < zs.total_out) { - // append the block to the output string - outstring.append(outbuffer, - zs.total_out - outstring.size()); - } - } while (ret == Z_OK); + if (outstring.size() < zs.total_out) { + // append the block to the output string + outstring.append(outbuffer, zs.total_out - outstring.size()); + } + } while (ret == Z_OK); - deflateEnd(&zs); + deflateEnd(&zs); - if (ret != Z_STREAM_END) { // an error occurred that was not EOF - ostringstream oss; - oss << "Exception during zlib compression: (" << ret << ") " << zs.msg; - throw(runtime_error(oss.str())); - } + if (ret != Z_STREAM_END) { // an error occurred that was not EOF + ostringstream oss; + oss << "Exception during zlib compression: (" << ret << ") " << zs.msg; + throw(runtime_error(oss.str())); + } - return outstring; + return outstring; } /** Decompress an STL string using zlib and return the original data. */ -string cHelpers::decompress_string(const string& str) -{ - z_stream zs; // z_stream is zlib's control structure - memset(&zs, 0, sizeof(zs)); +string cHelpers::decompress_string(const string& str) { + z_stream zs; // z_stream is zlib's control structure + memset(&zs, 0, sizeof(zs)); - if (inflateInit(&zs) != Z_OK) - throw(runtime_error("inflateInit failed while decompressing.")); + if (inflateInit(&zs) != Z_OK) + throw(runtime_error("inflateInit failed while decompressing.")); - zs.next_in = (Bytef*)str.data(); - zs.avail_in = str.size(); + zs.next_in = (Bytef*) str.data(); + zs.avail_in = str.size(); - int ret; - char outbuffer[32768]; - string outstring; + int ret; + char outbuffer[32768]; + string outstring; - // get the decompressed bytes blockwise using repeated calls to inflate - do { - zs.next_out = reinterpret_cast<Bytef*>(outbuffer); - zs.avail_out = sizeof(outbuffer); + // get the decompressed bytes blockwise using repeated calls to inflate + do { + zs.next_out = reinterpret_cast<Bytef*>(outbuffer); + zs.avail_out = sizeof(outbuffer); - ret = inflate(&zs, 0); + ret = inflate(&zs, 0); - if (outstring.size() < zs.total_out) { - outstring.append(outbuffer, - zs.total_out - outstring.size()); - } + if (outstring.size() < zs.total_out) { + outstring.append(outbuffer, zs.total_out - outstring.size()); + } - } while (ret == Z_OK); + } while (ret == Z_OK); - inflateEnd(&zs); + inflateEnd(&zs); - if (ret != Z_STREAM_END) { // an error occurred that was not EOF - ostringstream oss; - oss << "Exception during zlib decompression: (" << ret << ") " - << zs.msg; - throw(runtime_error(oss.str())); - } + if (ret != Z_STREAM_END) { // an error occurred that was not EOF + ostringstream oss; + oss << "Exception during zlib decompression: (" << ret << ") " + << zs.msg; + throw(runtime_error(oss.str())); + } - return outstring; + return outstring; } //These three methodes were stolen from vdr-restfulapi project. Thanks! -std::stack<int> cHelpers::ConvertToBinary(int v) -{ - int b; - std::stack <int> res; - - while ( v != 0) { - b = v % 2; - res.push(b); - v = (v-b) / 2; - } - return res; -} - - - -std::string cHelpers::ConvertWeekdays(int v) -{ - std::stack<int> b = cHelpers::ConvertToBinary(v); - int counter = 0; - std::ostringstream res; - while ( !b.empty() && counter < 7 ) { - int val = b.top(); - switch(counter) { - case 0: res << (val == 1 ? 'M' : '-'); break; - case 1: res << (val == 1 ? 'T' : '-'); break; - case 2: res << (val == 1 ? 'W' : '-'); break; - case 3: res << (val == 1 ? 'T' : '-'); break; - case 4: res << (val == 1 ? 'F' : '-'); break; - case 5: res << (val == 1 ? 'S' : '-'); break; - case 6: res << (val == 1 ? 'S' : '-'); break; - } - b.pop(); - counter++; - } - while ( counter < 7 ) { - res << '-'; - counter++; - } - return res.str(); -} - -int cHelpers::ConvertWeekdays(std::string v) -{ - const char* str = v.c_str(); - int res = 0; - if ( str[0] == 'M' ) res += 64; - if ( str[1] == 'T' ) res += 32; - if ( str[2] == 'W' ) res += 16; - if ( str[3] == 'T' ) res += 8; - if ( str[4] == 'F' ) res += 4; - if ( str[5] == 'S' ) res += 2; - if ( str[6] == 'S' ) res += 1; - return res; +std::queue<int> cHelpers::ConvertToBinary(int v) { + int b; + std::queue<int> res; + + while (v != 0) { + b = v % 2; + res.push(b); + v = (v - b) / 2; + } + return res; +} + +std::string cHelpers::ConvertWeekdays(int v) { + std::queue<int> b = cHelpers::ConvertToBinary(v); + int counter = 0; + std::ostringstream res; + while (!b.empty() && counter < 7) { + int val = b.front(); + switch (counter) { + case 0: + res << (val == 1 ? 'M' : '-'); + break; + case 1: + res << (val == 1 ? 'T' : '-'); + break; + case 2: + res << (val == 1 ? 'W' : '-'); + break; + case 3: + res << (val == 1 ? 'T' : '-'); + break; + case 4: + res << (val == 1 ? 'F' : '-'); + break; + case 5: + res << (val == 1 ? 'S' : '-'); + break; + case 6: + res << (val == 1 ? 'S' : '-'); + break; + } + b.pop(); + counter++; + } + while (counter < 7) { + res << '-'; + counter++; + } + return res.str(); +} + +int cHelpers::ConvertWeekdays(std::string v) { + const char* str = v.c_str(); + int res = 0; + if (str[0] == 'M') + res += 64; + if (str[1] == 'T') + res += 32; + if (str[2] == 'W') + res += 16; + if (str[3] == 'T') + res += 8; + if (str[4] == 'F') + res += 4; + if (str[5] == 'S') + res += 2; + if (str[6] == 'S') + res += 1; + return res; } - diff --git a/vdr-vdrmanager/helpers.h b/vdr-vdrmanager/helpers.h index 073a76c..6019438 100644 --- a/vdr-vdrmanager/helpers.h +++ b/vdr-vdrmanager/helpers.h @@ -11,7 +11,7 @@ #include <iostream> #include <iomanip> #include <sstream> -#include <stack> +#include <queue> using namespace std; @@ -60,6 +60,6 @@ private: static int RecordingLengthInSeconds(cRecording* recording); static string ConvertWeekdays(int v); static int ConvertWeekdays(string v); - static stack<int> ConvertToBinary(int v); + static queue<int> ConvertToBinary(int v); }; |