/*
     File:       CFURLAccess.h
 
     Contains:   CoreFoundation url access
 
     Version:    Technology: Mac OS X
                 Release:    QuickTime 6.0.2
 
     Copyright:  (c) 1999-2001 by Apple Computer, Inc., all rights reserved
 
     Bugs?:      For bug reports, consult the following page on
                 the World Wide Web:
 
                     http://developer.apple.com/bugreporter/
 
*/
#ifndef __CFURLACCESS__
#define __CFURLACCESS__

#ifndef __CFURL__
#include "CFURL.h"
#endif

#ifndef __CFARRAY__
#include "CFArray.h"
#endif

#ifndef __CFDATA__
#include "CFData.h"
#endif

#ifndef __CFDICTIONARY__
#include "CFDictionary.h"
#endif

#ifndef __CFSTRING__
#include "CFString.h"
#endif


/* Fills buffer with the file system's native representation of url's */
/* path. No more than bufLen bytes are written to buffer.  If resolveAgainstBase */
/* is true, the url's relative portion is resolved against its base before */
/* the path is computed.  usedBufLen is set to the number of bytes actually */
/* written; returns success or failure. */


#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
    #pragma pack(2)
#endif

#if PRAGMA_ENUM_ALWAYSINT
    #if defined(__fourbyteints__) && !__fourbyteints__ 
        #define __CFURLACCESS__RESTORE_TWOBYTEINTS
        #pragma fourbyteints on
    #endif
    #pragma enumsalwaysint on
#elif PRAGMA_ENUM_OPTIONS
    #pragma option enum=int
#elif PRAGMA_ENUM_PACK
    #if __option(pack_enums)
        #define __CFURLACCESS__RESTORE_PACKED_ENUMS
        #pragma options(!pack_enums)
    #endif
#endif

EXTERN_API_C( Boolean )
CFURLGetFileSystemRepresentation (CFURLRef              url,
                                 Boolean                resolveAgainstBase,
                                 char *                 buffer,
                                 CFIndex                bufLen);

EXTERN_API_C( CFURLRef )
CFURLCreateFromFileSystemRepresentation (CFAllocatorRef  allocator,
                                 const char *           buffer,
                                 CFIndex                bufLen,
                                 Boolean                isDirectory);

/* Attempts to read the data and properties for the given URL. */
/* If only interested in one of the resourceData and properties, pass */
/* NULL for the other.  If properties is non-NULL and desiredProperties */
/* is NULL, then all properties are fetched.  Returns success or failure; */
/* note that as much work as possible is done even if FALSE is returned. */
/* So for instance if one property is not available, the others are fetched */
/* anyway. errorCode is set to 0 on success, and some other value on failure. */
/* If non-NULL, it is the caller 's responsibility to release resourceData */
/* and properties. */
/* Apple reserves for its use all negative error code values; these values */
/* represent errors common to any scheme.  Scheme-specific error codes */
/* should be positive, non-zero, and should be used only if one of the */
/* predefined Apple error codes does not apply.  Error codes should be */
/* publicized and documented with the scheme-specific properties. */
EXTERN_API_C( Boolean )
CFURLCreateDataAndPropertiesFromResource (CFAllocatorRef  alloc,
                                 CFURLRef               url,
                                 CFDataRef *            resourceData,
                                 CFDictionaryRef *      properties,
                                 CFArrayRef             desiredProperties,
                                 SInt32 *               errorCode);

/* Attempts to write the given data and properties to the given URL. */
/* If dataToWrite is NULL, only properties are written out (use */
/* CFURLDestroyResource() to delete a resource).  Properties not present */
/* in propertiesToWrite are left unchanged, hence if propertiesToWrite */
/* is NULL or empty, the URL's properties are not changed at all. */
/* Returns success or failure; errorCode is set as for */
/* CFURLCreateDataAndPropertiesFromResource(), above. */
EXTERN_API_C( Boolean )
CFURLWriteDataAndPropertiesToResource (CFURLRef         url,
                                 CFDataRef              dataToWrite,
                                 CFDictionaryRef        propertiesToWrite,
                                 SInt32 *               errorCode);

/* Destroys the resource indicated by url. */
/* Returns success or failure; errorCode set as above. */
EXTERN_API_C( Boolean )
CFURLDestroyResource            (CFURLRef               url,
                                 SInt32 *               errorCode);

/* Convenience method which calls through to CFURLCreateDataAndPropertiesFromResource(). */
/* Returns NULL on error and sets errorCode accordingly. */
EXTERN_API_C( CFTypeRef )
CFURLCreatePropertyFromResource (CFAllocatorRef         alloc,
                                 CFURLRef               url,
                                 CFStringRef            property,
                                 SInt32 *               errorCode);

/* Common error codes; this list is expected to grow */
enum {
    kCFURLUnknownError          = -10,
    kCFURLUnknownSchemeError    = -11,
    kCFURLResourceNotFoundError = -12,
    kCFURLResourceAccessViolationError = -13,
    kCFURLRemoteHostUnavailableError = -14,
    kCFURLImproperArgumentsError = -15,
    kCFURLUnknownPropertyKeyError = -16,
    kCFURLPropertyKeyUnavailableError = -17,
    kCFURLTimeoutError          = -18
};

/* Properties and error codes for the file: scheme.  These are ad hoc and expected to change */
extern const CFStringRef kCFFileURLExists;
extern const CFStringRef kCFFileURLPOSIXMode;
extern const CFStringRef kCFFileURLDirectoryContents;
extern const CFStringRef kCFFileURLSize;
extern const CFStringRef kCFFileURLLastModificationTime;
extern const CFStringRef kCFHTTPURLStatusCode;
extern const CFStringRef kCFHTTPURLStatusLine;
/* kCFFileURLExists is set to kCFFileURLExists if the file exists; any other value if not */
/* kCFFileURLPOSIXMode encompasses permissions and file type; use the POSIX masks in stat.h */
/* to get specifics.  Value is a CFData wrapped around a mode_t */
/* kCFFileURLDirectoryContents value is a CFArray with containing URLs for the directory's contents. */
/* Empty array means the directory exists, but is empty. */
/* NULL value (but no failure) means the URL exists but is not a directory. */
/* Not settable */
/* kCFHTTPURLStatusCode and kCFHTTPURLStatusLine are properties for the http: scheme. */
/* Except for the common error */
/* codes, above, errorCode will be set to the HTTP response status */
/* code upon failure.  The status code is a CFNumber, the status line is a CFString.  */

#if PRAGMA_ENUM_ALWAYSINT
    #pragma enumsalwaysint reset
    #ifdef __CFURLACCESS__RESTORE_TWOBYTEINTS
        #pragma fourbyteints off
    #endif
#elif PRAGMA_ENUM_OPTIONS
    #pragma option enum=reset
#elif defined(__CFURLACCESS__RESTORE_PACKED_ENUMS)
    #pragma options(pack_enums)
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
    #pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __CFURLACCESS__ */

