1 // Copyright © 2018 650 Industries. All rights reserved.
2 
3 #if defined(__cplusplus)
4 #define EX_EXTERN extern "C" __attribute__((visibility("default")))
5 #define EX_EXTERN_C_BEGIN extern "C" {
6 #define EX_EXTERN_C_END }
7 #else
8 #define EX_EXTERN extern __attribute__((visibility("default")))
9 #define EX_EXTERN_C_BEGIN
10 #define EX_EXTERN_C_END
11 #endif
12 
13 EX_EXTERN_C_BEGIN
14 
15 #define EX_EXPORTED_METHODS_PREFIX __ex_export__
16 #define EX_PROPSETTERS_PREFIX __ex_set__
17 
18 #define EX_DO_CONCAT(A, B) A ## B
19 #define EX_CONCAT(A, B) EX_DO_CONCAT(A, B)
20 
21 #define EX_EXPORT_METHOD_AS(external_name, method) \
22   _EX_EXTERN_METHOD(external_name, method) \
23   - (void)method
24 
25 #define _EX_EXTERN_METHOD(external_name, method) \
26   + (const EXMethodInfo *)EX_CONCAT(EX_EXPORTED_METHODS_PREFIX, EX_CONCAT(external_name, EX_CONCAT(__LINE__, __COUNTER__))) { \
27   static EXMethodInfo config = {#external_name, #method}; \
28   return &config; \
29   }
30 
31 #define EX_VIEW_PROPERTY(external_name, type, viewClass) \
32   - (void)EX_CONCAT(EX_PROPSETTERS_PREFIX, external_name):(type)value view:(viewClass *)view
33 
34 #define _EX_DEFINE_CUSTOM_LOAD(_custom_load_code) \
35   EX_EXTERN void EXRegisterModule(Class); \
36   + (void)load { \
37     EXRegisterModule(self); \
38     _custom_load_code \
39   }
40 
41 #define EX_EXPORT_MODULE_WITH_CUSTOM_LOAD(external_name, _custom_load_code) \
42   _EX_DEFINE_CUSTOM_LOAD(_custom_load_code) \
43   + (const NSString *)exportedModuleName { return @#external_name; }
44 
45 #define EX_EXPORT_MODULE(external_name) \
46   EX_EXPORT_MODULE_WITH_CUSTOM_LOAD(external_name,)
47 
48 #define EX_REGISTER_MODULE(_custom_load_code) \
49   _EX_DEFINE_CUSTOM_LOAD(_custom_load_code)
50 
51 #define EX_REGISTER_SINGLETON_MODULE_WITH_CUSTOM_LOAD(singleton_name, _custom_load_code) \
52   EX_EXTERN void EXRegisterSingletonModule(Class); \
53   + (const NSString *)name { \
54     return @#singleton_name; \
55   } \
56   \
57   + (void)load { \
58     EXRegisterSingletonModule(self); \
59     _custom_load_code \
60   }
61 
62 #define EX_REGISTER_SINGLETON_MODULE(singleton_name) \
63   EX_REGISTER_SINGLETON_MODULE_WITH_CUSTOM_LOAD(singleton_name,)
64 
65 #define EX_WEAKIFY(var) \
66 __weak __typeof(var) EXWeak_##var = var;
67 
68 #define EX_STRONGIFY(var) \
69 _Pragma("clang diagnostic push") \
70 _Pragma("clang diagnostic ignored \"-Wshadow\"") \
71 __strong __typeof(var) var = EXWeak_##var; \
72 _Pragma("clang diagnostic pop")
73 
74 #define EX_ENSURE_STRONGIFY(var) \
75 EX_STRONGIFY(var); \
76 if (var == nil) { return; }
77 
78 // Converts nil -> [NSNull null]
79 #define EXNullIfNil(value) (value ?: [NSNull null])
80 
81 #import <UIKit/UIKit.h>
82 #import <Foundation/Foundation.h>
83 
84 typedef struct EXMethodInfo {
85   const char *const jsName;
86   const char *const objcName;
87 } EXMethodInfo;
88 
89 typedef struct EXModuleInfo {
90   const char *const jsName;
91   const char *const internalName;
92 } EXModuleInfo;
93 
94 typedef void (^EXDirectEventBlock)(NSDictionary *body);
95 typedef void (^EXPromiseResolveBlock)(id result);
96 typedef void (^EXPromiseRejectBlock)(NSString *code, NSString *message, NSError *error);
97 
98 #pragma mark - Externs
99 
100 // These should be defined by the concrete platform adapter
101 EX_EXTERN void EXLogInfo(NSString *format, ...);
102 EX_EXTERN void EXLogWarn(NSString *format, ...);
103 EX_EXTERN void EXLogError(NSString *format, ...);
104 EX_EXTERN void EXFatal(NSError *);
105 EX_EXTERN NSError * EXErrorWithMessage(NSString *);
106 EX_EXTERN UIApplication *EXSharedApplication(void);
107 
108 EX_EXTERN_C_END
109