2 * Copyright (C) 2012-2013 Team XBMC
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)
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.
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/>.
21 #include "Application.h"
23 #include "AddonCallbacksAddon.h"
24 #include "utils/log.h"
26 #include "dialogs/GUIDialogKaiToast.h"
27 #include "filesystem/File.h"
28 #include "filesystem/Directory.h"
29 #include "utils/URIUtils.h"
31 #include "network/Network.h"
32 #include "utils/CharsetConverter.h"
33 #include "cores/dvdplayer/DVDCodecs/DVDCodecs.h"
35 using namespace XFILE;
40 CAddonCallbacksAddon::CAddonCallbacksAddon(CAddon* addon)
43 m_callbacks = new CB_AddOnLib;
45 /* write XBMC addon-on specific add-on function addresses to the callback table */
46 m_callbacks->Log = AddOnLog;
47 m_callbacks->QueueNotification = QueueNotification;
48 m_callbacks->WakeOnLan = WakeOnLan;
49 m_callbacks->GetSetting = GetAddonSetting;
50 m_callbacks->UnknownToUTF8 = UnknownToUTF8;
51 m_callbacks->GetLocalizedString = GetLocalizedString;
52 m_callbacks->GetDVDMenuLanguage = GetDVDMenuLanguage;
53 m_callbacks->FreeString = FreeString;
55 m_callbacks->OpenFile = OpenFile;
56 m_callbacks->OpenFileForWrite = OpenFileForWrite;
57 m_callbacks->ReadFile = ReadFile;
58 m_callbacks->ReadFileString = ReadFileString;
59 m_callbacks->WriteFile = WriteFile;
60 m_callbacks->FlushFile = FlushFile;
61 m_callbacks->SeekFile = SeekFile;
62 m_callbacks->TruncateFile = TruncateFile;
63 m_callbacks->GetFilePosition = GetFilePosition;
64 m_callbacks->GetFileLength = GetFileLength;
65 m_callbacks->CloseFile = CloseFile;
66 m_callbacks->GetFileChunkSize = GetFileChunkSize;
67 m_callbacks->FileExists = FileExists;
68 m_callbacks->StatFile = StatFile;
69 m_callbacks->DeleteFile = DeleteFile;
71 m_callbacks->CanOpenDirectory = CanOpenDirectory;
72 m_callbacks->CreateDirectory = CreateDirectory;
73 m_callbacks->DirectoryExists = DirectoryExists;
74 m_callbacks->RemoveDirectory = RemoveDirectory;
77 CAddonCallbacksAddon::~CAddonCallbacksAddon()
79 /* delete the callback table */
83 void CAddonCallbacksAddon::AddOnLog(void *addonData, const addon_log_t addonLogLevel, const char *strMessage)
85 CAddonCallbacks* addon = (CAddonCallbacks*) addonData;
86 if (addon == NULL || strMessage == NULL)
88 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - called with a null pointer", __FUNCTION__);
92 CAddonCallbacksAddon* addonHelper = addon->GetHelperAddon();
96 int xbmcLogLevel = LOGNONE;
97 switch (addonLogLevel)
100 xbmcLogLevel = LOGERROR;
103 xbmcLogLevel = LOGINFO;
106 xbmcLogLevel = LOGNOTICE;
110 xbmcLogLevel = LOGDEBUG;
114 CStdString strXbmcMessage;
115 strXbmcMessage.Format("AddOnLog: %s: %s", addonHelper->m_addon->Name().c_str(), strMessage);
116 CLog::Log(xbmcLogLevel, "%s", strXbmcMessage.c_str());
118 catch (std::exception &e)
120 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - exception '%s' caught in call in add-on '%s'. please contact the developer of this addon: %s",
121 __FUNCTION__, e.what(), addonHelper->m_addon->Name().c_str(), addonHelper->m_addon->Author().c_str());
125 void CAddonCallbacksAddon::QueueNotification(void *addonData, const queue_msg_t type, const char *strMessage)
127 CAddonCallbacks* addon = (CAddonCallbacks*) addonData;
128 if (addon == NULL || strMessage == NULL)
130 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - called with a null pointer", __FUNCTION__);
134 CAddonCallbacksAddon* addonHelper = addon->GetHelperAddon();
141 CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, addonHelper->m_addon->Name(), strMessage, 3000, true);
142 CLog::Log(LOGDEBUG, "CAddonCallbacksAddon - %s - %s - Warning Message: '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str(), strMessage);
146 CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, addonHelper->m_addon->Name(), strMessage, 3000, true);
147 CLog::Log(LOGDEBUG, "CAddonCallbacksAddon - %s - %s - Error Message : '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str(), strMessage);
152 CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, addonHelper->m_addon->Name(), strMessage, 3000, false);
153 CLog::Log(LOGDEBUG, "CAddonCallbacksAddon - %s - %s - Info Message : '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str(), strMessage);
157 catch (std::exception &e)
159 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - exception '%s' caught in call in add-on '%s'. please contact the developer of this addon: %s",
160 __FUNCTION__, e.what(), addonHelper->m_addon->Name().c_str(), addonHelper->m_addon->Author().c_str());
164 bool CAddonCallbacksAddon::WakeOnLan(const char *mac)
166 return g_application.getNetwork().WakeOnLan(mac);
169 bool CAddonCallbacksAddon::GetAddonSetting(void *addonData, const char *strSettingName, void *settingValue)
171 CAddonCallbacks* addon = (CAddonCallbacks*) addonData;
172 if (addon == NULL || strSettingName == NULL || settingValue == NULL)
174 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - called with a null pointer", __FUNCTION__);
178 CAddonCallbacksAddon* addonHelper = addon->GetHelperAddon();
182 CLog::Log(LOGDEBUG, "CAddonCallbacksAddon - %s - add-on '%s' requests setting '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str(), strSettingName);
184 if (!addonHelper->m_addon->ReloadSettings())
186 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - could't get settings for add-on '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str());
190 const TiXmlElement *category = addonHelper->m_addon->GetSettingsXML()->FirstChildElement("category");
191 if (!category) // add a default one...
192 category = addonHelper->m_addon->GetSettingsXML();
196 const TiXmlElement *setting = category->FirstChildElement("setting");
199 const char *id = setting->Attribute("id");
200 const char *type = setting->Attribute("type");
202 if (strcmpi(id, strSettingName) == 0 && type)
204 if (strcmpi(type, "text") == 0 || strcmpi(type, "ipaddress") == 0 ||
205 strcmpi(type, "folder") == 0 || strcmpi(type, "action") == 0 ||
206 strcmpi(type, "music") == 0 || strcmpi(type, "pictures") == 0 ||
207 strcmpi(type, "folder") == 0 || strcmpi(type, "programs") == 0 ||
208 strcmpi(type, "file") == 0 || strcmpi(type, "fileenum") == 0)
210 strcpy((char*) settingValue, addonHelper->m_addon->GetSetting(id).c_str());
213 else if (strcmpi(type, "number") == 0 || strcmpi(type, "enum") == 0 ||
214 strcmpi(type, "labelenum") == 0)
216 *(int*) settingValue = (int) atoi(addonHelper->m_addon->GetSetting(id));
219 else if (strcmpi(type, "bool") == 0)
221 *(bool*) settingValue = (bool) (addonHelper->m_addon->GetSetting(id) == "true" ? true : false);
224 else if (strcmpi(type, "slider") == 0)
226 const char *option = setting->Attribute("option");
227 if (option && strcmpi(option, "int") == 0)
229 *(int*) settingValue = (int) atoi(addonHelper->m_addon->GetSetting(id));
234 *(float*) settingValue = (float) atof(addonHelper->m_addon->GetSetting(id));
239 setting = setting->NextSiblingElement("setting");
241 category = category->NextSiblingElement("category");
243 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - can't find setting '%s' in '%s'", __FUNCTION__, strSettingName, addonHelper->m_addon->Name().c_str());
245 catch (std::exception &e)
247 CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - exception '%s' caught in call in add-on '%s'. please contact the developer of this addon: %s",
248 __FUNCTION__, e.what(), addonHelper->m_addon->Name().c_str(), addonHelper->m_addon->Author().c_str());
254 char* CAddonCallbacksAddon::UnknownToUTF8(const char *strSource)
257 if (strSource != NULL)
258 g_charsetConverter.unknownToUTF8(strSource, string);
261 char* buffer = strdup(string.c_str());
265 char* CAddonCallbacksAddon::GetLocalizedString(const void* addonData, long dwCode)
267 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
268 if (!helper || g_application.m_bStop)
271 CAddonCallbacksAddon* addonHelper = helper->GetHelperAddon();
274 if (dwCode >= 30000 && dwCode <= 30999)
275 string = addonHelper->m_addon->GetString(dwCode).c_str();
276 else if (dwCode >= 32000 && dwCode <= 32999)
277 string = addonHelper->m_addon->GetString(dwCode).c_str();
279 string = g_localizeStrings.Get(dwCode).c_str();
281 char* buffer = strdup(string.c_str());
285 char* CAddonCallbacksAddon::GetDVDMenuLanguage(const void* addonData)
287 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
291 CStdString string = g_langInfo.GetDVDMenuLanguage();
293 char* buffer = strdup(string.c_str());
297 void CAddonCallbacksAddon::FreeString(const void* addonData, char* str)
302 void* CAddonCallbacksAddon::OpenFile(const void* addonData, const char* strFileName, unsigned int flags)
304 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
308 CFile* file = new CFile;
309 if (file->Open(strFileName, flags))
310 return ((void*)file);
316 void* CAddonCallbacksAddon::OpenFileForWrite(const void* addonData, const char* strFileName, bool bOverwrite)
318 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
322 CFile* file = new CFile;
323 if (file->OpenForWrite(strFileName, bOverwrite))
324 return ((void*)file);
330 unsigned int CAddonCallbacksAddon::ReadFile(const void* addonData, void* file, void* lpBuf, int64_t uiBufSize)
332 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
336 CFile* cfile = (CFile*)file;
340 return cfile->Read(lpBuf, uiBufSize);
343 bool CAddonCallbacksAddon::ReadFileString(const void* addonData, void* file, char *szLine, int iLineLength)
345 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
349 CFile* cfile = (CFile*)file;
353 return cfile->ReadString(szLine, iLineLength);
356 int CAddonCallbacksAddon::WriteFile(const void* addonData, void* file, const void* lpBuf, int64_t uiBufSize)
358 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
362 CFile* cfile = (CFile*)file;
366 return cfile->Write(lpBuf, uiBufSize);
369 void CAddonCallbacksAddon::FlushFile(const void* addonData, void* file)
371 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
375 CFile* cfile = (CFile*)file;
382 int64_t CAddonCallbacksAddon::SeekFile(const void* addonData, void* file, int64_t iFilePosition, int iWhence)
384 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
388 CFile* cfile = (CFile*)file;
392 return cfile->Seek(iFilePosition, iWhence);
395 int CAddonCallbacksAddon::TruncateFile(const void* addonData, void* file, int64_t iSize)
397 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
401 CFile* cfile = (CFile*)file;
405 return cfile->Truncate(iSize);
408 int64_t CAddonCallbacksAddon::GetFilePosition(const void* addonData, void* file)
410 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
414 CFile* cfile = (CFile*)file;
418 return cfile->GetPosition();
421 int64_t CAddonCallbacksAddon::GetFileLength(const void* addonData, void* file)
423 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
427 CFile* cfile = (CFile*)file;
431 return cfile->GetLength();
434 void CAddonCallbacksAddon::CloseFile(const void* addonData, void* file)
436 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
440 CFile* cfile = (CFile*)file;
448 int CAddonCallbacksAddon::GetFileChunkSize(const void* addonData, void* file)
450 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
454 CFile* cfile = (CFile*)file;
458 return cfile->GetChunkSize();
461 bool CAddonCallbacksAddon::FileExists(const void* addonData, const char *strFileName, bool bUseCache)
463 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
467 return CFile::Exists(strFileName, bUseCache);
470 int CAddonCallbacksAddon::StatFile(const void* addonData, const char *strFileName, struct __stat64* buffer)
472 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
476 return CFile::Stat(strFileName, buffer);
479 bool CAddonCallbacksAddon::DeleteFile(const void* addonData, const char *strFileName)
481 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
485 return CFile::Delete(strFileName);
488 bool CAddonCallbacksAddon::CanOpenDirectory(const void* addonData, const char* strURL)
490 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
495 return CDirectory::GetDirectory(strURL, items);
498 bool CAddonCallbacksAddon::CreateDirectory(const void* addonData, const char *strPath)
500 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
504 return CDirectory::Create(strPath);
507 bool CAddonCallbacksAddon::DirectoryExists(const void* addonData, const char *strPath)
509 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
513 return CDirectory::Exists(strPath);
516 bool CAddonCallbacksAddon::RemoveDirectory(const void* addonData, const char *strPath)
518 CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
523 CFileItemList fileItems;
524 CDirectory::GetDirectory(strPath, fileItems);
525 for (int i = 0; i < fileItems.Size(); ++i)
526 CFile::Delete(fileItems.Get(i)->GetPath());
528 return CDirectory::Remove(strPath);
531 }; /* namespace ADDON */