#pragma once
/*
* Copyright (C) 2005-2013 Team XBMC
* http://xbmc.org
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This Program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XBMC; see the file COPYING. If not, see
* .
*
*/
#include
#include
#include
#include
#include
#include
#include
#include "versions.h"
#if defined(BUILD_KODI_ADDON)
#include "IFileTypes.h"
#else
#include "filesystem/IFileTypes.h"
#endif
struct VFSDirEntry;
struct __stat64;
#ifdef _WIN32 // windows
#ifndef _SSIZE_T_DEFINED
typedef intptr_t ssize_t;
#define _SSIZE_T_DEFINED
#endif // !_SSIZE_T_DEFINED
#if defined(BUILD_KODI_ADDON)
#include "p8-platform/windows/dlfcn-win32.h"
#endif
#else // windows
#include // linux+osx
#endif
#ifdef LOG_DEBUG
#undef LOG_DEBUG
#endif
#ifdef LOG_INFO
#undef LOG_INFO
#endif
#ifdef LOG_NOTICE
#undef LOG_NOTICE
#endif
#ifdef LOG_ERROR
#undef LOG_ERROR
#endif
typedef void* (*KODIAddOnLib_RegisterMe)(void *addonData);
typedef void (*KODIAddOnLib_UnRegisterMe)(void *addonData, void *cbTable);
typedef void* (*KODIAudioEngineLib_RegisterMe)(void *addonData);
typedef void (*KODIAudioEngineLib_UnRegisterMe)(void *addonData, void *cbTable);
typedef void* (*KODIGUILib_RegisterMe)(void *addonData);
typedef void (*KODIGUILib_UnRegisterMe)(void *addonData, void *cbTable);
typedef void* (*KODIPVRLib_RegisterMe)(void *addonData);
typedef void (*KODIPVRLib_UnRegisterMe)(void *addonData, void *cbTable);
typedef void* (*KODIADSPLib_RegisterMe)(void *addonData);
typedef void (*KODIADSPLib_UnRegisterMe)(void *addonData, void *cbTable);
typedef void* (*KODICodecLib_RegisterMe)(void *addonData);
typedef void (*KODICodecLib_UnRegisterMe)(void *addonData, void *cbTable);
typedef void* (*KODIINPUTSTREAMLib_RegisterMe)(void *addonData);
typedef void (*KODIINPUTSTREAMLib_UnRegisterMe)(void *addonData, void *cbTable);
typedef void* (*KODIPeripheralLib_RegisterMe)(void *addonData);
typedef void (*KODIPeripheralLib_UnRegisterMe)(void *addonData, void *cbTable);
typedef void* (*KODIGameLib_RegisterMe)(void *addonData);
typedef void (*KODIGameLib_UnRegisterMe)(void *addonData, void *cbTable);
typedef struct AddonCB
{
const char* libBasePath; ///< Never, never change this!!!
void* addonData;
KODIAddOnLib_RegisterMe AddOnLib_RegisterMe;
KODIAddOnLib_UnRegisterMe AddOnLib_UnRegisterMe;
KODIAudioEngineLib_RegisterMe AudioEngineLib_RegisterMe;
KODIAudioEngineLib_UnRegisterMe AudioEngineLib_UnRegisterMe;
KODICodecLib_RegisterMe CodecLib_RegisterMe;
KODICodecLib_UnRegisterMe CodecLib_UnRegisterMe;
KODIGUILib_RegisterMe GUILib_RegisterMe;
KODIGUILib_UnRegisterMe GUILib_UnRegisterMe;
KODIPVRLib_RegisterMe PVRLib_RegisterMe;
KODIPVRLib_UnRegisterMe PVRLib_UnRegisterMe;
KODIADSPLib_RegisterMe ADSPLib_RegisterMe;
KODIADSPLib_UnRegisterMe ADSPLib_UnRegisterMe;
KODIINPUTSTREAMLib_RegisterMe INPUTSTREAMLib_RegisterMe;
KODIINPUTSTREAMLib_UnRegisterMe INPUTSTREAMLib_UnRegisterMe;
KODIPeripheralLib_RegisterMe PeripheralLib_RegisterMe;
KODIPeripheralLib_UnRegisterMe PeripheralLib_UnRegisterMe;
KODIGameLib_RegisterMe GameLib_RegisterMe;
KODIGameLib_UnRegisterMe GameLib_UnRegisterMe;
} AddonCB;
namespace ADDON
{
typedef enum addon_log
{
LOG_DEBUG,
LOG_INFO,
LOG_NOTICE,
LOG_ERROR
} addon_log_t;
typedef enum queue_msg
{
QUEUE_INFO,
QUEUE_WARNING,
QUEUE_ERROR
} queue_msg_t;
}
namespace KodiAPI
{
namespace AddOn
{
typedef struct CB_AddOn
{
void (*Log)(void *addonData, const ADDON::addon_log_t loglevel, const char *msg);
void (*QueueNotification)(void *addonData, const ADDON::queue_msg_t type, const char *msg);
bool (*WakeOnLan)(const char* mac);
bool (*GetSetting)(void *addonData, const char *settingName, void *settingValue);
char* (*TranslateSpecialProtocol)(const char *strSource);
char* (*UnknownToUTF8)(const char *sourceDest);
char* (*GetLocalizedString)(const void* addonData, long dwCode);
char* (*GetDVDMenuLanguage)(const void* addonData);
void (*FreeString)(const void* addonData, char* str);
void* (*OpenFile)(const void* addonData, const char* strFileName, unsigned int flags);
void* (*OpenFileForWrite)(const void* addonData, const char* strFileName, bool bOverWrite);
ssize_t (*ReadFile)(const void* addonData, void* file, void* lpBuf, size_t uiBufSize);
bool (*ReadFileString)(const void* addonData, void* file, char *szLine, int iLineLength);
ssize_t (*WriteFile)(const void* addonData, void* file, const void* lpBuf, size_t uiBufSize);
void (*FlushFile)(const void* addonData, void* file);
int64_t (*SeekFile)(const void* addonData, void* file, int64_t iFilePosition, int iWhence);
int (*TruncateFile)(const void* addonData, void* file, int64_t iSize);
int64_t (*GetFilePosition)(const void* addonData, void* file);
int64_t (*GetFileLength)(const void* addonData, void* file);
double (*GetFileDownloadSpeed)(const void* addonData, void* file);
void (*CloseFile)(const void* addonData, void* file);
int (*GetFileChunkSize)(const void* addonData, void* file);
bool (*FileExists)(const void* addonData, const char *strFileName, bool bUseCache);
int (*StatFile)(const void* addonData, const char *strFileName, struct __stat64* buffer);
bool (*DeleteFile)(const void* addonData, const char *strFileName);
bool (*CanOpenDirectory)(const void* addonData, const char* strURL);
bool (*CreateDirectory)(const void* addonData, const char *strPath);
bool (*DirectoryExists)(const void* addonData, const char *strPath);
bool (*RemoveDirectory)(const void* addonData, const char *strPath);
bool (*GetDirectory)(const void* addonData, const char *strPath, const char* mask, VFSDirEntry** items, unsigned int* num_items);
void (*FreeDirectory)(const void* addonData, VFSDirEntry* items, unsigned int num_items);
void* (*CURLCreate)(const void* addonData, const char* strURL);
bool (*CURLAddOption)(const void* addonData, void* file, XFILE::CURLOPTIONTYPE type, const char* name, const char * value);
bool (*CURLOpen)(const void* addonData, void* file, unsigned int flags);
} CB_AddOnLib;
} /* namespace AddOn */
} /* namespace KodiAPI */
namespace ADDON
{
class CHelper_libXBMC_addon
{
public:
CHelper_libXBMC_addon()
{
m_Handle = nullptr;
m_Callbacks = nullptr;
}
~CHelper_libXBMC_addon()
{
if (m_Handle && m_Callbacks)
{
m_Handle->AddOnLib_UnRegisterMe(m_Handle->addonData, m_Callbacks);
}
}
bool RegisterMe(void *handle)
{
m_Handle = static_cast(handle);
if (m_Handle)
m_Callbacks = (KodiAPI::AddOn::CB_AddOnLib*)m_Handle->AddOnLib_RegisterMe(m_Handle->addonData);
if (!m_Callbacks)
fprintf(stderr, "libXBMC_addon-ERROR: AddOnLib_RegisterMe can't get callback table from Kodi !!!\n");
return m_Callbacks != nullptr;
}
/*!
* @brief Add a message to XBMC's log.
* @param loglevel The log level of the message.
* @param format The format of the message to pass to XBMC.
*/
void Log(const addon_log_t loglevel, const char *format, ... )
{
char buffer[16384];
va_list args;
va_start (args, format);
vsprintf (buffer, format, args);
va_end (args);
m_Callbacks->Log(m_Handle->addonData, loglevel, buffer);
}
/*!
* @brief Get a settings value for this add-on.
* @param settingName The name of the setting to get.
* @param settingValue The value.
* @return True if the settings was fetched successfully, false otherwise.
*/
bool GetSetting(const char* settingName, void *settingValue)
{
return m_Callbacks->GetSetting(m_Handle->addonData, settingName, settingValue);
}
/*!
* @brief Translates a special protocol folder.
* @param source The file / folder to translate.
* @return The string translated to resolved path. Must be freed by calling FreeString() when done.
*/
char *TranslateSpecialProtocol(const char *source)
{
return m_Callbacks->TranslateSpecialProtocol(source);
}
/*!
* @brief Queue a notification in the GUI.
* @param type The message type.
* @param format The format of the message to pass to display in XBMC.
*/
void QueueNotification(const queue_msg_t type, const char *format, ... )
{
char buffer[16384];
va_list args;
va_start (args, format);
vsprintf (buffer, format, args);
va_end (args);
m_Callbacks->QueueNotification(m_Handle->addonData, type, buffer);
}
/*!
* @brief Send WakeOnLan magic packet.
* @param mac Network address of the host to wake.
* @return True if the magic packet was successfully sent, false otherwise.
*/
bool WakeOnLan(const char* mac)
{
return m_Callbacks->WakeOnLan(mac);
}
/*!
* @brief Translate a string with an unknown encoding to UTF8.
* @param str The string to translate.
* @return The string translated to UTF8. Must be freed by calling FreeString() when done.
*/
char* UnknownToUTF8(const char* str)
{
return m_Callbacks->UnknownToUTF8(str);
}
/*!
* @brief Get a localised message.
* @param dwCode The code of the message to get.
* @return The message. Must be freed by calling FreeString() when done.
*/
char* GetLocalizedString(int dwCode)
{
return m_Callbacks->GetLocalizedString(m_Handle->addonData, dwCode);
}
/*!
* @brief Get the DVD menu language.
* @return The language. Must be freed by calling FreeString() when done.
*/
char* GetDVDMenuLanguage()
{
return m_Callbacks->GetDVDMenuLanguage(m_Handle->addonData);
}
/*!
* @brief Free the memory used by str
* @param str The string to free
*/
void FreeString(char* str)
{
m_Callbacks->FreeString(m_Handle->addonData, str);
}
/*!
* @brief Open the file with filename via XBMC's CFile. Needs to be closed by calling CloseFile() when done.
* @param strFileName The filename to open.
* @param flags The flags to pass. Documented in XBMC's File.h
* @return A handle for the file, or NULL if it couldn't be opened.
*/
void* OpenFile(const char* strFileName, unsigned int flags)
{
return m_Callbacks->OpenFile(m_Handle->addonData, strFileName, flags);
}
/*!
* @brief Open the file with filename via XBMC's CFile in write mode. Needs to be closed by calling CloseFile() when done.
* @param strFileName The filename to open.
* @param bOverWrite True to overwrite, false otherwise.
* @return A handle for the file, or NULL if it couldn't be opened.
*/
void* OpenFileForWrite(const char* strFileName, bool bOverWrite)
{
return m_Callbacks->OpenFileForWrite(m_Handle->addonData, strFileName, bOverWrite);
}
/*!
* @brief Read from an open file.
* @param file The file handle to read from.
* @param lpBuf The buffer to store the data in.
* @param uiBufSize The size of the buffer.
* @return number of successfully read bytes if any bytes were read and stored in
* buffer, zero if no bytes are available to read (end of file was reached)
* or undetectable error occur, -1 in case of any explicit error
*/
ssize_t ReadFile(void* file, void* lpBuf, size_t uiBufSize)
{
return m_Callbacks->ReadFile(m_Handle->addonData, file, lpBuf, uiBufSize);
}
/*!
* @brief Read a string from an open file.
* @param file The file handle to read from.
* @param szLine The buffer to store the data in.
* @param iLineLength The size of the buffer.
* @return True when a line was read, false otherwise.
*/
bool ReadFileString(void* file, char *szLine, int iLineLength)
{
return m_Callbacks->ReadFileString(m_Handle->addonData, file, szLine, iLineLength);
}
/*!
* @brief Write to a file opened in write mode.
* @param file The file handle to write to.
* @param lpBuf The data to write.
* @param uiBufSize Size of the data to write.
* @return number of successfully written bytes if any bytes were written,
* zero if no bytes were written and no detectable error occur,
* -1 in case of any explicit error
*/
ssize_t WriteFile(void* file, const void* lpBuf, size_t uiBufSize)
{
return m_Callbacks->WriteFile(m_Handle->addonData, file, lpBuf, uiBufSize);
}
/*!
* @brief Flush buffered data.
* @param file The file handle to flush the data for.
*/
void FlushFile(void* file)
{
m_Callbacks->FlushFile(m_Handle->addonData, file);
}
/*!
* @brief Seek in an open file.
* @param file The file handle to see in.
* @param iFilePosition The new position.
* @param iWhence Seek argument. See stdio.h for possible values.
* @return The new position.
*/
int64_t SeekFile(void* file, int64_t iFilePosition, int iWhence)
{
return m_Callbacks->SeekFile(m_Handle->addonData, file, iFilePosition, iWhence);
}
/*!
* @brief Truncate a file to the requested size.
* @param file The file handle to truncate.
* @param iSize The new max size.
* @return New size?
*/
int TruncateFile(void* file, int64_t iSize)
{
return m_Callbacks->TruncateFile(m_Handle->addonData, file, iSize);
}
/*!
* @brief The current position in an open file.
* @param file The file handle to get the position for.
* @return The requested position.
*/
int64_t GetFilePosition(void* file)
{
return m_Callbacks->GetFilePosition(m_Handle->addonData, file);
}
/*!
* @brief Get the file size of an open file.
* @param file The file to get the size for.
* @return The requested size.
*/
int64_t GetFileLength(void* file)
{
return m_Callbacks->GetFileLength(m_Handle->addonData, file);
}
/*!
* @brief Get the download speed of an open file if available.
* @param file The file to get the size for.
* @return The download speed in seconds.
*/
double GetFileDownloadSpeed(void* file)
{
return m_Callbacks->GetFileDownloadSpeed(m_Handle->addonData, file);
}
/*!
* @brief Close an open file.
* @param file The file handle to close.
*/
void CloseFile(void* file)
{
m_Callbacks->CloseFile(m_Handle->addonData, file);
}
/*!
* @brief Get the chunk size for an open file.
* @param file the file handle to get the size for.
* @return The requested size.
*/
int GetFileChunkSize(void* file)
{
return m_Callbacks->GetFileChunkSize(m_Handle->addonData, file);
}
/*!
* @brief Check if a file exists.
* @param strFileName The filename to check.
* @param bUseCache Check in file cache.
* @return true if the file exists false otherwise.
*/
bool FileExists(const char *strFileName, bool bUseCache)
{
return m_Callbacks->FileExists(m_Handle->addonData, strFileName, bUseCache);
}
/*!
* @brief Reads file status.
* @param strFileName The filename to read the status from.
* @param buffer The file status is written into this buffer.
* @return The file status was successfully read.
*/
int StatFile(const char *strFileName, struct __stat64* buffer)
{
return m_Callbacks->StatFile(m_Handle->addonData, strFileName, buffer);
}
/*!
* @brief Deletes a file.
* @param strFileName The filename to delete.
* @return The file was successfully deleted.
*/
bool DeleteFile(const char *strFileName)
{
return m_Callbacks->DeleteFile(m_Handle->addonData, strFileName);
}
/*!
* @brief Checks whether a directory can be opened.
* @param strUrl The URL of the directory to check.
* @return True when it can be opened, false otherwise.
*/
bool CanOpenDirectory(const char* strUrl)
{
return m_Callbacks->CanOpenDirectory(m_Handle->addonData, strUrl);
}
/*!
* @brief Creates a directory.
* @param strPath Path to the directory.
* @return True when it was created, false otherwise.
*/
bool CreateDirectory(const char *strPath)
{
return m_Callbacks->CreateDirectory(m_Handle->addonData, strPath);
}
/*!
* @brief Checks if a directory exists.
* @param strPath Path to the directory.
* @return True when it exists, false otherwise.
*/
bool DirectoryExists(const char *strPath)
{
return m_Callbacks->DirectoryExists(m_Handle->addonData, strPath);
}
/*!
* @brief Removes a directory.
* @param strPath Path to the directory.
* @return True when it was removed, false otherwise.
*/
bool RemoveDirectory(const char *strPath)
{
return m_Callbacks->RemoveDirectory(m_Handle->addonData, strPath);
}
/*!
* @brief Lists a directory.
* @param strPath Path to the directory.
* @param mask File mask
* @param items The directory entries
* @param num_items Number of entries in directory
* @return True if listing was successful, false otherwise.
*/
bool GetDirectory(const char *strPath, const char* mask, VFSDirEntry** items, unsigned int* num_items)
{
return m_Callbacks->GetDirectory(m_Handle->addonData, strPath, mask, items, num_items);
}
/*!
* @brief Free a directory list
* @param items The directory entries
* @param num_items Number of entries in directory
*/
void FreeDirectory(VFSDirEntry* items, unsigned int num_items)
{
m_Callbacks->FreeDirectory(m_Handle->addonData, items, num_items);
}
/*!
* @brief Create a Curl representation
* @param strURL the URL of the Type.
*/
void* CURLCreate(const char* strURL)
{
return m_Callbacks->CURLCreate(m_Handle->addonData, strURL);
}
/*!
* @brief Adds options to the curl file created with CURLCeate
* @param file file pointer to the file returned by CURLCeate
* @param type option type to set
* @param name name of the option
* @param value value of the option
*/
bool CURLAddOption(void* file, XFILE::CURLOPTIONTYPE type, const char* name, const char * value)
{
return m_Callbacks->CURLAddOption(m_Handle->addonData, file, type, name, value);
}
/*!
* @brief Opens the curl file created with CURLCeate
* @param file file pointer to the file returned by CURLCeate
* @param flags one or more bitwise or combinded flags form XFILE
*/
bool CURLOpen(void* file, unsigned int flags)
{
return m_Callbacks->CURLOpen(m_Handle->addonData, file, flags);
}
private:
AddonCB* m_Handle;
KodiAPI::AddOn::CB_AddOnLib *m_Callbacks;
};
};