#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 "libXBMC_addon.h"
typedef void* GUIHANDLE;
#ifdef _WIN32
#define GUI_HELPER_DLL "\\library.xbmc.gui\\libXBMC_gui" ADDON_HELPER_EXT
#else
#define GUI_HELPER_DLL_NAME "libXBMC_gui-" ADDON_HELPER_ARCH ADDON_HELPER_EXT
#define GUI_HELPER_DLL "/library.xbmc.gui/" GUI_HELPER_DLL_NAME
#endif
/* current ADDONGUI API version */
#define XBMC_GUI_API_VERSION "5.3.0"
/* min. ADDONGUI API version */
#define XBMC_GUI_MIN_API_VERSION "5.3.0"
#define ADDON_ACTION_PREVIOUS_MENU 10
#define ADDON_ACTION_CLOSE_DIALOG 51
class CAddonGUIWindow;
class CAddonGUISpinControl;
class CAddonGUIRadioButton;
class CAddonGUIProgressControl;
class CAddonListItem;
class CAddonGUIRenderingControl;
class CHelper_libXBMC_gui
{
public:
CHelper_libXBMC_gui()
{
m_libXBMC_gui = NULL;
m_Handle = NULL;
}
~CHelper_libXBMC_gui()
{
if (m_libXBMC_gui)
{
GUI_unregister_me(m_Handle, m_Callbacks);
dlclose(m_libXBMC_gui);
}
}
bool RegisterMe(void *Handle)
{
m_Handle = Handle;
std::string libBasePath;
libBasePath = ((cb_array*)m_Handle)->libPath;
libBasePath += GUI_HELPER_DLL;
#if defined(ANDROID)
struct stat st;
if(stat(libBasePath.c_str(),&st) != 0)
{
std::string tempbin = getenv("XBMC_ANDROID_LIBS");
libBasePath = tempbin + "/" + GUI_HELPER_DLL_NAME;
}
#endif
m_libXBMC_gui = dlopen(libBasePath.c_str(), RTLD_LAZY);
if (m_libXBMC_gui == NULL)
{
fprintf(stderr, "Unable to load %s\n", dlerror());
return false;
}
GUI_register_me = (void* (*)(void *HANDLE))
dlsym(m_libXBMC_gui, "GUI_register_me");
if (GUI_register_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_unregister_me = (void (*)(void *HANDLE, void *CB))
dlsym(m_libXBMC_gui, "GUI_unregister_me");
if (GUI_unregister_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_lock = (void (*)(void *HANDLE, void *CB))
dlsym(m_libXBMC_gui, "GUI_lock");
if (GUI_lock == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_unlock = (void (*)(void *HANDLE, void *CB))
dlsym(m_libXBMC_gui, "GUI_unlock");
if (GUI_unlock == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_get_screen_height = (int (*)(void *HANDLE, void *CB))
dlsym(m_libXBMC_gui, "GUI_get_screen_height");
if (GUI_get_screen_height == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_get_screen_width = (int (*)(void *HANDLE, void *CB))
dlsym(m_libXBMC_gui, "GUI_get_screen_width");
if (GUI_get_screen_width == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_get_video_resolution = (int (*)(void *HANDLE, void *CB))
dlsym(m_libXBMC_gui, "GUI_get_video_resolution");
if (GUI_get_video_resolution == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_Window_create = (CAddonGUIWindow* (*)(void *HANDLE, void *CB, const char *xmlFilename, const char *defaultSkin, bool forceFallback, bool asDialog))
dlsym(m_libXBMC_gui, "GUI_Window_create");
if (GUI_Window_create == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_Window_destroy = (void (*)(CAddonGUIWindow* p))
dlsym(m_libXBMC_gui, "GUI_Window_destroy");
if (GUI_Window_destroy == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_control_get_spin = (CAddonGUISpinControl* (*)(void *HANDLE, void *CB, CAddonGUIWindow *window, int controlId))
dlsym(m_libXBMC_gui, "GUI_control_get_spin");
if (GUI_control_get_spin == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_control_release_spin = (void (*)(CAddonGUISpinControl* p))
dlsym(m_libXBMC_gui, "GUI_control_release_spin");
if (GUI_control_release_spin == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_control_get_radiobutton = (CAddonGUIRadioButton* (*)(void *HANDLE, void *CB, CAddonGUIWindow *window, int controlId))
dlsym(m_libXBMC_gui, "GUI_control_get_radiobutton");
if (GUI_control_get_radiobutton == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_control_release_radiobutton = (void (*)(CAddonGUIRadioButton* p))
dlsym(m_libXBMC_gui, "GUI_control_release_radiobutton");
if (GUI_control_release_radiobutton == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_control_get_progress = (CAddonGUIProgressControl* (*)(void *HANDLE, void *CB, CAddonGUIWindow *window, int controlId))
dlsym(m_libXBMC_gui, "GUI_control_get_progress");
if (GUI_control_get_progress == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_control_release_progress = (void (*)(CAddonGUIProgressControl* p))
dlsym(m_libXBMC_gui, "GUI_control_release_progress");
if (GUI_control_release_progress == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_ListItem_create = (CAddonListItem* (*)(void *HANDLE, void *CB, const char *label, const char *label2, const char *iconImage, const char *thumbnailImage, const char *path))
dlsym(m_libXBMC_gui, "GUI_ListItem_create");
if (GUI_ListItem_create == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_ListItem_destroy = (void (*)(CAddonListItem* p))
dlsym(m_libXBMC_gui, "GUI_ListItem_destroy");
if (GUI_ListItem_destroy == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_control_get_rendering = (CAddonGUIRenderingControl* (*)(void *HANDLE, void *CB, CAddonGUIWindow *window, int controlId))
dlsym(m_libXBMC_gui, "GUI_control_get_rendering");
if (GUI_control_get_rendering == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
GUI_control_release_rendering = (void (*)(CAddonGUIRenderingControl* p))
dlsym(m_libXBMC_gui, "GUI_control_release_rendering");
if (GUI_control_release_rendering == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
m_Callbacks = GUI_register_me(m_Handle);
return m_Callbacks != NULL;
}
void Lock()
{
return GUI_lock(m_Handle, m_Callbacks);
}
void Unlock()
{
return GUI_unlock(m_Handle, m_Callbacks);
}
int GetScreenHeight()
{
return GUI_get_screen_height(m_Handle, m_Callbacks);
}
int GetScreenWidth()
{
return GUI_get_screen_width(m_Handle, m_Callbacks);
}
int GetVideoResolution()
{
return GUI_get_video_resolution(m_Handle, m_Callbacks);
}
CAddonGUIWindow* Window_create(const char *xmlFilename, const char *defaultSkin, bool forceFallback, bool asDialog)
{
return GUI_Window_create(m_Handle, m_Callbacks, xmlFilename, defaultSkin, forceFallback, asDialog);
}
void Window_destroy(CAddonGUIWindow* p)
{
return GUI_Window_destroy(p);
}
CAddonGUISpinControl* Control_getSpin(CAddonGUIWindow *window, int controlId)
{
return GUI_control_get_spin(m_Handle, m_Callbacks, window, controlId);
}
void Control_releaseSpin(CAddonGUISpinControl* p)
{
return GUI_control_release_spin(p);
}
CAddonGUIRadioButton* Control_getRadioButton(CAddonGUIWindow *window, int controlId)
{
return GUI_control_get_radiobutton(m_Handle, m_Callbacks, window, controlId);
}
void Control_releaseRadioButton(CAddonGUIRadioButton* p)
{
return GUI_control_release_radiobutton(p);
}
CAddonGUIProgressControl* Control_getProgress(CAddonGUIWindow *window, int controlId)
{
return GUI_control_get_progress(m_Handle, m_Callbacks, window, controlId);
}
void Control_releaseProgress(CAddonGUIProgressControl* p)
{
return GUI_control_release_progress(p);
}
CAddonListItem* ListItem_create(const char *label, const char *label2, const char *iconImage, const char *thumbnailImage, const char *path)
{
return GUI_ListItem_create(m_Handle, m_Callbacks, label, label2, iconImage, thumbnailImage, path);
}
void ListItem_destroy(CAddonListItem* p)
{
return GUI_ListItem_destroy(p);
}
CAddonGUIRenderingControl* Control_getRendering(CAddonGUIWindow *window, int controlId)
{
return GUI_control_get_rendering(m_Handle, m_Callbacks, window, controlId);
}
void Control_releaseRendering(CAddonGUIRenderingControl* p)
{
return GUI_control_release_rendering(p);
}
protected:
void* (*GUI_register_me)(void *HANDLE);
void (*GUI_unregister_me)(void *HANDLE, void* CB);
void (*GUI_lock)(void *HANDLE, void* CB);
void (*GUI_unlock)(void *HANDLE, void* CB);
int (*GUI_get_screen_height)(void *HANDLE, void* CB);
int (*GUI_get_screen_width)(void *HANDLE, void* CB);
int (*GUI_get_video_resolution)(void *HANDLE, void* CB);
CAddonGUIWindow* (*GUI_Window_create)(void *HANDLE, void* CB, const char *xmlFilename, const char *defaultSkin, bool forceFallback, bool asDialog);
void (*GUI_Window_destroy)(CAddonGUIWindow* p);
CAddonGUISpinControl* (*GUI_control_get_spin)(void *HANDLE, void* CB, CAddonGUIWindow *window, int controlId);
void (*GUI_control_release_spin)(CAddonGUISpinControl* p);
CAddonGUIRadioButton* (*GUI_control_get_radiobutton)(void *HANDLE, void* CB, CAddonGUIWindow *window, int controlId);
void (*GUI_control_release_radiobutton)(CAddonGUIRadioButton* p);
CAddonGUIProgressControl* (*GUI_control_get_progress)(void *HANDLE, void* CB, CAddonGUIWindow *window, int controlId);
void (*GUI_control_release_progress)(CAddonGUIProgressControl* p);
CAddonListItem* (*GUI_ListItem_create)(void *HANDLE, void* CB, const char *label, const char *label2, const char *iconImage, const char *thumbnailImage, const char *path);
void (*GUI_ListItem_destroy)(CAddonListItem* p);
CAddonGUIRenderingControl* (*GUI_control_get_rendering)(void *HANDLE, void* CB, CAddonGUIWindow *window, int controlId);
void (*GUI_control_release_rendering)(CAddonGUIRenderingControl* p);
private:
void *m_libXBMC_gui;
void *m_Handle;
void *m_Callbacks;
struct cb_array
{
const char* libPath;
};
};
class CAddonGUISpinControl
{
public:
CAddonGUISpinControl(void *hdl, void *cb, CAddonGUIWindow *window, int controlId);
virtual ~CAddonGUISpinControl(void) {}
virtual void SetVisible(bool yesNo);
virtual void SetText(const char *label);
virtual void Clear();
virtual void AddLabel(const char *label, int iValue);
virtual int GetValue();
virtual void SetValue(int iValue);
private:
CAddonGUIWindow *m_Window;
int m_ControlId;
GUIHANDLE m_SpinHandle;
void *m_Handle;
void *m_cb;
};
class CAddonGUIRadioButton
{
public:
CAddonGUIRadioButton(void *hdl, void *cb, CAddonGUIWindow *window, int controlId);
virtual ~CAddonGUIRadioButton() {}
virtual void SetVisible(bool yesNo);
virtual void SetText(const char *label);
virtual void SetSelected(bool yesNo);
virtual bool IsSelected();
private:
CAddonGUIWindow *m_Window;
int m_ControlId;
GUIHANDLE m_ButtonHandle;
void *m_Handle;
void *m_cb;
};
class CAddonGUIProgressControl
{
public:
CAddonGUIProgressControl(void *hdl, void *cb, CAddonGUIWindow *window, int controlId);
virtual ~CAddonGUIProgressControl(void) {}
virtual void SetPercentage(float fPercent);
virtual float GetPercentage() const;
virtual void SetInfo(int iInfo);
virtual int GetInfo() const;
virtual std::string GetDescription() const;
private:
CAddonGUIWindow *m_Window;
int m_ControlId;
GUIHANDLE m_ProgressHandle;
void *m_Handle;
void *m_cb;
};
class CAddonListItem
{
friend class CAddonGUIWindow;
public:
CAddonListItem(void *hdl, void *cb, const char *label, const char *label2, const char *iconImage, const char *thumbnailImage, const char *path);
virtual ~CAddonListItem(void) {}
virtual const char *GetLabel();
virtual void SetLabel(const char *label);
virtual const char *GetLabel2();
virtual void SetLabel2(const char *label);
virtual void SetIconImage(const char *image);
virtual void SetThumbnailImage(const char *image);
virtual void SetInfo(const char *Info);
virtual void SetProperty(const char *key, const char *value);
virtual const char *GetProperty(const char *key) const;
virtual void SetPath(const char *Path);
// {(char*)"select();
// {(char*)"isSelected();
protected:
GUIHANDLE m_ListItemHandle;
void *m_Handle;
void *m_cb;
};
class CAddonGUIWindow
{
friend class CAddonGUISpinControl;
friend class CAddonGUIRadioButton;
friend class CAddonGUIProgressControl;
friend class CAddonGUIRenderingControl;
public:
CAddonGUIWindow(void *hdl, void *cb, const char *xmlFilename, const char *defaultSkin, bool forceFallback, bool asDialog);
virtual ~CAddonGUIWindow();
virtual bool Show();
virtual void Close();
virtual void DoModal();
virtual bool SetFocusId(int iControlId);
virtual int GetFocusId();
virtual bool SetCoordinateResolution(int res);
virtual void SetProperty(const char *key, const char *value);
virtual void SetPropertyInt(const char *key, int value);
virtual void SetPropertyBool(const char *key, bool value);
virtual void SetPropertyDouble(const char *key, double value);
virtual const char *GetProperty(const char *key) const;
virtual int GetPropertyInt(const char *key) const;
virtual bool GetPropertyBool(const char *key) const;
virtual double GetPropertyDouble(const char *key) const;
virtual void ClearProperties();
virtual int GetListSize();
virtual void ClearList();
virtual GUIHANDLE AddStringItem(const char *name, int itemPosition = -1);
virtual void AddItem(GUIHANDLE item, int itemPosition = -1);
virtual void AddItem(CAddonListItem *item, int itemPosition = -1);
virtual void RemoveItem(int itemPosition);
virtual GUIHANDLE GetListItem(int listPos);
virtual void SetCurrentListPosition(int listPos);
virtual int GetCurrentListPosition();
virtual void SetControlLabel(int controlId, const char *label);
virtual void MarkDirtyRegion();
virtual bool OnClick(int controlId);
virtual bool OnFocus(int controlId);
virtual bool OnInit();
virtual bool OnAction(int actionId);
GUIHANDLE m_cbhdl;
bool (*CBOnInit)(GUIHANDLE cbhdl);
bool (*CBOnFocus)(GUIHANDLE cbhdl, int controlId);
bool (*CBOnClick)(GUIHANDLE cbhdl, int controlId);
bool (*CBOnAction)(GUIHANDLE cbhdl, int actionId);
protected:
GUIHANDLE m_WindowHandle;
void *m_Handle;
void *m_cb;
};
class CAddonGUIRenderingControl
{
public:
CAddonGUIRenderingControl(void *hdl, void *cb, CAddonGUIWindow *window, int controlId);
virtual ~CAddonGUIRenderingControl();
virtual void Init();
virtual bool Create(int x, int y, int w, int h, void *device);
virtual void Render();
virtual void Stop();
virtual bool Dirty();
GUIHANDLE m_cbhdl;
bool (*CBCreate)(GUIHANDLE cbhdl, int x, int y, int w, int h, void *device);
void (*CBRender)(GUIHANDLE cbhdl);
void (*CBStop)(GUIHANDLE cbhdl);
bool (*CBDirty)(GUIHANDLE cbhdl);
private:
CAddonGUIWindow *m_Window;
int m_ControlId;
GUIHANDLE m_RenderingHandle;
void *m_Handle;
void *m_cb;
};