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
29 #include <vlc/vlc.h>
\r
32 #ifdef HAVE_MOZILLA_CONFIG_H
\r
33 # include <mozilla-config.h>
\r
37 #include "vlcplugin.h"
\r
40 ** implementation of vlc root object
\r
43 const NPUTF8 * const VlcNPObject::propertyNames[] =
\r
48 const int VlcNPObject::propertyCount = sizeof(VlcNPObject::propertyNames)/sizeof(NPUTF8 *);
\r
50 const NPUTF8 * const VlcNPObject::methodNames[] =
\r
52 "play", /* deprecated */
\r
53 "pause", /* deprecated */
\r
54 "stop", /* deprecated */
\r
55 "fullscreen", /* deprecated */
\r
56 "set_volume", /* deprecated */
\r
57 "get_volume", /* deprecated */
\r
58 "mute", /* deprecated */
\r
59 "get_int_variable", /* deprecated */
\r
60 "set_int_variable", /* deprecated */
\r
61 "get_bool_variable", /* deprecated */
\r
62 "set_bool_variable", /* deprecated */
\r
63 "get_str_variable", /* deprecated */
\r
64 "set_str_variable", /* deprecated */
\r
65 "clear_playlist", /* deprecated */
\r
66 "add_item", /* deprecated */
\r
67 "next", /* deprecated */
\r
68 "previous", /* deprecated */
\r
69 "isplaying", /* deprecated */
\r
70 "get_length", /* deprecated */
\r
71 "get_position", /* deprecated */
\r
72 "get_time", /* deprecated */
\r
73 "seek", /* deprecated */
\r
76 enum VlcNPObjectMethodIds
\r
85 ID_get_int_variable,
\r
86 ID_set_int_variable,
\r
87 ID_get_bool_variable,
\r
88 ID_set_bool_variable,
\r
89 ID_get_str_variable,
\r
90 ID_set_str_variable,
\r
102 const int VlcNPObject::methodCount = sizeof(VlcNPObject::methodNames)/sizeof(NPUTF8 *);
\r
104 RuntimeNPObject::InvokeResult VlcNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)
\r
106 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
109 libvlc_exception_t ex;
\r
110 libvlc_exception_init(&ex);
\r
114 case ID_play: /* deprecated */
\r
115 if( argCount == 0 )
\r
117 libvlc_playlist_play(p_plugin->getVLC(), -1, 0, NULL, &ex);
\r
118 if( libvlc_exception_raised(&ex) )
\r
120 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
121 libvlc_exception_clear(&ex);
\r
122 return INVOKERESULT_GENERIC_ERROR;
\r
126 VOID_TO_NPVARIANT(result);
\r
127 return INVOKERESULT_NO_ERROR;
\r
130 return INVOKERESULT_NO_SUCH_METHOD;
\r
131 case ID_pause: /* deprecated */
\r
132 if( argCount == 0 )
\r
134 libvlc_playlist_pause(p_plugin->getVLC(), &ex);
\r
135 if( libvlc_exception_raised(&ex) )
\r
137 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
138 libvlc_exception_clear(&ex);
\r
139 return INVOKERESULT_GENERIC_ERROR;
\r
143 VOID_TO_NPVARIANT(result);
\r
144 return INVOKERESULT_NO_ERROR;
\r
147 return INVOKERESULT_NO_SUCH_METHOD;
\r
148 case ID_stop: /* deprecated */
\r
149 if( argCount == 0 )
\r
151 libvlc_playlist_stop(p_plugin->getVLC(), &ex);
\r
152 if( libvlc_exception_raised(&ex) )
\r
154 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
155 libvlc_exception_clear(&ex);
\r
156 return INVOKERESULT_GENERIC_ERROR;
\r
160 VOID_TO_NPVARIANT(result);
\r
161 return INVOKERESULT_NO_ERROR;
\r
164 return INVOKERESULT_NO_SUCH_METHOD;
\r
165 case ID_fullscreen: /* deprecated */
\r
166 if( argCount == 0 )
\r
168 libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_plugin->getVLC(), &ex);
\r
171 libvlc_toggle_fullscreen(p_md, &ex);
\r
172 libvlc_media_instance_release(p_md);
\r
173 if( libvlc_exception_raised(&ex) )
\r
175 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
176 libvlc_exception_clear(&ex);
\r
177 return INVOKERESULT_GENERIC_ERROR;
\r
181 VOID_TO_NPVARIANT(result);
\r
182 return INVOKERESULT_NO_ERROR;
\r
187 /* cannot get input, probably not playing */
\r
188 if( libvlc_exception_raised(&ex) )
\r
190 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
191 libvlc_exception_clear(&ex);
\r
193 return INVOKERESULT_GENERIC_ERROR;
\r
196 return INVOKERESULT_NO_SUCH_METHOD;
\r
197 case ID_set_volume: /* deprecated */
\r
198 if( (argCount == 1) && isNumberValue(args[0]) )
\r
200 libvlc_audio_set_volume(p_plugin->getVLC(), numberValue(args[0]), &ex);
\r
201 if( libvlc_exception_raised(&ex) )
\r
203 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
204 libvlc_exception_clear(&ex);
\r
205 return INVOKERESULT_GENERIC_ERROR;
\r
209 VOID_TO_NPVARIANT(result);
\r
210 return INVOKERESULT_NO_ERROR;
\r
213 return INVOKERESULT_NO_SUCH_METHOD;
\r
214 case ID_get_volume: /* deprecated */
\r
215 if( argCount == 0 )
\r
217 int val = libvlc_audio_get_volume(p_plugin->getVLC(), &ex);
\r
218 if( libvlc_exception_raised(&ex) )
\r
220 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
221 libvlc_exception_clear(&ex);
\r
222 return INVOKERESULT_GENERIC_ERROR;
\r
226 INT32_TO_NPVARIANT(val, result);
\r
227 return INVOKERESULT_NO_ERROR;
\r
230 return INVOKERESULT_NO_SUCH_METHOD;
\r
231 case ID_mute: /* deprecated */
\r
232 if( argCount == 0 )
\r
234 libvlc_audio_toggle_mute(p_plugin->getVLC(), &ex);
\r
235 if( libvlc_exception_raised(&ex) )
\r
237 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
238 libvlc_exception_clear(&ex);
\r
239 return INVOKERESULT_GENERIC_ERROR;
\r
243 VOID_TO_NPVARIANT(result);
\r
244 return INVOKERESULT_NO_ERROR;
\r
247 return INVOKERESULT_NO_SUCH_METHOD;
\r
248 case ID_get_int_variable: /* deprecated */
\r
249 if( (argCount == 1) && NPVARIANT_IS_STRING(args[0]) )
\r
251 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
254 int vlc_id = libvlc_get_vlc_id(p_plugin->getVLC());
\r
256 if( VLC_SUCCESS == VLC_VariableGet(vlc_id, s, &val) )
\r
259 INT32_TO_NPVARIANT(val.i_int, result);
\r
260 return INVOKERESULT_NO_ERROR;
\r
265 return INVOKERESULT_INVALID_ARGS;
\r
269 return INVOKERESULT_OUT_OF_MEMORY;
\r
271 return INVOKERESULT_NO_SUCH_METHOD;
\r
272 case ID_set_int_variable: /* deprecated */
\r
273 if( (argCount == 2)
\r
274 && NPVARIANT_IS_STRING(args[0])
\r
275 && isNumberValue(args[1]) )
\r
277 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
280 int vlc_id = libvlc_get_vlc_id(p_plugin->getVLC());
\r
282 val.i_int = numberValue(args[1]);
\r
283 if( VLC_SUCCESS == VLC_VariableSet(vlc_id, s, val) )
\r
286 VOID_TO_NPVARIANT(result);
\r
287 return INVOKERESULT_NO_ERROR;
\r
292 return INVOKERESULT_INVALID_ARGS;
\r
296 return INVOKERESULT_OUT_OF_MEMORY;
\r
298 return INVOKERESULT_NO_SUCH_METHOD;
\r
299 case ID_get_bool_variable: /* deprecated */
\r
300 if( (argCount == 1) && NPVARIANT_IS_STRING(args[0]) )
\r
302 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
305 int vlc_id = libvlc_get_vlc_id(p_plugin->getVLC());
\r
307 if( VLC_SUCCESS == VLC_VariableGet(vlc_id, s, &val) )
\r
310 BOOLEAN_TO_NPVARIANT(val.b_bool, result);
\r
311 return INVOKERESULT_NO_ERROR;
\r
316 return INVOKERESULT_INVALID_ARGS;
\r
320 return INVOKERESULT_OUT_OF_MEMORY;
\r
322 return INVOKERESULT_NO_SUCH_METHOD;
\r
323 case ID_set_bool_variable: /* deprecated */
\r
324 if( (argCount == 2)
\r
325 && NPVARIANT_IS_STRING(args[0])
\r
326 && NPVARIANT_IS_BOOLEAN(args[1]) )
\r
328 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
331 int vlc_id = libvlc_get_vlc_id(p_plugin->getVLC());
\r
333 val.b_bool = NPVARIANT_TO_BOOLEAN(args[1]);
\r
334 if( VLC_SUCCESS == VLC_VariableSet(vlc_id, s, val) )
\r
337 VOID_TO_NPVARIANT(result);
\r
338 return INVOKERESULT_NO_ERROR;
\r
343 return INVOKERESULT_INVALID_ARGS;
\r
347 return INVOKERESULT_OUT_OF_MEMORY;
\r
349 return INVOKERESULT_NO_SUCH_METHOD;
\r
350 case ID_get_str_variable: /* deprecated */
\r
351 if( (argCount == 1) && NPVARIANT_IS_STRING(args[0]) )
\r
353 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
356 int vlc_id = libvlc_get_vlc_id(p_plugin->getVLC());
\r
358 if( VLC_SUCCESS == VLC_VariableGet(vlc_id, s, &val) )
\r
361 if( val.psz_string )
\r
363 int len = strlen(val.psz_string);
\r
364 NPUTF8 *retval = (NPUTF8 *)NPN_MemAlloc(len);
\r
367 memcpy(retval, val.psz_string, len);
\r
368 STRINGN_TO_NPVARIANT(retval, len, result);
\r
369 free(val.psz_string);
\r
370 return INVOKERESULT_NO_ERROR;
\r
374 return INVOKERESULT_OUT_OF_MEMORY;
\r
380 NULL_TO_NPVARIANT(result);
\r
381 return INVOKERESULT_NO_ERROR;
\r
387 return INVOKERESULT_INVALID_ARGS;
\r
391 return INVOKERESULT_OUT_OF_MEMORY;
\r
393 return INVOKERESULT_NO_SUCH_METHOD;
\r
394 case ID_set_str_variable: /* deprecated */
\r
395 if( (argCount == 2)
\r
396 && NPVARIANT_IS_STRING(args[0])
\r
397 && NPVARIANT_IS_STRING(args[1]) )
\r
399 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
402 int vlc_id = libvlc_get_vlc_id(p_plugin->getVLC());
\r
404 val.psz_string = stringValue(NPVARIANT_TO_STRING(args[1]));
\r
405 if( val.psz_string )
\r
407 if( VLC_SUCCESS == VLC_VariableSet(vlc_id, s, val) )
\r
410 delete val.psz_string;
\r
411 VOID_TO_NPVARIANT(result);
\r
412 return INVOKERESULT_NO_ERROR;
\r
417 delete val.psz_string;
\r
418 return INVOKERESULT_INVALID_ARGS;
\r
424 return INVOKERESULT_OUT_OF_MEMORY;
\r
428 return INVOKERESULT_OUT_OF_MEMORY;
\r
430 return INVOKERESULT_NO_SUCH_METHOD;
\r
431 case ID_clear_playlist: /* deprecated */
\r
432 if( argCount == 0 )
\r
434 libvlc_playlist_clear(p_plugin->getVLC(), &ex);
\r
435 if( libvlc_exception_raised(&ex) )
\r
437 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
438 libvlc_exception_clear(&ex);
\r
439 return INVOKERESULT_GENERIC_ERROR;
\r
443 VOID_TO_NPVARIANT(result);
\r
444 return INVOKERESULT_NO_ERROR;
\r
447 return INVOKERESULT_NO_SUCH_METHOD;
\r
448 case ID_add_item: /* deprecated */
\r
449 if( (argCount == 1) && NPVARIANT_IS_STRING(args[0]) )
\r
451 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
454 char *url = p_plugin->getAbsoluteURL(s);
\r
458 return INVOKERESULT_GENERIC_ERROR;
\r
460 int item = libvlc_playlist_add(p_plugin->getVLC(), url, NULL, &ex);
\r
462 if( libvlc_exception_raised(&ex) )
\r
464 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
465 libvlc_exception_clear(&ex);
\r
466 return INVOKERESULT_GENERIC_ERROR;
\r
470 INT32_TO_NPVARIANT(item, result);
\r
471 return INVOKERESULT_NO_ERROR;
\r
475 return INVOKERESULT_OUT_OF_MEMORY;
\r
477 return INVOKERESULT_NO_SUCH_METHOD;
\r
478 case ID_next: /* deprecated */
\r
479 if( argCount == 0 )
\r
481 libvlc_playlist_next(p_plugin->getVLC(), &ex);
\r
482 if( libvlc_exception_raised(&ex) )
\r
484 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
485 libvlc_exception_clear(&ex);
\r
486 return INVOKERESULT_GENERIC_ERROR;
\r
490 VOID_TO_NPVARIANT(result);
\r
491 return INVOKERESULT_NO_ERROR;
\r
494 return INVOKERESULT_NO_SUCH_METHOD;
\r
495 case ID_previous: /* deprecated */
\r
496 if( argCount == 0 )
\r
498 libvlc_playlist_prev(p_plugin->getVLC(), &ex);
\r
499 if( libvlc_exception_raised(&ex) )
\r
501 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
502 libvlc_exception_clear(&ex);
\r
503 return INVOKERESULT_GENERIC_ERROR;
\r
507 VOID_TO_NPVARIANT(result);
\r
508 return INVOKERESULT_NO_ERROR;
\r
511 return INVOKERESULT_NO_SUCH_METHOD;
\r
512 case ID_isplaying: /* deprecated */
\r
513 if( argCount == 0 )
\r
515 int isplaying = libvlc_playlist_isplaying(p_plugin->getVLC(), &ex);
\r
516 if( libvlc_exception_raised(&ex) )
\r
518 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
519 libvlc_exception_clear(&ex);
\r
520 return INVOKERESULT_GENERIC_ERROR;
\r
524 BOOLEAN_TO_NPVARIANT(isplaying, result);
\r
525 return INVOKERESULT_NO_ERROR;
\r
528 return INVOKERESULT_NO_SUCH_METHOD;
\r
529 case ID_get_length: /* deprecated */
\r
530 if( argCount == 0 )
\r
532 libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_plugin->getVLC(), &ex);
\r
535 vlc_int64_t val = libvlc_media_instance_get_length(p_md, &ex);
\r
536 libvlc_media_instance_release(p_md);
\r
537 if( libvlc_exception_raised(&ex) )
\r
539 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
540 libvlc_exception_clear(&ex);
\r
541 return INVOKERESULT_GENERIC_ERROR;
\r
545 INT32_TO_NPVARIANT((uint32_t)(val/1000LL), result);
\r
546 return INVOKERESULT_NO_ERROR;
\r
551 /* cannot get input, probably not playing */
\r
552 if( libvlc_exception_raised(&ex) )
\r
554 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
555 libvlc_exception_clear(&ex);
\r
557 return INVOKERESULT_GENERIC_ERROR;
\r
560 return INVOKERESULT_NO_SUCH_METHOD;
\r
561 case ID_get_position: /* deprecated */
\r
562 if( argCount == 0 )
\r
564 libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_plugin->getVLC(), &ex);
\r
567 float val = libvlc_media_instance_get_position(p_md, &ex);
\r
568 libvlc_media_instance_release(p_md);
\r
569 if( libvlc_exception_raised(&ex) )
\r
571 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
572 libvlc_exception_clear(&ex);
\r
573 return INVOKERESULT_GENERIC_ERROR;
\r
577 DOUBLE_TO_NPVARIANT((double)val, result);
\r
578 return INVOKERESULT_NO_ERROR;
\r
583 /* cannot get input, probably not playing */
\r
584 if( libvlc_exception_raised(&ex) )
\r
586 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
587 libvlc_exception_clear(&ex);
\r
589 return INVOKERESULT_GENERIC_ERROR;
\r
592 return INVOKERESULT_NO_SUCH_METHOD;
\r
593 case ID_get_time: /* deprecated */
\r
594 if( argCount == 0 )
\r
596 libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_plugin->getVLC(), &ex);
\r
599 vlc_int64_t val = libvlc_media_instance_get_time(p_md, &ex);
\r
600 libvlc_media_instance_release(p_md);
\r
601 if( libvlc_exception_raised(&ex) )
\r
603 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
604 libvlc_exception_clear(&ex);
\r
605 return INVOKERESULT_GENERIC_ERROR;
\r
609 DOUBLE_TO_NPVARIANT((uint32_t)(val/1000LL), result);
\r
610 return INVOKERESULT_NO_ERROR;
\r
615 /* cannot get input, probably not playing */
\r
616 if( libvlc_exception_raised(&ex) )
\r
618 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
619 libvlc_exception_clear(&ex);
\r
621 return INVOKERESULT_GENERIC_ERROR;
\r
624 return INVOKERESULT_NO_SUCH_METHOD;
\r
625 case ID_seek: /* deprecated */
\r
626 if( (argCount == 2)
\r
627 && isNumberValue(args[0])
\r
628 && NPVARIANT_IS_BOOLEAN(args[1]) )
\r
630 libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_plugin->getVLC(), &ex);
\r
633 vlc_int64_t pos = 0;
\r
634 if( NPVARIANT_IS_INT32(args[0]) )
\r
635 pos = (vlc_int64_t)NPVARIANT_TO_INT32(args[0]);
\r
637 pos = (vlc_int64_t)NPVARIANT_TO_DOUBLE(args[0]);
\r
639 if( NPVARIANT_TO_BOOLEAN(args[1]) )
\r
641 /* relative seek */
\r
642 vlc_int64_t from = libvlc_media_instance_get_time(p_md, &ex);
\r
643 if( libvlc_exception_raised(&ex) )
\r
645 libvlc_media_instance_release(p_md);
\r
646 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
647 libvlc_exception_clear(&ex);
\r
648 return INVOKERESULT_GENERIC_ERROR;
\r
653 libvlc_media_instance_set_time(p_md, pos, &ex);
\r
654 libvlc_media_instance_release(p_md);
\r
655 if( libvlc_exception_raised(&ex) )
\r
657 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
658 libvlc_exception_clear(&ex);
\r
659 return INVOKERESULT_GENERIC_ERROR;
\r
661 VOID_TO_NPVARIANT(result);
\r
662 return INVOKERESULT_NO_ERROR;
\r
666 /* cannot get input, probably not playing */
\r
667 if( libvlc_exception_raised(&ex) )
\r
669 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
670 libvlc_exception_clear(&ex);
\r
672 return INVOKERESULT_GENERIC_ERROR;
\r
675 return INVOKERESULT_NO_SUCH_METHOD;
\r
677 return INVOKERESULT_NO_SUCH_METHOD;
\r
680 return INVOKERESULT_GENERIC_ERROR;
\r