aboutsummaryrefslogtreecommitdiff
path: root/src/addons/AddonCallbacksPVR.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/addons/AddonCallbacksPVR.cpp')
-rw-r--r--src/addons/AddonCallbacksPVR.cpp323
1 files changed, 323 insertions, 0 deletions
diff --git a/src/addons/AddonCallbacksPVR.cpp b/src/addons/AddonCallbacksPVR.cpp
new file mode 100644
index 0000000000..8056f8cdd6
--- /dev/null
+++ b/src/addons/AddonCallbacksPVR.cpp
@@ -0,0 +1,323 @@
+/*
+ * Copyright (C) 2012-2013 Team XBMC
+ * http://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
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Application.h"
+#include "AddonCallbacksPVR.h"
+#include "settings/AdvancedSettings.h"
+#include "utils/log.h"
+#include "dialogs/GUIDialogKaiToast.h"
+
+#include "epg/EpgContainer.h"
+#include "pvr/PVRManager.h"
+#include "pvr/channels/PVRChannelGroupsContainer.h"
+#include "pvr/channels/PVRChannelGroupInternal.h"
+#include "pvr/addons/PVRClient.h"
+#include "pvr/recordings/PVRRecordings.h"
+#include "pvr/timers/PVRTimers.h"
+#include "pvr/timers/PVRTimerInfoTag.h"
+
+using namespace PVR;
+using namespace EPG;
+
+namespace ADDON
+{
+
+CAddonCallbacksPVR::CAddonCallbacksPVR(CAddon* addon)
+{
+ m_addon = addon;
+ m_callbacks = new CB_PVRLib;
+
+ /* write XBMC PVR specific add-on function addresses to callback table */
+ m_callbacks->TransferEpgEntry = PVRTransferEpgEntry;
+ m_callbacks->TransferChannelEntry = PVRTransferChannelEntry;
+ m_callbacks->TransferTimerEntry = PVRTransferTimerEntry;
+ m_callbacks->TransferRecordingEntry = PVRTransferRecordingEntry;
+ m_callbacks->AddMenuHook = PVRAddMenuHook;
+ m_callbacks->Recording = PVRRecording;
+ m_callbacks->TriggerChannelUpdate = PVRTriggerChannelUpdate;
+ m_callbacks->TriggerChannelGroupsUpdate = PVRTriggerChannelGroupsUpdate;
+ m_callbacks->TriggerTimerUpdate = PVRTriggerTimerUpdate;
+ m_callbacks->TriggerRecordingUpdate = PVRTriggerRecordingUpdate;
+ m_callbacks->TriggerEpgUpdate = PVRTriggerEpgUpdate;
+ m_callbacks->FreeDemuxPacket = PVRFreeDemuxPacket;
+ m_callbacks->AllocateDemuxPacket = PVRAllocateDemuxPacket;
+ m_callbacks->TransferChannelGroup = PVRTransferChannelGroup;
+ m_callbacks->TransferChannelGroupMember = PVRTransferChannelGroupMember;
+}
+
+CAddonCallbacksPVR::~CAddonCallbacksPVR()
+{
+ /* delete the callback table */
+ delete m_callbacks;
+}
+
+CPVRClient *CAddonCallbacksPVR::GetPVRClient(void *addonData)
+{
+ CAddonCallbacks *addon = static_cast<CAddonCallbacks *>(addonData);
+ if (!addon || !addon->GetHelperPVR())
+ {
+ CLog::Log(LOGERROR, "PVR - %s - called with a null pointer", __FUNCTION__);
+ return NULL;
+ }
+
+ return dynamic_cast<CPVRClient *>(addon->GetHelperPVR()->m_addon);
+}
+
+void CAddonCallbacksPVR::PVRTransferChannelGroup(void *addonData, const ADDON_HANDLE handle, const PVR_CHANNEL_GROUP *group)
+{
+ if (!handle)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ CPVRChannelGroups *xbmcGroups = static_cast<CPVRChannelGroups *>(handle->dataAddress);
+ if (!group || !xbmcGroups)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ if (strlen(group->strGroupName) == 0)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - empty group name", __FUNCTION__);
+ return;
+ }
+
+ /* transfer this entry to the groups container */
+ CPVRChannelGroup transferGroup(*group);
+ xbmcGroups->UpdateFromClient(transferGroup);
+}
+
+void CAddonCallbacksPVR::PVRTransferChannelGroupMember(void *addonData, const ADDON_HANDLE handle, const PVR_CHANNEL_GROUP_MEMBER *member)
+{
+ if (!handle)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ CPVRClient *client = GetPVRClient(addonData);
+ CPVRChannelGroup *group = static_cast<CPVRChannelGroup *>(handle->dataAddress);
+ if (!member || !client || !group)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ CPVRChannelPtr channel = g_PVRChannelGroups->GetByUniqueID(member->iChannelUniqueId, client->GetID());
+ if (!channel)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - cannot find group '%s' or channel '%d'", __FUNCTION__, member->strGroupName, member->iChannelUniqueId);
+ }
+ else if (group->IsRadio() == channel->IsRadio())
+ {
+ /* transfer this entry to the group */
+ group->AddToGroup(*channel, member->iChannelNumber);
+ }
+}
+
+void CAddonCallbacksPVR::PVRTransferEpgEntry(void *addonData, const ADDON_HANDLE handle, const EPG_TAG *epgentry)
+{
+ if (!handle)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ CEpg *xbmcEpg = static_cast<CEpg *>(handle->dataAddress);
+ if (!xbmcEpg)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ /* transfer this entry to the epg */
+ xbmcEpg->UpdateEntry(epgentry, handle->dataIdentifier == 1 /* update db */);
+}
+
+void CAddonCallbacksPVR::PVRTransferChannelEntry(void *addonData, const ADDON_HANDLE handle, const PVR_CHANNEL *channel)
+{
+ if (!handle)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ CPVRClient *client = GetPVRClient(addonData);
+ CPVRChannelGroupInternal *xbmcChannels = static_cast<CPVRChannelGroupInternal *>(handle->dataAddress);
+ if (!channel || !client || !xbmcChannels)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ /* transfer this entry to the internal channels group */
+ CPVRChannel transferChannel(*channel, client->GetID());
+ xbmcChannels->UpdateFromClient(transferChannel);
+}
+
+void CAddonCallbacksPVR::PVRTransferRecordingEntry(void *addonData, const ADDON_HANDLE handle, const PVR_RECORDING *recording)
+{
+ if (!handle)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ CPVRClient *client = GetPVRClient(addonData);
+ CPVRRecordings *xbmcRecordings = static_cast<CPVRRecordings *>(handle->dataAddress);
+ if (!recording || !client || !xbmcRecordings)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ /* transfer this entry to the recordings container */
+ CPVRRecording transferRecording(*recording, client->GetID());
+ xbmcRecordings->UpdateFromClient(transferRecording);
+}
+
+void CAddonCallbacksPVR::PVRTransferTimerEntry(void *addonData, const ADDON_HANDLE handle, const PVR_TIMER *timer)
+{
+ if (!handle)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ CPVRClient *client = GetPVRClient(addonData);
+ CPVRTimers *xbmcTimers = static_cast<CPVRTimers *>(handle->dataAddress);
+ if (!timer || !client || !xbmcTimers)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ CPVRChannelPtr channel = g_PVRChannelGroups->GetByUniqueID(timer->iClientChannelUid, client->GetID());
+ if (!channel)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - cannot find channel %d on client %d", __FUNCTION__, timer->iClientChannelUid, client->GetID());
+ return;
+ }
+
+ /* transfer this entry to the timers container */
+ CPVRTimerInfoTag transferTimer(*timer, channel, client->GetID());
+ xbmcTimers->UpdateFromClient(transferTimer);
+}
+
+void CAddonCallbacksPVR::PVRAddMenuHook(void *addonData, PVR_MENUHOOK *hook)
+{
+ CPVRClient *client = GetPVRClient(addonData);
+ if (!hook || !client)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ PVR_MENUHOOKS *hooks = client->GetMenuHooks();
+ if (hooks)
+ {
+ PVR_MENUHOOK hookInt;
+ hookInt.iHookId = hook->iHookId;
+ hookInt.iLocalizedStringId = hook->iLocalizedStringId;
+ hookInt.category = hook->category;
+
+ /* add this new hook */
+ hooks->push_back(hookInt);
+ }
+}
+
+void CAddonCallbacksPVR::PVRRecording(void *addonData, const char *strName, const char *strFileName, bool bOnOff)
+{
+ CPVRClient *client = GetPVRClient(addonData);
+ if (!client || !strFileName)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ std::string strLine1;
+ if (bOnOff)
+ strLine1 = StringUtils::Format(g_localizeStrings.Get(19197).c_str(), client->Name().c_str());
+ else
+ strLine1 = StringUtils::Format(g_localizeStrings.Get(19198).c_str(), client->Name().c_str());
+
+ std::string strLine2;
+ if (strName)
+ strLine2 = strName;
+ else if (strFileName)
+ strLine2 = strFileName;
+
+ /* display a notification for 5 seconds */
+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, strLine1, strLine2, 5000, false);
+
+ CLog::Log(LOGDEBUG, "PVR - %s - recording %s on client '%s'. name='%s' filename='%s'",
+ __FUNCTION__, bOnOff ? "started" : "finished", client->Name().c_str(), strName, strFileName);
+}
+
+void CAddonCallbacksPVR::PVRTriggerChannelUpdate(void *addonData)
+{
+ /* update the channels table in the next iteration of the pvrmanager's main loop */
+ g_PVRManager.TriggerChannelsUpdate();
+}
+
+void CAddonCallbacksPVR::PVRTriggerTimerUpdate(void *addonData)
+{
+ /* update the timers table in the next iteration of the pvrmanager's main loop */
+ g_PVRManager.TriggerTimersUpdate();
+}
+
+void CAddonCallbacksPVR::PVRTriggerRecordingUpdate(void *addonData)
+{
+ /* update the recordings table in the next iteration of the pvrmanager's main loop */
+ g_PVRManager.TriggerRecordingsUpdate();
+}
+
+void CAddonCallbacksPVR::PVRTriggerChannelGroupsUpdate(void *addonData)
+{
+ /* update all channel groups in the next iteration of the pvrmanager's main loop */
+ g_PVRManager.TriggerChannelGroupsUpdate();
+}
+
+void CAddonCallbacksPVR::PVRTriggerEpgUpdate(void *addonData, unsigned int iChannelUid)
+{
+ // get the client
+ CPVRClient *client = GetPVRClient(addonData);
+ if (!client)
+ {
+ CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__);
+ return;
+ }
+
+ g_EpgContainer.UpdateRequest(client->GetID(), iChannelUid);
+}
+
+void CAddonCallbacksPVR::PVRFreeDemuxPacket(void *addonData, DemuxPacket* pPacket)
+{
+ CDVDDemuxUtils::FreeDemuxPacket(pPacket);
+}
+
+DemuxPacket* CAddonCallbacksPVR::PVRAllocateDemuxPacket(void *addonData, int iDataSize)
+{
+ return CDVDDemuxUtils::AllocateDemuxPacket(iDataSize);
+}
+
+}; /* namespace ADDON */