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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * announce.c : Session announcement
  3.  *****************************************************************************
  4.  * Copyright (C) 2002 VideoLAN
  5.  *
  6.  * Authors: Cl閙ent Stenac <zorglub@via.ecp.fr>
  7.  *          Damien Lucas <nitrox@via.ecp.fr>
  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>                                                /* free() */
  27. #include <errno.h>                                                 /* ENOMEM */
  28. #include <stdio.h>                                              /* sprintf() */
  29. #include <vlc/vlc.h>
  30. #include <vlc/sout.h>
  31. #ifdef HAVE_UNISTD_H
  32. #   include <unistd.h>
  33. #endif
  34. #ifdef WIN32
  35. #   include <winsock2.h>
  36. #   include <ws2tcpip.h>
  37. #   ifndef IN_MULTICAST
  38. #       define IN_MULTICAST(a) IN_CLASSD(a)
  39. #   endif
  40. #else
  41. #   include <sys/socket.h>
  42. #endif
  43. #ifdef HAVE_SLP_H
  44. # include <slp.h>
  45. #endif
  46. #include "announce.h"
  47. #include "network.h"
  48. #define DEFAULT_PORT 1234
  49. #ifdef HAVE_SLP_H
  50. /*****************************************************************************
  51.  * sout_SLPBuildName: Builds a service name according to SLP standard
  52.  *****************************************************************************/
  53. static char * sout_SLPBuildName(char *psz_url,char *psz_name)
  54. {
  55.     char *psz_service;
  56.     unsigned int i_size;
  57.     /* name to build is: service:vlc.services.videolan://$(url) */
  58.     i_size =  8 + 12 + 12 + 5 + strlen(psz_url) + 1;
  59.     psz_service=(char *)malloc(i_size * sizeof(char));
  60.     snprintf( psz_service , i_size,
  61.               "service:vlc.services.videolan://udp:@%s",
  62.               psz_url);
  63.         /* How piggy  ! */
  64.     psz_service[i_size]=''; /* Just to make sure */
  65.     return psz_service;
  66. }
  67. /*****************************************************************************
  68.  * sout_SLPReport: Reporting function. Unused at the moment but needed
  69.  *****************************************************************************/
  70. static void sout_SLPReport(SLPHandle slp_handle,SLPError slp_error,void* cookie)
  71. {
  72. }
  73. #endif
  74. /*****************************************************************************
  75.  * sout_SLPReg: Registers the program with SLP
  76.  *****************************************************************************/
  77. int sout_SLPReg( sout_instance_t *p_sout, char * psz_url,
  78.                                char * psz_name)
  79. {
  80. #ifdef HAVE_SLP_H
  81.     SLPHandle   slp_handle;
  82.     SLPError    slp_res;
  83.     char *psz_service= sout_SLPBuildName(psz_url,psz_name);
  84.     if( SLPOpen( NULL, SLP_FALSE, &slp_handle ) != SLP_OK)
  85.     {
  86.         msg_Warn(p_sout,"Unable to initialize SLP");
  87.         return -1;
  88.     }
  89.     msg_Info(p_sout , "Registering %s (name: %s) in SLP",
  90.                       psz_service , psz_name);
  91.     slp_res = SLPReg ( slp_handle,
  92.             psz_service,
  93.             SLP_LIFETIME_MAXIMUM,
  94.             NULL,
  95.             psz_name,
  96.             SLP_TRUE,
  97.             sout_SLPReport,
  98.             NULL );
  99.     if( slp_res != SLP_OK )
  100.     {
  101.         msg_Warn(p_sout,"Error while registering service: %i", slp_res );
  102.         return -1;
  103.     }
  104.     return 0;
  105. #else /* This function should never be called if this is false */
  106.     return -1;
  107. #endif
  108. }
  109. /*****************************************************************************
  110.  * sout_SLDePReg: Unregisters the program from SLP
  111.  *****************************************************************************/
  112. int sout_SLPDereg( sout_instance_t *p_sout, char * psz_url,
  113.                                char * psz_name)
  114. {
  115. #ifdef HAVE_SLP_H
  116.     SLPHandle   slp_handle;
  117.     SLPError    slp_res;
  118.     char *psz_service= sout_SLPBuildName(psz_url,psz_name);
  119.     if( SLPOpen( NULL, SLP_FALSE, &slp_handle ) != SLP_OK)
  120.     {
  121.         msg_Warn(p_sout,"Unable to initialize SLP");
  122.         return -1;
  123.     }
  124.     msg_Info(p_sout , "Unregistering %s from SLP",
  125.                       psz_service);
  126.     slp_res = SLPDereg ( slp_handle,
  127.             psz_service,
  128.             sout_SLPReport,
  129.             NULL );
  130.     if( slp_res != SLP_OK )
  131.     {
  132.         msg_Warn(p_sout,"Error while registering service: %i", slp_res );
  133.         return -1;
  134.     }
  135.     return 0;
  136. #else /* This function should never be called if this is false */
  137.     return -1;
  138. #endif
  139. }