vlc_url.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:6k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * vlc_url.h: URL related macros
  3.  *****************************************************************************
  4.  * Copyright (C) 2002-2006 the VideoLAN team
  5.  * $Id: e5b29eba2364921cd6491800d40fea7115431a46 $
  6.  *
  7.  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  8.  *          Rémi Denis-Courmont <rem # videolan.org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #ifndef VLC_URL_H
  25. # define VLC_URL_H
  26. /**
  27.  * file
  28.  * This file defines functions for manipulating URL in vlc
  29.  */
  30. struct vlc_url_t
  31. {
  32.     char *psz_protocol;
  33.     char *psz_username;
  34.     char *psz_password;
  35.     char *psz_host;
  36.     int  i_port;
  37.     char *psz_path;
  38.     char *psz_option;
  39.     char *psz_buffer; /* to be freed */
  40. };
  41. VLC_EXPORT( char *, decode_URI_duplicate, ( const char *psz ) );
  42. VLC_EXPORT( char *, decode_URI, ( char *psz ) );
  43. VLC_EXPORT( char *, encode_URI_component, ( const char *psz ) );
  44. VLC_EXPORT( char *, make_URI, ( const char *path ) );
  45. /*****************************************************************************
  46.  * vlc_UrlParse:
  47.  *****************************************************************************
  48.  * option : if != 0 then path is split at this char
  49.  *
  50.  * format [protocol://[login[:password]@]][host[:port]]/path[OPTIONoption]
  51.  *****************************************************************************/
  52. static inline void vlc_UrlParse( vlc_url_t *url, const char *psz_url,
  53.                                  char option )
  54. {
  55.     char *psz_dup;
  56.     char *psz_parse;
  57.     char *p;
  58.     char *p2;
  59.     url->psz_protocol = NULL;
  60.     url->psz_username = NULL;
  61.     url->psz_password = NULL;
  62.     url->psz_host     = NULL;
  63.     url->i_port       = 0;
  64.     url->psz_path     = NULL;
  65.     url->psz_option   = NULL;
  66.     if( psz_url == NULL )
  67.     {
  68.         url->psz_buffer = NULL;
  69.         return;
  70.     }
  71.     url->psz_buffer = psz_parse = psz_dup = strdup( psz_url );
  72.     /* Search a valid protocol */
  73.     p  = strstr( psz_parse, ":/" );
  74.     if( p != NULL )
  75.     {
  76.         for( p2 = psz_parse; p2 < p; p2++ )
  77.         {
  78. #define I(i,a,b) ( (a) <= (i) && (i) <= (b) )
  79.             if( !I(*p2, 'a', 'z' ) && !I(*p2, 'A', 'Z') && !I(*p2, '0', '9') && *p2 != '+' && *p2 != '-' && *p2 != '.' )
  80.             {
  81.                 p = NULL;
  82.                 break;
  83.             }
  84. #undef I
  85.         }
  86.     }
  87.     if( p != NULL )
  88.     {
  89.         /* we have a protocol */
  90.         /* skip :// */
  91.         *p++ = '';
  92.         if( p[1] == '/' )
  93.             p += 2;
  94.         url->psz_protocol = psz_parse;
  95.         psz_parse = p;
  96.     }
  97.     p = strchr( psz_parse, '@' );
  98.     p2 = strchr( psz_parse, '/' );
  99.     if( p != NULL && ( p2 != NULL ? p < p2 : 1 ) )
  100.     {
  101.         /* We have a login */
  102.         url->psz_username = psz_parse;
  103.         *p++ = '';
  104.         psz_parse = strchr( psz_parse, ':' );
  105.         if( psz_parse != NULL )
  106.         {
  107.             /* We have a password */
  108.             *psz_parse++ = '';
  109.             url->psz_password = psz_parse;
  110.             decode_URI( url->psz_password );
  111.         }
  112.         decode_URI( url->psz_username );
  113.         psz_parse = p;
  114.     }
  115.     p = strchr( psz_parse, '/' );
  116.     if( !p || psz_parse < p )
  117.     {
  118.         /* We have a host[:port] */
  119.         url->psz_host = strdup( psz_parse );
  120.         if( p )
  121.         {
  122.             url->psz_host[p - psz_parse] = '';
  123.         }
  124.         if( *url->psz_host == '[' )
  125.         {
  126.             /* Ipv6 address */
  127.             p2 = strchr( url->psz_host, ']' );
  128.             if( p2 )
  129.             {
  130.                 p2 = strchr( p2, ':' );
  131.             }
  132.         }
  133.         else
  134.         {
  135.             p2 = strchr( url->psz_host, ':' );
  136.         }
  137.         if( p2 )
  138.         {
  139.             *p2++ = '';
  140.             url->i_port = atoi( p2 );
  141.         }
  142.     }
  143.     psz_parse = p;
  144.     /* Now parse psz_path and psz_option */
  145.     if( psz_parse )
  146.     {
  147.         url->psz_path = psz_parse;
  148.         if( option != '' )
  149.         {
  150.             p = strchr( url->psz_path, option );
  151.             if( p )
  152.             {
  153.                 *p++ = '';
  154.                 url->psz_option = p;
  155.             }
  156.         }
  157.     }
  158. }
  159. /*****************************************************************************
  160.  * vlc_UrlClean:
  161.  *****************************************************************************/
  162. static inline void vlc_UrlClean( vlc_url_t *url )
  163. {
  164.     free( url->psz_buffer );
  165.     free( url->psz_host );
  166.     url->psz_protocol = NULL;
  167.     url->psz_username = NULL;
  168.     url->psz_password = NULL;
  169.     url->psz_host     = NULL;
  170.     url->i_port       = 0;
  171.     url->psz_path     = NULL;
  172.     url->psz_option   = NULL;
  173.     url->psz_buffer   = NULL;
  174. }
  175. static inline char *vlc_UrlEncode( const char *psz_url )
  176. {
  177.     /* FIXME: do not encode / : ? and & _when_ not needed */
  178.     return encode_URI_component( psz_url );
  179. }
  180. #include <ctype.h>
  181. /** Check whether a given string is not a valid URL and must hence be
  182.  *  encoded */
  183. static inline int vlc_UrlIsNotEncoded( const char *psz_url )
  184. {
  185.     const char *ptr;
  186.     for( ptr = psz_url; *ptr; ptr++ )
  187.     {
  188.         char c = *ptr;
  189.         if( c == '%' )
  190.         {
  191.             if( !isxdigit( ptr[1] ) || !isxdigit( ptr[2] ) )
  192.                 return 1; /* not encoded */
  193.             ptr += 2;
  194.         }
  195.         else
  196.         if(  ( (unsigned char)( c - 'a' ) < 26 )
  197.           || ( (unsigned char)( c - 'A' ) < 26 )
  198.           || ( (unsigned char)( c - '0' ) < 10 )
  199.           || ( strchr( "-_.", c ) != NULL ) )
  200.             return 1;
  201.     }
  202.     return 0; /* looks fine - but maybe it is not encoded */
  203. }
  204. #endif