1/*
2 * Copyright (c) 2011-2013 Apple Inc. All rights reserved.
3 *
4 * @APPLE_APACHE_LICENSE_HEADER_START@
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * @APPLE_APACHE_LICENSE_HEADER_END@
19 */
20
21/*
22 * IMPORTANT: This header file describes INTERNAL interfaces to libdispatch
23 * which are subject to change in future releases of Mac OS X. Any applications
24 * relying on these interfaces WILL break.
25 */
26
27#ifndef __DISPATCH_DATA_PRIVATE__
28#define __DISPATCH_DATA_PRIVATE__
29
30#ifndef __DISPATCH_INDIRECT__
31#error "Please #include <dispatch/dispatch.h> instead of this file directly."
32#include <dispatch/base.h> // for HeaderDoc
33#endif
34
35__BEGIN_DECLS
36
37/*!
38 * @const DISPATCH_DATA_DESTRUCTOR_NONE
39 * @discussion The destructor for dispatch data objects that require no buffer
40 * memory management. This can be used to allow a data object to efficiently
41 * encapsulate buffers that should not be copied or freed by the system.
42 */
43#define DISPATCH_DATA_DESTRUCTOR_NONE (_dispatch_data_destructor_none)
44__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0)
45DISPATCH_DATA_DESTRUCTOR_TYPE_DECL(none);
46
47/*!
48 * @const DISPATCH_DATA_DESTRUCTOR_VM_DEALLOCATE
49 * @discussion The destructor for dispatch data objects that have been created
50 * from buffers that require deallocation using vm_deallocate.
51 */
52#define DISPATCH_DATA_DESTRUCTOR_VM_DEALLOCATE \
53		(_dispatch_data_destructor_vm_deallocate)
54__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0)
55DISPATCH_DATA_DESTRUCTOR_TYPE_DECL(vm_deallocate);
56
57/*!
58 * @function dispatch_data_create_f
59 * Creates a dispatch data object from the given contiguous buffer of memory. If
60 * a non-default destructor is provided, ownership of the buffer remains with
61 * the caller (i.e. the bytes will not be copied). The last release of the data
62 * object will result in the invocation of the specified destructor function on
63 * specified queue to free the buffer (passed as the context parameter).
64 *
65 * If the DISPATCH_DATA_DESTRUCTOR_FREE destructor is provided the buffer will
66 * be freed via free(3) and the queue argument ignored.
67 *
68 * If the DISPATCH_DATA_DESTRUCTOR_DEFAULT destructor is provided, data object
69 * creation will copy the buffer into internal memory managed by the system.
70 *
71 * @param buffer	A contiguous buffer of data.
72 * @param size		The size of the contiguous buffer of data.
73 * @param queue		The queue to which the destructor should be submitted.
74 * @param destructor	The destructor function responsible for freeing the
75 *			data buffer when it is no longer needed.
76 * @result		A newly created dispatch data object.
77 */
78__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0)
79DISPATCH_EXPORT DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT DISPATCH_NOTHROW
80dispatch_data_t
81dispatch_data_create_f(const void *buffer,
82	size_t size,
83	dispatch_queue_t queue,
84	dispatch_function_t destructor);
85
86/*!
87 * @function dispatch_data_create_alloc
88 * Creates a dispatch data object representing a newly allocated memory region
89 * of the given size. If a non-NULL reference to a pointer is provided, it is
90 * filled with the location of the memory region.
91 *
92 * It is the responsibility of the application to ensure that the data object
93 * becomes immutable (i.e. the returned memory region is not further modified)
94 * once the dispatch data object is passed to other API.
95 *
96 * @param size		The size of the required allocation.
97 * @param buffer_ptr	A pointer to a pointer variable to be filled with the
98 *			location of the newly allocated memory region, or NULL.
99 * @result		A newly created dispatch data object.
100 */
101__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_6_0)
102DISPATCH_EXPORT DISPATCH_RETURNS_RETAINED
103DISPATCH_WARN_RESULT DISPATCH_NOTHROW
104dispatch_data_t
105dispatch_data_create_alloc(size_t size, void** buffer_ptr);
106
107/*!
108 * @typedef dispatch_data_applier_function_t
109 * A function to be invoked for every contiguous memory region in a data object.
110 *
111 * @param context	Application-defined context parameter.
112 * @param region	A data object representing the current region.
113 * @param offset	The logical offset of the current region to the start
114 *					of the data object.
115 * @param buffer	The location of the memory for the current region.
116 * @param size		The size of the memory for the current region.
117 * @result		A Boolean indicating whether traversal should continue.
118 */
119typedef bool (*dispatch_data_applier_function_t)(void *context,
120	dispatch_data_t region, size_t offset, const void *buffer, size_t size);
121
122/*!
123 * @function dispatch_data_apply_f
124 * Traverse the memory regions represented by the specified dispatch data object
125 * in logical order and invoke the specified function once for every contiguous
126 * memory region encountered.
127 *
128 * Each invocation of the function is passed a data object representing the
129 * current region and its logical offset, along with the memory location and
130 * extent of the region. These allow direct read access to the memory region,
131 * but are only valid until the passed-in region object is released. Note that
132 * the region object is released by the system when the function returns, it is
133 * the responsibility of the application to retain it if the region object or
134 * the associated memory location are needed after the function returns.
135 *
136 * @param data		The data object to traverse.
137 * @param context	The application-defined context to pass to the function.
138 * @param applier	The function to be invoked for every contiguous memory
139 *			region in the data object.
140 * @result		A Boolean indicating whether traversal completed
141 *			successfully.
142 */
143__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_6_0)
144DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
145bool
146dispatch_data_apply_f(dispatch_data_t data, void *context,
147	dispatch_data_applier_function_t applier);
148
149#if TARGET_OS_MAC
150/*!
151 * @function dispatch_data_make_memory_entry
152 * Return a mach memory entry for the memory regions represented by the
153 * specified dispatch data object.
154 *
155 * For data objects created with the DISPATCH_DATA_DESTRUCTOR_VM_DEALLOCATE
156 * destructor, directly makes a memory entry from the represented region;
157 * otherwise, makes a memory entry from newly allocated pages containing a copy
158 * of the represented memory regions.
159 *
160 * @param data		The data object to make a memory entry for.
161 * @result		A mach port for the newly made memory entry, or
162 *			MACH_PORT_NULL if an error ocurred.
163 */
164__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_6_0)
165DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
166mach_port_t
167dispatch_data_make_memory_entry(dispatch_data_t dd);
168#endif
169
170/*!
171 * @functiongroup Dispatch data transform SPI
172 */
173
174/*!
175 * @typedef dispatch_data_format_type_t
176 *
177 * @abstract
178 * Data formats are used to specify the input and output types of data supplied
179 * to dispatch_data_create_transform.
180 */
181typedef const struct dispatch_data_format_type_s *dispatch_data_format_type_t;
182
183#if !TARGET_OS_WIN32
184#define DISPATCH_DATA_FORMAT_TYPE_DECL(name) \
185	DISPATCH_EXPORT const struct dispatch_data_format_type_s \
186	_dispatch_data_format_type_##name
187#else
188#define DISPATCH_DATA_FORMAT_TYPE_DECL(name) \
189	DISPATCH_EXPORT struct dispatch_data_format_type_s \
190	_dispatch_data_format_type_##name
191#endif
192
193/*!
194 * @const DISPATCH_DATA_FORMAT_TYPE_NONE
195 * @discussion A data format denoting that the given input or output format is,
196 * or should be, comprised of raw data bytes with no given encoding.
197 */
198#define DISPATCH_DATA_FORMAT_TYPE_NONE (&_dispatch_data_format_type_none)
199__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0)
200DISPATCH_DATA_FORMAT_TYPE_DECL(none);
201
202/*!
203 * @const DISPATCH_DATA_FORMAT_TYPE_BASE32
204 * @discussion A data format denoting that the given input or output format is,
205 * or should be, encoded in Base32 (RFC 4648) format. On input, this format will
206 * skip whitespace characters. Cannot be used in conjunction with UTF format
207 * types.
208 */
209#define DISPATCH_DATA_FORMAT_TYPE_BASE32 (&_dispatch_data_format_type_base32)
210__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0)
211DISPATCH_DATA_FORMAT_TYPE_DECL(base32);
212
213/*!
214 * @const DISPATCH_DATA_FORMAT_TYPE_BASE32HEX
215 * @discussion A data format denoting that the given input or output format is,
216 * or should be, encoded in Base32Hex (RFC 4648) format. On input, this format
217 * will skip whitespace characters. Cannot be used in conjunction with UTF
218 * format types.
219 */
220#define DISPATCH_DATA_FORMAT_TYPE_BASE32HEX \
221		(&_dispatch_data_format_type_base32hex)
222__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0)
223DISPATCH_DATA_FORMAT_TYPE_DECL(base32hex);
224
225/*!
226 * @const DISPATCH_DATA_FORMAT_TYPE_BASE64
227 * @discussion A data format denoting that the given input or output format is,
228 * or should be, encoded in Base64 (RFC 4648) format. On input, this format will
229 * skip whitespace characters. Cannot be used in conjunction with UTF format
230 * types.
231 */
232#define DISPATCH_DATA_FORMAT_TYPE_BASE64 (&_dispatch_data_format_type_base64)
233__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0)
234DISPATCH_DATA_FORMAT_TYPE_DECL(base64);
235
236/*!
237 * @const DISPATCH_DATA_FORMAT_TYPE_UTF8
238 * @discussion A data format denoting that the given input or output format is,
239 * or should be, encoded in UTF-8 format. Is only valid when used in conjunction
240 * with other UTF format types.
241 */
242#define DISPATCH_DATA_FORMAT_TYPE_UTF8 (&_dispatch_data_format_type_utf8)
243__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0)
244DISPATCH_DATA_FORMAT_TYPE_DECL(utf8);
245
246/*!
247 * @const DISPATCH_DATA_FORMAT_TYPE_UTF16LE
248 * @discussion A data format denoting that the given input or output format is,
249 * or should be, encoded in UTF-16LE format. Is only valid when used in
250 * conjunction with other UTF format types.
251 */
252#define DISPATCH_DATA_FORMAT_TYPE_UTF16LE (&_dispatch_data_format_type_utf16le)
253__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0)
254DISPATCH_DATA_FORMAT_TYPE_DECL(utf16le);
255
256/*!
257 * @const DISPATCH_DATA_FORMAT_TYPE_UTF16BE
258 * @discussion A data format denoting that the given input or output format is,
259 * or should be, encoded in UTF-16BE format. Is only valid when used in
260 * conjunction with other UTF format types.
261 */
262#define DISPATCH_DATA_FORMAT_TYPE_UTF16BE (&_dispatch_data_format_type_utf16be)
263__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0)
264DISPATCH_DATA_FORMAT_TYPE_DECL(utf16be);
265
266/*!
267 * @const DISPATCH_DATA_FORMAT_TYPE_UTFANY
268 * @discussion A data format denoting that dispatch_data_create_transform should
269 * attempt to automatically detect the input type based on the presence of a
270 * byte order mark character at the beginning of the data. In the absence of a
271 * BOM, the data will be assumed to be in UTF-8 format. Only valid as an input
272 * format.
273 */
274#define DISPATCH_DATA_FORMAT_TYPE_UTF_ANY (&_dispatch_data_format_type_utf_any)
275__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0)
276DISPATCH_DATA_FORMAT_TYPE_DECL(utf_any);
277
278/*!
279 * @function dispatch_data_create_transform
280 * Returns a new dispatch data object after transforming the given data object
281 * from the supplied format, into the given output format.
282 *
283 * @param data
284 * The data object representing the region(s) of memory to transform.
285 * @param input_type
286 * Flags specifying the input format of the source dispatch_data_t
287 *
288 * @param output_type
289 * Flags specifying the expected output format of the resulting transfomation.
290 *
291 * @result
292 * A newly created dispatch data object, dispatch_data_empty if no has been
293 * produced, or NULL if an error occurred.
294 */
295
296__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0)
297DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_RETURNS_RETAINED
298DISPATCH_WARN_RESULT DISPATCH_NOTHROW
299dispatch_data_t
300dispatch_data_create_with_transform(dispatch_data_t data,
301	dispatch_data_format_type_t input_type,
302	dispatch_data_format_type_t output_type);
303
304__END_DECLS
305
306#endif // __DISPATCH_DATA_PRIVATE__
307