mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	VDR developer version 1.7.38 is now available at
       ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.38.tar.bz2
A 'diff' against the previous version is available at
       ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.37-1.7.38.diff
MD5 checksums:
f4ef0f60ed662f3c983a830da67df9b2  vdr-1.7.38.tar.bz2
e945b0f44e13ed768de726cf6e66317c  vdr-1.7.37-1.7.38.diff
WARNING:
========
This is a developer version. Even though I use it in my productive
environment. I strongly recommend that you only use it under controlled
conditions and for testing and debugging.
Approaching version 2.0.0:
==========================
If all goes well, there should be no more functional or API changes
before the final version 2.0.0. There will just be a few more fixes.
From the HISTORY file:
- Updated the Ukrainian OSD texts (thanks to Yarema Aka Knedlyk).
- Updated the Estonian OSD texts (thanks to Arthur Konovalov).
- Updated the Romanian OSD texts (thanks to Lucian Muresan).
- Updated the French OSD texts (thanks to Marc Perrudin, Bernard Jaulini and Peter
  Münster).
- Updated the Macedonian OSD texts (thanks to Dimitar Petrovski).
- Fixed moving editing marks, so that they don't get overwritten with old values
  through an update of the marks file.
- Removed an invalid line from channels.conf.terr (reported by Lars Hanisch).
- Fixed an unexpected k_Repeat key event after a k_Release in lirc.c.
- Fixed permissions of po/sr_SR.po (reported by Dominic Evans).
- Updated the Italian OSD texts (thanks to Diego Pierotto).
- Fixed using "Pause" and "Slow motion" near the end of a recording (replay stopped
  a few seconds after the end of the recording file has been reached).
- Fixed selecting the last replayed recording in the Recordings menu in case there
  are folders and plain recordings with names that differ only in non-alphanumeric
  characters (reported by Andre Weidemann).
- Fixed the description of the OSD drawing functions DrawEllipse() (the values -5...-8
  for the Quadrants parameter are not implemented).
- Made cOsd::DestroyPixmap() "NULL proof".
- Now deleting any previously allocated pixmaps in cOsd::SetAreas().
- Added demos of the DrawEllipse() and DrawSlope() function to the 'osddemo'
  plugin (press '1' or '2', respectively).
- Updated the Lithuanian OSD texts (thanks to Valdemaras Pipiras).
- The timeout for trying to switch to a valid programme is now reset immediately once
  a programme has been found.
- No longer checking for EOPNOTSUPP in cDvbTuner::GetSignalQuality() to avoid breaking
  this function in case the driver suddenly decides to return a different errno value
  if an operation is not supported.
- Moved the definition of TIMERMACRO_TITLE and TIMERMACRO_EPISODE from recording.h to
  config.h and using them to initialize Setup.NameInstantRecord (avoids having the same
  information in two places).
- Fixed the return value of cOsdProvider::StoreImage() in case there is no OSD provider.
- Fixed a crash in cMenuEditChanItem::Set() when entering a channel number that
  doesn't exist (reported by Mikael Hübsch).
- Fixed displaying pending timers in "alert" mode in the LCARS skin.
- Added missing $(LDFLAGS) to the Makefile of the dvbhddevice plugin (thanks to Ville
  Skyttä).
- Fixed some spellings in PLUGINS.html and Doxyfile (thanks to Ville Skyttä).
- Added '-p' to the cp command in the install-conf target of the Makefile (thanks to
  Ville Skyttä).
- Added missing 'const' to cDevice::HasProgramme() and cDevice::HasLock().
- Fixed determining the priority of the primary device in case it is neither replaying
  nor receiving a live channel (thanks to Matthias Senzel for reporting a problem with
  switching back to live viewing after replay in a setup with device bonding).
- Removed all \return and \param tags from comment lines marked with "///<" for Doxygen.
  There was only a rather small number of these, and I would probably always forget to
  put them in place when writing future comments, so I decided to drop them entirely.
- Added Doxyfile.filter to have special characters escaped that would otherwise be
  dropped by Doxygen (reported by Ville Skyttä).
- Using 'cat' instead of 'cp' to copy the Doxyfile to avoid problems in case Doxyfile
  is write protected.
