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 &parameterObject, 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 &parameterObject, 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