2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/** @file
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * IPRT - Uniform Resource Identifier handling.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/*
c1d279fc0865b91a40b30eda02ed14f6533fe1a4vboxsync * Copyright (C) 2011-2015 Oracle Corporation
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * available from http://www.virtualbox.org. This file is free software;
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * you can redistribute it and/or modify it under the terms of the GNU
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * General Public License (GPL) as published by the Free Software
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * The contents of this file may alternatively be used under the terms
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * of the Common Development and Distribution License Version 1.0
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * VirtualBox OSE distribution, in which case the provisions of the
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * CDDL are applicable instead of those of the GPL.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * You may elect to license modified versions of this file under the
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * terms and conditions of either the GPL or the CDDL or both.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync#ifndef ___iprt_uri_h
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync#define ___iprt_uri_h
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync#include <iprt/cdefs.h>
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync#include <iprt/types.h>
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsyncRT_C_DECLS_BEGIN
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/** @defgroup grp_rt_uri RTUri - Uri parsing and creation
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * URI parsing and creation based on RFC 3986.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * See http://datatracker.ietf.org/doc/rfc3986/ for the full specification.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @note Currently it isn't the full specification implemented.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @note Currently only some generic URI support and a minimum File(file:) URI
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * support is implemented. Other specific scheme support, like html:, ldap:,
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * data:, ..., is missing.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @see grp_rt_uri_file
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @ingroup grp_rt
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @{
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/**
9f5022d1e64319833d6f94d166585ad0dee5ca58vboxsync * Creates a generic URI. The returned pointer must be freed
9f5022d1e64319833d6f94d166585ad0dee5ca58vboxsync * using RTStrFree().
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @returns the new URI on success, NULL otherwise.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszScheme The URI scheme.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszAuthority The authority part of the URI (optional).
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszPath The path part of the URI (optional).
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszQuery The query part of the URI (optional).
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszFragment The fragment part of the URI (optional).
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsyncRTR3DECL(char *) RTUriCreate(const char *pszScheme, const char *pszAuthority, const char *pszPath, const char *pszQuery, const char *pszFragment);
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/**
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * Check an string for a specific URI scheme.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @returns true if the scheme match, false if not.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszUri The URI to check.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszScheme The scheme to compare with.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsyncRTR3DECL(bool) RTUriHasScheme(const char *pszUri, const char *pszScheme);
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/**
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * Extract the scheme out of an URI.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @returns the scheme if the URI is valid, NULL otherwise.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszUri The URI to extract from.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsyncRTR3DECL(char *) RTUriScheme(const char *pszUri);
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/**
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * Extract the authority out of an URI.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @returns the authority if the URI contains one, NULL otherwise.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszUri The URI to extract from.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsyncRTR3DECL(char *) RTUriAuthority(const char *pszUri);
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/**
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * Extract the path out of an URI.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @returns the path if the URI contains one, NULL otherwise.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszUri The URI to extract from.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsyncRTR3DECL(char *) RTUriPath(const char *pszUri);
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/**
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * Extract the query out of an URI.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @returns the query if the URI contains one, NULL otherwise.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszUri The URI to extract from.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsyncRTR3DECL(char *) RTUriQuery(const char *pszUri);
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/**
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * Extract the fragment out of an URI.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @returns the fragment if the URI contains one, NULL otherwise.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszUri The URI to extract from.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsyncRTR3DECL(char *) RTUriFragment(const char *pszUri);
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/** @defgroup grp_rt_uri_file RTUriFile - Uri file parsing and creation
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * Adds file: scheme support to the generic RTUri interface. This is partly
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * documented in http://datatracker.ietf.org/doc/rfc1738/.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @{
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/** Auto detect in which format a path is returned. */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync#define URI_FILE_FORMAT_AUTO UINT32_C(0)
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/** Return a path in UNIX format style. */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync#define URI_FILE_FORMAT_UNIX UINT32_C(1)
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/** Return a path in Windows format style. */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync#define URI_FILE_FORMAT_WIN UINT32_C(2)
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/**
cad7466b8b302baa2f6a79abb9b7da2912cf43dbvboxsync * Creates a file URI. The returned pointer must be freed
cad7466b8b302baa2f6a79abb9b7da2912cf43dbvboxsync * using RTStrFree().
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @see RTUriCreate
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @returns the new URI on success, NULL otherwise.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszPath The path of the URI.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsyncRTR3DECL(char *) RTUriFileCreate(const char *pszPath);
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/**
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * Returns the file path encoded in the URI.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @returns the path if the URI contains one, NULL otherwise.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszUri The URI to extract from.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param uFormat In which format should the path returned.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsyncRTR3DECL(char *) RTUriFilePath(const char *pszUri, uint32_t uFormat);
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/**
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * Returns the file path encoded in the URI, given a max string length.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync *
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @returns the path if the URI contains one, NULL otherwise.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param pszUri The URI to extract from.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param uFormat In which format should the path returned.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync * @param cbMax The max string length to inspect.
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsyncRTR3DECL(char *) RTUriFileNPath(const char *pszUri, uint32_t uFormat, size_t cchMax);
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/** @} */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync/** @} */
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsyncRT_C_DECLS_END
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync#endif
2eca2a2fb6e205bccf07ee440e48881cffb8959avboxsync