- Updated the Doxyfile with a newer version of Doxygen.
- Turned off following symlinks in the Doxyfile.
- Removed trailing whitespace.
- Expanded tabs in PLUGINS/src/dvbhddevice/setup.c.
- Some formatting fixes.
		
	
		
			
				
	
	
		
			349 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			349 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * config.h: Configuration file handling
 | 
						|
 *
 | 
						|
 * See the main source file 'vdr.c' for copyright information and
 | 
						|
 * how to reach the author.
 | 
						|
 *
 | 
						|
 * $Id: config.h 2.67 2013/02/14 15:13:59 kls Exp $
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef __CONFIG_H
 | 
						|
#define __CONFIG_H
 | 
						|
 | 
						|
#include <arpa/inet.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <time.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include "i18n.h"
 | 
						|
#include "font.h"
 | 
						|
#include "tools.h"
 | 
						|
 | 
						|
// VDR's own version number:
 | 
						|
 | 
						|
#define VDRVERSION  "1.7.38"
 | 
						|
#define VDRVERSNUM   10738  // Version * 10000 + Major * 100 + Minor
 | 
						|
 | 
						|
// The plugin API's version number:
 | 
						|
 | 
						|
#define APIVERSION  "1.7.38"
 | 
						|
#define APIVERSNUM   10738  // Version * 10000 + Major * 100 + Minor
 | 
						|
 | 
						|
// When loading plugins, VDR searches them by their APIVERSION, which
 | 
						|
// may be smaller than VDRVERSION in case there have been no changes to
 | 
						|
// VDR header files since the last APIVERSION. This allows compiled
 | 
						|
// plugins to work with newer versions of the core VDR as long as no
 | 
						|
// VDR header files have changed.
 | 
						|
 | 
						|
#define MAXPRIORITY       99
 | 
						|
#define MINPRIORITY       (-MAXPRIORITY)
 | 
						|
#define LIVEPRIORITY      0                  // priority used when selecting a device for live viewing
 | 
						|
#define TRANSFERPRIORITY  (LIVEPRIORITY - 1) // priority used for actual local Transfer Mode
 | 
						|
#define IDLEPRIORITY      (MINPRIORITY - 1)  // priority of an idle device
 | 
						|
#define MAXLIFETIME       99
 | 
						|
#define DEFINSTRECTIME    180 // default instant recording time (minutes)
 | 
						|
 | 
						|
#define TIMERMACRO_TITLE    "TITLE"
 | 
						|
#define TIMERMACRO_EPISODE  "EPISODE"
 | 
						|
 | 
						|
#define MINOSDWIDTH   480
 | 
						|
#define MAXOSDWIDTH  1920
 | 
						|
#define MINOSDHEIGHT  324
 | 
						|
#define MAXOSDHEIGHT 1200
 | 
						|
 | 
						|
#define MaxFileName NAME_MAX // obsolete - use NAME_MAX directly instead!
 | 
						|
#define MaxSkinName 16
 | 
						|
#define MaxThemeName 16
 | 
						|
 | 
						|
// Basically VDR works according to the DVB standard, but there are countries/providers
 | 
						|
// that use other standards, which in some details deviate from the DVB standard.
 | 
						|
// This makes it necessary to handle things differently in some areas, depending on
 | 
						|
// which standard is actually used. The following macros are used to distinguish
 | 
						|
// these cases (make sure to adjust cMenuSetupDVB::standardComplianceTexts accordingly
 | 
						|
// when adding a new standard):
 | 
						|
 | 
						|
#define STANDARD_DVB       0
 | 
						|
#define STANDARD_ANSISCTE  1
 | 
						|
 | 
						|
typedef uint32_t in_addr_t; //XXX from /usr/include/netinet/in.h (apparently this is not defined on systems with glibc < 2.2)
 | 
						|
 | 
						|
class cSVDRPhost : public cListObject {
 | 
						|
private:
 | 
						|
  struct in_addr addr;
 | 
						|
  in_addr_t mask;
 | 
						|
public:
 | 
						|
  cSVDRPhost(void);
 | 
						|
  bool Parse(const char *s);
 | 
						|
  bool IsLocalhost(void);
 | 
						|
  bool Accepts(in_addr_t Address);
 | 
						|
  };
 | 
						|
 | 
						|
