From 99e3c093f404b55683a90e38bbe74e1f51c35316 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Mon, 31 Oct 2005 18:00:00 +0100 Subject: =?UTF-8?q?Version=201.3.35=20-=20Updated=20'sources.conf'=20(than?= =?UTF-8?q?ks=20to=20Philip=20Prindeville).=20-=20Now=20using=20daemon()?= =?UTF-8?q?=20instead=20of=20fork()=20to=20run=20VDR=20in=20daemon=20mode?= =?UTF-8?q?=20(thanks=20to=20=20=20Enrico=20Scholz).=20-=20Fixed=20a=20pos?= =?UTF-8?q?sible=20endless=20loop=20in=20a=20menu=20with=20no=20selectable?= =?UTF-8?q?=20items=20if=20=20=20Setup.MenuScrollWrap=20is=20true=20(thank?= =?UTF-8?q?s=20to=20Enrico=20Scholz).=20-=20Making=20sure=20no=20item=20is?= =?UTF-8?q?=20displayed=20as=20"current"=20if=20Up,=20Down,=20Left=20or=20?= =?UTF-8?q?Right=20is=20=20=20pressed=20in=20a=20menu=20with=20no=20select?= =?UTF-8?q?able=20items.=20-=20Added=20'=5F=5Fattribute=5F=5F'=20to=20func?= =?UTF-8?q?tions=20that=20use=20printf()=20like=20parameters=20(thanks=20?= =?UTF-8?q?=20=20to=20Darren=20Salt).=20-=20Updated=20the=20Finnish=20OSD?= =?UTF-8?q?=20texts=20(thanks=20to=20Rolf=20Ahrenberg).=20-=20Fixed=20a=20?= =?UTF-8?q?leftover=20'summary.vdr'=20in=20vdr.1=20(reported=20by=20Christ?= =?UTF-8?q?oph=20Hermanns).=20-=20Added=20more=20error=20messages=20and=20?= =?UTF-8?q?line=20numbers=20when=20reading=20EPG=20data=20and=20info.vdr?= =?UTF-8?q?=20=20=20(thanks=20to=20Peter=20Bieringer).=20-=20Updated=20the?= =?UTF-8?q?=20Danish=20OSD=20texts=20(thanks=20to=20Mogens=20Elneff).=20-?= =?UTF-8?q?=20Updated=20the=20Estonian=20OSD=20texts=20(thanks=20to=20Arth?= =?UTF-8?q?ur=20Konovalov).=20-=20Added=20missing=20mutex=20locks=20to=20c?= =?UTF-8?q?CiMenu::Abort()=20and=20cCiEnquiry::Abort()=20(reported=20=20?= =?UTF-8?q?=20by=20Marco=20Schl=C3=BC=C3=9Fler).=20-=20Fixed=20lock=20hand?= =?UTF-8?q?ling=20in=20CAM=20communication=20to=20avoid=20problems=20with?= =?UTF-8?q?=20multiple=20CAMs=20=20=20per=20device=20or=20CAMs=20with=20mo?= =?UTF-8?q?re=20than=20one=20smart=20card.=20-=20Updated=20the=20Greek=20O?= =?UTF-8?q?SD=20texts=20(thanks=20to=20Dimitrios=20Dimitrakos).=20-=20Upda?= =?UTF-8?q?ted=20the=20French=20OSD=20texts=20(thanks=20to=20Nicolas=20Hui?= =?UTF-8?q?llard).=20-=20Fixed=20the=20cFilter=20example=20in=20PLUGINS.ht?= =?UTF-8?q?ml=20(reported=20by=20Patrick=20Fischer).=20-=20The=20new=20cla?= =?UTF-8?q?ss=20cUnbufferedFile=20is=20used=20for=20the=20recording=20file?= =?UTF-8?q?s=20to=20avoid=20=20=20trashing=20the=20file=20system=20cache?= =?UTF-8?q?=20(based=20on=20a=20patch=20by=20Ralf=20M=C3=BCller).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTORS | 21 ++++++ HISTORY | 27 ++++++++ PLUGINS.html | 2 +- channels.conf | 16 ++--- ci.c | 47 ++++++++------ ci.h | 8 ++- config.h | 6 +- cutter.c | 12 ++-- dvbplayer.c | 30 ++++----- epg.c | 8 ++- i18n.c | 204 +++++++++++++++++++++++++++++----------------------------- menu.c | 4 +- osdbase.c | 18 ++++-- recorder.c | 12 ++-- recording.c | 47 +++++++------- recording.h | 12 ++-- sources.conf | 15 ++++- svdrp.h | 4 +- thread.h | 4 +- tools.c | 125 ++++++++++++++++++++++++++++++++++- tools.h | 25 ++++++- vdr.1 | 4 +- vdr.c | 10 +-- videodir.c | 21 +++--- videodir.h | 6 +- 25 files changed, 454 insertions(+), 234 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 36f15b7..ab323d2 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -920,6 +920,7 @@ Peter Bieringer for reporting a problem with duplicate recordings with the same file name for suggesting to implement the command line option '--vfat' for reporting a leftover 'summary.vdr' in vdr.5 + for adding more error messages and line numbers when reading EPG data and info.vdr Alexander Damhuis for reporting problems when deleting a timer that is currently recording @@ -1024,6 +1025,7 @@ Rene Bartsch Christoph Hermanns for reporting a bug in handling the "Red" button in the "Schedules" menu in case there are no events listed for a particular channel + for reporting a leftover 'summary.vdr' in vdr.1 Oskar Signell for pointing out a problem with setting an editing mark while in "Pause" mode, @@ -1234,6 +1236,7 @@ Marco Schl for fixing handling EPG data for time shifted events for fixing detecting short channel names for "Kabel Deutschland" for reporting that the FATALERRNO macro needs to check for a non-zero errno value + for reporting missing mutex locks in cCiMenu::Abort() and cCiEnquiry::Abort() Jürgen Schmitz for reporting a bug in displaying the current channel when switching via the SVDRP @@ -1343,6 +1346,7 @@ Darren Salt pages for a patch that was used to add the command line options '--lirc', '--rcu' and '--no-kbd' + for adding '__attribute__' to functions that use printf() like parameters Sean Carlos for translating OSD texts to the Italian language @@ -1502,3 +1506,20 @@ Alexander Rieger for fixing handling color buttons in cMenuEditStrItem for making the '.update' file in the video directory be touched when a recording is added or deleted, so that other VDR instances can update their lists + +Philip Prindeville + for updates to 'sources.conf' + +Enrico Scholz + for making VDR use use daemon() instead of fork() to run in daemon mode + for fixing a possible endless loop in a menu with no selectable items if + Setup.MenuScrollWrap is true (thanks to Enrico Scholz). + +Nicolas Huillard + for translating OSD texts to the French language + +Patrick Fischer + for reporting an error in the cFilter example in PLUGINS.html + +Ralf Müller + for a patch that was used to implement cUnbufferedFile diff --git a/HISTORY b/HISTORY index 58e8278..6ebe056 100644 --- a/HISTORY +++ b/HISTORY @@ -3885,3 +3885,30 @@ Video Disk Recorder Revision History - The character 0x8A in CAM menu strings is now mapped to a real newline. - The 'sub-title' and 'bottom text' in the CAM menu can now consist of several lines. - Improved the CAM enquiry menu. + +2005-10-31: Version 1.3.35 + +- Updated 'sources.conf' (thanks to Philip Prindeville). +- Now using daemon() instead of fork() to run VDR in daemon mode (thanks to + Enrico Scholz). +- Fixed a possible endless loop in a menu with no selectable items if + Setup.MenuScrollWrap is true (thanks to Enrico Scholz). +- Making sure no item is displayed as "current" if Up, Down, Left or Right is + pressed in a menu with no selectable items. +- Added '__attribute__' to functions that use printf() like parameters (thanks + to Darren Salt). +- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg). +- Fixed a leftover 'summary.vdr' in vdr.1 (reported by Christoph Hermanns). +- Added more error messages and line numbers when reading EPG data and info.vdr + (thanks to Peter Bieringer). +- Updated the Danish OSD texts (thanks to Mogens Elneff). +- Updated the Estonian OSD texts (thanks to Arthur Konovalov). +- Added missing mutex locks to cCiMenu::Abort() and cCiEnquiry::Abort() (reported + by Marco Schlüßler). +- Fixed lock handling in CAM communication to avoid problems with multiple CAMs + per device or CAMs with more than one smart card. +- Updated the Greek OSD texts (thanks to Dimitrios Dimitrakos). +- Updated the French OSD texts (thanks to Nicolas Huillard). +- Fixed the cFilter example in PLUGINS.html (reported by Patrick Fischer). +- The new class cUnbufferedFile is used for the recording files to avoid + trashing the file system cache (based on a patch by Ralf Müller). diff --git a/PLUGINS.html b/PLUGINS.html index c44e652..12317cc 100644 --- a/PLUGINS.html +++ b/PLUGINS.html @@ -1447,7 +1447,7 @@ An instance of such a filter needs to be attached to the device from which it shall receive data, as in

-cMyFilter Filter;
+cMyFilter *Filter = new cMyFilter();
 
 cDevice::ActualDevice()->AttachFilter(Filter);
 

