From b908d345c2b918906c2756f3e4d0a9ed11ddb241 Mon Sep 17 00:00:00 2001 From: Lars Op den Kamp Date: Wed, 10 Oct 2012 01:11:04 +0200 Subject: [PATCH] return ADDON_STATUS_PERMANENT_FAILURE when a call to RegisterMe() fails in ADDON_Create() --- addons/pvr.demo/src/client.cpp | 12 +++++++-- addons/pvr.fortherecord.argus/src/client.cpp | 4 +-- addons/pvr.hts/src/client.cpp | 14 +++++----- .../pvr.mediaportal.tvserver/src/client.cpp | 4 +-- addons/pvr.nextpvr/src/client.cpp | 4 +-- addons/pvr.njoy/src/client.cpp | 13 ++++++--- addons/pvr.vdr.vnsi/src/client.cpp | 21 ++++++++------- addons/pvr.vuplus/src/client.cpp | 14 +++++----- lib/platform/util/util.h | 27 +++++++++++++++++++ 9 files changed, 77 insertions(+), 36 deletions(-) create mode 100644 lib/platform/util/util.h diff --git a/addons/pvr.demo/src/client.cpp b/addons/pvr.demo/src/client.cpp index 9aa50c942..4a8801e3b 100644 --- a/addons/pvr.demo/src/client.cpp +++ b/addons/pvr.demo/src/client.cpp @@ -22,6 +22,7 @@ #include "client.h" #include "xbmc_pvr_dll.h" #include "PVRDemoData.h" +#include "platform/util/util.h" using namespace std; using namespace ADDON; @@ -62,11 +63,18 @@ ADDON_STATUS ADDON_Create(void* hdl, void* props) XBMC = new CHelper_libXBMC_addon; if (!XBMC->RegisterMe(hdl)) - return ADDON_STATUS_UNKNOWN; + { + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; + } PVR = new CHelper_libXBMC_pvr; if (!PVR->RegisterMe(hdl)) - return ADDON_STATUS_UNKNOWN; + { + SAFE_DELETE(PVR); + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; + } XBMC->Log(LOG_DEBUG, "%s - Creating the PVR demo add-on", __FUNCTION__); diff --git a/addons/pvr.fortherecord.argus/src/client.cpp b/addons/pvr.fortherecord.argus/src/client.cpp index 49a28c4b6..757700302 100644 --- a/addons/pvr.fortherecord.argus/src/client.cpp +++ b/addons/pvr.fortherecord.argus/src/client.cpp @@ -73,7 +73,7 @@ ADDON_STATUS ADDON_Create(void* hdl, void* props) if (!XBMC->RegisterMe(hdl)) { SAFE_DELETE(XBMC); - return ADDON_STATUS_UNKNOWN; + return ADDON_STATUS_PERMANENT_FAILURE; } PVR = new CHelper_libXBMC_pvr; @@ -81,7 +81,7 @@ ADDON_STATUS ADDON_Create(void* hdl, void* props) { SAFE_DELETE(PVR); SAFE_DELETE(XBMC); - return ADDON_STATUS_UNKNOWN; + return ADDON_STATUS_PERMANENT_FAILURE; } #ifdef TSREADER diff --git a/addons/pvr.hts/src/client.cpp b/addons/pvr.hts/src/client.cpp index aa9b54923..e43c0db12 100644 --- a/addons/pvr.hts/src/client.cpp +++ b/addons/pvr.hts/src/client.cpp @@ -25,6 +25,7 @@ #include "HTSPDemux.h" #include "platform/threads/mutex.h" #include "platform/util/atomic.h" +#include "platform/util/util.h" using namespace std; using namespace ADDON; @@ -128,19 +129,16 @@ ADDON_STATUS ADDON_Create(void* hdl, void* props) XBMC = new CHelper_libXBMC_addon; if (!XBMC->RegisterMe(hdl)) { - delete XBMC; - XBMC = NULL; - return ADDON_STATUS_UNKNOWN; + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; } PVR = new CHelper_libXBMC_pvr; if (!PVR->RegisterMe(hdl)) { - delete PVR; - delete XBMC; - PVR = NULL; - XBMC = NULL; - return ADDON_STATUS_UNKNOWN; + SAFE_DELETE(PVR); + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; } XBMC->Log(LOG_DEBUG, "%s - Creating Tvheadend PVR-Client", __FUNCTION__); diff --git a/addons/pvr.mediaportal.tvserver/src/client.cpp b/addons/pvr.mediaportal.tvserver/src/client.cpp index b20eae585..b1d173025 100644 --- a/addons/pvr.mediaportal.tvserver/src/client.cpp +++ b/addons/pvr.mediaportal.tvserver/src/client.cpp @@ -78,7 +78,7 @@ ADDON_STATUS ADDON_Create(void* hdl, void* props) if (!XBMC->RegisterMe(hdl)) { SAFE_DELETE(XBMC); - return ADDON_STATUS_UNKNOWN; + return ADDON_STATUS_PERMANENT_FAILURE; } PVR = new CHelper_libXBMC_pvr; @@ -86,7 +86,7 @@ ADDON_STATUS ADDON_Create(void* hdl, void* props) { SAFE_DELETE(PVR); SAFE_DELETE(XBMC); - return ADDON_STATUS_UNKNOWN; + return ADDON_STATUS_PERMANENT_FAILURE; } XBMC->Log(LOG_INFO, "Creating MediaPortal PVR-Client"); diff --git a/addons/pvr.nextpvr/src/client.cpp b/addons/pvr.nextpvr/src/client.cpp index 4050a85b9..81de749a8 100644 --- a/addons/pvr.nextpvr/src/client.cpp +++ b/addons/pvr.nextpvr/src/client.cpp @@ -66,7 +66,7 @@ ADDON_STATUS ADDON_Create(void* hdl, void* props) if (!XBMC->RegisterMe(hdl)) { SAFE_DELETE(XBMC); - return ADDON_STATUS_UNKNOWN; + return ADDON_STATUS_PERMANENT_FAILURE; } PVR = new CHelper_libXBMC_pvr; @@ -74,7 +74,7 @@ ADDON_STATUS ADDON_Create(void* hdl, void* props) { SAFE_DELETE(PVR); SAFE_DELETE(XBMC); - return ADDON_STATUS_UNKNOWN; + return ADDON_STATUS_PERMANENT_FAILURE; } XBMC->Log(LOG_INFO, "Creating NextPVR PVR-Client"); diff --git a/addons/pvr.njoy/src/client.cpp b/addons/pvr.njoy/src/client.cpp index ede21bc3f..8d7092c3d 100644 --- a/addons/pvr.njoy/src/client.cpp +++ b/addons/pvr.njoy/src/client.cpp @@ -22,7 +22,7 @@ #include "client.h" #include "xbmc_pvr_dll.h" #include "N7Xml.h" - +#include "platform/util/util.h" using namespace std; using namespace ADDON; @@ -73,11 +73,18 @@ ADDON_STATUS ADDON_Create(void* hdl, void* props) XBMC = new CHelper_libXBMC_addon; if (!XBMC->RegisterMe(hdl)) - return ADDON_STATUS_UNKNOWN; + { + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; + } PVR = new CHelper_libXBMC_pvr; if (!PVR->RegisterMe(hdl)) - return ADDON_STATUS_UNKNOWN; + { + SAFE_DELETE(PVR); + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; + } XBMC->Log(LOG_DEBUG, "Creating N7 PVR-Client"); m_CurStatus = ADDON_STATUS_UNKNOWN; diff --git a/addons/pvr.vdr.vnsi/src/client.cpp b/addons/pvr.vdr.vnsi/src/client.cpp index be10bff91..ee6bd4fb8 100644 --- a/addons/pvr.vdr.vnsi/src/client.cpp +++ b/addons/pvr.vdr.vnsi/src/client.cpp @@ -25,6 +25,7 @@ #include "VNSIRecording.h" #include "VNSIData.h" #include "VNSIChannelScan.h" +#include "platform/util/util.h" #include #include @@ -70,23 +71,25 @@ ADDON_STATUS ADDON_Create(void* hdl, void* props) XBMC = new CHelper_libXBMC_addon; if (!XBMC->RegisterMe(hdl)) { - delete XBMC; - XBMC = NULL; - return ADDON_STATUS_UNKNOWN; + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; } GUI = new CHelper_libXBMC_gui; if (!GUI->RegisterMe(hdl)) - return ADDON_STATUS_UNKNOWN; + { + SAFE_DELETE(GUI); + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; + } PVR = new CHelper_libXBMC_pvr; if (!PVR->RegisterMe(hdl)) { - delete PVR; - delete XBMC; - PVR = NULL; - XBMC = NULL; - return ADDON_STATUS_UNKNOWN; + SAFE_DELETE(PVR); + SAFE_DELETE(GUI); + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; } XBMC->Log(LOG_DEBUG, "Creating VDR VNSI PVR-Client"); diff --git a/addons/pvr.vuplus/src/client.cpp b/addons/pvr.vuplus/src/client.cpp index bb5c29260..6a88c0d73 100644 --- a/addons/pvr.vuplus/src/client.cpp +++ b/addons/pvr.vuplus/src/client.cpp @@ -23,6 +23,7 @@ #include "xbmc_pvr_dll.h" #include #include "VuData.h" +#include "platform/util/util.h" using namespace std; using namespace ADDON; @@ -166,19 +167,16 @@ ADDON_STATUS ADDON_Create(void* hdl, void* props) XBMC = new CHelper_libXBMC_addon; if (!XBMC->RegisterMe(hdl)) { - delete XBMC; - XBMC = NULL; - return ADDON_STATUS_UNKNOWN; + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; } PVR = new CHelper_libXBMC_pvr; if (!PVR->RegisterMe(hdl)) { - delete PVR; - delete XBMC; - PVR = NULL; - XBMC = NULL; - return ADDON_STATUS_UNKNOWN; + SAFE_DELETE(PVR); + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; } XBMC->Log(LOG_DEBUG, "%s - Creating VU+ PVR-Client", __FUNCTION__); diff --git a/lib/platform/util/util.h b/lib/platform/util/util.h new file mode 100644 index 000000000..6c4a5b202 --- /dev/null +++ b/lib/platform/util/util.h @@ -0,0 +1,27 @@ +#pragma once +/* + * Copyright (C) 2012 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#ifndef SAFE_DELETE +#define SAFE_DELETE(p) do { delete (p); (p)=NULL; } while (0) +#endif +#ifndef SAFE_DELETE_ARRAY +#define SAFE_DELETE_ARRAY(p) do { delete[] (p); (p)=NULL; } while (0) +#endif