summaryrefslogtreecommitdiffstats
path: root/xbmc/addons/AddonCallbacksAddon.cpp
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2015-03-03 16:53:59 +0100
committermanuel <manuel@mausz.at>2015-03-03 16:53:59 +0100
commitffca21f2743a7b367fa212799c6e2fea6190dd5d (patch)
tree0608ea3a29cf644ec9ab204e2b4bb9bfaae1c381 /xbmc/addons/AddonCallbacksAddon.cpp
downloadkodi-pvr-build-ffca21f2743a7b367fa212799c6e2fea6190dd5d.tar.gz
kodi-pvr-build-ffca21f2743a7b367fa212799c6e2fea6190dd5d.tar.bz2
kodi-pvr-build-ffca21f2743a7b367fa212799c6e2fea6190dd5d.zip
initial commit for kodi master
Diffstat (limited to 'xbmc/addons/AddonCallbacksAddon.cpp')
-rw-r--r--xbmc/addons/AddonCallbacksAddon.cpp532
1 files changed, 532 insertions, 0 deletions
diff --git a/xbmc/addons/AddonCallbacksAddon.cpp b/xbmc/addons/AddonCallbacksAddon.cpp
new file mode 100644
index 0000000..e54aebe
--- /dev/null
+++ b/xbmc/addons/AddonCallbacksAddon.cpp
@@ -0,0 +1,532 @@
1/*
2 * Copyright (C) 2012-2013 Team XBMC
3 * http://xbmc.org
4 *
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
8 * any later version.
9 *
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 */
20
21#include "Application.h"
22#include "Addon.h"
23#include "AddonCallbacksAddon.h"
24#include "utils/log.h"
25#include "LangInfo.h"
26#include "dialogs/GUIDialogKaiToast.h"
27#include "filesystem/File.h"
28#include "filesystem/Directory.h"
29#include "utils/URIUtils.h"
30#include "FileItem.h"
31#include "network/Network.h"
32#include "utils/CharsetConverter.h"
33#include "utils/StringUtils.h"
34#include "utils/XMLUtils.h"
35#include "cores/dvdplayer/DVDCodecs/DVDCodecs.h"
36
37using namespace XFILE;
38
39namespace ADDON
40{
41
42CAddonCallbacksAddon::CAddonCallbacksAddon(CAddon* addon)
43{
44 m_addon = addon;
45 m_callbacks = new CB_AddOnLib;
46
47 /* write XBMC addon-on specific add-on function addresses to the callback table */
48 m_callbacks->Log = AddOnLog;
49 m_callbacks->QueueNotification = QueueNotification;
50 m_callbacks->WakeOnLan = WakeOnLan;
51 m_callbacks->GetSetting = GetAddonSetting;
52 m_callbacks->UnknownToUTF8 = UnknownToUTF8;
53 m_callbacks->GetLocalizedString = GetLocalizedString;
54 m_callbacks->GetDVDMenuLanguage = GetDVDMenuLanguage;
55 m_callbacks->FreeString = FreeString;
56
57 m_callbacks->OpenFile = OpenFile;
58 m_callbacks->OpenFileForWrite = OpenFileForWrite;
59 m_callbacks->ReadFile = ReadFile;
60 m_callbacks->ReadFileString = ReadFileString;
61 m_callbacks->WriteFile = WriteFile;
62 m_callbacks->FlushFile = FlushFile;
63 m_callbacks->SeekFile = SeekFile;
64 m_callbacks->TruncateFile = TruncateFile;
65 m_callbacks->GetFilePosition = GetFilePosition;
66 m_callbacks->GetFileLength = GetFileLength;
67 m_callbacks->CloseFile = CloseFile;
68 m_callbacks->GetFileChunkSize = GetFileChunkSize;
69 m_callbacks->FileExists = FileExists;
70 m_callbacks->StatFile = StatFile;
71 m_callbacks->DeleteFile = DeleteFile;
72
73 m_callbacks->CanOpenDirectory = CanOpenDirectory;
74 m_callbacks->CreateDirectory = CreateDirectory;
75 m_callbacks->DirectoryExists = DirectoryExists;
76 m_callbacks->RemoveDirectory = RemoveDirectory;
77}
78
79CAddonCallbacksAddon::~CAddonCallbacksAddon()
80{
81 /* delete the callback table */
82 delete m_callbacks;
83}
84
85void CAddonCallbacksAddon::AddOnLog(void *addonData, const addon_log_t addonLogLevel, const char *strMessage)
86{
87 CAddonCallbacks* addon = (CAddonCallbacks*) addonData;
88 if (addon == NULL || strMessage == NULL)
89 {
90 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - called with a null pointer", __FUNCTION__);
91 return;
92 }
93
94 CAddonCallbacksAddon* addonHelper = addon->GetHelperAddon();
95
96 try
97 {
98 int xbmcLogLevel = LOGNONE;
99 switch (addonLogLevel)
100 {
101 case LOG_ERROR:
102 xbmcLogLevel = LOGERROR;
103 break;
104 case LOG_INFO:
105 xbmcLogLevel = LOGINFO;
106 break;
107 case LOG_NOTICE:
108 xbmcLogLevel = LOGNOTICE;
109 break;
110 case LOG_DEBUG:
111 default:
112 xbmcLogLevel = LOGDEBUG;
113 break;
114 }
115
116 std::string strXbmcMessage = StringUtils::Format("AddOnLog: %s: %s", addonHelper->m_addon->Name().c_str(), strMessage);
117 CLog::Log(xbmcLogLevel, "%s", strXbmcMessage.c_str());
118 }
119 catch (std::exception &e)
120 {
121 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - exception '%s' caught in call in add-on '%s'. please contact the developer of this addon: %s",
122 __FUNCTION__, e.what(), addonHelper->m_addon->Name().c_str(), addonHelper->m_addon->Author().c_str());
123 }
124}
125
126void CAddonCallbacksAddon::QueueNotification(void *addonData, const queue_msg_t type, const char *strMessage)
127{
128 CAddonCallbacks* addon = (CAddonCallbacks*) addonData;
129 if (addon == NULL || strMessage == NULL)
130 {
131 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - called with a null pointer", __FUNCTION__);
132 return;
133 }
134
135 CAddonCallbacksAddon* addonHelper = addon->GetHelperAddon();
136
137 try
138 {
139 switch (type)
140 {
141 case QUEUE_WARNING:
142 CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, addonHelper->m_addon->Name(), strMessage, 3000, true);
143 CLog::Log(LOGDEBUG, "CAddonCallbacksAddon - %s - %s - Warning Message: '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str(), strMessage);
144 break;
145
146 case QUEUE_ERROR:
147 CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, addonHelper->m_addon->Name(), strMessage, 3000, true);
148 CLog::Log(LOGDEBUG, "CAddonCallbacksAddon - %s - %s - Error Message : '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str(), strMessage);
149 break;
150
151 case QUEUE_INFO:
152 default:
153 CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, addonHelper->m_addon->Name(), strMessage, 3000, false);
154 CLog::Log(LOGDEBUG, "CAddonCallbacksAddon - %s - %s - Info Message : '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str(), strMessage);
155 break;
156 }
157 }
158 catch (std::exception &e)
159 {
160 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - exception '%s' caught in call in add-on '%s'. please contact the developer of this addon: %s",
161 __FUNCTION__, e.what(), addonHelper->m_addon->Name().c_str(), addonHelper->m_addon->Author().c_str());
162 }
163}
164
165bool CAddonCallbacksAddon::WakeOnLan(const char *mac)
166{
167 return g_application.getNetwork().WakeOnLan(mac);
168}
169
170bool CAddonCallbacksAddon::GetAddonSetting(void *addonData, const char *strSettingName, void *settingValue)
171{
172 CAddonCallbacks* addon = (CAddonCallbacks*) addonData;
173 if (addon == NULL || strSettingName == NULL || settingValue == NULL)
174 {
175 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - called with a null pointer", __FUNCTION__);
176 return false;
177 }
178
179 CAddonCallbacksAddon* addonHelper = addon->GetHelperAddon();
180
181 try
182 {
183 CLog::Log(LOGDEBUG, "CAddonCallbacksAddon - %s - add-on '%s' requests setting '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str(), strSettingName);
184
185 if (!addonHelper->m_addon->ReloadSettings())
186 {
187 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - could't get settings for add-on '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str());
188 return false;
189 }
190
191 const TiXmlElement *category = addonHelper->m_addon->GetSettingsXML()->FirstChildElement("category");
192 if (!category) // add a default one...
193 category = addonHelper->m_addon->GetSettingsXML();
194
195 while (category)
196 {
197 const TiXmlElement *setting = category->FirstChildElement("setting");
198 while (setting)
199 {
200 const std::string id = XMLUtils::GetAttribute(setting, "id");
201 const std::string type = XMLUtils::GetAttribute(setting, "type");
202
203 if (id == strSettingName && !type.empty())
204 {
205 if (type == "text" || type == "ipaddress" ||
206 type == "folder" || type == "action" ||
207 type == "music" || type == "pictures" ||
208 type == "programs" || type == "fileenum" ||
209 type == "file")
210 {
211 strcpy((char*) settingValue, addonHelper->m_addon->GetSetting(id).c_str());
212 return true;
213 }
214 else if (type == "number" || type == "enum" ||
215 type == "labelenum")
216 {
217 *(int*) settingValue = (int) atoi(addonHelper->m_addon->GetSetting(id).c_str());
218 return true;
219 }
220 else if (type == "bool")
221 {
222 *(bool*) settingValue = (bool) (addonHelper->m_addon->GetSetting(id) == "true" ? true : false);
223 return true;
224 }
225 else if (type == "slider")
226 {
227 const char *option = setting->Attribute("option");
228 if (option && strcmpi(option, "int") == 0)
229 {
230 *(int*) settingValue = (int) atoi(addonHelper->m_addon->GetSetting(id).c_str());
231 return true;
232 }
233 else
234 {
235 *(float*) settingValue = (float) atof(addonHelper->m_addon->GetSetting(id).c_str());
236 return true;
237 }
238 }
239 }
240 setting = setting->NextSiblingElement("setting");
241 }
242 category = category->NextSiblingElement("category");
243 }
244 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - can't find setting '%s' in '%s'", __FUNCTION__, strSettingName, addonHelper->m_addon->Name().c_str());
245 }
246 catch (std::exception &e)
247 {
248 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - exception '%s' caught in call in add-on '%s'. please contact the developer of this addon: %s",
249 __FUNCTION__, e.what(), addonHelper->m_addon->Name().c_str(), addonHelper->m_addon->Author().c_str());
250 }
251
252 return false;
253}
254
255char* CAddonCallbacksAddon::UnknownToUTF8(const char *strSource)
256{
257 std::string string;
258 if (strSource != NULL)
259 g_charsetConverter.unknownToUTF8(strSource, string);
260 else
261 string = "";
262 char* buffer = strdup(string.c_str());
263 return buffer;
264}
265
266char* CAddonCallbacksAddon::GetLocalizedString(const void* addonData, long dwCode)
267{
268 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
269 if (!helper || g_application.m_bStop)
270 return NULL;
271
272 CAddonCallbacksAddon* addonHelper = helper->GetHelperAddon();
273
274 std::string string;
275 if (dwCode >= 30000 && dwCode <= 30999)
276 string = addonHelper->m_addon->GetString(dwCode).c_str();
277 else if (dwCode >= 32000 && dwCode <= 32999)
278 string = addonHelper->m_addon->GetString(dwCode).c_str();
279 else
280 string = g_localizeStrings.Get(dwCode).c_str();
281
282 char* buffer = strdup(string.c_str());
283 return buffer;
284}
285
286char* CAddonCallbacksAddon::GetDVDMenuLanguage(const void* addonData)
287{
288 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
289 if (!helper)
290 return NULL;
291
292 std::string string = g_langInfo.GetDVDMenuLanguage();
293
294 char* buffer = strdup(string.c_str());
295 return buffer;
296}
297
298void CAddonCallbacksAddon::FreeString(const void* addonData, char* str)
299{
300 free(str);
301}
302
303void* CAddonCallbacksAddon::OpenFile(const void* addonData, const char* strFileName, unsigned int flags)
304{
305 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
306 if (!helper)
307 return NULL;
308
309 CFile* file = new CFile;
310 if (file->Open(strFileName, flags))
311 return ((void*)file);
312
313 delete file;
314 return NULL;
315}
316
317void* CAddonCallbacksAddon::OpenFileForWrite(const void* addonData, const char* strFileName, bool bOverwrite)
318{
319 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
320 if (!helper)
321 return NULL;
322
323 CFile* file = new CFile;
324 if (file->OpenForWrite(strFileName, bOverwrite))
325 return ((void*)file);
326
327 delete file;
328 return NULL;
329}
330
331ssize_t CAddonCallbacksAddon::ReadFile(const void* addonData, void* file, void* lpBuf, size_t uiBufSize)
332{
333 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
334 if (!helper)
335 return 0;
336
337 CFile* cfile = (CFile*)file;
338 if (!cfile)
339 return 0;
340
341 return cfile->Read(lpBuf, uiBufSize);
342}
343
344bool CAddonCallbacksAddon::ReadFileString(const void* addonData, void* file, char *szLine, int iLineLength)
345{
346 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
347 if (!helper)
348 return false;
349
350 CFile* cfile = (CFile*)file;
351 if (!cfile)
352 return false;
353
354 return cfile->ReadString(szLine, iLineLength);
355}
356
357ssize_t CAddonCallbacksAddon::WriteFile(const void* addonData, void* file, const void* lpBuf, size_t uiBufSize)
358{
359 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
360 if (!helper)
361 return -1;
362
363 CFile* cfile = (CFile*)file;
364 if (!cfile)
365 return -1;
366
367 return cfile->Write(lpBuf, uiBufSize);
368}
369
370void CAddonCallbacksAddon::FlushFile(const void* addonData, void* file)
371{
372 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
373 if (!helper)
374 return;
375
376 CFile* cfile = (CFile*)file;
377 if (!cfile)
378 return;
379
380 cfile->Flush();
381}
382
383int64_t CAddonCallbacksAddon::SeekFile(const void* addonData, void* file, int64_t iFilePosition, int iWhence)
384{
385 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
386 if (!helper)
387 return 0;
388
389 CFile* cfile = (CFile*)file;
390 if (!cfile)
391 return 0;
392
393 return cfile->Seek(iFilePosition, iWhence);
394}
395
396int CAddonCallbacksAddon::TruncateFile(const void* addonData, void* file, int64_t iSize)
397{
398 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
399 if (!helper)
400 return 0;
401
402 CFile* cfile = (CFile*)file;
403 if (!cfile)
404 return 0;
405
406 return cfile->Truncate(iSize);
407}
408
409int64_t CAddonCallbacksAddon::GetFilePosition(const void* addonData, void* file)
410{
411 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
412 if (!helper)
413 return 0;
414
415 CFile* cfile = (CFile*)file;
416 if (!cfile)
417 return 0;
418
419 return cfile->GetPosition();
420}
421
422int64_t CAddonCallbacksAddon::GetFileLength(const void* addonData, void* file)
423{
424 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
425 if (!helper)
426 return 0;
427
428 CFile* cfile = (CFile*)file;
429 if (!cfile)
430 return 0;
431
432 return cfile->GetLength();
433}
434
435void CAddonCallbacksAddon::CloseFile(const void* addonData, void* file)
436{
437 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
438 if (!helper)
439 return;
440
441 CFile* cfile = (CFile*)file;
442 if (cfile)
443 {
444 cfile->Close();
445 delete cfile;
446 }
447}
448
449int CAddonCallbacksAddon::GetFileChunkSize(const void* addonData, void* file)
450{
451 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
452 if (!helper)
453 return 0;
454
455 CFile* cfile = (CFile*)file;
456 if (!cfile)
457 return 0;
458
459 return cfile->GetChunkSize();
460}
461
462bool CAddonCallbacksAddon::FileExists(const void* addonData, const char *strFileName, bool bUseCache)
463{
464 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
465 if (!helper)
466 return false;
467
468 return CFile::Exists(strFileName, bUseCache);
469}
470
471int CAddonCallbacksAddon::StatFile(const void* addonData, const char *strFileName, struct __stat64* buffer)
472{
473 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
474 if (!helper)
475 return -1;
476
477 return CFile::Stat(strFileName, buffer);
478}
479
480bool CAddonCallbacksAddon::DeleteFile(const void* addonData, const char *strFileName)
481{
482 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
483 if (!helper)
484 return false;
485
486 return CFile::Delete(strFileName);
487}
488
489bool CAddonCallbacksAddon::CanOpenDirectory(const void* addonData, const char* strURL)
490{
491 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
492 if (!helper)
493 return false;
494
495 CFileItemList items;
496 return CDirectory::GetDirectory(strURL, items);
497}
498
499bool CAddonCallbacksAddon::CreateDirectory(const void* addonData, const char *strPath)
500{
501 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
502 if (!helper)
503 return false;
504
505 return CDirectory::Create(strPath);
506}
507
508bool CAddonCallbacksAddon::DirectoryExists(const void* addonData, const char *strPath)
509{
510 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
511 if (!helper)
512 return false;
513
514 return CDirectory::Exists(strPath);
515}
516
517bool CAddonCallbacksAddon::RemoveDirectory(const void* addonData, const char *strPath)
518{
519 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
520 if (!helper)
521 return false;
522
523 // Empty directory
524 CFileItemList fileItems;
525 CDirectory::GetDirectory(strPath, fileItems);
526 for (int i = 0; i < fileItems.Size(); ++i)
527 CFile::Delete(fileItems.Get(i)->GetPath());
528
529 return CDirectory::Remove(strPath);
530}
531
532}; /* namespace ADDON */