class cSatCableNumbers {
 | 
						|
private:
 | 
						|
  int size;
 | 
						|
  int *array;
 | 
						|
public:
 | 
						|
  cSatCableNumbers(int Size, const char *s = NULL);
 | 
						|
  ~cSatCableNumbers();
 | 
						|
  int Size(void) const { return size; }
 | 
						|
  int *Array(void) { return array; }
 | 
						|
  bool FromString(const char *s);
 | 
						|
  cString ToString(void);
 | 
						|
  int FirstDeviceIndex(int DeviceIndex) const;
 | 
						|
      ///< Returns the first device index (starting at 0) that uses the same
 | 
						|
      ///< sat cable number as the device with the given DeviceIndex.
 | 
						|
      ///< If the given device does not use the same sat cable as any other device,
 | 
						|
      ///< or if the resulting value would be the same as DeviceIndex,
 | 
						|
      ///< or if DeviceIndex is out of range, -1 is returned.
 | 
						|
  };
 | 
						|
 | 
						|
template<class T> class cConfig : public cList<T> {
 | 
						|
private:
 | 
						|
  char *fileName;
 | 
						|
  bool allowComments;
 | 
						|
  void Clear(void)
 | 
						|
  {
 | 
						|
    free(fileName);
 | 
						|
    fileName = NULL;
 | 
						|
    cList<T>::Clear();
 | 
						|
  }
 | 
						|
public:
 | 
						|
  cConfig(void) { fileName = NULL; }
 | 
						|
  virtual ~cConfig() { free(fileName); }
 | 
						|
  const char *FileName(void) { return fileName; }
 | 
						|
  bool Load(const char *FileName = NULL, bool AllowComments = false, bool MustExist = false)
 | 
						|
  {
 | 
						|
    cConfig<T>::Clear();
 | 
						|
    if (FileName) {
 | 
						|
       free(fileName);
 | 
						|
       fileName = strdup(FileName);
 | 
						|
       allowComments = AllowComments;
 | 
						|
       }
 | 
						|
    bool result = !MustExist;
 | 
						|
    if (fileName && access(fileName, F_OK) == 0) {
 | 
						|
       isyslog("loading %s", fileName);
 | 
						|
       FILE *f = fopen(fileName, "r");
 | 
						|
       if (f) {
 | 
						|
          char *s;
 | 
						|
          int line = 0;
 | 
						|
          cReadLine ReadLine;
 | 
						|
          result = true;
 | 
						|
          while ((s = ReadLine.Read(f)) != NULL) {
 | 
						|
                line++;
 | 
						|
                if (allowComments) {
 | 
						|
                   char *p = strchr(s, '#');
 | 
						|
                   if (p)
 | 
						|
                      *p = 0;
 | 
						|
                   }
 | 
						|
                stripspace(s);
 | 
						|
                if (!isempty(s)) {
 | 
						|
                   T *l = new T;
 | 
						|
                   if (l->Parse(s))
 | 
						|
                      this->Add(l);
 | 
						|
                   else {
 | 
						|
                      esyslog("ERROR: error in %s, line %d", fileName, line);
 | 
						|
                      delete l;
 | 
						|
                      result = false;
 | 
						|
                      }
 | 
						|
                   }
 | 
						|
                }
 | 
						|
          fclose(f);
 | 
						|
          }
 | 
						|
       else {
 | 
						|
          LOG_ERROR_STR(fileName);
 | 
						|
          result = false;
 | 
						|
          }
 | 
						|
       }
 | 
						|
    if (!result)
 | 
						|
       fprintf(stderr, "vdr: error while reading '%s'\n", fileName);
 | 
						|
    return result;
 | 
						|
  }
 | 
						|
  bool Save(void)
 | 
						|
  {
 | 
						|
    bool result = true;
 | 
						|
    T *l = (T *)this->First();
 | 
						|
    cSafeFile f(fileName);
 | 
						|
    if (f.Open()) {
 | 
						|
       while (l) {
 | 
						|
             if (!l->Save(f)) {
 | 
						|
                result = false;
 | 
						|
                break;
 | 
						|
                }
 | 
						|
             l = (T *)l->Next();
 | 
						|
             }
 | 
						|
       if (!f.Close())
 | 
						|
          result = false;
 | 
						|
       }
 | 
						|
    else
 | 
						|
       result = false;
 | 
						|
    return result;
 | 
						|
  }
 | 
						|
  };
 | 
						|
 | 
						|
