[pvr] added FreeString()
authorLars Op den Kamp <lars@opdenkamp.eu>
Fri, 9 Nov 2012 00:29:12 +0000 (01:29 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Sat, 10 Nov 2012 00:15:07 +0000 (01:15 +0100)
addons/library.xbmc.addon/libXBMC_addon.h
lib/addons/library.xbmc.addon/libXBMC_addon.cpp
xbmc/addons/AddonCallbacks.h
xbmc/addons/AddonCallbacksAddon.cpp
xbmc/addons/AddonCallbacksAddon.h

index 42fcee2..f805263 100644 (file)
@@ -166,6 +166,10 @@ namespace ADDON
         dlsym(m_libXBMC_addon, "XBMC_get_localized_string");
       if (XBMC_get_localized_string == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
 
+      XBMC_free_string = (void (*)(void* HANDLE, void* CB, char* str))
+        dlsym(m_libXBMC_addon, "XBMC_free_string");
+      if (XBMC_free_string == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
+
       XBMC_get_dvd_menu_language = (char* (*)(void* HANDLE, void* CB))
         dlsym(m_libXBMC_addon, "XBMC_get_dvd_menu_language");
       if (XBMC_get_dvd_menu_language == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
@@ -294,7 +298,7 @@ namespace ADDON
     /*!
      * @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 when done.
+     * @return The string translated to UTF8. Must be freed by calling FreeString() when done.
      */
     char* UnknownToUTF8(const char* str)
     {
@@ -304,7 +308,7 @@ namespace ADDON
     /*!
      * @brief Get a localised message.
      * @param dwCode The code of the message to get.
-     * @return The message. Needs to be freed when done.
+     * @return The message. Must be freed by calling FreeString() when done.
      */
     char* GetLocalizedString(int dwCode)
     {
@@ -314,7 +318,7 @@ namespace ADDON
 
     /*!
      * @brief Get the DVD menu language.
-     * @return The language. Needs to be freed when done.
+     * @return The language. Must be freed by calling FreeString() when done.
      */
     char* GetDVDMenuLanguage()
     {
@@ -322,6 +326,15 @@ namespace ADDON
     }
 
     /*!
+     * @brief Free the memory used by str
+     * @param str The string to free
+     */
+    void FreeString(char* str)
+    {
+      return XBMC_free_string(m_Handle, m_Callbacks, 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
@@ -531,6 +544,7 @@ namespace ADDON
     char* (*XBMC_unknown_to_utf8)(void *HANDLE, void* CB, const char* str);
     char* (*XBMC_get_localized_string)(void *HANDLE, void* CB, int dwCode);
     char* (*XBMC_get_dvd_menu_language)(void *HANDLE, void* CB);
+    void (*XBMC_free_string)(void *HANDLE, void* CB, char* str);
     void* (*XBMC_open_file)(void *HANDLE, void* CB, const char* strFileName, unsigned int flags);
     void* (*XBMC_open_file_for_write)(void *HANDLE, void* CB, const char* strFileName, bool bOverWrite);
     unsigned int (*XBMC_read_file)(void *HANDLE, void* CB, void* file, void* lpBuf, int64_t uiBufSize);
index 243abb0..3daf0ea 100644 (file)
@@ -109,6 +109,14 @@ DLLEXPORT char* XBMC_get_dvd_menu_language(void *hdl, void* cb)
   return strdup(buffer.c_str());
 }
 
+DLLEXPORT void XBMC_free_string(void* hdl, void* cb, char* str)
+{
+  if (cb == NULL)
+    return;
+
+  ((CB_AddOnLib*)cb)->FreeString(((AddonCB*)hdl)->addonData, str);
+}
+
 DLLEXPORT void* XBMC_open_file(void *hdl, void* cb, const char* strFileName, unsigned int flags)
 {
   if (cb == NULL)
index f586298..3cdca49 100644 (file)
@@ -30,6 +30,7 @@ typedef bool (*AddOnGetSetting)(void *addonData, const char *settingName, void *
 typedef char* (*AddOnUnknownToUTF8)(const char *sourceDest);
 typedef char* (*AddOnGetLocalizedString)(const void* addonData, long dwCode);
 typedef char* (*AddOnGetDVDMenuLanguage)(const void* addonData);
+typedef void (*AddOnFreeString)(const void* addonData, char* str);
 
 typedef void* (*AddOnOpenFile)(const void* addonData, const char* strFileName, unsigned int flags);
 typedef void* (*AddOnOpenFileForWrite)(const void* addonData, const char* strFileName, bool bOverWrite);
@@ -59,6 +60,7 @@ typedef struct CB_AddOn
   AddOnUnknownToUTF8      UnknownToUTF8;
   AddOnGetLocalizedString GetLocalizedString;
   AddOnGetDVDMenuLanguage GetDVDMenuLanguage;
+  AddOnFreeString         FreeString;
 
   AddOnOpenFile           OpenFile;
   AddOnOpenFileForWrite   OpenFileForWrite;
index fa81496..3f36e96 100644 (file)
@@ -46,6 +46,7 @@ CAddonCallbacksAddon::CAddonCallbacksAddon(CAddon* addon)
   m_callbacks->UnknownToUTF8      = UnknownToUTF8;
   m_callbacks->GetLocalizedString = GetLocalizedString;
   m_callbacks->GetDVDMenuLanguage = GetDVDMenuLanguage;
+  m_callbacks->FreeString         = FreeString;
 
   m_callbacks->OpenFile           = OpenFile;
   m_callbacks->OpenFileForWrite   = OpenFileForWrite;
@@ -270,6 +271,11 @@ char* CAddonCallbacksAddon::GetDVDMenuLanguage(const void* addonData)
   return buffer;
 }
 
+void CAddonCallbacksAddon::FreeString(const void* addonData, char* str)
+{
+  delete[] str;
+}
+
 void* CAddonCallbacksAddon::OpenFile(const void* addonData, const char* strFileName, unsigned int flags)
 {
   CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
index d9053f1..ef72790 100644 (file)
@@ -41,6 +41,7 @@ public:
   static char* UnknownToUTF8(const char *strSource);
   static char* GetLocalizedString(const void* addonData, long dwCode);
   static char* GetDVDMenuLanguage(const void* addonData);
+  static void FreeString(const void* addonData, char* str);
 
   // file operations
   static void* OpenFile(const void* addonData, const char* strFileName, unsigned int flags);