]> git.saurik.com Git - apple/cf.git/blob - CFStream.h
CF-635.21.tar.gz
[apple/cf.git] / CFStream.h
1 /*
2 * Copyright (c) 2012 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24 /* CFStream.h
25 Copyright (c) 2000-2011, Apple Inc. All rights reserved.
26 */
27
28 #if !defined(__COREFOUNDATION_CFSTREAM__)
29 #define __COREFOUNDATION_CFSTREAM__ 1
30
31 #include <CoreFoundation/CFBase.h>
32 #include <CoreFoundation/CFString.h>
33 #include <CoreFoundation/CFDictionary.h>
34 #include <CoreFoundation/CFURL.h>
35 #include <CoreFoundation/CFRunLoop.h>
36 #include <CoreFoundation/CFSocket.h>
37 #include <CoreFoundation/CFError.h>
38
39 CF_EXTERN_C_BEGIN
40
41 enum {
42 kCFStreamStatusNotOpen = 0,
43 kCFStreamStatusOpening, /* open is in-progress */
44 kCFStreamStatusOpen,
45 kCFStreamStatusReading,
46 kCFStreamStatusWriting,
47 kCFStreamStatusAtEnd, /* no further bytes can be read/written */
48 kCFStreamStatusClosed,
49 kCFStreamStatusError
50 };
51 typedef CFIndex CFStreamStatus;
52
53 enum {
54 kCFStreamEventNone = 0,
55 kCFStreamEventOpenCompleted = 1,
56 kCFStreamEventHasBytesAvailable = 2,
57 kCFStreamEventCanAcceptBytes = 4,
58 kCFStreamEventErrorOccurred = 8,
59 kCFStreamEventEndEncountered = 16
60 };
61 typedef CFOptionFlags CFStreamEventType;
62
63 typedef struct {
64 CFIndex version;
65 void *info;
66 void *(*retain)(void *info);
67 void (*release)(void *info);
68 CFStringRef (*copyDescription)(void *info);
69 } CFStreamClientContext;
70
71 typedef struct __CFReadStream * CFReadStreamRef;
72 typedef struct __CFWriteStream * CFWriteStreamRef;
73
74 typedef void (*CFReadStreamClientCallBack)(CFReadStreamRef stream, CFStreamEventType type, void *clientCallBackInfo);
75 typedef void (*CFWriteStreamClientCallBack)(CFWriteStreamRef stream, CFStreamEventType type, void *clientCallBackInfo);
76
77 CF_EXPORT
78 CFTypeID CFReadStreamGetTypeID(void);
79 CF_EXPORT
80 CFTypeID CFWriteStreamGetTypeID(void);
81
82 /* Memory streams */
83
84 /* Value will be a CFData containing all bytes thusfar written; used to recover the data written to a memory write stream. */
85 CF_EXPORT
86 const CFStringRef kCFStreamPropertyDataWritten;
87
88 /* Pass kCFAllocatorNull for bytesDeallocator to prevent CFReadStream from deallocating bytes; otherwise, CFReadStream will deallocate bytes when the stream is destroyed */
89 CF_EXPORT
90 CFReadStreamRef CFReadStreamCreateWithBytesNoCopy(CFAllocatorRef alloc, const UInt8 *bytes, CFIndex length, CFAllocatorRef bytesDeallocator);
91
92 /* The stream writes into the buffer given; when bufferCapacity is exhausted, the stream is exhausted (status becomes kCFStreamStatusAtEnd) */
93 CF_EXPORT
94 CFWriteStreamRef CFWriteStreamCreateWithBuffer(CFAllocatorRef alloc, UInt8 *buffer, CFIndex bufferCapacity);
95
96 /* New buffers are allocated from bufferAllocator as bytes are written to the stream. At any point, you can recover the bytes thusfar written by asking for the property kCFStreamPropertyDataWritten, above */
97 CF_EXPORT
98 CFWriteStreamRef CFWriteStreamCreateWithAllocatedBuffers(CFAllocatorRef alloc, CFAllocatorRef bufferAllocator);
99
100 /* File streams */
101 CF_EXPORT
102 CFReadStreamRef CFReadStreamCreateWithFile(CFAllocatorRef alloc, CFURLRef fileURL);
103 CF_EXPORT
104 CFWriteStreamRef CFWriteStreamCreateWithFile(CFAllocatorRef alloc, CFURLRef fileURL);
105 CF_EXPORT
106 void CFStreamCreateBoundPair(CFAllocatorRef alloc, CFReadStreamRef *readStream, CFWriteStreamRef *writeStream, CFIndex transferBufferSize);
107
108 /* Property for file write streams; value should be a CFBoolean. Set to TRUE to append to a file, rather than to replace its contents */
109 CF_EXPORT
110 const CFStringRef kCFStreamPropertyAppendToFile;
111
112 CF_EXPORT
113 const CFStringRef kCFStreamPropertyFileCurrentOffset; // Value is a CFNumber
114
115
116 /* Socket stream properties */
117
118 /* Value will be a CFData containing the native handle */
119 CF_EXPORT
120 const CFStringRef kCFStreamPropertySocketNativeHandle;
121
122 /* Value will be a CFString, or NULL if unknown */
123 CF_EXPORT
124 const CFStringRef kCFStreamPropertySocketRemoteHostName;
125
126 /* Value will be a CFNumber, or NULL if unknown */
127 CF_EXPORT
128 const CFStringRef kCFStreamPropertySocketRemotePortNumber;
129
130 /* Socket streams; the returned streams are paired such that they use the same socket; pass NULL if you want only the read stream or the write stream */
131 CF_EXPORT
132 void CFStreamCreatePairWithSocket(CFAllocatorRef alloc, CFSocketNativeHandle sock, CFReadStreamRef *readStream, CFWriteStreamRef *writeStream);
133 CF_EXPORT
134 void CFStreamCreatePairWithSocketToHost(CFAllocatorRef alloc, CFStringRef host, UInt32 port, CFReadStreamRef *readStream, CFWriteStreamRef *writeStream);
135 CF_EXPORT
136 void CFStreamCreatePairWithPeerSocketSignature(CFAllocatorRef alloc, const CFSocketSignature *signature, CFReadStreamRef *readStream, CFWriteStreamRef *writeStream);
137
138
139 /* Returns the current state of the stream */
140 CF_EXPORT
141 CFStreamStatus CFReadStreamGetStatus(CFReadStreamRef stream);
142 CF_EXPORT
143 CFStreamStatus CFWriteStreamGetStatus(CFWriteStreamRef stream);
144
145 /* Returns NULL if no error has occurred; otherwise returns the error. */
146 CF_EXPORT
147 CFErrorRef CFReadStreamCopyError(CFReadStreamRef stream) CF_AVAILABLE(10_5, 2_0);
148 CF_EXPORT
149 CFErrorRef CFWriteStreamCopyError(CFWriteStreamRef stream) CF_AVAILABLE(10_5, 2_0);
150
151 /* Returns success/failure. Opening a stream causes it to reserve all the system
152 resources it requires. If the stream can open non-blocking, this will always
153 return TRUE; listen to the run loop source to find out when the open completes
154 and whether it was successful, or poll using CFRead/WriteStreamGetStatus(), waiting
155 for a status of kCFStreamStatusOpen or kCFStreamStatusError. */
156 CF_EXPORT
157 Boolean CFReadStreamOpen(CFReadStreamRef stream);
158 CF_EXPORT
159 Boolean CFWriteStreamOpen(CFWriteStreamRef stream);
160
161 /* Terminates the flow of bytes; releases any system resources required by the
162 stream. The stream may not fail to close. You may call CFStreamClose() to
163 effectively abort a stream. */
164 CF_EXPORT
165 void CFReadStreamClose(CFReadStreamRef stream);
166 CF_EXPORT
167 void CFWriteStreamClose(CFWriteStreamRef stream);
168
169 /* Whether there is data currently available for reading; returns TRUE if it's
170 impossible to tell without trying */
171 CF_EXPORT
172 Boolean CFReadStreamHasBytesAvailable(CFReadStreamRef stream);
173
174 /* Returns the number of bytes read, or -1 if an error occurs preventing any
175 bytes from being read, or 0 if the stream's end was encountered.
176 It is an error to try and read from a stream that hasn't been opened first.
177 This call will block until at least one byte is available; it will NOT block
178 until the entire buffer can be filled. To avoid blocking, either poll using
179 CFReadStreamHasBytesAvailable() or use the run loop and listen for the
180 kCFStreamCanRead event for notification of data available. */
181 CF_EXPORT
182 CFIndex CFReadStreamRead(CFReadStreamRef stream, UInt8 *buffer, CFIndex bufferLength);
183
184 /* Returns a pointer to an internal buffer if possible (setting *numBytesRead
185 to the length of the returned buffer), otherwise returns NULL; guaranteed
186 to return in O(1). Bytes returned in the buffer are considered read from
187 the stream; if maxBytesToRead is greater than 0, not more than maxBytesToRead
188 will be returned. If maxBytesToRead is less than or equal to zero, as many bytes
189 as are readily available will be returned. The returned buffer is good only
190 until the next stream operation called on the stream. Caller should neither
191 change the contents of the returned buffer nor attempt to deallocate the buffer;
192 it is still owned by the stream. */
193 CF_EXPORT
194 const UInt8 *CFReadStreamGetBuffer(CFReadStreamRef stream, CFIndex maxBytesToRead, CFIndex *numBytesRead);
195
196 /* Whether the stream can currently be written to without blocking;
197 returns TRUE if it's impossible to tell without trying */
198 CF_EXPORT
199 Boolean CFWriteStreamCanAcceptBytes(CFWriteStreamRef stream);
200
201 /* Returns the number of bytes successfully written, -1 if an error has
202 occurred, or 0 if the stream has been filled to capacity (for fixed-length
203 streams). If the stream is not full, this call will block until at least
204 one byte is written. To avoid blocking, either poll via CFWriteStreamCanAcceptBytes
205 or use the run loop and listen for the kCFStreamCanWrite event. */
206 CF_EXPORT
207 CFIndex CFWriteStreamWrite(CFWriteStreamRef stream, const UInt8 *buffer, CFIndex bufferLength);
208
209 /* Particular streams can name properties and assign meanings to them; you
210 access these properties through the following calls. A property is any interesting
211 information about the stream other than the data being transmitted itself.
212 Examples include the headers from an HTTP transmission, or the expected
213 number of bytes, or permission information, etc. Properties that can be set
214 configure the behavior of the stream, and may only be settable at particular times
215 (like before the stream has been opened). See the documentation for particular
216 properties to determine their get- and set-ability. */
217 CF_EXPORT
218 CFTypeRef CFReadStreamCopyProperty(CFReadStreamRef stream, CFStringRef propertyName);
219 CF_EXPORT
220 CFTypeRef CFWriteStreamCopyProperty(CFWriteStreamRef stream, CFStringRef propertyName);
221
222 /* Returns TRUE if the stream recognizes and accepts the given property-value pair;
223 FALSE otherwise. */
224 CF_EXPORT
225 Boolean CFReadStreamSetProperty(CFReadStreamRef stream, CFStringRef propertyName, CFTypeRef propertyValue);
226 CF_EXPORT
227 Boolean CFWriteStreamSetProperty(CFWriteStreamRef stream, CFStringRef propertyName, CFTypeRef propertyValue);
228
229 /* Asynchronous processing - If you wish to neither poll nor block, you may register
230 a client to hear about interesting events that occur on a stream. Only one client
231 per stream is allowed; registering a new client replaces the previous one.
232
233 Once you have set a client, you need to schedule a run loop on which that client
234 can be notified. You may schedule multiple run loops (for instance, if you are
235 using a thread pool). The client callback will be triggered via one of the scheduled
236 run loops; It is the caller's responsibility to ensure that at least one of the
237 scheduled run loops is being run.
238
239 NOTE: Unlike other CoreFoundation APIs, pasing a NULL clientContext here will remove
240 the client. If you do not care about the client context (i.e. your only concern
241 is that your callback be called), you should pass in a valid context where every
242 entry is 0 or NULL.
243
244 */
245
246 CF_EXPORT
247 Boolean CFReadStreamSetClient(CFReadStreamRef stream, CFOptionFlags streamEvents, CFReadStreamClientCallBack clientCB, CFStreamClientContext *clientContext);
248 CF_EXPORT
249 Boolean CFWriteStreamSetClient(CFWriteStreamRef stream, CFOptionFlags streamEvents, CFWriteStreamClientCallBack clientCB, CFStreamClientContext *clientContext);
250
251 CF_EXPORT
252 void CFReadStreamScheduleWithRunLoop(CFReadStreamRef stream, CFRunLoopRef runLoop, CFStringRef runLoopMode);
253 CF_EXPORT
254 void CFWriteStreamScheduleWithRunLoop(CFWriteStreamRef stream, CFRunLoopRef runLoop, CFStringRef runLoopMode);
255
256 CF_EXPORT
257 void CFReadStreamUnscheduleFromRunLoop(CFReadStreamRef stream, CFRunLoopRef runLoop, CFStringRef runLoopMode);
258 CF_EXPORT
259 void CFWriteStreamUnscheduleFromRunLoop(CFWriteStreamRef stream, CFRunLoopRef runLoop, CFStringRef runLoopMode);
260
261
262 /* The following API is deprecated starting in 10.5; please use CFRead/WriteStreamCopyError(), above, instead */
263 enum {
264 kCFStreamErrorDomainCustom = -1, /* custom to the kind of stream in question */
265 kCFStreamErrorDomainPOSIX = 1, /* POSIX errno; interpret using <sys/errno.h> */
266 kCFStreamErrorDomainMacOSStatus /* OSStatus type from Carbon APIs; interpret using <MacTypes.h> */
267 };
268 typedef CFIndex CFStreamErrorDomain;
269
270 typedef struct {
271 CFIndex domain;
272 SInt32 error;
273 } CFStreamError;
274 CF_EXPORT
275 CFStreamError CFReadStreamGetError(CFReadStreamRef stream);
276 CF_EXPORT
277 CFStreamError CFWriteStreamGetError(CFWriteStreamRef stream);
278
279
280 CF_EXTERN_C_END
281
282 #endif /* ! __COREFOUNDATION_CFSTREAM__ */