home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2009 May / maximum-cd-2009-05.iso / DiscContents / vlc-0.9.8a-win32.exe / sdk / include / vlc / plugins / vlc_url.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-06  |  6.2 KB  |  235 lines

  1. /*****************************************************************************
  2.  * vlc_url.h: URL related macros
  3.  *****************************************************************************
  4.  * Copyright (C) 2002-2006 the VideoLAN team
  5.  * $Id$
  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.  
  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_EXPORT( char *, unescape_URI_duplicate, ( const char *psz ) );
  49. VLC_EXPORT( void, unescape_URI, ( char *psz ) );
  50. VLC_EXPORT( char *, decode_URI_duplicate, ( const char *psz ) );
  51. VLC_EXPORT( void, decode_URI, ( char *psz ) );
  52. VLC_EXPORT( char *, encode_URI_component, ( const char *psz ) );
  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.         char *p2;
  89.         for( p2 = psz_parse; p2 < p; p2++ )
  90.         {
  91. #define I(i,a,b) ( (a) <= (i) && (i) <= (b) )
  92.             if( !I(*p2, 'a', 'z' ) && !I(*p2, 'A', 'Z') && !I(*p2, '0', '9') && *p2 != '+' && *p2 != '-' && *p2 != '.' )
  93.             {
  94.                 p = NULL;
  95.                 break;
  96.             }
  97. #undef I
  98.         }
  99.     }
  100.  
  101.     if( p != NULL )
  102.     {
  103.         /* we have a protocol */
  104.  
  105.         /* skip :// */
  106.         *p++ = '\0';
  107.         if( p[1] == '/' )
  108.             p += 2;
  109.         url->psz_protocol = psz_parse;
  110.         psz_parse = p;
  111.     }
  112.     p = strchr( psz_parse, '@' );
  113.     p2 = strchr( psz_parse, '/' );
  114.     if( p != NULL && ( p2 != NULL ? p < p2 : 1 ) )
  115.     {
  116.         /* We have a login */
  117.         url->psz_username = psz_parse;
  118.         *p++ = '\0';
  119.  
  120.         psz_parse = strchr( psz_parse, ':' );
  121.         if( psz_parse != NULL )
  122.         {
  123.             /* We have a password */
  124.             *psz_parse++ = '\0';
  125.             url->psz_password = psz_parse;
  126.             decode_URI( url->psz_password );
  127.         }
  128.         decode_URI( url->psz_username );
  129.         psz_parse = p;
  130.     }
  131.  
  132.     p = strchr( psz_parse, '/' );
  133.     if( !p || psz_parse < p )
  134.     {
  135.         char *p2;
  136.  
  137.         /* We have a host[:port] */
  138.         url->psz_host = strdup( psz_parse );
  139.         if( p )
  140.         {
  141.             url->psz_host[p - psz_parse] = '\0';
  142.         }
  143.  
  144.         if( *url->psz_host == '[' )
  145.         {
  146.             /* Ipv6 address */
  147.             p2 = strchr( url->psz_host, ']' );
  148.             if( p2 )
  149.             {
  150.                 p2 = strchr( p2, ':' );
  151.             }
  152.         }
  153.         else
  154.         {
  155.             p2 = strchr( url->psz_host, ':' );
  156.         }
  157.         if( p2 )
  158.         {
  159.             *p2++ = '\0';
  160.             url->i_port = atoi( p2 );
  161.         }
  162.     }
  163.     psz_parse = p;
  164.  
  165.     /* Now parse psz_path and psz_option */
  166.     if( psz_parse )
  167.     {
  168.         url->psz_path = psz_parse;
  169.         if( option != '\0' )
  170.         {
  171.             p = strchr( url->psz_path, option );
  172.             if( p )
  173.             {
  174.                 *p++ = '\0';
  175.                 url->psz_option = p;
  176.             }
  177.         }
  178.     }
  179. }
  180.  
  181. /*****************************************************************************
  182.  * vlc_UrlClean:
  183.  *****************************************************************************/
  184. static inline void vlc_UrlClean( vlc_url_t *url )
  185. {
  186.     free( url->psz_buffer );
  187.     free( url->psz_host );
  188.  
  189.     url->psz_protocol = NULL;
  190.     url->psz_username = NULL;
  191.     url->psz_password = NULL;
  192.     url->psz_host     = NULL;
  193.     url->i_port       = 0;
  194.     url->psz_path     = NULL;
  195.     url->psz_option   = NULL;
  196.  
  197.     url->psz_buffer   = NULL;
  198. }
  199.  
  200. static inline char *vlc_UrlEncode( const char *psz_url )
  201. {
  202.     /* FIXME: do not encode / : ? and & _when_ not needed */
  203.     return encode_URI_component( psz_url );
  204. }
  205.  
  206. #include <ctype.h>
  207.  
  208. /** Check whether a given string is not a valid URL and must hence be
  209.  *  encoded */
  210. static inline int vlc_UrlIsNotEncoded( const char *psz_url )
  211. {
  212.     const char *ptr;
  213.  
  214.     for( ptr = psz_url; *ptr; ptr++ )
  215.     {
  216.         char c = *ptr;
  217.  
  218.         if( c == '%' )
  219.         {
  220.             if( !isxdigit( ptr[1] ) || !isxdigit( ptr[2] ) )
  221.                 return 1; /* not encoded */
  222.             ptr += 2;
  223.         }
  224.         else
  225.         if(  ( (unsigned char)( c - 'a' ) < 26 )
  226.           || ( (unsigned char)( c - 'A' ) < 26 )
  227.           || ( (unsigned char)( c - '0' ) < 10 )
  228.           || ( strchr( "-_.", c ) != NULL ) )
  229.             return 1;
  230.     }
  231.     return 0; /* looks fine - but maybe it is not encoded */
  232. }
  233.  
  234. #endif
  235.