home *** CD-ROM | disk | FTP | other *** search
/ mail.altrad.com / 2015.02.mail.altrad.com.tar / mail.altrad.com / TEST / vlc-2-0-5-win32.exe / sdk / include / vlc / plugins / vlc_url.h < prev    next >
C/C++ Source or Header  |  2012-12-12  |  6KB  |  227 lines

  1. /*****************************************************************************
  2.  * vlc_url.h: URL related macros
  3.  *****************************************************************************
  4.  * Copyright (C) 2002-2006 VLC authors and VideoLAN
  5.  * $Id: 994d8ff24e3e897bc19e02476842b3d4cd29a336 $
  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 it
  11.  * under the terms of the GNU Lesser General Public License as published by
  12.  * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU Lesser General Public License
  21.  * along with this program; if not, write to the Free Software Foundation,
  22.  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24.  
  25. #ifndef VLC_URL_H
  26. # define VLC_URL_H
  27.  
  28. /**
  29.  * \file
  30.  * This file defines functions for manipulating URL in vlc
  31.  */
  32.  
  33. struct vlc_url_t
  34. {
  35.     char *psz_protocol;
  36.     char *psz_username;
  37.     char *psz_password;
  38.     char *psz_host;
  39.     int  i_port;
  40.  
  41.     char *psz_path;
  42.  
  43.     char *psz_option;
  44.  
  45.     char *psz_buffer; /* to be freed */
  46. };
  47.  
  48. VLC_API char * decode_URI_duplicate( const char *psz );
  49. VLC_API char * decode_URI( char *psz );
  50. VLC_API char * encode_URI_component( const char *psz );
  51. VLC_API char * make_URI( const char *path, const char *scheme );
  52. VLC_API char * make_path( const char *url );
  53.  
  54. /*****************************************************************************
  55.  * vlc_UrlParse:
  56.  *****************************************************************************
  57.  * option : if != 0 then path is split at this char
  58.  *
  59.  * format [protocol://[login[:password]@]][host[:port]]/path[OPTIONoption]
  60.  *****************************************************************************/
  61. static inline void vlc_UrlParse( vlc_url_t *url, const char *psz_url,
  62.                                  char option )
  63. {
  64.     char *psz_dup;
  65.     char *psz_parse;
  66.     char *p;
  67.     char *p2;
  68.  
  69.     url->psz_protocol = NULL;
  70.     url->psz_username = NULL;
  71.     url->psz_password = NULL;
  72.     url->psz_host     = NULL;
  73.     url->i_port       = 0;
  74.     url->psz_path     = NULL;
  75.     url->psz_option   = NULL;
  76.  
  77.     if( psz_url == NULL )
  78.     {
  79.         url->psz_buffer = NULL;
  80.         return;
  81.     }
  82.     url->psz_buffer = psz_parse = psz_dup = strdup( psz_url );
  83.  
  84.     /* Search a valid protocol */
  85.     p  = strstr( psz_parse, ":/" );
  86.     if( p != NULL )
  87.     {
  88.         for( p2 = psz_parse; p2 < p; p2++ )
  89.         {
  90. #define I(i,a,b) ( (a) <= (i) && (i) <= (b) )
  91.             if( !I(*p2, 'a', 'z' ) && !I(*p2, 'A', 'Z') && !I(*p2, '0', '9') && *p2 != '+' && *p2 != '-' && *p2 != '.' )
  92.             {
  93.                 p = NULL;
  94.                 break;
  95.             }
  96. #undef I
  97.         }
  98.     }
  99.  
  100.     if( p != NULL )
  101.     {
  102.         /* we have a protocol */
  103.  
  104.         /* skip :// */
  105.         *p++ = '\0';
  106.         if( p[1] == '/' )
  107.             p += 2;
  108.         url->psz_protocol = psz_parse;
  109.         psz_parse = p;
  110.     }
  111.     p = strchr( psz_parse, '@' );
  112.     p2 = strchr( psz_parse, '/' );
  113.     if( p != NULL && ( p2 != NULL ? p < p2 : 1 ) )
  114.     {
  115.         /* We have a login */
  116.         url->psz_username = psz_parse;
  117.         *p++ = '\0';
  118.  
  119.         psz_parse = strchr( psz_parse, ':' );
  120.         if( psz_parse != NULL )
  121.         {
  122.             /* We have a password */
  123.             *psz_parse++ = '\0';
  124.             url->psz_password = psz_parse;
  125.             decode_URI( url->psz_password );
  126.         }
  127.         decode_URI( url->psz_username );
  128.         psz_parse = p;
  129.     }
  130.  
  131.     p = strchr( psz_parse, '/' );
  132.     if( !p || psz_parse < p )
  133.     {
  134.         /* We have a host[:port] */
  135.         url->psz_host = strdup( psz_parse );
  136.         if( p )
  137.         {
  138.             url->psz_host[p - psz_parse] = '\0';
  139.         }
  140.  
  141.         if( *url->psz_host == '[' )
  142.         {
  143.             /* Ipv6 address */
  144.             p2 = strchr( url->psz_host, ']' );
  145.             if( p2 )
  146.             {
  147.                 p2 = strchr( p2, ':' );
  148.             }
  149.         }
  150.         else
  151.         {
  152.             p2 = strchr( url->psz_host, ':' );
  153.         }
  154.         if( p2 )
  155.         {
  156.             *p2++ = '\0';
  157.             url->i_port = atoi( p2 );
  158.         }
  159.     }
  160.     psz_parse = p;
  161.  
  162.     /* Now parse psz_path and psz_option */
  163.     if( psz_parse )
  164.     {
  165.         url->psz_path = psz_parse;
  166.         if( option != '\0' )
  167.         {
  168.             p = strchr( url->psz_path, option );
  169.             if( p )
  170.             {
  171.                 *p++ = '\0';
  172.                 url->psz_option = p;
  173.             }
  174.         }
  175.     }
  176. }
  177.  
  178. /*****************************************************************************
  179.  * vlc_UrlClean:
  180.  *****************************************************************************/
  181. static inline void vlc_UrlClean( vlc_url_t *url )
  182. {
  183.     free( url->psz_buffer );
  184.     free( url->psz_host );
  185.  
  186.     url->psz_protocol = NULL;
  187.     url->psz_username = NULL;
  188.     url->psz_password = NULL;
  189.     url->psz_host     = NULL;
  190.     url->i_port       = 0;
  191.     url->psz_path     = NULL;
  192.     url->psz_option   = NULL;
  193.  
  194.     url->psz_buffer   = NULL;
  195. }
  196.  
  197. #include <ctype.h>
  198.  
  199. /** Check whether a given string is not a valid URL and must hence be
  200.  *  encoded */
  201. static inline int vlc_UrlIsNotEncoded( const char *psz_url )
  202. {
  203.     const char *ptr;
  204.  
  205.     for( ptr = psz_url; *ptr; ptr++ )
  206.     {
  207.         unsigned char c = *ptr;
  208.  
  209.         if( c == '%' )
  210.         {
  211.             if( !isxdigit( (unsigned char)ptr[1] )
  212.              || !isxdigit( (unsigned char)ptr[2] ) )
  213.                 return 1; /* not encoded */
  214.             ptr += 2;
  215.         }
  216.         else
  217.         if(  ( (unsigned char)( c - 'a' ) < 26 )
  218.           || ( (unsigned char)( c - 'A' ) < 26 )
  219.           || ( (unsigned char)( c - '0' ) < 10 )
  220.           || ( strchr( "-_.", c ) != NULL ) )
  221.             return 1;
  222.     }
  223.     return 0; /* looks fine - but maybe it is not encoded */
  224. }
  225.  
  226. #endif
  227.