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