dlsym(m_libXBMC_addon, "XBMC_get_file_chunk_size");
if (XBMC_get_file_chunk_size == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
+ XBMC_file_exists = (bool (*)(void* HANDLE, void* CB, const char *strFileName, bool bUseCache))
+ dlsym(m_libXBMC_addon, "XBMC_file_exists");
+ if (XBMC_file_exists == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
+
+ XBMC_stat_file = (int (*)(void* HANDLE, void* CB, const char *strFileName, struct __stat64* buffer))
+ dlsym(m_libXBMC_addon, "XBMC_stat_file");
+ if (XBMC_stat_file == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
+
+ XBMC_delete_file = (bool (*)(void* HANDLE, void* CB, const char *strFileName))
+ dlsym(m_libXBMC_addon, "XBMC_delete_file");
+ if (XBMC_delete_file == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
+
XBMC_can_open_directory = (bool (*)(void* HANDLE, void* CB, const char* strURL))
dlsym(m_libXBMC_addon, "XBMC_can_open_directory");
if (XBMC_can_open_directory == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
+ XBMC_create_directory = (bool (*)(void* HANDLE, void* CB, const char* strPath))
+ dlsym(m_libXBMC_addon, "XBMC_create_directory");
+ if (XBMC_create_directory == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
+
+ XBMC_directory_exists = (bool (*)(void* HANDLE, void* CB, const char* strPath))
+ dlsym(m_libXBMC_addon, "XBMC_directory_exists");
+ if (XBMC_directory_exists == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
+
+ XBMC_remove_directory = (bool (*)(void* HANDLE, void* CB, const char* strPath))
+ dlsym(m_libXBMC_addon, "XBMC_remove_directory");
+ if (XBMC_remove_directory == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }
+
m_Callbacks = XBMC_register_me(m_Handle);
return m_Callbacks != NULL;
}
}
/*!
+ * @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 XBMC_file_exists(m_Handle, m_Callbacks, 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 XBMC_stat_file(m_Handle, m_Callbacks, strFileName, buffer);
+ }
+
+ /*!
+ * @brief Deletes a file.
+ * @param strFileName The filename to delete.
+ * @return The file was successfully deleted.
+ */
+ bool DeleteFile(const char *strFileName)
+ {
+ return XBMC_delete_file(m_Handle, m_Callbacks, 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.
return XBMC_can_open_directory(m_Handle, m_Callbacks, 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 XBMC_create_directory(m_Handle, m_Callbacks, 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 XBMC_directory_exists(m_Handle, m_Callbacks, 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 XBMC_remove_directory(m_Handle, m_Callbacks, strPath);
+ }
+
protected:
void* (*XBMC_register_me)(void *HANDLE);
void (*XBMC_unregister_me)(void *HANDLE, void* CB);
int64_t (*XBMC_get_file_length)(void *HANDLE, void* CB, void* file);
void (*XBMC_close_file)(void *HANDLE, void* CB, void* file);
int (*XBMC_get_file_chunk_size)(void *HANDLE, void* CB, void* file);
+ bool (*XBMC_file_exists)(void *HANDLE, void* CB, const char *strFileName, bool bUseCache);
+ int (*XBMC_stat_file)(void *HANDLE, void* CB, const char *strFileName, struct __stat64* buffer);
+ bool (*XBMC_delete_file)(void *HANDLE, void* CB, const char *strFileName);
bool (*XBMC_can_open_directory)(void *HANDLE, void* CB, const char* strURL);
+ bool (*XBMC_create_directory)(void *HANDLE, void* CB, const char* strPath);
+ bool (*XBMC_directory_exists)(void *HANDLE, void* CB, const char* strPath);
+ bool (*XBMC_remove_directory)(void *HANDLE, void* CB, const char* strPath);
private:
void *m_libXBMC_addon;
return ((CB_AddOnLib*)cb)->GetFileChunkSize(((AddonCB*)hdl)->addonData, file);
}
+DLLEXPORT bool XBMC_file_exists(void *hdl, void* cb, const char *strFileName, bool bUseCache)
+{
+ if (cb == NULL)
+ return false;
+
+ return ((CB_AddOnLib*)cb)->FileExists(((AddonCB*)hdl)->addonData, strFileName, bUseCache);
+}
+
+DLLEXPORT int XBMC_stat_file(void *hdl, void* cb, const char *strFileName, struct ::__stat64* buffer)
+{
+ if (cb == NULL)
+ return -1;
+
+ return ((CB_AddOnLib*)cb)->StatFile(((AddonCB*)hdl)->addonData, strFileName, buffer);
+}
+
+DLLEXPORT bool XBMC_delete_file(void *hdl, void* cb, const char *strFileName)
+{
+ if (cb == NULL)
+ return false;
+
+ return ((CB_AddOnLib*)cb)->DeleteFile(((AddonCB*)hdl)->addonData, strFileName);
+}
+
DLLEXPORT bool XBMC_can_open_directory(void *hdl, void* cb, const char* strURL)
{
if (cb == NULL)
return ((CB_AddOnLib*)cb)->CanOpenDirectory(((AddonCB*)hdl)->addonData, strURL);
}
+DLLEXPORT bool XBMC_create_directory(void *hdl, void* cb, const char *strPath)
+{
+ if (cb == NULL)
+ return false;
+
+ return ((CB_AddOnLib*)cb)->CreateDirectory(((AddonCB*)hdl)->addonData, strPath);
+}
+
+DLLEXPORT bool XBMC_directory_exists(void *hdl, void* cb, const char *strPath)
+{
+ if (cb == NULL)
+ return false;
+
+ return ((CB_AddOnLib*)cb)->DirectoryExists(((AddonCB*)hdl)->addonData, strPath);
+}
+
+DLLEXPORT bool XBMC_remove_directory(void *hdl, void* cb, const char *strPath)
+{
+ if (cb == NULL)
+ return false;
+
+ return ((CB_AddOnLib*)cb)->RemoveDirectory(((AddonCB*)hdl)->addonData, strPath);
+}
+
};
typedef int64_t (*AddOnGetFileLength)(const void* addonData, void* file);
typedef void (*AddOnCloseFile)(const void* addonData, void* file);
typedef int (*AddOnGetFileChunkSize)(const void* addonData, void* file);
+typedef bool (*AddOnFileExists)(const void* addonData, const char *strFileName, bool bUseCache);
+typedef int (*AddOnStatFile)(const void* addonData, const char *strFileName, struct __stat64* buffer);
+typedef bool (*AddOnDeleteFile)(const void* addonData, const char *strFileName);
typedef bool (*AddOnCanOpenDirectory)(const void* addonData, const char* strURL);
+typedef bool (*AddOnCreateDirectory)(const void* addonData, const char *strPath);
+typedef bool (*AddOnDirectoryExists)(const void* addonData, const char *strPath);
+typedef bool (*AddOnRemoveDirectory)(const void* addonData, const char *strPath);
typedef struct CB_AddOn
{
AddOnGetFileLength GetFileLength;
AddOnCloseFile CloseFile;
AddOnGetFileChunkSize GetFileChunkSize;
+ AddOnFileExists FileExists;
+ AddOnStatFile StatFile;
+ AddOnDeleteFile DeleteFile;
AddOnCanOpenDirectory CanOpenDirectory;
+ AddOnCreateDirectory CreateDirectory;
+ AddOnDirectoryExists DirectoryExists;
+ AddOnRemoveDirectory RemoveDirectory;
} CB_AddOnLib;
typedef void (*GUILock)();
m_callbacks->GetFileLength = GetFileLength;
m_callbacks->CloseFile = CloseFile;
m_callbacks->GetFileChunkSize = GetFileChunkSize;
+ m_callbacks->FileExists = FileExists;
+ m_callbacks->StatFile = StatFile;
+ m_callbacks->DeleteFile = DeleteFile;
m_callbacks->CanOpenDirectory = CanOpenDirectory;
+ m_callbacks->CreateDirectory = CreateDirectory;
+ m_callbacks->DirectoryExists = DirectoryExists;
+ m_callbacks->RemoveDirectory = RemoveDirectory;
}
CAddonCallbacksAddon::~CAddonCallbacksAddon()
return cfile->GetChunkSize();
}
+bool CAddonCallbacksAddon::FileExists(const void* addonData, const char *strFileName, bool bUseCache)
+{
+ CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
+ if (!helper)
+ return false;
+
+ return CFile::Exists(strFileName, bUseCache);
+}
+
+int CAddonCallbacksAddon::StatFile(const void* addonData, const char *strFileName, struct __stat64* buffer)
+{
+ CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
+ if (!helper)
+ return -1;
+
+ return CFile::Stat(strFileName, buffer);
+}
+
+bool CAddonCallbacksAddon::DeleteFile(const void* addonData, const char *strFileName)
+{
+ CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
+ if (!helper)
+ return false;
+
+ return CFile::Delete(strFileName);
+}
+
bool CAddonCallbacksAddon::CanOpenDirectory(const void* addonData, const char* strURL)
{
CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
return CDirectory::GetDirectory(strURL, items);
}
+bool CAddonCallbacksAddon::CreateDirectory(const void* addonData, const char *strPath)
+{
+ CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
+ if (!helper)
+ return false;
+
+ return CDirectory::Create(strPath);
+}
+
+bool CAddonCallbacksAddon::DirectoryExists(const void* addonData, const char *strPath)
+{
+ CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
+ if (!helper)
+ return false;
+
+ return CDirectory::Exists(strPath);
+}
+
+bool CAddonCallbacksAddon::RemoveDirectory(const void* addonData, const char *strPath)
+{
+ CAddonCallbacks* helper = (CAddonCallbacks*) addonData;
+ if (!helper)
+ return false;
+
+ // Empty directory
+ CFileItemList fileItems;
+ CDirectory::GetDirectory(strPath, fileItems);
+ for (int i = 0; i < fileItems.Size(); ++i)
+ CFile::Delete(fileItems.Get(i)->GetPath());
+
+ return CDirectory::Remove(strPath);
+}
+
}; /* namespace ADDON */