1 /*
2 * Copyright (C) 2011-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 "GUIOperations.h"
10
11 #include "Application.h"
12 #include "GUIInfoManager.h"
13 #include "ServiceBroker.h"
14 #include "addons/AddonManager.h"
15 #include "dialogs/GUIDialogKaiToast.h"
16 #include "guilib/GUIComponent.h"
17 #include "guilib/GUIWindowManager.h"
18 #include "guilib/StereoscopicsManager.h"
19 #include "input/Key.h"
20 #include "input/WindowTranslator.h"
21 #include "messaging/ApplicationMessenger.h"
22 #include "rendering/RenderSystem.h"
23 #include "settings/Settings.h"
24 #include "settings/SettingsComponent.h"
25 #include "utils/Variant.h"
26
27 using namespace JSONRPC;
28 using namespace ADDON;
29 using namespace KODI::MESSAGING;
30
GetProperties(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)31 JSONRPC_STATUS CGUIOperations::GetProperties(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
32 {
33 CVariant properties = CVariant(CVariant::VariantTypeObject);
34 for (unsigned int index = 0; index < parameterObject["properties"].size(); index++)
35 {
36 std::string propertyName = parameterObject["properties"][index].asString();
37 CVariant property;
38 JSONRPC_STATUS ret;
39 if ((ret = GetPropertyValue(propertyName, property)) != OK)
40 return ret;
41
42 properties[propertyName] = property;
43 }
44
45 result = properties;
46
47 return OK;
48 }
49
ActivateWindow(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)50 JSONRPC_STATUS CGUIOperations::ActivateWindow(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
51 {
52 int iWindow = CWindowTranslator::TranslateWindow(parameterObject["window"].asString());
53 if (iWindow != WINDOW_INVALID)
54 {
55 std::vector<std::string> params;
56 for (CVariant::const_iterator_array param = parameterObject["parameters"].begin_array(); param != parameterObject["parameters"].end_array(); param++)
57 {
58 if (param->isString() && !param->empty())
59 params.push_back(param->asString());
60 }
61 CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTIVATE_WINDOW, iWindow, 0, nullptr, "", params);
62 return ACK;
63 }
64
65 return InvalidParams;
66 }
67
ShowNotification(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)68 JSONRPC_STATUS CGUIOperations::ShowNotification(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
69 {
70 std::string image = parameterObject["image"].asString();
71 std::string title = parameterObject["title"].asString();
72 std::string message = parameterObject["message"].asString();
73 unsigned int displaytime = (unsigned int)parameterObject["displaytime"].asUnsignedInteger();
74
75 if (image.compare("info") == 0)
76 CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, title, message, displaytime);
77 else if (image.compare("warning") == 0)
78 CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, title, message, displaytime);
79 else if (image.compare("error") == 0)
80 CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, title, message, displaytime);
81 else
82 CGUIDialogKaiToast::QueueNotification(image, title, message, displaytime);
83
84 return ACK;
85 }
86
SetFullscreen(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)87 JSONRPC_STATUS CGUIOperations::SetFullscreen(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
88 {
89 if ((parameterObject["fullscreen"].isString() &&
90 parameterObject["fullscreen"].asString().compare("toggle") == 0) ||
91 (parameterObject["fullscreen"].isBoolean() &&
92 parameterObject["fullscreen"].asBoolean() != g_application.IsFullScreen()))
93 {
94 CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(ACTION_SHOW_GUI)));
95 }
96 else if (!parameterObject["fullscreen"].isBoolean() && !parameterObject["fullscreen"].isString())
97 return InvalidParams;
98
99 return GetPropertyValue("fullscreen", result);
100 }
101
SetStereoscopicMode(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)102 JSONRPC_STATUS CGUIOperations::SetStereoscopicMode(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
103 {
104 CAction action = CStereoscopicsManager::ConvertActionCommandToAction("SetStereoMode", parameterObject["mode"].asString());
105 if (action.GetID() != ACTION_NONE)
106 {
107 CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(action)));
108 return ACK;
109 }
110
111 return InvalidParams;
112 }
113
GetStereoscopicModes(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)114 JSONRPC_STATUS CGUIOperations::GetStereoscopicModes(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
115 {
116 for (int i = RENDER_STEREO_MODE_OFF; i < RENDER_STEREO_MODE_COUNT; i++)
117 {
118 RENDER_STEREO_MODE mode = (RENDER_STEREO_MODE) i;
119 if (CServiceBroker::GetRenderSystem()->SupportsStereo(mode))
120 result["stereoscopicmodes"].push_back(GetStereoModeObjectFromGuiMode(mode));
121 }
122
123 return OK;
124 }
125
GetPropertyValue(const std::string & property,CVariant & result)126 JSONRPC_STATUS CGUIOperations::GetPropertyValue(const std::string &property, CVariant &result)
127 {
128 if (property == "currentwindow")
129 {
130 result["label"] = CServiceBroker::GetGUI()->GetInfoManager().GetLabel(CServiceBroker::GetGUI()->GetInfoManager().TranslateString("System.CurrentWindow"));
131 result["id"] = CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindowOrDialog();
132 }
133 else if (property == "currentcontrol")
134 result["label"] = CServiceBroker::GetGUI()->GetInfoManager().GetLabel(CServiceBroker::GetGUI()->GetInfoManager().TranslateString("System.CurrentControl"));
135 else if (property == "skin")
136 {
137 std::string skinId = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_LOOKANDFEEL_SKIN);
138 AddonPtr addon;
139 if (!CServiceBroker::GetAddonMgr().GetAddon(skinId, addon, ADDON_SKIN, OnlyEnabled::YES))
140 return InternalError;
141
142 result["id"] = skinId;
143 if (addon.get())
144 result["name"] = addon->Name();
145 }
146 else if (property == "fullscreen")
147 result = g_application.IsFullScreen();
148 else if (property == "stereoscopicmode")
149 {
150 const CStereoscopicsManager &stereoscopicsManager = CServiceBroker::GetGUI()->GetStereoscopicsManager();
151
152 result = GetStereoModeObjectFromGuiMode(stereoscopicsManager.GetStereoMode());
153 }
154 else
155 return InvalidParams;
156
157 return OK;
158 }
159
GetStereoModeObjectFromGuiMode(const RENDER_STEREO_MODE & mode)160 CVariant CGUIOperations::GetStereoModeObjectFromGuiMode(const RENDER_STEREO_MODE &mode)
161 {
162 const CStereoscopicsManager &stereoscopicsManager = CServiceBroker::GetGUI()->GetStereoscopicsManager();
163
164 CVariant modeObj(CVariant::VariantTypeObject);
165 modeObj["mode"] = stereoscopicsManager.ConvertGuiStereoModeToString(mode);
166 modeObj["label"] = stereoscopicsManager.GetLabelForStereoMode(mode);
167 return modeObj;
168 }
169