Overview
| Comment: | of_plugin_handle_t -> OFPluginHandle |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | new-naming-convention |
| Files: | files | file ages | folders |
| SHA3-256: |
cedc0cb75e9c002f78c840079c5239d4 |
| User & Date: | js on 2021-04-17 14:24:46 |
| Other Links: | branch diff | manifest | tags |
Context
|
2021-04-17
| ||
| 14:33 | Rename of_http_* (check-in: 83d8f3e5f6 user: js tags: new-naming-convention) | |
| 14:24 | of_plugin_handle_t -> OFPluginHandle (check-in: cedc0cb75e user: js tags: new-naming-convention) | |
| 14:21 | of_map_table_functions_t -> OFMapTableFunctions (check-in: 943d9bd388 user: js tags: new-naming-convention) | |
Changes
Modified src/OFPlugin.h from [6278a1d5c2] to [e247c60403].
| ︙ | ︙ | |||
17 18 19 20 21 22 23 | @class OFString; #ifndef OF_WINDOWS # include <dlfcn.h> # define OF_RTLD_LAZY RTLD_LAZY # define OF_RTLD_NOW RTLD_NOW | | | | | | | | | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
@class OFString;
#ifndef OF_WINDOWS
# include <dlfcn.h>
# define OF_RTLD_LAZY RTLD_LAZY
# define OF_RTLD_NOW RTLD_NOW
typedef void *OFPluginHandle;
#else
# include <windows.h>
# define OF_RTLD_LAZY 0
# define OF_RTLD_NOW 0
typedef HMODULE OFPluginHandle;
#endif
OF_ASSUME_NONNULL_BEGIN
/**
* @class OFPlugin OFPlugin.h ObjFW/OFPlugin.h
*
* @brief Provides a system for loading plugins at runtime.
*/
@interface OFPlugin: OFObject
{
OFPluginHandle _pluginHandle;
OF_RESERVE_IVARS(OFPlugin, 4)
}
/**
* @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, int flags);
extern void *OFDlsym(OFPluginHandle handle, const char *symbol);
extern OFString *_Nullable OFDlerror(void);
extern void OFDlclose(OFPluginHandle handle);
#ifdef __cplusplus
}
#endif
OF_ASSUME_NONNULL_END
|
Modified src/OFPlugin.m from [8802d6d561] to [b47ab783df].
| ︙ | ︙ | |||
28 29 30 31 32 33 34 | #import "OFSystemInfo.h" #import "OFInitializationFailedException.h" #import "OFLoadPluginFailedException.h" typedef OFPlugin *(*init_plugin_t)(void); | | | | | | | | | | | | 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
#import "OFSystemInfo.h"
#import "OFInitializationFailedException.h"
#import "OFLoadPluginFailedException.h"
typedef OFPlugin *(*init_plugin_t)(void);
OFPluginHandle
OFDlopen(OFString *path, int flags)
{
#ifndef OF_WINDOWS
return dlopen([path cStringWithEncoding: [OFLocale encoding]], flags);
#else
if (path == nil)
return GetModuleHandle(NULL);
if ([OFSystemInfo isWindowsNT])
return LoadLibraryW(path.UTF16String);
else
return LoadLibraryA(
[path cStringWithEncoding: [OFLocale encoding]]);
#endif
}
void *
OFDlsym(OFPluginHandle handle, const char *symbol)
{
#ifndef OF_WINDOWS
return dlsym(handle, symbol);
#else
return (void *)(uintptr_t)GetProcAddress(handle, symbol);
#endif
}
void
OFDlclose(OFPluginHandle handle)
{
#ifndef OF_WINDOWS
dlclose(handle);
#else
FreeLibrary(handle);
#endif
}
OFString *
OFDlerror(void)
{
#ifndef OF_WINDOWS
return [OFString stringWithCString: dlerror()
encoding: [OFLocale encoding]];
#else
return nil;
#endif
}
@implementation OFPlugin
+ (id)pluginWithPath: (OFString *)path
{
void *pool = objc_autoreleasePoolPush();
OFPluginHandle handle;
init_plugin_t initPlugin;
OFPlugin *plugin;
#if defined(OF_MACOS)
path = [path stringByAppendingFormat: @".bundle/Contents/MacOS/%@",
path.lastPathComponent];
#elif defined(OF_IOS)
path = [path stringByAppendingFormat: @".bundle/%@",
path.lastPathComponent];
#else
path = [path stringByAppendingString: @PLUGIN_SUFFIX];
#endif
if ((handle = OFDlopen(path, OF_RTLD_LAZY)) == NULL)
@throw [OFLoadPluginFailedException
exceptionWithPath: path
error: OFDlerror()];
objc_autoreleasePoolPop(pool);
initPlugin = (init_plugin_t)(uintptr_t)OFDlsym(handle, "init_plugin");
if (initPlugin == (init_plugin_t)0 || (plugin = initPlugin()) == nil) {
OFDlclose(handle);
@throw [OFInitializationFailedException
exceptionWithClass: self];
}
plugin->_pluginHandle = handle;
return plugin;
}
|
| ︙ | ︙ | |||
130 131 132 133 134 135 136 |
}
return [super init];
}
- (void)dealloc
{
| | | | 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
}
return [super init];
}
- (void)dealloc
{
OFPluginHandle h = _pluginHandle;
[super dealloc];
OFDlclose(h);
}
@end
|
Modified utils/ofhttp/OFHTTP.m from [b36faae7ff] to [88b7d0694f].
| ︙ | ︙ | |||
281 282 283 284 285 286 287 |
#ifdef OF_HAVE_PLUGINS
+ (void)initialize
{
if (self != [OFHTTP class])
return;
/* Opportunistically try loading ObjOpenSSL and ignore any errors. */
| | | 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 |
#ifdef OF_HAVE_PLUGINS
+ (void)initialize
{
if (self != [OFHTTP class])
return;
/* Opportunistically try loading ObjOpenSSL and ignore any errors. */
OFDlopen(@LIB_PREFIX @"objopenssl" @LIB_SUFFIX, OF_RTLD_LAZY);
}
#endif
- (instancetype)init
{
self = [super init];
|
| ︙ | ︙ |