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 "SystemOperations.h"
10 
11 #include "ServiceBroker.h"
12 #include "interfaces/builtins/Builtins.h"
13 #include "messaging/ApplicationMessenger.h"
14 #include "powermanagement/PowerManager.h"
15 #include "utils/Variant.h"
16 
17 using namespace JSONRPC;
18 using namespace KODI::MESSAGING;
19 
GetProperties(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)20 JSONRPC_STATUS CSystemOperations::GetProperties(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
21 {
22   CVariant properties = CVariant(CVariant::VariantTypeObject);
23   for (unsigned int index = 0; index < parameterObject["properties"].size(); index++)
24   {
25     std::string propertyName = parameterObject["properties"][index].asString();
26     CVariant property;
27     JSONRPC_STATUS ret;
28     if ((ret = GetPropertyValue(client->GetPermissionFlags(), propertyName, property)) != OK)
29       return ret;
30 
31     properties[propertyName] = property;
32   }
33 
34   result = properties;
35 
36   return OK;
37 }
38 
EjectOpticalDrive(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)39 JSONRPC_STATUS CSystemOperations::EjectOpticalDrive(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
40 {
41   return CBuiltins::GetInstance().Execute("EjectTray") == 0 ? ACK : FailedToExecute;
42 }
43 
Shutdown(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)44 JSONRPC_STATUS CSystemOperations::Shutdown(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
45 {
46   if (CServiceBroker::GetPowerManager().CanPowerdown())
47   {
48     CApplicationMessenger::GetInstance().PostMsg(TMSG_POWERDOWN);
49     return ACK;
50   }
51   else
52     return FailedToExecute;
53 }
54 
Suspend(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)55 JSONRPC_STATUS CSystemOperations::Suspend(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
56 {
57   if (CServiceBroker::GetPowerManager().CanSuspend())
58   {
59     CApplicationMessenger::GetInstance().PostMsg(TMSG_SUSPEND);
60     return ACK;
61   }
62   else
63     return FailedToExecute;
64 }
65 
Hibernate(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)66 JSONRPC_STATUS CSystemOperations::Hibernate(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
67 {
68   if (CServiceBroker::GetPowerManager().CanHibernate())
69   {
70     CApplicationMessenger::GetInstance().PostMsg(TMSG_HIBERNATE);
71     return ACK;
72   }
73   else
74     return FailedToExecute;
75 }
76 
Reboot(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)77 JSONRPC_STATUS CSystemOperations::Reboot(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
78 {
79   if (CServiceBroker::GetPowerManager().CanReboot())
80   {
81     CApplicationMessenger::GetInstance().PostMsg(TMSG_RESTART);
82     return ACK;
83   }
84   else
85     return FailedToExecute;
86 }
87 
GetPropertyValue(int permissions,const std::string & property,CVariant & result)88 JSONRPC_STATUS CSystemOperations::GetPropertyValue(int permissions, const std::string &property, CVariant &result)
89 {
90   if (property == "canshutdown")
91     result = CServiceBroker::GetPowerManager().CanPowerdown() && (permissions & ControlPower);
92   else if (property == "cansuspend")
93     result = CServiceBroker::GetPowerManager().CanSuspend() && (permissions & ControlPower);
94   else if (property == "canhibernate")
95     result = CServiceBroker::GetPowerManager().CanHibernate() && (permissions & ControlPower);
96   else if (property == "canreboot")
97     result = CServiceBroker::GetPowerManager().CanReboot() && (permissions & ControlPower);
98   else
99     return InvalidParams;
100 
101   return OK;
102 }
103