2 * Copyright (C) 2012-2013 Team XBMC
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
21 #include "PVROperations.h"
22 #include "ApplicationMessenger.h"
23 #include "utils/log.h"
25 #include "pvr/PVRManager.h"
26 #include "pvr/channels/PVRChannelGroupsContainer.h"
27 #include "pvr/channels/PVRChannel.h"
28 #include "pvr/timers/PVRTimers.h"
29 #include "pvr/timers/PVRTimerInfoTag.h"
30 #include "pvr/recordings/PVRRecordings.h"
31 #include "pvr/timers/PVRTimers.h"
33 #include "epg/EpgContainer.h"
36 using namespace JSONRPC;
40 JSONRPC_STATUS CPVROperations::GetProperties(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
42 if (!g_PVRManager.IsStarted())
43 return FailedToExecute;
45 CVariant properties = CVariant(CVariant::VariantTypeObject);
46 for (unsigned int index = 0; index < parameterObject["properties"].size(); index++)
48 CStdString propertyName = parameterObject["properties"][index].asString();
51 if ((ret = GetPropertyValue(propertyName, property)) != OK)
54 properties[propertyName] = property;
62 JSONRPC_STATUS CPVROperations::GetChannelGroups(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
64 if (!g_PVRManager.IsStarted())
65 return FailedToExecute;
67 CPVRChannelGroupsContainer *channelGroupContainer = g_PVRChannelGroups;
68 if (channelGroupContainer == NULL)
69 return FailedToExecute;
71 CPVRChannelGroups *channelGroups = channelGroupContainer->Get(parameterObject["channeltype"].asString().compare("radio") == 0);
72 if (channelGroups == NULL)
73 return FailedToExecute;
77 vector<CPVRChannelGroupPtr> groupList = channelGroups->GetMembers();
78 HandleLimits(parameterObject, result, groupList.size(), start, end);
79 for (int index = start; index < end; index++)
80 FillChannelGroupDetails(groupList.at(index), parameterObject, result["channelgroups"], true);
85 JSONRPC_STATUS CPVROperations::GetChannelGroupDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
87 if (!g_PVRManager.IsStarted())
88 return FailedToExecute;
90 CPVRChannelGroupsContainer *channelGroupContainer = g_PVRChannelGroups;
91 if (channelGroupContainer == NULL)
92 return FailedToExecute;
94 CPVRChannelGroupPtr channelGroup;
95 CVariant id = parameterObject["channelgroupid"];
97 channelGroup = channelGroupContainer->GetByIdFromAll((int)id.asInteger());
98 else if (id.isString())
99 channelGroup = channelGroupContainer->GetGroupAll(id.asString() == "allradio");
101 if (channelGroup == NULL)
102 return InvalidParams;
104 FillChannelGroupDetails(channelGroup, parameterObject, result["channelgroupdetails"], false);
109 JSONRPC_STATUS CPVROperations::GetChannels(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
111 if (!g_PVRManager.IsStarted())
112 return FailedToExecute;
114 CPVRChannelGroupsContainer *channelGroupContainer = g_PVRChannelGroups;
115 if (channelGroupContainer == NULL)
116 return FailedToExecute;
118 CPVRChannelGroupPtr channelGroup;
119 CVariant id = parameterObject["channelgroupid"];
121 channelGroup = channelGroupContainer->GetByIdFromAll((int)id.asInteger());
122 else if (id.isString())
123 channelGroup = channelGroupContainer->GetGroupAll(id.asString() == "allradio");
125 if (channelGroup == NULL)
126 return InvalidParams;
128 CFileItemList channels;
129 if (channelGroup->GetMembers(channels) < 0)
130 return InvalidParams;
132 HandleFileItemList("channelid", false, "channels", channels, parameterObject, result, true);
137 JSONRPC_STATUS CPVROperations::GetChannelDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
139 if (!g_PVRManager.IsStarted())
140 return FailedToExecute;
142 CPVRChannelGroupsContainer *channelGroupContainer = g_PVRChannelGroups;
143 if (channelGroupContainer == NULL)
144 return FailedToExecute;
146 CPVRChannelPtr channel = channelGroupContainer->GetChannelById((int)parameterObject["channelid"].asInteger());
148 return InvalidParams;
150 HandleFileItem("channelid", false, "channeldetails", CFileItemPtr(new CFileItem(*channel)), parameterObject, parameterObject["properties"], result, false);
155 JSONRPC_STATUS CPVROperations::GetBroadcasts(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
157 if (!g_PVRManager.IsStarted())
158 return FailedToExecute;
160 CPVRChannelGroupsContainer *channelGroupContainer = g_PVRManager.ChannelGroups();
161 if (channelGroupContainer == NULL)
162 return FailedToExecute;
164 CPVRChannelPtr channel = channelGroupContainer->GetChannelById((int)parameterObject["channelid"].asInteger());
166 return InvalidParams;
168 CEpg *channelEpg = channel->GetEPG();
169 if (channelEpg == NULL)
170 return InternalError;
172 CFileItemList programFull;
173 channelEpg->Get(programFull);
175 HandleFileItemList("broadcastid", false, "broadcasts", programFull, parameterObject, result, programFull.Size(), true);
180 JSONRPC_STATUS CPVROperations::GetBroadcastDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
182 if (!g_PVRManager.IsStarted())
183 return FailedToExecute;
185 EpgSearchFilter filter;
187 filter.m_iUniqueBroadcastId = (int)parameterObject["broadcastid"].asInteger();
189 CFileItemList broadcasts;
190 int resultSize = g_EpgContainer.GetEPGSearch(broadcasts, filter);
193 return InvalidParams;
194 else if (resultSize > 1)
195 return InternalError;
197 CFileItemPtr broadcast = broadcasts.Get(0);
198 HandleFileItem("broadcastid", false, "broadcastdetails", broadcast, parameterObject, parameterObject["properties"], result, false);
204 JSONRPC_STATUS CPVROperations::Record(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
206 if (!g_PVRManager.IsStarted())
207 return FailedToExecute;
209 CPVRChannelPtr pChannel;
210 CVariant channel = parameterObject["channel"];
211 if (channel.isString() && channel.asString() == "current")
213 if (!g_PVRManager.GetCurrentChannel(pChannel))
214 return InternalError;
216 else if (channel.isInteger())
218 CPVRChannelGroupsContainer *channelGroupContainer = g_PVRManager.ChannelGroups();
219 if (channelGroupContainer == NULL)
220 return FailedToExecute;
222 pChannel = channelGroupContainer->GetChannelById((int)channel.asInteger());
225 return InvalidParams;
227 if (pChannel == NULL)
228 return InvalidParams;
229 else if (!pChannel->CanRecord())
230 return FailedToExecute;
232 CVariant record = parameterObject["record"];
234 if (record.isBoolean() && record.asBoolean() == pChannel->IsRecording())
239 if (!g_PVRManager.ToggleRecordingOnChannel(pChannel->ChannelID()))
240 return FailedToExecute;
246 JSONRPC_STATUS CPVROperations::Scan(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
248 if (!g_PVRManager.IsStarted())
249 return FailedToExecute;
251 if (!g_PVRManager.IsRunningChannelScan())
252 g_PVRManager.StartChannelScan();
257 JSONRPC_STATUS CPVROperations::GetPropertyValue(const CStdString &property, CVariant &result)
259 bool started = g_PVRManager.IsStarted();
261 if (property.Equals("available"))
263 else if (property.Equals("recording"))
266 result = g_PVRManager.IsRecording();
270 else if (property.Equals("scanning"))
273 result = g_PVRManager.IsRunningChannelScan();
278 return InvalidParams;
283 void CPVROperations::FillChannelGroupDetails(const CPVRChannelGroupPtr &channelGroup, const CVariant ¶meterObject, CVariant &result, bool append /* = false */)
285 if (channelGroup == NULL)
288 CVariant object(CVariant::VariantTypeObject);
289 object["channelgroupid"] = channelGroup->GroupID();
290 object["channeltype"] = channelGroup->IsRadio() ? "radio" : "tv";
291 object["label"] = channelGroup->GroupName();
294 result.append(object);
297 CFileItemList channels;
298 channelGroup->GetMembers(channels);
299 object["channels"] = CVariant(CVariant::VariantTypeArray);
300 HandleFileItemList("channelid", false, "channels", channels, parameterObject["channels"], object, false);
306 JSONRPC_STATUS CPVROperations::GetTimers(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
308 if (!g_PVRManager.IsStarted())
309 return FailedToExecute;
311 CPVRTimers* timers = g_PVRTimers;
313 return FailedToExecute;
315 CFileItemList timerList;
316 timers->GetAll(timerList);
318 HandleFileItemList("timerid", false, "timers", timerList, parameterObject, result, true);
323 JSONRPC_STATUS CPVROperations::GetTimerDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
325 if (!g_PVRManager.IsStarted())
326 return FailedToExecute;
328 CPVRTimers* timers = g_PVRTimers;
330 return FailedToExecute;
332 CPVRTimerInfoTagPtr timer = timers->GetById((int)parameterObject["timerid"].asInteger());
334 return InvalidParams;
336 HandleFileItem("timerid", false, "timerdetails", CFileItemPtr(new CFileItem(*timer)), parameterObject, parameterObject["properties"], result, false);
341 JSONRPC_STATUS CPVROperations::GetRecordings(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
343 if (!g_PVRManager.IsStarted())
344 return FailedToExecute;
346 CPVRRecordings* recordings = g_PVRRecordings;
348 return FailedToExecute;
350 CFileItemList recordingsList;
351 recordings->GetAll(recordingsList);
353 HandleFileItemList("recordingid", true, "recordings", recordingsList, parameterObject, result, true);
358 JSONRPC_STATUS CPVROperations::GetRecordingDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
360 if (!g_PVRManager.IsStarted())
361 return FailedToExecute;
363 CPVRRecordings* recordings = g_PVRRecordings;
365 return FailedToExecute;
367 CFileItemPtr recording = recordings->GetById((int)parameterObject["recordingid"].asInteger());
369 return InvalidParams;
371 HandleFileItem("recordingid", true, "recordingdetails", recording, parameterObject, parameterObject["properties"], result, false);