// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//


/*	CFURLComponents_Internal.h
	Copyright (c) 2015, Apple Inc. All rights reserved.
*/

#ifndef CFURLComponents_Internal_h
#define CFURLComponents_Internal_h

#include <CoreFoundation/CFString.h>

// _URIParseInfo keeps track of what parts of a parsed uriReference are
// present and the offset of where they start in the uriReference.
struct _URIParseInfo {
    // schemeOffset is not needed because if there is a scheme, it is always at offset 0.
    unsigned long	userinfoNameOffset;
    unsigned long	userinfoPasswordOffset;
    unsigned long	hostOffset;
    unsigned long	portOffset;
    unsigned long	pathOffset;
    unsigned long	paramOffset;			// param is obsolete, but old API needs it.
    unsigned long	queryOffset;
    unsigned long	fragmentOffset;
    unsigned long	endOffset;
    
    // set if the URI component/subcomponent exists
    unsigned long	schemeExists            : 1;
    unsigned long	authorityExists         : 1;    // this tells us if the hier-part of relative-part was in the form: "//" authority path-abempty
    unsigned long	userinfoNameExists      : 1;
    unsigned long	userinfoPasswordExists	: 1;
    unsigned long	hostExists              : 1;
    unsigned long	portExists              : 1;
    // pathExists is not needed because there's always a path... it just might be zero length.
    unsigned long	paramExists             : 1;    // param is obsolete, but old API needs it.
    unsigned long	queryExists             : 1;
    unsigned long	fragmentExists          : 1;
};

typedef CF_ENUM(unsigned short, _CFURIParserURLAllowedCharacter) {
    kURLSchemeAllowed	= 0x0001,
    kURLUserAllowed	= 0x0002,
    kURLPasswordAllowed	= 0x0004,
    kURLHostAllowed	= 0x0008,
    kURLPortAllowed	= 0x0010,
    kURLPathAllowed	= 0x0020,
    kURLQueryAllowed	= 0x0040,
    kURLFragmentAllowed	= 0x0080,
    kURLHexDigAllowed	= 0x0100,
    kURLAlphaAllowed	= 0x0200,
};

CF_PRIVATE Boolean _CFURIParserParseURIReference(CFStringRef urlString, struct _URIParseInfo *parseInfo);
CF_PRIVATE CFRange _CFURIParserGetSchemeRange(const struct _URIParseInfo *parseInfo, Boolean includeSeparators);
CF_PRIVATE CFRange _CFURIParserGetUserinfoNameRange(const struct _URIParseInfo *parseInfo, Boolean includeSeparators);
CF_PRIVATE CFRange _CFURIParserGetUserinfoPasswordRange(const struct _URIParseInfo *parseInfo, Boolean includeSeparators);
CF_PRIVATE CFRange _CFURIParserGetHostRange(const struct _URIParseInfo *parseInfo, Boolean includeSeparators);
CF_PRIVATE CFRange _CFURIParserGetPortRange(const struct _URIParseInfo *parseInfo, Boolean includeSeparators);
CF_PRIVATE CFRange _CFURIParserGetPathRange(const struct _URIParseInfo *parseInfo, Boolean includeSeparators, Boolean minusParam);
CF_PRIVATE CFRange _CFURIParserGetQueryRange(const struct _URIParseInfo *parseInfo, Boolean includeSeparators);
CF_PRIVATE CFRange _CFURIParserGetFragmentRange(const struct _URIParseInfo *parseInfo, Boolean includeSeparators);
CF_PRIVATE Boolean _CFURIParserAlphaAllowed(UniChar ch);
CF_PRIVATE Boolean _CFURIParserValidateComponent(CFStringRef urlString, CFRange componentRange, _CFURIParserURLAllowedCharacter allowedMask, Boolean pctEncodedAllowed);
CF_PRIVATE Boolean _CFURIParserURLStringIsValid(CFStringRef urlString, struct _URIParseInfo *parseInfo);

#endif /* CFURLComponents_Internal_h */
