/*
 	File:		URLAccess.h
 
 	Contains:	URL Access Interfaces.
 
 	Version:	Technology:	URLAccess 2.0
 				Release:	QuickTime 4.1
 
 	Copyright:	(c) 1994-1999 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 __URLACCESS__
#define __URLACCESS__

#ifndef __MACTYPES__
	#include <MacTypes.h>
#endif

#ifndef __FILES__
	#include <Files.h>
#endif

#ifndef __CODEFRAGMENTS__
	#include <CodeFragments.h>
#endif

#ifndef __FILESIGNING__
	#include <FileSigning.h>
#endif

#ifndef __MACERRORS__
	#include <MacErrors.h>
#endif




#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

/* Data structures and types */
typedef struct OpaqueURLReference* 		URLReference;

typedef UInt32 URLOpenFlags;
enum {
	kURLReplaceExistingFlag		= 1 << 0,
	kURLBinHexFileFlag			= 1 << 1,						/* Binhex before uploading if necessary*/
	kURLExpandFileFlag			= 1 << 2,						/* Use StuffIt engine to expand file if necessary*/
	kURLDisplayProgressFlag		= 1 << 3,
	kURLDisplayAuthFlag			= 1 << 4,						/* Display auth dialog if guest connection fails*/
	kURLUploadFlag				= 1 << 5,						/* Do an upload instead of a download*/
	kURLIsDirectoryHintFlag		= 1 << 6,						/* Hint: the URL is a directory*/
	kURLDoNotTryAnonymousFlag	= 1 << 7,						/* Don't try to connect anonymously before getting logon info*/
	kURLDirectoryListingFlag	= 1 << 8,						/* Download the directory listing, not the whole directory*/
	kURLExpandAndVerifyFlag		= 1 << 9,						/* Expand file and then verify using signature resource*/
	kURLNoAutoRedirectFlag		= 1 << 10,						/* Do not automatically redirect to new URL*/
	kURLDebinhexOnlyFlag		= 1 << 11,						/* Do not use Stuffit Expander - just internal debinhex engine*/
	kURLReservedFlag			= 1 << 31						/* reserved for Apple internal use*/
};


typedef UInt32 URLState;
enum {
	kURLNullState				= 0,
	kURLInitiatingState			= 1,
	kURLLookingUpHostState		= 2,
	kURLConnectingState			= 3,
	kURLResourceFoundState		= 4,
	kURLDownloadingState		= 5,
	kURLDataAvailableState		= 0x10 + kURLDownloadingState,
	kURLTransactionCompleteState = 6,
	kURLErrorOccurredState		= 7,
	kURLAbortingState			= 8,
	kURLCompletedState			= 9,
	kURLUploadingState			= 10
};


typedef UInt32 URLEvent;
enum {
	kURLInitiatedEvent			= kURLInitiatingState,
	kURLResourceFoundEvent		= kURLResourceFoundState,
	kURLDownloadingEvent		= kURLDownloadingState,
	kURLAbortInitiatedEvent		= kURLAbortingState,
	kURLCompletedEvent			= kURLCompletedState,
	kURLErrorOccurredEvent		= kURLErrorOccurredState,
	kURLDataAvailableEvent		= kURLDataAvailableState,
	kURLTransactionCompleteEvent = kURLTransactionCompleteState,
	kURLUploadingEvent			= kURLUploadingState,
	kURLSystemEvent				= 29,
	kURLPercentEvent			= 30,
	kURLPeriodicEvent			= 31,
	kURLPropertyChangedEvent	= 32
};

