SVDRP: do not reload in case plugin is not fully initialized (results in VDR crash)

SVDRP: respond with proper error message in case of OSD is active or parsing error
This commit is contained in:
Peter Bieringer 2021-02-03 07:10:24 +01:00
parent 5e269ecaaa
commit 68d4d6acae
4 changed files with 31 additions and 6 deletions

View File

@ -471,3 +471,5 @@ Version 1.2.10
Version 1.2.10+
- [pbiering] align displayed tuner number (0,1,2 -> 1,2,3)
- [pbiering] SVDRP: do not reload in case plugin is not fully initialized (results in VDR crash)
- [pbiering] SVDRP: respond with proper error message in case of OSD is active or parsing error

View File

@ -3,6 +3,7 @@
cSkinDesigner::cSkinDesigner(string skin, cTheme *theme) : cSkin(skin.c_str(), theme) {
init = true;
initialized = false;
this->skin = skin;
backupSkin = NULL;
@ -106,11 +107,11 @@ cSkinDisplayMessage *cSkinDesigner::DisplayMessage(void) {
return displayMessage;
}
void cSkinDesigner::Reload(void) {
int cSkinDesigner::Reload(void) {
dsyslog("skindesigner: forcing full reload of templates");
if (cOsd::IsOpen()) {
esyslog("skindesigner: OSD is open, close first!");
return;
return 2;
}
cStopWatch watch;
@ -120,11 +121,13 @@ void cSkinDesigner::Reload(void) {
if (!backupSkin)
backupSkin = new cSkinLCARS();
useBackupSkin = true;
return 1;
} else {
CacheViews();
useBackupSkin = false;
watch.Stop("templates reloaded and cache created");
}
return 0;
}
void cSkinDesigner::ListAvailableFonts(void) {
@ -218,6 +221,7 @@ void cSkinDesigner::Init(void) {
watch.Stop("templates loaded and caches created");
}
init = false;
initialized = true;
}
else if (config.OsdFontsChanged())
{

View File

@ -22,6 +22,7 @@ class cSkinDesigner;
class cSkinDesigner : public cSkin {
private:
bool init;
bool initialized;
string skin;
cSkinLCARS *backupSkin;
bool useBackupSkin;
@ -51,7 +52,8 @@ public:
virtual cSkinDisplayTracks *DisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
virtual cSkinDisplayMessage *DisplayMessage(void);
void ActivateBackupSkin(void) { useBackupSkin = true; };
void Reload(void);
int Reload(void);
bool Initialized(void) { return initialized; };
void ListAvailableFonts(void);
bool SetCustomIntToken(string option);
bool SetCustomStringToken(string option);

View File

@ -241,6 +241,7 @@ cString cPluginSkinDesigner::SVDRPCommand(const char *Command, const char *Optio
cSkinDesigner *activeSkin = NULL;
cSkinDesigner *availableSkin = NULL;
config.InitSkinRefsIterator();
int result = 0;
while (availableSkin = config.GetNextSkinRef()) {
string activeSkinName = Setup.OSDSkin;
string currentSkinName = availableSkin->Description();
@ -256,6 +257,10 @@ cString cPluginSkinDesigner::SVDRPCommand(const char *Command, const char *Optio
}
if (strcasecmp(Command, "RELD") == 0) {
if (!activeSkin->Initialized()) {
ReplyCode = 503;
return "SKINDESIGNER reload of templates and caches failed: initialization not finished.";
}
config.ClearSkinSetups();
config.InitSkinIterator();
string skin = "";
@ -264,9 +269,21 @@ cString cPluginSkinDesigner::SVDRPCommand(const char *Command, const char *Optio
}
config.TranslateSetup();
config.SetSkinSetupParameters();
activeSkin->Reload();
ReplyCode = 250;
return "SKINDESIGNER reload of templates and caches forced.";
result = activeSkin->Reload();
switch (result) {
case 0:
ReplyCode = 250;
return "SKINDESIGNER reload of templates and caches forced.";
case 1:
ReplyCode = 501;
return "SKINDESIGNER reload of templates and caches failed: error during loading - using LCARS as backup.";
case 2:
ReplyCode = 503;
return "SKINDESIGNER reload of templates and caches failed: OSD is open, close first.";
default:
ReplyCode = 500;
return "SKINDESIGNER reload of templates and caches failed: unknown reason (check code).";
};
} else if (strcasecmp(Command, "DLIC") == 0) {
if (imgCache)
delete imgCache;