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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * vlcshell.cpp: a VLC plugin for Mozilla
  3.  *****************************************************************************
  4.  * Copyright (C) 2002 VideoLAN
  5.  * $Id: vlcshell.cpp 7912 2004-06-06 13:02:26Z hartman $
  6.  *
  7.  * Authors: Samuel Hocevar <sam@zoy.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. /* XXX: disable VLC here */
  24. #define USE_LIBVLC 1
  25. /*****************************************************************************
  26.  * Preamble
  27.  *****************************************************************************/
  28. #include "config.h"
  29. #include <stdio.h>
  30. #include <string.h>
  31. #include <stdlib.h>
  32. /* vlc stuff */
  33. #ifdef USE_LIBVLC
  34. #   include <vlc/vlc.h>
  35. #endif
  36. /* Mozilla stuff */
  37. #ifdef HAVE_MOZILLA_CONFIG_H
  38. #   include <mozilla-config.h>
  39. #endif
  40. #include <nsISupports.h>
  41. #include <nsMemory.h>
  42. #include <npapi.h>
  43. #include <jri.h>
  44. #if !defined(XP_MACOSX) && !defined(XP_UNIX) && !defined(XP_WIN)
  45. #define XP_UNIX 1
  46. #elif defined(XP_MACOSX)
  47. #undef XP_UNIX
  48. #endif
  49. #ifdef XP_WIN
  50.     /* Windows stuff */
  51. #endif
  52. #ifdef XP_MACOSX
  53.     /* Mac OS X stuff */
  54. #   include <Quickdraw.h>
  55. #endif
  56. #ifdef XP_UNIX
  57.     /* X11 stuff */
  58. #   include <X11/Xlib.h>
  59. #   include <X11/Intrinsic.h>
  60. #   include <X11/StringDefs.h>
  61. #endif
  62. #include "vlcpeer.h"
  63. #include "vlcplugin.h"
  64. #if USE_LIBVLC
  65. #   define WINDOW_TEXT "(no picture)"
  66. #else
  67. #   define WINDOW_TEXT "(no libvlc)"
  68. #endif
  69. /*****************************************************************************
  70.  * Unix-only declarations
  71. ******************************************************************************/
  72. #ifdef XP_UNIX
  73. #   define VOUT_PLUGINS "xvideo,x11,dummy"
  74. #   define AOUT_PLUGINS "oss,dummy"
  75. static void Redraw( Widget w, XtPointer closure, XEvent *event );
  76. #endif
  77. /*****************************************************************************
  78.  * MacOS-only declarations
  79. ******************************************************************************/
  80. #ifdef XP_MACOSX
  81. #   define VOUT_PLUGINS "macosx"
  82. #   define AOUT_PLUGINS "macosx"
  83. #endif
  84. /*****************************************************************************
  85.  * Windows-only declarations
  86.  *****************************************************************************/
  87. #ifdef XP_WIN
  88. #   define VOUT_PLUGINS "directx,wingdi,dummy"
  89. #   define AOUT_PLUGINS "directx,waveout,dummy"
  90. #if defined(XP_WIN) && !USE_LIBVLC
  91. LRESULT CALLBACK Manage( HWND, UINT, WPARAM, LPARAM );
  92. #endif
  93. #endif
  94. /******************************************************************************
  95.  * UNIX-only API calls
  96.  *****************************************************************************/
  97. char * NPP_GetMIMEDescription( void )
  98. {
  99.     return PLUGIN_MIMETYPES;
  100. }
  101. NPError NPP_GetValue( NPP instance, NPPVariable variable, void *value )
  102. {
  103.     static nsIID nsid = VLCINTF_IID;
  104.     static char psz_desc[1000];
  105.     switch( variable )
  106.     {
  107.         case NPPVpluginNameString:
  108.             *((char **)value) = PLUGIN_NAME;
  109.             return NPERR_NO_ERROR;
  110.         case NPPVpluginDescriptionString:
  111. #if USE_LIBVLC
  112.             snprintf( psz_desc, 1000-1, PLUGIN_DESCRIPTION, VLC_Version() );
  113. #else
  114.             snprintf( psz_desc, 1000-1, PLUGIN_DESCRIPTION, "(disabled)" );
  115. #endif
  116.             psz_desc[1000-1] = 0;
  117.             *((char **)value) = psz_desc;
  118.             return NPERR_NO_ERROR;
  119.         default:
  120.             /* go on... */
  121.             break;
  122.     }
  123.     if( instance == NULL )
  124.     {
  125.         return NPERR_INVALID_INSTANCE_ERROR;
  126.     }
  127.     VlcPlugin* p_plugin = (VlcPlugin*) instance->pdata;
  128.     switch( variable )
  129.     {
  130.         case NPPVpluginScriptableInstance:
  131.             *(nsISupports**)value = p_plugin->GetPeer();
  132.             if( *(nsISupports**)value == NULL )
  133.             {
  134.                 return NPERR_OUT_OF_MEMORY_ERROR;
  135.             }
  136.             break;
  137.         case NPPVpluginScriptableIID:
  138.             *(nsIID**)value = (nsIID*)NPN_MemAlloc( sizeof(nsIID) );
  139.             if( *(nsIID**)value == NULL )
  140.             {
  141.                 return NPERR_OUT_OF_MEMORY_ERROR;
  142.             }
  143.             **(nsIID**)value = nsid;
  144.             break;
  145.         default:
  146.             return NPERR_GENERIC_ERROR;
  147.     }
  148.     return NPERR_NO_ERROR;
  149. }
  150. /******************************************************************************
  151.  * Mac-only API calls
  152.  *****************************************************************************/
  153. #ifdef XP_MACOSX
  154. int16 NPP_HandleEvent( NPP instance, void * event )
  155. {
  156.     VlcPlugin *p_plugin = (VlcPlugin*)instance->pdata;
  157.     vlc_value_t value;
  158.     if( instance == NULL )
  159.     {
  160.         return false;
  161.     }
  162.     EventRecord *pouetEvent = (EventRecord*)event;
  163.     if (pouetEvent->what == 6)
  164.     {
  165.         value.i_int = 1;
  166.         VLC_VariableSet( p_plugin->i_vlc, "drawableredraw", value );
  167.         return true;
  168.     }
  169.     Boolean eventHandled = false;
  170.     return eventHandled;
  171. }
  172. #endif
  173. /******************************************************************************
  174.  * General Plug-in Calls
  175.  *****************************************************************************/
  176. NPError NPP_Initialize( void )
  177. {
  178.     return NPERR_NO_ERROR;
  179. }
  180. jref NPP_GetJavaClass( void )
  181. {
  182.     return NULL;
  183. }
  184. void NPP_Shutdown( void )
  185. {
  186.     ;
  187. }
  188. NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
  189.                  char* argn[], char* argv[], NPSavedData* saved )
  190. {
  191.     int i;
  192. #if USE_LIBVLC
  193.     vlc_value_t value;
  194.     int i_ret;
  195. #endif
  196.     if( instance == NULL )
  197.     {
  198.         return NPERR_INVALID_INSTANCE_ERROR;
  199.     }
  200.     VlcPlugin * p_plugin = new VlcPlugin( instance );
  201.     if( p_plugin == NULL )
  202.     {
  203.         return NPERR_OUT_OF_MEMORY_ERROR;
  204.     }
  205.     instance->pdata = p_plugin;
  206. #ifdef XP_WIN
  207.     p_plugin->p_hwnd = NULL;
  208.     p_plugin->pf_wndproc = NULL;
  209. #endif
  210. #ifdef XP_UNIX
  211.     p_plugin->window = 0;
  212.     p_plugin->p_display = NULL;
  213. #endif
  214.     p_plugin->p_npwin = NULL;
  215.     p_plugin->i_npmode = mode;
  216.     p_plugin->i_width = 0;
  217.     p_plugin->i_height = 0;
  218. #if USE_LIBVLC
  219.     p_plugin->i_vlc = VLC_Create();
  220.     if( p_plugin->i_vlc < 0 )
  221.     {
  222.         p_plugin->i_vlc = 0;
  223.         delete p_plugin;
  224.         p_plugin = NULL;
  225.         return NPERR_GENERIC_ERROR;
  226.     }
  227.     {
  228. #ifdef XP_MACOSX
  229.         char *home_user;
  230.         char *directory;
  231.         char *plugin_path;
  232.         char *ppsz_argv[] = { "vlc", "--plugin-path", NULL };
  233.         home_user = strdup( getenv("HOME") );
  234.         directory = strdup( "/Library/Internet Plug-Ins/VLC Plugin.plugin/"
  235.                             "Contents/MacOS/modules" );
  236.         plugin_path = malloc( strlen( directory ) + strlen( home_user ) );
  237.         memcpy( plugin_path , home_user , strlen(home_user) );
  238.         memcpy( plugin_path + strlen( home_user ) , directory ,
  239.                 strlen( directory ) );
  240.         ppsz_argv[2] = plugin_path;
  241. #elif defined(XP_WIN)
  242.         char *ppsz_argv[] = { NULL, "-vv" };
  243.         HKEY h_key;
  244.         DWORD i_type, i_data = MAX_PATH + 1;
  245.         char p_data[MAX_PATH + 1];
  246.         if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\VideoLAN\VLC",
  247.                           0, KEY_READ, &h_key ) == ERROR_SUCCESS )
  248.         {
  249.              if( RegQueryValueEx( h_key, "InstallDir", 0, &i_type,
  250.                                   (LPBYTE)p_data, &i_data ) == ERROR_SUCCESS )
  251.              {
  252.                  if( i_type == REG_SZ )
  253.                  {
  254.                      strcat( p_data, "\vlc" );
  255.                      ppsz_argv[0] = p_data;
  256.                  }
  257.              }
  258.              RegCloseKey( h_key );
  259.         }
  260.         if( !ppsz_argv[0] ) ppsz_argv[0] = "vlc";
  261. #else
  262.         char *ppsz_argv[] =
  263.         {
  264.             "vlc"
  265.             /*, "--plugin-path", "/home/sam/videolan/vlc_MAIN/plugins"*/
  266.         };
  267. #endif
  268.         i_ret = VLC_Init( p_plugin->i_vlc, sizeof(ppsz_argv)/sizeof(char*),
  269.                           ppsz_argv );
  270. #ifdef XP_MACOSX
  271.         free( home_user );
  272.         free( directory );
  273.         free( plugin_path );
  274. #endif
  275.     }
  276.     if( i_ret )
  277.     {
  278.         VLC_Destroy( p_plugin->i_vlc );
  279.         p_plugin->i_vlc = 0;
  280.         delete p_plugin;
  281.         p_plugin = NULL;
  282.         return NPERR_GENERIC_ERROR;
  283.     }
  284.     value.psz_string = "dummy";
  285.     VLC_VariableSet( p_plugin->i_vlc, "conf::intf", value );
  286.     value.psz_string = VOUT_PLUGINS;
  287.     VLC_VariableSet( p_plugin->i_vlc, "conf::vout", value );
  288.     value.psz_string = AOUT_PLUGINS;
  289.     VLC_VariableSet( p_plugin->i_vlc, "conf::aout", value );
  290. #else
  291.     p_plugin->i_vlc = 1;
  292. #endif /* USE_LIBVLC */
  293.     p_plugin->b_stream = VLC_FALSE;
  294.     p_plugin->b_autoplay = VLC_FALSE;
  295.     p_plugin->psz_target = NULL;
  296.     for( i = 0; i < argc ; i++ )
  297.     {
  298.         if( !strcmp( argn[i], "target" ) )
  299.         {
  300.             p_plugin->psz_target = argv[i];
  301.         }
  302.         else if( !strcmp( argn[i], "autoplay" ) )
  303.         {
  304.             if( !strcmp( argv[i], "yes" ) )
  305.             {
  306.                 p_plugin->b_autoplay = 1;
  307.             }
  308.         }
  309.         else if( !strcmp( argn[i], "autostart" ) )
  310.         {
  311.             if( !strcmp( argv[i], "1" ) || !strcmp( argv[i], "true" ) )
  312.             {
  313.                 p_plugin->b_autoplay = 1;
  314.             }
  315.         }
  316.         else if( !strcmp( argn[i], "filename" ) )
  317.         {
  318.             p_plugin->psz_target = argv[i];
  319.         }
  320.         else if( !strcmp( argn[i], "src" ) )
  321.         {
  322.             p_plugin->psz_target = argv[i];
  323.         }
  324. #if USE_LIBVLC
  325.         else if( !strcmp( argn[i], "loop" ) )
  326.         {
  327.             if( !strcmp( argv[i], "yes" ) )
  328.             {
  329.                 value.b_bool = VLC_TRUE;
  330.                 VLC_VariableSet( p_plugin->i_vlc, "conf::loop", value );
  331.             }
  332.         }
  333.         else if( !strcmp( argn[i], "fullscreen" ) )
  334.         {
  335.             if( !strcmp( argv[i], "yes" ) )
  336.             {
  337.                 value.b_bool = VLC_TRUE;
  338.                 VLC_VariableSet( p_plugin->i_vlc, "conf::fullscreen", value );
  339.             }
  340.         }
  341. #endif
  342.     }
  343.     if( p_plugin->psz_target )
  344.     {
  345.         p_plugin->psz_target = strdup( p_plugin->psz_target );
  346.     }
  347.     return NPERR_NO_ERROR;
  348. }
  349. NPError NPP_Destroy( NPP instance, NPSavedData** save )
  350. {
  351.     if( instance == NULL )
  352.     {
  353.         return NPERR_INVALID_INSTANCE_ERROR;
  354.     }
  355.     VlcPlugin* p_plugin = (VlcPlugin*)instance->pdata;
  356.     if( p_plugin != NULL )
  357.     {
  358.         if( p_plugin->i_vlc )
  359.         {
  360. #if USE_LIBVLC
  361.             VLC_CleanUp( p_plugin->i_vlc );
  362.             VLC_Destroy( p_plugin->i_vlc );
  363. #endif
  364.             p_plugin->i_vlc = 0;
  365.         }
  366.         if( p_plugin->psz_target )
  367.         {
  368.             free( p_plugin->psz_target );
  369.             p_plugin->psz_target = NULL;
  370.         }
  371.         delete p_plugin;
  372.     }
  373.     instance->pdata = NULL;
  374.     return NPERR_NO_ERROR;
  375. }
  376. NPError NPP_SetWindow( NPP instance, NPWindow* window )
  377. {
  378.     vlc_value_t value;
  379. #ifdef XP_MACOSX
  380.     vlc_value_t valuex;
  381.     vlc_value_t valuey;
  382.     vlc_value_t valuew;
  383.     vlc_value_t valueh;
  384.     vlc_value_t valuet;
  385.     vlc_value_t valuel;
  386.     vlc_value_t valueb;
  387.     vlc_value_t valuer;
  388.     vlc_value_t valueportx;
  389.     vlc_value_t valueporty;
  390.     Rect black_rect;
  391.     char * text;
  392. #endif
  393.     if( instance == NULL )
  394.     {
  395.         return NPERR_INVALID_INSTANCE_ERROR;
  396.     }
  397.     VlcPlugin* p_plugin = (VlcPlugin*)instance->pdata;
  398.     /* Write the window ID for vlc */
  399. #if USE_LIBVLC
  400. #ifdef XP_MACOSX
  401.     value.i_int = ((NP_Port*) (window->window))->port;
  402.     VLC_VariableSet( p_plugin->i_vlc, "drawable", value );
  403.     valueportx.i_int = ((NP_Port*) (window->window))->portx;
  404.     valueporty.i_int = ((NP_Port*) (window->window))->porty;
  405.     VLC_VariableSet( p_plugin->i_vlc, "drawableportx", valueportx );
  406.     VLC_VariableSet( p_plugin->i_vlc, "drawableporty", valueporty );
  407.     valuex.i_int = window->x;
  408.     valuey.i_int = window->y;
  409.     valuew.i_int = window->width;
  410.     valueh.i_int = window->height;
  411.     valuet.i_int = window->clipRect.top;
  412.     valuel.i_int = window->clipRect.left;
  413.     valueb.i_int = window->clipRect.bottom;
  414.     valuer.i_int = window->clipRect.right;
  415.     VLC_VariableSet( p_plugin->i_vlc, "drawablet", valuet );
  416.     VLC_VariableSet( p_plugin->i_vlc, "drawablel", valuel );
  417.     VLC_VariableSet( p_plugin->i_vlc, "drawableb", valueb );
  418.     VLC_VarialbeSet( p_plugin->i_vlc, "drawabler", valuer );
  419.     VLC_VariableSet( p_plugin->i_vlc, "drawablex", valuex );
  420.     VLC_VariableSet( p_plugin->i_vlc, "drawabley", valuey );
  421.     VLC_VariableSet( p_plugin->i_vlc, "drawablew", valuew );
  422.     VLC_VariableSet( p_plugin->i_vlc, "drawableh", valueh );
  423.     p_plugin->window = window;
  424.     /* draw the beautiful "No Picture" */
  425.     black_rect.top = valuet.i_int - valuey.i_int;
  426.     black_rect.left = valuel.i_int - valuex.i_int;
  427.     black_rect.bottom = valueb.i_int - valuey.i_int;
  428.     black_rect.right = valuer.i_int - valuex.i_int;
  429.     SetPort( value.i_int );
  430.     SetOrigin( valueportx.i_int , valueporty.i_int );
  431.     ForeColor(blackColor);
  432.     PenMode( patCopy );
  433.     PaintRect( &black_rect );
  434.     ForeColor(whiteColor);
  435.     text = strdup( WINDOW_TEXT );
  436.     MoveTo( valuew.i_int / 2 - 40 , valueh.i_int / 2 );
  437.     DrawText( text , 0 , strlen(text) );
  438.     free(text);
  439. #else
  440.     /* FIXME: this cast sucks */
  441.     value.i_int = (int) (ptrdiff_t) (void *) window->window;
  442.     VLC_VariableSet( p_plugin->i_vlc, "drawable", value );
  443. #endif
  444. #endif
  445.     /*
  446.      * PLUGIN DEVELOPERS:
  447.      *  Before setting window to point to the
  448.      *  new window, you may wish to compare the new window
  449.      *  info to the previous window (if any) to note window
  450.      *  size changes, etc.
  451.      */
  452. #ifdef XP_WIN
  453.     if( !window || !window->window )
  454.     {
  455.         /* Window was destroyed. Invalidate everything. */
  456.         if( p_plugin->p_npwin )
  457.         {
  458. #if !USE_LIBVLC
  459.             SetWindowLong( p_plugin->p_hwnd, GWL_WNDPROC,
  460.                            (LONG)p_plugin->pf_wndproc );
  461. #endif
  462.             p_plugin->pf_wndproc = NULL;
  463.             p_plugin->p_hwnd = NULL;
  464.         }
  465.         p_plugin->p_npwin = window;
  466.         return NPERR_NO_ERROR;
  467.     }
  468.     if( p_plugin->p_npwin )
  469.     {
  470.         if( p_plugin->p_hwnd == (HWND)window->window )
  471.         {
  472.             /* Same window, but something may have changed. First we
  473.              * update the plugin structure, then we redraw the window */
  474.             p_plugin->i_width = window->width;
  475.             p_plugin->i_height = window->height;
  476.             p_plugin->p_npwin = window;
  477. #if !USE_LIBVLC
  478.             InvalidateRect( p_plugin->p_hwnd, NULL, TRUE );
  479.             UpdateWindow( p_plugin->p_hwnd );
  480. #endif
  481.             return NPERR_NO_ERROR;
  482.         }
  483.         /* Window has changed. Destroy the one we have, and go
  484.          * on as if it was a real initialization. */
  485. #if !USE_LIBVLC
  486.         SetWindowLong( p_plugin->p_hwnd, GWL_WNDPROC,
  487.                        (LONG)p_plugin->pf_wndproc );
  488. #endif
  489.         p_plugin->pf_wndproc = NULL;
  490.         p_plugin->p_hwnd = NULL;
  491.     }
  492. #if !USE_LIBVLC
  493.     p_plugin->pf_wndproc = (WNDPROC)SetWindowLong( (HWND)window->window,
  494.                                                    GWL_WNDPROC, (LONG)Manage );
  495. #endif
  496.     p_plugin->p_hwnd = (HWND)window->window;
  497.     SetProp( p_plugin->p_hwnd, "w00t", (HANDLE)p_plugin );
  498.     InvalidateRect( p_plugin->p_hwnd, NULL, TRUE );
  499.     UpdateWindow( p_plugin->p_hwnd );
  500. #endif
  501. #ifdef XP_UNIX
  502.     p_plugin->window = (Window) window->window;
  503.     p_plugin->p_display = ((NPSetWindowCallbackStruct *)window->ws_info)->display;
  504.     Widget w = XtWindowToWidget( p_plugin->p_display, p_plugin->window );
  505.     XtAddEventHandler( w, ExposureMask, FALSE,
  506.                        (XtEventHandler)Redraw, p_plugin );
  507.     Redraw( w, (XtPointer)p_plugin, NULL );
  508. #endif
  509.     p_plugin->p_npwin = window;
  510.     p_plugin->i_width = window->width;
  511.     p_plugin->i_height = window->height;
  512.     if( !p_plugin->b_stream )
  513.     {
  514.         int i_mode = PLAYLIST_APPEND;
  515.         if( p_plugin->b_autoplay )
  516.         {
  517.             i_mode |= PLAYLIST_GO;
  518.         }
  519.         if( p_plugin->psz_target )
  520.         {
  521. #if USE_LIBVLC
  522.             VLC_AddTarget( p_plugin->i_vlc, p_plugin->psz_target,
  523.                            0, 0, i_mode, PLAYLIST_END );
  524. #endif
  525.             p_plugin->b_stream = VLC_TRUE;
  526.         }
  527.     }
  528.     return NPERR_NO_ERROR;
  529. }
  530. NPError NPP_NewStream( NPP instance, NPMIMEType type, NPStream *stream,
  531.                        NPBool seekable, uint16 *stype )
  532. {
  533.     if( instance == NULL )
  534.     {
  535.         return NPERR_INVALID_INSTANCE_ERROR;
  536.     }
  537. #if 0
  538.     VlcPlugin* p_plugin = (VlcPlugin*)instance->pdata;
  539. #endif
  540.     /* fprintf(stderr, "NPP_NewStream - FILE mode !!n"); */
  541.     /* We want a *filename* ! */
  542.     *stype = NP_ASFILE;
  543. #if 0
  544.     if( !p_plugin->b_stream )
  545.     {
  546.         p_plugin->psz_target = strdup( stream->url );
  547.         p_plugin->b_stream = VLC_TRUE;
  548.     }
  549. #endif
  550.     return NPERR_NO_ERROR;
  551. }
  552. int32 STREAMBUFSIZE = 0X0FFFFFFF; /* If we are reading from a file in NPAsFile
  553.                    * mode so we can take any size stream in our
  554.                    * write call (since we ignore it) */
  555. #define SARASS_SIZE (1024*1024)
  556. int32 NPP_WriteReady( NPP instance, NPStream *stream )
  557. {
  558.     VlcPlugin* p_plugin;
  559.     /* fprintf(stderr, "NPP_WriteReadyn"); */
  560.     if (instance != NULL)
  561.     {
  562.         p_plugin = (VlcPlugin*) instance->pdata;
  563.         /* Muahahahahahahaha */
  564.         return STREAMBUFSIZE;
  565.         /*return SARASS_SIZE;*/
  566.     }
  567.     /* Number of bytes ready to accept in NPP_Write() */
  568.     return STREAMBUFSIZE;
  569.     /*return 0;*/
  570. }
  571. int32 NPP_Write( NPP instance, NPStream *stream, int32 offset,
  572.                  int32 len, void *buffer )
  573. {
  574.     /* fprintf(stderr, "NPP_Write %in", (int)len); */
  575.     if( instance != NULL )
  576.     {
  577.         /*VlcPlugin* p_plugin = (VlcPlugin*) instance->pdata;*/
  578.     }
  579.     return len;         /* The number of bytes accepted */
  580. }
  581. NPError NPP_DestroyStream( NPP instance, NPStream *stream, NPError reason )
  582. {
  583.     if( instance == NULL )
  584.     {
  585.         return NPERR_INVALID_INSTANCE_ERROR;
  586.     }
  587.     return NPERR_NO_ERROR;
  588. }
  589. void NPP_StreamAsFile( NPP instance, NPStream *stream, const char* fname )
  590. {
  591.     if( instance == NULL )
  592.     {
  593.         return;
  594.     }
  595.     /* fprintf(stderr, "NPP_StreamAsFile %sn", fname); */
  596. #if USE_LIBVLC
  597.     VlcPlugin* p_plugin = (VlcPlugin*)instance->pdata;
  598.     VLC_AddTarget( p_plugin->i_vlc, fname, 0, 0,
  599.                    PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );
  600. #endif
  601. }
  602. void NPP_URLNotify( NPP instance, const char* url,
  603.                     NPReason reason, void* notifyData )
  604. {
  605.     /***** Insert NPP_URLNotify code here *****
  606.     PluginInstance* p_plugin;
  607.     if (instance != NULL)
  608.         p_plugin = (PluginInstance*) instance->pdata;
  609.     *********************************************/
  610. }
  611. void NPP_Print( NPP instance, NPPrint* printInfo )
  612. {
  613.     if( printInfo == NULL )
  614.     {
  615.         return;
  616.     }
  617.     if( instance != NULL )
  618.     {
  619.         /***** Insert NPP_Print code here *****
  620.         PluginInstance* p_plugin = (PluginInstance*) instance->pdata;
  621.         **************************************/
  622.         if( printInfo->mode == NP_FULL )
  623.         {
  624.             /*
  625.              * PLUGIN DEVELOPERS:
  626.              *  If your plugin would like to take over
  627.              *  printing completely when it is in full-screen mode,
  628.              *  set printInfo->pluginPrinted to TRUE and print your
  629.              *  plugin as you see fit.  If your plugin wants Netscape
  630.              *  to handle printing in this case, set
  631.              *  printInfo->pluginPrinted to FALSE (the default) and
  632.              *  do nothing.  If you do want to handle printing
  633.              *  yourself, printOne is true if the print button
  634.              *  (as opposed to the print menu) was clicked.
  635.              *  On the Macintosh, platformPrint is a THPrint; on
  636.              *  Windows, platformPrint is a structure
  637.              *  (defined in npapi.h) containing the printer name, port,
  638.              *  etc.
  639.              */
  640.             /***** Insert NPP_Print code here *****
  641.             void* platformPrint =
  642.                 printInfo->print.fullPrint.platformPrint;
  643.             NPBool printOne =
  644.                 printInfo->print.fullPrint.printOne;
  645.             **************************************/
  646.             /* Do the default*/
  647.             printInfo->print.fullPrint.pluginPrinted = FALSE;
  648.         }
  649.         else
  650.         {
  651.             /* If not fullscreen, we must be embedded */
  652.             /*
  653.              * PLUGIN DEVELOPERS:
  654.              *  If your plugin is embedded, or is full-screen
  655.              *  but you returned false in pluginPrinted above, NPP_Print
  656.              *  will be called with mode == NP_EMBED.  The NPWindow
  657.              *  in the printInfo gives the location and dimensions of
  658.              *  the embedded plugin on the printed page.  On the
  659.              *  Macintosh, platformPrint is the printer port; on
  660.              *  Windows, platformPrint is the handle to the printing
  661.              *  device context.
  662.              */
  663.             /***** Insert NPP_Print code here *****
  664.             NPWindow* printWindow =
  665.                 &(printInfo->print.embedPrint.window);
  666.             void* platformPrint =
  667.                 printInfo->print.embedPrint.platformPrint;
  668.             **************************************/
  669.         }
  670.     }
  671. }
  672. /******************************************************************************
  673.  * Windows-only methods
  674.  *****************************************************************************/
  675. #if defined(XP_WIN) && !USE_LIBVLC
  676. LRESULT CALLBACK Manage( HWND p_hwnd, UINT i_msg, WPARAM wpar, LPARAM lpar )
  677. {
  678.     VlcPlugin* p_plugin = (VlcPlugin*) GetProp( p_hwnd, "w00t" );
  679.     switch( i_msg )
  680.     {
  681.         case WM_PAINT:
  682.         {
  683.             PAINTSTRUCT paintstruct;
  684.             HDC hdc;
  685.             RECT rect;
  686.             hdc = BeginPaint( p_hwnd, &paintstruct );
  687.             GetClientRect( p_hwnd, &rect );
  688.             FillRect( hdc, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH) );
  689.             TextOut( hdc, p_plugin->i_width / 2 - 40, p_plugin->i_height / 2,
  690.                      WINDOW_TEXT, strlen(WINDOW_TEXT) );
  691.             EndPaint( p_hwnd, &paintstruct );
  692.             break;
  693.         }
  694.         default:
  695.             p_plugin->pf_wndproc( p_hwnd, i_msg, wpar, lpar );
  696.             break;
  697.     }
  698.     return 0;
  699. }
  700. #endif
  701. /******************************************************************************
  702.  * UNIX-only methods
  703.  *****************************************************************************/
  704. #ifdef XP_UNIX
  705. static void Redraw( Widget w, XtPointer closure, XEvent *event )
  706. {
  707.     VlcPlugin* p_plugin = (VlcPlugin*)closure;
  708.     GC gc;
  709.     XGCValues gcv;
  710.     gcv.foreground = BlackPixel( p_plugin->p_display, 0 );
  711.     gc = XCreateGC( p_plugin->p_display, p_plugin->window, GCForeground, &gcv );
  712.     XFillRectangle( p_plugin->p_display, p_plugin->window, gc,
  713.                     0, 0, p_plugin->i_width, p_plugin->i_height );
  714.     gcv.foreground = WhitePixel( p_plugin->p_display, 0 );
  715.     XChangeGC( p_plugin->p_display, gc, GCForeground, &gcv );
  716.     XDrawString( p_plugin->p_display, p_plugin->window, gc,
  717.                  p_plugin->i_width / 2 - 40, p_plugin->i_height / 2,
  718.                  WINDOW_TEXT, strlen(WINDOW_TEXT) );
  719.     XFreeGC( p_plugin->p_display, gc );
  720. }
  721. #endif