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
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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
// Copyright 2013-2015 The Servo Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use std::os::raw::c_void;

use crate::array::CFArrayRef;
use crate::base::{
    Boolean, CFAllocatorRef, CFIndex, CFOptionFlags, CFRange, CFTypeID, CFTypeRef, SInt32,
};
use crate::data::CFDataRef;
use crate::dictionary::CFDictionaryRef;
use crate::error::CFErrorRef;
use crate::string::{CFStringEncoding, CFStringRef};

#[repr(C)]
pub struct __CFURL(c_void);

pub type CFURLRef = *const __CFURL;

pub type CFURLBookmarkCreationOptions = CFOptionFlags;
pub type CFURLBookmarkResolutionOptions = CFOptionFlags;
pub type CFURLBookmarkFileCreationOptions = CFOptionFlags;

pub type CFURLPathStyle = CFIndex;

/* typedef CF_ENUM(CFIndex, CFURLPathStyle) */
pub const kCFURLPOSIXPathStyle: CFURLPathStyle = 0;
pub const kCFURLHFSPathStyle: CFURLPathStyle = 1;
pub const kCFURLWindowsPathStyle: CFURLPathStyle = 2;

/* Bookmark Data Creation Options */
pub static kCFURLBookmarkCreationMinimalBookmarkMask: CFURLBookmarkCreationOptions =
    (1u32 << 9) as usize;
pub static kCFURLBookmarkCreationSuitableForBookmarkFile: CFURLBookmarkCreationOptions =
    (1u32 << 10) as usize;

#[cfg(target_os = "macos")]
pub static kCFURLBookmarkCreationWithSecurityScope: CFURLBookmarkCreationOptions =
    (1u32 << 11) as usize;

#[cfg(target_os = "macos")]
pub static kCFURLBookmarkCreationSecurityScopeAllowOnlyReadAccess: CFURLBookmarkCreationOptions =
    (1u32 << 12) as usize;

pub static kCFURLBookmarkCreationWithoutImplicitSecurityScope: CFURLBookmarkCreationOptions =
    (1u32 << 29) as usize;

pub static kCFURLBookmarkCreationPreferFileIDResolutionMask: CFURLBookmarkCreationOptions =
    (1u32 << 8) as usize; // deprecated

/* The types of components in a URL. */
pub type CFURLComponentType = CFIndex;
pub const kCFURLComponentScheme: CFIndex = 1;
pub const kCFURLComponentNetLocation: CFIndex = 2;
pub const kCFURLComponentPath: CFIndex = 3;
pub const kCFURLComponentResourceSpecifier: CFIndex = 4;
pub const kCFURLComponentUser: CFIndex = 5;
pub const kCFURLComponentPassword: CFIndex = 6;
pub const kCFURLComponentUserInfo: CFIndex = 7;
pub const kCFURLComponentHost: CFIndex = 8;
pub const kCFURLComponentPort: CFIndex = 9;
pub const kCFURLComponentParameterString: CFIndex = 10;
pub const kCFURLComponentQuery: CFIndex = 11;
pub const kCFURLComponentFragment: CFIndex = 12;

/* Bookmark Data Resolution Options */
pub const kCFURLBookmarkResolutionWithoutUIMask: CFURLBookmarkResolutionOptions =
    (1u32 << 8) as usize;
pub const kCFURLBookmarkResolutionWithoutMountingMask: CFURLBookmarkResolutionOptions =
    (1u32 << 9) as usize;
#[cfg(target_os = "macos")]
pub const kCFURLBookmarkResolutionWithSecurityScope: CFURLBookmarkResolutionOptions =
    (1u32 << 10) as usize;
//pub const kCFURLBookmarkResolutionWithoutImplicitStartAccessing: CFURLBookmarkResolutionOptions = ( 1u32 << 15 ) as usize; // macos(11.2)+
pub const kCFBookmarkResolutionWithoutUIMask: CFURLBookmarkResolutionOptions = (1u32 << 8) as usize;
pub const kCFBookmarkResolutionWithoutMountingMask: CFURLBookmarkResolutionOptions =
    (1u32 << 9) as usize;

