lipengwei
2020-05-06 d8c7af0ebe241beb9270ba597a8d2dd9ca3275e9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//
//  MQTTPersistence.h
//  MQTTClient
//
//  Created by Christoph Krey on 22.03.15.
//  Copyright © 2015-2016 Christoph Krey. All rights reserved.
//
 
#import <Foundation/Foundation.h>
#import "MQTTMessage.h"
 
static BOOL const MQTT_PERSISTENT = NO;
static NSInteger const MQTT_MAX_SIZE = 64 * 1024 * 1024;
static NSInteger const MQTT_MAX_WINDOW_SIZE = 16;
static NSInteger const MQTT_MAX_MESSAGES = 1024;
 
/** MQTTFlow is an abstraction of the entity to be stored for persistence */
 
@protocol MQTTFlow
/** The clientID of the flow element */
@property (strong, nonatomic) NSString *clientId;
 
/** The flag indicating incoming or outgoing flow element */
@property (strong, nonatomic) NSNumber *incomingFlag;
 
/** The flag indicating if the flow element is retained*/
@property (strong, nonatomic) NSNumber *retainedFlag;
 
/** The MQTTCommandType of the flow element, might be MQTT_None for offline queueing */
@property (strong, nonatomic) NSNumber *commandType;
 
/** The MQTTQosLevel of the flow element */
@property (strong, nonatomic) NSNumber *qosLevel;
 
/** The messageId of the flow element */
@property (strong, nonatomic) NSNumber *messageId;
 
/** The topic of the flow element */
@property (strong, nonatomic) NSString *topic;
 
/** The data of the flow element */
@property (strong, nonatomic) NSData *data;
 
/** The deadline of the flow elelment before (re)trying transmission */
@property (strong, nonatomic) NSDate *deadline;
 
@end
 
/** The MQTTPersistence protocol is an abstraction of persistence classes for MQTTSession */
 
@protocol MQTTPersistence
 
/** The maximum Window Size for outgoing inflight messages per clientID. Defaults to 16 */
@property (nonatomic) NSUInteger maxWindowSize;
 
/** The maximum number of messages kept per clientID and direction. Defaults to 1024 */
@property (nonatomic) NSUInteger maxMessages;
 
/** Indicates if the persistence implementation should make the information permannent. Defaults to NO */
@property (nonatomic) BOOL persistent;
 
/** The maximum size of the storage used for persistence in total in bytes. Defaults to 1024*1024 bytes */
@property (nonatomic) NSUInteger maxSize;
 
/** The current Window Size for outgoing inflight messages per clientID.
 * @param clientId
 * @return the current size of the outgoing inflight window
 */
- (NSUInteger)windowSize:(NSString *)clientId;
 
/** Stores one new message
 * @param clientId
 * @param topic
 * @param data
 * @param retainFlag
 * @param qos
 * @param msgId
 * @param incomingFlag
 * @param commandType
 * @param deadline
 * @return the created MQTTFlow element or nil if the maxWindowSize has been exceeded
 */
- (id<MQTTFlow>)storeMessageForClientId:(NSString *)clientId
                                  topic:(NSString *)topic
                                   data:(NSData *)data
                             retainFlag:(BOOL)retainFlag
                                    qos:(MQTTQosLevel)qos
                                  msgId:(UInt16)msgId
                           incomingFlag:(BOOL)incomingFlag
                            commandType:(UInt8)commandType
                               deadline:(NSDate *)deadline;
 
/** Deletes an MQTTFlow element
 * @param flow
 */
- (void)deleteFlow:(id<MQTTFlow>)flow;
 
/** Deletes all MQTTFlow elements of a clientId
 * @param clientId
 */
- (void)deleteAllFlowsForClientId:(NSString *)clientId;
 
/** Retrieves all MQTTFlow elements of a clientId and direction
 * @param clientId
 * @param incomingFlag
 * @return an NSArray of the retrieved MQTTFlow elements
 */
- (NSArray *)allFlowsforClientId:(NSString *)clientId
                    incomingFlag:(BOOL)incomingFlag;
 
/** Retrieves an MQTTFlow element
 * @param clientId
 * @param incomingFlag
 * @param messageId
 * @return the retrieved MQTTFlow element or nil if the elememt was not found
 */
- (id<MQTTFlow>)flowforClientId:(NSString *)clientId
                   incomingFlag:(BOOL)incomingFlag
                      messageId:(UInt16)messageId;
 
/** sync is called to allow the MQTTPersistence implemetation to save data permanently */
- (void)sync;
 
@end