RTKPackageCommunication.h 3.81 KB
//
//  RTKPackageCommunication.h
//  RTKLEFoundation
//
//  Created by jerome_gu on 2019/1/10.
//  Copyright © 2019 Realtek. All rights reserved.
//

#import <Foundation/Foundation.h>

#ifdef RTK_SDK_IS_STATIC_LIBRARY
#import "RTKLEGeneralDefines.h"
#import "RTKAttemptAction.h"
#else
#import <RTKLEFoundation/RTKLEGeneralDefines.h>
#import <RTKLEFoundation/RTKAttemptAction.h>
#endif


NS_ASSUME_NONNULL_BEGIN

/**
 *
 */
typedef void (^RTKCommunicationSendResult)(BOOL success, NSError *_Nullable error, NSData*_Nullable supply);

/**
 *
 */
typedef void (^RTKCommunicationRequestResult)(BOOL success, NSError *_Nullable err, NSData*_Nullable data);

typedef NS_ENUM(NSUInteger, RTKPackageCommunicationStatus) {
    RTKPackageCommunicationStatusNotOpen,
    RTKPackageCommunicationStatusOpening,
    RTKPackageCommunicationStatusOpen,
    RTKPackageCommunicationStatusClosing,
    RTKPackageCommunicationStatusClosed,
    RTKPackageCommunicationStatusErrorOccurred,   /* can not reopen*/
};


@class RTKPackageCommunication;

/**
 * 一组方法来接收Communication处理的状态变化和接收数据
 */
@protocol RTKPackageCommunicationClient <NSObject>

- (void)communicationDidChangeState:(RTKPackageCommunication *)communication;
- (void)communication:(RTKPackageCommunication *)transmission didReceive:(NSData *)data;

@end


/**
 * 通信的交互处理
 * @discussion 抽象类,实际的通信处理通过创建子类来完成
 */
@interface RTKPackageCommunication : NSObject <RTKPackageCommunicationClient> {
    @protected
    RTKPackageCommunicationStatus _state;
}

@property (readonly, nullable) RTKPackageCommunication *underlyingCommunication;
@property (readonly) RTKPackageCommunicationStatus state;


- (instancetype)initWithUnderlyingCommunication:(RTKPackageCommunication *)communication;

/**
 * 管理Communication对象的上层客户
 */
@property (readonly) NSArray <RTKPackageCommunicationClient> *upperCommunications;
- (void)addUpperCommunication:(id<RTKPackageCommunicationClient>)communication;
- (void)removeUpperCommunication:(id<RTKPackageCommunicationClient>)communication;


/**
 * 打开Communication
 * @discussion 获取系统相关资源
 */
- (void)open;


- (void)openWithCompletion:(RTKLECompletionBlock)handler;


/**
 * 关闭Communication
 * @discussion 释放系统相关资源
 */
- (void)close;


/**
 * 发送数据
 * @param handler 发送完成时的回调Block
 * @discussion 数据发送后,在handler中得到发送结果。成功发送到对端时,handler第一个参数为YES; 无法发送或未能确认超时失败,则handler第一个参数为NO. 发送结果的确定跟具体实现有关,handler不一定被调用。
 */
- (void)send:(NSData *)data completionHandler:(RTKCommunicationSendResult)handler;


// will not invoke the -send: completion handler.
- (void)cancelSendingOfData:(NSData *)data;

@end


/**
 * 表示带ACK确认的通信机制
 */
@interface RTKPackageACKCommunication : RTKPackageCommunication
@property (readonly) NSMutableArray <RTKAttemptAction*> *pendingSends;

// protected
- (nullable RTKAttemptAction *)pendingSendOfID:(NSInteger)ID;
- (nullable RTKAttemptAction *)pendingSendOfID:(NSInteger)ID subID:(NSInteger)subID;
- (void)ackPendingSends:(RTKLEACKPackage *)ackPackage;

@end


/**
 * Request形式的通信
 */
@interface RTKRequestCommunication : RTKPackageCommunication

@property (readonly) NSMutableArray <RTKAttemptAction*> *pendingRequests;

- (void)sendRequest:(NSData *)data completionHandler:(RTKCommunicationRequestResult)handler;

- (void)sendRequest:(NSData *)data waitInterval:(NSTimeInterval)interval retryCount:(NSUInteger)count completionHandler:(RTKCommunicationRequestResult)handler;

// protected
- (nullable RTKAttemptAction *)pendingRequestOfID:(NSInteger)ID subID:(NSInteger)subID;

- (BOOL)canResponsePendingRequests:(RTKLEPackage *)package;

@end

NS_ASSUME_NONNULL_END