class cNestedItem : public cListObject {
 | 
						|
private:
 | 
						|
  char *text;
 | 
						|
  cList<cNestedItem> *subItems;
 | 
						|
public:
 | 
						|
  cNestedItem(const char *Text, bool WithSubItems = false);
 | 
						|
  virtual ~cNestedItem();
 | 
						|
  virtual int Compare(const cListObject &ListObject) const;
 | 
						|
  const char *Text(void) const { return text; }
 | 
						|
  cList<cNestedItem> *SubItems(void) { return subItems; }
 | 
						|
  void AddSubItem(cNestedItem *Item);
 | 
						|
  void SetText(const char *Text);
 | 
						|
  void SetSubItems(bool On);
 | 
						|
  };
 | 
						|
 | 
						|
class cNestedItemList : public cList<cNestedItem> {
 | 
						|
private:
 | 
						|
  char *fileName;
 | 
						|
  bool Parse(FILE *f, cList<cNestedItem> *List, int &Line);
 | 
						|
  bool Write(FILE *f, cList<cNestedItem> *List, int Indent = 0);
 | 
						|
public:
 | 
						|
  cNestedItemList(void);
 | 
						|
  virtual ~cNestedItemList();
 | 
						|
  void Clear(void);
 | 
						|
  bool Load(const char *FileName);
 | 
						|
  bool Save(void);
 | 
						|
  };
 | 
						|
 | 
						|
class cSVDRPhosts : public cConfig<cSVDRPhost> {
 | 
						|
public:
 | 
						|
  bool LocalhostOnly(void);
 | 
						|
  bool Acceptable(in_addr_t Address);
 | 
						|
  };
 | 
						|
 | 
						|
extern cNestedItemList Folders;
 | 
						|
extern cNestedItemList Commands;
 | 
						|
extern cNestedItemList RecordingCommands;
 | 
						|
extern cSVDRPhosts SVDRPhosts;
 | 
						|
 | 
						|
class cSetupLine : public cListObject {
 | 
						|
private:
 | 
						|
  char *plugin;
 | 
						|
  char *name;
 | 
						|
  char *value;
 | 
						|
public:
 | 
						|
  cSetupLine(void);
 | 
						|
  cSetupLine(const char *Name, const char *Value, const char *Plugin = NULL);
 | 
						|
  virtual ~cSetupLine();
 | 
						|
  virtual int Compare(const cListObject &ListObject) const;
 | 
						|
  const char *Plugin(void) { return plugin; }
 | 
						|
  const char *Name(void) { return name; }
 | 
						|
  const char *Value(void) { return value; }
 | 
						|
  bool Parse(char *s);
 | 
						|
  bool Save(FILE *f);
 | 
						|
  };
 | 
						|
 | 
						|
