ObjFW  Diff

Differences From Artifact [85b360a246]:

To Artifact [714bdc609e]:


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
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







-
-
+
+










-
-
+
+








-
+



-
-
+
+

-
+



-
-
+
+

-
+




-
-
+
+








@class OFStream;
@class OFMutableArray;
@class OFMutableDictionary;
@class OFDataArray;
@class OFMutex;

/**
 * \brief A protocol that needs to be implemented by delegates for
/*!
 * @brief A protocol that needs to be implemented by delegates for
 *	  OFStreamObserver.
 */
#ifndef OF_STREAM_OBSERVER_M
@protocol OFStreamObserverDelegate <OFObject>
#else
@protocol OFStreamObserverDelegate
#endif
#ifdef OF_HAVE_OPTIONAL_PROTOCOLS
@optional
#endif
/**
 * \brief This callback is called when a stream did get ready for reading.
/*!
 * @brief This callback is called when a stream did get ready for reading.
 *
 * NOTE: When -[tryReadLine] or -[tryReadTillDelimiter:] has been called on the
 *	 the stream, this callback will not be called again until new data has
 *	 been received, even though there is still data in the cache. The reason
 *	 for this is to prevent spinning in a loop when there is an incomplete
 *	 string in the cache. Once the string is complete, the callback will be
 *	 called again if there is data in the cache.
 *
 * \param stream The stream which did become ready for reading
 * @param stream The stream which did become ready for reading
 */
- (void)streamIsReadyForReading: (OFStream*)stream;

/**
 * \brief This callback is called when a stream did get ready for writing.
/*!
 * @brief This callback is called when a stream did get ready for writing.
 *
 * \param stream The stream which did become ready for writing
 * @param stream The stream which did become ready for writing
 */
- (void)streamIsReadyForWriting: (OFStream*)stream;

/**
 * \brief This callback is called when an exception occurred on the stream.
/*!
 * @brief This callback is called when an exception occurred on the stream.
 *
 * \param stream The stream on which an exception occurred
 * @param stream The stream on which an exception occurred
 */
- (void)streamDidReceiveException: (OFStream*)stream;
@end

/**
 * \brief A class that can observe multiple streams at once.
/*!
 * @brief A class that can observe multiple streams at once.
 *
 * Note: Currently, Win32 can only observe sockets and not files!
 */
@interface OFStreamObserver: OFObject
{
	OFMutableArray *readStreams;
	OFMutableArray *writeStreams;
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
125
126
127
128
129
130
131

132
133
134
135
136


137
138
139
140
141
142
143

144
145
146
147
148


149
150
151
152
153

154
155
156
157
158


159
160
161
162
163

164
165
166
167
168


169
170
171
172
173


174
175
176
177


178
179
180
181
182


183
184
185
186
187
188
189
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
125
126
127
128
129
130

131
132
133
134


135
136
137
138
139
140
141
142

143
144
145
146


147
148
149
150
151
152

153
154
155
156


157
158
159
160
161
162

163
164
165
166


167
168
169
170
171


172
173
174
175


176
177
178
179
180


181
182
183
184
185
186
187
188
189







-
-
+
+

-
+



-
-
+
+

-
+



-
-
+
+

-
+



-
-
+
+









-
+



-
-
+
+






-
+



-
-
+
+




-
+



-
-
+
+




-
+



-
-
+
+



-
-
+
+


-
-
+
+



-
-
+
+







	OFMutex *mutex;
}

#ifdef OF_HAVE_PROPERTIES
@property (assign) id <OFStreamObserverDelegate> delegate;
#endif

/**
 * \brief Creates a new OFStreamObserver.
/*!
 * @brief Creates a new OFStreamObserver.
 *
 * \return A new, autoreleased OFStreamObserver
 * @return A new, autoreleased OFStreamObserver
 */
+ (instancetype)observer;

/**
 * \brief Returns the delegate for the OFStreamObserver.
/*!
 * @brief Returns the delegate for the OFStreamObserver.
 *
 * \return The delegate for the OFStreamObserver
 * @return The delegate for the OFStreamObserver
 */
- (id <OFStreamObserverDelegate>)delegate;

/**
 * \brief Sets the delegate for the OFStreamObserver.
/*!
 * @brief Sets the delegate for the OFStreamObserver.
 *
 * \param delegate The delegate for the OFStreamObserver
 * @param delegate The delegate for the OFStreamObserver
 */
- (void)setDelegate: (id <OFStreamObserverDelegate>)delegate;

/**
 * \brief Adds a stream to observe for reading.
/*!
 * @brief Adds a stream to observe for reading.
 *
 * This is also used to observe a listening socket for incoming connections,
 * which then triggers a read event for the observed stream.
 *
 * It is recommended that the stream you add is set to non-blocking mode.
 *
 * If there is an -[observe] call blocking, it will be canceled. The reason for
 * this is to prevent blocking even though the new added stream is ready.
 *
 * \param stream The stream to observe for reading
 * @param stream The stream to observe for reading
 */
- (void)addStreamForReading: (OFStream*)stream;

/**
 * \brief Adds a stream to observe for writing.
/*!
 * @brief Adds a stream to observe for writing.
 *
 * It is recommended that the stream you add is set to non-blocking mode.
 *
 * If there is an -[observe] call blocking, it will be canceled. The reason for
 * this is to prevent blocking even though the new added stream is ready.
 *
 * \param stream The stream to observe for writing
 * @param stream The stream to observe for writing
 */
- (void)addStreamForWriting: (OFStream*)stream;

/**
 * \brief Removes a stream to observe for reading.
/*!
 * @brief Removes a stream to observe for reading.
 *
 * If there is an -[observe] call blocking, it will be canceled. The reason for
 * this is to prevent the removed stream from still being observed.
 *
 * \param stream The stream to remove from observing for reading
 * @param stream The stream to remove from observing for reading
 */
- (void)removeStreamForReading: (OFStream*)stream;

/**
 * \brief Removes a stream to observe for writing.
/*!
 * @brief Removes a stream to observe for writing.
 *
 * If there is an -[observe] call blocking, it will be canceled. The reason for
 * this is to prevent the removed stream from still being observed.
 *
 * \param stream The stream to remove from observing for writing
 * @param stream The stream to remove from observing for writing
 */
- (void)removeStreamForWriting: (OFStream*)stream;

/**
 * \brief Observes all streams and blocks until an event happens on a stream.
/*!
 * @brief Observes all streams and blocks until an event happens on a stream.
 */
- (void)observe;

/**
 * \brief Observes all streams until an event happens on a stream or the
/*!
 * @brief Observes all streams until an event happens on a stream or the
 *	  timeout is reached.
 *
 * \param timeout The time to wait for an event, in seconds
 * \return A boolean whether events occurred during the timeinterval
 * @param timeout The time to wait for an event, in seconds
 * @return A boolean whether events occurred during the timeinterval
 */
- (BOOL)observeWithTimeout: (double)timeout;

/**
 * \brief Cancels the currently blocking observe call.
/*!
 * @brief Cancels the currently blocking observe call.
 *
 * This is automatically done when a new stream is added or removed by another
 * thread, but in some circumstances, it might be desirable for a thread to
 * manually stop the observe running in another thread.
 */
- (void)cancel;