extern "C" {
    /*
     * CFURL.h
     */

    /* Common File System Resource Keys */
    pub static kCFURLNameKey: CFStringRef;
    pub static kCFURLLocalizedNameKey: CFStringRef;
    pub static kCFURLIsRegularFileKey: CFStringRef;
    pub static kCFURLIsDirectoryKey: CFStringRef;
    pub static kCFURLIsSymbolicLinkKey: CFStringRef;
    pub static kCFURLIsVolumeKey: CFStringRef;
    pub static kCFURLIsPackageKey: CFStringRef;
    pub static kCFURLIsApplicationKey: CFStringRef;
    // pub static kCFURLApplicationIsScriptableKey: CFStringRef; //macos(10.11)+

    pub static kCFURLIsSystemImmutableKey: CFStringRef;
    pub static kCFURLIsUserImmutableKey: CFStringRef;
    pub static kCFURLIsHiddenKey: CFStringRef;
    pub static kCFURLHasHiddenExtensionKey: CFStringRef;
    pub static kCFURLCreationDateKey: CFStringRef;
    pub static kCFURLContentAccessDateKey: CFStringRef;
    pub static kCFURLContentModificationDateKey: CFStringRef;
    pub static kCFURLAttributeModificationDateKey: CFStringRef;
    // pub static kCFURLFileIdentifierKey: CFStringRef; //macos(13.3)+
    // pub static kCFURLFileContentIdentifierKey: CFStringRef; //macos(11.0)+
    // pub static kCFURLMayShareFileContentKey: CFStringRef; //macos(11.0)+
    // pub static kCFURLMayHaveExtendedAttributesKey: CFStringRef; //macos(11.0)+
    // pub static kCFURLIsPurgeableKey: CFStringRef; //macos(11.0)+
    // pub static kCFURLIsSparseKey: CFStringRef; //macos(11.0)+

    pub static kCFURLLinkCountKey: CFStringRef;
    pub static kCFURLParentDirectoryURLKey: CFStringRef;
    pub static kCFURLVolumeURLKey: CFStringRef;

    pub static kCFURLTypeIdentifierKey: CFStringRef; //deprecated

    pub static kCFURLLocalizedTypeDescriptionKey: CFStringRef;
    pub static kCFURLLabelNumberKey: CFStringRef;
    pub static kCFURLLabelColorKey: CFStringRef; //deprecated
    pub static kCFURLLocalizedLabelKey: CFStringRef;
    pub static kCFURLEffectiveIconKey: CFStringRef; //deprecated
    pub static kCFURLCustomIconKey: CFStringRef; //deprecated

    pub static kCFURLFileResourceIdentifierKey: CFStringRef;
    pub static kCFURLVolumeIdentifierKey: CFStringRef;
    pub static kCFURLPreferredIOBlockSizeKey: CFStringRef;
    pub static kCFURLIsReadableKey: CFStringRef;
    pub static kCFURLIsWritableKey: CFStringRef;
    pub static kCFURLIsExecutableKey: CFStringRef;
    pub static kCFURLFileSecurityKey: CFStringRef;

    #[cfg(feature = "mac_os_10_8_features")]
    #[cfg_attr(feature = "mac_os_10_7_support", linkage = "extern_weak")]
    pub static kCFURLIsExcludedFromBackupKey: CFStringRef;
    // pub static kCFURLTagNamesKey: CFStringRef; //macos(10.9)+
    #[cfg(feature = "mac_os_10_8_features")]
    #[cfg_attr(feature = "mac_os_10_7_support", linkage = "extern_weak")]
    pub static kCFURLPathKey: CFStringRef; // macos(10.8)+
    pub static kCFURLCanonicalPathKey: CFStringRef; // macos(10.12)+

    pub static kCFURLIsMountTriggerKey: CFStringRef;

    // pub static kCFURLGenerationIdentifierKey: CFStringRef; // macos(10.10)+
    // pub static kCFURLDocumentIdentifierKey: CFStringRef; // macos(10.10)+
    // pub static kCFURLAddedToDirectoryDateKey: CFStringRef; // macos(10.10)+
    // pub static kCFURLQuarantinePropertiesKey: CFStringRef; // macos(10.10)+

    pub static kCFURLFileResourceTypeKey: CFStringRef;

    /* File Resource Types. The file system object type values returned for the kCFURLFileResourceTypeKey */
    pub static kCFURLFileResourceTypeNamedPipe: CFStringRef;
    pub static kCFURLFileResourceTypeCharacterSpecial: CFStringRef;
    pub static kCFURLFileResourceTypeDirectory: CFStringRef;
    pub static kCFURLFileResourceTypeBlockSpecial: CFStringRef;
    pub static kCFURLFileResourceTypeRegular: CFStringRef;
    pub static kCFURLFileResourceTypeSymbolicLink: CFStringRef;
    pub static kCFURLFileResourceTypeSocket: CFStringRef;
    pub static kCFURLFileResourceTypeUnknown: CFStringRef;

    /* File Property Keys */
    pub static kCFURLFileSizeKey: CFStringRef;
    pub static kCFURLFileAllocatedSizeKey: CFStringRef;
    pub static kCFURLTotalFileSizeKey: CFStringRef;
    pub static kCFURLTotalFileAllocatedSizeKey: CFStringRef;
    pub static kCFURLIsAliasFileKey: CFStringRef;

    // pub static kCFURLFileProtectionKey: CFStringRef; // ios(9.0)+

    /* The protection level values returned for the kCFURLFileProtectionKey */
    // pub static kCFURLFileProtectionNone: CFStringRef; // ios(9.0)+
    // pub static kCFURLFileProtectionComplete: CFStringRef; // ios(9.0)+
    // pub static kCFURLFileProtectionCompleteUnlessOpen: CFStringRef; // ios(9.0)+
    // pub static kCFURLFileProtectionCompleteUntilFirstUserAuthentication: CFStringRef; // ios(9.0)+

    /* Volume Property Keys */
    pub static kCFURLVolumeLocalizedFormatDescriptionKey: CFStringRef;
    pub static kCFURLVolumeTotalCapacityKey: CFStringRef;
    pub static kCFURLVolumeAvailableCapacityKey: CFStringRef;
    //pub static kCFURLVolumeAvailableCapacityForImportantUsageKey: CFStringRef; //macos(10.13)+
    //pub static kCFURLVolumeAvailableCapacityForOpportunisticUsageKey: CFStringRef; //macos(10.13)+

    pub static kCFURLVolumeResourceCountKey: CFStringRef;
    pub static kCFURLVolumeSupportsPersistentIDsKey: CFStringRef;
    pub static kCFURLVolumeSupportsSymbolicLinksKey: CFStringRef;
    pub static kCFURLVolumeSupportsHardLinksKey: CFStringRef;
    pub static kCFURLVolumeSupportsJournalingKey: CFStringRef;
    pub static kCFURLVolumeIsJournalingKey: CFStringRef;
    pub static kCFURLVolumeSupportsSparseFilesKey: CFStringRef;
    pub static kCFURLVolumeSupportsZeroRunsKey: CFStringRef;
    pub static kCFURLVolumeSupportsCaseSensitiveNamesKey: CFStringRef;
    pub static kCFURLVolumeSupportsCasePreservedNamesKey: CFStringRef;
    pub static kCFURLVolumeSupportsRootDirectoryDatesKey: CFStringRef;
    pub static kCFURLVolumeSupportsVolumeSizesKey: CFStringRef;
    pub static kCFURLVolumeSupportsRenamingKey: CFStringRef;
    pub static kCFURLVolumeSupportsAdvisoryFileLockingKey: CFStringRef;
    pub static kCFURLVolumeSupportsExtendedSecurityKey: CFStringRef;
    pub static kCFURLVolumeIsBrowsableKey: CFStringRef;
    pub static kCFURLVolumeMaximumFileSizeKey: CFStringRef;
    pub static kCFURLVolumeIsEjectableKey: CFStringRef;
    pub static kCFURLVolumeIsRemovableKey: CFStringRef;
    pub static kCFURLVolumeIsInternalKey: CFStringRef;
    pub static kCFURLVolumeIsAutomountedKey: CFStringRef;
    pub static kCFURLVolumeIsLocalKey: CFStringRef;
    pub static kCFURLVolumeIsReadOnlyKey: CFStringRef;
    pub static kCFURLVolumeCreationDateKey: CFStringRef;
    pub static kCFURLVolumeURLForRemountingKey: CFStringRef;
    pub static kCFURLVolumeUUIDStringKey: CFStringRef;
    pub static kCFURLVolumeNameKey: CFStringRef;
    pub static kCFURLVolumeLocalizedNameKey: CFStringRef;
    // pub static kCFURLVolumeIsEncryptedKey: CFStringRef; //macos(10.12)+
    // pub static kCFURLVolumeIsRootFileSystemKey: CFStringRef; //macos(10.12)+
    // pub static kCFURLVolumeSupportsCompressionKey: CFStringRef; //macos(10.12)+
    // pub static kCFURLVolumeSupportsFileCloningKey: CFStringRef; //macos(10.12)+
    // pub static kCFURLVolumeSupportsSwapRenamingKey: CFStringRef; //macos(10.12)+
    // pub static kCFURLVolumeSupportsExclusiveRenamingKey: CFStringRef; //macos(10.12)+
    // pub static kCFURLVolumeSupportsImmutableFilesKey: CFStringRef; //macos(10.13)+
    // pub static kCFURLVolumeSupportsAccessPermissionsKey: CFStringRef; //macos(10.13)+
    // pub static kCFURLVolumeSupportsFileProtectionKey: CFStringRef;  //macos(11.0)+
    // pub static kCFURLVolumeTypeNameKey: CFStringRef;  //macos(13.3)+
    // pub static kCFURLVolumeSubtypeKey: CFStringRef; //macos(13.3)+
    // pub static kCFURLVolumeMountFromLocationKey: CFStringRef; //macos(13.3)+

    /* iCloud Constants */
    pub static kCFURLIsUbiquitousItemKey: CFStringRef;
    pub static kCFURLUbiquitousItemHasUnresolvedConflictsKey: CFStringRef;
    pub static kCFURLUbiquitousItemIsDownloadedKey: CFStringRef; // deprecated
    pub static kCFURLUbiquitousItemIsDownloadingKey: CFStringRef;
    pub static kCFURLUbiquitousItemIsUploadedKey: CFStringRef;
    pub static kCFURLUbiquitousItemIsUploadingKey: CFStringRef;
    pub static kCFURLUbiquitousItemPercentDownloadedKey: CFStringRef; // deprecated
    pub static kCFURLUbiquitousItemPercentUploadedKey: CFStringRef; // deprecated
                                                                    // pub static kCFURLUbiquitousItemDownloadingStatusKey: CFStringRef; // macos(10.9)+
                                                                    // pub static kCFURLUbiquitousItemDownloadingErrorKey: CFStringRef; // macos(10.9)+
                                                                    // pub static kCFURLUbiquitousItemUploadingErrorKey: CFStringRef; // macos(10.9)+
                                                                    // pub static kCFURLUbiquitousItemIsExcludedFromSyncKey: CFStringRef; // macos(11.3)+

    /* The values returned for kCFURLUbiquitousItemDownloadingStatusKey */
    // pub static kCFURLUbiquitousItemDownloadingStatusNotDownloaded: CFStringRef; // macos(10.9)+
    // pub static kCFURLUbiquitousItemDownloadingStatusDownloaded: CFStringRef; // macos(10.9)+
    // pub static kCFURLUbiquitousItemDownloadingStatusCurrent: CFStringRef; // macos(10.9)+

    /* CFError userInfo Dictionary Keys */
    pub static kCFURLKeysOfUnsetValuesKey: CFStringRef;

    /* Creating a CFURL */
    pub fn CFURLCopyAbsoluteURL(anURL: CFURLRef) -> CFURLRef;
    pub fn CFURLCreateAbsoluteURLWithBytes(
        allocator: CFAllocatorRef,
        relativeURLBytes: *const u8,
        length: CFIndex,
        encoding: CFStringEncoding,
        baseURL: CFURLRef,
        useCompatibilityMode: Boolean,
    ) -> CFURLRef;
    pub fn CFURLCreateByResolvingBookmarkData(
        allocator: CFAllocatorRef,
        bookmark: CFDataRef,
        options: CFURLBookmarkResolutionOptions,
        relativeToURL: CFURLRef,
        resourcePropertiesToInclude: CFArrayRef,
        isStale: *mut Boolean,
        error: *mut CFErrorRef,
    ) -> CFURLRef;
    pub fn CFURLCreateCopyAppendingPathComponent(
        allocator: CFAllocatorRef,
        url: CFURLRef,
        pathComponent: CFStringRef,
        isDirectory: Boolean,
    ) -> CFURLRef;
    pub fn CFURLCreateCopyAppendingPathExtension(
        allocator: CFAllocatorRef,
        url: CFURLRef,
        extension: CFStringRef,
    ) -> CFURLRef;
    pub fn CFURLCreateCopyDeletingLastPathComponent(
        allocator: CFAllocatorRef,
        url: CFURLRef,
    ) -> CFURLRef;
    pub fn CFURLCreateCopyDeletingPathExtension(
        allocator: CFAllocatorRef,
        url: CFURLRef,
    ) -> CFURLRef;
    pub fn CFURLCreateFilePathURL(
        allocator: CFAllocatorRef,
        url: CFURLRef,
        error: *mut CFErrorRef,
    ) -> CFURLRef;
    pub fn CFURLCreateFileReferenceURL(
        allocator: CFAllocatorRef,
        url: CFURLRef,
        error: *mut CFErrorRef,
    ) -> CFURLRef;
    pub fn CFURLCreateFromFileSystemRepresentation(
        allocator: CFAllocatorRef,
        buffer: *const u8,
        bufLen: CFIndex,
        isDirectory: Boolean,
    ) -> CFURLRef;
    pub fn CFURLCreateFromFileSystemRepresentationRelativeToBase(
        allocator: CFAllocatorRef,
        buffer: *const u8,
        bufLen: CFIndex,
        isDirectory: Boolean,
        baseURL: CFURLRef,
    ) -> CFURLRef;
    //pub fn CFURLCreateFromFSRef(allocator: CFAllocatorRef, fsRef: *const FSRef) -> CFURLRef
    pub fn CFURLCreateWithBytes(
        allocator: CFAllocatorRef,
        URLBytes: *const u8,
        length: CFIndex,
        encoding: CFStringEncoding,
        baseURL: CFURLRef,
    ) -> CFURLRef;
    pub fn CFURLCreateWithFileSystemPath(
        allocator: CFAllocatorRef,
        filePath: CFStringRef,
        pathStyle: CFURLPathStyle,
        isDirectory: Boolean,
    ) -> CFURLRef;
    pub fn CFURLCreateWithFileSystemPathRelativeToBase(
        allocator: CFAllocatorRef,
        filePath: CFStringRef,
        pathStyle: CFURLPathStyle,
        isDirectory: Boolean,
        baseURL: CFURLRef,
    ) -> CFURLRef;
    pub fn CFURLCreateWithString(
        allocator: CFAllocatorRef,
        URLString: CFStringRef,
        baseURL: CFURLRef,
    ) -> CFURLRef;

    /* Accessing the Parts of a URL */
    pub fn CFURLCanBeDecomposed(anURL: CFURLRef) -> Boolean;
    pub fn CFURLCopyFileSystemPath(anURL: CFURLRef, pathStyle: CFURLPathStyle) -> CFStringRef;
    pub fn CFURLCopyFragment(anURL: CFURLRef, charactersToLeaveEscaped: CFStringRef)
        -> CFStringRef;
    pub fn CFURLCopyHostName(anURL: CFURLRef) -> CFStringRef;
    pub fn CFURLCopyLastPathComponent(anURL: CFURLRef) -> CFStringRef;
    pub fn CFURLCopyNetLocation(anURL: CFURLRef) -> CFStringRef;
    pub fn CFURLCopyParameterString(
        anURL: CFURLRef,
        charactersToLeaveEscaped: CFStringRef,
    ) -> CFStringRef; // deprecated
    pub fn CFURLCopyPassword(anURL: CFURLRef) -> CFStringRef;
    pub fn CFURLCopyPath(anURL: CFURLRef) -> CFStringRef;
    pub fn CFURLCopyPathExtension(anURL: CFURLRef) -> CFStringRef;
    pub fn CFURLCopyQueryString(
        anURL: CFURLRef,
        charactersToLeaveEscaped: CFStringRef,
    ) -> CFStringRef;
    pub fn CFURLCopyResourceSpecifier(anURL: CFURLRef) -> CFStringRef;
    pub fn CFURLCopyScheme(anURL: CFURLRef) -> CFStringRef;
    pub fn CFURLCopyStrictPath(anURL: CFURLRef, isAbsolute: *mut Boolean) -> CFStringRef;
    pub fn CFURLCopyUserName(anURL: CFURLRef) -> CFStringRef;
    pub fn CFURLGetPortNumber(anURL: CFURLRef) -> SInt32;
    pub fn CFURLHasDirectoryPath(anURL: CFURLRef) -> Boolean;

    /* Converting URLs to Other Representations */
    pub fn CFURLCreateData(
        allocator: CFAllocatorRef,
        url: CFURLRef,
        encoding: CFStringEncoding,
        escapeWhitespace: Boolean,
    ) -> CFDataRef;
    pub fn CFURLCreateStringByAddingPercentEscapes(
        allocator: CFAllocatorRef,
        originalString: CFStringRef,
        charactersToLeaveUnescaped: CFStringRef,
        legalURLCharactersToBeEscaped: CFStringRef,
        encoding: CFStringEncoding,
    ) -> CFStringRef; // API_DEPRECATED("Use [NSString stringByAddingPercentEncodingWithAllowedCharacters:] instead, which always uses the recommended UTF-8 encoding, and which encodes for a specific URL component or subcomponent (since each URL component or subcomponent has different rules for what characters are valid).", macos(10.0,10.11), ios(2.0,9.0), watchos(2.0,2.0), tvos(9.0,9.0));
    pub fn CFURLCreateStringByReplacingPercentEscapes(
        allocator: CFAllocatorRef,
        originalString: CFStringRef,
        charactersToLeaveEscaped: CFStringRef,
    ) -> CFStringRef;
    pub fn CFURLCreateStringByReplacingPercentEscapesUsingEncoding(
        allocator: CFAllocatorRef,
        origString: CFStringRef,
        charsToLeaveEscaped: CFStringRef,
        encoding: CFStringEncoding,
    ) -> CFStringRef; // deprecated
    pub fn CFURLGetFileSystemRepresentation(
        anURL: CFURLRef,
        resolveAgainstBase: Boolean,
        buffer: *mut u8,
        maxBufLen: CFIndex,
    ) -> Boolean;
    //pub fn CFURLIsFileReferenceURL(url: CFURLRef) -> Boolean; // macos(10.9)+
    //pub fn CFURLGetFSRef(url: CFURLRef, fsRef: *mut FSRef) -> Boolean;
    pub fn CFURLGetString(anURL: CFURLRef) -> CFStringRef;

    /* Getting URL Properties */
    pub fn CFURLGetBaseURL(anURL: CFURLRef) -> CFURLRef;
    pub fn CFURLGetBytes(anURL: CFURLRef, buffer: *mut u8, bufferLength: CFIndex) -> CFIndex;
    pub fn CFURLGetByteRangeForComponent(
        url: CFURLRef,
        component: CFURLComponentType,
        rangeIncludingSeparators: *mut CFRange,
    ) -> CFRange;
    pub fn CFURLGetTypeID() -> CFTypeID;
    pub fn CFURLResourceIsReachable(url: CFURLRef, error: *mut CFErrorRef) -> Boolean;

    /* Getting and Setting File System Resource Properties */
    pub fn CFURLClearResourcePropertyCache(url: CFURLRef);
    pub fn CFURLClearResourcePropertyCacheForKey(url: CFURLRef, key: CFStringRef);
    pub fn CFURLCopyResourcePropertiesForKeys(
        url: CFURLRef,
        keys: CFArrayRef,
        error: *mut CFErrorRef,
    ) -> CFDictionaryRef;
    //pub fn CFURLCopyResourcePropertyForKey(url: CFURLRef, key: CFStringRef, propertyValueTypeRefPtr: *mut c_void, error: *mut CFErrorRef) -> Boolean
    pub fn CFURLCreateResourcePropertiesForKeysFromBookmarkData(
        allocator: CFAllocatorRef,
        resourcePropertiesToReturn: CFArrayRef,
        bookmark: CFDataRef,
    ) -> CFDictionaryRef;
    pub fn CFURLCreateResourcePropertyForKeyFromBookmarkData(
        allocator: CFAllocatorRef,
        resourcePropertyKey: CFStringRef,
        bookmark: CFDataRef,
    ) -> CFTypeRef;
    pub fn CFURLSetResourcePropertiesForKeys(
        url: CFURLRef,
        keyedPropertyValues: CFDictionaryRef,
        error: *mut CFErrorRef,
    ) -> Boolean;
    pub fn CFURLSetResourcePropertyForKey(
        url: CFURLRef,
        key: CFStringRef,
        value: CFTypeRef,
        error: *mut CFErrorRef,
    ) -> Boolean;
    pub fn CFURLSetTemporaryResourcePropertyForKey(
        url: CFURLRef,
        key: CFStringRef,
        propertyValue: CFTypeRef,
    );

    /* Working with Bookmark Data */
    pub fn CFURLCreateBookmarkData(
        allocator: CFAllocatorRef,
        url: CFURLRef,
        options: CFURLBookmarkCreationOptions,
        resourcePropertiesToInclude: CFArrayRef,
        relativeToURL: CFURLRef,
        error: *mut CFErrorRef,
    ) -> CFDataRef;

    #[cfg(target_os = "macos")]
    pub fn CFURLCreateBookmarkDataFromAliasRecord(
        allocator: CFAllocatorRef,
        aliasRecordDataRef: CFDataRef,
    ) -> CFDataRef; // deprecated

    pub fn CFURLCreateBookmarkDataFromFile(
        allocator: CFAllocatorRef,
        fileURL: CFURLRef,
        errorRef: *mut CFErrorRef,
    ) -> CFDataRef;
    pub fn CFURLWriteBookmarkDataToFile(
        bookmarkRef: CFDataRef,
        fileURL: CFURLRef,
        options: CFURLBookmarkFileCreationOptions,
        errorRef: *mut CFErrorRef,
    ) -> Boolean;
    pub fn CFURLStartAccessingSecurityScopedResource(url: CFURLRef) -> Boolean;
    pub fn CFURLStopAccessingSecurityScopedResource(url: CFURLRef);
}

#[test]
#[cfg(feature = "mac_os_10_8_features")]
fn can_see_excluded_from_backup_key() {
    let _ = unsafe { kCFURLIsExcludedFromBackupKey };
}