1 /*
2  *  Copyright (C) 2015-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 "Progress.h"
10 
11 #include "ServiceBroker.h"
12 #include "addons/binary-addons/AddonDll.h"
13 #include "addons/kodi-dev-kit/include/kodi/gui/dialogs/Progress.h"
14 #include "dialogs/GUIDialogProgress.h"
15 #include "guilib/GUIComponent.h"
16 #include "guilib/GUIWindowManager.h"
17 #include "utils/Variant.h"
18 #include "utils/log.h"
19 
20 namespace ADDON
21 {
22 
Init(AddonGlobalInterface * addonInterface)23 void Interface_GUIDialogProgress::Init(AddonGlobalInterface* addonInterface)
24 {
25   addonInterface->toKodi->kodi_gui->dialogProgress =
26       new AddonToKodiFuncTable_kodi_gui_dialogProgress();
27 
28   addonInterface->toKodi->kodi_gui->dialogProgress->new_dialog = new_dialog;
29   addonInterface->toKodi->kodi_gui->dialogProgress->delete_dialog = delete_dialog;
30   addonInterface->toKodi->kodi_gui->dialogProgress->open = open;
31   addonInterface->toKodi->kodi_gui->dialogProgress->set_heading = set_heading;
32   addonInterface->toKodi->kodi_gui->dialogProgress->set_line = set_line;
33   addonInterface->toKodi->kodi_gui->dialogProgress->set_can_cancel = set_can_cancel;
34   addonInterface->toKodi->kodi_gui->dialogProgress->is_canceled = is_canceled;
35   addonInterface->toKodi->kodi_gui->dialogProgress->set_percentage = set_percentage;
36   addonInterface->toKodi->kodi_gui->dialogProgress->get_percentage = get_percentage;
37   addonInterface->toKodi->kodi_gui->dialogProgress->show_progress_bar = show_progress_bar;
38   addonInterface->toKodi->kodi_gui->dialogProgress->set_progress_max = set_progress_max;
39   addonInterface->toKodi->kodi_gui->dialogProgress->set_progress_advance = set_progress_advance;
40   addonInterface->toKodi->kodi_gui->dialogProgress->abort = abort;
41 }
42 
DeInit(AddonGlobalInterface * addonInterface)43 void Interface_GUIDialogProgress::DeInit(AddonGlobalInterface* addonInterface)
44 {
45   delete addonInterface->toKodi->kodi_gui->dialogProgress;
46 }
47 
new_dialog(KODI_HANDLE kodiBase)48 KODI_GUI_HANDLE Interface_GUIDialogProgress::new_dialog(KODI_HANDLE kodiBase)
49 {
50   CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
51   if (!addon)
52   {
53     CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__);
54     return nullptr;
55   }
56 
57   CGUIDialogProgress* dialog =
58       CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogProgress>(
59           WINDOW_DIALOG_PROGRESS);
60   if (!dialog)
61   {
62     CLog::Log(LOGERROR,
63               "Interface_GUIDialogProgress::{} - invalid handler data (dialog='{}') on addon '{}'",
64               __func__, static_cast<void*>(dialog), addon->ID());
65     return nullptr;
66   }
67 
68   return dialog;
69 }
70 
delete_dialog(KODI_HANDLE kodiBase,KODI_GUI_HANDLE handle)71 void Interface_GUIDialogProgress::delete_dialog(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle)
72 {
73   CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
74   if (!addon)
75   {
76     CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__);
77     return;
78   }
79 
80   if (!handle)
81   {
82     CLog::Log(LOGERROR,
83               "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'",
84               __func__, handle, addon->ID());
85     return;
86   }
87 
88   static_cast<CGUIDialogProgress*>(handle)->Close();
89 }
90 
open(KODI_HANDLE kodiBase,KODI_GUI_HANDLE handle)91 void Interface_GUIDialogProgress::open(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle)
92 {
93   CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
94   if (!addon)
95   {
96     CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__);
97     return;
98   }
99 
100   if (!handle)
101   {
102     CLog::Log(LOGERROR,
103               "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'",
104               __func__, handle, addon->ID());
105     return;
106   }
107 
108   static_cast<CGUIDialogProgress*>(handle)->Open();
109 }
110 
set_heading(KODI_HANDLE kodiBase,KODI_GUI_HANDLE handle,const char * heading)111 void Interface_GUIDialogProgress::set_heading(KODI_HANDLE kodiBase,
112                                               KODI_GUI_HANDLE handle,
113                                               const char* heading)
114 {
115   CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
116   if (!addon)
117   {
118     CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__);
119     return;
120   }
121 
122   if (!handle || !heading)
123   {
124     CLog::Log(LOGERROR,
125               "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}', heading='{}') "
126               "on addon '{}'",
127               __func__, handle, static_cast<const void*>(heading), addon->ID());
128     return;
129   }
130 
131   static_cast<CGUIDialogProgress*>(handle)->SetHeading(heading);
132 }
133 
set_line(KODI_HANDLE kodiBase,KODI_GUI_HANDLE handle,unsigned int line,const char * text)134 void Interface_GUIDialogProgress::set_line(KODI_HANDLE kodiBase,
135                                            KODI_GUI_HANDLE handle,
136                                            unsigned int line,
137                                            const char* text)
138 {
139   CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
140   if (!addon)
141   {
142     CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__);
143     return;
144   }
145 
146   if (!handle || !text)
147   {
148     CLog::Log(LOGERROR,
149               "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}', text='{}') on "
150               "addon '{}'",
151               __func__, handle, static_cast<const void*>(text), addon->ID());
152     return;
153   }
154 
155   static_cast<CGUIDialogProgress*>(handle)->SetLine(line, text);
156 }
157 
set_can_cancel(KODI_HANDLE kodiBase,KODI_GUI_HANDLE handle,bool canCancel)158 void Interface_GUIDialogProgress::set_can_cancel(KODI_HANDLE kodiBase,
159                                                  KODI_GUI_HANDLE handle,
160                                                  bool canCancel)
161 {
162   CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
163   if (!addon)
164   {
165     CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__);
166     return;
167   }
168 
169   if (!handle)
170   {
171     CLog::Log(LOGERROR,
172               "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'",
173               __func__, handle, addon->ID());
174     return;
175   }
176 
177   static_cast<CGUIDialogProgress*>(handle)->SetCanCancel(canCancel);
178 }
179 
is_canceled(KODI_HANDLE kodiBase,KODI_GUI_HANDLE handle)180 bool Interface_GUIDialogProgress::is_canceled(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle)
181 {
182   CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
183   if (!addon)
184   {
185     CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__);
186     return false;
187   }
188 
189   if (!handle)
190   {
191     CLog::Log(LOGERROR,
192               "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'",
193               __func__, handle, addon->ID());
194     return false;
195   }
196 
197   return static_cast<CGUIDialogProgress*>(handle)->IsCanceled();
198 }
199 
set_percentage(KODI_HANDLE kodiBase,KODI_GUI_HANDLE handle,int percentage)200 void Interface_GUIDialogProgress::set_percentage(KODI_HANDLE kodiBase,
201                                                  KODI_GUI_HANDLE handle,
202                                                  int percentage)
203 {
204   CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
205   if (!addon)
206   {
207     CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__);
208     return;
209   }
210 
211   if (!handle)
212   {
213     CLog::Log(LOGERROR,
214               "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'",
215               __func__, handle, addon->ID());
216     return;
217   }
218 
219   static_cast<CGUIDialogProgress*>(handle)->SetPercentage(percentage);
220 }
221 
get_percentage(KODI_HANDLE kodiBase,KODI_GUI_HANDLE handle)222 int Interface_GUIDialogProgress::get_percentage(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle)
223 {
224   CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
225   if (!addon)
226   {
227     CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__);
228     return 0;
229   }
230 
231   if (!handle)
232   {
233     CLog::Log(LOGERROR,
234               "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'",
235               __func__, handle, addon->ID());
236     return 0;
237   }
238 
239   return static_cast<CGUIDialogProgress*>(handle)->GetPercentage();
240 }
241 
show_progress_bar(KODI_HANDLE kodiBase,KODI_GUI_HANDLE handle,bool onOff)242 void Interface_GUIDialogProgress::show_progress_bar(KODI_HANDLE kodiBase,
243                                                     KODI_GUI_HANDLE handle,
244                                                     bool onOff)
245 {
246   CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
247   if (!addon)
248   {
249     CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__);
250     return;
251   }
252 
253   if (!handle)
254   {
255     CLog::Log(LOGERROR,
256               "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'",
257               __func__, handle, addon->ID());
258     return;
259   }
260 
261   static_cast<CGUIDialogProgress*>(handle)->ShowProgressBar(onOff);
262 }
263 
set_progress_max(KODI_HANDLE kodiBase,KODI_GUI_HANDLE handle,int max)264 void Interface_GUIDialogProgress::set_progress_max(KODI_HANDLE kodiBase,
265                                                    KODI_GUI_HANDLE handle,
266                                                    int max)
267 {
268   CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
269   if (!addon)
270   {
271     CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__);
272     return;
273   }
274 
275   if (!handle)
276   {
277     CLog::Log(LOGERROR,
278               "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'",
279               __func__, handle, addon->ID());
280     return;
281   }
282 
283   static_cast<CGUIDialogProgress*>(handle)->SetProgressMax(max);
284 }
285 
set_progress_advance(KODI_HANDLE kodiBase,KODI_GUI_HANDLE handle,int nSteps)286 void Interface_GUIDialogProgress::set_progress_advance(KODI_HANDLE kodiBase,
287                                                        KODI_GUI_HANDLE handle,
288                                                        int nSteps)
289 {
290   CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
291   if (!addon)
292   {
293     CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__);
294     return;
295   }
296 
297   if (!handle)
298   {
299     CLog::Log(LOGERROR,
300               "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'",
301               __func__, handle, addon->ID());
302     return;
303   }
304 
305   static_cast<CGUIDialogProgress*>(handle)->SetProgressAdvance(nSteps);
306 }
307 
abort(KODI_HANDLE kodiBase,KODI_GUI_HANDLE handle)308 bool Interface_GUIDialogProgress::abort(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle)
309 {
310   CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
311   if (!addon)
312   {
313     CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__);
314     return false;
315   }
316 
317   if (!handle)
318   {
319     CLog::Log(LOGERROR,
320               "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'",
321               __func__, handle, addon->ID());
322     return false;
323   }
324 
325   return static_cast<CGUIDialogProgress*>(handle)->Abort();
326 }
327 
328 } /* namespace ADDON */
329