typedef unsigned long 					URLEventMask;
enum {
	kURLInitiatedEventMask		= 1 << (kURLInitiatedEvent - 1),
	kURLResourceFoundEventMask	= 1 << (kURLResourceFoundEvent - 1),
	kURLDownloadingMask			= 1 << (kURLDownloadingEvent - 1),
	kURLUploadingMask			= 1 << (kURLUploadingEvent - 1),
	kURLAbortInitiatedMask		= 1 << (kURLAbortInitiatedEvent - 1),
	kURLCompletedEventMask		= 1 << (kURLCompletedEvent - 1),
	kURLErrorOccurredEventMask	= 1 << (kURLErrorOccurredEvent - 1),
	kURLDataAvailableEventMask	= 1 << (kURLDataAvailableEvent - 1),
	kURLTransactionCompleteEventMask = 1 << (kURLTransactionCompleteEvent - 1),
	kURLSystemEventMask			= 1 << (kURLSystemEvent - 1),
	kURLPercentEventMask		= 1 << (kURLPercentEvent - 1),
	kURLPeriodicEventMask		= 1 << (kURLPeriodicEvent - 1),
	kURLPropertyChangedEventMask = 1 << (kURLPropertyChangedEvent - 1),
	kURLAllBufferEventsMask		= kURLDataAvailableEventMask + kURLTransactionCompleteEventMask,
	kURLAllNonBufferEventsMask	= kURLInitiatedEventMask + kURLDownloadingMask + kURLUploadingMask + kURLAbortInitiatedMask + kURLCompletedEventMask + kURLErrorOccurredEventMask + kURLPercentEventMask + kURLPeriodicEventMask + kURLPropertyChangedEventMask,
	kURLAllEventsMask			= (long)0xFFFFFFFF
};



struct URLCallbackInfo {
	UInt32 							version;
	URLReference 					urlRef;
	const char *					property;
	UInt32 							currentSize;
	EventRecord *					systemEvent;
};
typedef struct URLCallbackInfo			URLCallbackInfo;
static const char* kURLURL						= "URLString";
static const char* kURLResourceSize				= "URLResourceSize";
static const char* kURLLastModifiedTime			= "URLLastModifiedTime";
static const char* kURLMIMEType					= "URLMIMEType";
static const char* kURLFileType					= "URLFileType";
static const char* kURLFileCreator				= "URLFileCreator";
static const char* kURLCharacterSet				= "URLCharacterSet";
static const char* kURLResourceName				= "URLResourceName";
static const char* kURLHost						= "URLHost";
static const char* kURLAuthType					= "URLAuthType";
static const char* kURLUserName					= "URLUserName";
static const char* kURLPassword					= "URLPassword";
static const char* kURLStatusString				= "URLStatusString";
static const char* kURLIsSecure					= "URLIsSecure";
static const char* kURLCertificate				= "URLCertificate";
static const char* kURLTotalItems				= "URLTotalItems";
/* http and https properties*/
static const char* kURLHTTPRequestMethod		= "URLHTTPRequestMethod";
static const char* kURLHTTPRequestHeader		= "URLHTTPRequestHeader";
static const char* kURLHTTPRequestBody			= "URLHTTPRequestBody";
static const char* kURLHTTPRespHeader			= "URLHTTPRespHeader";
static const char* kURLHTTPUserAgent			= "URLHTTPUserAgent";
static const char* kURLHTTPRedirectedURL		= "URLHTTPRedirectedURL";
/* authentication type flags*/
enum {
	kUserNameAndPasswordFlag	= 0x00000001
};

EXTERN_API( OSStatus )
URLGetURLAccessVersion			(UInt32 *				returnVers);

#if TARGET_RT_MAC_CFM
#ifdef __cplusplus
	inline pascal Boolean URLAccessAvailable() { return ((URLGetURLAccessVersion != (void*)kUnresolvedCFragSymbolAddress) ); }
#else
	#define URLAccessAvailable() 	((URLGetURLAccessVersion != (void*)kUnresolvedCFragSymbolAddress) )
#endif
#elif TARGET_RT_MAC_MACHO
/* URL Access is always available on OS X */
#ifdef __cplusplus
	inline pascal Boolean URLAccessAvailable() { return true; }
#else
	#define URLAccessAvailable() 	(true)
#endif
#endif  /*  */

typedef CALLBACK_API( OSStatus , URLNotifyProcPtr )(void *userContext, URLEvent event, URLCallbackInfo *callbackInfo);
typedef CALLBACK_API( OSStatus , URLSystemEventProcPtr )(void *userContext, EventRecord *event);
typedef TVECTOR_UPP_TYPE(URLNotifyProcPtr) 						URLNotifyUPP;
typedef TVECTOR_UPP_TYPE(URLSystemEventProcPtr) 				URLSystemEventUPP;
#if OPAQUE_UPP_TYPES
	EXTERN_API(URLNotifyUPP)
	NewURLNotifyUPP				   (URLNotifyProcPtr		userRoutine);

	EXTERN_API(URLSystemEventUPP)
	NewURLSystemEventUPP		   (URLSystemEventProcPtr	userRoutine);

	EXTERN_API(void)
	DisposeURLNotifyUPP			   (URLNotifyUPP			userUPP);

	EXTERN_API(void)
	DisposeURLSystemEventUPP	   (URLSystemEventUPP		userUPP);

	EXTERN_API(OSStatus)
	InvokeURLNotifyUPP			   (void *					userContext,
									URLEvent				event,
									URLCallbackInfo *		callbackInfo,
									URLNotifyUPP			userUPP);

	EXTERN_API(OSStatus)
	InvokeURLSystemEventUPP		   (void *					userContext,
									EventRecord *			event,
									URLSystemEventUPP		userUPP);

