@@ -18,58 +18,64 @@ @class OFString; #ifndef OF_WINDOWS # include typedef void *OFPluginHandle; - -typedef enum { - OFDLOpenFlagLazy = RTLD_LAZY, - OFDLOpenFlagNow = RTLD_NOW -} OFDLOpenFlags; #else # include typedef HMODULE OFPluginHandle; - -typedef enum { - OFDLOpenFlagLazy = 0, - OFDLOpenFlagNow = 0 -} OFDLOpenFlags; #endif OF_ASSUME_NONNULL_BEGIN /** * @class OFPlugin OFPlugin.h ObjFW/OFPlugin.h * - * @brief Provides a system for loading plugins at runtime. + * @brief A class representing a loaded plugin (shared library). * - * A plugin must subclass @ref OFPlugin and have a global function called - * `OFPluginInit`, which returns an instance of the @ref OFPlugin subclass and - * takes no parameters. */ +OF_SUBCLASSING_RESTRICTED @interface OFPlugin: OFObject { - OFPluginHandle _pluginHandle; - OF_RESERVE_IVARS(OFPlugin, 4) + OFPluginHandle _handle; } /** - * @brief Loads a plugin from a file. - * - * @param path Path to the plugin file. The suffix is appended automatically. - * @return The loaded plugin - */ -+ (OF_KINDOF(OFPlugin *))pluginWithPath: (OFString *)path; -@end - -#ifdef __cplusplus -extern "C" { -#endif -extern OFPluginHandle OFDLOpen(OFString *path, OFDLOpenFlags flags); -extern void *OFDLSym(OFPluginHandle handle, const char *symbol); -extern OFString *_Nullable OFDLError(void); -extern void OFDLClose(OFPluginHandle handle); -#ifdef __cplusplus -} -#endif + * @brief Returns the plugin path for a plugin with the specified name. + * + * E.g. on ELF systems, it appends .so, while on macOS and iOS, it creates the + * appropriate plugin path. This can also be prefixed by a directory. + * + * @param name The name to return the plugin path for + * @return The plugin path + */ ++ (OFString *)pathForName: (OFString *)name; + +/** + * @brief Creates a new OFPlugin by loading the plugin with the specified path. + * + * @param path The path to the plugin file. The suffix is appended + * automatically. + * @return An new, autoreleased OFPlugin + */ ++ (instancetype)pluginWithPath: (OFString *)path; + +/** + * @brief Initializes an already allocated OFPlugin by loading the plugin with + * the specified path. + * + * @param path The path to the plugin file. The suffix is appended + * automatically. + * @return An initialized OFPlugin + */ +- (instancetype)initWithPath: (OFString *)path; + +/** + * @brief Returns the address for the specified symbol, or `nil` if not found. + * + * @param symbol The symbol to return the address for + * @return The address for the speccified symbol, or `nil` if not found + */ +- (nullable void *)addressForSymbol: (OFString *)symbol; +@end OF_ASSUME_NONNULL_END