#pragma once
/*
* Copyright (C) 2005-2010 Team XBMC
* http://www.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
#ifdef _WIN32 // windows
#include "dlfcn-win32.h"
#define ADDON_DLL "\\library.xbmc.addon\\libXBMC_addon" ADDON_HELPER_EXT
#define ADDON_HELPER_EXT ".dll"
#else
#if defined(__APPLE__) // osx
#if defined(__POWERPC__)
#define ADDON_HELPER_ARCH "powerpc-osx"
#elif defined(__arm__)
#define ADDON_HELPER_ARCH "arm-osx"
#elif defined(__x86_64__)
#define ADDON_HELPER_ARCH "x86-osx"
#else
#define ADDON_HELPER_ARCH "x86-osx"
#endif
#else // linux
#if defined(__x86_64__)
#define ADDON_HELPER_ARCH "x86_64-linux"
#elif defined(_POWERPC)
#define ADDON_HELPER_ARCH "powerpc-linux"
#elif defined(_POWERPC64)
#define ADDON_HELPER_ARCH "powerpc64-linux"
#elif defined(__ARMEL__)
#define ADDON_HELPER_ARCH "arm"
#elif defined(_MIPSEL)
#define ADDON_HELPER_ARCH "mipsel-linux"
#else
#define ADDON_HELPER_ARCH "i486-linux"
#endif
#endif
#include // linux+osx
#define ADDON_HELPER_EXT ".so"
#define ADDON_DLL "/library.xbmc.addon/libXBMC_addon-" ADDON_HELPER_ARCH ADDON_HELPER_EXT
#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
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;
class CHelper_libXBMC_addon
{
public:
CHelper_libXBMC_addon()
{
m_libXBMC_addon = NULL;
m_Handle = NULL;
}
~CHelper_libXBMC_addon()
{
if (m_libXBMC_addon)
{
XBMC_unregister_me();
dlclose(m_libXBMC_addon);
}
}
bool RegisterMe(void *Handle)
{
m_Handle = Handle;
std::string libBasePath;
libBasePath = ((cb_array*)m_Handle)->libPath;
libBasePath += ADDON_DLL;
m_libXBMC_addon = dlopen(libBasePath.c_str(), RTLD_LAZY);
if (m_libXBMC_addon == NULL)
{
fprintf(stderr, "Unable to load %s\n", dlerror());
return false;
}
XBMC_register_me = (int (*)(void *HANDLE))
dlsym(m_libXBMC_addon, "XBMC_register_me");
if (XBMC_register_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
XBMC_unregister_me = (void (*)())
dlsym(m_libXBMC_addon, "XBMC_unregister_me");
if (XBMC_unregister_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
Log = (void (*)(const addon_log_t loglevel, const char *format, ... ))
dlsym(m_libXBMC_addon, "XBMC_log");
if (Log == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GetSetting = (bool (*)(const char* settingName, void *settingValue))
dlsym(m_libXBMC_addon, "XBMC_get_setting");
if (GetSetting == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
QueueNotification = (void (*)(const queue_msg_t loglevel, const char *format, ... ))
dlsym(m_libXBMC_addon, "XBMC_queue_notification");
if (QueueNotification == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
UnknownToUTF8 = (void (*)(std::string &str))
dlsym(m_libXBMC_addon, "XBMC_unknown_to_utf8");
if (UnknownToUTF8 == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GetLocalizedString = (const char* (*)(int dwCode))
dlsym(m_libXBMC_addon, "XBMC_get_localized_string");
if (GetLocalizedString == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GetDVDMenuLanguage = (const char* (*)())
dlsym(m_libXBMC_addon, "XBMC_get_dvd_menu_language");
if (GetDVDMenuLanguage == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
OpenFile = (void* (*)(const char* strFileName, unsigned int flags))
dlsym(m_libXBMC_addon, "XBMC_open_file");
if (OpenFile == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
OpenFileForWrite = (void* (*)(const char* strFileName, bool bOverWrite))
dlsym(m_libXBMC_addon, "XBMC_open_file_for_write");
if (OpenFileForWrite == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
ReadFile = (unsigned int (*)(void* file, void* lpBuf, int64_t uiBufSize))
dlsym(m_libXBMC_addon, "XBMC_read_file");
if (ReadFile == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
ReadFileString = (bool (*)(void* file, char *szLine, int iLineLength))
dlsym(m_libXBMC_addon, "XBMC_read_file_string");
if (ReadFileString == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
WriteFile = (int (*)(void* file, const void* lpBuf, int64_t uiBufSize))
dlsym(m_libXBMC_addon, "XBMC_write_file");
if (WriteFile == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
FlushFile = (void (*)(void* file))
dlsym(m_libXBMC_addon, "XBMC_flush_file");
if (FlushFile == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
SeekFile = (int64_t (*)(void* file, int64_t iFilePosition, int iWhence))
dlsym(m_libXBMC_addon, "XBMC_seek_file");
if (SeekFile == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
TruncateFile = (int (*)(void* file, int64_t iSize))
dlsym(m_libXBMC_addon, "XBMC_truncate_file");
if (TruncateFile == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GetFilePosition = (int64_t (*)(void* file))
dlsym(m_libXBMC_addon, "XBMC_get_file_position");
if (GetFilePosition == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GetFileLength = (int64_t (*)(void* file))
dlsym(m_libXBMC_addon, "XBMC_get_file_length");
if (GetFileLength == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
CloseFile = (void (*)(void* file))
dlsym(m_libXBMC_addon, "XBMC_close_file");
if (CloseFile == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GetFileChunkSize = (int (*)(void* file))
dlsym(m_libXBMC_addon, "XBMC_get_file_chunk_size");
if (GetFileChunkSize == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
CanOpenDirectory = (bool (*)(const char* strURL))
dlsym(m_libXBMC_addon, "XBMC_can_open_directory");
if (CanOpenDirectory == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
return XBMC_register_me(m_Handle) > 0;
}
/*!
* @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, ... );
/*!
* @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);
/*!
* @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, ... );
/*!
* @brief Translate a string with an unknown encoding to UTF8.
* @param sourceDest The string to translate.
*/
void (*UnknownToUTF8)(std::string &str);
/*!
* @brief Get a localised message.
* @param dwCode The code of the message to get.
* @return The message. Needs to be freed when done.
*/
const char* (*GetLocalizedString)(int dwCode);
/*!
* @brief Get the DVD menu language.
* @return The language. Needs to be freed when done.
*/
const char* (*GetDVDMenuLanguage)();
/*!
* @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);
/*!
* @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);
/*!
* @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 bytes read.
*/
unsigned int (*ReadFile)(void* file, void* lpBuf, int64_t 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);
/*!
* @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 The number of bytes read.
*/
int (*WriteFile)(void* file, const void* lpBuf, int64_t uiBufSize);
/*!
* @brief Flush buffered data.
* @param file The file handle to flush the data for.
*/
void (*FlushFile)(void* 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);
/*!
* @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);
/*!
* @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);
/*!
* @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);
/*!
* @brief Close an open file.
* @param file The file handle to close.
*/
void (*CloseFile)(void* 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);
/*!
* @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);
protected:
int (*XBMC_register_me)(void *HANDLE);
void (*XBMC_unregister_me)();
private:
void *m_libXBMC_addon;
void *m_Handle;
struct cb_array
{
const char* libPath;
};
};
};