diff --git a/channels.conf b/channels.conf index c34b8b4..4c6e58b 100644 --- a/channels.conf +++ b/channels.conf @@ -8,12 +8,12 @@ hr-fernsehen;ARD:11836:hC34:S19.2E:27500:301:302=deu:304:0:28108:1:1101:0 NDR FS MV;ARD:12109:hC34:S19.2E:27500:2401:2402=deu:2404:0:28224:1:1073:0 SR SÜDWEST Fernsehen;ARD:12265:hC34:S19.2E:27500:1301:1302=deu:1304:0:28486:1:1093:0 WDR Köln;ARD:11836:hC34:S19.2E:27500:601:602=deu:604:0:28111:1:1101:0 -BR-alpha;ARD:11836:hC34:S19.2E:27500:701:702=deu;703:704:0:28112:1:1101:0 +BR-alpha;ARD:11836:hC34:S19.2E:27500:701:702=deu:704:0:28112:1:1101:0 SÜDWEST Ferns. BW;ARD:11836:hC34:S19.2E:27500:801:802=deu:804:0:28113:1:1101:0 Phoenix;ARD:11836:hC34:S19.2E:27500:901:902=deu:904:0:28114:1:1101:0 ZDF;ZDFvision:11953:hC34:S19.2E:27500:110:120=deu,121=2ch;125=dd:130:0:28006:1:1079:0 3sat;ZDFvision:11953:hC34:S19.2E:27500:210:220=deu,221=2ch;225=dd:230:0:28007:1:1079:0 -KiKa;ZDFvision:11953:hC34:S19.2E:27500:310:320:330:0:28008:1:1079:0 +KiKa;ZDFvision:11953:hC34:S19.2E:27500:310:320=deu:330:0:28008:1:1079:0 arte;ARD:11836:hC34:S19.2E:27500:401:402=deu,403=fra:404:0:28109:1:1101:0 ORF1;ORF:12692:hC56:S19.2E:22000:160:161=deu;163=deu:165:1762,D05,1702,1801:13001:1:1117:0 ORF2;ORF:12692:hC56:S19.2E:22000:500:501=deu;503=deu:505:1762,D05,1702,1801:13002:1:1117:0 @@ -27,8 +27,8 @@ NEUN LIVE Television,NEUN LIVE;BetaDigital:12480:vC34:S19.2E:27500:767:768=deu:3 DSF;BetaDigital:12480:vC34:S19.2E:27500:1023:1024=deu:39:0:900:133:33:0 HSE24,HSE24;BetaDigital:12480:vC34:S19.2E:27500:1279:1280=deu:37:0:40:133:33:0 Bloomberg TV Germany;Bloomberg:12551:vC56:S19.2E:22000:162:99=deu:0:0:12160:1:1108:0 -EURONEWS;CSAT:11817:vC34:S19.2E:27500:163:92=fra,93=eng,94=ita,95=esl,98=por,99=deu,91=rus:0:0:8004:1:1070:0 -rbb Brandenburg;ARD:12109:hC34:S19.2E:27500:501:502=deu:504:0:28205:1:1073:0 +EURONEWS;CSAT:11817:vC34:S19.2E:27500:163:92=fra,93=eng,94=ita,95=esl,91=rus,98=por,99=deu:0:0:8004:1:1070:0 +rbb Brandenburg;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28205:1:1073:0 Sky News:11597:vC56:S19.2E:22000:305+131:306=eng:0:0:28707:1:1026:0 Veronica/JETIX;CANALDIGITAAL:12574:hC56:S19.2E:22000:518+8190:92=dut:38:622,100:5020:53:1109:0 BVN;CANALDIGITAAL:12574:hC56:S19.2E:22000:515+8190:96=dut:36:0:5025:53:1109:0 @@ -45,13 +45,13 @@ MDR FERNSEHEN;ARD:12109:hC34:S19.2E:27500:401:402=deu:404:0:28204:1:1073:0 rbb Berlin;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28206:1:1073:0 :Premiere World PREMIERE START,START;PREMIERE:11797:hC34:S19.2E:27500:255:256=deu:32:1:8:133:2:0 -PREMIERE 1,PREM 1;PREMIERE:11797:hC34:S19.2E:27500:511:512=deu;515=deu:32:1:10:133:2:0 -PREMIERE 2,PREM 2;PREMIERE:11797:hC34:S19.2E:27500:1791:1792=deu;1795=deu:32:1:11:133:2:0 +PREMIERE 1,PREM 1;PREMIERE:11797:hC34:S19.2E:27500:511:512=deu,513=deu;515=deu:32:1:10:133:2:0 +PREMIERE 2,PREM 2;PREMIERE:11797:hC34:S19.2E:27500:1791:1792=deu,1793=deu;1795=deu:32:1:11:133:2:0 PREMIERE 3,PREM 3;PREMIERE:11797:hC34:S19.2E:27500:2303:2304=deu,2305=deu:32:1:43:133:2:0 PREMIERE 4,PREM 4;PREMIERE:11797:hC34:S19.2E:27500:767:768=deu,769=deu:32:1801,1722,1702:9:133:2:0 PREMIERE 5,PREM 5;PREMIERE:11797:hC34:S19.2E:27500:1279:1280=deu,1281=deu:32:1722,1702,1801:29:133:2:0 PREMIERE 6,PREM 6;PREMIERE:11797:hC34:S19.2E:27500:1535:1536=deu:32:1:41:133:2:0 -PREMIERE 7,PREM 7;PREMIERE:11797:hC34:S19.2E:27500:1023:1024=deu:32:1801,1722,1702:20:133:2:0 +PREMIERE 7,PREM 7;PREMIERE:11797:hC34:S19.2E:27500:1023:1024=deu:32:1801,1702,1722:20:133:2:0 DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:32:1722,1801,1702:34:133:17:0 :Premiere Direkt PREMIERE DIREKT,DIREKT;PREMIERE:12031:hC34:S19.2E:27500:2815:2816=deu,2817=deu;2819=deu:0:0:18:133:4:0 @@ -89,7 +89,7 @@ QVC Deutschland;QVC:12551:vC56:S19.2E:22000:165:166:167:0:12100:1:1108:0 TELE 5;BetaDigital:12480:vC34:S19.2E:27500:1535:1536=deu:38:0:51:133:33:0 :@201 Sky Sky One;BSkyB:12226:hC23:S28.2E:27500:515+8190:643=eng:579:960,961:4705:2:2027:0 -Sky Mix;BSkyB:12226:hC23:S28.2E:27500:514+8190:642=eng,662=NAR:578:960,961:5104:2:2027:0 +Sky Two;BSkyB:12226:hC23:S28.2E:27500:514+8190:642=eng,662=NAR:578:960,961:5104:2:2027:0 ITV2;BSkyB:10758:vC56:S28.2E:22000:2314:2315=eng,2363=NAR:2317:960,961:10070:2:2044:0 Sci-Fi;BSkyB:12148:hC23:S28.2E:27500:512+8190:640=eng:576:960,961:4905:2:2023:0 Paramount;BSkyB:12187:hC23:S28.2E:27500:2313+2304:2326=eng,2327=NAR:2315:960,961:5904:2:2025:0 diff --git a/ci.c b/ci.c index 9e86c61..4e63fde 100644 --- a/ci.c +++ b/ci.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: ci.c 1.36 2005/10/03 12:58:22 kls Exp $ + * $Id: ci.c 1.38 2005/10/30 13:04:10 kls Exp $ */ #include "ci.h" @@ -156,7 +156,7 @@ public: uint8_t Status(void); int Write(int fd); int Read(int fd); - void Dump(bool Outgoing); + void Dump(int fd, bool Outgoing); }; cTPDU::cTPDU(uint8_t Slot, uint8_t Tcid, uint8_t Tag, int Length, const uint8_t *Data) @@ -207,9 +207,9 @@ cTPDU::cTPDU(uint8_t Slot, uint8_t Tcid, uint8_t Tag, int Length, const uint8_t int cTPDU::Write(int fd) { - Dump(true); + Dump(fd, true); if (size) - return write(fd, data, size) == size ? OK : ERROR; + return safe_write(fd, data, size) == size ? OK : ERROR; esyslog("ERROR: attemp to write TPDU with zero size"); return ERROR; } @@ -222,20 +222,20 @@ int cTPDU::Read(int fd) size = 0; return ERROR; } - Dump(false); + Dump(fd, false); return OK; } -void cTPDU::Dump(bool Outgoing) +void cTPDU::Dump(int fd, bool Outgoing) { if (DumpTPDUDataTransfer) { #define MAX_DUMP 256 - fprintf(stderr, "%s ", Outgoing ? "-->" : "<--"); + fprintf(stderr, "%2d %s ", fd, Outgoing ? "-->" : "<--"); for (int i = 0; i < size && i < MAX_DUMP; i++) fprintf(stderr, "%02X ", data[i]); fprintf(stderr, "%s\n", size >= MAX_DUMP ? "..." : ""); if (!Outgoing) { - fprintf(stderr, " "); + fprintf(stderr, " "); for (int i = 0; i < size && i < MAX_DUMP; i++) fprintf(stderr, "%2c ", isprint(data[i]) ? data[i] : '.'); fprintf(stderr, "%s\n", size >= MAX_DUMP ? "..." : ""); @@ -1048,12 +1048,12 @@ cCiMMI::cCiMMI(int SessionId, cCiTransportConnection *Tc) cCiMMI::~cCiMMI() { if (fetchedMenu) { - cMutexLock MutexLock(&fetchedMenu->mutex); + cMutexLock MutexLock(fetchedMenu->mutex); fetchedMenu->mmi = NULL; } delete menu; if (fetchedEnquiry) { - cMutexLock MutexLock(&fetchedEnquiry->mutex); + cMutexLock MutexLock(fetchedEnquiry->mutex); fetchedEnquiry->mmi = NULL; } delete enquiry; @@ -1227,7 +1227,7 @@ cCiMenu::cCiMenu(cCiMMI *MMI, bool Selectable) cCiMenu::~cCiMenu() { - cMutexLock MutexLock(&mutex); + cMutexLock MutexLock(mutex); if (mmi) mmi->Menu(true); free(titleText); @@ -1254,7 +1254,8 @@ bool cCiMenu::HasUpdate(void) bool cCiMenu::Select(int Index) { - cMutexLock MutexLock(&mutex); + cMutexLock MutexLock(mutex); + dbgprotocol("%d: ==> Select %d\n", mmi ? mmi->SessionId() : -1, Index); if (mmi && -1 <= Index && Index < numEntries) return mmi->SendMenuAnswer(Index + 1); return false; @@ -1267,6 +1268,7 @@ bool cCiMenu::Cancel(void) bool cCiMenu::Abort(void) { + cMutexLock MutexLock(mutex); return mmi && mmi->SendCloseMMI(); } @@ -1282,7 +1284,7 @@ cCiEnquiry::cCiEnquiry(cCiMMI *MMI) cCiEnquiry::~cCiEnquiry() { - cMutexLock MutexLock(&mutex); + cMutexLock MutexLock(mutex); if (mmi) mmi->Enquiry(true); free(text); @@ -1290,7 +1292,7 @@ cCiEnquiry::~cCiEnquiry() bool cCiEnquiry::Reply(const char *s) { - cMutexLock MutexLock(&mutex); + cMutexLock MutexLock(mutex); return mmi ? mmi->SendAnswer(s) : false; } @@ -1301,6 +1303,7 @@ bool cCiEnquiry::Cancel(void) bool cCiEnquiry::Abort(void) { + cMutexLock MutexLock(mutex); return mmi && mmi->SendCloseMMI(); } @@ -1617,8 +1620,12 @@ cCiMenu *cCiHandler::GetMenu(void) cMutexLock MutexLock(&mutex); for (int Slot = 0; Slot < numSlots; Slot++) { cCiMMI *mmi = (cCiMMI *)GetSessionByResourceId(RI_MMI, Slot); - if (mmi) - return mmi->Menu(); + if (mmi) { + cCiMenu *Menu = mmi->Menu(); + if (Menu) + Menu->mutex = &mutex; + return Menu; + } } return NULL; } @@ -1628,8 +1635,12 @@ cCiEnquiry *cCiHandler::GetEnquiry(void) cMutexLock MutexLock(&mutex); for (int Slot = 0; Slot < numSlots; Slot++) { cCiMMI *mmi = (cCiMMI *)GetSessionByResourceId(RI_MMI, Slot); - if (mmi) - return mmi->Enquiry(); + if (mmi) { + cCiEnquiry *Enquiry = mmi->Enquiry(); + if (Enquiry) + Enquiry->mutex = &mutex; + return Enquiry; + } } return NULL; } diff --git a/ci.h b/ci.h index 6c35e6f..ae76015 100644 --- a/ci.h +++ b/ci.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: ci.h 1.17 2005/10/03 12:49:52 kls Exp $ + * $Id: ci.h 1.18 2005/10/30 12:31:14 kls Exp $ */ #ifndef __CI_H @@ -17,11 +17,12 @@ class cCiMMI; class cCiMenu { + friend class cCiHandler; friend class cCiMMI; private: enum { MAX_CIMENU_ENTRIES = 64 }; ///< XXX is there a specified maximum? cCiMMI *mmi; - cMutex mutex; + cMutex *mutex; bool selectable; char *titleText; char *subTitleText; @@ -45,10 +46,11 @@ public: }; class cCiEnquiry { + friend class cCiHandler; friend class cCiMMI; private: cCiMMI *mmi; - cMutex mutex; + cMutex *mutex; char *text; bool blind; int expectedLength; diff --git a/config.h b/config.h index d33de6a..9b17ad4 100644 --- a/config.h +++ b/config.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.h 1.230 2005/10/01 10:41:33 kls Exp $ + * $Id: config.h 1.231 2005/10/08 08:48:38 kls Exp $ */ #ifndef __CONFIG_H @@ -19,8 +19,8 @@ #include "i18n.h" #include "tools.h" -#define VDRVERSION "1.3.34" -#define VDRVERSNUM 10334 // Version * 10000 + Major * 100 + Minor +#define VDRVERSION "1.3.35" +#define VDRVERSNUM 10335 // Version * 10000 + Major * 100 + Minor #define MAXPRIORITY 99 #define MAXLIFETIME 99 diff --git a/cutter.c b/cutter.c index 9bbb0d4..f656bbd 100644 --- a/cutter.c +++ b/cutter.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: cutter.c 1.10 2005/08/14 10:51:54 kls Exp $ + * $Id: cutter.c 1.11 2005/10/31 12:26:44 kls Exp $ */ #include "cutter.h" @@ -18,7 +18,7 @@ class cCuttingThread : public cThread { private: const char *error; - int fromFile, toFile; + cUnbufferedFile *fromFile, *toFile; cFileName *fromFileName, *toFileName; cIndexFile *fromIndex, *toIndex; cMarks fromMarks, toMarks; @@ -34,7 +34,7 @@ cCuttingThread::cCuttingThread(const char *FromFileName, const char *ToFileName) :cThread("video cutting") { error = NULL; - fromFile = toFile = -1; + fromFile = toFile = NULL; fromFileName = toFileName = NULL; fromIndex = toIndex = NULL; if (fromMarks.Load(FromFileName) && fromMarks.Count()) { @@ -64,7 +64,7 @@ void cCuttingThread::Action(void) if (Mark) { fromFile = fromFileName->Open(); toFile = toFileName->Open(); - if (fromFile < 0 || toFile < 0) + if (!fromFile || !toFile) return; int Index = Mark->position; Mark = fromMarks.Next(Mark); @@ -92,7 +92,7 @@ void cCuttingThread::Action(void) fromFile = fromFileName->SetOffset(FileNumber, FileOffset); CurrentFileNumber = FileNumber; } - if (fromFile >= 0) { + if (fromFile) { int len = ReadFrame(fromFile, buffer, Length, sizeof(buffer)); if (len < 0) { error = "ReadFrame"; @@ -131,7 +131,7 @@ void cCuttingThread::Action(void) cutIn = false; } } - if (safe_write(toFile, buffer, Length) < 0) { + if (toFile->Write(buffer, Length) < 0) { error = "safe_write"; break; } diff --git a/dvbplayer.c b/dvbplayer.c index 8f76ab6..fd640d3 100644 --- a/dvbplayer.c +++ b/dvbplayer.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbplayer.c 1.40 2005/08/29 15:43:30 kls Exp $ + * $Id: dvbplayer.c 1.41 2005/10/31 12:33:48 kls Exp $ */ #include "dvbplayer.h" @@ -74,7 +74,7 @@ int cBackTrace::Get(bool Forward) class cNonBlockingFileReader : public cThread { private: - int f; + cUnbufferedFile *f; uchar *buffer; int wanted; int length; @@ -86,14 +86,14 @@ public: cNonBlockingFileReader(void); ~cNonBlockingFileReader(); void Clear(void); - int Read(int FileHandle, uchar *Buffer, int Length); + int Read(cUnbufferedFile *File, uchar *Buffer, int Length); bool Reading(void) { return buffer; } }; cNonBlockingFileReader::cNonBlockingFileReader(void) :cThread("non blocking file reader") { - f = -1; + f = NULL; buffer = NULL; wanted = length = 0; hasData = false; @@ -110,7 +110,7 @@ cNonBlockingFileReader::~cNonBlockingFileReader() void cNonBlockingFileReader::Clear(void) { Lock(); - f = -1; + f = NULL; free(buffer); buffer = NULL; wanted = length = 0; @@ -119,7 +119,7 @@ void cNonBlockingFileReader::Clear(void) newSet.Signal(); } -int cNonBlockingFileReader::Read(int FileHandle, uchar *Buffer, int Length) +int cNonBlockingFileReader::Read(cUnbufferedFile *File, uchar *Buffer, int Length) { if (hasData && buffer) { if (buffer != Buffer) { @@ -131,7 +131,7 @@ int cNonBlockingFileReader::Read(int FileHandle, uchar *Buffer, int Length) return length; } if (!buffer) { - f = FileHandle; + f = File; buffer = Buffer; wanted = Length; length = 0; @@ -146,8 +146,8 @@ void cNonBlockingFileReader::Action(void) { while (Running()) { Lock(); - if (!hasData && f >= 0 && buffer) { - int r = safe_read(f, buffer + length, wanted - length); + if (!hasData && f && buffer) { + int r = f->Read(buffer + length, wanted - length); if (r >= 0) { length += r; if (!r || length == wanted) // r == 0 means EOF @@ -181,7 +181,7 @@ private: cBackTrace *backTrace; cFileName *fileName; cIndexFile *index; - int replayFile; + cUnbufferedFile *replayFile; bool eof; bool firstPacket; ePlayModes playMode; @@ -237,7 +237,7 @@ cDvbPlayer::cDvbPlayer(const char *FileName) isyslog("replay %s", FileName); fileName = new cFileName(FileName, false); replayFile = fileName->Open(); - if (replayFile < 0) + if (!replayFile) return; ringBuffer = new cRingBufferFrame(PLAYERBUFSIZE); // Create the index file: @@ -302,10 +302,10 @@ bool cDvbPlayer::NextFile(uchar FileNumber, int FileOffset) { if (FileNumber > 0) replayFile = fileName->SetOffset(FileNumber, FileOffset); - else if (replayFile >= 0 && eof) + else if (replayFile && eof) replayFile = fileName->NextFile(); eof = false; - return replayFile >= 0; + return replayFile != NULL; } int cDvbPlayer::Resume(void) @@ -342,7 +342,7 @@ bool cDvbPlayer::Save(void) void cDvbPlayer::Activate(bool On) { if (On) { - if (replayFile >= 0) + if (replayFile) Start(); } else @@ -376,7 +376,7 @@ void cDvbPlayer::Action(void) // Read the next frame from the file: if (playMode != pmStill && playMode != pmPause) { - if (!readFrame && (replayFile >= 0 || readIndex >= 0)) { + if (!readFrame && (replayFile || readIndex >= 0)) { if (!nonBlockingFileReader->Reading()) { if (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) { uchar FileNumber; diff --git a/epg.c b/epg.c index 4377c6d..0bdd185 100644 --- a/epg.c +++ b/epg.c @@ -7,7 +7,7 @@ * Original version (as used in VDR before 1.3.0) written by * Robert Schneider and Rolf Hakenes . * - * $Id: epg.c 1.37 2005/09/09 15:14:11 kls Exp $ + * $Id: epg.c 1.38 2005/10/09 12:57:55 kls Exp $ */ #include "epg.h" @@ -285,8 +285,10 @@ bool cEvent::Read(FILE *f, cSchedule *Schedule) if (Schedule) { cEvent *Event = NULL; char *s; + int line = 0; cReadLine ReadLine; while ((s = ReadLine.Read(f)) != NULL) { + line++; char *t = skipspace(s + 1); switch (*s) { case 'E': if (!Event) { @@ -316,8 +318,10 @@ bool cEvent::Read(FILE *f, cSchedule *Schedule) break; case 'c': // to keep things simple we react on 'c' here return true; - default: if (Event && !Event->Parse(s)) + default: if (Event && !Event->Parse(s)) { + esyslog("ERROR: EPG data problem in line %d", line); return false; + } } } esyslog("ERROR: unexpected end of file while reading EPG data"); diff --git a/i18n.c b/i18n.c index 33f49e1..f21a320 100644 --- a/i18n.c +++ b/i18n.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: i18n.c 1.213 2005/10/03 12:27:15 kls Exp $ + * $Id: i18n.c 1.218 2005/10/30 13:37:57 kls Exp $ * * Translations provided by: * @@ -12,7 +12,7 @@ * Italian Alberto Carraro , Antonio Ospite , Sean Carlos * Dutch Arnold Niessen , Hans Dingemans * Portuguese Paulo Lopes - * French Jean-Claude Repetto , Olivier Jacques , Gregoire Favre + * French Jean-Claude Repetto , Olivier Jacques , Gregoire Favre , Nicolas Huillard * Norwegian Jørgen Tvedt , Truls Slevigen * Finnish Hannu Savolainen , Jaakko Hyvätti , Niko Tarnanen , Rolf Ahrenberg * Polish Michael Rakowski @@ -218,7 +218,7 @@ const tI18nPhrase Phrases[] = { "Timers", "Programmation", "Timere", - "Ajastin", + "Ajastimet", "Timery", "Timer", "×ñïíïäéáêüðôçò", @@ -258,19 +258,19 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Infos sur l'enregistrement", "",// TODO "Tallenteen tiedot", "",// TODO "",// TODO - "",// TODO + "ÅããñáöÞ", "Inspelning", "Detaliile înregistrãrii", "",// TODO "",// TODO "¸ÝäÞ Þ ×ÐßØáØ", "",// TODO - "",// TODO + "Salvestuse info", "Optagelses info", }, { "Setup", @@ -323,7 +323,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "Commandes d'enregistrement", "",// TODO - "Tallennuskomennot", + "Tallennekomennot", "Rozkazy Nagran", "Órdenes de grabación", "ÅíôïëÝò ãéÜ åããñáöÝò", @@ -426,12 +426,12 @@ const tI18nPhrase Phrases[] = { "",//TODO "",//TODO "",//TODO - "",//TODO + "Info", "",//TODO "Tiedot", "",//TODO "",//TODO - "",//TODO + "Ðëçñïöïñßåò", "Info", "Info", "",//TODO @@ -537,7 +537,7 @@ const tI18nPhrase Phrases[] = { "Uusi", "Nowy", "Nuevo", - "ÍÝï", + "NÝï", "Ny", "Nou", "Új", @@ -910,7 +910,7 @@ const tI18nPhrase Phrases[] = { "Inserisci", "Invoegen", "",// TODO - "Insért", + "Insérer", "",// TODO "Lisää", "Wstawiac", @@ -975,7 +975,7 @@ const tI18nPhrase Phrases[] = { "",//TODO "Réinitialisation", "",//TODO - "Alusta", + "Nollaa", "Reset", "Reiniciar", "ÅðáíáöïñÜ", @@ -999,7 +999,7 @@ const tI18nPhrase Phrases[] = { "Päivitä", "",//TODO "",//TODO - "",//TODO + "ÓÜñùóç", "Skanna", "Cãutare canale", "",//TODO @@ -1081,7 +1081,7 @@ const tI18nPhrase Phrases[] = { "Timer activo - têm a certeza que quer apagar?", "Enregistrement en cours - confirmez la suppression", "Timer gjør opptak - vil du slette likevel?", - "Ajastettu tallennus käynnissä - keskeytetäänkö?", + "Ajastettu tallennus käynnissä - poistetaanko silti?", "Nagrywanie w trakcie - napewno usunac?", "¿Timer activo - de verdad eliminarlo?", "×ñïíïäéáêüðôçò óÝ åîÝëéîç - ÄéáãñáöÞ óßãïõñá?", @@ -1123,7 +1123,7 @@ const tI18nPhrase Phrases[] = { "no interface primário", "sur la carte primaire", "på første enhet", - "päävastaanottimella", + "ensisijaisella sovittimella", "na pierwszym interfejsie", "en interface primario", "óôÞí êýñéá êÜñôá", @@ -1231,7 +1231,7 @@ const tI18nPhrase Phrases[] = { "Tallennus alkaa %d min kuluttua - sammutetaanko?", "Nagrywanie za %d minut - mimo to wylaczyc?", "Grabando en %d minutos, ¿de verdad apagar?", - "ÁíáìÝíåôáé åããñáöÞ óÝ %d ëåðôÜ - ÔåëéêÜ íá ôåñìáôéóôåé?", + "ÁíáìÝíåôáé åããñáöÞ óÝ %d ëåðôÜ - ÔåëéêÜ íá ôåñìáôéóôåß?", "Inspelning startar om %d minuter, vill du avsluta?", "Înregistrez peste %d minute - închid, totuºi?", "Felvétel %d perc mulva kezdödik - mégis kikapcsolni?", @@ -1397,7 +1397,7 @@ const tI18nPhrase Phrases[] = { "Ppid", "Ppid", "Ppid", - "Aikatieto-PID", + "PCR-PID", "Ppid", "Ppid", "Ppid", @@ -1523,7 +1523,7 @@ const tI18nPhrase Phrases[] = { "Encriptação", "Cryptage", "Kortleser", - "Salaus", + "Salaus (CA)", "CA", "CA", "CA", @@ -1607,7 +1607,7 @@ const tI18nPhrase Phrases[] = { "CoderateH", "CoderateH", "CoderateH", - "Yläsuojaustaso", + "Suojaustaso (HP)", "CoderateH", "CoderateH", "CoderateH", @@ -1628,7 +1628,7 @@ const tI18nPhrase Phrases[] = { "CoderateL", "CoderateL", "CoderateL", - "Alasuojaustaso", + "Suojaustaso (LP)", "CoderateL", "CoderateL", "CoderateL", @@ -1670,7 +1670,7 @@ const tI18nPhrase Phrases[] = { "Transmission", "Transmission", "Transmission", - "Lähetystila", + "Transmissio", "Transmisja", "Transmission", "Transmission", @@ -1715,7 +1715,7 @@ const tI18nPhrase Phrases[] = { "Hierarkia", "Hierachia", "Hierarchy", - "Hierarchy", + "Éåñáñ÷åßá", "Hierarchy", "Ierarhie", "Hierarchy", @@ -1842,7 +1842,7 @@ const tI18nPhrase Phrases[] = { "VPS", "",// TODO "",// TODO - "",// TODO + "VPS", "VPS", "VPS", "",// TODO @@ -2071,7 +2071,7 @@ const tI18nPhrase Phrases[] = { "Nenhuma placa DVB disponivel para gravar!", "Pas de carte DVB disponible pour l'enregistrement!", "Ingen ledige DVB enheter for opptak!", - "Ei vapaata vastaanotinta tallennukselle!", + "Ei vapaata DVB-viritintä tallennukselle!", "Brak wolnej karty DVB do nagrywania!", "¡No hay dispositivo DVB disponible para grabar!", "ÁíåðÜñêåéá DVB ÊÜñôáò ãéÜ åããñáöÞ!", @@ -2281,18 +2281,18 @@ const tI18nPhrase Phrases[] = { "",//TODO "",//TODO "",//TODO + "Avataan CA-moduulin valikkoa...", "",//TODO "",//TODO "",//TODO + "Åßóïäïò CAM Ìåíïý", "",//TODO "",//TODO "",//TODO "",//TODO "",//TODO - "",//TODO - "",//TODO - "",//TODO - "",//TODO + "CAM-menüü avamine...", + "Åbner CAM menu...", }, { "Can't open CAM menu!", "CAM-Menü kann nicht geöffnet werden!", @@ -2302,7 +2302,7 @@ const tI18nPhrase Phrases[] = { "",//TODO "Impossible d'ouvrir le menu CAM!", "",//TODO - "Salausmoduulin valikko ei saatavilla", + "CA-moduulin valikko ei saatavilla", "CAM-Menu niedostepne!", "¡No pudeo acceder al menú de la CAM!", "Áäýíáôç ç ðñüóâáóç óôü CAM ìåíïý!", @@ -2323,18 +2323,18 @@ const tI18nPhrase Phrases[] = { "",//TODO "",//TODO "",//TODO + "CA-moduuli palautetaan alkutilaan...", "",//TODO "",//TODO "",//TODO + "ÅðáíáöïñÜ CAM", "",//TODO "",//TODO "",//TODO "",//TODO "",//TODO - "",//TODO - "",//TODO - "",//TODO - "",//TODO + "CAM mooduli taaskäivitus...", + "Nulstiller CAM...", }, { "Can't reset CAM!", "CAM-Reset fehlgeschlagen!", @@ -2344,7 +2344,7 @@ const tI18nPhrase Phrases[] = { "",//TODO "Impossible de réinitialiser la CAM!", "",//TODO - "Salausmoduulin alustus epäonnistui!", + "CA-moduulin palautus alkutilaan epäonnistui!", "Nieudany CAM-Reset!", "¡No puedo reiniciar la CAM!", "Áäýíáôï íá ãßíåé åðáíáöïñÜ óôü CAM", @@ -2365,7 +2365,7 @@ const tI18nPhrase Phrases[] = { "",//TODO "La CAM a été réinitialisée", "",//TODO - "Salausmoduuli alustettu", + "CA-moduuli palautettu alkutilaan", "CAM-Reset wykonany", "CAM reiniciada", "Óôï CAM Ýãéíå åðáíáöïñÜ", @@ -2386,18 +2386,18 @@ const tI18nPhrase Phrases[] = { "",//TODO "",//TODO "",//TODO + "Syötä %d numeroa!", "",//TODO "",//TODO "",//TODO + "Ðáñáêáëü ðëçêôñïëïãÞóåôå %d íïýìåñá", "",//TODO "",//TODO "",//TODO "",//TODO "",//TODO - "",//TODO - "",//TODO - "",//TODO - "",//TODO + "Palun sisesta %d numbrit!", + "Indtast venligst %d cifre!", }, { "No audio available!", "Kein Audio verfügbar!", @@ -2410,7 +2410,7 @@ const tI18nPhrase Phrases[] = { "Äänen kieli ei ole valittavissa!", "",//TODO "",//TODO - "",//TODO + "ÁíåðÜñêåéá Þ÷ïõ", "Ljud saknas!" "Lipseºte sunetul!", "",//TODO @@ -2513,7 +2513,7 @@ const tI18nPhrase Phrases[] = { "CICAM", "Accès conditionnel", "CICAM", - "CI-moduuli", + "CICAM", "CICAM", "CICAM", "CICAM", @@ -2685,7 +2685,7 @@ const tI18nPhrase Phrases[] = { "Ulkoasu", "",// TODO "",// TODO - "",// TODO + "ÅðéöÜíåéá", "Skin", "Skin", "",// TODO @@ -2706,7 +2706,7 @@ const tI18nPhrase Phrases[] = { "Teema", "",// TODO "",// TODO - "",// TODO + "ÈÝìá", "Tema", "Temã", "",// TODO @@ -2727,7 +2727,7 @@ const tI18nPhrase Phrases[] = { "Vaakakeskitys", "",// TODO "",// TODO - "",// TODO + "ÁñéóôåñÜ", "Vänster", "Stânga", "",// TODO @@ -2748,7 +2748,7 @@ const tI18nPhrase Phrases[] = { "Pystykeskitys", "",// TODO "",// TODO - "",// TODO + "ÅðÜíù", "Övre", "Sus", "",// TODO @@ -2832,7 +2832,7 @@ const tI18nPhrase Phrases[] = { "Käytä pieniä kirjasimia", "",// TODO "",// TODO - "",// TODO + "×ñéóçìïðïßçóç ìéêñüí ãñáììáôïóåéñþí", "Använd liten font", "Utilizare fonturi mici", "",// TODO @@ -2853,7 +2853,7 @@ const tI18nPhrase Phrases[] = { "ei koskaan", "",// TODO "",// TODO - "",// TODO + "ÐïôÝ" "aldrig", "niciodatã", "",// TODO @@ -2869,12 +2869,12 @@ const tI18nPhrase Phrases[] = { "in base alla superficie", "skin afhankelijk", "",// TODO - "Dépend du skin", + "dépend du skin", "",// TODO "ulkoasun mukaan", "",// TODO "",// TODO - "",// TODO + "ÅîáñôÜôå áðü ôÞí åðéöÜíåéá", "skin beroende", "dep. de skin", "",// TODO @@ -2895,7 +2895,7 @@ const tI18nPhrase Phrases[] = { "aina", "",// TODO "",// TODO - "",// TODO + "ðÜíôá", "alltid", "întotdeauna", "",// TODO @@ -2937,7 +2937,7 @@ const tI18nPhrase Phrases[] = { "Kanavatiedon esitysaika (s)", "",// TODO "",// TODO - "",// TODO + "÷ñüíïò Ýíäåéêóçò ðëçñïöïñßùí êáíáëéïý óå (ä)", "Kanal information (s)", "Durata afiºãrii info-canal (s)", "",// TODO @@ -2974,7 +2974,7 @@ const tI18nPhrase Phrases[] = { "Scorri pagina nel menu", "Scrollen per pagina", "Scroll da página no menu", - "Scrolling par pages", + "Défilement par pages", "Rask rulling i menyer", "Valikoiden vieritys sivuttain", "Przesuwac stronami", @@ -2995,12 +2995,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Défilement rotatif", "",// TODO "Valikoiden vieritys ympäri", "",// TODO "",// TODO - "",// TODO + "Êßëéóç ãýñù-ãýñù", "Rulla texten", "Derulare circularã", "",// TODO @@ -3039,7 +3039,7 @@ const tI18nPhrase Phrases[] = { "Directorias de gravação", "Dossiers d'enregistrements", "Kataloger til opptak", - "Tallennehakemistot", + "Näytä tallennehakemistot", "Wykaz nagran", "Gracaciones en directorios", "ÖÜêåëïé åããñáöþí", @@ -3100,12 +3100,12 @@ const tI18nPhrase Phrases[] = { "Visualizzazione dati vecchi (min)", "Oude EPG data tonen (min)", "",// TODO - "Montrer l'EPG plus vieux de m min", + "Montrer l'EPG périmé (min)", "",// TODO "Vanha tieto näkyy (min)", "",// TODO "",// TODO - "",// TODO + "¸íäåéêóç îåðåñáóìÝíïí ðëçñïöïñéþí (ëåðôÜ)", "Visa gammal information (min)", "Date EPG expirate cel mult (min)", "",// TODO @@ -3123,7 +3123,7 @@ const tI18nPhrase Phrases[] = { "Ajustar relógio do sistema", "Ajuster l'heure du système", "Juster system-klokken", - "Aseta kellonaika", + "Tahdista kellonaika", "Ustawianie czasu", "Ajustar reloj de sistema", "Óõíôïíéóìüò þñáò õðïëïãéóôÞ", @@ -3168,7 +3168,7 @@ const tI18nPhrase Phrases[] = { "Suosikkikielet", "",// TODO "",// TODO - "",// TODO + "Ðñïôéíüìåíåò ãëþóåò", "Önskade språk", "Limbi preferate", "",// TODO @@ -3189,7 +3189,7 @@ const tI18nPhrase Phrases[] = { "Suosikkikieli", "",// TODO "",// TODO - "",// TODO + "Ðñïôéíüìåíç ãëþóá", "Önskat språk", "Limba preferatã", "",// TODO @@ -3207,7 +3207,7 @@ const tI18nPhrase Phrases[] = { "Interface DVB primário", "Carte DVB primaire", "Hoved DVB-enhet", - "Päävastaanotin", + "Ensisijainen DVB-sovitin", "Pierwotny interfejs DVB", "Primer interface DVB", "Êýñéá DVB êÜñôá", @@ -3226,12 +3226,12 @@ const tI18nPhrase Phrases[] = { "",//TODO "Video display format", "",//TODO - "",//TODO + "Format d'affichage", "",//TODO "Näyttömuoto", "",//TODO "",//TODO - "",//TODO + "ÌïñöÞ Ýíäåéêóçò Âßíôåï", "Format för video display", "Formatul redãrii video", "",//TODO @@ -3315,7 +3315,7 @@ const tI18nPhrase Phrases[] = { "Kuvasuhde", "Format telewizyjny", "Formato Vídeo", - "Ó÷Þìá ïèüíçò", + "ÌïñöÞ ïèüíçò", "Video format", "Format video", "Video formátum", @@ -3336,7 +3336,7 @@ const tI18nPhrase Phrases[] = { "Käytä Dolby Digital -ääntä", "",//TODO "",//TODO - "",//TODO + "×ñçóéìïðïßçóç Þ÷ïõ Dolby Digital", "Använd Dolby Digital", "Sunet Dolby Digital", "",//TODO @@ -3357,7 +3357,7 @@ const tI18nPhrase Phrases[] = { "Päivitä kanavat", "",// TODO "",// TODO - "",// TODO + "áíáíÝïóç êáíáëéþí", "Uppdatera kanaler", "Actualizare canale", "",// TODO @@ -3373,12 +3373,12 @@ const tI18nPhrase Phrases[] = { "solo nomi", "alleen namen", "",// TODO - "Seulement les noms", + "noms uniquement", "",// TODO "vain nimet", "",// TODO "",// TODO - "",// TODO + "ìüíï üíïìá", "bara namn", "doar numele", "",// TODO @@ -3394,12 +3394,12 @@ const tI18nPhrase Phrases[] = { "nomi e PIDs", "namen en PIDs", "",// TODO - "Noms et PIDs", + "noms et PIDs", "",// TODO "nimet ja PID:it", "",// TODO "",// TODO - "",// TODO + "üíïìá êáß PID", "namn och PID", "nume si PID-uri", "",// TODO @@ -3415,12 +3415,12 @@ const tI18nPhrase Phrases[] = { "aggiungere canali nuovi", "nieuwe kanalen toevoegen", "",// TODO - "Ajouter les nouvelles chaînes", - "",// TODO - "lisää uudet kanavat", + "ajouter chaînes", "",// TODO + "uudet kanavat", "",// TODO "",// TODO + "ðñïóèÞêç íÝïí êáíáëéþí", "lägg till nya kanaler", "adãugare canale noi", "",// TODO @@ -3436,12 +3436,12 @@ const tI18nPhrase Phrases[] = { "aggiungere transponder nuovi", "nieuwe transponders toevoegen", "",// TODO - "Ajouter les nouveaux transpondeurs", - "",// TODO - "lisää uudet transponderit", + "ajouter transpondeurs", "",// TODO + "uudet transponderit", "",// TODO "",// TODO + "ðñïóèÞêç íÝïí transponder", "lägg till nya transponders", "adãugare transpondere noi", "",// TODO @@ -3457,12 +3457,12 @@ const tI18nPhrase Phrases[] = { "",//TODO "Audio talen", "",//TODO - "",//TODO + "Langues audio", "",//TODO "Äänen kielet", "",//TODO "",//TODO - "",//TODO + "Ãëþóåò Þ÷ïõ", "Antal ljudspråk", "Limbi sunet", "",//TODO @@ -3478,12 +3478,12 @@ const tI18nPhrase Phrases[] = { "",//TODO "Audio taal", "",//TODO - "",//TODO + "Langue audio", "",//TODO "Äänen kieli", "",//TODO "",//TODO - "",//TODO + "Ãëþóá Þ÷ïõ", "Ljudspråk", "Limba sunetului", "",//TODO @@ -3501,7 +3501,7 @@ const tI18nPhrase Phrases[] = { "Limite de bandas LNB (MHz)", "Limite de bandes LNB (MHz)", "LO-grensefrekvens (MHz)", - "LNB rajataajuus (MHz)", + "LNB-rajataajuus (MHz)", "SLOF (MHz)", "SLOF (MHz)", "SLOF (MHz)", @@ -3522,7 +3522,7 @@ const tI18nPhrase Phrases[] = { "Frequência base LNB (MHz)", "Fréquence basse LNB (MHz)", "LO-frekvens i lavbåndet (MHz)", - "LNB alempi taajuus (MHz)", + "LNB-alataajuus (MHz)", "Dolna czestotliwosc LNB (MHz)", "Frecuencia baja LNB (MHz)", "ÊÜôù LNB-Óõ÷íüôçôá (MHz)", @@ -3543,7 +3543,7 @@ const tI18nPhrase Phrases[] = { "Frequência alta LNB (MHz)", "Fréquence haute LNB (MHz)", "LO-frekvens i høybåndet (MHz)", - "LNB ylempi taajuus (MHz)", + "LNB-ylätaajuus (MHz)", "Gorna czestotliwosc LNB (MHz)", "Frecuencia alta LNB (MHz)", "¢íù LNB-Óõ÷íüôçôá (MHz)", @@ -3564,7 +3564,7 @@ const tI18nPhrase Phrases[] = { "Utilizar DiSEqC", "Utiliser le DiSEqC", "Bruk DiSEqC", - "DiSEqC käytössä", + "Käytä DiSEqC-kytkintä", "Uzywac DiSEqC", "Utilizar DiSEqC", "Åíåñãïðïßçóç DiSEqC", @@ -3585,7 +3585,7 @@ const tI18nPhrase Phrases[] = { "CICAM DVB", "Accès conditionnel", "CICAM DVB", - "CI-moduuli DVB", + "CICAM DVB", "CICAM DVB", "CICAM DVB", "CICAM DVB", @@ -3648,7 +3648,7 @@ const tI18nPhrase Phrases[] = { "Limite Primário", "Limite primaire", "Prioritetsgrense HovedDVB", - "Päävastaanottimen prioriteetti", + "Ensisijaisen sovittimen prioriteettiraja", "Pierwotny limit", "Límite primario", "Ðñïôåýïí üñéï", @@ -3777,7 +3777,7 @@ const tI18nPhrase Phrases[] = { "Käytä VPS-toimintoa", "",// TODO "",// TODO - "",// TODO + "×ñÞóç VPS", "Använd VPS", "Utilizeazã VPS", "",// TODO @@ -3798,7 +3798,7 @@ const tI18nPhrase Phrases[] = { "VPS-toiminnon aloitusmarginaali (s)", "",// TODO "",// TODO - "",// TODO + "Ðåñéèüñéï VPS (ä)", "VPS marginal (s)", "Marjã de timp la utilizare VPS (s)", "",// TODO @@ -3921,7 +3921,7 @@ const tI18nPhrase Phrases[] = { "Modo de multi-speed", "Mode multi-vitesses", "Multispeed modus", - "Moninopeustila", + "Käytä toiston moninopeustilaa", "Tryb wielopredkosciowy", "Modo multi-velocidad", "Ìåèïäïò ðïëëáðëÞò ôá÷ýôçôáò", @@ -4026,7 +4026,7 @@ const tI18nPhrase Phrases[] = { "Timeout SVDRP (s)", "Temps maxi SVDRP (s)", "Ubrukt SVDRP-levetid (s)", - "SVDRP odotusaika (s)", + "SVDRP-komennon odotusaika (s)", "Min. brak aktywnosci SVDRP (s)", "SVDRP Timeout (s)", "SVDRP äéáêïðÞ (ä)", @@ -4045,7 +4045,7 @@ const tI18nPhrase Phrases[] = { "Timeout Zapping", "Zap timeout (s)", "",// TODO - "Prise en compte dernière chaîne (s)", + "Prise en compte chaîne (s)", "",// TODO "Kanavavalinnan odotusaika (s)", "",// TODO @@ -4915,7 +4915,7 @@ const tI18nPhrase Phrases[] = { "Ääni", "",// TODO "",// TODO - "",// TODO + "¹÷ïò", "Ljud", "Sunet", "",// TODO @@ -5228,7 +5228,7 @@ const tI18nPhrase Phrases[] = { "A mudar interface DVB primário...", "Changement de carte DVB primaire...", "Bytter første DVB-enhet...", - "Vaihdetaan päävastaanottimelle...", + "Vaihdetaan ensisijaista DVB-sovitinta...", "Pierwszy interfejs DVB przelacza...", "Cambio al interface DVB primario...", "Ç êýñéá DVB êÜñôá áëëÜæåé...", @@ -5373,12 +5373,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Mise à jour du guide des programmes", "",// TODO "Ohjelmaoppaan päivitys aloitettu", "",// TODO "",// TODO - "",// TODO + "Áñ÷Þ óÜñùóç EPG", "Påbörjar EPG skanning", "Pornesc achiziþia EPG", "",// TODO @@ -5415,12 +5415,12 @@ const tI18nPhrase Phrases[] = { "VDR Classico", "VDR Klassiek", "",// TODO - "",// TODO + "VDR Classique",// TODO "",// TODO "Klassinen VDR", "",// TODO "",// TODO - "",// TODO + "Êëáóéêü VDR", "Klassisk VDR", "VDR clasic", "",// TODO @@ -5436,12 +5436,12 @@ const tI18nPhrase Phrases[] = { "Consolles ST:TNG", "ST:TNG Consoles", "",// TODO - "",// TODO + "Consoles ST:TNG", "",// TODO "ST:TNG konsoli", "",// TODO "",// TODO - "",// TODO + "ÌïñöÝò ST:TNG", "ST:TNG konsoll", "Cons. ST:TNG", "",// TODO @@ -5457,19 +5457,19 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Sans titre", "",// TODO "Ei esitystä", "",// TODO "",// TODO - "",// TODO + "Ï÷é ôßôëï", "ingen titel", "Fãrã titlu", "",// TODO "",// TODO "±Õ× ÝÐ×ÒÐÝØï", "Bez titla", - "",// TODO + "Pealkiri puudub", "Ingen titel", }, { NULL } diff --git a/menu.c b/menu.c index 19079be..c280b45 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.374 2005/10/03 12:53:51 kls Exp $ + * $Id: menu.c 1.375 2005/10/09 11:22:03 kls Exp $ */ #include "menu.h" @@ -230,7 +230,7 @@ public: }; cMenuEditChannel::cMenuEditChannel(cChannel *Channel, bool New) -:cOsdMenu(tr("Edit channel"), 14) +:cOsdMenu(tr("Edit channel"), 16) { channel = Channel; if (channel) { diff --git a/osdbase.c b/osdbase.c index 9646bcc..e99c986 100644 --- a/osdbase.c +++ b/osdbase.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: osdbase.c 1.22 2005/10/02 15:00:40 kls Exp $ + * $Id: osdbase.c 1.24 2005/10/09 10:56:26 kls Exp $ */ #include "osdbase.h" @@ -242,8 +242,8 @@ void cOsdMenu::DisplayCurrent(bool Current) { cOsdItem *item = Get(current); if (item) { - displayMenu->SetItem(item->Text(), current - first, Current, item->Selectable()); - if (Current) + displayMenu->SetItem(item->Text(), current - first, Current && item->Selectable(), item->Selectable()); + if (Current && item->Selectable()) cStatus::MsgOsdCurrentItem(item->Text()); if (!Current) item->SetFresh(true); // leaving the current item resets 'fresh' @@ -268,14 +268,16 @@ void cOsdMenu::CursorUp(void) int tmpCurrent = current; int lastOnScreen = first + displayMenuItems - 1; int last = Count() - 1; + if (last < 0) + return; while (--tmpCurrent != current) { if (tmpCurrent < 0) { if (Setup.MenuScrollWrap) - tmpCurrent = last; + tmpCurrent = last + 1; else return; } - if (SelectableItem(tmpCurrent)) + else if (SelectableItem(tmpCurrent)) break; } if (first <= tmpCurrent && tmpCurrent <= lastOnScreen) @@ -298,14 +300,16 @@ void cOsdMenu::CursorDown(void) int tmpCurrent = current; int lastOnScreen = first + displayMenuItems - 1; int last = Count() - 1; + if (last < 0) + return; while (++tmpCurrent != current) { if (tmpCurrent > last) { if (Setup.MenuScrollWrap) - tmpCurrent = 0; + tmpCurrent = -1; else return; } - if (SelectableItem(tmpCurrent)) + else if (SelectableItem(tmpCurrent)) break; } if (first <= tmpCurrent && tmpCurrent <= lastOnScreen) diff --git a/recorder.c b/recorder.c index 34236fc..35a8e56 100644 --- a/recorder.c +++ b/recorder.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recorder.c 1.15 2005/08/14 10:53:28 kls Exp $ + * $Id: recorder.c 1.16 2005/10/31 12:35:29 kls Exp $ */ #include @@ -28,7 +28,7 @@ private: cIndexFile *index; uchar pictureType; int fileSize; - int recordFile; + cUnbufferedFile *recordFile; time_t lastDiskSpaceCheck; bool RunningLowOnDiskSpace(void); bool NextFile(void); @@ -50,7 +50,7 @@ cFileWriter::cFileWriter(const char *FileName, cRemux *Remux) lastDiskSpaceCheck = time(NULL); fileName = new cFileName(FileName, true); recordFile = fileName->Open(); - if (recordFile < 0) + if (!recordFile) return; // Create the index file: index = new cIndexFile(FileName, true); @@ -81,13 +81,13 @@ bool cFileWriter::RunningLowOnDiskSpace(void) bool cFileWriter::NextFile(void) { - if (recordFile >= 0 && pictureType == I_FRAME) { // every file shall start with an I_FRAME + if (recordFile && pictureType == I_FRAME) { // every file shall start with an I_FRAME if (fileSize > MEGABYTE(Setup.MaxVideoFileSize) || RunningLowOnDiskSpace()) { recordFile = fileName->NextFile(); fileSize = 0; } } - return recordFile >= 0; + return recordFile != NULL; } void cFileWriter::Action(void) @@ -102,7 +102,7 @@ void cFileWriter::Action(void) if (NextFile()) { if (index && pictureType != NO_PICTURE) index->Write(pictureType, fileName->Number(), fileSize); - if (safe_write(recordFile, p, Count) < 0) { + if (recordFile->Write(p, Count) < 0) { LOG_ERROR_STR(fileName->Name()); break; } diff --git a/recording.c b/recording.c index 9e96922..c90e54d 100644 --- a/recording.c +++ b/recording.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recording.c 1.120 2005/10/01 10:29:02 kls Exp $ + * $Id: recording.c 1.122 2005/10/31 12:27:58 kls Exp $ */ #include "recording.h" @@ -264,7 +264,9 @@ bool cRecordingInfo::Read(FILE *f) if (ownEvent) { cReadLine ReadLine; char *s; + int line = 0; while ((s = ReadLine.Read(f)) != NULL) { + ++line; char *t = skipspace(s + 1); switch (*s) { case 'C': { @@ -275,8 +277,10 @@ bool cRecordingInfo::Read(FILE *f) channelID = tChannelID::FromString(t); } break; - default: if (!ownEvent->Parse(s)) + default: if (!ownEvent->Parse(s)) { + esyslog("ERROR: EPG data problem in line %d", line); return false; + } break; } } @@ -478,7 +482,8 @@ cRecording::cRecording(const char *FileName) asprintf(&InfoFileName, "%s%s", fileName, INFOFILESUFFIX); FILE *f = fopen(InfoFileName, "r"); if (f) { - info->Read(f); + if (!info->Read(f)) + esyslog("ERROR: EPG data problem in file %s", InfoFileName); fclose(f); } else if (errno != ENOENT) @@ -1253,7 +1258,7 @@ int cIndexFile::Get(uchar FileNumber, int FileOffset) cFileName::cFileName(const char *FileName, bool Record, bool Blocking) { - file = -1; + file = NULL; fileNumber = 0; record = Record; blocking = Blocking; @@ -1274,21 +1279,21 @@ cFileName::~cFileName() free(fileName); } -int cFileName::Open(void) +cUnbufferedFile *cFileName::Open(void) { - if (file < 0) { + if (!file) { int BlockingFlag = blocking ? 0 : O_NONBLOCK; if (record) { dsyslog("recording to '%s'", fileName); file = OpenVideoFile(fileName, O_RDWR | O_CREAT | BlockingFlag); - if (file < 0) + if (!file) LOG_ERROR_STR(fileName); } else { if (access(fileName, R_OK) == 0) { dsyslog("playing '%s'", fileName); - file = open(fileName, O_RDONLY | BlockingFlag); - if (file < 0) + file = cUnbufferedFile::Create(fileName, O_RDONLY | BlockingFlag); + if (!file) LOG_ERROR_STR(fileName); } else if (errno != ENOENT) @@ -1300,14 +1305,14 @@ int cFileName::Open(void) void cFileName::Close(void) { - if (file >= 0) { - if ((record && CloseVideoFile(file) < 0) || (!record && close(file) < 0)) + if (file) { + if ((record && CloseVideoFile(file) < 0) || (!record && file->Close() < 0)) LOG_ERROR_STR(fileName); - file = -1; + file = NULL; } } -int cFileName::SetOffset(int Number, int Offset) +cUnbufferedFile *cFileName::SetOffset(int Number, int Offset) { if (fileNumber != Number) Close(); @@ -1332,23 +1337,23 @@ int cFileName::SetOffset(int Number, int Offset) } else if (errno != ENOENT) { // something serious has happened LOG_ERROR_STR(fileName); - return -1; + return NULL; } // found a non existing file suffix } if (Open() >= 0) { - if (!record && Offset >= 0 && lseek(file, Offset, SEEK_SET) != Offset) { + if (!record && Offset >= 0 && file->Seek(Offset, SEEK_SET) != Offset) { LOG_ERROR_STR(fileName); - return -1; + return NULL; } } return file; } esyslog("ERROR: max number of files (%d) exceeded", MAXFILESPERRECORDING); - return -1; + return NULL; } -int cFileName::NextFile(void) +cUnbufferedFile *cFileName::NextFile(void) { return SetOffset(fileNumber + 1); } @@ -1382,7 +1387,7 @@ int SecondsToFrames(int Seconds) // --- ReadFrame ------------------------------------------------------------- -int ReadFrame(int f, uchar *b, int Length, int Max) +int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max) { if (Length == -1) Length = Max; // this means we read up to EOF (see cIndex) @@ -1390,10 +1395,8 @@ int ReadFrame(int f, uchar *b, int Length, int Max) esyslog("ERROR: frame larger than buffer (%d > %d)", Length, Max); Length = Max; } - int r = safe_read(f, b, Length); + int r = f->Read(b, Length); if (r < 0) LOG_ERROR; return r; } - - diff --git a/recording.h b/recording.h index 341284f..28a1cd2 100644 --- a/recording.h +++ b/recording.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recording.h 1.45 2005/10/01 10:24:41 kls Exp $ + * $Id: recording.h 1.46 2005/10/31 12:27:12 kls Exp $ */ #ifndef __RECORDING_H @@ -203,7 +203,7 @@ public: class cFileName { private: - int file; + cUnbufferedFile *file; int fileNumber; char *fileName, *pFileNumber; bool record; @@ -213,10 +213,10 @@ public: ~cFileName(); const char *Name(void) { return fileName; } int Number(void) { return fileNumber; } - int Open(void); + cUnbufferedFile *Open(void); void Close(void); - int SetOffset(int Number, int Offset = 0); - int NextFile(void); + cUnbufferedFile *SetOffset(int Number, int Offset = 0); + cUnbufferedFile *NextFile(void); }; cString IndexToHMSF(int Index, bool WithFrame = false); @@ -226,7 +226,7 @@ int HMSFToIndex(const char *HMSF); int SecondsToFrames(int Seconds); //XXX+ ->player??? // Returns the number of frames corresponding to the given number of seconds. -int ReadFrame(int f, uchar *b, int Length, int Max); +int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max); char *ExchangeChars(char *s, bool ToFileSystem); // Exchanges the characters in the given string to or from a file system diff --git a/sources.conf b/sources.conf index 3ba2f50..b318468 100644 --- a/sources.conf +++ b/sources.conf @@ -91,13 +91,22 @@ S58W PAS 9 S61.5W Echostar 3 S79W AMC5 S82W Nimiq 2 +S85W AMC2 S87W AMC3 -S91W Nimiq 1 +S89W Intelsat 808 +S91W Galaxy 11 & Nimiq 1/3 +S93W Intelsat 806 +S95W Galaxy 3C S97W Telestar 5 -S105W AMC2 +S99W Galaxy 4R +S101W AMC4 +S103W AMC1 +S105W AMC15 S110W Echostar 6/8 S119W Echostar 7 -S121W Echostar 9 +S121W Echostar 9 & Intelsat 813 +S123W Galaxy 10R +S129W Intelsat 807 S148W Echostar 1/2 S157W Echostar 4 diff --git a/svdrp.h b/svdrp.h index baa4fb3..9275bf2 100644 --- a/svdrp.h +++ b/svdrp.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: svdrp.h 1.23 2005/08/28 14:10:32 kls Exp $ + * $Id: svdrp.h 1.24 2005/10/09 11:11:59 kls Exp $ */ #ifndef __SVDRP_H @@ -51,7 +51,7 @@ private: time_t lastActivity; void Close(bool Timeout = false); bool Send(const char *s, int length = -1); - void Reply(int Code, const char *fmt, ...); + void Reply(int Code, const char *fmt, ...) __attribute__ ((format (printf, 3, 4))); void PrintHelpTopics(const char **hp); void CmdCHAN(const char *Option); void CmdCLRE(const char *Option); diff --git a/thread.h b/thread.h index 4eb09a1..e72677f 100644 --- a/thread.h +++ b/thread.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.h 1.30 2005/08/14 11:21:48 kls Exp $ + * $Id: thread.h 1.31 2005/10/09 11:12:32 kls Exp $ */ #ifndef __THREAD_H @@ -106,7 +106,7 @@ public: ///< the thread starts and stops. The Start() function must be called ///< to actually start the thread. virtual ~cThread(); - void SetDescription(const char *Description, ...); + void SetDescription(const char *Description, ...) __attribute__ ((format (printf, 2, 3))); bool Start(void); ///< Actually starts the thread. bool Active(void); diff --git a/tools.c b/tools.c index dbd78c9..aa20e6e 100644 --- a/tools.c +++ b/tools.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.c 1.99 2005/09/25 12:56:06 kls Exp $ + * $Id: tools.c 1.100 2005/10/31 12:56:15 kls Exp $ */ #include "tools.h" @@ -836,6 +836,129 @@ bool cSafeFile::Close(void) return result; } +// --- cUnbufferedFile ------------------------------------------------------- + +#define READ_AHEAD MEGABYTE(2) +#define WRITE_BUFFER MEGABYTE(10) + +cUnbufferedFile::cUnbufferedFile(void) +{ + fd = -1; +} + +cUnbufferedFile::~cUnbufferedFile() +{ + Close(); +} + +int cUnbufferedFile::Open(const char *FileName, int Flags, mode_t Mode) +{ + Close(); + fd = open(FileName, Flags, Mode); + begin = end = ahead = -1; + written = 0; + return fd; +} + +int cUnbufferedFile::Close(void) +{ + if (fd >= 0) { + if (ahead > end) + end = ahead; + if (begin >= 0 && end > begin) { + //dsyslog("close buffer: %d (flush: %d bytes, %ld-%ld)", fd, written, begin, end); + if (written) + fdatasync(fd); + posix_fadvise(fd, begin, end - begin, POSIX_FADV_DONTNEED); + } + begin = end = ahead = -1; + written = 0; + } + int OldFd = fd; + fd = -1; + return close(OldFd); +} + +off_t cUnbufferedFile::Seek(off_t Offset, int Whence) +{ + if (fd >= 0) + return lseek(fd, Offset, Whence); + return -1; +} + +ssize_t cUnbufferedFile::Read(void *Data, size_t Size) +{ + if (fd >= 0) { + off_t pos = lseek(fd, 0, SEEK_CUR); + // jump forward - adjust end position + if (pos > end) + end = pos; + // after adjusting end - don't clear more than previously requested + if (end > ahead) + end = ahead; + // jump backward - drop read ahead of previous run + if (pos < begin) + end = ahead; + if (begin >= 0 && end > begin) + posix_fadvise(fd, begin - KILOBYTE(200), end - begin + KILOBYTE(200), POSIX_FADV_DONTNEED);//XXX macros/parameters??? + begin = pos; + ssize_t bytesRead = safe_read(fd, Data, Size); + if (bytesRead > 0) { + pos += bytesRead; + end = pos; + // this seems to trigger a non blocking read - this + // may or may not have been finished when we will be called next time. + // If it is not finished we can't release the not yet filled buffers. + // So this is commented out till we find a better solution. + //posix_fadvise(fd, pos, READ_AHEAD, POSIX_FADV_WILLNEED); + ahead = pos + READ_AHEAD; + } + else + end = pos; + return bytesRead; + } + return -1; +} + +ssize_t cUnbufferedFile::Write(const void *Data, size_t Size) +{ + if (fd >=0) { + off_t pos = lseek(fd, 0, SEEK_CUR); + ssize_t bytesWritten = safe_write(fd, Data, Size); + if (bytesWritten >= 0) { + written += bytesWritten; + if (begin >= 0) { + if (pos < begin) + begin = pos; + } + else + begin = pos; + if (pos + bytesWritten > end) + end = pos + bytesWritten; + if (written > WRITE_BUFFER) { + //dsyslog("flush buffer: %d (%d bytes, %ld-%ld)", fd, written, begin, end); + fdatasync(fd); + if (begin >= 0 && end > begin) + posix_fadvise(fd, begin, end - begin, POSIX_FADV_DONTNEED); + begin = end = -1; + written = 0; + } + } + return bytesWritten; + } + return -1; +} + +cUnbufferedFile *cUnbufferedFile::Create(const char *FileName, int Flags, mode_t Mode) +{ + cUnbufferedFile *File = new cUnbufferedFile; + if (File->Open(FileName, Flags, Mode) < 0) { + delete File; + File = NULL; + } + return File; +} + // --- cLockFile ------------------------------------------------------------- #define LOCKFILENAME ".lock-vdr" diff --git a/tools.h b/tools.h index 97f4262..f348b2e 100644 --- a/tools.h +++ b/tools.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.h 1.79 2005/10/01 12:43:31 kls Exp $ + * $Id: tools.h 1.81 2005/10/31 12:54:36 kls Exp $ */ #ifndef __TOOLS_H @@ -81,7 +81,7 @@ public: operator const char * () const { return s; } // for use in (const char *) context const char * operator*() const { return s; } // for use in (const void *) context (printf() etc.) cString &operator=(const cString &String); - static cString sprintf(const char *fmt, ...); + static cString sprintf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); }; ssize_t safe_read(int filedes, void *buffer, size_t size); @@ -198,6 +198,27 @@ public: bool Close(void); }; +/// cUnbufferedFile is used for large files that are mainly written or read +/// in a streaming manner, and thus should not be cached. + +class cUnbufferedFile { +private: + int fd; + off_t begin; + off_t end; + off_t ahead; + ssize_t written; +public: + cUnbufferedFile(void); + ~cUnbufferedFile(); + int Open(const char *FileName, int Flags, mode_t Mode = DEFFILEMODE); + int Close(void); + off_t Seek(off_t Offset, int Whence); + ssize_t Read(void *Data, size_t Size); + ssize_t Write(const void *Data, size_t Size); + static cUnbufferedFile *Create(const char *FileName, int Flags, mode_t Mode = DEFFILEMODE); + }; + class cLockFile { private: char *fileName; diff --git a/vdr.1 b/vdr.1 index af8ce12..f50db90 100644 --- a/vdr.1 +++ b/vdr.1 @@ -8,7 +8,7 @@ .\" License as specified in the file COPYING that comes with the .\" vdr distribution. .\" -.\" $Id: vdr.1 1.14 2005/07/31 10:49:35 kls Exp $ +.\" $Id: vdr.1 1.15 2005/10/09 12:31:03 kls Exp $ .\" .TH vdr 1 "19 Dec 2004" "1.3.18" "Video Disk Recorder" .SH NAME @@ -166,7 +166,7 @@ access to the SVDRP port. .I marks.vdr Contains the editing marks defined for a recording. .TP -.I summary.vdr +.I info.vdr Contains a description of the recording. .TP .I resume.vdr diff --git a/vdr.c b/vdr.c index 0fab189..9d84d84 100644 --- a/vdr.c +++ b/vdr.c @@ -22,7 +22,7 @@ * * The project's page is at http://www.cadsoft.de/vdr * - * $Id: vdr.c 1.217 2005/09/24 13:27:26 kls Exp $ + * $Id: vdr.c 1.218 2005/10/09 10:01:45 kls Exp $ */ #include @@ -370,17 +370,11 @@ int main(int argc, char *argv[]) // Daemon mode: if (DaemonMode) { - pid_t pid = fork(); - if (pid < 0) { + if (daemon(1, 0) == -1) { fprintf(stderr, "%m\n"); esyslog("ERROR: %m"); return 2; } - if (pid != 0) - return 0; // initial program immediately returns - fclose(stdin); - fclose(stdout); - fclose(stderr); } else if (Terminal) { // Claim new controlling terminal diff --git a/videodir.c b/videodir.c index cb3d29a..5206d0c 100644 --- a/videodir.c +++ b/videodir.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: videodir.c 1.12 2005/08/06 09:53:21 kls Exp $ + * $Id: videodir.c 1.13 2005/10/31 12:07:41 kls Exp $ */ #include "videodir.h" @@ -102,7 +102,7 @@ const char *cVideoDirectory::Adjust(const char *FileName) return NULL; } -int OpenVideoFile(const char *FileName, int Flags) +cUnbufferedFile *OpenVideoFile(const char *FileName, int Flags) { const char *ActualFileName = FileName; @@ -110,7 +110,7 @@ int OpenVideoFile(const char *FileName, int Flags) if (strstr(FileName, VideoDirectory) != FileName) { esyslog("ERROR: %s not in %s", FileName, VideoDirectory); errno = ENOENT; // must set 'errno' - any ideas for a better value? - return -1; + return NULL; } // Are we going to create a new file? if ((Flags & O_CREAT) != 0) { @@ -128,25 +128,26 @@ int OpenVideoFile(const char *FileName, int Flags) if (Dir.Stored()) { ActualFileName = Dir.Adjust(FileName); if (!MakeDirs(ActualFileName, false)) - return -1; // errno has been set by MakeDirs() + return NULL; // errno has been set by MakeDirs() if (symlink(ActualFileName, FileName) < 0) { LOG_ERROR_STR(FileName); - return -1; + return NULL; } ActualFileName = strdup(ActualFileName); // must survive Dir! } } } - int Result = open(ActualFileName, Flags, DEFFILEMODE); + cUnbufferedFile *File = cUnbufferedFile::Create(ActualFileName, Flags, DEFFILEMODE); if (ActualFileName != FileName) free((char *)ActualFileName); - return Result; + return File; } -int CloseVideoFile(int FileHandle) +int CloseVideoFile(cUnbufferedFile *File) { - // just in case we ever decide to do something special when closing the file! - return close(FileHandle); + int Result = File->Close(); + delete File; + return Result; } bool RenameVideoFile(const char *OldName, const char *NewName) diff --git a/videodir.h b/videodir.h index b9e38cb..6dd2d8c 100644 --- a/videodir.h +++ b/videodir.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: videodir.h 1.5 2004/12/26 11:52:56 kls Exp $ + * $Id: videodir.h 1.6 2005/10/31 11:50:23 kls Exp $ */ #ifndef __VIDEODIR_H @@ -15,8 +15,8 @@ extern const char *VideoDirectory; -int OpenVideoFile(const char *FileName, int Flags); -int CloseVideoFile(int FileHandle); +cUnbufferedFile *OpenVideoFile(const char *FileName, int Flags); +int CloseVideoFile(cUnbufferedFile *File); bool RenameVideoFile(const char *OldName, const char *NewName); bool RemoveVideoFile(const char *FileName); bool VideoFileSpaceAvailable(int SizeMB); -- cgit v1.2.3