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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * corba.c : CORBA (ORBit) remote control plugin for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2001 VideoLAN
  5.  * $Id: corba.c 7940 2004-06-07 19:40:26Z oaubert $
  6.  *
  7.  * Authors: Olivier Aubert <oaubert@lisi.univ-lyon1.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. /* For CORBA */
  27. #include "MediaControl.h"
  28. #include "orbit/poa/portableserver-poa-type.h"
  29. #include "mediacontrol-core.h"
  30. #include <vlc/vlc.h>
  31. #include <vlc/intf.h>
  32. #include <vlc/vout.h>
  33. #include <vlc/aout.h>
  34. #include <errno.h>
  35. #include <unistd.h>
  36. /* FIXME: replace this to ~/.vlc/vlc-ior.ref thanks to
  37.    config_GetHomeDir( ) */
  38. #ifndef __WIN32__
  39. #define VLC_IOR_FILE "/tmp/vlc-ior.ref"
  40. #else
  41. #define VLC_IOR_FILE "vlc-ior-ref"
  42. #endif
  43. #define MC_TRY exception = mediacontrol_exception_init( exception )
  44. #define MC_EXCEPT( return_value )  
  45.   if ( exception->code )
  46.   { 
  47.       corba_raise( ev, exception ); 
  48.       mediacontrol_exception_free( exception ); 
  49.       return return_value; 
  50.   } else { mediacontrol_exception_free( exception ); }
  51. #define handle_exception( m ) if( ev->_major != CORBA_NO_EXCEPTION ) 
  52.     { 
  53.         msg_Err( servant->p_intf, m ); 
  54.         return; 
  55.     }
  56. #define handle_exception_no_servant( p,m ) if( ev->_major != CORBA_NO_EXCEPTION ) 
  57.     { 
  58.         msg_Err( p, m ); 
  59.         return; 
  60.     }
  61. static void corba_raise( CORBA_Environment *ev, mediacontrol_Exception *exception )
  62. {
  63.     char *corba_exception=NULL;
  64.     char* i_type = NULL;
  65.  
  66.     switch( exception->code )
  67.     {
  68.     case mediacontrol_InternalException:
  69.         corba_exception = ( char* )VLC_InternalException__alloc();
  70.         i_type = ex_VLC_InternalException;
  71.         break;
  72.     case mediacontrol_PlaylistException:
  73.         corba_exception = ( char* )VLC_PlaylistException__alloc();
  74.         i_type = ex_VLC_PlaylistException;
  75.         break;
  76.     case mediacontrol_InvalidPosition:
  77.         corba_exception = ( char* )VLC_InvalidPosition__alloc();
  78.         i_type = ex_VLC_InvalidPosition;
  79.         break;
  80.     case mediacontrol_PositionKeyNotSupported:
  81.         corba_exception = ( char* )VLC_PositionKeyNotSupported__alloc();
  82.         i_type = ex_VLC_PositionKeyNotSupported;
  83.         break;
  84.     case mediacontrol_PositionOriginNotSupported:
  85.         corba_exception = ( char* )VLC_PositionOriginNotSupported__alloc();
  86.         i_type = ex_VLC_PositionOriginNotSupported;
  87.         break;
  88.     }
  89.     ( (VLC_InternalException* )corba_exception )->message = CORBA_string_dup( exception->message );
  90.     CORBA_exception_set( ev, CORBA_USER_EXCEPTION, i_type, corba_exception );
  91.     return;
  92. }
  93. static mediacontrol_Position* corba_position_corba_to_c( const VLC_Position* position )
  94. {
  95.     mediacontrol_Position* retval;
  96.     
  97.     retval = ( mediacontrol_Position* )malloc( sizeof( mediacontrol_Position ) );
  98.     if( ! retval )
  99.         return NULL;
  100.     retval->origin = position->origin;
  101.     retval->key    = position->key;
  102.     retval->value  = position->value;
  103.     return retval;
  104. }
  105. static VLC_Position* corba_position_c_to_corba( const mediacontrol_Position* position )
  106. {
  107.     VLC_Position* retval;
  108.     retval = ( VLC_Position* )malloc( sizeof( VLC_Position ) );
  109.     if( ! retval )
  110.         return NULL;
  111.     retval->origin = position->origin;
  112.     retval->key    = position->key;
  113.     retval->value  = position->value;
  114.     return retval;
  115. }
  116. /*****************************************************************************
  117.  * intf_sys_t: description and status of corba interface
  118.  *****************************************************************************/
  119. struct intf_sys_t
  120. {
  121.     CORBA_ORB                 orb;
  122.     GMainLoop*                corbaloop;
  123.     mediacontrol_Instance     *mc;
  124.     msg_subscription_t* p_sub;  /* message bank subscription */
  125. };
  126. /*** App-specific servant structures ***/
  127. /* We can add attributes to this structure, which is both a pointer on a
  128.    specific structure, and on a POA_VLC_MediaControl ( servant ). Cf
  129.    http://developer.gnome.org/doc/guides/corba/html/corba-poa-example.html */
  130. typedef struct
  131. {
  132.     POA_VLC_MediaControl servant;
  133.     PortableServer_POA poa;
  134.     /* Ajouter ici les attributs utiles */
  135.     mediacontrol_Instance     *mc;
  136.     intf_thread_t             *p_intf;
  137. } impl_POA_VLC_MediaControl;
  138. /* Beginning of the CORBA code generated in Mediacontrol-skelimpl.c */
  139. /* BEGIN INSERT */
  140. /*** Implementation stub prototypes ***/
  141. static void impl_VLC_MediaControl__destroy( impl_POA_VLC_MediaControl *
  142.                                             servant, CORBA_Environment * ev );
  143. static VLC_Position
  144. impl_VLC_MediaControl_get_media_position( impl_POA_VLC_MediaControl * servant,
  145.                                           const VLC_PositionOrigin an_origin,
  146.                                           const VLC_PositionKey a_key,
  147.                                           CORBA_Environment * ev );
  148. static void
  149. impl_VLC_MediaControl_set_media_position( impl_POA_VLC_MediaControl * servant,
  150.                                           const VLC_Position * a_position,
  151.                                           CORBA_Environment * ev );
  152. static void
  153. impl_VLC_MediaControl_start( impl_POA_VLC_MediaControl * servant,
  154.                              const VLC_Position * a_position,
  155.                              CORBA_Environment * ev );
  156. static void
  157. impl_VLC_MediaControl_pause( impl_POA_VLC_MediaControl * servant,
  158.                              const VLC_Position * a_position,
  159.                              CORBA_Environment * ev );
  160. static void
  161. impl_VLC_MediaControl_resume( impl_POA_VLC_MediaControl * servant,
  162.                               const VLC_Position * a_position,
  163.                               CORBA_Environment * ev );
  164. static void
  165. impl_VLC_MediaControl_stop( impl_POA_VLC_MediaControl * servant,
  166.                             const VLC_Position * a_position,
  167.                             CORBA_Environment * ev );
  168. static void
  169. impl_VLC_MediaControl_exit( impl_POA_VLC_MediaControl * servant,
  170.                             CORBA_Environment * ev );
  171. static void
  172. impl_VLC_MediaControl_playlist_add_item( impl_POA_VLC_MediaControl * servant,
  173.                                          const CORBA_char * a_file,
  174.                                          CORBA_Environment * ev );
  175. static void
  176. impl_VLC_MediaControl_playlist_clear( impl_POA_VLC_MediaControl * servant,
  177.                                       CORBA_Environment * ev );
  178. static VLC_PlaylistSeq
  179. *impl_VLC_MediaControl_playlist_get_list( impl_POA_VLC_MediaControl *
  180.                                           servant, CORBA_Environment * ev );
  181. static VLC_RGBPicture
  182. *impl_VLC_MediaControl_snapshot( impl_POA_VLC_MediaControl * servant,
  183.                                  const VLC_Position * a_position,
  184.                                  CORBA_Environment * ev );
  185. static VLC_RGBPictureSeq
  186. *impl_VLC_MediaControl_all_snapshots( impl_POA_VLC_MediaControl * servant,
  187.                                       CORBA_Environment * ev );
  188. static void
  189. impl_VLC_MediaControl_display_text( impl_POA_VLC_MediaControl * servant,
  190.                                     const CORBA_char * message,
  191.                                     const VLC_Position * begin,
  192.                                     const VLC_Position * end,
  193.                                     CORBA_Environment * ev );
  194. static VLC_StreamInformation
  195. *impl_VLC_MediaControl_get_stream_information( impl_POA_VLC_MediaControl *
  196.                                                servant,
  197.                                                CORBA_Environment * ev );
  198. static CORBA_unsigned_short
  199. impl_VLC_MediaControl_sound_get_volume( impl_POA_VLC_MediaControl * servant,
  200.                                         CORBA_Environment * ev );
  201. static void
  202. impl_VLC_MediaControl_sound_set_volume( impl_POA_VLC_MediaControl * servant,
  203.                                         const CORBA_unsigned_short volume,
  204.                                         CORBA_Environment * ev );
  205. /*** epv structures ***/
  206. static PortableServer_ServantBase__epv impl_VLC_MediaControl_base_epv = {
  207.     NULL,                       /* _private data */
  208.     ( gpointer ) & impl_VLC_MediaControl__destroy,      /* finalize routine */
  209.     NULL,                       /* default_POA routine */
  210. };
  211. static POA_VLC_MediaControl__epv impl_VLC_MediaControl_epv = {
  212.     NULL,                       /* _private */
  213.     ( gpointer ) & impl_VLC_MediaControl_get_media_position,
  214.     ( gpointer ) & impl_VLC_MediaControl_set_media_position,
  215.     ( gpointer ) & impl_VLC_MediaControl_start,
  216.     ( gpointer ) & impl_VLC_MediaControl_pause,
  217.     ( gpointer ) & impl_VLC_MediaControl_resume,
  218.     ( gpointer ) & impl_VLC_MediaControl_stop,
  219.     ( gpointer ) & impl_VLC_MediaControl_exit,
  220.     ( gpointer ) & impl_VLC_MediaControl_playlist_add_item,
  221.     ( gpointer ) & impl_VLC_MediaControl_playlist_clear,
  222.     ( gpointer ) & impl_VLC_MediaControl_playlist_get_list,
  223.     ( gpointer ) & impl_VLC_MediaControl_snapshot,
  224.     ( gpointer ) & impl_VLC_MediaControl_all_snapshots,
  225.     ( gpointer ) & impl_VLC_MediaControl_display_text,
  226.     ( gpointer ) & impl_VLC_MediaControl_get_stream_information,
  227.     ( gpointer ) & impl_VLC_MediaControl_sound_get_volume,
  228.     ( gpointer ) & impl_VLC_MediaControl_sound_set_volume,
  229. };
  230. /*** vepv structures ***/
  231. static POA_VLC_MediaControl__vepv impl_VLC_MediaControl_vepv = {
  232.     &impl_VLC_MediaControl_base_epv,
  233.     &impl_VLC_MediaControl_epv,
  234. };
  235. /*** Stub implementations ***/
  236. static VLC_MediaControl
  237. impl_VLC_MediaControl__create( PortableServer_POA poa, CORBA_Environment * ev )
  238. {
  239.     VLC_MediaControl retval;
  240.     impl_POA_VLC_MediaControl *newservant;
  241.     PortableServer_ObjectId *objid;
  242.     newservant = g_new0( impl_POA_VLC_MediaControl, 1 );
  243.     newservant->servant.vepv = &impl_VLC_MediaControl_vepv;
  244.     newservant->poa =
  245.         ( PortableServer_POA ) CORBA_Object_duplicate( (CORBA_Object ) poa, ev );
  246.     POA_VLC_MediaControl__init( (PortableServer_Servant ) newservant, ev );
  247.     /* Before servant is going to be activated all
  248.      * private attributes must be initialized.  */
  249.     /* ------ init private attributes here ------ */
  250.     newservant->mc = NULL;
  251.     /* ------ ---------- end ------------- ------ */
  252.     objid = PortableServer_POA_activate_object( poa, newservant, ev );
  253.     CORBA_free( objid );
  254.     retval = PortableServer_POA_servant_to_reference( poa, newservant, ev );
  255.     return retval;
  256. }
  257. static void
  258. impl_VLC_MediaControl__destroy( impl_POA_VLC_MediaControl * servant,
  259.                                 CORBA_Environment * ev )
  260. {
  261.     CORBA_Object_release( (CORBA_Object ) servant->poa, ev );
  262.     /* No further remote method calls are delegated to 
  263.      * servant and you may free your private attributes. */
  264.     /* ------ free private attributes here ------ */
  265.     /* ------ ---------- end ------------- ------ */
  266.     POA_VLC_MediaControl__fini( (PortableServer_Servant ) servant, ev );
  267. }
  268. /* END INSERT */
  269. /* Beginning of the CORBA functions that we define */
  270. /* Returns the current position in the stream. The returned value can
  271.    be relative or absolute ( according to PositionOrigin ) and the unit
  272.    is set by PositionKey */
  273. static VLC_Position
  274. impl_VLC_MediaControl_get_media_position( impl_POA_VLC_MediaControl * servant,
  275.                                           const VLC_PositionOrigin an_origin,
  276.                                           const VLC_PositionKey a_key,
  277.                                           CORBA_Environment * ev )
  278. {
  279.     VLC_Position* retval = NULL;
  280.     mediacontrol_Position *p_pos;
  281.     mediacontrol_Exception *exception = NULL;
  282.     MC_TRY;
  283.     p_pos = mediacontrol_get_media_position( servant->mc, an_origin, a_key, exception );
  284.     MC_EXCEPT( *retval );
  285.     retval = corba_position_c_to_corba( p_pos );
  286.     free( p_pos );
  287.     return *retval;
  288. }
  289. /* Sets the media position */
  290. static void
  291. impl_VLC_MediaControl_set_media_position( impl_POA_VLC_MediaControl * servant,
  292.                                           const VLC_Position * a_position,
  293.                                           CORBA_Environment * ev )
  294. {
  295.     mediacontrol_Position *p_pos;
  296.     mediacontrol_Exception *exception = NULL;
  297.     p_pos = corba_position_corba_to_c( a_position );
  298.   
  299.     MC_TRY;
  300.     mediacontrol_set_media_position( servant->mc, p_pos, exception );
  301.     MC_EXCEPT();
  302.     free( p_pos );
  303.     return;
  304. }
  305. /* Starts playing a stream */
  306. static void
  307. impl_VLC_MediaControl_start( impl_POA_VLC_MediaControl * servant,
  308.                              const VLC_Position * a_position, CORBA_Environment * ev )
  309. {
  310.     mediacontrol_Position *p_pos;
  311.     mediacontrol_Exception *exception = NULL;
  312.     p_pos = corba_position_corba_to_c( a_position );
  313.   
  314.     MC_TRY;
  315.     mediacontrol_start( servant->mc, p_pos, exception );
  316.     MC_EXCEPT();
  317.     free( p_pos );
  318.     return;
  319. }
  320. static void
  321. impl_VLC_MediaControl_pause( impl_POA_VLC_MediaControl * servant,
  322.                              const VLC_Position * a_position, CORBA_Environment * ev )
  323. {
  324.     mediacontrol_Position *p_pos;
  325.     mediacontrol_Exception *exception = NULL;
  326.     p_pos = corba_position_corba_to_c( a_position );
  327.   
  328.     MC_TRY;
  329.     mediacontrol_pause( servant->mc, p_pos, exception );
  330.     MC_EXCEPT();
  331.     free( p_pos );
  332.     return;
  333. }
  334. static void
  335. impl_VLC_MediaControl_resume( impl_POA_VLC_MediaControl * servant,
  336.                               const VLC_Position * a_position, CORBA_Environment * ev )
  337. {
  338.     mediacontrol_Position *p_pos;
  339.     mediacontrol_Exception *exception = NULL;
  340.     p_pos = corba_position_corba_to_c( a_position );
  341.   
  342.     MC_TRY;
  343.     mediacontrol_resume( servant->mc, p_pos, exception );
  344.     MC_EXCEPT();
  345.     free( p_pos );
  346.     return;
  347. }
  348. static void
  349. impl_VLC_MediaControl_stop( impl_POA_VLC_MediaControl * servant,
  350.                             const VLC_Position * a_position, CORBA_Environment * ev )
  351. {
  352.     mediacontrol_Position *p_pos;
  353.     mediacontrol_Exception *exception = NULL;
  354.     p_pos = corba_position_corba_to_c( a_position );
  355.   
  356.     MC_TRY;
  357.     mediacontrol_pause( servant->mc, p_pos, exception );
  358.     MC_EXCEPT();
  359.     free( p_pos );
  360.     return;
  361. }
  362. static void
  363. impl_VLC_MediaControl_exit( impl_POA_VLC_MediaControl * servant,
  364.                             CORBA_Environment * ev )
  365. {
  366.     mediacontrol_exit( servant->mc );
  367.     return;
  368. }
  369. static void
  370. impl_VLC_MediaControl_playlist_add_item( impl_POA_VLC_MediaControl * servant,
  371.                                          const CORBA_char * psz_file,
  372.                                          CORBA_Environment * ev )
  373. {
  374.     mediacontrol_Exception *exception = NULL;
  375.   
  376.     MC_TRY;
  377.     mediacontrol_playlist_add_item( servant->mc, psz_file, exception );
  378.     MC_EXCEPT();
  379.     return;
  380. }
  381. static void
  382. impl_VLC_MediaControl_playlist_clear( impl_POA_VLC_MediaControl * servant,
  383.                                       CORBA_Environment * ev )
  384. {
  385.     mediacontrol_Exception *exception = NULL;
  386.   
  387.     MC_TRY;
  388.     mediacontrol_playlist_clear( servant->mc, exception );
  389.     MC_EXCEPT();
  390.     return;
  391. }
  392. static VLC_PlaylistSeq *
  393. impl_VLC_MediaControl_playlist_get_list( impl_POA_VLC_MediaControl * servant,
  394.                                          CORBA_Environment * ev )
  395. {
  396.     VLC_PlaylistSeq *retval = NULL;
  397.     mediacontrol_Exception *exception = NULL;
  398.     mediacontrol_PlaylistSeq* p_ps;
  399.     int i_index;
  400.    
  401.     MC_TRY;
  402.     p_ps = mediacontrol_playlist_get_list( servant->mc, exception );
  403.     MC_EXCEPT( retval );
  404.     retval = VLC_PlaylistSeq__alloc();
  405.     retval->_buffer = VLC_PlaylistSeq_allocbuf( p_ps->size );
  406.     retval->_length = p_ps->size;
  407.   
  408.     for( i_index = 0 ; i_index < p_ps->size ; i_index++ )
  409.     {
  410.         retval->_buffer[i_index] = CORBA_string_dup( p_ps->data[i_index] );
  411.     }
  412.     CORBA_sequence_set_release( retval, TRUE );
  413.   
  414.     mediacontrol_PlaylistSeq__free( p_ps );
  415.     return retval;
  416. }
  417. VLC_RGBPicture*
  418. createRGBPicture( mediacontrol_RGBPicture* p_pic )
  419. {
  420.     VLC_RGBPicture *retval;
  421.   
  422.     retval = VLC_RGBPicture__alloc();
  423.     if( retval )
  424.     {
  425.         retval->width  = p_pic->width;
  426.         retval->height = p_pic->height;
  427.         retval->type   = p_pic->type;
  428.         retval->date   = p_pic->date;
  429.       
  430.         retval->data._maximum = p_pic->size;
  431.         retval->data._length = p_pic->size;
  432.         retval->data._buffer = VLC_ByteSeq_allocbuf( p_pic->size );
  433.         memcpy( retval->data._buffer, p_pic->data, p_pic->size );
  434.         /* CORBA_sequence_set_release( &( retval->data ), FALSE ); */
  435.     }
  436.     return retval;
  437. }
  438. static VLC_RGBPicture *
  439. impl_VLC_MediaControl_snapshot( impl_POA_VLC_MediaControl * servant,
  440.                                 const VLC_Position * a_position,
  441.                                 CORBA_Environment * ev )
  442. {
  443.     VLC_RGBPicture *retval = NULL;
  444.     mediacontrol_RGBPicture* p_pic = NULL;
  445.     mediacontrol_Position *p_pos;
  446.     mediacontrol_Exception *exception = NULL;
  447.     p_pos = corba_position_corba_to_c( a_position );
  448.   
  449.     MC_TRY;
  450.     p_pic = mediacontrol_snapshot( servant->mc, p_pos, exception );
  451.     MC_EXCEPT( retval );
  452.   
  453.     retval = createRGBPicture( p_pic );
  454.     mediacontrol_RGBPicture__free( p_pic );
  455.     return retval;
  456. }
  457. static VLC_RGBPictureSeq *
  458. impl_VLC_MediaControl_all_snapshots( impl_POA_VLC_MediaControl * servant,
  459.                                      CORBA_Environment * ev )
  460. {
  461.     VLC_RGBPictureSeq *retval = NULL;
  462.     mediacontrol_RGBPicture** p_piclist = NULL;
  463.     mediacontrol_RGBPicture** p_tmp = NULL;
  464.     mediacontrol_Exception *exception = NULL;
  465.     int i_size = 0;
  466.     int i_index;
  467.   
  468.     MC_TRY;
  469.     p_piclist = mediacontrol_all_snapshots( servant->mc, exception );
  470.     MC_EXCEPT( retval );
  471.     for( p_tmp = p_piclist ; *p_tmp != NULL ; p_tmp++ )
  472.         i_size++;
  473.   
  474.     retval = VLC_RGBPictureSeq__alloc();
  475.     retval->_buffer = VLC_RGBPictureSeq_allocbuf( i_size );
  476.     retval->_length = i_size;
  477.     for( i_index = 0 ; i_index < i_size ; i_index++ )
  478.     {
  479.         mediacontrol_RGBPicture *p_pic = p_piclist[i_index];
  480.         VLC_RGBPicture *p_rgb;
  481.       
  482.         p_rgb = &( retval->_buffer[i_index] );
  483.       
  484.         p_rgb->width  = p_pic->width;
  485.         p_rgb->height = p_pic->height;
  486.         p_rgb->type   = p_pic->type;
  487.         p_rgb->date   = p_pic->date;
  488.       
  489.         p_rgb->data._maximum = p_pic->size;
  490.         p_rgb->data._length  = p_pic->size;
  491.         p_rgb->data._buffer  = VLC_ByteSeq_allocbuf( p_pic->size );
  492.         memcpy( p_rgb->data._buffer, p_pic->data, p_pic->size );
  493.         mediacontrol_RGBPicture__free( p_pic );
  494.     }
  495.   
  496.     free( p_piclist );
  497.     return retval;
  498. }
  499. static void
  500. impl_VLC_MediaControl_display_text( impl_POA_VLC_MediaControl * servant,
  501.                                     const CORBA_char * message,
  502.                                     const VLC_Position * begin,
  503.                                     const VLC_Position * end,
  504.                                     CORBA_Environment * ev )
  505. {
  506.     mediacontrol_Position *p_begin = NULL;
  507.     mediacontrol_Position *p_end = NULL;
  508.     mediacontrol_Exception *exception = NULL;
  509.     p_begin = corba_position_corba_to_c( begin );
  510.     p_end = corba_position_corba_to_c( end );
  511.     MC_TRY;
  512.     mediacontrol_display_text( servant->mc, message, p_begin, p_end, exception );
  513.     MC_EXCEPT();
  514.     free( p_begin );
  515.     free( p_end );
  516.     return;
  517. }
  518. static VLC_StreamInformation *
  519. impl_VLC_MediaControl_get_stream_information( impl_POA_VLC_MediaControl *
  520.                                               servant, CORBA_Environment * ev )
  521. {
  522.     mediacontrol_Exception *exception = NULL;
  523.     mediacontrol_StreamInformation *p_si = NULL;
  524.     VLC_StreamInformation *retval = NULL;
  525.     MC_TRY;
  526.     p_si = mediacontrol_get_stream_information( servant->mc, mediacontrol_MediaTime, exception );
  527.     MC_EXCEPT( retval );
  528.     retval = VLC_StreamInformation__alloc();
  529.     if( ! retval )
  530.     {
  531.         return NULL;
  532.     }
  533.     retval->streamstatus = p_si->streamstatus;
  534.     retval->url          = CORBA_string_dup( p_si->url );
  535.     retval->position     = p_si->position;
  536.     retval->length       = p_si->length;
  537.   
  538.     free( p_si->url );
  539.     free( p_si );
  540.     return retval;
  541. }
  542. static CORBA_unsigned_short
  543. impl_VLC_MediaControl_sound_get_volume( impl_POA_VLC_MediaControl * servant,
  544.                                         CORBA_Environment * ev )
  545. {
  546.     CORBA_short retval = 0;
  547.     mediacontrol_Exception *exception = NULL;
  548.   
  549.     MC_TRY;
  550.     retval = mediacontrol_sound_get_volume( servant->mc, exception );
  551.     MC_EXCEPT( retval );
  552.     return retval;
  553. }
  554. static void
  555. impl_VLC_MediaControl_sound_set_volume( impl_POA_VLC_MediaControl * servant,
  556.                                         const CORBA_unsigned_short volume,
  557.                                         CORBA_Environment * ev )
  558. {
  559.     mediacontrol_Exception *exception = NULL;
  560.   
  561.     MC_TRY;
  562.     mediacontrol_sound_set_volume( servant->mc, volume, exception );
  563.     MC_EXCEPT();
  564. }
  565. /* ( Real ) end of the CORBA code generated in Mediacontrol-skelimpl.c */
  566. /*****************************************************************************
  567.  * Local prototypes.
  568.  *****************************************************************************/
  569. static int  Open         ( vlc_object_t * );
  570. static void Close        ( vlc_object_t * );
  571. static void Run          ( intf_thread_t * );
  572. /*****************************************************************************
  573.  * Module descriptor
  574.  *****************************************************************************/
  575. vlc_module_begin();
  576. add_category_hint( N_( "Corba control" ), NULL, VLC_FALSE );
  577. set_description( _( "corba control module" ) );
  578. set_capability( "interface", 10 );
  579. add_integer( "corba-reactivity", 5000, NULL, "Internal reactivity factor", "Internal reactivity factor ( gtk timeout is INTF_IDLE_SLEEP / factor )", VLC_TRUE );
  580. set_callbacks( Open, Close );
  581. vlc_module_end();
  582. /*****************************************************************************
  583.  * intf_Open: initialize and create stuff
  584.  *****************************************************************************/
  585. static int Open( vlc_object_t *p_this )
  586. {
  587.     intf_thread_t *p_intf = ( intf_thread_t * )p_this;
  588.     /* Allocate instance and initialize some members */
  589.     p_intf->p_sys = malloc( sizeof( intf_sys_t ) );
  590.     if( p_intf->p_sys == NULL )
  591.     {
  592.         msg_Err( p_intf, "Out of memory" );
  593.         return VLC_ENOMEM;
  594.     }
  595.     /* Initialize the fields of the p_intf struct */
  596.     p_intf->pf_run = Run;
  597.     p_intf->p_sys->mc = NULL;
  598.     p_intf->p_sys->orb = NULL;
  599.     p_intf->p_sys->corbaloop = NULL;
  600.     return VLC_SUCCESS;
  601. }
  602. /*****************************************************************************
  603.  * intf_Close: destroy interface
  604.  *****************************************************************************/
  605. static void Close( vlc_object_t *p_this )
  606. {
  607.     intf_thread_t *p_intf = ( intf_thread_t * )p_this;
  608.     CORBA_Environment*        ev = NULL;
  609.     ev = CORBA_exception__alloc();
  610.     CORBA_ORB_shutdown( p_intf->p_sys->orb, FALSE, ev );
  611.     handle_exception_no_servant( p_intf, "Error in Close" );
  612.     /* Destroy structure */
  613.     free( p_intf->p_sys );
  614. }
  615. /*
  616.   Function called regularly to handle various tasks( mainly CORBA calls )
  617. */
  618. static gboolean Manage( gpointer p_interface )
  619. {
  620.     intf_thread_t *p_intf = ( intf_thread_t* )p_interface;
  621.     CORBA_boolean b_work_pending;
  622.     CORBA_Environment* ev;
  623.     ev = CORBA_exception__alloc();
  624.     /* CORBA */
  625.     b_work_pending = CORBA_ORB_work_pending( p_intf->p_sys->orb, ev );
  626.     if( ev->_major != CORBA_NO_EXCEPTION )
  627.     {
  628.         msg_Err( p_intf, "Exception in CORBA events check loop" );
  629.         return FALSE;
  630.     }
  631.   
  632.     vlc_mutex_lock( &p_intf->change_lock );
  633.     if( b_work_pending )
  634.         CORBA_ORB_perform_work( p_intf->p_sys->orb, ev );
  635.   
  636.     if( p_intf->b_die )
  637.     {
  638.         vlc_mutex_unlock( &p_intf->change_lock );
  639.         CORBA_ORB_shutdown( p_intf->p_sys->orb, TRUE, ev );
  640.         g_main_loop_quit( p_intf->p_sys->corbaloop );
  641.         /* Just in case */
  642.         return( TRUE );
  643.     }
  644.     vlc_mutex_unlock( &p_intf->change_lock );
  645.     return TRUE;
  646. }
  647. /*****************************************************************************
  648.  * Run: main loop
  649.  *****************************************************************************
  650.  * this part of the interface is in a separate thread so that we can call
  651.  * g_main_loop_run() from within it without annoying the rest of the program.
  652.  *****************************************************************************/
  653. static void Run( intf_thread_t *p_intf )
  654. {
  655.     CORBA_Environment*        ev = NULL;
  656.     PortableServer_POA        root_poa;
  657.     PortableServer_POAManager root_poa_manager;
  658.     guint                     i_event_source;
  659.     CORBA_char*               psz_objref;
  660.     impl_POA_VLC_MediaControl *servant = NULL;
  661.     VLC_MediaControl          corba_instance;
  662.     mediacontrol_Instance     *mc_instance;
  663.     mediacontrol_Exception    *exception = NULL;
  664.     int i_argc = 1;
  665.     char* ppsz_argv[] = { "mc" };
  666.     int i_reactivity;
  667.     ev = CORBA_exception__alloc();
  668.     p_intf->p_sys->orb = CORBA_ORB_init( &i_argc, ppsz_argv, "orbit-local-orb", ev );
  669.     /* Should be cleaner this way ( cf
  670.        http://www.fifi.org/doc/gnome-dev-doc/html/C/orbitgtk.html ) but it
  671.        functions well enough in the ugly way so that I do not bother
  672.        cleaning it */
  673.     /* p_intf->p_sys->orb = gnome_CORBA_init ( "VLC", NULL, &argc, &argv, 0, NULL, ev ); */
  674.     handle_exception_no_servant( p_intf, "Exception during CORBA_ORB_init" );
  675.     root_poa = ( PortableServer_POA )CORBA_ORB_resolve_initial_references( p_intf->p_sys->orb, "RootPOA", ev );
  676.     handle_exception( "Exception during RootPOA initialization" );
  677.     corba_instance = impl_VLC_MediaControl__create( root_poa, ev );
  678.     handle_exception( "Exception during MediaControl initialization" );
  679.     servant = ( impl_POA_VLC_MediaControl* )PortableServer_POA_reference_to_servant( root_poa, corba_instance, ev );
  680.     handle_exception( "Exception during MediaControl access" );
  681.     MC_TRY;
  682.     mc_instance = mediacontrol_new_from_object((vlc_object_t* )p_intf, exception );
  683.     MC_EXCEPT();
  684.     p_intf->p_sys->mc = mc_instance;
  685.     servant->p_intf = p_intf;
  686.     servant->mc = p_intf->p_sys->mc;
  687.     psz_objref = CORBA_ORB_object_to_string( p_intf->p_sys->orb, corba_instance, ev );
  688.     handle_exception( "Exception during IOR generation" );
  689.     msg_Warn( p_intf, "MediaControl IOR :" );
  690.     msg_Warn( p_intf, psz_objref );
  691.     /* We write the IOR in a file. */
  692.     {
  693.         FILE* fp;
  694.         fp = fopen( VLC_IOR_FILE, "w" );
  695.         if( fp == NULL )
  696.         {
  697.             msg_Err( p_intf, "Cannot write the IOR to %s ( %d ).", VLC_IOR_FILE, errno );
  698.         }
  699.         else
  700.         {
  701.             fprintf( fp, "%s", psz_objref );
  702.             fclose( fp );
  703.             msg_Warn( p_intf, "IOR written to %s", VLC_IOR_FILE );
  704.         }
  705.     }
  706.   
  707.     root_poa_manager = PortableServer_POA__get_the_POAManager( root_poa, ev );
  708.     handle_exception( "Exception during POAManager resolution" );
  709.     PortableServer_POAManager_activate( root_poa_manager, ev );
  710.     handle_exception( "Exception during POAManager activation" );
  711.     msg_Info( p_intf, "corba remote control interface initialized" );
  712.     /*
  713.     // Tentative de gestion du nommage...
  714.     {
  715.     CosNaming_NamingContext name_service;
  716.     CosNaming_NameComponent name_component[3] = {{"GNOME", "subcontext"},
  717.     {"Servers", "subcontext"},
  718.     {"vlc", "server"} };
  719.     CosNaming_Name name = {3, 3, name_component, CORBA_FALSE};
  720.     name_service = CORBA_ORB_resolve_initial_references( p_intf->p_sys->orb,
  721.     "NameService",
  722.     ev );
  723.     handle_exception( "Error: could not get name service: %sn",
  724.     CORBA_exception_id( ev ) );
  725.     msg_Warn( p_intf, "Name service OK" );
  726.     CosNaming_NamingContext_bind( name_service, &name, p_intf->p_sys->mc, ev );
  727.     handle_exception( "Error: could not register object: %sn",
  728.     CORBA_exception_id( ev ) );
  729.     }
  730.     */
  731.     /* The time factor should be 1/1000 but it is a little too
  732.        slow. Make it 1/10000 */
  733.     i_reactivity = config_GetInt( p_intf, "corba-reactivity" );
  734.     i_event_source = g_timeout_add( INTF_IDLE_SLEEP / i_reactivity, Manage, p_intf );
  735.     p_intf->p_sys->corbaloop = g_main_loop_new( NULL, FALSE );
  736.     g_main_loop_run( p_intf->p_sys->corbaloop );
  737.     /* Cleaning */
  738.     g_source_remove( i_event_source );
  739.     unlink( VLC_IOR_FILE );
  740.     /* Make sure we exit ( In case other interfaces have been spawned ) */
  741.     mediacontrol_exit( p_intf->p_sys->mc );
  742.     return;
  743. }