Commit 4172aca147230e860b20eabe1e5e29ce69166f7a

Authored by zhangxiaowen
1 parent c5a35a8c

no message

Showing 43 changed files with 0 additions and 4849 deletions

Too many changes to show.

To preserve performance only 43 of 2662 files are displayed.

Example/Products/CNLivePlayer.framework/CNLivePlayer deleted 100644 → 0
No preview for this file type
Example/Products/CNLivePlayer.framework/Headers/CNLivePlayer.h deleted 100644 → 0
1   -//
2   -// CNLivePlayer.h
3   -// CNLivePlayer_Example
4   -//
5   -// Created by CNLive-zxw on 2019/7/26.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#import <Foundation/Foundation.h>
10   -#import <libksygpulive/KSYMoviePlayerController.h>
11   -#import "KSYMoviePlayerDefines.h"
12   -
13   -// 枚举定义
14   -#import "CNLivePlayerDefines.h"
15   -
16   -// 播放器管理类
17   -#import "CNLivePlayerManager.h"
18   -
19   -//缓存url
20   -#import "CNLivePlayerCache.h"
21   -
22   -NS_ASSUME_NONNULL_BEGIN
23   -
24   -/*
25   - * 获取主播状态通知
26   - */
27   -UIKIT_EXTERN NSString *const CNLiveHostStatusChangedNotification;
28   -
29   -/*
30   - * 成功回调
31   - */
32   -typedef void(^AuthSuccessBlock)(void);
33   -
34   -/*
35   - * 失败回调
36   - */
37   -typedef void(^AuthFailureBlock)(NSDictionary *errorInfo);
38   -
39   -@interface CNLivePlayer : NSObject
40   -
41   -/*
42   - * 播放器类型
43   - */
44   -@property (nonatomic, assign, readonly) CNLivePlayerType type;
45   -
46   -/*
47   - * 播放器
48   - */
49   -@property (nonatomic, strong) KSYMoviePlayerController *player;
50   -
51   -#pragma mark - 初始化方法
52   -/*
53   - * 初始化播放器并设置播放地址
54   - *
55   - * url 视频url
56   - *
57   - */
58   -- (instancetype)initWithContentURL:(NSURL *)url;
59   -
60   -
61   -/* 初始化点播播放器 初始化成功后才能对播放器进行设置(如:自动播放、是否开启硬件解码等)和调用准备播放视频方法(prepareToPlay)
62   - *
63   - * videoId 视频Id
64   - * authSuccess 初始化成功block
65   - * authFailed 初始化失败block 回调一个errorInfo的字典
66   - *
67   - */
68   -- (instancetype)initVodPlayerWithVideoId:(NSString *)videoId authSuccess:(AuthSuccessBlock)authSuccessBlock authFailure:(AuthFailureBlock)authFailureBlock;
69   -
70   -
71   -/* 初始化直播播放器(* 以channelId播放) 初始化成功后才能对播放器进行设置(如:自动播放、是否开启硬件解码等)和调用准备播放视频方法(prepareToPlay)
72   - *
73   - * channelId 直播视频Id (注* 若agree为YES时,必传,用于获取主播状态; 若agree为NO,可不传)
74   - * activityId 活动Id
75   - * agree 是否允许获取主播状态 YES:获取 NO:不获取
76   - * authSuccess 初始化成功block
77   - * authFailed 初始化失败block 回调一个errorInfo的字典
78   - *
79   - * result 获取主播状态 YES:获取状态成功
80   - * NO:获取失败,不影响视频播放,但是获取不到主播离开、回来、直播结束等通知。
81   - * 可通过- (void)getHostStatus:(void(^)(BOOL result))result;方法重新获取
82   - */
83   -- (instancetype)initLivePlayerWithChannelId:(NSString *)channelId activityId:(NSString *)activityId hostStatus:(BOOL)agree authSuccess:(AuthSuccessBlock)authSuccessBlock authFailure:(AuthFailureBlock)authFailureBlock getHostStatusResult:(void(^)(BOOL result))result;
84   -
85   -
86   -/* 初始化音频播放器 初始化成功后才能对播放器进行设置(如:自动播放、是否开启硬件解码等)和调用准备播放视频方法(prepareToPlay)
87   - *
88   - * contentId 音频Id
89   - * authSuccess 初始化成功block
90   - * authFailed 初始化失败block 回调一个errorInfo的字典
91   - *
92   - */
93   -- (instancetype)initAudioPlayerWithAudioId:(NSString *)audioId authSuccess:(AuthSuccessBlock)authSuccessBlock authFailure:(AuthFailureBlock)authFailureBlock;
94   -
95   -#pragma mark - 属性
96   -/**
97   - @abstract 正在播放的视频文件的地址,该地址可以是本地地址或者服务器地址。
98   - */
99   -@property (nonatomic, readonly) NSURL *contentURL;
100   -
101   -/**
102   - @abstract 包含视频播放内容的VIEW(只读)。
103   - @discussion view的使用逻辑:
104   -
105   - * 可以通过frame设置view大大小
106   - * 使用[scalingMode]([KSYMoviePlayerController scalingMode]) 可以更改视频内容在VIEW中的显示情况
107   -
108   - @see scalingMode
109   - */
110   -// The view in which the media and playback controls are displayed.
111   -@property (nonatomic, strong, readonly) UIView *view;
112   -
113   -/*
114   - * 主播直播状态(只读)
115   - */
116   -@property (nonatomic, assign, readonly) CNLiveHostStatus hostStatus;
117   -
118   -/**
119   - @abstract 是否静音
120   - @discussion
121   - * 默认不静音
122   - * [prepareToPlay]方法前设置即生效,也可以在播放过程中动态切换
123   - */
124   -@property (nonatomic) BOOL shouldMute;
125   -
126   -/**
127   - @abstract 是否循环播放
128   - @discussion 默认不循环
129   - * 只在[prepareToPlay]调用前设置生效;
130   - * 只有点播生效,直播场景请勿设置
131   - */
132   -@property (nonatomic) BOOL shouldLoop;
133   -
134   -/**
135   - @abstract 指定逆时针旋转角度,只能是0/90/180/270, 不符合上述值不进行旋转
136   - */
137   -@property (nonatomic, assign) int rotateDegress;
138   -
139   -/**
140   - @abstract 是否打断其他后台的音乐播放
141   - @discussion 也可以理解为是否允许和其他音频同时播放
142   - @discussion YES:开始播放时,会打断其他的后台播放音频,也会被其他音频播放打断
143   - @discussion NO: 可以与其他后台播放共存,相互之间不会被打断
144   - @discussion 默认为YES
145   - */
146   -@property (nonatomic) BOOL bInterruptOtherAudio;
147   -
148   -/*
149   - * 查询视频准备是否完成(只读)
150   - */
151   -@property (nonatomic, readonly) BOOL isPreparedToPlay;
152   -
153   -#pragma mark - 方法
154   -/*
155   - * 获取主播状态(离开/已结束)
156   - */
157   -- (void)getHostStatus:(void(^)(BOOL result))result;
158   -
159   -/* 给播放器设置内容id 设置成功后才能播放(如:自动播放、是否开启硬件解码等)和调用准备播放视频方法(prepareToPlay)
160   - * 切换视频
161   - * contentId 内容Id
162   - * type 内容类型
163   - *
164   - */
165   -- (void)setPlayerWithContentId:(NSString *)contentId type:(CNLivePlayerType)type authSuccess:(AuthSuccessBlock)authSuccessBlock authFailure:(AuthFailureBlock)authFailureBlock;
166   -
167   -/*
168   - * 销毁播放器
169   - */
170   -- (void)destroyPlayer;
171   -
172   -/*
173   - * 准备视频播放
174   - * MPMediaPlaybackIsPreparedToPlayDidChangeNotification 播放器完成对视频文件的初始化时发送通知
175   - */
176   -- (void)prepareToPlay;
177   -
178   -/*
179   - * 视频播放
180   - */
181   -- (void)play;
182   -
183   -/*
184   - * 当前播放器是否在播放
185   - */
186   -- (BOOL)isPlaying;
187   -
188   -/*
189   - * 视频暂停
190   - */
191   -- (void)pause;
192   -
193   -/*
194   - * 视频停止
195   - */
196   -- (void)stop;
197   -
198   -/*
199   - * 视频截图
200   - */
201   -- (UIImage *)thumbnailImageAtCurrentTime;
202   -
203   -@end
204   -
205   -NS_ASSUME_NONNULL_END
Example/Products/CNLivePlayer.framework/Headers/CNLivePlayerCache.h deleted 100644 → 0
1   -//
2   -// CNLivePlayerCache.h
3   -// CNLivePlayer_Example
4   -//
5   -// Created by CNLive-zxw on 2019/7/26.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#import <Foundation/Foundation.h>
10   -
11   -NS_ASSUME_NONNULL_BEGIN
12   -
13   -@interface CNLivePlayerCache : NSObject
14   -
15   -/**
16   - * 存储或者修改数据
17   - *
18   - * @param data 保存的数据
19   - * @param key 保存的key
20   - */
21   -+ (void)player_SaveDataCache:(id)data forKey:(NSString *)key;
22   -
23   -
24   -/**
25   - * 读取数据
26   - *
27   - * @param key 保存的key
28   - *
29   - * @return 返回id
30   - */
31   -+ (id)player_ReadCache:(NSString *)key;
32   -
33   -
34   -/**
35   - * 读取缓存文件的大小
36   - *
37   - * @return 返回NSString
38   - */
39   -+ (NSString *)player_GetAllHttpCacheSize;
40   -
41   -
42   -/**
43   - * 是否缓存过
44   - *
45   - * @param key 保存的key
46   - *
47   - * @return 返回NSString
48   - */
49   -+ (BOOL)player_IsCache:(NSString *)key;
50   -
51   -
52   -/**
53   - * 删除某个磁盘缓存文件
54   - *
55   - * @param key 保存的key(就是请求的url)
56   - *
57   - */
58   -+ (void)player_RemoveChache:(NSString *)key;
59   -
60   -
61   -/**
62   - * 磁盘最大缓存开销
63   - * 默认是30*1024*1024
64   - */
65   -+ (void)player_SetCostLimit:(NSInteger)costLimit;
66   -
67   -
68   -/**
69   - * 删除所有的磁盘缓存url(YYCache)
70   - */
71   -+ (void)player_RemoveAllUrlCache;
72   -
73   -
74   -/**
75   - * 删除所有的磁盘缓存url(YYCache)
76   - * 删除所有的磁盘缓存视频(KSYHTTPProxyService)
77   - */
78   -+ (void)player_clearAllCache;
79   -
80   -@end
81   -
82   -NS_ASSUME_NONNULL_END
Example/Products/CNLivePlayer.framework/Headers/CNLivePlayerDefines.h deleted 100644 → 0
1   -//
2   -// CNLivePlayerDefines.h
3   -// CNLivePlayer
4   -//
5   -// Created by CNLive-zxw on 2019/8/14.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#ifndef CNLivePlayerDefines_h
10   -#define CNLivePlayerDefines_h
11   -
12   -/*
13   - * 播放器类型
14   - */
15   -typedef NS_ENUM(NSUInteger, CNLivePlayerType) {
16   - CNLivePlayerVod, //点播
17   - CNLivePlayerLive, //直播
18   - CNLivePlayerAudio //音频
19   -
20   -};
21   -
22   -/**
23   - * 主播直播状态
24   - */
25   -typedef NS_ENUM(NSUInteger, CNLiveHostStatus) {
26   - //主播直播中
27   - CNLiveHostStatusLiving = 1,
28   - //直播已结束
29   - CNLiveHostStatusEnd = 2,
30   - //主播已离开
31   - CNLiveHostStatusLeaving = 3
32   -
33   -};
34   -
35   -#endif /* CNLivePlayerDefines_h */
Example/Products/CNLivePlayer.framework/Headers/CNLivePlayerManager.h deleted 100644 → 0
1   -//
2   -// CNLivePlayerManager.h
3   -// CNLivePlayer_Example
4   -//
5   -// Created by CNLive-zxw on 2019/7/26.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#import <Foundation/Foundation.h>
10   -
11   -#define PLAYER_AppID [CNLivePlayerManager manager].appId?[CNLivePlayerManager manager].appId:@""
12   -#define PLAYER_AppKey [CNLivePlayerManager manager].appKey?[CNLivePlayerManager manager].appKey:@""
13   -#define PLAYER_UserId [CNLivePlayerManager manager].userId?[CNLivePlayerManager manager].userId:@""
14   -#define PLAYER_ChannelName [CNLivePlayerManager manager].channelName?[CNLivePlayerManager manager].channelName:@""
15   -#define PLAYER_Tag [CNLivePlayerManager manager].tag?[CNLivePlayerManager manager].tag:@""
16   -#define PLAYER_TestEnvironment [CNLivePlayerManager manager].isTestEnvironment
17   -
18   -NS_ASSUME_NONNULL_BEGIN
19   -
20   -@interface CNLivePlayerManager : NSObject
21   -+ (CNLivePlayerManager *)manager;
22   -
23   -/**
24   - * 应用ID(只读)
25   - */
26   -@property (nonatomic, copy, readonly) NSString *appId;
27   -
28   -/**
29   - * 应用KEY(只读)
30   - */
31   -@property (nonatomic, copy, readonly) NSString *appKey;
32   -
33   -/**
34   - * 是否是测试环境
35   - */
36   -@property (nonatomic, assign, readonly) BOOL isTestEnvironment;
37   -
38   -/**
39   - * 用户ID
40   - */
41   -@property (nonatomic, copy) NSString *userId;
42   -
43   -/**
44   - * ChannelName 网++定制
45   - */
46   -@property (nonatomic, copy) NSString *channelName;
47   -
48   -/**
49   - * tag 网++定制
50   - */
51   -@property (nonatomic, copy) NSString *tag;
52   -
53   -/**
54   - * from 网++定制
55   - */
56   -@property (nonatomic, copy) NSString *from;
57   -
58   -/**
59   - @abstract 初始化直播云SDK(该方法默认正式环境)
60   - @param appId 在open.cnlive.com网站申请得到的appId
61   - @param appKey 在open.cnlive.com网站申请得到的appKey
62   - @warning 必传参数
63   - */
64   -+ (void)setAppId:(NSString *)appId appKey:(NSString *)appKey;
65   -
66   -/**
67   - @abstract 初始化直播云SDK
68   - @param appId 在open.cnlive.com网站申请得到的appId
69   - @param appKey 在open.cnlive.com网站申请得到的appKey
70   - @param isTestEnvironment YES:测试环境 NO:正式环境
71   - @warning 必传参数
72   - */
73   -+ (void)setAppId:(NSString *)appId appKey:(NSString *)appKey isTestEnvironment:(BOOL)isTestEnvironment;
74   -
75   -/**
76   - @abstract 获取版本号
77   - */
78   -+ (NSString *)getVersion;
79   -
80   -
81   -@end
82   -
83   -NS_ASSUME_NONNULL_END
Example/Products/CNLivePlayer.framework/Info.plist deleted 100644 → 0
No preview for this file type
Example/Products/CNLivePlayer.framework/Modules/module.modulemap deleted 100644 → 0
1   -framework module CNLivePlayer {
2   - umbrella header "CNLivePlayer-umbrella.h"
3   -
4   - export *
5   - module * { export * }
6   -}
Example/Products/CNLivePlayer.framework/PrivateHeaders/CNLivePlayer-umbrella.h deleted 100644 → 0
1   -#ifdef __OBJC__
2   -#import <UIKit/UIKit.h>
3   -#else
4   -#ifndef FOUNDATION_EXPORT
5   -#if defined(__cplusplus)
6   -#define FOUNDATION_EXPORT extern "C"
7   -#else
8   -#define FOUNDATION_EXPORT extern
9   -#endif
10   -#endif
11   -#endif
12   -
13   -#import "CNLivePlayer.h"
14   -#import "CNLivePlayerConst.h"
15   -#import "CNLivePlayerDefines.h"
16   -#import "CNLivePlayerManager.h"
17   -#import "CNLivePlayerCache.h"
18   -#import "CNLivePlayerCache.h"
19   -#import "CNLivePlayerNetworkManager.h"
20   -#import "CNLiveURLRequestSerialization.h"
21   -#import "CNLivePlayer.h"
22   -#import "CNLivePlayerConst.h"
23   -#import "CNLivePlayerDefines.h"
24   -#import "CNLivePlayerManager.h"
25   -#import "CNLivePlayerTools.h"
26   -
27   -FOUNDATION_EXPORT double CNLivePlayerVersionNumber;
28   -FOUNDATION_EXPORT const unsigned char CNLivePlayerVersionString[];
29   -
Example/Products/CNLivePlayer.framework/PrivateHeaders/CNLivePlayerConst.h deleted 100644 → 0
1   -//
2   -// CNLivePlayerConst.h
3   -// CNLivePlayer
4   -//
5   -// Created by CNLive-zxw on 2019/8/14.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#ifndef CNLivePlayerConst_h
10   -#define CNLivePlayerConst_h
11   -
12   -#pragma mark - 版本号
13   -#define PlayerSDKVersion @"0.0.1" //播放器SDK版本
14   -
15   -#pragma mark - 探针
16   -#define StatUrl [CNLivePlayerManager manager].isTestEnvironment?@"http://app.sta.cnlive.com/app.jpg": @"http://app.sta.cnlive.com/app.jpg"
17   -#define StatVersion @"4.0" //探针版本
18   -#define StatAppVersion ([[[NSBundle mainBundle] infoDictionary] objectForKey: @"CFBundleShortVersionString"])
19   -
20   -#pragma mark - 鉴权
21   -#define authUrl [NSString stringWithFormat:@"%@/platform/valid", [CNLivePlayerManager manager].isTestEnvironment ? @"http://test.open.cnlive.com/openapi/api2" : @"http://api.cnlive.com/open/api2"]
22   -
23   -#pragma mark - 点播
24   -#define vodUrl [CNLivePlayerManager manager].isTestEnvironment ? @"http://test.open.cnlive.com/openapi/api2/vod_ips/vodplayByAPP":@"http://api.cnlive.com/open/api2/vod_ips/vodplayByAPP"
25   -
26   -#pragma mark - 直播
27   -#define liveUrl [CNLivePlayerManager manager].isTestEnvironment ? @"http://test.open.cnlive.com/openapi/api2/live_ips/liveplayByAPP":@"http://api.cnlive.com/open/api2/live_ips/liveplayByAPP"
28   -
29   -#endif /* CNLivePlayerConst_h */
Example/Products/CNLivePlayer.framework/PrivateHeaders/CNLivePlayerNetworkManager.h deleted 100644 → 0
1   -//
2   -// CNLivePlayerNetworkManager.h
3   -// CNLivePlayer_Example
4   -//
5   -// Created by CNLive-zxw on 2019/7/26.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#import <Foundation/Foundation.h>
10   -
11   -NS_ASSUME_NONNULL_BEGIN
12   -typedef void(^GetVideoURLSuccessBlock)(NSString * _Nullable videoURL, NSInteger code);
13   -
14   -@interface CNLivePlayerNetworkManager : NSObject
15   -/**
16   - * 设置超时时间
17   - */
18   -@property (nonatomic, assign) NSTimeInterval timeoutInterval;
19   -
20   -/**
21   - * 缓存策略
22   - */
23   -@property (nonatomic, assign) NSURLRequestCachePolicy cachePolicy;
24   -
25   -+ (CNLivePlayerNetworkManager *)manager;
26   -
27   -/**
28   - * GET 请求
29   - * @param URL url
30   - * @param parameters 上传参数
31   - * @param success 请求成功回调
32   - * @param failure 请求失败回调
33   - */
34   -+ (void)GET:(nullable NSString *)URL parameters:(nullable NSDictionary *)parameters success:(nullable void (^)(NSURLResponse *_Nullable response, id _Nullable responseObject))success failure:(nullable void (^)(NSURLResponse *_Nullable response, NSError *_Nullable error))failure;
35   -
36   -/**
37   - * POST 请求
38   - * @param URL url
39   - * @param parameters 上传参数
40   - * @param success 请求成功回调
41   - * @param failure 请求失败回调
42   - */
43   -+ (void)POST:(nullable NSString *)URL parameters:(nullable NSDictionary *)parameters success:(nullable void (^)(NSURLResponse *_Nullable response, id _Nullable responseObject))success failure:(nullable void (^)(NSURLResponse *_Nullable response, NSError *_Nullable error))failure;
44   -
45   -
46   -#pragma mark - 针对具体业务
47   -/**
48   - * 鉴权
49   - */
50   -- (void)authenticate:(NSString *)URL success:(void (^)(NSURLResponse * _Nullable, id _Nullable))success failure:(void (^)(NSURLResponse * _Nullable, NSError * _Nullable))failure;
51   -
52   -/**
53   - * 获取视频url
54   - */
55   -+ (void)getVideoURL:(nullable NSString *)URL success:(GetVideoURLSuccessBlock)success;
56   -
57   -
58   -@end
59   -
60   -NS_ASSUME_NONNULL_END
Example/Products/CNLivePlayer.framework/PrivateHeaders/CNLivePlayerTools.h deleted 100644 → 0
1   -//
2   -// CNLivePlayerTools.h
3   -// CNLivePlayer_Example
4   -//
5   -// Created by CNLive-zxw on 2019/7/26.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#import <Foundation/Foundation.h>
10   -
11   -@interface CNLivePlayerTools : NSObject
12   -
13   -/**
14   - * SHA1加密
15   - */
16   -+ (NSString *)encryptionSignWithUrl:(NSString *)url parameter:(NSDictionary *)parameter;
17   -
18   -+ (NSString *)sha1:(NSString *)string;
19   -
20   -+ (NSString *)signvalue:(NSDictionary*)parameter;
21   -
22   -/**
23   - * 获取UUID_Timestamp
24   - */
25   -+ (NSString *)getUidForTimestamp:(NSString *)timestamp;
26   -
27   -//错误信息
28   -+ (NSError *)customErrorWithResponseObject:(id)responseObject errorInfo:(NSString *)errorInfo;
29   -
30   -/**
31   - * 验证是是否为是空字符串
32   - */
33   -+ (BOOL)isEmptyString:(NSString *)string;
34   -
35   -/**
36   - * 获取时间戳
37   - */
38   -+ (NSString *)getTimestamp;
39   -
40   -
41   -#pragma mark - 方法
42   -/**
43   - * 视频出错,上传接口
44   - */
45   -+ (void)errorStat:(NSString *)errorString contentId:(NSString *)contentId idName:(NSString *)idName;
46   -
47   -+ (void)statSDKWithContentId:(NSString *)contentId idName:(NSString *)idName;
48   -
49   -@end
Example/Products/CNLivePlayer.framework/PrivateHeaders/CNLiveURLRequestSerialization.h deleted 100644 → 0
1   -//
2   -// CNLiveURLRequestSerialization.h
3   -// CNLivePlayer_Example
4   -//
5   -// Created by CNLive-zxw on 2019/7/26.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#import <Foundation/Foundation.h>
10   -
11   -NS_ASSUME_NONNULL_BEGIN
12   -
13   -@interface CNLiveURLRequestSerialization : NSObject
14   -+ (nullable NSString *)cn_QueryStringFromParameters:(nullable NSDictionary *)parameters;
15   -
16   -@end
17   -
18   -NS_ASSUME_NONNULL_END
Example/build/Debug-iphoneos/CNLivePlayer/CNLivePlayer.framework/CNLivePlayer deleted 100644 → 0
No preview for this file type
Example/build/Debug-iphoneos/CNLivePlayer/CNLivePlayer.framework/Headers/CNLivePlayer.h deleted 100644 → 0
1   -//
2   -// CNLivePlayer.h
3   -// CNLivePlayer_Example
4   -//
5   -// Created by CNLive-zxw on 2019/7/26.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#import <Foundation/Foundation.h>
10   -#import <libksygpulive/KSYMoviePlayerController.h>
11   -#import "KSYMoviePlayerDefines.h"
12   -
13   -// 枚举定义
14   -#import "CNLivePlayerDefines.h"
15   -
16   -// 播放器管理类
17   -#import "CNLivePlayerManager.h"
18   -
19   -//缓存url
20   -#import "CNLivePlayerCache.h"
21   -
22   -NS_ASSUME_NONNULL_BEGIN
23   -
24   -/*
25   - * 获取主播状态通知
26   - */
27   -UIKIT_EXTERN NSString *const CNLiveHostStatusChangedNotification;
28   -
29   -/*
30   - * 成功回调
31   - */
32   -typedef void(^AuthSuccessBlock)(void);
33   -
34   -/*
35   - * 失败回调
36   - */
37   -typedef void(^AuthFailureBlock)(NSDictionary *errorInfo);
38   -
39   -@interface CNLivePlayer : NSObject
40   -
41   -/*
42   - * 播放器类型
43   - */
44   -@property (nonatomic, assign, readonly) CNLivePlayerType type;
45   -
46   -/*
47   - * 播放器
48   - */
49   -@property (nonatomic, strong) KSYMoviePlayerController *player;
50   -
51   -#pragma mark - 初始化方法
52   -/*
53   - * 初始化播放器并设置播放地址
54   - *
55   - * url 视频url
56   - *
57   - */
58   -- (instancetype)initWithContentURL:(NSURL *)url;
59   -
60   -
61   -/* 初始化点播播放器 初始化成功后才能对播放器进行设置(如:自动播放、是否开启硬件解码等)和调用准备播放视频方法(prepareToPlay)
62   - *
63   - * videoId 视频Id
64   - * authSuccess 初始化成功block
65   - * authFailed 初始化失败block 回调一个errorInfo的字典
66   - *
67   - */
68   -- (instancetype)initVodPlayerWithVideoId:(NSString *)videoId authSuccess:(AuthSuccessBlock)authSuccessBlock authFailure:(AuthFailureBlock)authFailureBlock;
69   -
70   -
71   -/* 初始化直播播放器(* 以channelId播放) 初始化成功后才能对播放器进行设置(如:自动播放、是否开启硬件解码等)和调用准备播放视频方法(prepareToPlay)
72   - *
73   - * channelId 直播视频Id (注* 若agree为YES时,必传,用于获取主播状态; 若agree为NO,可不传)
74   - * activityId 活动Id
75   - * agree 是否允许获取主播状态 YES:获取 NO:不获取
76   - * authSuccess 初始化成功block
77   - * authFailed 初始化失败block 回调一个errorInfo的字典
78   - *
79   - * result 获取主播状态 YES:获取状态成功
80   - * NO:获取失败,不影响视频播放,但是获取不到主播离开、回来、直播结束等通知。
81   - * 可通过- (void)getHostStatus:(void(^)(BOOL result))result;方法重新获取
82   - */
83   -- (instancetype)initLivePlayerWithChannelId:(NSString *)channelId activityId:(NSString *)activityId hostStatus:(BOOL)agree authSuccess:(AuthSuccessBlock)authSuccessBlock authFailure:(AuthFailureBlock)authFailureBlock getHostStatusResult:(void(^)(BOOL result))result;
84   -
85   -
86   -/* 初始化音频播放器 初始化成功后才能对播放器进行设置(如:自动播放、是否开启硬件解码等)和调用准备播放视频方法(prepareToPlay)
87   - *
88   - * contentId 音频Id
89   - * authSuccess 初始化成功block
90   - * authFailed 初始化失败block 回调一个errorInfo的字典
91   - *
92   - */
93   -- (instancetype)initAudioPlayerWithAudioId:(NSString *)audioId authSuccess:(AuthSuccessBlock)authSuccessBlock authFailure:(AuthFailureBlock)authFailureBlock;
94   -
95   -#pragma mark - 属性
96   -/**
97   - @abstract 正在播放的视频文件的地址,该地址可以是本地地址或者服务器地址。
98   - */
99   -@property (nonatomic, readonly) NSURL *contentURL;
100   -
101   -/**
102   - @abstract 包含视频播放内容的VIEW(只读)。
103   - @discussion view的使用逻辑:
104   -
105   - * 可以通过frame设置view大大小
106   - * 使用[scalingMode]([KSYMoviePlayerController scalingMode]) 可以更改视频内容在VIEW中的显示情况
107   -
108   - @see scalingMode
109   - */
110   -// The view in which the media and playback controls are displayed.
111   -@property (nonatomic, strong, readonly) UIView *view;
112   -
113   -/*
114   - * 主播直播状态(只读)
115   - */
116   -@property (nonatomic, assign, readonly) CNLiveHostStatus hostStatus;
117   -
118   -/**
119   - @abstract 是否静音
120   - @discussion
121   - * 默认不静音
122   - * [prepareToPlay]方法前设置即生效,也可以在播放过程中动态切换
123   - */
124   -@property (nonatomic) BOOL shouldMute;
125   -
126   -/**
127   - @abstract 是否循环播放
128   - @discussion 默认不循环
129   - * 只在[prepareToPlay]调用前设置生效;
130   - * 只有点播生效,直播场景请勿设置
131   - */
132   -@property (nonatomic) BOOL shouldLoop;
133   -
134   -/**
135   - @abstract 指定逆时针旋转角度,只能是0/90/180/270, 不符合上述值不进行旋转
136   - */
137   -@property (nonatomic, assign) int rotateDegress;
138   -
139   -/**
140   - @abstract 是否打断其他后台的音乐播放
141   - @discussion 也可以理解为是否允许和其他音频同时播放
142   - @discussion YES:开始播放时,会打断其他的后台播放音频,也会被其他音频播放打断
143   - @discussion NO: 可以与其他后台播放共存,相互之间不会被打断
144   - @discussion 默认为YES
145   - */
146   -@property (nonatomic) BOOL bInterruptOtherAudio;
147   -
148   -/*
149   - * 查询视频准备是否完成(只读)
150   - */
151   -@property (nonatomic, readonly) BOOL isPreparedToPlay;
152   -
153   -#pragma mark - 方法
154   -/*
155   - * 获取主播状态(离开/已结束)
156   - */
157   -- (void)getHostStatus:(void(^)(BOOL result))result;
158   -
159   -/* 给播放器设置内容id 设置成功后才能播放(如:自动播放、是否开启硬件解码等)和调用准备播放视频方法(prepareToPlay)
160   - * 切换视频
161   - * contentId 内容Id
162   - * type 内容类型
163   - *
164   - */
165   -- (void)setPlayerWithContentId:(NSString *)contentId type:(CNLivePlayerType)type authSuccess:(AuthSuccessBlock)authSuccessBlock authFailure:(AuthFailureBlock)authFailureBlock;
166   -
167   -/*
168   - * 销毁播放器
169   - */
170   -- (void)destroyPlayer;
171   -
172   -/*
173   - * 准备视频播放
174   - * MPMediaPlaybackIsPreparedToPlayDidChangeNotification 播放器完成对视频文件的初始化时发送通知
175   - */
176   -- (void)prepareToPlay;
177   -
178   -/*
179   - * 视频播放
180   - */
181   -- (void)play;
182   -
183   -/*
184   - * 当前播放器是否在播放
185   - */
186   -- (BOOL)isPlaying;
187   -
188   -/*
189   - * 视频暂停
190   - */
191   -- (void)pause;
192   -
193   -/*
194   - * 视频停止
195   - */
196   -- (void)stop;
197   -
198   -/*
199   - * 视频截图
200   - */
201   -- (UIImage *)thumbnailImageAtCurrentTime;
202   -
203   -@end
204   -
205   -NS_ASSUME_NONNULL_END
Example/build/Debug-iphoneos/CNLivePlayer/CNLivePlayer.framework/Headers/CNLivePlayerCache.h deleted 100644 → 0
1   -//
2   -// CNLivePlayerCache.h
3   -// CNLivePlayer_Example
4   -//
5   -// Created by CNLive-zxw on 2019/7/26.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#import <Foundation/Foundation.h>
10   -
11   -NS_ASSUME_NONNULL_BEGIN
12   -
13   -@interface CNLivePlayerCache : NSObject
14   -
15   -/**
16   - * 存储或者修改数据
17   - *
18   - * @param data 保存的数据
19   - * @param key 保存的key
20   - */
21   -+ (void)player_SaveDataCache:(id)data forKey:(NSString *)key;
22   -
23   -
24   -/**
25   - * 读取数据
26   - *
27   - * @param key 保存的key
28   - *
29   - * @return 返回id
30   - */
31   -+ (id)player_ReadCache:(NSString *)key;
32   -
33   -
34   -/**
35   - * 读取缓存文件的大小
36   - *
37   - * @return 返回NSString
38   - */
39   -+ (NSString *)player_GetAllHttpCacheSize;
40   -
41   -
42   -/**
43   - * 是否缓存过
44   - *
45   - * @param key 保存的key
46   - *
47   - * @return 返回NSString
48   - */
49   -+ (BOOL)player_IsCache:(NSString *)key;
50   -
51   -
52   -/**
53   - * 删除某个磁盘缓存文件
54   - *
55   - * @param key 保存的key(就是请求的url)
56   - *
57   - */
58   -+ (void)player_RemoveChache:(NSString *)key;
59   -
60   -
61   -/**
62   - * 磁盘最大缓存开销
63   - * 默认是30*1024*1024
64   - */
65   -+ (void)player_SetCostLimit:(NSInteger)costLimit;
66   -
67   -
68   -/**
69   - * 删除所有的磁盘缓存url(YYCache)
70   - */
71   -+ (void)player_RemoveAllUrlCache;
72   -
73   -
74   -/**
75   - * 删除所有的磁盘缓存url(YYCache)
76   - * 删除所有的磁盘缓存视频(KSYHTTPProxyService)
77   - */
78   -+ (void)player_clearAllCache;
79   -
80   -@end
81   -
82   -NS_ASSUME_NONNULL_END
Example/build/Debug-iphoneos/CNLivePlayer/CNLivePlayer.framework/Headers/CNLivePlayerDefines.h deleted 100644 → 0
1   -//
2   -// CNLivePlayerDefines.h
3   -// CNLivePlayer
4   -//
5   -// Created by CNLive-zxw on 2019/8/14.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#ifndef CNLivePlayerDefines_h
10   -#define CNLivePlayerDefines_h
11   -
12   -/*
13   - * 播放器类型
14   - */
15   -typedef NS_ENUM(NSUInteger, CNLivePlayerType) {
16   - CNLivePlayerVod, //点播
17   - CNLivePlayerLive, //直播
18   - CNLivePlayerAudio //音频
19   -
20   -};
21   -
22   -/**
23   - * 主播直播状态
24   - */
25   -typedef NS_ENUM(NSUInteger, CNLiveHostStatus) {
26   - //主播直播中
27   - CNLiveHostStatusLiving = 1,
28   - //直播已结束
29   - CNLiveHostStatusEnd = 2,
30   - //主播已离开
31   - CNLiveHostStatusLeaving = 3
32   -
33   -};
34   -
35   -#endif /* CNLivePlayerDefines_h */
Example/build/Debug-iphoneos/CNLivePlayer/CNLivePlayer.framework/Headers/CNLivePlayerManager.h deleted 100644 → 0
1   -//
2   -// CNLivePlayerManager.h
3   -// CNLivePlayer_Example
4   -//
5   -// Created by CNLive-zxw on 2019/7/26.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#import <Foundation/Foundation.h>
10   -
11   -#define PLAYER_AppID [CNLivePlayerManager manager].appId?[CNLivePlayerManager manager].appId:@""
12   -#define PLAYER_AppKey [CNLivePlayerManager manager].appKey?[CNLivePlayerManager manager].appKey:@""
13   -#define PLAYER_UserId [CNLivePlayerManager manager].userId?[CNLivePlayerManager manager].userId:@""
14   -#define PLAYER_ChannelName [CNLivePlayerManager manager].channelName?[CNLivePlayerManager manager].channelName:@""
15   -#define PLAYER_Tag [CNLivePlayerManager manager].tag?[CNLivePlayerManager manager].tag:@""
16   -#define PLAYER_TestEnvironment [CNLivePlayerManager manager].isTestEnvironment
17   -
18   -NS_ASSUME_NONNULL_BEGIN
19   -
20   -@interface CNLivePlayerManager : NSObject
21   -+ (CNLivePlayerManager *)manager;
22   -
23   -/**
24   - * 应用ID(只读)
25   - */
26   -@property (nonatomic, copy, readonly) NSString *appId;
27   -
28   -/**
29   - * 应用KEY(只读)
30   - */
31   -@property (nonatomic, copy, readonly) NSString *appKey;
32   -
33   -/**
34   - * 是否是测试环境
35   - */
36   -@property (nonatomic, assign, readonly) BOOL isTestEnvironment;
37   -
38   -/**
39   - * 用户ID
40   - */
41   -@property (nonatomic, copy) NSString *userId;
42   -
43   -/**
44   - * ChannelName 网++定制
45   - */
46   -@property (nonatomic, copy) NSString *channelName;
47   -
48   -/**
49   - * tag 网++定制
50   - */
51   -@property (nonatomic, copy) NSString *tag;
52   -
53   -/**
54   - * from 网++定制
55   - */
56   -@property (nonatomic, copy) NSString *from;
57   -
58   -/**
59   - @abstract 初始化直播云SDK(该方法默认正式环境)
60   - @param appId 在open.cnlive.com网站申请得到的appId
61   - @param appKey 在open.cnlive.com网站申请得到的appKey
62   - @warning 必传参数
63   - */
64   -+ (void)setAppId:(NSString *)appId appKey:(NSString *)appKey;
65   -
66   -/**
67   - @abstract 初始化直播云SDK
68   - @param appId 在open.cnlive.com网站申请得到的appId
69   - @param appKey 在open.cnlive.com网站申请得到的appKey
70   - @param isTestEnvironment YES:测试环境 NO:正式环境
71   - @warning 必传参数
72   - */
73   -+ (void)setAppId:(NSString *)appId appKey:(NSString *)appKey isTestEnvironment:(BOOL)isTestEnvironment;
74   -
75   -/**
76   - @abstract 获取版本号
77   - */
78   -+ (NSString *)getVersion;
79   -
80   -
81   -@end
82   -
83   -NS_ASSUME_NONNULL_END
Example/build/Debug-iphoneos/CNLivePlayer/CNLivePlayer.framework/Info.plist deleted 100644 → 0
No preview for this file type
Example/build/Debug-iphoneos/CNLivePlayer/CNLivePlayer.framework/Modules/module.modulemap deleted 100644 → 0
1   -framework module CNLivePlayer {
2   - umbrella header "CNLivePlayer-umbrella.h"
3   -
4   - export *
5   - module * { export * }
6   -}
Example/build/Debug-iphoneos/CNLivePlayer/CNLivePlayer.framework/PrivateHeaders/CNLivePlayer-umbrella.h deleted 100644 → 0
1   -#ifdef __OBJC__
2   -#import <UIKit/UIKit.h>
3   -#else
4   -#ifndef FOUNDATION_EXPORT
5   -#if defined(__cplusplus)
6   -#define FOUNDATION_EXPORT extern "C"
7   -#else
8   -#define FOUNDATION_EXPORT extern
9   -#endif
10   -#endif
11   -#endif
12   -
13   -#import "CNLivePlayer.h"
14   -#import "CNLivePlayerConst.h"
15   -#import "CNLivePlayerDefines.h"
16   -#import "CNLivePlayerManager.h"
17   -#import "CNLivePlayerCache.h"
18   -#import "CNLivePlayerCache.h"
19   -#import "CNLivePlayerNetworkManager.h"
20   -#import "CNLiveURLRequestSerialization.h"
21   -#import "CNLivePlayer.h"
22   -#import "CNLivePlayerConst.h"
23   -#import "CNLivePlayerDefines.h"
24   -#import "CNLivePlayerManager.h"
25   -#import "CNLivePlayerTools.h"
26   -
27   -FOUNDATION_EXPORT double CNLivePlayerVersionNumber;
28   -FOUNDATION_EXPORT const unsigned char CNLivePlayerVersionString[];
29   -
Example/build/Debug-iphoneos/CNLivePlayer/CNLivePlayer.framework/PrivateHeaders/CNLivePlayerConst.h deleted 100644 → 0
1   -//
2   -// CNLivePlayerConst.h
3   -// CNLivePlayer
4   -//
5   -// Created by CNLive-zxw on 2019/8/14.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#ifndef CNLivePlayerConst_h
10   -#define CNLivePlayerConst_h
11   -
12   -#pragma mark - 版本号
13   -#define PlayerSDKVersion @"0.0.1" //播放器SDK版本
14   -
15   -#pragma mark - 探针
16   -#define StatUrl [CNLivePlayerManager manager].isTestEnvironment?@"http://app.sta.cnlive.com/app.jpg": @"http://app.sta.cnlive.com/app.jpg"
17   -#define StatVersion @"4.0" //探针版本
18   -#define StatAppVersion ([[[NSBundle mainBundle] infoDictionary] objectForKey: @"CFBundleShortVersionString"])
19   -
20   -#pragma mark - 鉴权
21   -#define authUrl [NSString stringWithFormat:@"%@/platform/valid", [CNLivePlayerManager manager].isTestEnvironment ? @"http://test.open.cnlive.com/openapi/api2" : @"http://api.cnlive.com/open/api2"]
22   -
23   -#pragma mark - 点播
24   -#define vodUrl [CNLivePlayerManager manager].isTestEnvironment ? @"http://test.open.cnlive.com/openapi/api2/vod_ips/vodplayByAPP":@"http://api.cnlive.com/open/api2/vod_ips/vodplayByAPP"
25   -
26   -#pragma mark - 直播
27   -#define liveUrl [CNLivePlayerManager manager].isTestEnvironment ? @"http://test.open.cnlive.com/openapi/api2/live_ips/liveplayByAPP":@"http://api.cnlive.com/open/api2/live_ips/liveplayByAPP"
28   -
29   -#endif /* CNLivePlayerConst_h */
Example/build/Debug-iphoneos/CNLivePlayer/CNLivePlayer.framework/PrivateHeaders/CNLivePlayerNetworkManager.h deleted 100644 → 0
1   -//
2   -// CNLivePlayerNetworkManager.h
3   -// CNLivePlayer_Example
4   -//
5   -// Created by CNLive-zxw on 2019/7/26.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#import <Foundation/Foundation.h>
10   -
11   -NS_ASSUME_NONNULL_BEGIN
12   -typedef void(^GetVideoURLSuccessBlock)(NSString * _Nullable videoURL, NSInteger code);
13   -
14   -@interface CNLivePlayerNetworkManager : NSObject
15   -/**
16   - * 设置超时时间
17   - */
18   -@property (nonatomic, assign) NSTimeInterval timeoutInterval;
19   -
20   -/**
21   - * 缓存策略
22   - */
23   -@property (nonatomic, assign) NSURLRequestCachePolicy cachePolicy;
24   -
25   -+ (CNLivePlayerNetworkManager *)manager;
26   -
27   -/**
28   - * GET 请求
29   - * @param URL url
30   - * @param parameters 上传参数
31   - * @param success 请求成功回调
32   - * @param failure 请求失败回调
33   - */
34   -+ (void)GET:(nullable NSString *)URL parameters:(nullable NSDictionary *)parameters success:(nullable void (^)(NSURLResponse *_Nullable response, id _Nullable responseObject))success failure:(nullable void (^)(NSURLResponse *_Nullable response, NSError *_Nullable error))failure;
35   -
36   -/**
37   - * POST 请求
38   - * @param URL url
39   - * @param parameters 上传参数
40   - * @param success 请求成功回调
41   - * @param failure 请求失败回调
42   - */
43   -+ (void)POST:(nullable NSString *)URL parameters:(nullable NSDictionary *)parameters success:(nullable void (^)(NSURLResponse *_Nullable response, id _Nullable responseObject))success failure:(nullable void (^)(NSURLResponse *_Nullable response, NSError *_Nullable error))failure;
44   -
45   -
46   -#pragma mark - 针对具体业务
47   -/**
48   - * 鉴权
49   - */
50   -- (void)authenticate:(NSString *)URL success:(void (^)(NSURLResponse * _Nullable, id _Nullable))success failure:(void (^)(NSURLResponse * _Nullable, NSError * _Nullable))failure;
51   -
52   -/**
53   - * 获取视频url
54   - */
55   -+ (void)getVideoURL:(nullable NSString *)URL success:(GetVideoURLSuccessBlock)success;
56   -
57   -
58   -@end
59   -
60   -NS_ASSUME_NONNULL_END
Example/build/Debug-iphoneos/CNLivePlayer/CNLivePlayer.framework/PrivateHeaders/CNLivePlayerTools.h deleted 100644 → 0
1   -//
2   -// CNLivePlayerTools.h
3   -// CNLivePlayer_Example
4   -//
5   -// Created by CNLive-zxw on 2019/7/26.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#import <Foundation/Foundation.h>
10   -
11   -@interface CNLivePlayerTools : NSObject
12   -
13   -/**
14   - * SHA1加密
15   - */
16   -+ (NSString *)encryptionSignWithUrl:(NSString *)url parameter:(NSDictionary *)parameter;
17   -
18   -+ (NSString *)sha1:(NSString *)string;
19   -
20   -+ (NSString *)signvalue:(NSDictionary*)parameter;
21   -
22   -/**
23   - * 获取UUID_Timestamp
24   - */
25   -+ (NSString *)getUidForTimestamp:(NSString *)timestamp;
26   -
27   -//错误信息
28   -+ (NSError *)customErrorWithResponseObject:(id)responseObject errorInfo:(NSString *)errorInfo;
29   -
30   -/**
31   - * 验证是是否为是空字符串
32   - */
33   -+ (BOOL)isEmptyString:(NSString *)string;
34   -
35   -/**
36   - * 获取时间戳
37   - */
38   -+ (NSString *)getTimestamp;
39   -
40   -
41   -#pragma mark - 方法
42   -/**
43   - * 视频出错,上传接口
44   - */
45   -+ (void)errorStat:(NSString *)errorString contentId:(NSString *)contentId idName:(NSString *)idName;
46   -
47   -+ (void)statSDKWithContentId:(NSString *)contentId idName:(NSString *)idName;
48   -
49   -@end
Example/build/Debug-iphoneos/CNLivePlayer/CNLivePlayer.framework/PrivateHeaders/CNLiveURLRequestSerialization.h deleted 100644 → 0
1   -//
2   -// CNLiveURLRequestSerialization.h
3   -// CNLivePlayer_Example
4   -//
5   -// Created by CNLive-zxw on 2019/7/26.
6   -// Copyright © 2019 153993236@qq.com. All rights reserved.
7   -//
8   -
9   -#import <Foundation/Foundation.h>
10   -
11   -NS_ASSUME_NONNULL_BEGIN
12   -
13   -@interface CNLiveURLRequestSerialization : NSObject
14   -+ (nullable NSString *)cn_QueryStringFromParameters:(nullable NSDictionary *)parameters;
15   -
16   -@end
17   -
18   -NS_ASSUME_NONNULL_END
Example/build/Debug-iphoneos/CocoaAsyncSocket/CocoaAsyncSocket.framework/CocoaAsyncSocket deleted 100755 → 0
No preview for this file type
Example/build/Debug-iphoneos/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers/CocoaAsyncSocket-umbrella.h deleted 100644 → 0
1   -#ifdef __OBJC__
2   -#import <UIKit/UIKit.h>
3   -#else
4   -#ifndef FOUNDATION_EXPORT
5   -#if defined(__cplusplus)
6   -#define FOUNDATION_EXPORT extern "C"
7   -#else
8   -#define FOUNDATION_EXPORT extern
9   -#endif
10   -#endif
11   -#endif
12   -
13   -#import "GCDAsyncSocket.h"
14   -#import "GCDAsyncUdpSocket.h"
15   -
16   -FOUNDATION_EXPORT double CocoaAsyncSocketVersionNumber;
17   -FOUNDATION_EXPORT const unsigned char CocoaAsyncSocketVersionString[];
18   -
Example/build/Debug-iphoneos/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers/GCDAsyncSocket.h deleted 100644 → 0
1   -//
2   -// GCDAsyncSocket.h
3   -//
4   -// This class is in the public domain.
5   -// Originally created by Robbie Hanson in Q3 2010.
6   -// Updated and maintained by Deusty LLC and the Apple development community.
7   -//
8   -// https://github.com/robbiehanson/CocoaAsyncSocket
9   -//
10   -
11   -#import <Foundation/Foundation.h>
12   -#import <Security/Security.h>
13   -#import <Security/SecureTransport.h>
14   -#import <dispatch/dispatch.h>
15   -#import <Availability.h>
16   -
17   -#include <sys/socket.h> // AF_INET, AF_INET6
18   -
19   -@class GCDAsyncReadPacket;
20   -@class GCDAsyncWritePacket;
21   -@class GCDAsyncSocketPreBuffer;
22   -@protocol GCDAsyncSocketDelegate;
23   -
24   -NS_ASSUME_NONNULL_BEGIN
25   -
26   -extern NSString *const GCDAsyncSocketException;
27   -extern NSString *const GCDAsyncSocketErrorDomain;
28   -
29   -extern NSString *const GCDAsyncSocketQueueName;
30   -extern NSString *const GCDAsyncSocketThreadName;
31   -
32   -extern NSString *const GCDAsyncSocketManuallyEvaluateTrust;
33   -#if TARGET_OS_IPHONE
34   -extern NSString *const GCDAsyncSocketUseCFStreamForTLS;
35   -#endif
36   -#define GCDAsyncSocketSSLPeerName (NSString *)kCFStreamSSLPeerName
37   -#define GCDAsyncSocketSSLCertificates (NSString *)kCFStreamSSLCertificates
38   -#define GCDAsyncSocketSSLIsServer (NSString *)kCFStreamSSLIsServer
39   -extern NSString *const GCDAsyncSocketSSLPeerID;
40   -extern NSString *const GCDAsyncSocketSSLProtocolVersionMin;
41   -extern NSString *const GCDAsyncSocketSSLProtocolVersionMax;
42   -extern NSString *const GCDAsyncSocketSSLSessionOptionFalseStart;
43   -extern NSString *const GCDAsyncSocketSSLSessionOptionSendOneByteRecord;
44   -extern NSString *const GCDAsyncSocketSSLCipherSuites;
45   -#if !TARGET_OS_IPHONE
46   -extern NSString *const GCDAsyncSocketSSLDiffieHellmanParameters;
47   -#endif
48   -
49   -#define GCDAsyncSocketLoggingContext 65535
50   -
51   -
52   -typedef NS_ENUM(NSInteger, GCDAsyncSocketError) {
53   - GCDAsyncSocketNoError = 0, // Never used
54   - GCDAsyncSocketBadConfigError, // Invalid configuration
55   - GCDAsyncSocketBadParamError, // Invalid parameter was passed
56   - GCDAsyncSocketConnectTimeoutError, // A connect operation timed out
57   - GCDAsyncSocketReadTimeoutError, // A read operation timed out
58   - GCDAsyncSocketWriteTimeoutError, // A write operation timed out
59   - GCDAsyncSocketReadMaxedOutError, // Reached set maxLength without completing
60   - GCDAsyncSocketClosedError, // The remote peer closed the connection
61   - GCDAsyncSocketOtherError, // Description provided in userInfo
62   -};
63   -
64   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
65   -#pragma mark -
66   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
67   -
68   -
69   -@interface GCDAsyncSocket : NSObject
70   -
71   -/**
72   - * GCDAsyncSocket uses the standard delegate paradigm,
73   - * but executes all delegate callbacks on a given delegate dispatch queue.
74   - * This allows for maximum concurrency, while at the same time providing easy thread safety.
75   - *
76   - * You MUST set a delegate AND delegate dispatch queue before attempting to
77   - * use the socket, or you will get an error.
78   - *
79   - * The socket queue is optional.
80   - * If you pass NULL, GCDAsyncSocket will automatically create it's own socket queue.
81   - * If you choose to provide a socket queue, the socket queue must not be a concurrent queue.
82   - * If you choose to provide a socket queue, and the socket queue has a configured target queue,
83   - * then please see the discussion for the method markSocketQueueTargetQueue.
84   - *
85   - * The delegate queue and socket queue can optionally be the same.
86   -**/
87   -- (instancetype)init;
88   -- (instancetype)initWithSocketQueue:(nullable dispatch_queue_t)sq;
89   -- (instancetype)initWithDelegate:(nullable id<GCDAsyncSocketDelegate>)aDelegate delegateQueue:(nullable dispatch_queue_t)dq;
90   -- (instancetype)initWithDelegate:(nullable id<GCDAsyncSocketDelegate>)aDelegate delegateQueue:(nullable dispatch_queue_t)dq socketQueue:(nullable dispatch_queue_t)sq;
91   -
92   -/**
93   - * Create GCDAsyncSocket from already connect BSD socket file descriptor
94   -**/
95   -+ (nullable instancetype)socketFromConnectedSocketFD:(int)socketFD socketQueue:(nullable dispatch_queue_t)sq error:(NSError**)error;
96   -
97   -+ (nullable instancetype)socketFromConnectedSocketFD:(int)socketFD delegate:(nullable id<GCDAsyncSocketDelegate>)aDelegate delegateQueue:(nullable dispatch_queue_t)dq error:(NSError**)error;
98   -
99   -+ (nullable instancetype)socketFromConnectedSocketFD:(int)socketFD delegate:(nullable id<GCDAsyncSocketDelegate>)aDelegate delegateQueue:(nullable dispatch_queue_t)dq socketQueue:(nullable dispatch_queue_t)sq error:(NSError **)error;
100   -
101   -#pragma mark Configuration
102   -
103   -@property (atomic, weak, readwrite, nullable) id<GCDAsyncSocketDelegate> delegate;
104   -#if OS_OBJECT_USE_OBJC
105   -@property (atomic, strong, readwrite, nullable) dispatch_queue_t delegateQueue;
106   -#else
107   -@property (atomic, assign, readwrite, nullable) dispatch_queue_t delegateQueue;
108   -#endif
109   -
110   -- (void)getDelegate:(id<GCDAsyncSocketDelegate> __nullable * __nullable)delegatePtr delegateQueue:(dispatch_queue_t __nullable * __nullable)delegateQueuePtr;
111   -- (void)setDelegate:(nullable id<GCDAsyncSocketDelegate>)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue;
112   -
113   -/**
114   - * If you are setting the delegate to nil within the delegate's dealloc method,
115   - * you may need to use the synchronous versions below.
116   -**/
117   -- (void)synchronouslySetDelegate:(nullable id<GCDAsyncSocketDelegate>)delegate;
118   -- (void)synchronouslySetDelegateQueue:(nullable dispatch_queue_t)delegateQueue;
119   -- (void)synchronouslySetDelegate:(nullable id<GCDAsyncSocketDelegate>)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue;
120   -
121   -/**
122   - * By default, both IPv4 and IPv6 are enabled.
123   - *
124   - * For accepting incoming connections, this means GCDAsyncSocket automatically supports both protocols,
125   - * and can simulataneously accept incoming connections on either protocol.
126   - *
127   - * For outgoing connections, this means GCDAsyncSocket can connect to remote hosts running either protocol.
128   - * If a DNS lookup returns only IPv4 results, GCDAsyncSocket will automatically use IPv4.
129   - * If a DNS lookup returns only IPv6 results, GCDAsyncSocket will automatically use IPv6.
130   - * If a DNS lookup returns both IPv4 and IPv6 results, the preferred protocol will be chosen.
131   - * By default, the preferred protocol is IPv4, but may be configured as desired.
132   -**/
133   -
134   -@property (atomic, assign, readwrite, getter=isIPv4Enabled) BOOL IPv4Enabled;
135   -@property (atomic, assign, readwrite, getter=isIPv6Enabled) BOOL IPv6Enabled;
136   -
137   -@property (atomic, assign, readwrite, getter=isIPv4PreferredOverIPv6) BOOL IPv4PreferredOverIPv6;
138   -
139   -/**
140   - * When connecting to both IPv4 and IPv6 using Happy Eyeballs (RFC 6555) https://tools.ietf.org/html/rfc6555
141   - * this is the delay between connecting to the preferred protocol and the fallback protocol.
142   - *
143   - * Defaults to 300ms.
144   -**/
145   -@property (atomic, assign, readwrite) NSTimeInterval alternateAddressDelay;
146   -
147   -/**
148   - * User data allows you to associate arbitrary information with the socket.
149   - * This data is not used internally by socket in any way.
150   -**/
151   -@property (atomic, strong, readwrite, nullable) id userData;
152   -
153   -#pragma mark Accepting
154   -
155   -/**
156   - * Tells the socket to begin listening and accepting connections on the given port.
157   - * When a connection is accepted, a new instance of GCDAsyncSocket will be spawned to handle it,
158   - * and the socket:didAcceptNewSocket: delegate method will be invoked.
159   - *
160   - * The socket will listen on all available interfaces (e.g. wifi, ethernet, etc)
161   -**/
162   -- (BOOL)acceptOnPort:(uint16_t)port error:(NSError **)errPtr;
163   -
164   -/**
165   - * This method is the same as acceptOnPort:error: with the
166   - * additional option of specifying which interface to listen on.
167   - *
168   - * For example, you could specify that the socket should only accept connections over ethernet,
169   - * and not other interfaces such as wifi.
170   - *
171   - * The interface may be specified by name (e.g. "en1" or "lo0") or by IP address (e.g. "192.168.4.34").
172   - * You may also use the special strings "localhost" or "loopback" to specify that
173   - * the socket only accept connections from the local machine.
174   - *
175   - * You can see the list of interfaces via the command line utility "ifconfig",
176   - * or programmatically via the getifaddrs() function.
177   - *
178   - * To accept connections on any interface pass nil, or simply use the acceptOnPort:error: method.
179   -**/
180   -- (BOOL)acceptOnInterface:(nullable NSString *)interface port:(uint16_t)port error:(NSError **)errPtr;
181   -
182   -/**
183   - * Tells the socket to begin listening and accepting connections on the unix domain at the given url.
184   - * When a connection is accepted, a new instance of GCDAsyncSocket will be spawned to handle it,
185   - * and the socket:didAcceptNewSocket: delegate method will be invoked.
186   - *
187   - * The socket will listen on all available interfaces (e.g. wifi, ethernet, etc)
188   - **/
189   -- (BOOL)acceptOnUrl:(NSURL *)url error:(NSError **)errPtr;
190   -
191   -#pragma mark Connecting
192   -
193   -/**
194   - * Connects to the given host and port.
195   - *
196   - * This method invokes connectToHost:onPort:viaInterface:withTimeout:error:
197   - * and uses the default interface, and no timeout.
198   -**/
199   -- (BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port error:(NSError **)errPtr;
200   -
201   -/**
202   - * Connects to the given host and port with an optional timeout.
203   - *
204   - * This method invokes connectToHost:onPort:viaInterface:withTimeout:error: and uses the default interface.
205   -**/
206   -- (BOOL)connectToHost:(NSString *)host
207   - onPort:(uint16_t)port
208   - withTimeout:(NSTimeInterval)timeout
209   - error:(NSError **)errPtr;
210   -
211   -/**
212   - * Connects to the given host & port, via the optional interface, with an optional timeout.
213   - *
214   - * The host may be a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2").
215   - * The host may also be the special strings "localhost" or "loopback" to specify connecting
216   - * to a service on the local machine.
217   - *
218   - * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35").
219   - * The interface may also be used to specify the local port (see below).
220   - *
221   - * To not time out use a negative time interval.
222   - *
223   - * This method will return NO if an error is detected, and set the error pointer (if one was given).
224   - * Possible errors would be a nil host, invalid interface, or socket is already connected.
225   - *
226   - * If no errors are detected, this method will start a background connect operation and immediately return YES.
227   - * The delegate callbacks are used to notify you when the socket connects, or if the host was unreachable.
228   - *
229   - * Since this class supports queued reads and writes, you can immediately start reading and/or writing.
230   - * All read/write operations will be queued, and upon socket connection,
231   - * the operations will be dequeued and processed in order.
232   - *
233   - * The interface may optionally contain a port number at the end of the string, separated by a colon.
234   - * This allows you to specify the local port that should be used for the outgoing connection. (read paragraph to end)
235   - * To specify both interface and local port: "en1:8082" or "192.168.4.35:2424".
236   - * To specify only local port: ":8082".
237   - * Please note this is an advanced feature, and is somewhat hidden on purpose.
238   - * You should understand that 99.999% of the time you should NOT specify the local port for an outgoing connection.
239   - * If you think you need to, there is a very good chance you have a fundamental misunderstanding somewhere.
240   - * Local ports do NOT need to match remote ports. In fact, they almost never do.
241   - * This feature is here for networking professionals using very advanced techniques.
242   -**/
243   -- (BOOL)connectToHost:(NSString *)host
244   - onPort:(uint16_t)port
245   - viaInterface:(nullable NSString *)interface
246   - withTimeout:(NSTimeInterval)timeout
247   - error:(NSError **)errPtr;
248   -
249   -/**
250   - * Connects to the given address, specified as a sockaddr structure wrapped in a NSData object.
251   - * For example, a NSData object returned from NSNetService's addresses method.
252   - *
253   - * If you have an existing struct sockaddr you can convert it to a NSData object like so:
254   - * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
255   - * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];
256   - *
257   - * This method invokes connectToAdd
258   -**/
259   -- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr;
260   -
261   -/**
262   - * This method is the same as connectToAddress:error: with an additional timeout option.
263   - * To not time out use a negative time interval, or simply use the connectToAddress:error: method.
264   -**/
265   -- (BOOL)connectToAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr;
266   -
267   -/**
268   - * Connects to the given address, using the specified interface and timeout.
269   - *
270   - * The address is specified as a sockaddr structure wrapped in a NSData object.
271   - * For example, a NSData object returned from NSNetService's addresses method.
272   - *
273   - * If you have an existing struct sockaddr you can convert it to a NSData object like so:
274   - * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
275   - * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];
276   - *
277   - * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35").
278   - * The interface may also be used to specify the local port (see below).
279   - *
280   - * The timeout is optional. To not time out use a negative time interval.
281   - *
282   - * This method will return NO if an error is detected, and set the error pointer (if one was given).
283   - * Possible errors would be a nil host, invalid interface, or socket is already connected.
284   - *
285   - * If no errors are detected, this method will start a background connect operation and immediately return YES.
286   - * The delegate callbacks are used to notify you when the socket connects, or if the host was unreachable.
287   - *
288   - * Since this class supports queued reads and writes, you can immediately start reading and/or writing.
289   - * All read/write operations will be queued, and upon socket connection,
290   - * the operations will be dequeued and processed in order.
291   - *
292   - * The interface may optionally contain a port number at the end of the string, separated by a colon.
293   - * This allows you to specify the local port that should be used for the outgoing connection. (read paragraph to end)
294   - * To specify both interface and local port: "en1:8082" or "192.168.4.35:2424".
295   - * To specify only local port: ":8082".
296   - * Please note this is an advanced feature, and is somewhat hidden on purpose.
297   - * You should understand that 99.999% of the time you should NOT specify the local port for an outgoing connection.
298   - * If you think you need to, there is a very good chance you have a fundamental misunderstanding somewhere.
299   - * Local ports do NOT need to match remote ports. In fact, they almost never do.
300   - * This feature is here for networking professionals using very advanced techniques.
301   -**/
302   -- (BOOL)connectToAddress:(NSData *)remoteAddr
303   - viaInterface:(nullable NSString *)interface
304   - withTimeout:(NSTimeInterval)timeout
305   - error:(NSError **)errPtr;
306   -/**
307   - * Connects to the unix domain socket at the given url, using the specified timeout.
308   - */
309   -- (BOOL)connectToUrl:(NSURL *)url withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr;
310   -
311   -#pragma mark Disconnecting
312   -
313   -/**
314   - * Disconnects immediately (synchronously). Any pending reads or writes are dropped.
315   - *
316   - * If the socket is not already disconnected, an invocation to the socketDidDisconnect:withError: delegate method
317   - * will be queued onto the delegateQueue asynchronously (behind any previously queued delegate methods).
318   - * In other words, the disconnected delegate method will be invoked sometime shortly after this method returns.
319   - *
320   - * Please note the recommended way of releasing a GCDAsyncSocket instance (e.g. in a dealloc method)
321   - * [asyncSocket setDelegate:nil];
322   - * [asyncSocket disconnect];
323   - * [asyncSocket release];
324   - *
325   - * If you plan on disconnecting the socket, and then immediately asking it to connect again,
326   - * you'll likely want to do so like this:
327   - * [asyncSocket setDelegate:nil];
328   - * [asyncSocket disconnect];
329   - * [asyncSocket setDelegate:self];
330   - * [asyncSocket connect...];
331   -**/
332   -- (void)disconnect;
333   -
334   -/**
335   - * Disconnects after all pending reads have completed.
336   - * After calling this, the read and write methods will do nothing.
337   - * The socket will disconnect even if there are still pending writes.
338   -**/
339   -- (void)disconnectAfterReading;
340   -
341   -/**
342   - * Disconnects after all pending writes have completed.
343   - * After calling this, the read and write methods will do nothing.
344   - * The socket will disconnect even if there are still pending reads.
345   -**/
346   -- (void)disconnectAfterWriting;
347   -
348   -/**
349   - * Disconnects after all pending reads and writes have completed.
350   - * After calling this, the read and write methods will do nothing.
351   -**/
352   -- (void)disconnectAfterReadingAndWriting;
353   -
354   -#pragma mark Diagnostics
355   -
356   -/**
357   - * Returns whether the socket is disconnected or connected.
358   - *
359   - * A disconnected socket may be recycled.
360   - * That is, it can be used again for connecting or listening.
361   - *
362   - * If a socket is in the process of connecting, it may be neither disconnected nor connected.
363   -**/
364   -@property (atomic, readonly) BOOL isDisconnected;
365   -@property (atomic, readonly) BOOL isConnected;
366   -
367   -/**
368   - * Returns the local or remote host and port to which this socket is connected, or nil and 0 if not connected.
369   - * The host will be an IP address.
370   -**/
371   -@property (atomic, readonly, nullable) NSString *connectedHost;
372   -@property (atomic, readonly) uint16_t connectedPort;
373   -@property (atomic, readonly, nullable) NSURL *connectedUrl;
374   -
375   -@property (atomic, readonly, nullable) NSString *localHost;
376   -@property (atomic, readonly) uint16_t localPort;
377   -
378   -/**
379   - * Returns the local or remote address to which this socket is connected,
380   - * specified as a sockaddr structure wrapped in a NSData object.
381   - *
382   - * @seealso connectedHost
383   - * @seealso connectedPort
384   - * @seealso localHost
385   - * @seealso localPort
386   -**/
387   -@property (atomic, readonly, nullable) NSData *connectedAddress;
388   -@property (atomic, readonly, nullable) NSData *localAddress;
389   -
390   -/**
391   - * Returns whether the socket is IPv4 or IPv6.
392   - * An accepting socket may be both.
393   -**/
394   -@property (atomic, readonly) BOOL isIPv4;
395   -@property (atomic, readonly) BOOL isIPv6;
396   -
397   -/**
398   - * Returns whether or not the socket has been secured via SSL/TLS.
399   - *
400   - * See also the startTLS method.
401   -**/
402   -@property (atomic, readonly) BOOL isSecure;
403   -
404   -#pragma mark Reading
405   -
406   -// The readData and writeData methods won't block (they are asynchronous).
407   -//
408   -// When a read is complete the socket:didReadData:withTag: delegate method is dispatched on the delegateQueue.
409   -// When a write is complete the socket:didWriteDataWithTag: delegate method is dispatched on the delegateQueue.
410   -//
411   -// You may optionally set a timeout for any read/write operation. (To not timeout, use a negative time interval.)
412   -// If a read/write opertion times out, the corresponding "socket:shouldTimeout..." delegate method
413   -// is called to optionally allow you to extend the timeout.
414   -// Upon a timeout, the "socket:didDisconnectWithError:" method is called
415   -//
416   -// The tag is for your convenience.
417   -// You can use it as an array index, step number, state id, pointer, etc.
418   -
419   -/**
420   - * Reads the first available bytes that become available on the socket.
421   - *
422   - * If the timeout value is negative, the read operation will not use a timeout.
423   -**/
424   -- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag;
425   -
426   -/**
427   - * Reads the first available bytes that become available on the socket.
428   - * The bytes will be appended to the given byte buffer starting at the given offset.
429   - * The given buffer will automatically be increased in size if needed.
430   - *
431   - * If the timeout value is negative, the read operation will not use a timeout.
432   - * If the buffer if nil, the socket will create a buffer for you.
433   - *
434   - * If the bufferOffset is greater than the length of the given buffer,
435   - * the method will do nothing, and the delegate will not be called.
436   - *
437   - * If you pass a buffer, you must not alter it in any way while the socket is using it.
438   - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer.
439   - * That is, it will reference the bytes that were appended to the given buffer via
440   - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO].
441   -**/
442   -- (void)readDataWithTimeout:(NSTimeInterval)timeout
443   - buffer:(nullable NSMutableData *)buffer
444   - bufferOffset:(NSUInteger)offset
445   - tag:(long)tag;
446   -
447   -/**
448   - * Reads the first available bytes that become available on the socket.
449   - * The bytes will be appended to the given byte buffer starting at the given offset.
450   - * The given buffer will automatically be increased in size if needed.
451   - * A maximum of length bytes will be read.
452   - *
453   - * If the timeout value is negative, the read operation will not use a timeout.
454   - * If the buffer if nil, a buffer will automatically be created for you.
455   - * If maxLength is zero, no length restriction is enforced.
456   - *
457   - * If the bufferOffset is greater than the length of the given buffer,
458   - * the method will do nothing, and the delegate will not be called.
459   - *
460   - * If you pass a buffer, you must not alter it in any way while the socket is using it.
461   - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer.
462   - * That is, it will reference the bytes that were appended to the given buffer via
463   - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO].
464   -**/
465   -- (void)readDataWithTimeout:(NSTimeInterval)timeout
466   - buffer:(nullable NSMutableData *)buffer
467   - bufferOffset:(NSUInteger)offset
468   - maxLength:(NSUInteger)length
469   - tag:(long)tag;
470   -
471   -/**
472   - * Reads the given number of bytes.
473   - *
474   - * If the timeout value is negative, the read operation will not use a timeout.
475   - *
476   - * If the length is 0, this method does nothing and the delegate is not called.
477   -**/
478   -- (void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag;
479   -
480   -/**
481   - * Reads the given number of bytes.
482   - * The bytes will be appended to the given byte buffer starting at the given offset.
483   - * The given buffer will automatically be increased in size if needed.
484   - *
485   - * If the timeout value is negative, the read operation will not use a timeout.
486   - * If the buffer if nil, a buffer will automatically be created for you.
487   - *
488   - * If the length is 0, this method does nothing and the delegate is not called.
489   - * If the bufferOffset is greater than the length of the given buffer,
490   - * the method will do nothing, and the delegate will not be called.
491   - *
492   - * If you pass a buffer, you must not alter it in any way while AsyncSocket is using it.
493   - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer.
494   - * That is, it will reference the bytes that were appended to the given buffer via
495   - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO].
496   -**/
497   -- (void)readDataToLength:(NSUInteger)length
498   - withTimeout:(NSTimeInterval)timeout
499   - buffer:(nullable NSMutableData *)buffer
500   - bufferOffset:(NSUInteger)offset
501   - tag:(long)tag;
502   -
503   -/**
504   - * Reads bytes until (and including) the passed "data" parameter, which acts as a separator.
505   - *
506   - * If the timeout value is negative, the read operation will not use a timeout.
507   - *
508   - * If you pass nil or zero-length data as the "data" parameter,
509   - * the method will do nothing (except maybe print a warning), and the delegate will not be called.
510   - *
511   - * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter.
512   - * If you're developing your own custom protocol, be sure your separator can not occur naturally as
513   - * part of the data between separators.
514   - * For example, imagine you want to send several small documents over a socket.
515   - * Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents.
516   - * In this particular example, it would be better to use a protocol similar to HTTP with
517   - * a header that includes the length of the document.
518   - * Also be careful that your separator cannot occur naturally as part of the encoding for a character.
519   - *
520   - * The given data (separator) parameter should be immutable.
521   - * For performance reasons, the socket will retain it, not copy it.
522   - * So if it is immutable, don't modify it while the socket is using it.
523   -**/
524   -- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
525   -
526   -/**
527   - * Reads bytes until (and including) the passed "data" parameter, which acts as a separator.
528   - * The bytes will be appended to the given byte buffer starting at the given offset.
529   - * The given buffer will automatically be increased in size if needed.
530   - *
531   - * If the timeout value is negative, the read operation will not use a timeout.
532   - * If the buffer if nil, a buffer will automatically be created for you.
533   - *
534   - * If the bufferOffset is greater than the length of the given buffer,
535   - * the method will do nothing (except maybe print a warning), and the delegate will not be called.
536   - *
537   - * If you pass a buffer, you must not alter it in any way while the socket is using it.
538   - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer.
539   - * That is, it will reference the bytes that were appended to the given buffer via
540   - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO].
541   - *
542   - * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter.
543   - * If you're developing your own custom protocol, be sure your separator can not occur naturally as
544   - * part of the data between separators.
545   - * For example, imagine you want to send several small documents over a socket.
546   - * Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents.
547   - * In this particular example, it would be better to use a protocol similar to HTTP with
548   - * a header that includes the length of the document.
549   - * Also be careful that your separator cannot occur naturally as part of the encoding for a character.
550   - *
551   - * The given data (separator) parameter should be immutable.
552   - * For performance reasons, the socket will retain it, not copy it.
553   - * So if it is immutable, don't modify it while the socket is using it.
554   -**/
555   -- (void)readDataToData:(NSData *)data
556   - withTimeout:(NSTimeInterval)timeout
557   - buffer:(nullable NSMutableData *)buffer
558   - bufferOffset:(NSUInteger)offset
559   - tag:(long)tag;
560   -
561   -/**
562   - * Reads bytes until (and including) the passed "data" parameter, which acts as a separator.
563   - *
564   - * If the timeout value is negative, the read operation will not use a timeout.
565   - *
566   - * If maxLength is zero, no length restriction is enforced.
567   - * Otherwise if maxLength bytes are read without completing the read,
568   - * it is treated similarly to a timeout - the socket is closed with a GCDAsyncSocketReadMaxedOutError.
569   - * The read will complete successfully if exactly maxLength bytes are read and the given data is found at the end.
570   - *
571   - * If you pass nil or zero-length data as the "data" parameter,
572   - * the method will do nothing (except maybe print a warning), and the delegate will not be called.
573   - * If you pass a maxLength parameter that is less than the length of the data parameter,
574   - * the method will do nothing (except maybe print a warning), and the delegate will not be called.
575   - *
576   - * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter.
577   - * If you're developing your own custom protocol, be sure your separator can not occur naturally as
578   - * part of the data between separators.
579   - * For example, imagine you want to send several small documents over a socket.
580   - * Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents.
581   - * In this particular example, it would be better to use a protocol similar to HTTP with
582   - * a header that includes the length of the document.
583   - * Also be careful that your separator cannot occur naturally as part of the encoding for a character.
584   - *
585   - * The given data (separator) parameter should be immutable.
586   - * For performance reasons, the socket will retain it, not copy it.
587   - * So if it is immutable, don't modify it while the socket is using it.
588   -**/
589   -- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout maxLength:(NSUInteger)length tag:(long)tag;
590   -
591   -/**
592   - * Reads bytes until (and including) the passed "data" parameter, which acts as a separator.
593   - * The bytes will be appended to the given byte buffer starting at the given offset.
594   - * The given buffer will automatically be increased in size if needed.
595   - *
596   - * If the timeout value is negative, the read operation will not use a timeout.
597   - * If the buffer if nil, a buffer will automatically be created for you.
598   - *
599   - * If maxLength is zero, no length restriction is enforced.
600   - * Otherwise if maxLength bytes are read without completing the read,
601   - * it is treated similarly to a timeout - the socket is closed with a GCDAsyncSocketReadMaxedOutError.
602   - * The read will complete successfully if exactly maxLength bytes are read and the given data is found at the end.
603   - *
604   - * If you pass a maxLength parameter that is less than the length of the data (separator) parameter,
605   - * the method will do nothing (except maybe print a warning), and the delegate will not be called.
606   - * If the bufferOffset is greater than the length of the given buffer,
607   - * the method will do nothing (except maybe print a warning), and the delegate will not be called.
608   - *
609   - * If you pass a buffer, you must not alter it in any way while the socket is using it.
610   - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer.
611   - * That is, it will reference the bytes that were appended to the given buffer via
612   - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO].
613   - *
614   - * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter.
615   - * If you're developing your own custom protocol, be sure your separator can not occur naturally as
616   - * part of the data between separators.
617   - * For example, imagine you want to send several small documents over a socket.
618   - * Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents.
619   - * In this particular example, it would be better to use a protocol similar to HTTP with
620   - * a header that includes the length of the document.
621   - * Also be careful that your separator cannot occur naturally as part of the encoding for a character.
622   - *
623   - * The given data (separator) parameter should be immutable.
624   - * For performance reasons, the socket will retain it, not copy it.
625   - * So if it is immutable, don't modify it while the socket is using it.
626   -**/
627   -- (void)readDataToData:(NSData *)data
628   - withTimeout:(NSTimeInterval)timeout
629   - buffer:(nullable NSMutableData *)buffer
630   - bufferOffset:(NSUInteger)offset
631   - maxLength:(NSUInteger)length
632   - tag:(long)tag;
633   -
634   -/**
635   - * Returns progress of the current read, from 0.0 to 1.0, or NaN if no current read (use isnan() to check).
636   - * The parameters "tag", "done" and "total" will be filled in if they aren't NULL.
637   -**/
638   -- (float)progressOfReadReturningTag:(nullable long *)tagPtr bytesDone:(nullable NSUInteger *)donePtr total:(nullable NSUInteger *)totalPtr;
639   -
640   -#pragma mark Writing
641   -
642   -/**
643   - * Writes data to the socket, and calls the delegate when finished.
644   - *
645   - * If you pass in nil or zero-length data, this method does nothing and the delegate will not be called.
646   - * If the timeout value is negative, the write operation will not use a timeout.
647   - *
648   - * Thread-Safety Note:
649   - * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while
650   - * the socket is writing it. In other words, it's not safe to alter the data until after the delegate method
651   - * socket:didWriteDataWithTag: is invoked signifying that this particular write operation has completed.
652   - * This is due to the fact that GCDAsyncSocket does NOT copy the data. It simply retains it.
653   - * This is for performance reasons. Often times, if NSMutableData is passed, it is because
654   - * a request/response was built up in memory. Copying this data adds an unwanted/unneeded overhead.
655   - * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket
656   - * completes writing the bytes (which is NOT immediately after this method returns, but rather at a later time
657   - * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method.
658   -**/
659   -- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
660   -
661   -/**
662   - * Returns progress of the current write, from 0.0 to 1.0, or NaN if no current write (use isnan() to check).
663   - * The parameters "tag", "done" and "total" will be filled in if they aren't NULL.
664   -**/
665   -- (float)progressOfWriteReturningTag:(nullable long *)tagPtr bytesDone:(nullable NSUInteger *)donePtr total:(nullable NSUInteger *)totalPtr;
666   -
667   -#pragma mark Security
668   -
669   -/**
670   - * Secures the connection using SSL/TLS.
671   - *
672   - * This method may be called at any time, and the TLS handshake will occur after all pending reads and writes
673   - * are finished. This allows one the option of sending a protocol dependent StartTLS message, and queuing
674   - * the upgrade to TLS at the same time, without having to wait for the write to finish.
675   - * Any reads or writes scheduled after this method is called will occur over the secured connection.
676   - *
677   - * ==== The available TOP-LEVEL KEYS are:
678   - *
679   - * - GCDAsyncSocketManuallyEvaluateTrust
680   - * The value must be of type NSNumber, encapsulating a BOOL value.
681   - * If you set this to YES, then the underlying SecureTransport system will not evaluate the SecTrustRef of the peer.
682   - * Instead it will pause at the moment evaulation would typically occur,
683   - * and allow us to handle the security evaluation however we see fit.
684   - * So GCDAsyncSocket will invoke the delegate method socket:shouldTrustPeer: passing the SecTrustRef.
685   - *
686   - * Note that if you set this option, then all other configuration keys are ignored.
687   - * Evaluation will be completely up to you during the socket:didReceiveTrust:completionHandler: delegate method.
688   - *
689   - * For more information on trust evaluation see:
690   - * Apple's Technical Note TN2232 - HTTPS Server Trust Evaluation
691   - * https://developer.apple.com/library/ios/technotes/tn2232/_index.html
692   - *
693   - * If unspecified, the default value is NO.
694   - *
695   - * - GCDAsyncSocketUseCFStreamForTLS (iOS only)
696   - * The value must be of type NSNumber, encapsulating a BOOL value.
697   - * By default GCDAsyncSocket will use the SecureTransport layer to perform encryption.
698   - * This gives us more control over the security protocol (many more configuration options),
699   - * plus it allows us to optimize things like sys calls and buffer allocation.
700   - *
701   - * However, if you absolutely must, you can instruct GCDAsyncSocket to use the old-fashioned encryption
702   - * technique by going through the CFStream instead. So instead of using SecureTransport, GCDAsyncSocket
703   - * will instead setup a CFRead/CFWriteStream. And then set the kCFStreamPropertySSLSettings property
704   - * (via CFReadStreamSetProperty / CFWriteStreamSetProperty) and will pass the given options to this method.
705   - *
706   - * Thus all the other keys in the given dictionary will be ignored by GCDAsyncSocket,
707   - * and will passed directly CFReadStreamSetProperty / CFWriteStreamSetProperty.
708   - * For more infomation on these keys, please see the documentation for kCFStreamPropertySSLSettings.
709   - *
710   - * If unspecified, the default value is NO.
711   - *
712   - * ==== The available CONFIGURATION KEYS are:
713   - *
714   - * - kCFStreamSSLPeerName
715   - * The value must be of type NSString.
716   - * It should match the name in the X.509 certificate given by the remote party.
717   - * See Apple's documentation for SSLSetPeerDomainName.
718   - *
719   - * - kCFStreamSSLCertificates
720   - * The value must be of type NSArray.
721   - * See Apple's documentation for SSLSetCertificate.
722   - *
723   - * - kCFStreamSSLIsServer
724   - * The value must be of type NSNumber, encapsulationg a BOOL value.
725   - * See Apple's documentation for SSLCreateContext for iOS.
726   - * This is optional for iOS. If not supplied, a NO value is the default.
727   - * This is not needed for Mac OS X, and the value is ignored.
728   - *
729   - * - GCDAsyncSocketSSLPeerID
730   - * The value must be of type NSData.
731   - * You must set this value if you want to use TLS session resumption.
732   - * See Apple's documentation for SSLSetPeerID.
733   - *
734   - * - GCDAsyncSocketSSLProtocolVersionMin
735   - * - GCDAsyncSocketSSLProtocolVersionMax
736   - * The value(s) must be of type NSNumber, encapsulting a SSLProtocol value.
737   - * See Apple's documentation for SSLSetProtocolVersionMin & SSLSetProtocolVersionMax.
738   - * See also the SSLProtocol typedef.
739   - *
740   - * - GCDAsyncSocketSSLSessionOptionFalseStart
741   - * The value must be of type NSNumber, encapsulating a BOOL value.
742   - * See Apple's documentation for kSSLSessionOptionFalseStart.
743   - *
744   - * - GCDAsyncSocketSSLSessionOptionSendOneByteRecord
745   - * The value must be of type NSNumber, encapsulating a BOOL value.
746   - * See Apple's documentation for kSSLSessionOptionSendOneByteRecord.
747   - *
748   - * - GCDAsyncSocketSSLCipherSuites
749   - * The values must be of type NSArray.
750   - * Each item within the array must be a NSNumber, encapsulating
751   - * See Apple's documentation for SSLSetEnabledCiphers.
752   - * See also the SSLCipherSuite typedef.
753   - *
754   - * - GCDAsyncSocketSSLDiffieHellmanParameters (Mac OS X only)
755   - * The value must be of type NSData.
756   - * See Apple's documentation for SSLSetDiffieHellmanParams.
757   - *
758   - * ==== The following UNAVAILABLE KEYS are: (with throw an exception)
759   - *
760   - * - kCFStreamSSLAllowsAnyRoot (UNAVAILABLE)
761   - * You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust).
762   - * Corresponding deprecated method: SSLSetAllowsAnyRoot
763   - *
764   - * - kCFStreamSSLAllowsExpiredRoots (UNAVAILABLE)
765   - * You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust).
766   - * Corresponding deprecated method: SSLSetAllowsExpiredRoots
767   - *
768   - * - kCFStreamSSLAllowsExpiredCertificates (UNAVAILABLE)
769   - * You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust).
770   - * Corresponding deprecated method: SSLSetAllowsExpiredCerts
771   - *
772   - * - kCFStreamSSLValidatesCertificateChain (UNAVAILABLE)
773   - * You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust).
774   - * Corresponding deprecated method: SSLSetEnableCertVerify
775   - *
776   - * - kCFStreamSSLLevel (UNAVAILABLE)
777   - * You MUST use GCDAsyncSocketSSLProtocolVersionMin & GCDAsyncSocketSSLProtocolVersionMin instead.
778   - * Corresponding deprecated method: SSLSetProtocolVersionEnabled
779   - *
780   - *
781   - * Please refer to Apple's documentation for corresponding SSLFunctions.
782   - *
783   - * If you pass in nil or an empty dictionary, the default settings will be used.
784   - *
785   - * IMPORTANT SECURITY NOTE:
786   - * The default settings will check to make sure the remote party's certificate is signed by a
787   - * trusted 3rd party certificate agency (e.g. verisign) and that the certificate is not expired.
788   - * However it will not verify the name on the certificate unless you
789   - * give it a name to verify against via the kCFStreamSSLPeerName key.
790   - * The security implications of this are important to understand.
791   - * Imagine you are attempting to create a secure connection to MySecureServer.com,
792   - * but your socket gets directed to MaliciousServer.com because of a hacked DNS server.
793   - * If you simply use the default settings, and MaliciousServer.com has a valid certificate,
794   - * the default settings will not detect any problems since the certificate is valid.
795   - * To properly secure your connection in this particular scenario you
796   - * should set the kCFStreamSSLPeerName property to "MySecureServer.com".
797   - *
798   - * You can also perform additional validation in socketDidSecure.
799   -**/
800   -- (void)startTLS:(nullable NSDictionary <NSString*,NSObject*>*)tlsSettings;
801   -
802   -#pragma mark Advanced
803   -
804   -/**
805   - * Traditionally sockets are not closed until the conversation is over.
806   - * However, it is technically possible for the remote enpoint to close its write stream.
807   - * Our socket would then be notified that there is no more data to be read,
808   - * but our socket would still be writeable and the remote endpoint could continue to receive our data.
809   - *
810   - * The argument for this confusing functionality stems from the idea that a client could shut down its
811   - * write stream after sending a request to the server, thus notifying the server there are to be no further requests.
812   - * In practice, however, this technique did little to help server developers.
813   - *
814   - * To make matters worse, from a TCP perspective there is no way to tell the difference from a read stream close
815   - * and a full socket close. They both result in the TCP stack receiving a FIN packet. The only way to tell
816   - * is by continuing to write to the socket. If it was only a read stream close, then writes will continue to work.
817   - * Otherwise an error will be occur shortly (when the remote end sends us a RST packet).
818   - *
819   - * In addition to the technical challenges and confusion, many high level socket/stream API's provide
820   - * no support for dealing with the problem. If the read stream is closed, the API immediately declares the
821   - * socket to be closed, and shuts down the write stream as well. In fact, this is what Apple's CFStream API does.
822   - * It might sound like poor design at first, but in fact it simplifies development.
823   - *
824   - * The vast majority of the time if the read stream is closed it's because the remote endpoint closed its socket.
825   - * Thus it actually makes sense to close the socket at this point.
826   - * And in fact this is what most networking developers want and expect to happen.
827   - * However, if you are writing a server that interacts with a plethora of clients,
828   - * you might encounter a client that uses the discouraged technique of shutting down its write stream.
829   - * If this is the case, you can set this property to NO,
830   - * and make use of the socketDidCloseReadStream delegate method.
831   - *
832   - * The default value is YES.
833   -**/
834   -@property (atomic, assign, readwrite) BOOL autoDisconnectOnClosedReadStream;
835   -
836   -/**
837   - * GCDAsyncSocket maintains thread safety by using an internal serial dispatch_queue.
838   - * In most cases, the instance creates this queue itself.
839   - * However, to allow for maximum flexibility, the internal queue may be passed in the init method.
840   - * This allows for some advanced options such as controlling socket priority via target queues.
841   - * However, when one begins to use target queues like this, they open the door to some specific deadlock issues.
842   - *
843   - * For example, imagine there are 2 queues:
844   - * dispatch_queue_t socketQueue;
845   - * dispatch_queue_t socketTargetQueue;
846   - *
847   - * If you do this (pseudo-code):
848   - * socketQueue.targetQueue = socketTargetQueue;
849   - *
850   - * Then all socketQueue operations will actually get run on the given socketTargetQueue.
851   - * This is fine and works great in most situations.
852   - * But if you run code directly from within the socketTargetQueue that accesses the socket,
853   - * you could potentially get deadlock. Imagine the following code:
854   - *
855   - * - (BOOL)socketHasSomething
856   - * {
857   - * __block BOOL result = NO;
858   - * dispatch_block_t block = ^{
859   - * result = [self someInternalMethodToBeRunOnlyOnSocketQueue];
860   - * }
861   - * if (is_executing_on_queue(socketQueue))
862   - * block();
863   - * else
864   - * dispatch_sync(socketQueue, block);
865   - *
866   - * return result;
867   - * }
868   - *
869   - * What happens if you call this method from the socketTargetQueue? The result is deadlock.
870   - * This is because the GCD API offers no mechanism to discover a queue's targetQueue.
871   - * Thus we have no idea if our socketQueue is configured with a targetQueue.
872   - * If we had this information, we could easily avoid deadlock.
873   - * But, since these API's are missing or unfeasible, you'll have to explicitly set it.
874   - *
875   - * IF you pass a socketQueue via the init method,
876   - * AND you've configured the passed socketQueue with a targetQueue,
877   - * THEN you should pass the end queue in the target hierarchy.
878   - *
879   - * For example, consider the following queue hierarchy:
880   - * socketQueue -> ipQueue -> moduleQueue
881   - *
882   - * This example demonstrates priority shaping within some server.
883   - * All incoming client connections from the same IP address are executed on the same target queue.
884   - * And all connections for a particular module are executed on the same target queue.
885   - * Thus, the priority of all networking for the entire module can be changed on the fly.
886   - * Additionally, networking traffic from a single IP cannot monopolize the module.
887   - *
888   - * Here's how you would accomplish something like that:
889   - * - (dispatch_queue_t)newSocketQueueForConnectionFromAddress:(NSData *)address onSocket:(GCDAsyncSocket *)sock
890   - * {
891   - * dispatch_queue_t socketQueue = dispatch_queue_create("", NULL);
892   - * dispatch_queue_t ipQueue = [self ipQueueForAddress:address];
893   - *
894   - * dispatch_set_target_queue(socketQueue, ipQueue);
895   - * dispatch_set_target_queue(iqQueue, moduleQueue);
896   - *
897   - * return socketQueue;
898   - * }
899   - * - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
900   - * {
901   - * [clientConnections addObject:newSocket];
902   - * [newSocket markSocketQueueTargetQueue:moduleQueue];
903   - * }
904   - *
905   - * Note: This workaround is ONLY needed if you intend to execute code directly on the ipQueue or moduleQueue.
906   - * This is often NOT the case, as such queues are used solely for execution shaping.
907   -**/
908   -- (void)markSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreConfiguredTargetQueue;
909   -- (void)unmarkSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreviouslyConfiguredTargetQueue;
910   -
911   -/**
912   - * It's not thread-safe to access certain variables from outside the socket's internal queue.
913   - *
914   - * For example, the socket file descriptor.
915   - * File descriptors are simply integers which reference an index in the per-process file table.
916   - * However, when one requests a new file descriptor (by opening a file or socket),
917   - * the file descriptor returned is guaranteed to be the lowest numbered unused descriptor.
918   - * So if we're not careful, the following could be possible:
919   - *
920   - * - Thread A invokes a method which returns the socket's file descriptor.
921   - * - The socket is closed via the socket's internal queue on thread B.
922   - * - Thread C opens a file, and subsequently receives the file descriptor that was previously the socket's FD.
923   - * - Thread A is now accessing/altering the file instead of the socket.
924   - *
925   - * In addition to this, other variables are not actually objects,
926   - * and thus cannot be retained/released or even autoreleased.
927   - * An example is the sslContext, of type SSLContextRef, which is actually a malloc'd struct.
928   - *
929   - * Although there are internal variables that make it difficult to maintain thread-safety,
930   - * it is important to provide access to these variables
931   - * to ensure this class can be used in a wide array of environments.
932   - * This method helps to accomplish this by invoking the current block on the socket's internal queue.
933   - * The methods below can be invoked from within the block to access
934   - * those generally thread-unsafe internal variables in a thread-safe manner.
935   - * The given block will be invoked synchronously on the socket's internal queue.
936   - *
937   - * If you save references to any protected variables and use them outside the block, you do so at your own peril.
938   -**/
939   -- (void)performBlock:(dispatch_block_t)block;
940   -
941   -/**
942   - * These methods are only available from within the context of a performBlock: invocation.
943   - * See the documentation for the performBlock: method above.
944   - *
945   - * Provides access to the socket's file descriptor(s).
946   - * If the socket is a server socket (is accepting incoming connections),
947   - * it might actually have multiple internal socket file descriptors - one for IPv4 and one for IPv6.
948   -**/
949   -- (int)socketFD;
950   -- (int)socket4FD;
951   -- (int)socket6FD;
952   -
953   -#if TARGET_OS_IPHONE
954   -
955   -/**
956   - * These methods are only available from within the context of a performBlock: invocation.
957   - * See the documentation for the performBlock: method above.
958   - *
959   - * Provides access to the socket's internal CFReadStream/CFWriteStream.
960   - *
961   - * These streams are only used as workarounds for specific iOS shortcomings:
962   - *
963   - * - Apple has decided to keep the SecureTransport framework private is iOS.
964   - * This means the only supplied way to do SSL/TLS is via CFStream or some other API layered on top of it.
965   - * Thus, in order to provide SSL/TLS support on iOS we are forced to rely on CFStream,
966   - * instead of the preferred and faster and more powerful SecureTransport.
967   - *
968   - * - If a socket doesn't have backgrounding enabled, and that socket is closed while the app is backgrounded,
969   - * Apple only bothers to notify us via the CFStream API.
970   - * The faster and more powerful GCD API isn't notified properly in this case.
971   - *
972   - * See also: (BOOL)enableBackgroundingOnSocket
973   -**/
974   -- (nullable CFReadStreamRef)readStream;
975   -- (nullable CFWriteStreamRef)writeStream;
976   -
977   -/**
978   - * This method is only available from within the context of a performBlock: invocation.
979   - * See the documentation for the performBlock: method above.
980   - *
981   - * Configures the socket to allow it to operate when the iOS application has been backgrounded.
982   - * In other words, this method creates a read & write stream, and invokes:
983   - *
984   - * CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
985   - * CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
986   - *
987   - * Returns YES if successful, NO otherwise.
988   - *
989   - * Note: Apple does not officially support backgrounding server sockets.
990   - * That is, if your socket is accepting incoming connections, Apple does not officially support
991   - * allowing iOS applications to accept incoming connections while an app is backgrounded.
992   - *
993   - * Example usage:
994   - *
995   - * - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
996   - * {
997   - * [asyncSocket performBlock:^{
998   - * [asyncSocket enableBackgroundingOnSocket];
999   - * }];
1000   - * }
1001   -**/
1002   -- (BOOL)enableBackgroundingOnSocket;
1003   -
1004   -#endif
1005   -
1006   -/**
1007   - * This method is only available from within the context of a performBlock: invocation.
1008   - * See the documentation for the performBlock: method above.
1009   - *
1010   - * Provides access to the socket's SSLContext, if SSL/TLS has been started on the socket.
1011   -**/
1012   -- (nullable SSLContextRef)sslContext;
1013   -
1014   -#pragma mark Utilities
1015   -
1016   -/**
1017   - * The address lookup utility used by the class.
1018   - * This method is synchronous, so it's recommended you use it on a background thread/queue.
1019   - *
1020   - * The special strings "localhost" and "loopback" return the loopback address for IPv4 and IPv6.
1021   - *
1022   - * @returns
1023   - * A mutable array with all IPv4 and IPv6 addresses returned by getaddrinfo.
1024   - * The addresses are specifically for TCP connections.
1025   - * You can filter the addresses, if needed, using the other utility methods provided by the class.
1026   -**/
1027   -+ (nullable NSMutableArray *)lookupHost:(NSString *)host port:(uint16_t)port error:(NSError **)errPtr;
1028   -
1029   -/**
1030   - * Extracting host and port information from raw address data.
1031   -**/
1032   -
1033   -+ (nullable NSString *)hostFromAddress:(NSData *)address;
1034   -+ (uint16_t)portFromAddress:(NSData *)address;
1035   -
1036   -+ (BOOL)isIPv4Address:(NSData *)address;
1037   -+ (BOOL)isIPv6Address:(NSData *)address;
1038   -
1039   -+ (BOOL)getHost:( NSString * __nullable * __nullable)hostPtr port:(nullable uint16_t *)portPtr fromAddress:(NSData *)address;
1040   -
1041   -+ (BOOL)getHost:(NSString * __nullable * __nullable)hostPtr port:(nullable uint16_t *)portPtr family:(nullable sa_family_t *)afPtr fromAddress:(NSData *)address;
1042   -
1043   -/**
1044   - * A few common line separators, for use with the readDataToData:... methods.
1045   -**/
1046   -+ (NSData *)CRLFData; // 0x0D0A
1047   -+ (NSData *)CRData; // 0x0D
1048   -+ (NSData *)LFData; // 0x0A
1049   -+ (NSData *)ZeroData; // 0x00
1050   -
1051   -@end
1052   -
1053   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1054   -#pragma mark -
1055   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1056   -
1057   -@protocol GCDAsyncSocketDelegate <NSObject>
1058   -@optional
1059   -
1060   -/**
1061   - * This method is called immediately prior to socket:didAcceptNewSocket:.
1062   - * It optionally allows a listening socket to specify the socketQueue for a new accepted socket.
1063   - * If this method is not implemented, or returns NULL, the new accepted socket will create its own default queue.
1064   - *
1065   - * Since you cannot autorelease a dispatch_queue,
1066   - * this method uses the "new" prefix in its name to specify that the returned queue has been retained.
1067   - *
1068   - * Thus you could do something like this in the implementation:
1069   - * return dispatch_queue_create("MyQueue", NULL);
1070   - *
1071   - * If you are placing multiple sockets on the same queue,
1072   - * then care should be taken to increment the retain count each time this method is invoked.
1073   - *
1074   - * For example, your implementation might look something like this:
1075   - * dispatch_retain(myExistingQueue);
1076   - * return myExistingQueue;
1077   -**/
1078   -- (nullable dispatch_queue_t)newSocketQueueForConnectionFromAddress:(NSData *)address onSocket:(GCDAsyncSocket *)sock;
1079   -
1080   -/**
1081   - * Called when a socket accepts a connection.
1082   - * Another socket is automatically spawned to handle it.
1083   - *
1084   - * You must retain the newSocket if you wish to handle the connection.
1085   - * Otherwise the newSocket instance will be released and the spawned connection will be closed.
1086   - *
1087   - * By default the new socket will have the same delegate and delegateQueue.
1088   - * You may, of course, change this at any time.
1089   -**/
1090   -- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket;
1091   -
1092   -/**
1093   - * Called when a socket connects and is ready for reading and writing.
1094   - * The host parameter will be an IP address, not a DNS name.
1095   -**/
1096   -- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port;
1097   -
1098   -/**
1099   - * Called when a socket connects and is ready for reading and writing.
1100   - * The host parameter will be an IP address, not a DNS name.
1101   - **/
1102   -- (void)socket:(GCDAsyncSocket *)sock didConnectToUrl:(NSURL *)url;
1103   -
1104   -/**
1105   - * Called when a socket has completed reading the requested data into memory.
1106   - * Not called if there is an error.
1107   -**/
1108   -- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;
1109   -
1110   -/**
1111   - * Called when a socket has read in data, but has not yet completed the read.
1112   - * This would occur if using readToData: or readToLength: methods.
1113   - * It may be used to for things such as updating progress bars.
1114   -**/
1115   -- (void)socket:(GCDAsyncSocket *)sock didReadPartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
1116   -
1117   -/**
1118   - * Called when a socket has completed writing the requested data. Not called if there is an error.
1119   -**/
1120   -- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag;
1121   -
1122   -/**
1123   - * Called when a socket has written some data, but has not yet completed the entire write.
1124   - * It may be used to for things such as updating progress bars.
1125   -**/
1126   -- (void)socket:(GCDAsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
1127   -
1128   -/**
1129   - * Called if a read operation has reached its timeout without completing.
1130   - * This method allows you to optionally extend the timeout.
1131   - * If you return a positive time interval (> 0) the read's timeout will be extended by the given amount.
1132   - * If you don't implement this method, or return a non-positive time interval (<= 0) the read will timeout as usual.
1133   - *
1134   - * The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method.
1135   - * The length parameter is the number of bytes that have been read so far for the read operation.
1136   - *
1137   - * Note that this method may be called multiple times for a single read if you return positive numbers.
1138   -**/
1139   -- (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag
1140   - elapsed:(NSTimeInterval)elapsed
1141   - bytesDone:(NSUInteger)length;
1142   -
1143   -/**
1144   - * Called if a write operation has reached its timeout without completing.
1145   - * This method allows you to optionally extend the timeout.
1146   - * If you return a positive time interval (> 0) the write's timeout will be extended by the given amount.
1147   - * If you don't implement this method, or return a non-positive time interval (<= 0) the write will timeout as usual.
1148   - *
1149   - * The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method.
1150   - * The length parameter is the number of bytes that have been written so far for the write operation.
1151   - *
1152   - * Note that this method may be called multiple times for a single write if you return positive numbers.
1153   -**/
1154   -- (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag
1155   - elapsed:(NSTimeInterval)elapsed
1156   - bytesDone:(NSUInteger)length;
1157   -
1158   -/**
1159   - * Conditionally called if the read stream closes, but the write stream may still be writeable.
1160   - *
1161   - * This delegate method is only called if autoDisconnectOnClosedReadStream has been set to NO.
1162   - * See the discussion on the autoDisconnectOnClosedReadStream method for more information.
1163   -**/
1164   -- (void)socketDidCloseReadStream:(GCDAsyncSocket *)sock;
1165   -
1166   -/**
1167   - * Called when a socket disconnects with or without error.
1168   - *
1169   - * If you call the disconnect method, and the socket wasn't already disconnected,
1170   - * then an invocation of this delegate method will be enqueued on the delegateQueue
1171   - * before the disconnect method returns.
1172   - *
1173   - * Note: If the GCDAsyncSocket instance is deallocated while it is still connected,
1174   - * and the delegate is not also deallocated, then this method will be invoked,
1175   - * but the sock parameter will be nil. (It must necessarily be nil since it is no longer available.)
1176   - * This is a generally rare, but is possible if one writes code like this:
1177   - *
1178   - * asyncSocket = nil; // I'm implicitly disconnecting the socket
1179   - *
1180   - * In this case it may preferrable to nil the delegate beforehand, like this:
1181   - *
1182   - * asyncSocket.delegate = nil; // Don't invoke my delegate method
1183   - * asyncSocket = nil; // I'm implicitly disconnecting the socket
1184   - *
1185   - * Of course, this depends on how your state machine is configured.
1186   -**/
1187   -- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(nullable NSError *)err;
1188   -
1189   -/**
1190   - * Called after the socket has successfully completed SSL/TLS negotiation.
1191   - * This method is not called unless you use the provided startTLS method.
1192   - *
1193   - * If a SSL/TLS negotiation fails (invalid certificate, etc) then the socket will immediately close,
1194   - * and the socketDidDisconnect:withError: delegate method will be called with the specific SSL error code.
1195   -**/
1196   -- (void)socketDidSecure:(GCDAsyncSocket *)sock;
1197   -
1198   -/**
1199   - * Allows a socket delegate to hook into the TLS handshake and manually validate the peer it's connecting to.
1200   - *
1201   - * This is only called if startTLS is invoked with options that include:
1202   - * - GCDAsyncSocketManuallyEvaluateTrust == YES
1203   - *
1204   - * Typically the delegate will use SecTrustEvaluate (and related functions) to properly validate the peer.
1205   - *
1206   - * Note from Apple's documentation:
1207   - * Because [SecTrustEvaluate] might look on the network for certificates in the certificate chain,
1208   - * [it] might block while attempting network access. You should never call it from your main thread;
1209   - * call it only from within a function running on a dispatch queue or on a separate thread.
1210   - *
1211   - * Thus this method uses a completionHandler block rather than a normal return value.
1212   - * The completionHandler block is thread-safe, and may be invoked from a background queue/thread.
1213   - * It is safe to invoke the completionHandler block even if the socket has been closed.
1214   -**/
1215   -- (void)socket:(GCDAsyncSocket *)sock didReceiveTrust:(SecTrustRef)trust
1216   - completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler;
1217   -
1218   -@end
1219   -NS_ASSUME_NONNULL_END
Example/build/Debug-iphoneos/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers/GCDAsyncUdpSocket.h deleted 100644 → 0
1   -//
2   -// GCDAsyncUdpSocket
3   -//
4   -// This class is in the public domain.
5   -// Originally created by Robbie Hanson of Deusty LLC.
6   -// Updated and maintained by Deusty LLC and the Apple development community.
7   -//
8   -// https://github.com/robbiehanson/CocoaAsyncSocket
9   -//
10   -
11   -#import <Foundation/Foundation.h>
12   -#import <dispatch/dispatch.h>
13   -#import <TargetConditionals.h>
14   -#import <Availability.h>
15   -
16   -NS_ASSUME_NONNULL_BEGIN
17   -extern NSString *const GCDAsyncUdpSocketException;
18   -extern NSString *const GCDAsyncUdpSocketErrorDomain;
19   -
20   -extern NSString *const GCDAsyncUdpSocketQueueName;
21   -extern NSString *const GCDAsyncUdpSocketThreadName;
22   -
23   -typedef NS_ENUM(NSInteger, GCDAsyncUdpSocketError) {
24   - GCDAsyncUdpSocketNoError = 0, // Never used
25   - GCDAsyncUdpSocketBadConfigError, // Invalid configuration
26   - GCDAsyncUdpSocketBadParamError, // Invalid parameter was passed
27   - GCDAsyncUdpSocketSendTimeoutError, // A send operation timed out
28   - GCDAsyncUdpSocketClosedError, // The socket was closed
29   - GCDAsyncUdpSocketOtherError, // Description provided in userInfo
30   -};
31   -
32   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
33   -#pragma mark -
34   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
35   -
36   -@class GCDAsyncUdpSocket;
37   -
38   -@protocol GCDAsyncUdpSocketDelegate <NSObject>
39   -@optional
40   -
41   -/**
42   - * By design, UDP is a connectionless protocol, and connecting is not needed.
43   - * However, you may optionally choose to connect to a particular host for reasons
44   - * outlined in the documentation for the various connect methods listed above.
45   - *
46   - * This method is called if one of the connect methods are invoked, and the connection is successful.
47   -**/
48   -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didConnectToAddress:(NSData *)address;
49   -
50   -/**
51   - * By design, UDP is a connectionless protocol, and connecting is not needed.
52   - * However, you may optionally choose to connect to a particular host for reasons
53   - * outlined in the documentation for the various connect methods listed above.
54   - *
55   - * This method is called if one of the connect methods are invoked, and the connection fails.
56   - * This may happen, for example, if a domain name is given for the host and the domain name is unable to be resolved.
57   -**/
58   -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotConnect:(NSError * _Nullable)error;
59   -
60   -/**
61   - * Called when the datagram with the given tag has been sent.
62   -**/
63   -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag;
64   -
65   -/**
66   - * Called if an error occurs while trying to send a datagram.
67   - * This could be due to a timeout, or something more serious such as the data being too large to fit in a sigle packet.
68   -**/
69   -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError * _Nullable)error;
70   -
71   -/**
72   - * Called when the socket has received the requested datagram.
73   -**/
74   -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
75   - fromAddress:(NSData *)address
76   - withFilterContext:(nullable id)filterContext;
77   -
78   -/**
79   - * Called when the socket is closed.
80   -**/
81   -- (void)udpSocketDidClose:(GCDAsyncUdpSocket *)sock withError:(NSError * _Nullable)error;
82   -
83   -@end
84   -
85   -/**
86   - * You may optionally set a receive filter for the socket.
87   - * A filter can provide several useful features:
88   - *
89   - * 1. Many times udp packets need to be parsed.
90   - * Since the filter can run in its own independent queue, you can parallelize this parsing quite easily.
91   - * The end result is a parallel socket io, datagram parsing, and packet processing.
92   - *
93   - * 2. Many times udp packets are discarded because they are duplicate/unneeded/unsolicited.
94   - * The filter can prevent such packets from arriving at the delegate.
95   - * And because the filter can run in its own independent queue, this doesn't slow down the delegate.
96   - *
97   - * - Since the udp protocol does not guarantee delivery, udp packets may be lost.
98   - * Many protocols built atop udp thus provide various resend/re-request algorithms.
99   - * This sometimes results in duplicate packets arriving.
100   - * A filter may allow you to architect the duplicate detection code to run in parallel to normal processing.
101   - *
102   - * - Since the udp socket may be connectionless, its possible for unsolicited packets to arrive.
103   - * Such packets need to be ignored.
104   - *
105   - * 3. Sometimes traffic shapers are needed to simulate real world environments.
106   - * A filter allows you to write custom code to simulate such environments.
107   - * The ability to code this yourself is especially helpful when your simulated environment
108   - * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router),
109   - * or the system tools to handle this aren't available (e.g. on a mobile device).
110   - *
111   - * @param data - The packet that was received.
112   - * @param address - The address the data was received from.
113   - * See utilities section for methods to extract info from address.
114   - * @param context - Out parameter you may optionally set, which will then be passed to the delegate method.
115   - * For example, filter block can parse the data and then,
116   - * pass the parsed data to the delegate.
117   - *
118   - * @returns - YES if the received packet should be passed onto the delegate.
119   - * NO if the received packet should be discarded, and not reported to the delegete.
120   - *
121   - * Example:
122   - *
123   - * GCDAsyncUdpSocketReceiveFilterBlock filter = ^BOOL (NSData *data, NSData *address, id *context) {
124   - *
125   - * MyProtocolMessage *msg = [MyProtocol parseMessage:data];
126   - *
127   - * *context = response;
128   - * return (response != nil);
129   - * };
130   - * [udpSocket setReceiveFilter:filter withQueue:myParsingQueue];
131   - *
132   -**/
133   -typedef BOOL (^GCDAsyncUdpSocketReceiveFilterBlock)(NSData *data, NSData *address, id __nullable * __nonnull context);
134   -
135   -/**
136   - * You may optionally set a send filter for the socket.
137   - * A filter can provide several interesting possibilities:
138   - *
139   - * 1. Optional caching of resolved addresses for domain names.
140   - * The cache could later be consulted, resulting in fewer system calls to getaddrinfo.
141   - *
142   - * 2. Reusable modules of code for bandwidth monitoring.
143   - *
144   - * 3. Sometimes traffic shapers are needed to simulate real world environments.
145   - * A filter allows you to write custom code to simulate such environments.
146   - * The ability to code this yourself is especially helpful when your simulated environment
147   - * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router),
148   - * or the system tools to handle this aren't available (e.g. on a mobile device).
149   - *
150   - * @param data - The packet that was received.
151   - * @param address - The address the data was received from.
152   - * See utilities section for methods to extract info from address.
153   - * @param tag - The tag that was passed in the send method.
154   - *
155   - * @returns - YES if the packet should actually be sent over the socket.
156   - * NO if the packet should be silently dropped (not sent over the socket).
157   - *
158   - * Regardless of the return value, the delegate will be informed that the packet was successfully sent.
159   - *
160   -**/
161   -typedef BOOL (^GCDAsyncUdpSocketSendFilterBlock)(NSData *data, NSData *address, long tag);
162   -
163   -
164   -@interface GCDAsyncUdpSocket : NSObject
165   -
166   -/**
167   - * GCDAsyncUdpSocket uses the standard delegate paradigm,
168   - * but executes all delegate callbacks on a given delegate dispatch queue.
169   - * This allows for maximum concurrency, while at the same time providing easy thread safety.
170   - *
171   - * You MUST set a delegate AND delegate dispatch queue before attempting to
172   - * use the socket, or you will get an error.
173   - *
174   - * The socket queue is optional.
175   - * If you pass NULL, GCDAsyncSocket will automatically create its own socket queue.
176   - * If you choose to provide a socket queue, the socket queue must not be a concurrent queue,
177   - * then please see the discussion for the method markSocketQueueTargetQueue.
178   - *
179   - * The delegate queue and socket queue can optionally be the same.
180   -**/
181   -- (instancetype)init;
182   -- (instancetype)initWithSocketQueue:(nullable dispatch_queue_t)sq;
183   -- (instancetype)initWithDelegate:(nullable id <GCDAsyncUdpSocketDelegate>)aDelegate delegateQueue:(nullable dispatch_queue_t)dq;
184   -- (instancetype)initWithDelegate:(nullable id <GCDAsyncUdpSocketDelegate>)aDelegate delegateQueue:(nullable dispatch_queue_t)dq socketQueue:(nullable dispatch_queue_t)sq;
185   -
186   -#pragma mark Configuration
187   -
188   -- (nullable id <GCDAsyncUdpSocketDelegate>)delegate;
189   -- (void)setDelegate:(nullable id <GCDAsyncUdpSocketDelegate>)delegate;
190   -- (void)synchronouslySetDelegate:(nullable id <GCDAsyncUdpSocketDelegate>)delegate;
191   -
192   -- (nullable dispatch_queue_t)delegateQueue;
193   -- (void)setDelegateQueue:(nullable dispatch_queue_t)delegateQueue;
194   -- (void)synchronouslySetDelegateQueue:(nullable dispatch_queue_t)delegateQueue;
195   -
196   -- (void)getDelegate:(id <GCDAsyncUdpSocketDelegate> __nullable * __nullable)delegatePtr delegateQueue:(dispatch_queue_t __nullable * __nullable)delegateQueuePtr;
197   -- (void)setDelegate:(nullable id <GCDAsyncUdpSocketDelegate>)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue;
198   -- (void)synchronouslySetDelegate:(nullable id <GCDAsyncUdpSocketDelegate>)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue;
199   -
200   -/**
201   - * By default, both IPv4 and IPv6 are enabled.
202   - *
203   - * This means GCDAsyncUdpSocket automatically supports both protocols,
204   - * and can send to IPv4 or IPv6 addresses,
205   - * as well as receive over IPv4 and IPv6.
206   - *
207   - * For operations that require DNS resolution, GCDAsyncUdpSocket supports both IPv4 and IPv6.
208   - * If a DNS lookup returns only IPv4 results, GCDAsyncUdpSocket will automatically use IPv4.
209   - * If a DNS lookup returns only IPv6 results, GCDAsyncUdpSocket will automatically use IPv6.
210   - * If a DNS lookup returns both IPv4 and IPv6 results, then the protocol used depends on the configured preference.
211   - * If IPv4 is preferred, then IPv4 is used.
212   - * If IPv6 is preferred, then IPv6 is used.
213   - * If neutral, then the first IP version in the resolved array will be used.
214   - *
215   - * Starting with Mac OS X 10.7 Lion and iOS 5, the default IP preference is neutral.
216   - * On prior systems the default IP preference is IPv4.
217   - **/
218   -- (BOOL)isIPv4Enabled;
219   -- (void)setIPv4Enabled:(BOOL)flag;
220   -
221   -- (BOOL)isIPv6Enabled;
222   -- (void)setIPv6Enabled:(BOOL)flag;
223   -
224   -- (BOOL)isIPv4Preferred;
225   -- (BOOL)isIPv6Preferred;
226   -- (BOOL)isIPVersionNeutral;
227   -
228   -- (void)setPreferIPv4;
229   -- (void)setPreferIPv6;
230   -- (void)setIPVersionNeutral;
231   -
232   -/**
233   - * Gets/Sets the maximum size of the buffer that will be allocated for receive operations.
234   - * The default maximum size is 65535 bytes.
235   - *
236   - * The theoretical maximum size of any IPv4 UDP packet is UINT16_MAX = 65535.
237   - * The theoretical maximum size of any IPv6 UDP packet is UINT32_MAX = 4294967295.
238   - *
239   - * Since the OS/GCD notifies us of the size of each received UDP packet,
240   - * the actual allocated buffer size for each packet is exact.
241   - * And in practice the size of UDP packets is generally much smaller than the max.
242   - * Indeed most protocols will send and receive packets of only a few bytes,
243   - * or will set a limit on the size of packets to prevent fragmentation in the IP layer.
244   - *
245   - * If you set the buffer size too small, the sockets API in the OS will silently discard
246   - * any extra data, and you will not be notified of the error.
247   -**/
248   -- (uint16_t)maxReceiveIPv4BufferSize;
249   -- (void)setMaxReceiveIPv4BufferSize:(uint16_t)max;
250   -
251   -- (uint32_t)maxReceiveIPv6BufferSize;
252   -- (void)setMaxReceiveIPv6BufferSize:(uint32_t)max;
253   -
254   -/**
255   - * Gets/Sets the maximum size of the buffer that will be allocated for send operations.
256   - * The default maximum size is 65535 bytes.
257   - *
258   - * Given that a typical link MTU is 1500 bytes, a large UDP datagram will have to be
259   - * fragmented, and that’s both expensive and risky (if one fragment goes missing, the
260   - * entire datagram is lost). You are much better off sending a large number of smaller
261   - * UDP datagrams, preferably using a path MTU algorithm to avoid fragmentation.
262   - *
263   - * You must set it before the sockt is created otherwise it won't work.
264   - *
265   - **/
266   -- (uint16_t)maxSendBufferSize;
267   -- (void)setMaxSendBufferSize:(uint16_t)max;
268   -
269   -/**
270   - * User data allows you to associate arbitrary information with the socket.
271   - * This data is not used internally in any way.
272   -**/
273   -- (nullable id)userData;
274   -- (void)setUserData:(nullable id)arbitraryUserData;
275   -
276   -#pragma mark Diagnostics
277   -
278   -/**
279   - * Returns the local address info for the socket.
280   - *
281   - * The localAddress method returns a sockaddr structure wrapped in a NSData object.
282   - * The localHost method returns the human readable IP address as a string.
283   - *
284   - * Note: Address info may not be available until after the socket has been binded, connected
285   - * or until after data has been sent.
286   -**/
287   -- (nullable NSData *)localAddress;
288   -- (nullable NSString *)localHost;
289   -- (uint16_t)localPort;
290   -
291   -- (nullable NSData *)localAddress_IPv4;
292   -- (nullable NSString *)localHost_IPv4;
293   -- (uint16_t)localPort_IPv4;
294   -
295   -- (nullable NSData *)localAddress_IPv6;
296   -- (nullable NSString *)localHost_IPv6;
297   -- (uint16_t)localPort_IPv6;
298   -
299   -/**
300   - * Returns the remote address info for the socket.
301   - *
302   - * The connectedAddress method returns a sockaddr structure wrapped in a NSData object.
303   - * The connectedHost method returns the human readable IP address as a string.
304   - *
305   - * Note: Since UDP is connectionless by design, connected address info
306   - * will not be available unless the socket is explicitly connected to a remote host/port.
307   - * If the socket is not connected, these methods will return nil / 0.
308   -**/
309   -- (nullable NSData *)connectedAddress;
310   -- (nullable NSString *)connectedHost;
311   -- (uint16_t)connectedPort;
312   -
313   -/**
314   - * Returns whether or not this socket has been connected to a single host.
315   - * By design, UDP is a connectionless protocol, and connecting is not needed.
316   - * If connected, the socket will only be able to send/receive data to/from the connected host.
317   -**/
318   -- (BOOL)isConnected;
319   -
320   -/**
321   - * Returns whether or not this socket has been closed.
322   - * The only way a socket can be closed is if you explicitly call one of the close methods.
323   -**/
324   -- (BOOL)isClosed;
325   -
326   -/**
327   - * Returns whether or not this socket is IPv4.
328   - *
329   - * By default this will be true, unless:
330   - * - IPv4 is disabled (via setIPv4Enabled:)
331   - * - The socket is explicitly bound to an IPv6 address
332   - * - The socket is connected to an IPv6 address
333   -**/
334   -- (BOOL)isIPv4;
335   -
336   -/**
337   - * Returns whether or not this socket is IPv6.
338   - *
339   - * By default this will be true, unless:
340   - * - IPv6 is disabled (via setIPv6Enabled:)
341   - * - The socket is explicitly bound to an IPv4 address
342   - * _ The socket is connected to an IPv4 address
343   - *
344   - * This method will also return false on platforms that do not support IPv6.
345   - * Note: The iPhone does not currently support IPv6.
346   -**/
347   -- (BOOL)isIPv6;
348   -
349   -#pragma mark Binding
350   -
351   -/**
352   - * Binds the UDP socket to the given port.
353   - * Binding should be done for server sockets that receive data prior to sending it.
354   - * Client sockets can skip binding,
355   - * as the OS will automatically assign the socket an available port when it starts sending data.
356   - *
357   - * You may optionally pass a port number of zero to immediately bind the socket,
358   - * yet still allow the OS to automatically assign an available port.
359   - *
360   - * You cannot bind a socket after its been connected.
361   - * You can only bind a socket once.
362   - * You can still connect a socket (if desired) after binding.
363   - *
364   - * On success, returns YES.
365   - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr.
366   -**/
367   -- (BOOL)bindToPort:(uint16_t)port error:(NSError **)errPtr;
368   -
369   -/**
370   - * Binds the UDP socket to the given port and optional interface.
371   - * Binding should be done for server sockets that receive data prior to sending it.
372   - * Client sockets can skip binding,
373   - * as the OS will automatically assign the socket an available port when it starts sending data.
374   - *
375   - * You may optionally pass a port number of zero to immediately bind the socket,
376   - * yet still allow the OS to automatically assign an available port.
377   - *
378   - * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35").
379   - * You may also use the special strings "localhost" or "loopback" to specify that
380   - * the socket only accept packets from the local machine.
381   - *
382   - * You cannot bind a socket after its been connected.
383   - * You can only bind a socket once.
384   - * You can still connect a socket (if desired) after binding.
385   - *
386   - * On success, returns YES.
387   - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr.
388   -**/
389   -- (BOOL)bindToPort:(uint16_t)port interface:(nullable NSString *)interface error:(NSError **)errPtr;
390   -
391   -/**
392   - * Binds the UDP socket to the given address, specified as a sockaddr structure wrapped in a NSData object.
393   - *
394   - * If you have an existing struct sockaddr you can convert it to a NSData object like so:
395   - * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
396   - * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];
397   - *
398   - * Binding should be done for server sockets that receive data prior to sending it.
399   - * Client sockets can skip binding,
400   - * as the OS will automatically assign the socket an available port when it starts sending data.
401   - *
402   - * You cannot bind a socket after its been connected.
403   - * You can only bind a socket once.
404   - * You can still connect a socket (if desired) after binding.
405   - *
406   - * On success, returns YES.
407   - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr.
408   -**/
409   -- (BOOL)bindToAddress:(NSData *)localAddr error:(NSError **)errPtr;
410   -
411   -#pragma mark Connecting
412   -
413   -/**
414   - * Connects the UDP socket to the given host and port.
415   - * By design, UDP is a connectionless protocol, and connecting is not needed.
416   - *
417   - * Choosing to connect to a specific host/port has the following effect:
418   - * - You will only be able to send data to the connected host/port.
419   - * - You will only be able to receive data from the connected host/port.
420   - * - You will receive ICMP messages that come from the connected host/port, such as "connection refused".
421   - *
422   - * The actual process of connecting a UDP socket does not result in any communication on the socket.
423   - * It simply changes the internal state of the socket.
424   - *
425   - * You cannot bind a socket after it has been connected.
426   - * You can only connect a socket once.
427   - *
428   - * The host may be a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2").
429   - *
430   - * This method is asynchronous as it requires a DNS lookup to resolve the given host name.
431   - * If an obvious error is detected, this method immediately returns NO and sets errPtr.
432   - * If you don't care about the error, you can pass nil for errPtr.
433   - * Otherwise, this method returns YES and begins the asynchronous connection process.
434   - * The result of the asynchronous connection process will be reported via the delegate methods.
435   - **/
436   -- (BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port error:(NSError **)errPtr;
437   -
438   -/**
439   - * Connects the UDP socket to the given address, specified as a sockaddr structure wrapped in a NSData object.
440   - *
441   - * If you have an existing struct sockaddr you can convert it to a NSData object like so:
442   - * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
443   - * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];
444   - *
445   - * By design, UDP is a connectionless protocol, and connecting is not needed.
446   - *
447   - * Choosing to connect to a specific address has the following effect:
448   - * - You will only be able to send data to the connected address.
449   - * - You will only be able to receive data from the connected address.
450   - * - You will receive ICMP messages that come from the connected address, such as "connection refused".
451   - *
452   - * Connecting a UDP socket does not result in any communication on the socket.
453   - * It simply changes the internal state of the socket.
454   - *
455   - * You cannot bind a socket after its been connected.
456   - * You can only connect a socket once.
457   - *
458   - * On success, returns YES.
459   - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr.
460   - *
461   - * Note: Unlike the connectToHost:onPort:error: method, this method does not require a DNS lookup.
462   - * Thus when this method returns, the connection has either failed or fully completed.
463   - * In other words, this method is synchronous, unlike the asynchronous connectToHost::: method.
464   - * However, for compatibility and simplification of delegate code, if this method returns YES
465   - * then the corresponding delegate method (udpSocket:didConnectToHost:port:) is still invoked.
466   -**/
467   -- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr;
468   -
469   -#pragma mark Multicast
470   -
471   -/**
472   - * Join multicast group.
473   - * Group should be an IP address (eg @"225.228.0.1").
474   - *
475   - * On success, returns YES.
476   - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr.
477   -**/
478   -- (BOOL)joinMulticastGroup:(NSString *)group error:(NSError **)errPtr;
479   -
480   -/**
481   - * Join multicast group.
482   - * Group should be an IP address (eg @"225.228.0.1").
483   - * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35").
484   - *
485   - * On success, returns YES.
486   - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr.
487   -**/
488   -- (BOOL)joinMulticastGroup:(NSString *)group onInterface:(nullable NSString *)interface error:(NSError **)errPtr;
489   -
490   -- (BOOL)leaveMulticastGroup:(NSString *)group error:(NSError **)errPtr;
491   -- (BOOL)leaveMulticastGroup:(NSString *)group onInterface:(nullable NSString *)interface error:(NSError **)errPtr;
492   -
493   -#pragma mark Reuse Port
494   -
495   -/**
496   - * By default, only one socket can be bound to a given IP address + port at a time.
497   - * To enable multiple processes to simultaneously bind to the same address+port,
498   - * you need to enable this functionality in the socket. All processes that wish to
499   - * use the address+port simultaneously must all enable reuse port on the socket
500   - * bound to that port.
501   - **/
502   -- (BOOL)enableReusePort:(BOOL)flag error:(NSError **)errPtr;
503   -
504   -#pragma mark Broadcast
505   -
506   -/**
507   - * By default, the underlying socket in the OS will not allow you to send broadcast messages.
508   - * In order to send broadcast messages, you need to enable this functionality in the socket.
509   - *
510   - * A broadcast is a UDP message to addresses like "192.168.255.255" or "255.255.255.255" that is
511   - * delivered to every host on the network.
512   - * The reason this is generally disabled by default (by the OS) is to prevent
513   - * accidental broadcast messages from flooding the network.
514   -**/
515   -- (BOOL)enableBroadcast:(BOOL)flag error:(NSError **)errPtr;
516   -
517   -#pragma mark Sending
518   -
519   -/**
520   - * Asynchronously sends the given data, with the given timeout and tag.
521   - *
522   - * This method may only be used with a connected socket.
523   - * Recall that connecting is optional for a UDP socket.
524   - * For connected sockets, data can only be sent to the connected address.
525   - * For non-connected sockets, the remote destination is specified for each packet.
526   - * For more information about optionally connecting udp sockets, see the documentation for the connect methods above.
527   - *
528   - * @param data
529   - * The data to send.
530   - * If data is nil or zero-length, this method does nothing.
531   - * If passing NSMutableData, please read the thread-safety notice below.
532   - *
533   - * @param timeout
534   - * The timeout for the send opeartion.
535   - * If the timeout value is negative, the send operation will not use a timeout.
536   - *
537   - * @param tag
538   - * The tag is for your convenience.
539   - * It is not sent or received over the socket in any manner what-so-ever.
540   - * It is reported back as a parameter in the udpSocket:didSendDataWithTag:
541   - * or udpSocket:didNotSendDataWithTag:dueToError: methods.
542   - * You can use it as an array index, state id, type constant, etc.
543   - *
544   - *
545   - * Thread-Safety Note:
546   - * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while
547   - * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method
548   - * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying
549   - * that this particular send operation has completed.
550   - * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data.
551   - * It simply retains it for performance reasons.
552   - * Often times, if NSMutableData is passed, it is because a request/response was built up in memory.
553   - * Copying this data adds an unwanted/unneeded overhead.
554   - * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket
555   - * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time
556   - * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method.
557   -**/
558   -- (void)sendData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
559   -
560   -/**
561   - * Asynchronously sends the given data, with the given timeout and tag, to the given host and port.
562   - *
563   - * This method cannot be used with a connected socket.
564   - * Recall that connecting is optional for a UDP socket.
565   - * For connected sockets, data can only be sent to the connected address.
566   - * For non-connected sockets, the remote destination is specified for each packet.
567   - * For more information about optionally connecting udp sockets, see the documentation for the connect methods above.
568   - *
569   - * @param data
570   - * The data to send.
571   - * If data is nil or zero-length, this method does nothing.
572   - * If passing NSMutableData, please read the thread-safety notice below.
573   - *
574   - * @param host
575   - * The destination to send the udp packet to.
576   - * May be specified as a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2").
577   - * You may also use the convenience strings of "loopback" or "localhost".
578   - *
579   - * @param port
580   - * The port of the host to send to.
581   - *
582   - * @param timeout
583   - * The timeout for the send opeartion.
584   - * If the timeout value is negative, the send operation will not use a timeout.
585   - *
586   - * @param tag
587   - * The tag is for your convenience.
588   - * It is not sent or received over the socket in any manner what-so-ever.
589   - * It is reported back as a parameter in the udpSocket:didSendDataWithTag:
590   - * or udpSocket:didNotSendDataWithTag:dueToError: methods.
591   - * You can use it as an array index, state id, type constant, etc.
592   - *
593   - *
594   - * Thread-Safety Note:
595   - * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while
596   - * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method
597   - * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying
598   - * that this particular send operation has completed.
599   - * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data.
600   - * It simply retains it for performance reasons.
601   - * Often times, if NSMutableData is passed, it is because a request/response was built up in memory.
602   - * Copying this data adds an unwanted/unneeded overhead.
603   - * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket
604   - * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time
605   - * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method.
606   -**/
607   -- (void)sendData:(NSData *)data
608   - toHost:(NSString *)host
609   - port:(uint16_t)port
610   - withTimeout:(NSTimeInterval)timeout
611   - tag:(long)tag;
612   -
613   -/**
614   - * Asynchronously sends the given data, with the given timeout and tag, to the given address.
615   - *
616   - * This method cannot be used with a connected socket.
617   - * Recall that connecting is optional for a UDP socket.
618   - * For connected sockets, data can only be sent to the connected address.
619   - * For non-connected sockets, the remote destination is specified for each packet.
620   - * For more information about optionally connecting udp sockets, see the documentation for the connect methods above.
621   - *
622   - * @param data
623   - * The data to send.
624   - * If data is nil or zero-length, this method does nothing.
625   - * If passing NSMutableData, please read the thread-safety notice below.
626   - *
627   - * @param remoteAddr
628   - * The address to send the data to (specified as a sockaddr structure wrapped in a NSData object).
629   - *
630   - * @param timeout
631   - * The timeout for the send opeartion.
632   - * If the timeout value is negative, the send operation will not use a timeout.
633   - *
634   - * @param tag
635   - * The tag is for your convenience.
636   - * It is not sent or received over the socket in any manner what-so-ever.
637   - * It is reported back as a parameter in the udpSocket:didSendDataWithTag:
638   - * or udpSocket:didNotSendDataWithTag:dueToError: methods.
639   - * You can use it as an array index, state id, type constant, etc.
640   - *
641   - *
642   - * Thread-Safety Note:
643   - * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while
644   - * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method
645   - * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying
646   - * that this particular send operation has completed.
647   - * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data.
648   - * It simply retains it for performance reasons.
649   - * Often times, if NSMutableData is passed, it is because a request/response was built up in memory.
650   - * Copying this data adds an unwanted/unneeded overhead.
651   - * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket
652   - * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time
653   - * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method.
654   -**/
655   -- (void)sendData:(NSData *)data toAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout tag:(long)tag;
656   -
657   -/**
658   - * You may optionally set a send filter for the socket.
659   - * A filter can provide several interesting possibilities:
660   - *
661   - * 1. Optional caching of resolved addresses for domain names.
662   - * The cache could later be consulted, resulting in fewer system calls to getaddrinfo.
663   - *
664   - * 2. Reusable modules of code for bandwidth monitoring.
665   - *
666   - * 3. Sometimes traffic shapers are needed to simulate real world environments.
667   - * A filter allows you to write custom code to simulate such environments.
668   - * The ability to code this yourself is especially helpful when your simulated environment
669   - * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router),
670   - * or the system tools to handle this aren't available (e.g. on a mobile device).
671   - *
672   - * For more information about GCDAsyncUdpSocketSendFilterBlock, see the documentation for its typedef.
673   - * To remove a previously set filter, invoke this method and pass a nil filterBlock and NULL filterQueue.
674   - *
675   - * Note: This method invokes setSendFilter:withQueue:isAsynchronous: (documented below),
676   - * passing YES for the isAsynchronous parameter.
677   -**/
678   -- (void)setSendFilter:(nullable GCDAsyncUdpSocketSendFilterBlock)filterBlock withQueue:(nullable dispatch_queue_t)filterQueue;
679   -
680   -/**
681   - * The receive filter can be run via dispatch_async or dispatch_sync.
682   - * Most typical situations call for asynchronous operation.
683   - *
684   - * However, there are a few situations in which synchronous operation is preferred.
685   - * Such is the case when the filter is extremely minimal and fast.
686   - * This is because dispatch_sync is faster than dispatch_async.
687   - *
688   - * If you choose synchronous operation, be aware of possible deadlock conditions.
689   - * Since the socket queue is executing your block via dispatch_sync,
690   - * then you cannot perform any tasks which may invoke dispatch_sync on the socket queue.
691   - * For example, you can't query properties on the socket.
692   -**/
693   -- (void)setSendFilter:(nullable GCDAsyncUdpSocketSendFilterBlock)filterBlock
694   - withQueue:(nullable dispatch_queue_t)filterQueue
695   - isAsynchronous:(BOOL)isAsynchronous;
696   -
697   -#pragma mark Receiving
698   -
699   -/**
700   - * There are two modes of operation for receiving packets: one-at-a-time & continuous.
701   - *
702   - * In one-at-a-time mode, you call receiveOnce everytime your delegate is ready to process an incoming udp packet.
703   - * Receiving packets one-at-a-time may be better suited for implementing certain state machine code,
704   - * where your state machine may not always be ready to process incoming packets.
705   - *
706   - * In continuous mode, the delegate is invoked immediately everytime incoming udp packets are received.
707   - * Receiving packets continuously is better suited to real-time streaming applications.
708   - *
709   - * You may switch back and forth between one-at-a-time mode and continuous mode.
710   - * If the socket is currently in continuous mode, calling this method will switch it to one-at-a-time mode.
711   - *
712   - * When a packet is received (and not filtered by the optional receive filter),
713   - * the delegate method (udpSocket:didReceiveData:fromAddress:withFilterContext:) is invoked.
714   - *
715   - * If the socket is able to begin receiving packets, this method returns YES.
716   - * Otherwise it returns NO, and sets the errPtr with appropriate error information.
717   - *
718   - * An example error:
719   - * You created a udp socket to act as a server, and immediately called receive.
720   - * You forgot to first bind the socket to a port number, and received a error with a message like:
721   - * "Must bind socket before you can receive data."
722   -**/
723   -- (BOOL)receiveOnce:(NSError **)errPtr;
724   -
725   -/**
726   - * There are two modes of operation for receiving packets: one-at-a-time & continuous.
727   - *
728   - * In one-at-a-time mode, you call receiveOnce everytime your delegate is ready to process an incoming udp packet.
729   - * Receiving packets one-at-a-time may be better suited for implementing certain state machine code,
730   - * where your state machine may not always be ready to process incoming packets.
731   - *
732   - * In continuous mode, the delegate is invoked immediately everytime incoming udp packets are received.
733   - * Receiving packets continuously is better suited to real-time streaming applications.
734   - *
735   - * You may switch back and forth between one-at-a-time mode and continuous mode.
736   - * If the socket is currently in one-at-a-time mode, calling this method will switch it to continuous mode.
737   - *
738   - * For every received packet (not filtered by the optional receive filter),
739   - * the delegate method (udpSocket:didReceiveData:fromAddress:withFilterContext:) is invoked.
740   - *
741   - * If the socket is able to begin receiving packets, this method returns YES.
742   - * Otherwise it returns NO, and sets the errPtr with appropriate error information.
743   - *
744   - * An example error:
745   - * You created a udp socket to act as a server, and immediately called receive.
746   - * You forgot to first bind the socket to a port number, and received a error with a message like:
747   - * "Must bind socket before you can receive data."
748   -**/
749   -- (BOOL)beginReceiving:(NSError **)errPtr;
750   -
751   -/**
752   - * If the socket is currently receiving (beginReceiving has been called), this method pauses the receiving.
753   - * That is, it won't read any more packets from the underlying OS socket until beginReceiving is called again.
754   - *
755   - * Important Note:
756   - * GCDAsyncUdpSocket may be running in parallel with your code.
757   - * That is, your delegate is likely running on a separate thread/dispatch_queue.
758   - * When you invoke this method, GCDAsyncUdpSocket may have already dispatched delegate methods to be invoked.
759   - * Thus, if those delegate methods have already been dispatch_async'd,
760   - * your didReceive delegate method may still be invoked after this method has been called.
761   - * You should be aware of this, and program defensively.
762   -**/
763   -- (void)pauseReceiving;
764   -
765   -/**
766   - * You may optionally set a receive filter for the socket.
767   - * This receive filter may be set to run in its own queue (independent of delegate queue).
768   - *
769   - * A filter can provide several useful features.
770   - *
771   - * 1. Many times udp packets need to be parsed.
772   - * Since the filter can run in its own independent queue, you can parallelize this parsing quite easily.
773   - * The end result is a parallel socket io, datagram parsing, and packet processing.
774   - *
775   - * 2. Many times udp packets are discarded because they are duplicate/unneeded/unsolicited.
776   - * The filter can prevent such packets from arriving at the delegate.
777   - * And because the filter can run in its own independent queue, this doesn't slow down the delegate.
778   - *
779   - * - Since the udp protocol does not guarantee delivery, udp packets may be lost.
780   - * Many protocols built atop udp thus provide various resend/re-request algorithms.
781   - * This sometimes results in duplicate packets arriving.
782   - * A filter may allow you to architect the duplicate detection code to run in parallel to normal processing.
783   - *
784   - * - Since the udp socket may be connectionless, its possible for unsolicited packets to arrive.
785   - * Such packets need to be ignored.
786   - *
787   - * 3. Sometimes traffic shapers are needed to simulate real world environments.
788   - * A filter allows you to write custom code to simulate such environments.
789   - * The ability to code this yourself is especially helpful when your simulated environment
790   - * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router),
791   - * or the system tools to handle this aren't available (e.g. on a mobile device).
792   - *
793   - * Example:
794   - *
795   - * GCDAsyncUdpSocketReceiveFilterBlock filter = ^BOOL (NSData *data, NSData *address, id *context) {
796   - *
797   - * MyProtocolMessage *msg = [MyProtocol parseMessage:data];
798   - *
799   - * *context = response;
800   - * return (response != nil);
801   - * };
802   - * [udpSocket setReceiveFilter:filter withQueue:myParsingQueue];
803   - *
804   - * For more information about GCDAsyncUdpSocketReceiveFilterBlock, see the documentation for its typedef.
805   - * To remove a previously set filter, invoke this method and pass a nil filterBlock and NULL filterQueue.
806   - *
807   - * Note: This method invokes setReceiveFilter:withQueue:isAsynchronous: (documented below),
808   - * passing YES for the isAsynchronous parameter.
809   -**/
810   -- (void)setReceiveFilter:(nullable GCDAsyncUdpSocketReceiveFilterBlock)filterBlock withQueue:(nullable dispatch_queue_t)filterQueue;
811   -
812   -/**
813   - * The receive filter can be run via dispatch_async or dispatch_sync.
814   - * Most typical situations call for asynchronous operation.
815   - *
816   - * However, there are a few situations in which synchronous operation is preferred.
817   - * Such is the case when the filter is extremely minimal and fast.
818   - * This is because dispatch_sync is faster than dispatch_async.
819   - *
820   - * If you choose synchronous operation, be aware of possible deadlock conditions.
821   - * Since the socket queue is executing your block via dispatch_sync,
822   - * then you cannot perform any tasks which may invoke dispatch_sync on the socket queue.
823   - * For example, you can't query properties on the socket.
824   -**/
825   -- (void)setReceiveFilter:(nullable GCDAsyncUdpSocketReceiveFilterBlock)filterBlock
826   - withQueue:(nullable dispatch_queue_t)filterQueue
827   - isAsynchronous:(BOOL)isAsynchronous;
828   -
829   -#pragma mark Closing
830   -
831   -/**
832   - * Immediately closes the underlying socket.
833   - * Any pending send operations are discarded.
834   - *
835   - * The GCDAsyncUdpSocket instance may optionally be used again.
836   - * (it will setup/configure/use another unnderlying BSD socket).
837   -**/
838   -- (void)close;
839   -
840   -/**
841   - * Closes the underlying socket after all pending send operations have been sent.
842   - *
843   - * The GCDAsyncUdpSocket instance may optionally be used again.
844   - * (it will setup/configure/use another unnderlying BSD socket).
845   -**/
846   -- (void)closeAfterSending;
847   -
848   -#pragma mark Advanced
849   -/**
850   - * GCDAsyncSocket maintains thread safety by using an internal serial dispatch_queue.
851   - * In most cases, the instance creates this queue itself.
852   - * However, to allow for maximum flexibility, the internal queue may be passed in the init method.
853   - * This allows for some advanced options such as controlling socket priority via target queues.
854   - * However, when one begins to use target queues like this, they open the door to some specific deadlock issues.
855   - *
856   - * For example, imagine there are 2 queues:
857   - * dispatch_queue_t socketQueue;
858   - * dispatch_queue_t socketTargetQueue;
859   - *
860   - * If you do this (pseudo-code):
861   - * socketQueue.targetQueue = socketTargetQueue;
862   - *
863   - * Then all socketQueue operations will actually get run on the given socketTargetQueue.
864   - * This is fine and works great in most situations.
865   - * But if you run code directly from within the socketTargetQueue that accesses the socket,
866   - * you could potentially get deadlock. Imagine the following code:
867   - *
868   - * - (BOOL)socketHasSomething
869   - * {
870   - * __block BOOL result = NO;
871   - * dispatch_block_t block = ^{
872   - * result = [self someInternalMethodToBeRunOnlyOnSocketQueue];
873   - * }
874   - * if (is_executing_on_queue(socketQueue))
875   - * block();
876   - * else
877   - * dispatch_sync(socketQueue, block);
878   - *
879   - * return result;
880   - * }
881   - *
882   - * What happens if you call this method from the socketTargetQueue? The result is deadlock.
883   - * This is because the GCD API offers no mechanism to discover a queue's targetQueue.
884   - * Thus we have no idea if our socketQueue is configured with a targetQueue.
885   - * If we had this information, we could easily avoid deadlock.
886   - * But, since these API's are missing or unfeasible, you'll have to explicitly set it.
887   - *
888   - * IF you pass a socketQueue via the init method,
889   - * AND you've configured the passed socketQueue with a targetQueue,
890   - * THEN you should pass the end queue in the target hierarchy.
891   - *
892   - * For example, consider the following queue hierarchy:
893   - * socketQueue -> ipQueue -> moduleQueue
894   - *
895   - * This example demonstrates priority shaping within some server.
896   - * All incoming client connections from the same IP address are executed on the same target queue.
897   - * And all connections for a particular module are executed on the same target queue.
898   - * Thus, the priority of all networking for the entire module can be changed on the fly.
899   - * Additionally, networking traffic from a single IP cannot monopolize the module.
900   - *
901   - * Here's how you would accomplish something like that:
902   - * - (dispatch_queue_t)newSocketQueueForConnectionFromAddress:(NSData *)address onSocket:(GCDAsyncSocket *)sock
903   - * {
904   - * dispatch_queue_t socketQueue = dispatch_queue_create("", NULL);
905   - * dispatch_queue_t ipQueue = [self ipQueueForAddress:address];
906   - *
907   - * dispatch_set_target_queue(socketQueue, ipQueue);
908   - * dispatch_set_target_queue(iqQueue, moduleQueue);
909   - *
910   - * return socketQueue;
911   - * }
912   - * - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
913   - * {
914   - * [clientConnections addObject:newSocket];
915   - * [newSocket markSocketQueueTargetQueue:moduleQueue];
916   - * }
917   - *
918   - * Note: This workaround is ONLY needed if you intend to execute code directly on the ipQueue or moduleQueue.
919   - * This is often NOT the case, as such queues are used solely for execution shaping.
920   - **/
921   -- (void)markSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreConfiguredTargetQueue;
922   -- (void)unmarkSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreviouslyConfiguredTargetQueue;
923   -
924   -/**
925   - * It's not thread-safe to access certain variables from outside the socket's internal queue.
926   - *
927   - * For example, the socket file descriptor.
928   - * File descriptors are simply integers which reference an index in the per-process file table.
929   - * However, when one requests a new file descriptor (by opening a file or socket),
930   - * the file descriptor returned is guaranteed to be the lowest numbered unused descriptor.
931   - * So if we're not careful, the following could be possible:
932   - *
933   - * - Thread A invokes a method which returns the socket's file descriptor.
934   - * - The socket is closed via the socket's internal queue on thread B.
935   - * - Thread C opens a file, and subsequently receives the file descriptor that was previously the socket's FD.
936   - * - Thread A is now accessing/altering the file instead of the socket.
937   - *
938   - * In addition to this, other variables are not actually objects,
939   - * and thus cannot be retained/released or even autoreleased.
940   - * An example is the sslContext, of type SSLContextRef, which is actually a malloc'd struct.
941   - *
942   - * Although there are internal variables that make it difficult to maintain thread-safety,
943   - * it is important to provide access to these variables
944   - * to ensure this class can be used in a wide array of environments.
945   - * This method helps to accomplish this by invoking the current block on the socket's internal queue.
946   - * The methods below can be invoked from within the block to access
947   - * those generally thread-unsafe internal variables in a thread-safe manner.
948   - * The given block will be invoked synchronously on the socket's internal queue.
949   - *
950   - * If you save references to any protected variables and use them outside the block, you do so at your own peril.
951   -**/
952   -- (void)performBlock:(dispatch_block_t)block;
953   -
954   -/**
955   - * These methods are only available from within the context of a performBlock: invocation.
956   - * See the documentation for the performBlock: method above.
957   - *
958   - * Provides access to the socket's file descriptor(s).
959   - * If the socket isn't connected, or explicity bound to a particular interface,
960   - * it might actually have multiple internal socket file descriptors - one for IPv4 and one for IPv6.
961   -**/
962   -- (int)socketFD;
963   -- (int)socket4FD;
964   -- (int)socket6FD;
965   -
966   -#if TARGET_OS_IPHONE
967   -
968   -/**
969   - * These methods are only available from within the context of a performBlock: invocation.
970   - * See the documentation for the performBlock: method above.
971   - *
972   - * Returns (creating if necessary) a CFReadStream/CFWriteStream for the internal socket.
973   - *
974   - * Generally GCDAsyncUdpSocket doesn't use CFStream. (It uses the faster GCD API's.)
975   - * However, if you need one for any reason,
976   - * these methods are a convenient way to get access to a safe instance of one.
977   -**/
978   -- (nullable CFReadStreamRef)readStream;
979   -- (nullable CFWriteStreamRef)writeStream;
980   -
981   -/**
982   - * This method is only available from within the context of a performBlock: invocation.
983   - * See the documentation for the performBlock: method above.
984   - *
985   - * Configures the socket to allow it to operate when the iOS application has been backgrounded.
986   - * In other words, this method creates a read & write stream, and invokes:
987   - *
988   - * CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
989   - * CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
990   - *
991   - * Returns YES if successful, NO otherwise.
992   - *
993   - * Example usage:
994   - *
995   - * [asyncUdpSocket performBlock:^{
996   - * [asyncUdpSocket enableBackgroundingOnSocket];
997   - * }];
998   - *
999   - *
1000   - * NOTE : Apple doesn't currently support backgrounding UDP sockets. (Only TCP for now).
1001   -**/
1002   -//- (BOOL)enableBackgroundingOnSockets;
1003   -
1004   -#endif
1005   -
1006   -#pragma mark Utilities
1007   -
1008   -/**
1009   - * Extracting host/port/family information from raw address data.
1010   -**/
1011   -
1012   -+ (nullable NSString *)hostFromAddress:(NSData *)address;
1013   -+ (uint16_t)portFromAddress:(NSData *)address;
1014   -+ (int)familyFromAddress:(NSData *)address;
1015   -
1016   -+ (BOOL)isIPv4Address:(NSData *)address;
1017   -+ (BOOL)isIPv6Address:(NSData *)address;
1018   -
1019   -+ (BOOL)getHost:(NSString * __nullable * __nullable)hostPtr port:(uint16_t * __nullable)portPtr fromAddress:(NSData *)address;
1020   -+ (BOOL)getHost:(NSString * __nullable * __nullable)hostPtr port:(uint16_t * __nullable)portPtr family:(int * __nullable)afPtr fromAddress:(NSData *)address;
1021   -
1022   -@end
1023   -
1024   -NS_ASSUME_NONNULL_END
Example/build/Debug-iphoneos/CocoaAsyncSocket/CocoaAsyncSocket.framework/Info.plist deleted 100644 → 0
No preview for this file type
Example/build/Debug-iphoneos/CocoaAsyncSocket/CocoaAsyncSocket.framework/Modules/module.modulemap deleted 100644 → 0
1   -framework module CocoaAsyncSocket {
2   - umbrella header "CocoaAsyncSocket-umbrella.h"
3   -
4   - export *
5   - module * { export * }
6   -}
Example/build/Debug-iphoneos/CocoaLumberjack/CocoaLumberjack.framework/CocoaLumberjack deleted 100755 → 0
No preview for this file type
Example/build/Debug-iphoneos/CocoaLumberjack/CocoaLumberjack.framework/Headers/CLIColor.h deleted 100644 → 0
1   -// Software License Agreement (BSD License)
2   -//
3   -// Copyright (c) 2010-2019, Deusty, LLC
4   -// All rights reserved.
5   -//
6   -// Redistribution and use of this software in source and binary forms,
7   -// with or without modification, are permitted provided that the following conditions are met:
8   -//
9   -// * Redistributions of source code must retain the above copyright notice,
10   -// this list of conditions and the following disclaimer.
11   -//
12   -// * Neither the name of Deusty nor the names of its contributors may be used
13   -// to endorse or promote products derived from this software without specific
14   -// prior written permission of Deusty, LLC.
15   -
16   -#if TARGET_OS_OSX
17   -
18   -#import <Foundation/Foundation.h>
19   -#import <QuartzCore/QuartzCore.h>
20   -
21   -/**
22   - * This class represents an NSColor replacement for CLI projects that don't link with AppKit
23   - **/
24   -@interface CLIColor : NSObject
25   -
26   -/**
27   - * Convenience method for creating a `CLIColor` instance from RGBA params
28   - *
29   - * @param red red channel, between 0 and 1
30   - * @param green green channel, between 0 and 1
31   - * @param blue blue channel, between 0 and 1
32   - * @param alpha alpha channel, between 0 and 1
33   - */
34   -+ (CLIColor *)colorWithCalibratedRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;
35   -
36   -/**
37   - * Get the RGBA components from a `CLIColor`
38   - *
39   - * @param red red channel, between 0 and 1
40   - * @param green green channel, between 0 and 1
41   - * @param blue blue channel, between 0 and 1
42   - * @param alpha alpha channel, between 0 and 1
43   - */
44   -- (void)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha NS_SWIFT_NAME(get(red:green:blue:alpha:));
45   -
46   -@end
47   -
48   -#endif
Example/build/Debug-iphoneos/CocoaLumberjack/CocoaLumberjack.framework/Headers/CocoaLumberjack-umbrella.h deleted 100644 → 0
1   -#ifdef __OBJC__
2   -#import <UIKit/UIKit.h>
3   -#else
4   -#ifndef FOUNDATION_EXPORT
5   -#if defined(__cplusplus)
6   -#define FOUNDATION_EXPORT extern "C"
7   -#else
8   -#define FOUNDATION_EXPORT extern
9   -#endif
10   -#endif
11   -#endif
12   -
13   -#import "CocoaLumberjack.h"
14   -#import "DDAbstractDatabaseLogger.h"
15   -#import "DDASLLogCapture.h"
16   -#import "DDASLLogger.h"
17   -#import "DDAssertMacros.h"
18   -#import "DDFileLogger.h"
19   -#import "DDLegacyMacros.h"
20   -#import "DDLog+LOGV.h"
21   -#import "DDLog.h"
22   -#import "DDLoggerNames.h"
23   -#import "DDLogMacros.h"
24   -#import "DDOSLogger.h"
25   -#import "DDTTYLogger.h"
26   -#import "DDContextFilterLogFormatter.h"
27   -#import "DDDispatchQueueLogFormatter.h"
28   -#import "DDFileLogger+Buffering.h"
29   -#import "DDMultiFormatter.h"
30   -#import "CLIColor.h"
31   -
32   -FOUNDATION_EXPORT double CocoaLumberjackVersionNumber;
33   -FOUNDATION_EXPORT const unsigned char CocoaLumberjackVersionString[];
34   -
Example/build/Debug-iphoneos/CocoaLumberjack/CocoaLumberjack.framework/Headers/CocoaLumberjack.h deleted 100644 → 0
1   -// Software License Agreement (BSD License)
2   -//
3   -// Copyright (c) 2010-2019, Deusty, LLC
4   -// All rights reserved.
5   -//
6   -// Redistribution and use of this software in source and binary forms,
7   -// with or without modification, are permitted provided that the following conditions are met:
8   -//
9   -// * Redistributions of source code must retain the above copyright notice,
10   -// this list of conditions and the following disclaimer.
11   -//
12   -// * Neither the name of Deusty nor the names of its contributors may be used
13   -// to endorse or promote products derived from this software without specific
14   -// prior written permission of Deusty, LLC.
15   -
16   -/**
17   - * Welcome to CocoaLumberjack!
18   - *
19   - * The project page has a wealth of documentation if you have any questions.
20   - * https://github.com/CocoaLumberjack/CocoaLumberjack
21   - *
22   - * If you're new to the project you may wish to read "Getting Started" at:
23   - * Documentation/GettingStarted.md
24   - *
25   - * Otherwise, here is a quick refresher.
26   - * There are three steps to using the macros:
27   - *
28   - * Step 1:
29   - * Import the header in your implementation or prefix file:
30   - *
31   - * #import <CocoaLumberjack/CocoaLumberjack.h>
32   - *
33   - * Step 2:
34   - * Define your logging level in your implementation file:
35   - *
36   - * // Log levels: off, error, warn, info, verbose
37   - * static const DDLogLevel ddLogLevel = DDLogLevelVerbose;
38   - *
39   - * Step 2 [3rd party frameworks]:
40   - *
41   - * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:
42   - *
43   - * // #undef LOG_LEVEL_DEF // Undefine first only if needed
44   - * #define LOG_LEVEL_DEF myLibLogLevel
45   - *
46   - * Define your logging level in your implementation file:
47   - *
48   - * // Log levels: off, error, warn, info, verbose
49   - * static const DDLogLevel myLibLogLevel = DDLogLevelVerbose;
50   - *
51   - * Step 3:
52   - * Replace your NSLog statements with DDLog statements according to the severity of the message.
53   - *
54   - * NSLog(@"Fatal error, no dohickey found!"); -> DDLogError(@"Fatal error, no dohickey found!");
55   - *
56   - * DDLog works exactly the same as NSLog.
57   - * This means you can pass it multiple variables just like NSLog.
58   - **/
59   -
60   -#import <Foundation/Foundation.h>
61   -
62   -//! Project version number for CocoaLumberjack.
63   -FOUNDATION_EXPORT double CocoaLumberjackVersionNumber;
64   -
65   -//! Project version string for CocoaLumberjack.
66   -FOUNDATION_EXPORT const unsigned char CocoaLumberjackVersionString[];
67   -
68   -// Disable legacy macros
69   -#ifndef DD_LEGACY_MACROS
70   - #define DD_LEGACY_MACROS 0
71   -#endif
72   -
73   -// Core
74   -#import <CocoaLumberjack/DDLog.h>
75   -
76   -// Main macros
77   -#import <CocoaLumberjack/DDLogMacros.h>
78   -#import <CocoaLumberjack/DDAssertMacros.h>
79   -
80   -// Capture ASL
81   -#import <CocoaLumberjack/DDASLLogCapture.h>
82   -
83   -// Loggers
84   -#import <CocoaLumberjack/DDLoggerNames.h>
85   -
86   -#import <CocoaLumberjack/DDTTYLogger.h>
87   -#import <CocoaLumberjack/DDASLLogger.h>
88   -#import <CocoaLumberjack/DDFileLogger.h>
89   -#import <CocoaLumberjack/DDOSLogger.h>
90   -
91   -// Extensions
92   -#import <CocoaLumberjack/DDContextFilterLogFormatter.h>
93   -#import <CocoaLumberjack/DDDispatchQueueLogFormatter.h>
94   -#import <CocoaLumberjack/DDMultiFormatter.h>
95   -#import <CocoaLumberjack/DDFileLogger+Buffering.h>
96   -
97   -// CLI
98   -#import <CocoaLumberjack/CLIColor.h>
99   -
100   -// etc
101   -#import <CocoaLumberjack/DDAbstractDatabaseLogger.h>
102   -#import <CocoaLumberjack/DDLog+LOGV.h>
103   -#import <CocoaLumberjack/DDLegacyMacros.h>
Example/build/Debug-iphoneos/CocoaLumberjack/CocoaLumberjack.framework/Headers/DDASLLogCapture.h deleted 100644 → 0
1   -// Software License Agreement (BSD License)
2   -//
3   -// Copyright (c) 2010-2019, Deusty, LLC
4   -// All rights reserved.
5   -//
6   -// Redistribution and use of this software in source and binary forms,
7   -// with or without modification, are permitted provided that the following conditions are met:
8   -//
9   -// * Redistributions of source code must retain the above copyright notice,
10   -// this list of conditions and the following disclaimer.
11   -//
12   -// * Neither the name of Deusty nor the names of its contributors may be used
13   -// to endorse or promote products derived from this software without specific
14   -// prior written permission of Deusty, LLC.
15   -
16   -#import <CocoaLumberjack/DDASLLogger.h>
17   -
18   -@protocol DDLogger;
19   -
20   -/**
21   - * This class provides the ability to capture the ASL (Apple System Logs)
22   - */
23   -API_DEPRECATED("Use DDOSLogger instead", macosx(10.4,10.12), ios(2.0,10.0), watchos(2.0,3.0), tvos(9.0,10.0))
24   -@interface DDASLLogCapture : NSObject
25   -
26   -/**
27   - * Start capturing logs
28   - */
29   -+ (void)start;
30   -
31   -/**
32   - * Stop capturing logs
33   - */
34   -+ (void)stop;
35   -
36   -/**
37   - * The current capture level.
38   - * @note Default log level: DDLogLevelVerbose (i.e. capture all ASL messages).
39   - */
40   -@property (class) DDLogLevel captureLevel;
41   -
42   -@end
Example/build/Debug-iphoneos/CocoaLumberjack/CocoaLumberjack.framework/Headers/DDASLLogger.h deleted 100644 → 0
1   -// Software License Agreement (BSD License)
2   -//
3   -// Copyright (c) 2010-2019, Deusty, LLC
4   -// All rights reserved.
5   -//
6   -// Redistribution and use of this software in source and binary forms,
7   -// with or without modification, are permitted provided that the following conditions are met:
8   -//
9   -// * Redistributions of source code must retain the above copyright notice,
10   -// this list of conditions and the following disclaimer.
11   -//
12   -// * Neither the name of Deusty nor the names of its contributors may be used
13   -// to endorse or promote products derived from this software without specific
14   -// prior written permission of Deusty, LLC.
15   -
16   -#import <Foundation/Foundation.h>
17   -
18   -// Disable legacy macros
19   -#ifndef DD_LEGACY_MACROS
20   - #define DD_LEGACY_MACROS 0
21   -#endif
22   -
23   -#import <CocoaLumberjack/DDLog.h>
24   -
25   -// Custom key set on messages sent to ASL
26   -extern const char* const kDDASLKeyDDLog;
27   -
28   -// Value set for kDDASLKeyDDLog
29   -extern const char* const kDDASLDDLogValue;
30   -
31   -/**
32   - * This class provides a logger for the Apple System Log facility.
33   - *
34   - * As described in the "Getting Started" page,
35   - * the traditional NSLog() function directs its output to two places:
36   - *
37   - * - Apple System Log
38   - * - StdErr (if stderr is a TTY) so log statements show up in Xcode console
39   - *
40   - * To duplicate NSLog() functionality you can simply add this logger and a tty logger.
41   - * However, if you instead choose to use file logging (for faster performance),
42   - * you may choose to use a file logger and a tty logger.
43   - **/
44   -API_DEPRECATED("Use DDOSLogger instead", macosx(10.4,10.12), ios(2.0,10.0), watchos(2.0,3.0), tvos(9.0,10.0))
45   -@interface DDASLLogger : DDAbstractLogger <DDLogger>
46   -
47   -/**
48   - * Singleton method
49   - *
50   - * @return the shared instance
51   - */
52   -@property (class, readonly, strong) DDASLLogger *sharedInstance;
53   -
54   -// Inherited from DDAbstractLogger
55   -
56   -// - (id <DDLogFormatter>)logFormatter;
57   -// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;
58   -
59   -@end
Example/build/Debug-iphoneos/CocoaLumberjack/CocoaLumberjack.framework/Headers/DDAbstractDatabaseLogger.h deleted 100644 → 0
1   -// Software License Agreement (BSD License)
2   -//
3   -// Copyright (c) 2010-2019, Deusty, LLC
4   -// All rights reserved.
5   -//
6   -// Redistribution and use of this software in source and binary forms,
7   -// with or without modification, are permitted provided that the following conditions are met:
8   -//
9   -// * Redistributions of source code must retain the above copyright notice,
10   -// this list of conditions and the following disclaimer.
11   -//
12   -// * Neither the name of Deusty nor the names of its contributors may be used
13   -// to endorse or promote products derived from this software without specific
14   -// prior written permission of Deusty, LLC.
15   -
16   -// Disable legacy macros
17   -#ifndef DD_LEGACY_MACROS
18   - #define DD_LEGACY_MACROS 0
19   -#endif
20   -
21   -#import <CocoaLumberjack/DDLog.h>
22   -
23   -/**
24   - * This class provides an abstract implementation of a database logger.
25   - *
26   - * That is, it provides the base implementation for a database logger to build atop of.
27   - * All that is needed for a concrete database logger is to extend this class
28   - * and override the methods in the implementation file that are prefixed with "db_".
29   - **/
30   -@interface DDAbstractDatabaseLogger : DDAbstractLogger {
31   -
32   -@protected
33   - NSUInteger _saveThreshold;
34   - NSTimeInterval _saveInterval;
35   - NSTimeInterval _maxAge;
36   - NSTimeInterval _deleteInterval;
37   - BOOL _deleteOnEverySave;
38   -
39   - BOOL _saveTimerSuspended;
40   - NSUInteger _unsavedCount;
41   - dispatch_time_t _unsavedTime;
42   - dispatch_source_t _saveTimer;
43   - dispatch_time_t _lastDeleteTime;
44   - dispatch_source_t _deleteTimer;
45   -}
46   -
47   -/**
48   - * Specifies how often to save the data to disk.
49   - * Since saving is an expensive operation (disk io) it is not done after every log statement.
50   - * These properties allow you to configure how/when the logger saves to disk.
51   - *
52   - * A save is done when either (whichever happens first):
53   - *
54   - * - The number of unsaved log entries reaches saveThreshold
55   - * - The amount of time since the oldest unsaved log entry was created reaches saveInterval
56   - *
57   - * You can optionally disable the saveThreshold by setting it to zero.
58   - * If you disable the saveThreshold you are entirely dependent on the saveInterval.
59   - *
60   - * You can optionally disable the saveInterval by setting it to zero (or a negative value).
61   - * If you disable the saveInterval you are entirely dependent on the saveThreshold.
62   - *
63   - * It's not wise to disable both saveThreshold and saveInterval.
64   - *
65   - * The default saveThreshold is 500.
66   - * The default saveInterval is 60 seconds.
67   - **/
68   -@property (assign, readwrite) NSUInteger saveThreshold;
69   -
70   -/**
71   - * See the description for the `saveThreshold` property
72   - */
73   -@property (assign, readwrite) NSTimeInterval saveInterval;
74   -
75   -/**
76   - * It is likely you don't want the log entries to persist forever.
77   - * Doing so would allow the database to grow infinitely large over time.
78   - *
79   - * The maxAge property provides a way to specify how old a log statement can get
80   - * before it should get deleted from the database.
81   - *
82   - * The deleteInterval specifies how often to sweep for old log entries.
83   - * Since deleting is an expensive operation (disk io) is is done on a fixed interval.
84   - *
85   - * An alternative to the deleteInterval is the deleteOnEverySave option.
86   - * This specifies that old log entries should be deleted during every save operation.
87   - *
88   - * You can optionally disable the maxAge by setting it to zero (or a negative value).
89   - * If you disable the maxAge then old log statements are not deleted.
90   - *
91   - * You can optionally disable the deleteInterval by setting it to zero (or a negative value).
92   - *
93   - * If you disable both deleteInterval and deleteOnEverySave then old log statements are not deleted.
94   - *
95   - * It's not wise to enable both deleteInterval and deleteOnEverySave.
96   - *
97   - * The default maxAge is 7 days.
98   - * The default deleteInterval is 5 minutes.
99   - * The default deleteOnEverySave is NO.
100   - **/
101   -@property (assign, readwrite) NSTimeInterval maxAge;
102   -
103   -/**
104   - * See the description for the `maxAge` property
105   - */
106   -@property (assign, readwrite) NSTimeInterval deleteInterval;
107   -
108   -/**
109   - * See the description for the `maxAge` property
110   - */
111   -@property (assign, readwrite) BOOL deleteOnEverySave;
112   -
113   -/**
114   - * Forces a save of any pending log entries (flushes log entries to disk).
115   - **/
116   -- (void)savePendingLogEntries;
117   -
118   -/**
119   - * Removes any log entries that are older than maxAge.
120   - **/
121   -- (void)deleteOldLogEntries;
122   -
123   -@end
Example/build/Debug-iphoneos/CocoaLumberjack/CocoaLumberjack.framework/Headers/DDAssertMacros.h deleted 100644 → 0
1   -// Software License Agreement (BSD License)
2   -//
3   -// Copyright (c) 2010-2019, Deusty, LLC
4   -// All rights reserved.
5   -//
6   -// Redistribution and use of this software in source and binary forms,
7   -// with or without modification, are permitted provided that the following conditions are met:
8   -//
9   -// * Redistributions of source code must retain the above copyright notice,
10   -// this list of conditions and the following disclaimer.
11   -//
12   -// * Neither the name of Deusty nor the names of its contributors may be used
13   -// to endorse or promote products derived from this software without specific
14   -// prior written permission of Deusty, LLC.
15   -
16   -/**
17   - * NSAssert replacement that will output a log message even when assertions are disabled.
18   - **/
19   -#define DDAssert(condition, frmt, ...) \
20   - if (!(condition)) { \
21   - NSString *description = [NSString stringWithFormat:frmt, ## __VA_ARGS__]; \
22   - DDLogError(@"%@", description); \
23   - NSAssert(NO, @"%@", description); \
24   - }
25   -#define DDAssertCondition(condition) DDAssert(condition, @"Condition not satisfied: %s", #condition)
26   -
Example/build/Debug-iphoneos/CocoaLumberjack/CocoaLumberjack.framework/Headers/DDContextFilterLogFormatter.h deleted 100644 → 0
1   -// Software License Agreement (BSD License)
2   -//
3   -// Copyright (c) 2010-2019, Deusty, LLC
4   -// All rights reserved.
5   -//
6   -// Redistribution and use of this software in source and binary forms,
7   -// with or without modification, are permitted provided that the following conditions are met:
8   -//
9   -// * Redistributions of source code must retain the above copyright notice,
10   -// this list of conditions and the following disclaimer.
11   -//
12   -// * Neither the name of Deusty nor the names of its contributors may be used
13   -// to endorse or promote products derived from this software without specific
14   -// prior written permission of Deusty, LLC.
15   -
16   -#import <Foundation/Foundation.h>
17   -
18   -// Disable legacy macros
19   -#ifndef DD_LEGACY_MACROS
20   - #define DD_LEGACY_MACROS 0
21   -#endif
22   -
23   -#import <CocoaLumberjack/DDLog.h>
24   -
25   -/**
26   - * This class provides a log formatter that filters log statements from a logging context not on the whitelist.
27   - *
28   - * A log formatter can be added to any logger to format and/or filter its output.
29   - * You can learn more about log formatters here:
30   - * Documentation/CustomFormatters.md
31   - *
32   - * You can learn more about logging context's here:
33   - * Documentation/CustomContext.md
34   - *
35   - * But here's a quick overview / refresher:
36   - *
37   - * Every log statement has a logging context.
38   - * These come from the underlying logging macros defined in DDLog.h.
39   - * The default logging context is zero.
40   - * You can define multiple logging context's for use in your application.
41   - * For example, logically separate parts of your app each have a different logging context.
42   - * Also 3rd party frameworks that make use of Lumberjack generally use their own dedicated logging context.
43   - **/
44   -@interface DDContextWhitelistFilterLogFormatter : NSObject <DDLogFormatter>
45   -
46   -/**
47   - * Designated default initializer
48   - */
49   -- (instancetype)init NS_DESIGNATED_INITIALIZER;
50   -
51   -/**
52   - * Add a context to the whitelist
53   - *
54   - * @param loggingContext the context
55   - */
56   -- (void)addToWhitelist:(NSInteger)loggingContext;
57   -
58   -/**
59   - * Remove context from whitelist
60   - *
61   - * @param loggingContext the context
62   - */
63   -- (void)removeFromWhitelist:(NSInteger)loggingContext;
64   -
65   -/**
66   - * Return the whitelist
67   - */
68   -@property (readonly, copy) NSArray<NSNumber *> *whitelist;
69   -
70   -/**
71   - * Check if a context is on the whitelist
72   - *
73   - * @param loggingContext the context
74   - */
75   -- (BOOL)isOnWhitelist:(NSInteger)loggingContext;
76   -
77   -@end
78   -
79   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
80   -#pragma mark -
81   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
82   -
83   -/**
84   - * This class provides a log formatter that filters log statements from a logging context on the blacklist.
85   - **/
86   -@interface DDContextBlacklistFilterLogFormatter : NSObject <DDLogFormatter>
87   -
88   -- (instancetype)init NS_DESIGNATED_INITIALIZER;
89   -
90   -/**
91   - * Add a context to the blacklist
92   - *
93   - * @param loggingContext the context
94   - */
95   -- (void)addToBlacklist:(NSInteger)loggingContext;
96   -
97   -/**
98   - * Remove context from blacklist
99   - *
100   - * @param loggingContext the context
101   - */
102   -- (void)removeFromBlacklist:(NSInteger)loggingContext;
103   -
104   -/**
105   - * Return the blacklist
106   - */
107   -@property (readonly, copy) NSArray<NSNumber *> *blacklist;
108   -
109   -
110   -/**
111   - * Check if a context is on the blacklist
112   - *
113   - * @param loggingContext the context
114   - */
115   -- (BOOL)isOnBlacklist:(NSInteger)loggingContext;
116   -
117   -@end
Example/build/Debug-iphoneos/CocoaLumberjack/CocoaLumberjack.framework/Headers/DDDispatchQueueLogFormatter.h deleted 100644 → 0
1   -// Software License Agreement (BSD License)
2   -//
3   -// Copyright (c) 2010-2019, Deusty, LLC
4   -// All rights reserved.
5   -//
6   -// Redistribution and use of this software in source and binary forms,
7   -// with or without modification, are permitted provided that the following conditions are met:
8   -//
9   -// * Redistributions of source code must retain the above copyright notice,
10   -// this list of conditions and the following disclaimer.
11   -//
12   -// * Neither the name of Deusty nor the names of its contributors may be used
13   -// to endorse or promote products derived from this software without specific
14   -// prior written permission of Deusty, LLC.
15   -
16   -#import <Foundation/Foundation.h>
17   -
18   -// Disable legacy macros
19   -#ifndef DD_LEGACY_MACROS
20   - #define DD_LEGACY_MACROS 0
21   -#endif
22   -
23   -#import <CocoaLumberjack/DDLog.h>
24   -
25   -/**
26   - * Log formatter mode
27   - */
28   -typedef NS_ENUM(NSUInteger, DDDispatchQueueLogFormatterMode){
29   - /**
30   - * This is the default option, means the formatter can be reused between multiple loggers and therefore is thread-safe.
31   - * There is, of course, a performance cost for the thread-safety
32   - */
33   - DDDispatchQueueLogFormatterModeShareble = 0,
34   - /**
35   - * If the formatter will only be used by a single logger, then the thread-safety can be removed
36   - * @note: there is an assert checking if the formatter is added to multiple loggers and the mode is non-shareble
37   - */
38   - DDDispatchQueueLogFormatterModeNonShareble,
39   -};
40   -
41   -
42   -/**
43   - * This class provides a log formatter that prints the dispatch_queue label instead of the mach_thread_id.
44   - *
45   - * A log formatter can be added to any logger to format and/or filter its output.
46   - * You can learn more about log formatters here:
47   - * Documentation/CustomFormatters.md
48   - *
49   - * A typical `NSLog` (or `DDTTYLogger`) prints detailed info as `[<process_id>:<thread_id>]`.
50   - * For example:
51   - *
52   - * `2011-10-17 20:21:45.435 AppName[19928:5207] Your log message here`
53   - *
54   - * Where:
55   - * `- 19928 = process id`
56   - * `- 5207 = thread id (mach_thread_id printed in hex)`
57   - *
58   - * When using grand central dispatch (GCD), this information is less useful.
59   - * This is because a single serial dispatch queue may be run on any thread from an internally managed thread pool.
60   - * For example:
61   - *
62   - * `2011-10-17 20:32:31.111 AppName[19954:4d07] Message from my_serial_dispatch_queue`
63   - * `2011-10-17 20:32:31.112 AppName[19954:5207] Message from my_serial_dispatch_queue`
64   - * `2011-10-17 20:32:31.113 AppName[19954:2c55] Message from my_serial_dispatch_queue`
65   - *
66   - * This formatter allows you to replace the standard `[box:info]` with the dispatch_queue name.
67   - * For example:
68   - *
69   - * `2011-10-17 20:32:31.111 AppName[img-scaling] Message from my_serial_dispatch_queue`
70   - * `2011-10-17 20:32:31.112 AppName[img-scaling] Message from my_serial_dispatch_queue`
71   - * `2011-10-17 20:32:31.113 AppName[img-scaling] Message from my_serial_dispatch_queue`
72   - *
73   - * If the dispatch_queue doesn't have a set name, then it falls back to the thread name.
74   - * If the current thread doesn't have a set name, then it falls back to the mach_thread_id in hex (like normal).
75   - *
76   - * Note: If manually creating your own background threads (via `NSThread/alloc/init` or `NSThread/detachNeThread`),
77   - * you can use `[[NSThread currentThread] setName:(NSString *)]`.
78   - **/
79   -@interface DDDispatchQueueLogFormatter : NSObject <DDLogFormatter>
80   -
81   -/**
82   - * Standard init method.
83   - * Configure using properties as desired.
84   - **/
85   -- (instancetype)init NS_DESIGNATED_INITIALIZER;
86   -
87   -/**
88   - * Initializer with ability to set the queue mode
89   - *
90   - * @param mode choose between DDDispatchQueueLogFormatterModeShareble and DDDispatchQueueLogFormatterModeNonShareble, depending if the formatter is shared between several loggers or not
91   - */
92   -- (instancetype)initWithMode:(DDDispatchQueueLogFormatterMode)mode;
93   -
94   -/**
95   - * The minQueueLength restricts the minimum size of the [detail box].
96   - * If the minQueueLength is set to 0, there is no restriction.
97   - *
98   - * For example, say a dispatch_queue has a label of "diskIO":
99   - *
100   - * If the minQueueLength is 0: [diskIO]
101   - * If the minQueueLength is 4: [diskIO]
102   - * If the minQueueLength is 5: [diskIO]
103   - * If the minQueueLength is 6: [diskIO]
104   - * If the minQueueLength is 7: [diskIO ]
105   - * If the minQueueLength is 8: [diskIO ]
106   - *
107   - * The default minQueueLength is 0 (no minimum, so [detail box] won't be padded).
108   - *
109   - * If you want every [detail box] to have the exact same width,
110   - * set both minQueueLength and maxQueueLength to the same value.
111   - **/
112   -@property (assign, atomic) NSUInteger minQueueLength;
113   -
114   -/**
115   - * The maxQueueLength restricts the number of characters that will be inside the [detail box].
116   - * If the maxQueueLength is 0, there is no restriction.
117   - *
118   - * For example, say a dispatch_queue has a label of "diskIO":
119   - *
120   - * If the maxQueueLength is 0: [diskIO]
121   - * If the maxQueueLength is 4: [disk]
122   - * If the maxQueueLength is 5: [diskI]
123   - * If the maxQueueLength is 6: [diskIO]
124   - * If the maxQueueLength is 7: [diskIO]
125   - * If the maxQueueLength is 8: [diskIO]
126   - *
127   - * The default maxQueueLength is 0 (no maximum, so [detail box] won't be truncated).
128   - *
129   - * If you want every [detail box] to have the exact same width,
130   - * set both minQueueLength and maxQueueLength to the same value.
131   - **/
132   -@property (assign, atomic) NSUInteger maxQueueLength;
133   -
134   -/**
135   - * Sometimes queue labels have long names like "com.apple.main-queue",
136   - * but you'd prefer something shorter like simply "main".
137   - *
138   - * This method allows you to set such preferred replacements.
139   - * The above example is set by default.
140   - *
141   - * To remove/undo a previous replacement, invoke this method with nil for the 'shortLabel' parameter.
142   - **/
143   -- (NSString *)replacementStringForQueueLabel:(NSString *)longLabel;
144   -
145   -/**
146   - * See the `replacementStringForQueueLabel:` description
147   - */
148   -- (void)setReplacementString:(NSString *)shortLabel forQueueLabel:(NSString *)longLabel;
149   -
150   -@end
151   -
152   -/**
153   - * Category on `DDDispatchQueueLogFormatter` to make method declarations easier to extend/modify
154   - **/
155   -@interface DDDispatchQueueLogFormatter (OverridableMethods)
156   -
157   -/**
158   - * Date formatter default configuration
159   - */
160   -- (void)configureDateFormatter:(NSDateFormatter *)dateFormatter;
161   -
162   -/**
163   - * Formatter method to transfrom from date to string
164   - */
165   -- (NSString *)stringFromDate:(NSDate *)date;
166   -
167   -/**
168   - * Method to compute the queue thread label
169   - */
170   -- (NSString *)queueThreadLabelForLogMessage:(DDLogMessage *)logMessage;
171   -
172   -/**
173   - * The actual method that formats a message (transforms a `DDLogMessage` model into a printable string)
174   - */
175   -- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;
176   -
177   -@end
178   -
179   -#pragma mark - DDAtomicCounter
180   -
181   -@protocol DDAtomicCountable <NSObject>
182   -
183   -- (instancetype)initWithDefaultValue:(int32_t)defaultValue;
184   -- (int32_t)increment;
185   -- (int32_t)decrement;
186   -- (int32_t)value;
187   -
188   -@end
189   -
190   -@interface DDAtomicCounter: NSObject<DDAtomicCountable>
191   -@end
Example/build/Debug-iphoneos/CocoaLumberjack/CocoaLumberjack.framework/Headers/DDFileLogger+Buffering.h deleted 100644 → 0
1   -// Software License Agreement (BSD License)
2   -//
3   -// Copyright (c) 2010-2019, Deusty, LLC
4   -// All rights reserved.
5   -//
6   -// Redistribution and use of this software in source and binary forms,
7   -// with or without modification, are permitted provided that the following conditions are met:
8   -//
9   -// * Redistributions of source code must retain the above copyright notice,
10   -// this list of conditions and the following disclaimer.
11   -//
12   -// * Neither the name of Deusty nor the names of its contributors may be used
13   -// to endorse or promote products derived from this software without specific
14   -// prior written permission of Deusty, LLC.
15   -
16   -#import <CocoaLumberjack/DDFileLogger.h>
17   -
18   -NS_ASSUME_NONNULL_BEGIN
19   -
20   -@interface DDFileLogger (Buffering)
21   -
22   -- (instancetype)wrapWithBuffer;
23   -- (instancetype)unwrapFromBuffer;
24   -
25   -@end
26   -
27   -NS_ASSUME_NONNULL_END
Example/build/Debug-iphoneos/CocoaLumberjack/CocoaLumberjack.framework/Headers/DDFileLogger.h deleted 100644 → 0
1   -// Software License Agreement (BSD License)
2   -//
3   -// Copyright (c) 2010-2019, Deusty, LLC
4   -// All rights reserved.
5   -//
6   -// Redistribution and use of this software in source and binary forms,
7   -// with or without modification, are permitted provided that the following conditions are met:
8   -//
9   -// * Redistributions of source code must retain the above copyright notice,
10   -// this list of conditions and the following disclaimer.
11   -//
12   -// * Neither the name of Deusty nor the names of its contributors may be used
13   -// to endorse or promote products derived from this software without specific
14   -// prior written permission of Deusty, LLC.
15   -
16   -// Disable legacy macros
17   -#ifndef DD_LEGACY_MACROS
18   - #define DD_LEGACY_MACROS 0
19   -#endif
20   -
21   -#import <CocoaLumberjack/DDLog.h>
22   -
23   -NS_ASSUME_NONNULL_BEGIN
24   -
25   -@class DDLogFileInfo;
26   -
27   -/**
28   - * This class provides a logger to write log statements to a file.
29   - **/
30   -
31   -
32   -// Default configuration and safety/sanity values.
33   -//
34   -// maximumFileSize -> kDDDefaultLogMaxFileSize
35   -// rollingFrequency -> kDDDefaultLogRollingFrequency
36   -// maximumNumberOfLogFiles -> kDDDefaultLogMaxNumLogFiles
37   -// logFilesDiskQuota -> kDDDefaultLogFilesDiskQuota
38   -//
39   -// You should carefully consider the proper configuration values for your application.
40   -
41   -extern unsigned long long const kDDDefaultLogMaxFileSize;
42   -extern NSTimeInterval const kDDDefaultLogRollingFrequency;
43   -extern NSUInteger const kDDDefaultLogMaxNumLogFiles;
44   -extern unsigned long long const kDDDefaultLogFilesDiskQuota;
45   -
46   -
47   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
48   -#pragma mark -
49   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
50   -
51   -/**
52   - * The LogFileManager protocol is designed to allow you to control all aspects of your log files.
53   - *
54   - * The primary purpose of this is to allow you to do something with the log files after they have been rolled.
55   - * Perhaps you want to compress them to save disk space.
56   - * Perhaps you want to upload them to an FTP server.
57   - * Perhaps you want to run some analytics on the file.
58   - *
59   - * A default LogFileManager is, of course, provided.
60   - * The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.
61   - *
62   - * This protocol provides various methods to fetch the list of log files.
63   - *
64   - * There are two variants: sorted and unsorted.
65   - * If sorting is not necessary, the unsorted variant is obviously faster.
66   - * The sorted variant will return an array sorted by when the log files were created,
67   - * with the most recently created log file at index 0, and the oldest log file at the end of the array.
68   - *
69   - * You can fetch only the log file paths (full path including name), log file names (name only),
70   - * or an array of `DDLogFileInfo` objects.
71   - * The `DDLogFileInfo` class is documented below, and provides a handy wrapper that
72   - * gives you easy access to various file attributes such as the creation date or the file size.
73   - */
74   -@protocol DDLogFileManager <NSObject>
75   -@required
76   -
77   -// Public properties
78   -
79   -/**
80   - * The maximum number of archived log files to keep on disk.
81   - * For example, if this property is set to 3,
82   - * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.
83   - * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.
84   - *
85   - * You may optionally disable this option by setting it to zero.
86   - **/
87   -@property (readwrite, assign, atomic) NSUInteger maximumNumberOfLogFiles;
88   -
89   -/**
90   - * The maximum space that logs can take. On rolling logfile all old log files that exceed logFilesDiskQuota will
91   - * be deleted.
92   - *
93   - * You may optionally disable this option by setting it to zero.
94   - **/
95   -@property (readwrite, assign, atomic) unsigned long long logFilesDiskQuota;
96   -
97   -// Public methods
98   -
99   -/**
100   - * Returns the logs directory (path)
101   - */
102   -@property (nonatomic, readonly, copy) NSString *logsDirectory;
103   -
104   -/**
105   - * Returns an array of `NSString` objects,
106   - * each of which is the filePath to an existing log file on disk.
107   - **/
108   -@property (nonatomic, readonly, strong) NSArray<NSString *> *unsortedLogFilePaths;
109   -
110   -/**
111   - * Returns an array of `NSString` objects,
112   - * each of which is the fileName of an existing log file on disk.
113   - **/
114   -@property (nonatomic, readonly, strong) NSArray<NSString *> *unsortedLogFileNames;
115   -
116   -/**
117   - * Returns an array of `DDLogFileInfo` objects,
118   - * each representing an existing log file on disk,
119   - * and containing important information about the log file such as it's modification date and size.
120   - **/
121   -@property (nonatomic, readonly, strong) NSArray<DDLogFileInfo *> *unsortedLogFileInfos;
122   -
123   -/**
124   - * Just like the `unsortedLogFilePaths` method, but sorts the array.
125   - * The items in the array are sorted by creation date.
126   - * The first item in the array will be the most recently created log file.
127   - **/
128   -@property (nonatomic, readonly, strong) NSArray<NSString *> *sortedLogFilePaths;
129   -
130   -/**
131   - * Just like the `unsortedLogFileNames` method, but sorts the array.
132   - * The items in the array are sorted by creation date.
133   - * The first item in the array will be the most recently created log file.
134   - **/
135   -@property (nonatomic, readonly, strong) NSArray<NSString *> *sortedLogFileNames;
136   -
137   -/**
138   - * Just like the `unsortedLogFileInfos` method, but sorts the array.
139   - * The items in the array are sorted by creation date.
140   - * The first item in the array will be the most recently created log file.
141   - **/
142   -@property (nonatomic, readonly, strong) NSArray<DDLogFileInfo *> *sortedLogFileInfos;
143   -
144   -// Private methods (only to be used by DDFileLogger)
145   -
146   -/**
147   - * Generates a new unique log file path, and creates the corresponding log file.
148   - * This method is executed directly on the file logger's internal queue.
149   - * The file has to exist by the time the method returns.
150   - **/
151   -- (NSString *)createNewLogFile;
152   -
153   -@optional
154   -
155   -// Notifications from DDFileLogger
156   -
157   -/**
158   - * Called when a log file was archived. Executed on global queue with default priority.
159   - */
160   -- (void)didArchiveLogFile:(NSString *)logFilePath NS_SWIFT_NAME(didArchiveLogFile(atPath:));
161   -
162   -/**
163   - * Called when the roll action was executed and the log was archived.
164   - * Executed on global queue with default priority.
165   - */
166   -- (void)didRollAndArchiveLogFile:(NSString *)logFilePath NS_SWIFT_NAME(didRollAndArchiveLogFile(atPath:));
167   -
168   -@end
169   -
170   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
171   -#pragma mark -
172   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
173   -
174   -/**
175   - * Default log file manager.
176   - *
177   - * All log files are placed inside the logsDirectory.
178   - * If a specific logsDirectory isn't specified, the default directory is used.
179   - * On Mac, this is in `~/Library/Logs/<Application Name>`.
180   - * On iPhone, this is in `~/Library/Caches/Logs`.
181   - *
182   - * Log files are named `"<bundle identifier> <date> <time>.log"`
183   - * Example: `com.organization.myapp 2013-12-03 17-14.log`
184   - *
185   - * Archived log files are automatically deleted according to the `maximumNumberOfLogFiles` property.
186   - **/
187   -@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>
188   -
189   -/**
190   - * Default initializer
191   - */
192   -- (instancetype)init;
193   -
194   -/**
195   - * If logDirectory is not specified, then a folder called "Logs" is created in the app's cache directory.
196   - * While running on the simulator, the "Logs" folder is located in the library temporary directory.
197   - */
198   -- (instancetype)initWithLogsDirectory:(NSString * __nullable)logsDirectory NS_DESIGNATED_INITIALIZER;
199   -
200   -#if TARGET_OS_IPHONE
201   -/*
202   - * Calling this constructor you can override the default "automagically" chosen NSFileProtection level.
203   - * Useful if you are writing a command line utility / CydiaSubstrate addon for iOS that has no NSBundle
204   - * or like SpringBoard no BackgroundModes key in the NSBundle:
205   - * iPhone:~ root# cycript -p SpringBoard
206   - * cy# [NSBundle mainBundle]
207   - * #"NSBundle </System/Library/CoreServices/SpringBoard.app> (loaded)"
208   - * cy# [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIBackgroundModes"];
209   - * null
210   - * cy#
211   - **/
212   -- (instancetype)initWithLogsDirectory:(NSString * __nullable)logsDirectory
213   - defaultFileProtectionLevel:(NSFileProtectionType)fileProtectionLevel;
214   -#endif
215   -
216   -/*
217   - * Methods to override.
218   - *
219   - * Log files are named `"<bundle identifier> <date> <time>.log"`
220   - * Example: `com.organization.myapp 2013-12-03 17-14.log`
221   - *
222   - * If you wish to change default filename, you can override following two methods.
223   - * - `newLogFileName` method would be called on new logfile creation.
224   - * - `isLogFile:` method would be called to filter log files from all other files in logsDirectory.
225   - * You have to parse given filename and return YES if it is logFile.
226   - *
227   - * **NOTE**
228   - * `newLogFileName` returns filename. If appropriate file already exists, number would be added
229   - * to filename before extension. You have to handle this case in isLogFile: method.
230   - *
231   - * Example:
232   - * - newLogFileName returns `"com.organization.myapp 2013-12-03.log"`,
233   - * file `"com.organization.myapp 2013-12-03.log"` would be created.
234   - * - after some time `"com.organization.myapp 2013-12-03.log"` is archived
235   - * - newLogFileName again returns `"com.organization.myapp 2013-12-03.log"`,
236   - * file `"com.organization.myapp 2013-12-03 2.log"` would be created.
237   - * - after some time `"com.organization.myapp 2013-12-03 1.log"` is archived
238   - * - newLogFileName again returns `"com.organization.myapp 2013-12-03.log"`,
239   - * file `"com.organization.myapp 2013-12-03 3.log"` would be created.
240   - **/
241   -
242   -/**
243   - * Generates log file name with default format `"<bundle identifier> <date> <time>.log"`
244   - * Example: `MobileSafari 2013-12-03 17-14.log`
245   - *
246   - * You can change it by overriding `newLogFileName` and `isLogFile:` methods.
247   - **/
248   -@property (readonly, copy) NSString *newLogFileName;
249   -
250   -/**
251   - * Default log file name is `"<bundle identifier> <date> <time>.log"`.
252   - * Example: `MobileSafari 2013-12-03 17-14.log`
253   - *
254   - * You can change it by overriding `newLogFileName` and `isLogFile:` methods.
255   - **/
256   -- (BOOL)isLogFile:(NSString *)fileName NS_SWIFT_NAME(isLogFile(withName:));
257   -
258   -/**
259   - * New log files are created empty by default in `createNewLogFile:` method
260   - *
261   - * If you wish to specify a common file header to use in your log files,
262   - * you can set the initial log file contents by overriding `logFileHeader`
263   - **/
264   -@property (readonly, copy, nullable) NSString *logFileHeader;
265   -
266   -/* Inherited from DDLogFileManager protocol:
267   -
268   - @property (readwrite, assign, atomic) NSUInteger maximumNumberOfLogFiles;
269   - @property (readwrite, assign, atomic) NSUInteger logFilesDiskQuota;
270   -
271   - - (NSString *)logsDirectory;
272   -
273   - - (NSArray *)unsortedLogFilePaths;
274   - - (NSArray *)unsortedLogFileNames;
275   - - (NSArray *)unsortedLogFileInfos;
276   -
277   - - (NSArray *)sortedLogFilePaths;
278   - - (NSArray *)sortedLogFileNames;
279   - - (NSArray *)sortedLogFileInfos;
280   -
281   - */
282   -
283   -@end
284   -
285   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
286   -#pragma mark -
287   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
288   -
289   -/**
290   - * Most users will want file log messages to be prepended with the date and time.
291   - * Rather than forcing the majority of users to write their own formatter,
292   - * we will supply a logical default formatter.
293   - * Users can easily replace this formatter with their own by invoking the `setLogFormatter:` method.
294   - * It can also be removed by calling `setLogFormatter:`, and passing a nil parameter.
295   - *
296   - * In addition to the convenience of having a logical default formatter,
297   - * it will also provide a template that makes it easy for developers to copy and change.
298   - **/
299   -@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>
300   -
301   -/**
302   - * Default initializer
303   - */
304   -- (instancetype)init;
305   -
306   -/**
307   - * Designated initializer, requires a date formatter
308   - */
309   -- (instancetype)initWithDateFormatter:(NSDateFormatter * __nullable)dateFormatter NS_DESIGNATED_INITIALIZER;
310   -
311   -@end
312   -
313   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
314   -#pragma mark -
315   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
316   -
317   -/**
318   - * The standard implementation for a file logger
319   - */
320   -@interface DDFileLogger : DDAbstractLogger <DDLogger>
321   -
322   -/**
323   - * Default initializer.
324   - */
325   -- (instancetype)init;
326   -
327   -/**
328   - * Designated initializer, requires a `DDLogFileManager` instance.
329   - * A global queue w/ default priority is used to run callbacks.
330   - * If needed, specify queue using `initWithLogFileManager:completionQueue:`.
331   - */
332   -- (instancetype)initWithLogFileManager:(id <DDLogFileManager> __nullable)logFileManager;
333   -
334   -/**
335   - * Designated initializer, requires a `DDLogFileManager` instance.
336   - * The completionQueue is used to execute `didArchiveLogFile`, `didRollAndArchiveLogFile`,
337   - * and the callback in `rollLog`. If nil, a global queue w/ default priority is used.
338   - */
339   -- (instancetype)initWithLogFileManager:(id <DDLogFileManager> __nullable)logFileManager
340   - completionQueue:(dispatch_queue_t __nullable)dispatchQueue NS_DESIGNATED_INITIALIZER;
341   -
342   -/**
343   - * Called when the logger is about to write message. Call super before your implementation.
344   - */
345   -- (void)willLogMessage NS_REQUIRES_SUPER;
346   -
347   -/**
348   - * Called when the logger wrote message. Call super after your implementation.
349   - */
350   -- (void)didLogMessage NS_REQUIRES_SUPER;
351   -
352   -/**
353   - * Writes all in-memory log data to the permanent storage. Call super before your implementation.
354   - * Don't call this method directly, instead use the `[DDLog flushLog]` to ensure all log messages are included in flush.
355   - */
356   -- (void)flush NS_REQUIRES_SUPER;
357   -
358   -/**
359   - * Called when the logger checks archive or not current log file.
360   - * Override this method to extend standard behavior. By default returns NO.
361   - * This is executed directly on the logger's internal queue, so keep processing light!
362   - */
363   -- (BOOL)shouldArchiveRecentLogFileInfo:(DDLogFileInfo *)recentLogFileInfo;
364   -
365   -/**
366   - * Log File Rolling:
367   - *
368   - * `maximumFileSize`:
369   - * The approximate maximum size (in bytes) to allow log files to grow.
370   - * If a log file is larger than this value after a log statement is appended,
371   - * then the log file is rolled.
372   - *
373   - * `rollingFrequency`
374   - * How often to roll the log file.
375   - * The frequency is given as an `NSTimeInterval`, which is a double that specifies the interval in seconds.
376   - * Once the log file gets to be this old, it is rolled.
377   - *
378   - * `doNotReuseLogFiles`
379   - * When set, will always create a new log file at application launch.
380   - *
381   - * Both the `maximumFileSize` and the `rollingFrequency` are used to manage rolling.
382   - * Whichever occurs first will cause the log file to be rolled.
383   - *
384   - * For example:
385   - * The `rollingFrequency` is 24 hours,
386   - * but the log file surpasses the `maximumFileSize` after only 20 hours.
387   - * The log file will be rolled at that 20 hour mark.
388   - * A new log file will be created, and the 24 hour timer will be restarted.
389   - *
390   - * You may optionally disable rolling due to filesize by setting `maximumFileSize` to zero.
391   - * If you do so, rolling is based solely on `rollingFrequency`.
392   - *
393   - * You may optionally disable rolling due to time by setting `rollingFrequency` to zero (or any non-positive number).
394   - * If you do so, rolling is based solely on `maximumFileSize`.
395   - *
396   - * If you disable both `maximumFileSize` and `rollingFrequency`, then the log file won't ever be rolled.
397   - * This is strongly discouraged.
398   - **/
399   -@property (readwrite, assign) unsigned long long maximumFileSize;
400   -
401   -/**
402   - * See description for `maximumFileSize`
403   - */
404   -@property (readwrite, assign) NSTimeInterval rollingFrequency;
405   -
406   -/**
407   - * See description for `maximumFileSize`
408   - */
409   -@property (readwrite, assign, atomic) BOOL doNotReuseLogFiles;
410   -
411   -/**
412   - * The DDLogFileManager instance can be used to retrieve the list of log files,
413   - * and configure the maximum number of archived log files to keep.
414   - *
415   - * @see DDLogFileManager.maximumNumberOfLogFiles
416   - **/
417   -@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;
418   -
419   -/**
420   - * When using a custom formatter you can set the `logMessage` method not to append
421   - * `\n` character after each output. This allows for some greater flexibility with
422   - * custom formatters. Default value is YES.
423   - **/
424   -@property (nonatomic, readwrite, assign) BOOL automaticallyAppendNewlineForCustomFormatters;
425   -
426   -/**
427   - * You can optionally force the current log file to be rolled with this method.
428   - * CompletionBlock will be called on main queue.
429   - */
430   -- (void)rollLogFileWithCompletionBlock:(void (^ __nullable)(void))completionBlock
431   - NS_SWIFT_NAME(rollLogFile(withCompletion:));
432   -
433   -/**
434   - * Method is deprecated.
435   - * @deprecated Use `rollLogFileWithCompletionBlock:` method instead.
436   - */
437   -- (void)rollLogFile __attribute((deprecated));
438   -
439   -// Inherited from DDAbstractLogger
440   -
441   -// - (id <DDLogFormatter>)logFormatter;
442   -// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;
443   -
444   -/**
445   - * Returns the log file that should be used.
446   - * If there is an existing log file that is suitable,
447   - * within the constraints of `maximumFileSize` and `rollingFrequency`, then it is returned.
448   - *
449   - * Otherwise a new file is created and returned.
450   - **/
451   -@property (nonatomic, readonly, strong) DDLogFileInfo *currentLogFileInfo;
452   -
453   -@end
454   -
455   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
456   -#pragma mark -
457   -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
458   -
459   -/**
460   - * `DDLogFileInfo` is a simple class that provides access to various file attributes.
461   - * It provides good performance as it only fetches the information if requested,
462   - * and it caches the information to prevent duplicate fetches.
463   - *
464   - * It was designed to provide quick snapshots of the current state of log files,
465   - * and to help sort log files in an array.
466   - *
467   - * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.
468   - * This is not what the class was designed for.
469   - *
470   - * If you absolutely must get updated values,
471   - * you can invoke the reset method which will clear the cache.
472   - **/
473   -@interface DDLogFileInfo : NSObject
474   -
475   -@property (strong, nonatomic, readonly) NSString *filePath;
476   -@property (strong, nonatomic, readonly) NSString *fileName;
477   -
478   -#if FOUNDATION_SWIFT_SDK_EPOCH_AT_LEAST(8)
479   -@property (strong, nonatomic, readonly) NSDictionary<NSFileAttributeKey, id> *fileAttributes;
480   -#else
481   -@property (strong, nonatomic, readonly) NSDictionary<NSString *, id> *fileAttributes;
482   -#endif
483   -
484   -@property (strong, nonatomic, readonly) NSDate *creationDate;
485   -@property (strong, nonatomic, readonly) NSDate *modificationDate;
486   -
487   -@property (nonatomic, readonly) unsigned long long fileSize;
488   -
489   -@property (nonatomic, readonly) NSTimeInterval age;
490   -
491   -@property (nonatomic, readwrite) BOOL isArchived;
492   -
493   -+ (instancetype)logFileWithPath:(NSString *)filePath NS_SWIFT_UNAVAILABLE("Use init(filePath:)");
494   -
495   -- (instancetype)init NS_UNAVAILABLE;
496   -- (instancetype)initWithFilePath:(NSString *)filePath NS_DESIGNATED_INITIALIZER;
497   -
498   -- (void)reset;
499   -- (void)renameFile:(NSString *)newFileName NS_SWIFT_NAME(renameFile(to:));
500   -
501   -#if TARGET_IPHONE_SIMULATOR
502   -
503   -// So here's the situation.
504   -// Extended attributes are perfect for what we're trying to do here (marking files as archived).
505   -// This is exactly what extended attributes were designed for.
506   -//
507   -// But Apple screws us over on the simulator.
508   -// Everytime you build-and-go, they copy the application into a new folder on the hard drive,
509   -// and as part of the process they strip extended attributes from our log files.
510   -// Normally, a copy of a file preserves extended attributes.
511   -// So obviously Apple has gone to great lengths to piss us off.
512   -//
513   -// Thus we use a slightly different tactic for marking log files as archived in the simulator.
514   -// That way it "just works" and there's no confusion when testing.
515   -//
516   -// The difference in method names is indicative of the difference in functionality.
517   -// On the simulator we add an attribute by appending a filename extension.
518   -//
519   -// For example:
520   -// "mylog.txt" -> "mylog.archived.txt"
521   -// "mylog" -> "mylog.archived"
522   -
523   -- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;
524   -
525   -- (void)addExtensionAttributeWithName:(NSString *)attrName;
526   -- (void)removeExtensionAttributeWithName:(NSString *)attrName;
527   -
528   -#else /* if TARGET_IPHONE_SIMULATOR */
529   -
530   -// Normal use of extended attributes used everywhere else,
531   -// such as on Macs and on iPhone devices.
532   -
533   -- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;
534   -
535   -- (void)addExtendedAttributeWithName:(NSString *)attrName;
536   -- (void)removeExtendedAttributeWithName:(NSString *)attrName;
537   -
538   -#endif /* if TARGET_IPHONE_SIMULATOR */
539   -
540   -- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;
541   -- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;
542   -
543   -@end
544   -
545   -NS_ASSUME_NONNULL_END
Example/build/Debug-iphoneos/CocoaLumberjack/CocoaLumberjack.framework/Headers/DDLegacyMacros.h deleted 100644 → 0
1   -// Software License Agreement (BSD License)
2   -//
3   -// Copyright (c) 2010-2019, Deusty, LLC
4   -// All rights reserved.
5   -//
6   -// Redistribution and use of this software in source and binary forms,
7   -// with or without modification, are permitted provided that the following conditions are met:
8   -//
9   -// * Redistributions of source code must retain the above copyright notice,
10   -// this list of conditions and the following disclaimer.
11   -//
12   -// * Neither the name of Deusty nor the names of its contributors may be used
13   -// to endorse or promote products derived from this software without specific
14   -// prior written permission of Deusty, LLC.
15   -
16   -/**
17   - * Legacy macros used for 1.9.x backwards compatibility.
18   - *
19   - * Imported by default when importing a DDLog.h directly and DD_LEGACY_MACROS is not defined and set to 0.
20   - **/
21   -#if DD_LEGACY_MACROS
22   -
23   -#warning CocoaLumberjack 1.9.x legacy macros enabled. \
24   -Disable legacy macros by importing CocoaLumberjack.h or DDLogMacros.h instead of DDLog.h or add `#define DD_LEGACY_MACROS 0` before importing DDLog.h.
25   -
26   -#ifndef LOG_LEVEL_DEF
27   - #define LOG_LEVEL_DEF ddLogLevel
28   -#endif
29   -
30   -#define LOG_FLAG_ERROR DDLogFlagError
31   -#define LOG_FLAG_WARN DDLogFlagWarning
32   -#define LOG_FLAG_INFO DDLogFlagInfo
33   -#define LOG_FLAG_DEBUG DDLogFlagDebug
34   -#define LOG_FLAG_VERBOSE DDLogFlagVerbose
35   -
36   -#define LOG_LEVEL_OFF DDLogLevelOff
37   -#define LOG_LEVEL_ERROR DDLogLevelError
38   -#define LOG_LEVEL_WARN DDLogLevelWarning
39   -#define LOG_LEVEL_INFO DDLogLevelInfo
40   -#define LOG_LEVEL_DEBUG DDLogLevelDebug
41   -#define LOG_LEVEL_VERBOSE DDLogLevelVerbose
42   -#define LOG_LEVEL_ALL DDLogLevelAll
43   -
44   -#define LOG_ASYNC_ENABLED YES
45   -
46   -#define LOG_ASYNC_ERROR ( NO && LOG_ASYNC_ENABLED)
47   -#define LOG_ASYNC_WARN (YES && LOG_ASYNC_ENABLED)
48   -#define LOG_ASYNC_INFO (YES && LOG_ASYNC_ENABLED)
49   -#define LOG_ASYNC_DEBUG (YES && LOG_ASYNC_ENABLED)
50   -#define LOG_ASYNC_VERBOSE (YES && LOG_ASYNC_ENABLED)
51   -
52   -#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \
53   - [DDLog log : isAsynchronous \
54   - level : lvl \
55   - flag : flg \
56   - context : ctx \
57   - file : __FILE__ \
58   - function : fnct \
59   - line : __LINE__ \
60   - tag : atag \
61   - format : (frmt), ## __VA_ARGS__]
62   -
63   -#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \
64   - do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)
65   -
66   -#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \
67   - LOG_MAYBE(async, lvl, flg, ctx, __PRETTY_FUNCTION__, frmt, ## __VA_ARGS__)
68   -
69   -#define DDLogError(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_ERROR, LOG_LEVEL_DEF, LOG_FLAG_ERROR, 0, frmt, ##__VA_ARGS__)
70   -#define DDLogWarn(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_WARN, LOG_LEVEL_DEF, LOG_FLAG_WARN, 0, frmt, ##__VA_ARGS__)
71   -#define DDLogInfo(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_INFO, LOG_LEVEL_DEF, LOG_FLAG_INFO, 0, frmt, ##__VA_ARGS__)
72   -#define DDLogDebug(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG, LOG_LEVEL_DEF, LOG_FLAG_DEBUG, 0, frmt, ##__VA_ARGS__)
73   -#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)
74   -
75   -#endif