1 /*****************************************************************************
\r
2 * npovlc.cpp: deprecated VLC apis implemented in late XPCOM interface
\r
3 *****************************************************************************
\r
4 * Copyright (C) 2002-2006 the VideoLAN team
\r
6 * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
\r
8 * This program is free software; you can redistribute it and/or modify
\r
9 * it under the terms of the GNU General Public License as published by
\r
10 * the Free Software Foundation; either version 2 of the License, or
\r
11 * (at your option) any later version.
\r
13 * This program is distributed in the hope that it will be useful,
\r
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
16 * GNU General Public License for more details.
\r
18 * You should have received a copy of the GNU General Public License
\r
19 * along with this program; if not, write to the Free Software
\r
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
\r
21 *****************************************************************************/
\r
33 #include <vlc/vlc.h>
\r
36 #ifdef HAVE_MOZILLA_CONFIG_H
\r
37 # include <mozilla-config.h>
\r
41 #include "vlcplugin.h"
\r
44 ** implementation of vlc root object
\r
47 const NPUTF8 * const VlcNPObject::propertyNames[] =
\r
52 const int VlcNPObject::propertyCount = sizeof(VlcNPObject::propertyNames)/sizeof(NPUTF8 *);
\r
54 const NPUTF8 * const VlcNPObject::methodNames[] =
\r
56 "play", /* deprecated */
\r
57 "pause", /* deprecated */
\r
58 "stop", /* deprecated */
\r
59 "fullscreen", /* deprecated */
\r
60 "set_volume", /* deprecated */
\r
61 "get_volume", /* deprecated */
\r
62 "mute", /* deprecated */
\r
63 "get_int_variable", /* deprecated */
\r
64 "set_int_variable", /* deprecated */
\r
65 "get_bool_variable", /* deprecated */
\r
66 "set_bool_variable", /* deprecated */
\r
67 "get_str_variable", /* deprecated */
\r
68 "set_str_variable", /* deprecated */
\r
69 "clear_playlist", /* deprecated */
\r
70 "add_item", /* deprecated */
\r
71 "next", /* deprecated */
\r
72 "previous", /* deprecated */
\r
73 "isplaying", /* deprecated */
\r
74 "get_length", /* deprecated */
\r
75 "get_position", /* deprecated */
\r
76 "get_time", /* deprecated */
\r
77 "seek", /* deprecated */
\r
80 enum VlcNPObjectMethodIds
\r
89 ID_get_int_variable,
\r
90 ID_set_int_variable,
\r
91 ID_get_bool_variable,
\r
92 ID_set_bool_variable,
\r
93 ID_get_str_variable,
\r
94 ID_set_str_variable,
\r
106 const int VlcNPObject::methodCount = sizeof(VlcNPObject::methodNames)/sizeof(NPUTF8 *);
\r
108 RuntimeNPObject::InvokeResult VlcNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)
\r
110 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
113 libvlc_exception_t ex;
\r
114 libvlc_exception_init(&ex);
\r
118 case ID_play: /* deprecated */
\r
119 if( argCount == 0 )
\r
121 libvlc_playlist_play(p_plugin->getVLC(), -1, 0, NULL, &ex);
\r
122 if( libvlc_exception_raised(&ex) )
\r
124 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
125 libvlc_exception_clear(&ex);
\r
126 return INVOKERESULT_GENERIC_ERROR;
\r
130 VOID_TO_NPVARIANT(result);
\r
131 return INVOKERESULT_NO_ERROR;
\r
134 return INVOKERESULT_NO_SUCH_METHOD;
\r
135 case ID_pause: /* deprecated */
\r
136 if( argCount == 0 )
\r
138 libvlc_playlist_pause(p_plugin->getVLC(), &ex);
\r
139 if( libvlc_exception_raised(&ex) )
\r
141 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
142 libvlc_exception_clear(&ex);
\r
143 return INVOKERESULT_GENERIC_ERROR;
\r
147 VOID_TO_NPVARIANT(result);
\r
148 return INVOKERESULT_NO_ERROR;
\r
151 return INVOKERESULT_NO_SUCH_METHOD;
\r
152 case ID_stop: /* deprecated */
\r
153 if( argCount == 0 )
\r
155 libvlc_playlist_stop(p_plugin->getVLC(), &ex);
\r
156 if( libvlc_exception_raised(&ex) )
\r
158 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
159 libvlc_exception_clear(&ex);
\r
160 return INVOKERESULT_GENERIC_ERROR;
\r
164 VOID_TO_NPVARIANT(result);
\r
165 return INVOKERESULT_NO_ERROR;
\r
168 return INVOKERESULT_NO_SUCH_METHOD;
\r
169 case ID_fullscreen: /* deprecated */
\r
170 if( argCount == 0 )
\r
172 libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_plugin->getVLC(), &ex);
\r
175 libvlc_toggle_fullscreen(p_md, &ex);
\r
176 libvlc_media_instance_release(p_md);
\r
177 if( libvlc_exception_raised(&ex) )
\r
179 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
180 libvlc_exception_clear(&ex);
\r
181 return INVOKERESULT_GENERIC_ERROR;
\r
185 VOID_TO_NPVARIANT(result);
\r
186 return INVOKERESULT_NO_ERROR;
\r
191 /* cannot get input, probably not playing */
\r
192 if( libvlc_exception_raised(&ex) )
\r
194 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
195 libvlc_exception_clear(&ex);
\r
197 return INVOKERESULT_GENERIC_ERROR;
\r
200 return INVOKERESULT_NO_SUCH_METHOD;
\r
201 case ID_set_volume: /* deprecated */
\r
202 if( (argCount == 1) && isNumberValue(args[0]) )
\r
204 libvlc_audio_set_volume(p_plugin->getVLC(), numberValue(args[0]), &ex);
\r
205 if( libvlc_exception_raised(&ex) )
\r
207 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
208 libvlc_exception_clear(&ex);
\r
209 return INVOKERESULT_GENERIC_ERROR;
\r
213 VOID_TO_NPVARIANT(result);
\r
214 return INVOKERESULT_NO_ERROR;
\r
217 return INVOKERESULT_NO_SUCH_METHOD;
\r
218 case ID_get_volume: /* deprecated */
\r
219 if( argCount == 0 )
\r
221 int val = libvlc_audio_get_volume(p_plugin->getVLC(), &ex);
\r
222 if( libvlc_exception_raised(&ex) )
\r
224 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
225 libvlc_exception_clear(&ex);
\r
226 return INVOKERESULT_GENERIC_ERROR;
\r
230 INT32_TO_NPVARIANT(val, result);
\r
231 return INVOKERESULT_NO_ERROR;
\r
234 return INVOKERESULT_NO_SUCH_METHOD;
\r
235 case ID_mute: /* deprecated */
\r
236 if( argCount == 0 )
\r
238 libvlc_audio_toggle_mute(p_plugin->getVLC(), &ex);
\r
239 if( libvlc_exception_raised(&ex) )
\r
241 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
242 libvlc_exception_clear(&ex);
\r
243 return INVOKERESULT_GENERIC_ERROR;
\r
247 VOID_TO_NPVARIANT(result);
\r
248 return INVOKERESULT_NO_ERROR;
\r
251 return INVOKERESULT_NO_SUCH_METHOD;
\r
252 case ID_get_int_variable: /* deprecated */
\r
253 if( (argCount == 1) && NPVARIANT_IS_STRING(args[0]) )
\r
255 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
258 int vlc_id = libvlc_get_vlc_id(p_plugin->getVLC());
\r
260 if( VLC_SUCCESS == VLC_VariableGet(vlc_id, s, &val) )
\r
263 INT32_TO_NPVARIANT(val.i_int, result);
\r
264 return INVOKERESULT_NO_ERROR;
\r
269 return INVOKERESULT_INVALID_ARGS;
\r
273 return INVOKERESULT_OUT_OF_MEMORY;
\r
275 return INVOKERESULT_NO_SUCH_METHOD;
\r
276 case ID_set_int_variable: /* deprecated */
\r
277 if( (argCount == 2)
\r
278 && NPVARIANT_IS_STRING(args[0])
\r
279 && isNumberValue(args[1]) )
\r
281 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
284 int vlc_id = libvlc_get_vlc_id(p_plugin->getVLC());
\r
286 val.i_int = numberValue(args[1]);
\r
287 if( VLC_SUCCESS == VLC_VariableSet(vlc_id, s, val) )
\r
290 VOID_TO_NPVARIANT(result);
\r
291 return INVOKERESULT_NO_ERROR;
\r
296 return INVOKERESULT_INVALID_ARGS;
\r
300 return INVOKERESULT_OUT_OF_MEMORY;
\r
302 return INVOKERESULT_NO_SUCH_METHOD;
\r
303 case ID_get_bool_variable: /* deprecated */
\r
304 if( (argCount == 1) && NPVARIANT_IS_STRING(args[0]) )
\r
306 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
309 int vlc_id = libvlc_get_vlc_id(p_plugin->getVLC());
\r
311 if( VLC_SUCCESS == VLC_VariableGet(vlc_id, s, &val) )
\r
314 BOOLEAN_TO_NPVARIANT(val.b_bool, result);
\r
315 return INVOKERESULT_NO_ERROR;
\r
320 return INVOKERESULT_INVALID_ARGS;
\r
324 return INVOKERESULT_OUT_OF_MEMORY;
\r
326 return INVOKERESULT_NO_SUCH_METHOD;
\r
327 case ID_set_bool_variable: /* deprecated */
\r
328 if( (argCount == 2)
\r
329 && NPVARIANT_IS_STRING(args[0])
\r
330 && NPVARIANT_IS_BOOLEAN(args[1]) )
\r
332 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
335 int vlc_id = libvlc_get_vlc_id(p_plugin->getVLC());
\r
337 val.b_bool = NPVARIANT_TO_BOOLEAN(args[1]);
\r
338 if( VLC_SUCCESS == VLC_VariableSet(vlc_id, s, val) )
\r
341 VOID_TO_NPVARIANT(result);
\r
342 return INVOKERESULT_NO_ERROR;
\r
347 return INVOKERESULT_INVALID_ARGS;
\r
351 return INVOKERESULT_OUT_OF_MEMORY;
\r
353 return INVOKERESULT_NO_SUCH_METHOD;
\r
354 case ID_get_str_variable: /* deprecated */
\r
355 if( (argCount == 1) && NPVARIANT_IS_STRING(args[0]) )
\r
357 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
360 int vlc_id = libvlc_get_vlc_id(p_plugin->getVLC());
\r
362 if( VLC_SUCCESS == VLC_VariableGet(vlc_id, s, &val) )
\r
365 if( val.psz_string )
\r
367 int len = strlen(val.psz_string);
\r
368 NPUTF8 *retval = (NPUTF8 *)NPN_MemAlloc(len);
\r
371 memcpy(retval, val.psz_string, len);
\r
372 STRINGN_TO_NPVARIANT(retval, len, result);
\r
373 free(val.psz_string);
\r
374 return INVOKERESULT_NO_ERROR;
\r
378 return INVOKERESULT_OUT_OF_MEMORY;
\r
384 NULL_TO_NPVARIANT(result);
\r
385 return INVOKERESULT_NO_ERROR;
\r
391 return INVOKERESULT_INVALID_ARGS;
\r
395 return INVOKERESULT_OUT_OF_MEMORY;
\r
397 return INVOKERESULT_NO_SUCH_METHOD;
\r
398 case ID_set_str_variable: /* deprecated */
\r
399 if( (argCount == 2)
\r
400 && NPVARIANT_IS_STRING(args[0])
\r
401 && NPVARIANT_IS_STRING(args[1]) )
\r
403 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
406 int vlc_id = libvlc_get_vlc_id(p_plugin->getVLC());
\r
408 val.psz_string = stringValue(NPVARIANT_TO_STRING(args[1]));
\r
409 if( val.psz_string )
\r
411 if( VLC_SUCCESS == VLC_VariableSet(vlc_id, s, val) )
\r
414 delete val.psz_string;
\r
415 VOID_TO_NPVARIANT(result);
\r
416 return INVOKERESULT_NO_ERROR;
\r
421 delete val.psz_string;
\r
422 return INVOKERESULT_INVALID_ARGS;
\r
428 return INVOKERESULT_OUT_OF_MEMORY;
\r
432 return INVOKERESULT_OUT_OF_MEMORY;
\r
434 return INVOKERESULT_NO_SUCH_METHOD;
\r
435 case ID_clear_playlist: /* deprecated */
\r
436 if( argCount == 0 )
\r
438 libvlc_playlist_clear(p_plugin->getVLC(), &ex);
\r
439 if( libvlc_exception_raised(&ex) )
\r
441 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
442 libvlc_exception_clear(&ex);
\r
443 return INVOKERESULT_GENERIC_ERROR;
\r
447 VOID_TO_NPVARIANT(result);
\r
448 return INVOKERESULT_NO_ERROR;
\r
451 return INVOKERESULT_NO_SUCH_METHOD;
\r
452 case ID_add_item: /* deprecated */
\r
453 if( (argCount == 1) && NPVARIANT_IS_STRING(args[0]) )
\r
455 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
458 char *url = p_plugin->getAbsoluteURL(s);
\r
462 return INVOKERESULT_GENERIC_ERROR;
\r
464 int item = libvlc_playlist_add(p_plugin->getVLC(), url, NULL, &ex);
\r
466 if( libvlc_exception_raised(&ex) )
\r
468 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
469 libvlc_exception_clear(&ex);
\r
470 return INVOKERESULT_GENERIC_ERROR;
\r
474 INT32_TO_NPVARIANT(item, result);
\r
475 return INVOKERESULT_NO_ERROR;
\r
479 return INVOKERESULT_OUT_OF_MEMORY;
\r
481 return INVOKERESULT_NO_SUCH_METHOD;
\r
482 case ID_next: /* deprecated */
\r
483 if( argCount == 0 )
\r
485 libvlc_playlist_next(p_plugin->getVLC(), &ex);
\r
486 if( libvlc_exception_raised(&ex) )
\r
488 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
489 libvlc_exception_clear(&ex);
\r
490 return INVOKERESULT_GENERIC_ERROR;
\r
494 VOID_TO_NPVARIANT(result);
\r
495 return INVOKERESULT_NO_ERROR;
\r
498 return INVOKERESULT_NO_SUCH_METHOD;
\r
499 case ID_previous: /* deprecated */
\r
500 if( argCount == 0 )
\r
502 libvlc_playlist_prev(p_plugin->getVLC(), &ex);
\r
503 if( libvlc_exception_raised(&ex) )
\r
505 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
506 libvlc_exception_clear(&ex);
\r
507 return INVOKERESULT_GENERIC_ERROR;
\r
511 VOID_TO_NPVARIANT(result);
\r
512 return INVOKERESULT_NO_ERROR;
\r
515 return INVOKERESULT_NO_SUCH_METHOD;
\r
516 case ID_isplaying: /* deprecated */
\r
517 if( argCount == 0 )
\r
519 int isplaying = libvlc_playlist_isplaying(p_plugin->getVLC(), &ex);
\r
520 if( libvlc_exception_raised(&ex) )
\r
522 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
523 libvlc_exception_clear(&ex);
\r
524 return INVOKERESULT_GENERIC_ERROR;
\r
528 BOOLEAN_TO_NPVARIANT(isplaying, result);
\r
529 return INVOKERESULT_NO_ERROR;
\r
532 return INVOKERESULT_NO_SUCH_METHOD;
\r
533 case ID_get_length: /* deprecated */
\r
534 if( argCount == 0 )
\r
536 libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_plugin->getVLC(), &ex);
\r
539 vlc_int64_t val = libvlc_media_instance_get_length(p_md, &ex);
\r
540 libvlc_media_instance_release(p_md);
\r
541 if( libvlc_exception_raised(&ex) )
\r
543 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
544 libvlc_exception_clear(&ex);
\r
545 return INVOKERESULT_GENERIC_ERROR;
\r
549 INT32_TO_NPVARIANT((uint32_t)(val/1000LL), result);
\r
550 return INVOKERESULT_NO_ERROR;
\r
555 /* cannot get input, probably not playing */
\r
556 if( libvlc_exception_raised(&ex) )
\r
558 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
559 libvlc_exception_clear(&ex);
\r
561 return INVOKERESULT_GENERIC_ERROR;
\r
564 return INVOKERESULT_NO_SUCH_METHOD;
\r
565 case ID_get_position: /* deprecated */
\r
566 if( argCount == 0 )
\r
568 libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_plugin->getVLC(), &ex);
\r
571 float val = libvlc_media_instance_get_position(p_md, &ex);
\r
572 libvlc_media_instance_release(p_md);
\r
573 if( libvlc_exception_raised(&ex) )
\r
575 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
576 libvlc_exception_clear(&ex);
\r
577 return INVOKERESULT_GENERIC_ERROR;
\r
581 DOUBLE_TO_NPVARIANT((double)val, result);
\r
582 return INVOKERESULT_NO_ERROR;
\r
587 /* cannot get input, probably not playing */
\r
588 if( libvlc_exception_raised(&ex) )
\r
590 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
591 libvlc_exception_clear(&ex);
\r
593 return INVOKERESULT_GENERIC_ERROR;
\r
596 return INVOKERESULT_NO_SUCH_METHOD;
\r
597 case ID_get_time: /* deprecated */
\r
598 if( argCount == 0 )
\r
600 libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_plugin->getVLC(), &ex);
\r
603 vlc_int64_t val = libvlc_media_instance_get_time(p_md, &ex);
\r
604 libvlc_media_instance_release(p_md);
\r
605 if( libvlc_exception_raised(&ex) )
\r
607 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
608 libvlc_exception_clear(&ex);
\r
609 return INVOKERESULT_GENERIC_ERROR;
\r
613 DOUBLE_TO_NPVARIANT((uint32_t)(val/1000LL), result);
\r
614 return INVOKERESULT_NO_ERROR;
\r
619 /* cannot get input, probably not playing */
\r
620 if( libvlc_exception_raised(&ex) )
\r
622 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
623 libvlc_exception_clear(&ex);
\r
625 return INVOKERESULT_GENERIC_ERROR;
\r
628 return INVOKERESULT_NO_SUCH_METHOD;
\r
629 case ID_seek: /* deprecated */
\r
630 if( (argCount == 2)
\r
631 && isNumberValue(args[0])
\r
632 && NPVARIANT_IS_BOOLEAN(args[1]) )
\r
634 libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_plugin->getVLC(), &ex);
\r
637 vlc_int64_t pos = 0;
\r
638 if( NPVARIANT_IS_INT32(args[0]) )
\r
639 pos = (vlc_int64_t)NPVARIANT_TO_INT32(args[0]);
\r
641 pos = (vlc_int64_t)NPVARIANT_TO_DOUBLE(args[0]);
\r
643 if( NPVARIANT_TO_BOOLEAN(args[1]) )
\r
645 /* relative seek */
\r
646 vlc_int64_t from = libvlc_media_instance_get_time(p_md, &ex);
\r
647 if( libvlc_exception_raised(&ex) )
\r
649 libvlc_media_instance_release(p_md);
\r
650 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
651 libvlc_exception_clear(&ex);
\r
652 return INVOKERESULT_GENERIC_ERROR;
\r
657 libvlc_media_instance_set_time(p_md, pos, &ex);
\r
658 libvlc_media_instance_release(p_md);
\r
659 if( libvlc_exception_raised(&ex) )
\r
661 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
662 libvlc_exception_clear(&ex);
\r
663 return INVOKERESULT_GENERIC_ERROR;
\r
665 VOID_TO_NPVARIANT(result);
\r
666 return INVOKERESULT_NO_ERROR;
\r
670 /* cannot get input, probably not playing */
\r
671 if( libvlc_exception_raised(&ex) )
\r
673 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
674 libvlc_exception_clear(&ex);
\r
676 return INVOKERESULT_GENERIC_ERROR;
\r
679 return INVOKERESULT_NO_SUCH_METHOD;
\r
681 return INVOKERESULT_NO_SUCH_METHOD;
\r
684 return INVOKERESULT_GENERIC_ERROR;
\r