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 ¶meterObject, 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 ¶meterObject, 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 ¶meterObject, 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 ¶meterObject, 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 ¶meterObject, 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 ¶meterObject, 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