class cSetup : public cConfig<cSetupLine> {
 | 
						|
  friend class cPlugin; // needs to be able to call Store()
 | 
						|
private:
 | 
						|
  void StoreLanguages(const char *Name, int *Values);
 | 
						|
  bool ParseLanguages(const char *Value, int *Values);
 | 
						|
  bool Parse(const char *Name, const char *Value);
 | 
						|
  cSetupLine *Get(const char *Name, const char *Plugin = NULL);
 | 
						|
  void Store(const char *Name, const char *Value, const char *Plugin = NULL, bool AllowMultiple = false);
 | 
						|
  void Store(const char *Name, int Value, const char *Plugin = NULL);
 | 
						|
  void Store(const char *Name, double &Value, const char *Plugin = NULL);
 | 
						|
public:
 | 
						|
  // Also adjust cMenuSetup (menu.c) when adding parameters here!
 | 
						|
  int __BeginData__;
 | 
						|
  char OSDLanguage[I18N_MAX_LOCALE_LEN];
 | 
						|
  char OSDSkin[MaxSkinName];
 | 
						|
  char OSDTheme[MaxThemeName];
 | 
						|
  int PrimaryDVB;
 | 
						|
  int ShowInfoOnChSwitch;
 | 
						|
  int TimeoutRequChInfo;
 | 
						|
  int MenuScrollPage;
 | 
						|
  int MenuScrollWrap;
 | 
						|
  int MenuKeyCloses;
 | 
						|
  int MarkInstantRecord;
 | 
						|
  char NameInstantRecord[NAME_MAX];
 | 
						|
  int InstantRecordTime;
 | 
						|
  int LnbSLOF;
 | 
						|
  int LnbFrequLo;
 | 
						|
  int LnbFrequHi;
 | 
						|
  int DiSEqC;
 | 
						|
  int SetSystemTime;
 | 
						|
  int TimeSource;
 | 
						|
  int TimeTransponder;
 | 
						|
  int StandardCompliance;
 | 
						|
  int MarginStart, MarginStop;
 | 
						|
  int AudioLanguages[I18N_MAX_LANGUAGES + 1];
 | 
						|
  int DisplaySubtitles;
 | 
						|
  int SubtitleLanguages[I18N_MAX_LANGUAGES + 1];
 | 
						|
  int SubtitleOffset;
 | 
						|
  int SubtitleFgTransparency, SubtitleBgTransparency;
 | 
						|
  int EPGLanguages[I18N_MAX_LANGUAGES + 1];
 | 
						|
  int EPGScanTimeout;
 | 
						|
  int EPGBugfixLevel;
 | 
						|
  int EPGLinger;
 | 
						|
  int SVDRPTimeout;
 | 
						|
  int ZapTimeout;
 | 
						|
  int ChannelEntryTimeout;
 | 
						|
  int RcRepeatDelay;
 | 
						|
  int RcRepeatDelta;
 | 
						|
  int DefaultPriority, DefaultLifetime;
 | 
						|
  int PausePriority, PauseLifetime;
 | 
						|
  int PauseKeyHandling;
 | 
						|
  int UseSubtitle;
 | 
						|
  int UseVps;
 | 
						|
  int VpsMargin;
 | 
						|
  int RecordingDirs;
 | 
						|
  int FoldersInTimerMenu;
 | 
						|
  int NumberKeysForChars;
 | 
						|
  int ColorKey0, ColorKey1, ColorKey2, ColorKey3;
 | 
						|
  int VideoDisplayFormat;
 | 
						|
  int VideoFormat;
 | 
						|
  int UpdateChannels;
 | 
						|
  int UseDolbyDigital;
 | 
						|
  int ChannelInfoPos;
 | 
						|
  int ChannelInfoTime;
 | 
						|
  double OSDLeftP, OSDTopP, OSDWidthP, OSDHeightP;
 | 
						|
  int OSDLeft, OSDTop, OSDWidth, OSDHeight;
 | 
						|
  double OSDAspect;
 | 
						|
  int OSDMessageTime;
 | 
						|
  int UseSmallFont;
 | 
						|
  int AntiAlias;
 | 
						|
  char FontOsd[MAXFONTNAME];
 | 
						|
  char FontSml[MAXFONTNAME];
 | 
						|
  char FontFix[MAXFONTNAME];
 | 
						|
  double FontOsdSizeP;
 | 
						|
  double FontSmlSizeP;
 | 
						|
  double FontFixSizeP;
 | 
						|
  int FontOsdSize;
 | 
						|
  int FontSmlSize;
 | 
						|
  int FontFixSize;
 | 
						|
  int MaxVideoFileSize;
 | 
						|
  int SplitEditedFiles;
 | 
						|
  int DelTimeshiftRec;
 | 
						|
  int MinEventTimeout, MinUserInactivity;
 | 
						|
  time_t NextWakeupTime;
 | 
						|
  int MultiSpeedMode;
 | 
						|
  int ShowReplayMode;
 | 
						|
  int ShowRemainingTime;
 | 
						|
  int ProgressDisplayTime;
 | 
						|
  int PauseOnMarkSet;
 | 
						|
  int ResumeID;
 | 
						|
  int CurrentChannel;
 | 
						|
  int CurrentVolume;
 | 
						|
  int CurrentDolby;
 | 
						|
  int InitialVolume;
 | 
						|
  int ChannelsWrap;
 | 
						|
  int ShowChannelNamesWithSource;
 | 
						|
  int EmergencyExit;
 | 
						|
  int __EndData__;
 | 
						|
  cString InitialChannel;
 | 
						|
  cString DeviceBondings;
 | 
						|
  cSetup(void);
 | 
						|
  cSetup& operator= (const cSetup &s);
 | 
						|
  bool Load(const char *FileName);
 | 
						|
  bool Save(void);
 | 
						|
  };
 | 
						|
 | 
						|
extern cSetup Setup;
 | 
						|
 | 
						|
#endif //__CONFIG_H
 |