#else
	#define NewURLNotifyUPP(userRoutine)							(userRoutine)
	#define NewURLSystemEventUPP(userRoutine)						(userRoutine)
	#define DisposeURLNotifyUPP(userUPP) 							
	#define DisposeURLSystemEventUPP(userUPP) 						
	#define InvokeURLNotifyUPP(userContext, event, callbackInfo, userUPP)  (*userUPP)(userContext, event, callbackInfo)
	#define InvokeURLSystemEventUPP(userContext, event, userUPP) 	(*userUPP)(userContext, event)
#endif
EXTERN_API( OSStatus )
URLSimpleDownload				(const char *			url,
								 FSSpec *				destination,
								 Handle 				destinationHandle,
								 URLOpenFlags 			openFlags,
								 URLSystemEventUPP 		eventProc,
								 void *					userContext);

EXTERN_API( OSStatus )
URLDownload						(URLReference 			urlRef,
								 FSSpec *				destination,
								 Handle 				destinationHandle,
								 URLOpenFlags 			openFlags,
								 URLSystemEventUPP 		eventProc,
								 void *					userContext);

EXTERN_API( OSStatus )
URLSimpleUpload					(const char *			url,
								 const FSSpec *			source,
								 URLOpenFlags 			openFlags,
								 URLSystemEventUPP 		eventProc,
								 void *					userContext);

EXTERN_API( OSStatus )
URLUpload						(URLReference 			urlRef,
								 const FSSpec *			source,
								 URLOpenFlags 			openFlags,
								 URLSystemEventUPP 		eventProc,
								 void *					userContext);

EXTERN_API( OSStatus )
URLNewReference					(const char *			url,
								 URLReference *			urlRef);

EXTERN_API( OSStatus )
URLDisposeReference				(URLReference 			urlRef);

EXTERN_API( OSStatus )
URLOpen							(URLReference 			urlRef,
								 FSSpec *				fileSpec,
								 URLOpenFlags 			openFlags,
								 URLNotifyUPP 			notifyProc,
								 URLEventMask 			eventRegister,
								 void *					userContext);

EXTERN_API( OSStatus )
URLAbort						(URLReference 			urlRef);

EXTERN_API( OSStatus )
URLGetDataAvailable				(URLReference 			urlRef,
								 Size *					dataSize);

EXTERN_API( OSStatus )
URLGetBuffer					(URLReference 			urlRef,
								 void **				buffer,
								 Size *					bufferSize);

EXTERN_API( OSStatus )
URLReleaseBuffer				(URLReference 			urlRef,
								 void *					buffer);

EXTERN_API( OSStatus )
URLGetProperty					(URLReference 			urlRef,
								 const char *			property,
								 void *					propertyBuffer,
								 Size 					bufferSize);

EXTERN_API( OSStatus )
URLGetPropertySize				(URLReference 			urlRef,
								 const char *			property,
								 Size *					propertySize);

EXTERN_API( OSStatus )
URLSetProperty					(URLReference 			urlRef,
								 const char *			property,
								 void *					propertyBuffer,
								 Size 					bufferSize);

EXTERN_API( OSStatus )
URLGetCurrentState				(URLReference 			urlRef,
								 URLState *				state);

EXTERN_API( OSStatus )
URLGetError						(URLReference 			urlRef,
								 OSStatus *				urlError);

EXTERN_API( OSStatus )
URLIdle							(void);

EXTERN_API( OSStatus )
URLGetFileInfo					(StringPtr 				fName,
								 OSType *				fType,
								 OSType *				fCreator);


#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 /* __URLACCESS__ */

