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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * beos_init.cpp: Initialization for BeOS specific features
  3.  *****************************************************************************
  4.  * Copyright (C) 1999-2004 VideoLAN
  5.  * $Id: beos_specific.cpp 8905 2004-10-04 13:34:42Z gbazin $
  6.  *
  7.  * Authors: Jean-Marc Dressler <polux@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. #include <Application.h>
  24. #include <Roster.h>
  25. #include <Path.h>
  26. #include <Alert.h>
  27. #include <Message.h>
  28. #include <Window.h>
  29. #include <stdio.h>
  30. #include <string.h> /* strdup() */
  31. #include <malloc.h> /* free() */
  32. extern "C"
  33. {
  34. #include <vlc/vlc.h>
  35. }
  36. /*****************************************************************************
  37.  * The VlcApplication class
  38.  *****************************************************************************/
  39. class VlcApplication : public BApplication
  40. {
  41. public:
  42.     vlc_object_t *p_this;
  43.     VlcApplication(char* );
  44.     ~VlcApplication();
  45.     virtual void ReadyToRun();
  46.     virtual void AboutRequested();
  47.     virtual void RefsReceived(BMessage* message);
  48.     virtual void MessageReceived(BMessage* message);
  49.     virtual bool QuitRequested();
  50. private:
  51.     BWindow*     fInterfaceWindow;
  52.     BMessage*    fRefsMessage;
  53.     bool         fReadyToQuit;
  54. };
  55. /*****************************************************************************
  56.  * Static vars
  57.  *****************************************************************************/
  58. #include "../../modules/gui/beos/MsgVals.h"
  59. #define REALLY_QUIT 'requ'
  60. extern "C"
  61. {
  62. /*****************************************************************************
  63.  * Local prototypes.
  64.  *****************************************************************************/
  65. static void AppThread( vlc_object_t *p_appthread );
  66. /*****************************************************************************
  67.  * system_Init: create a BApplication object and fill in program path.
  68.  *****************************************************************************/
  69. void system_Init( vlc_t *p_this, int *pi_argc, char *ppsz_argv[] )
  70. {
  71.     p_this->p_libvlc->p_appthread =
  72.             (vlc_object_t *)vlc_object_create( p_this, sizeof(vlc_object_t) );
  73.     /* Create the BApplication thread and wait for initialization */
  74.     vlc_thread_create( p_this->p_libvlc->p_appthread, "app thread", AppThread,
  75.                        VLC_THREAD_PRIORITY_LOW, VLC_TRUE );
  76. }
  77. /*****************************************************************************
  78.  * system_Configure: check for system specific configuration options.
  79.  *****************************************************************************/
  80. void system_Configure( vlc_t *, int *pi_argc, char *ppsz_argv[] )
  81. {
  82. }
  83. /*****************************************************************************
  84.  * system_End: destroy the BApplication object.
  85.  *****************************************************************************/
  86. void system_End( vlc_t *p_this )
  87. {
  88.     /* Tell the BApplication to die */
  89.     be_app->PostMessage( REALLY_QUIT );
  90.     vlc_thread_join( p_this->p_libvlc->p_appthread );
  91.     vlc_object_destroy( p_this->p_libvlc->p_appthread );
  92.     free( p_this->p_libvlc->psz_vlcpath );
  93. }
  94. /* following functions are local */
  95. /*****************************************************************************
  96.  * AppThread: the BApplication thread.
  97.  *****************************************************************************/
  98. static void AppThread( vlc_object_t * p_this )
  99. {
  100.     VlcApplication * BeApp =
  101.         new VlcApplication("application/x-vnd.videolan-vlc");
  102.     vlc_object_attach( p_this, p_this->p_vlc );
  103.     BeApp->p_this = p_this;
  104.     BeApp->Run();
  105.     vlc_object_detach( p_this );
  106.     delete BeApp;
  107. }
  108. } /* extern "C" */
  109. /*****************************************************************************
  110.  * VlcApplication: application constructor
  111.  *****************************************************************************/
  112. VlcApplication::VlcApplication( char * psz_mimetype )
  113.                :BApplication( psz_mimetype ),
  114.                 fInterfaceWindow( NULL ),
  115.                 fRefsMessage( NULL ),
  116.                 fReadyToQuit( false )
  117. {
  118.     /* Nothing to do, we use the default constructor */
  119. }
  120. /*****************************************************************************
  121.  * ~VlcApplication: application destructor
  122.  *****************************************************************************/
  123. VlcApplication::~VlcApplication( )
  124. {
  125.     /* Nothing to do, we use the default destructor */
  126.     delete fRefsMessage;
  127. }
  128. /*****************************************************************************
  129.  * AboutRequested: called by the system on B_ABOUT_REQUESTED
  130.  *****************************************************************************/
  131. void VlcApplication::AboutRequested( )
  132. {
  133.     BAlert *alert;
  134.     alert = new BAlert( "VLC " PACKAGE_VERSION,
  135.                         "VLC " PACKAGE_VERSION " for BeOSnn"
  136.                                         "<www.videolan.org>", "OK");
  137.     alert->Go( NULL );
  138. }
  139. /*****************************************************************************
  140.  * ReadyToRun: called when the BApplication is initialized
  141.  *****************************************************************************/
  142. void VlcApplication::ReadyToRun( )
  143. {
  144.     BPath path;
  145.     app_info info;
  146.     /* Get the program path */
  147.     be_app->GetAppInfo( &info );
  148.     BEntry entry( &info.ref );
  149.     entry.GetPath( &path );
  150.     path.GetParent( &path );
  151.     p_this->p_libvlc->psz_vlcpath = strdup( path.Path() );
  152.     /* Tell the main thread we are finished initializing the BApplication */
  153.     vlc_thread_ready( p_this );
  154. }
  155. /*****************************************************************************
  156.  * RefsReceived: called when files are sent to our application
  157.  *               (for example when the user drops fils onto our icon)
  158.  *****************************************************************************/
  159. void VlcApplication::RefsReceived(BMessage* message)
  160. {
  161.     if (fInterfaceWindow)
  162.         fInterfaceWindow->PostMessage(message);
  163.     else {
  164.         delete fRefsMessage;
  165.         fRefsMessage = new BMessage(*message);
  166.     }
  167. }
  168. /*****************************************************************************
  169.  * MessageReceived: a BeOS applications main message loop
  170.  *                  Since VlcApplication and interface are separated
  171.  *                  in the vlc binary and the interface plugin,
  172.  *                  we use this method to "stick" them together.
  173.  *                  The interface will post a message to the global
  174.  *                  "be_app" pointer when the interface is created
  175.  *                  containing a pointer to the interface window.
  176.  *                  In this way, we can keep a B_REFS_RECEIVED message
  177.  *                  in store for the interface window to handle later.
  178.  *****************************************************************************/
  179. void VlcApplication::MessageReceived(BMessage* message)
  180. {
  181.     switch (message->what) {
  182.         case INTERFACE_CREATED: {
  183.             BWindow* interfaceWindow;
  184.             if (message->FindPointer("window", (void**)&interfaceWindow) == B_OK) {
  185.                 fInterfaceWindow = interfaceWindow;
  186.                 if (fRefsMessage) {
  187.                     fInterfaceWindow->PostMessage(fRefsMessage);
  188.                     delete fRefsMessage;
  189.                     fRefsMessage = NULL;
  190.                 }
  191.             }
  192.             break;
  193.         }
  194.         case REALLY_QUIT:
  195.             fReadyToQuit = true;
  196.             PostMessage( B_QUIT_REQUESTED );
  197.             break;
  198.         default:
  199.             BApplication::MessageReceived(message);
  200.     }
  201. }
  202. bool VlcApplication::QuitRequested()
  203. {
  204.     if( !fReadyToQuit )
  205.     {
  206.         p_this->p_vlc->b_die = 1;
  207.         return false;
  208.     }
  209.     BApplication::QuitRequested();
  210.     return true;
  211. }