X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_url.h;h=820250f963fbc31ff56ef1e866fe6bd020686ef0;hb=0103fd959a37be1ccc9ee5c59fb84f9610b0bc74;hp=dc2a021031a408e0ac5b849790189e72a62eafbb;hpb=bbd5ed6247b2b683af3beeda0e727e4072c9bd09;p=vlc diff --git a/include/vlc_url.h b/include/vlc_url.h index dc2a021031..820250f963 100644 --- a/include/vlc_url.h +++ b/include/vlc_url.h @@ -1,25 +1,25 @@ /***************************************************************************** * vlc_url.h: URL related macros ***************************************************************************** - * Copyright (C) 2002-2006 the VideoLAN team + * Copyright (C) 2002-2006 VLC authors and VideoLAN * $Id$ * * Authors: Christophe Massiot * Rémi Denis-Courmont * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #ifndef VLC_URL_H @@ -30,202 +30,26 @@ * This file defines functions for manipulating URL in vlc */ +VLC_API char *vlc_path2uri (const char *path, const char *scheme) VLC_MALLOC; + struct vlc_url_t { char *psz_protocol; char *psz_username; char *psz_password; char *psz_host; - int i_port; - + unsigned i_port; char *psz_path; - char *psz_option; char *psz_buffer; /* to be freed */ }; -VLC_EXPORT( char *, unescape_URI_duplicate, ( const char *psz ) ); -VLC_EXPORT( void, unescape_URI, ( char *psz ) ); -VLC_EXPORT( char *, decode_URI_duplicate, ( const char *psz ) ); -VLC_EXPORT( void, decode_URI, ( char *psz ) ); -VLC_EXPORT( char *, encode_URI_component, ( const char *psz ) ); - -/***************************************************************************** - * vlc_UrlParse: - ***************************************************************************** - * option : if != 0 then path is split at this char - * - * format [protocol://[login[:password]@]][host[:port]]/path[OPTIONoption] - *****************************************************************************/ -static inline void vlc_UrlParse( vlc_url_t *url, const char *psz_url, - char option ) -{ - char *psz_dup; - char *psz_parse; - char *p; - char *p2; - - url->psz_protocol = NULL; - url->psz_username = NULL; - url->psz_password = NULL; - url->psz_host = NULL; - url->i_port = 0; - url->psz_path = NULL; - url->psz_option = NULL; - - if( psz_url == NULL ) - { - url->psz_buffer = NULL; - return; - } - url->psz_buffer = psz_parse = psz_dup = strdup( psz_url ); - - /* Search a valid protocol */ - p = strstr( psz_parse, ":/" ); - if( p != NULL ) - { - for( p2 = psz_parse; p2 < p; p2++ ) - { -#define I(i,a,b) ( (a) <= (i) && (i) <= (b) ) - if( !I(*p2, 'a', 'z' ) && !I(*p2, 'A', 'Z') && !I(*p2, '0', '9') && *p2 != '+' && *p2 != '-' && *p2 != '.' ) - { - p = NULL; - break; - } -#undef I - } - } - - if( p != NULL ) - { - /* we have a protocol */ - - /* skip :// */ - *p++ = '\0'; - if( p[1] == '/' ) - p += 2; - url->psz_protocol = psz_parse; - psz_parse = p; - } - p = strchr( psz_parse, '@' ); - p2 = strchr( psz_parse, '/' ); - if( p != NULL && ( p2 != NULL ? p < p2 : 1 ) ) - { - /* We have a login */ - url->psz_username = psz_parse; - *p++ = '\0'; - - psz_parse = strchr( psz_parse, ':' ); - if( psz_parse != NULL ) - { - /* We have a password */ - *psz_parse++ = '\0'; - url->psz_password = psz_parse; - decode_URI( url->psz_password ); - } - decode_URI( url->psz_username ); - psz_parse = p; - } - - p = strchr( psz_parse, '/' ); - if( !p || psz_parse < p ) - { - /* We have a host[:port] */ - url->psz_host = strdup( psz_parse ); - if( p ) - { - url->psz_host[p - psz_parse] = '\0'; - } - - if( *url->psz_host == '[' ) - { - /* Ipv6 address */ - p2 = strchr( url->psz_host, ']' ); - if( p2 ) - { - p2 = strchr( p2, ':' ); - } - } - else - { - p2 = strchr( url->psz_host, ':' ); - } - if( p2 ) - { - *p2++ = '\0'; - url->i_port = atoi( p2 ); - } - } - psz_parse = p; - - /* Now parse psz_path and psz_option */ - if( psz_parse ) - { - url->psz_path = psz_parse; - if( option != '\0' ) - { - p = strchr( url->psz_path, option ); - if( p ) - { - *p++ = '\0'; - url->psz_option = p; - } - } - } -} - -/***************************************************************************** - * vlc_UrlClean: - *****************************************************************************/ -static inline void vlc_UrlClean( vlc_url_t *url ) -{ - free( url->psz_buffer ); - free( url->psz_host ); - - url->psz_protocol = NULL; - url->psz_username = NULL; - url->psz_password = NULL; - url->psz_host = NULL; - url->i_port = 0; - url->psz_path = NULL; - url->psz_option = NULL; - - url->psz_buffer = NULL; -} - -static inline char *vlc_UrlEncode( const char *psz_url ) -{ - /* FIXME: do not encode / : ? and & _when_ not needed */ - return encode_URI_component( psz_url ); -} - -#include - -/** Check whether a given string is not a valid URL and must hence be - * encoded */ -static inline int vlc_UrlIsNotEncoded( const char *psz_url ) -{ - const char *ptr; - - for( ptr = psz_url; *ptr; ptr++ ) - { - char c = *ptr; - - if( c == '%' ) - { - if( !isxdigit( ptr[1] ) || !isxdigit( ptr[2] ) ) - return 1; /* not encoded */ - ptr += 2; - } - else - if( ( (unsigned char)( c - 'a' ) < 26 ) - || ( (unsigned char)( c - 'A' ) < 26 ) - || ( (unsigned char)( c - '0' ) < 10 ) - || ( strchr( "-_.", c ) != NULL ) ) - return 1; - } - return 0; /* looks fine - but maybe it is not encoded */ -} +VLC_API char * decode_URI_duplicate( const char *psz ) VLC_MALLOC; +VLC_API char * decode_URI( char *psz ); +VLC_API char * encode_URI_component( const char *psz ) VLC_MALLOC; +VLC_API char * make_path( const char *url ) VLC_MALLOC; +VLC_API void vlc_UrlParse (vlc_url_t *, const char *, unsigned char); +VLC_API void vlc_UrlClean (vlc_url_t *); #endif