1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9 #include "XBMCOperations.h"
10
11 #include "ServiceBroker.h"
12 #include "messaging/ApplicationMessenger.h"
13 #include "powermanagement/PowerManager.h"
14 #include "utils/Variant.h"
15
16 using namespace JSONRPC;
17 using namespace KODI::MESSAGING;
18
GetInfoLabels(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)19 JSONRPC_STATUS CXBMCOperations::GetInfoLabels(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
20 {
21 std::vector<std::string> info;
22
23 for (unsigned int i = 0; i < parameterObject["labels"].size(); i++)
24 {
25 std::string field = parameterObject["labels"][i].asString();
26 StringUtils::ToLower(field);
27
28 info.push_back(parameterObject["labels"][i].asString());
29 }
30
31 if (!info.empty())
32 {
33 std::vector<std::string> infoLabels;
34 CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_INFOLABEL, -1, -1, static_cast<void*>(&infoLabels), "", info);
35
36 for (unsigned int i = 0; i < info.size(); i++)
37 {
38 if (i >= infoLabels.size())
39 break;
40 result[info[i]] = infoLabels[i];
41 }
42 }
43
44 return OK;
45 }
46
GetInfoBooleans(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)47 JSONRPC_STATUS CXBMCOperations::GetInfoBooleans(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
48 {
49 std::vector<std::string> info;
50
51 bool CanControlPower = (client->GetPermissionFlags() & ControlPower) > 0;
52
53 for (unsigned int i = 0; i < parameterObject["booleans"].size(); i++)
54 {
55 std::string field = parameterObject["booleans"][i].asString();
56 StringUtils::ToLower(field);
57
58 // Need to override power management of whats in infomanager since jsonrpc
59 // have a security layer aswell.
60 if (field == "system.canshutdown")
61 result[parameterObject["booleans"][i].asString()] = (CServiceBroker::GetPowerManager().CanPowerdown() && CanControlPower);
62 else if (field == "system.canpowerdown")
63 result[parameterObject["booleans"][i].asString()] = (CServiceBroker::GetPowerManager().CanPowerdown() && CanControlPower);
64 else if (field == "system.cansuspend")
65 result[parameterObject["booleans"][i].asString()] = (CServiceBroker::GetPowerManager().CanSuspend() && CanControlPower);
66 else if (field == "system.canhibernate")
67 result[parameterObject["booleans"][i].asString()] = (CServiceBroker::GetPowerManager().CanHibernate() && CanControlPower);
68 else if (field == "system.canreboot")
69 result[parameterObject["booleans"][i].asString()] = (CServiceBroker::GetPowerManager().CanReboot() && CanControlPower);
70 else
71 info.push_back(parameterObject["booleans"][i].asString());
72 }
73
74 if (!info.empty())
75 {
76 std::vector<bool> infoLabels;
77 CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_INFOBOOL, -1, -1, static_cast<void*>(&infoLabels), "", info);
78 for (unsigned int i = 0; i < info.size(); i++)
79 {
80 if (i >= infoLabels.size())
81 break;
82 result[info[i].c_str()] = CVariant(infoLabels[i]);
83 }
84 }
85
86 return OK;
87 }
88