slp.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:15k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * slp.c: SLP access plugin
  3.  *****************************************************************************
  4.  * Copyright (C) 2002-2004 VideoLAN
  5.  * $Id: slp.c 7209 2004-03-31 20:52:31Z gbazin $
  6.  *
  7.  * Authors: Lo颿 Minier <lool@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #include <stdlib.h>                                                /* malloc */
  27. #include <vlc/vlc.h>
  28. #include <vlc/input.h>
  29. #include <vlc_playlist.h>
  30. #include <slp.h>
  31. /*****************************************************************************
  32.  * Local prototypes
  33.  *****************************************************************************/
  34. static int  Open  ( vlc_object_t * );
  35. static void Close ( vlc_object_t * );
  36. static ssize_t Read( input_thread_t *, byte_t *, size_t );
  37. static int  Init  ( vlc_object_t * );
  38. static void End   ( vlc_object_t * );
  39. static int  Demux ( input_thread_t * );
  40. int i_group;
  41. /*****************************************************************************
  42.  * Module descriptor
  43.  *****************************************************************************/
  44. #if 0
  45. #define SRVTYPE_TEXT /*N_*/("SLP service type")
  46. #define SRVTYPE_LONGTEXT /*N_*/( 
  47.     "The service type string for SLP queries, including the authority " 
  48.     "string (if any) for the request. May not be empty." )
  49. #endif
  50. #define ATTRIDS_TEXT N_("SLP attribute identifiers")
  51. #define ATTRIDS_LONGTEXT N_( 
  52.     "This string is a comma separated list of attribute identifiers to " 
  53.     "search for a playlist title or empty to use all attributes." )
  54. #define SCOPELIST_TEXT N_("SLP scopes list")
  55. #define SCOPELIST_LONGTEXT N_( 
  56.     "This string is a comma separated list of scope names or empty if you " 
  57.     "want to use the default scopes. It is used in all SLP queries." )
  58. #define NAMINGAUTHORITY_TEXT N_("SLP naming authority")
  59. #define NAMINGAUTHORITY_LONGTEXT N_( 
  60.     "This string is a list of naming authorities to search. " 
  61.     "Use "*" for all and the empty string for the default of IANA." )
  62. #define FILTER_TEXT N_("SLP LDAP filter")
  63. #define FILTER_LONGTEXT N_( 
  64.     "This is a query formulated of attribute pattern matching expressions " 
  65.     "in the form of an LDAPv3 search filter or empty for all answers." )
  66. #define LANG_TEXT N_("Language requested in SLP requests")
  67. #define LANG_LONGTEXT N_( 
  68.     "RFC 1766 Language tag for the natural language locale of requests, " 
  69.     "leave empty to use the default locale. It is used in all SLP queries." )
  70. vlc_module_begin();
  71.     set_description( _("SLP input") );
  72.     add_string( "slp-attrids", "", NULL, ATTRIDS_TEXT, ATTRIDS_LONGTEXT,
  73.                 VLC_TRUE );
  74.     add_string( "slp-scopelist", "", NULL, SCOPELIST_TEXT,
  75.                 SCOPELIST_LONGTEXT, VLC_TRUE );
  76.     add_string( "slp-namingauthority", "*", NULL, NAMINGAUTHORITY_TEXT,
  77.                 NAMINGAUTHORITY_LONGTEXT, VLC_TRUE );
  78.     add_string( "slp-filter", "", NULL, FILTER_TEXT, FILTER_LONGTEXT,
  79.                 VLC_TRUE );
  80.     add_string( "slp-lang", "", NULL, LANG_TEXT, LANG_LONGTEXT, VLC_TRUE );
  81.     set_capability( "access", 0 );
  82.     set_callbacks( Open, Close );
  83.     add_submodule();
  84.         add_shortcut( "demux_slp" );
  85.         set_capability( "demux", 0 );
  86.         set_callbacks( Init, End );
  87. vlc_module_end();
  88. /*****************************************************************************
  89.  * AttrCallback: updates the description of a playlist item
  90.  *****************************************************************************/
  91. static SLPBoolean AttrCallback( SLPHandle slph_slp,
  92.                            const char * psz_attrlist,
  93.                            SLPError slpe_errcode,
  94.                            void * p_cookie )
  95. {
  96.     playlist_item_t * p_playlist_item = (playlist_item_t *)p_cookie;
  97.     /* our callback was only called to tell us there's nothing more to read */
  98.     if( slpe_errcode == SLP_LAST_CALL )
  99.     {
  100.         return SLP_TRUE;
  101.     }
  102.     /* or there was a problem with getting the data we requested */
  103.     if( (slpe_errcode != SLP_OK) )
  104.     {
  105. #if 0
  106.         msg_Err( (vlc_object_t*)NULL,
  107.                  "AttrCallback got an error %i with attribute %s",
  108.                  slpe_errcode,
  109.                  psz_attrlist );
  110. #endif
  111.         return SLP_TRUE;
  112.     }
  113.     if( p_playlist_item->input.psz_name )
  114.         free( p_playlist_item->input.psz_name );
  115.     p_playlist_item->input.psz_name = strdup(psz_attrlist); /* NULL is checked */
  116.     return SLP_TRUE;
  117. }
  118. /*****************************************************************************
  119.  * SrvUrlCallback: adds an entry to the playlist
  120.  *****************************************************************************/
  121. static SLPBoolean SrvUrlCallback( SLPHandle slph_slp,
  122.                            const char * psz_srvurl,
  123.                            uint16_t i_lifetime,
  124.                            SLPError slpe_errcode,
  125.                            void * p_cookie )
  126. {
  127.     input_thread_t *p_input = (input_thread_t  *)p_cookie;
  128.     playlist_t * p_playlist;
  129.     char psz_item[42] = ""; //"udp:@";
  130.     char * psz_s;                           /* to hold the uri of the stream */
  131.     SLPHandle slph_slp3;
  132.     SLPError slpe_result;
  133.     playlist_item_t * p_playlist_item;
  134.     /* our callback was only called to tell us there's nothing more to read */
  135.     if( slpe_errcode == SLP_LAST_CALL )
  136.     {
  137.         return SLP_TRUE;
  138.     }
  139.     msg_Dbg( p_input,"URL: %s", psz_srvurl );
  140.     /* or there was a problem with getting the data we requested */
  141.     if( (slpe_errcode != SLP_OK) )
  142.     {
  143.         msg_Err( p_input, "SrvUrlCallback got an error %i with URL %s",
  144.                  slpe_errcode, psz_srvurl );
  145.         return SLP_TRUE;
  146.     }
  147.     /* search the returned address after a double-slash */
  148.     psz_s = strstr( psz_srvurl, "//" );
  149.     if( psz_s == NULL )
  150.     {
  151.         msg_Err( p_input,
  152.                  "SrvUrlCallback got a strange string of your libslp" );
  153.         return SLP_TRUE;
  154.     }
  155.     /* skip the slashes */
  156.     psz_s = &psz_s[2];
  157.     /* add udp:@ in front of the address */
  158.     psz_s = strncat( psz_item,
  159.                      psz_s,
  160.                      sizeof(psz_item) - strlen(psz_item) - 1 );
  161.     /* create a playlist  item */
  162.     p_playlist_item = playlist_ItemNew( p_input, psz_s, NULL );
  163.     if( p_playlist_item == NULL )
  164.     {
  165.         msg_Err( p_input, "out of memory" );
  166.         return SLP_TRUE;
  167.     }
  168.     p_playlist_item->i_group = i_group;
  169.     p_playlist_item->b_enabled = VLC_TRUE;
  170.     /* search the description of the stream */
  171.     if( SLPOpen( config_GetPsz( p_input, "slp-lang" ),
  172.                  SLP_FALSE,                              /* synchronous ops */
  173.                  &slph_slp3 ) == SLP_OK )
  174.     {
  175.         /* search all attributes */
  176.         slpe_result = SLPFindAttrs( slph_slp3,
  177.                                     psz_srvurl,
  178.                                     config_GetPsz( p_input, "slp-scopelist" ),
  179.                                     config_GetPsz( p_input, "slp-attrids" ),
  180.                                     AttrCallback,
  181.                                     p_playlist_item
  182.                                   );
  183.         /* we're done, clean up */
  184.         SLPClose( slph_slp3 );
  185.     }
  186.     /* search the main playlist object */
  187.     p_playlist = vlc_object_find( p_input, VLC_OBJECT_PLAYLIST,
  188.                                   FIND_ANYWHERE );
  189.     if( p_playlist == NULL )
  190.     {
  191.         msg_Warn( p_input, "could not find playlist, not adding entries" );
  192.         return SLP_TRUE;
  193.     }
  194.     playlist_AddItem( p_playlist, p_playlist_item,
  195.                       PLAYLIST_APPEND, PLAYLIST_END );
  196.     vlc_object_release( p_playlist );
  197.     msg_Info( p_input, "added