1 /*****************************************************************************
\r
2 * npolibvlc.cpp: official Javascript APIs
\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
30 #ifdef HAVE_MOZILLA_CONFIG_H
\r
31 # include <mozilla-config.h>
\r
34 #include "npolibvlc.h"
\r
35 #include "vlcplugin.h"
\r
38 ** implementation of libvlc root object
\r
41 LibvlcRootNPObject::LibvlcRootNPObject(NPP instance, const NPClass *aClass) :
\r
42 RuntimeNPObject(instance, aClass)
\r
44 audioObj = NPN_CreateObject(instance, RuntimeNPClass<LibvlcAudioNPObject>::getClass());
\r
45 inputObj = NPN_CreateObject(instance, RuntimeNPClass<LibvlcInputNPObject>::getClass());
\r
46 logObj = NPN_CreateObject(instance, RuntimeNPClass<LibvlcLogNPObject>::getClass());
\r
47 playlistObj = NPN_CreateObject(instance, RuntimeNPClass<LibvlcPlaylistNPObject>::getClass());
\r
48 videoObj = NPN_CreateObject(instance,RuntimeNPClass<LibvlcVideoNPObject>::getClass());
\r
51 LibvlcRootNPObject::~LibvlcRootNPObject()
\r
53 NPN_ReleaseObject(audioObj);
\r
54 NPN_ReleaseObject(inputObj);
\r
55 NPN_ReleaseObject(logObj);
\r
56 NPN_ReleaseObject(playlistObj);
\r
57 NPN_ReleaseObject(videoObj);
\r
60 const NPUTF8 * const LibvlcRootNPObject::propertyNames[] =
\r
70 const int LibvlcRootNPObject::propertyCount = sizeof(LibvlcRootNPObject::propertyNames)/sizeof(NPUTF8 *);
\r
72 enum LibvlcRootNPObjectPropertyIds
\r
79 ID_root_VersionInfo,
\r
82 RuntimeNPObject::InvokeResult LibvlcRootNPObject::getProperty(int index, NPVariant &result)
\r
84 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
90 OBJECT_TO_NPVARIANT(NPN_RetainObject(audioObj), result);
\r
91 return INVOKERESULT_NO_ERROR;
\r
93 OBJECT_TO_NPVARIANT(NPN_RetainObject(inputObj), result);
\r
94 return INVOKERESULT_NO_ERROR;
\r
96 OBJECT_TO_NPVARIANT(NPN_RetainObject(logObj), result);
\r
97 return INVOKERESULT_NO_ERROR;
\r
98 case ID_root_playlist:
\r
99 OBJECT_TO_NPVARIANT(NPN_RetainObject(playlistObj), result);
\r
100 return INVOKERESULT_NO_ERROR;
\r
101 case ID_root_video:
\r
102 OBJECT_TO_NPVARIANT(NPN_RetainObject(videoObj), result);
\r
103 return INVOKERESULT_NO_ERROR;
\r
104 case ID_root_VersionInfo:
\r
106 int len = strlen(VLC_Version());
\r
107 NPUTF8 *retval =(NPUTF8*)NPN_MemAlloc(len);
\r
110 memcpy(retval, VLC_Version(), len);
\r
111 STRINGN_TO_NPVARIANT(retval, len, result);
\r
115 NULL_TO_NPVARIANT(result);
\r
117 return INVOKERESULT_NO_ERROR;
\r
123 return INVOKERESULT_GENERIC_ERROR;
\r
126 const NPUTF8 * const LibvlcRootNPObject::methodNames[] =
\r
131 const int LibvlcRootNPObject::methodCount = sizeof(LibvlcRootNPObject::methodNames)/sizeof(NPUTF8 *);
\r
133 enum LibvlcRootNPObjectMethodIds
\r
135 ID_root_versionInfo,
\r
138 RuntimeNPObject::InvokeResult LibvlcRootNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)
\r
140 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
143 libvlc_exception_t ex;
\r
144 libvlc_exception_init(&ex);
\r
148 case ID_root_versionInfo:
\r
149 if( argCount == 0 )
\r
151 int len = strlen(VLC_Version());
\r
152 NPUTF8 *retval =(NPUTF8*)NPN_MemAlloc(len);
\r
155 memcpy(retval, VLC_Version(), len);
\r
156 STRINGN_TO_NPVARIANT(retval, len, result);
\r
160 NULL_TO_NPVARIANT(result);
\r
162 return INVOKERESULT_NO_ERROR;
\r
164 return INVOKERESULT_NO_SUCH_METHOD;
\r
169 return INVOKERESULT_GENERIC_ERROR;
\r
173 ** implementation of libvlc audio object
\r
176 const NPUTF8 * const LibvlcAudioNPObject::propertyNames[] =
\r
184 const int LibvlcAudioNPObject::propertyCount = sizeof(LibvlcAudioNPObject::propertyNames)/sizeof(NPUTF8 *);
\r
186 enum LibvlcAudioNPObjectPropertyIds
\r
194 RuntimeNPObject::InvokeResult LibvlcAudioNPObject::getProperty(int index, NPVariant &result)
\r
196 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
199 libvlc_exception_t ex;
\r
200 libvlc_exception_init(&ex);
\r
202 libvlc_input_t *p_input = libvlc_playlist_get_input(p_plugin->getVLC(), &ex);
\r
203 if( libvlc_exception_raised(&ex) )
\r
205 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
206 libvlc_exception_clear(&ex);
\r
207 return INVOKERESULT_GENERIC_ERROR;
\r
212 case ID_audio_mute:
\r
214 vlc_bool_t muted = libvlc_audio_get_mute(p_plugin->getVLC(), &ex);
\r
215 libvlc_input_free(p_input);
\r
216 if( libvlc_exception_raised(&ex) )
\r
218 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
219 libvlc_exception_clear(&ex);
\r
220 return INVOKERESULT_GENERIC_ERROR;
\r
222 BOOLEAN_TO_NPVARIANT(muted, result);
\r
223 return INVOKERESULT_NO_ERROR;
\r
225 case ID_audio_volume:
\r
227 int volume = libvlc_audio_get_volume(p_plugin->getVLC(), &ex);
\r
228 libvlc_input_free(p_input);
\r
229 if( libvlc_exception_raised(&ex) )
\r
231 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
232 libvlc_exception_clear(&ex);
\r
233 return INVOKERESULT_GENERIC_ERROR;
\r
235 INT32_TO_NPVARIANT(volume, result);
\r
236 return INVOKERESULT_NO_ERROR;
\r
238 case ID_audio_track:
\r
240 int track = libvlc_audio_get_track(p_input, &ex);
\r
241 libvlc_input_free(p_input);
\r
242 if( libvlc_exception_raised(&ex) )
\r
244 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
245 libvlc_exception_clear(&ex);
\r
246 return INVOKERESULT_GENERIC_ERROR;
\r
248 INT32_TO_NPVARIANT(track, result);
\r
249 return INVOKERESULT_NO_ERROR;
\r
251 case ID_audio_channel:
\r
253 int channel = libvlc_audio_get_channel(p_plugin->getVLC(), &ex);
\r
254 libvlc_input_free(p_input);
\r
255 if( libvlc_exception_raised(&ex) )
\r
257 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
258 libvlc_exception_clear(&ex);
\r
259 return INVOKERESULT_GENERIC_ERROR;
\r
261 INT32_TO_NPVARIANT(channel, result);
\r
262 return INVOKERESULT_NO_ERROR;
\r
267 libvlc_input_free(p_input);
\r
269 return INVOKERESULT_GENERIC_ERROR;
\r
272 RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const NPVariant &value)
\r
274 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
277 libvlc_exception_t ex;
\r
278 libvlc_exception_init(&ex);
\r
280 libvlc_input_t *p_input = libvlc_playlist_get_input(p_plugin->getVLC(), &ex);
\r
281 if( libvlc_exception_raised(&ex) )
\r
283 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
284 libvlc_exception_clear(&ex);
\r
285 return INVOKERESULT_GENERIC_ERROR;
\r
290 case ID_audio_mute:
\r
291 if( NPVARIANT_IS_BOOLEAN(value) )
\r
293 libvlc_audio_set_mute(p_plugin->getVLC(),
\r
294 NPVARIANT_TO_BOOLEAN(value), &ex);
\r
295 libvlc_input_free(p_input);
\r
296 if( libvlc_exception_raised(&ex) )
\r
298 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
299 libvlc_exception_clear(&ex);
\r
300 return INVOKERESULT_GENERIC_ERROR;
\r
302 return INVOKERESULT_NO_ERROR;
\r
304 return INVOKERESULT_INVALID_VALUE;
\r
305 case ID_audio_volume:
\r
306 libvlc_input_free(p_input);
\r
307 if( isNumberValue(value) )
\r
309 libvlc_audio_set_volume(p_plugin->getVLC(),
\r
310 numberValue(value), &ex);
\r
311 if( libvlc_exception_raised(&ex) )
\r
313 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
314 libvlc_exception_clear(&ex);
\r
315 return INVOKERESULT_GENERIC_ERROR;
\r
317 return INVOKERESULT_NO_ERROR;
\r
319 return INVOKERESULT_INVALID_VALUE;
\r
320 case ID_audio_track:
\r
321 if( isNumberValue(value) )
\r
323 libvlc_audio_set_track(p_input,
\r
324 numberValue(value), &ex);
\r
325 libvlc_input_free(p_input);
\r
326 if( libvlc_exception_raised(&ex) )
\r
328 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
329 libvlc_exception_clear(&ex);
\r
330 return INVOKERESULT_GENERIC_ERROR;
\r
332 return INVOKERESULT_NO_ERROR;
\r
334 libvlc_input_free(p_input);
\r
335 return INVOKERESULT_INVALID_VALUE;
\r
336 case ID_audio_channel:
\r
338 libvlc_input_free(p_input);
\r
339 if( isNumberValue(value) )
\r
341 libvlc_audio_set_channel(p_plugin->getVLC(),
\r
342 numberValue(value), &ex);
\r
343 if( libvlc_exception_raised(&ex) )
\r
345 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
346 libvlc_exception_clear(&ex);
\r
347 return INVOKERESULT_GENERIC_ERROR;
\r
349 return INVOKERESULT_NO_ERROR;
\r
351 return INVOKERESULT_INVALID_VALUE;
\r
356 libvlc_input_free(p_input);
\r
358 return INVOKERESULT_GENERIC_ERROR;
\r
361 const NPUTF8 * const LibvlcAudioNPObject::methodNames[] =
\r
366 const int LibvlcAudioNPObject::methodCount = sizeof(LibvlcAudioNPObject::methodNames)/sizeof(NPUTF8 *);
\r
368 enum LibvlcAudioNPObjectMethodIds
\r
370 ID_audio_togglemute,
\r
373 RuntimeNPObject::InvokeResult LibvlcAudioNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)
\r
375 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
378 libvlc_exception_t ex;
\r
379 libvlc_exception_init(&ex);
\r
383 case ID_audio_togglemute:
\r
384 if( argCount == 0 )
\r
386 libvlc_audio_toggle_mute(p_plugin->getVLC(), &ex);
\r
387 if( libvlc_exception_raised(&ex) )
\r
389 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
390 libvlc_exception_clear(&ex);
\r
391 return INVOKERESULT_GENERIC_ERROR;
\r
395 VOID_TO_NPVARIANT(result);
\r
396 return INVOKERESULT_NO_ERROR;
\r
399 return INVOKERESULT_NO_SUCH_METHOD;
\r
404 return INVOKERESULT_GENERIC_ERROR;
\r
408 ** implementation of libvlc input object
\r
411 const NPUTF8 * const LibvlcInputNPObject::propertyNames[] =
\r
422 const int LibvlcInputNPObject::propertyCount = sizeof(LibvlcInputNPObject::propertyNames)/sizeof(NPUTF8 *);
\r
424 enum LibvlcInputNPObjectPropertyIds
\r
435 RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVariant &result)
\r
437 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
440 libvlc_exception_t ex;
\r
441 libvlc_exception_init(&ex);
\r
443 libvlc_input_t *p_input = libvlc_playlist_get_input(p_plugin->getVLC(), &ex);
\r
444 if( libvlc_exception_raised(&ex) )
\r
446 if( index != ID_input_state )
\r
448 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
449 libvlc_exception_clear(&ex);
\r
450 return INVOKERESULT_GENERIC_ERROR;
\r
454 /* for input state, return CLOSED rather than an exception */
\r
455 INT32_TO_NPVARIANT(0, result);
\r
456 return INVOKERESULT_NO_ERROR;
\r
462 case ID_input_length:
\r
464 double val = (double)libvlc_input_get_length(p_input, &ex);
\r
465 libvlc_input_free(p_input);
\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
472 DOUBLE_TO_NPVARIANT(val, result);
\r
473 return INVOKERESULT_NO_ERROR;
\r
475 case ID_input_position:
\r
477 double val = libvlc_input_get_position(p_input, &ex);
\r
478 libvlc_input_free(p_input);
\r
479 if( libvlc_exception_raised(&ex) )
\r
481 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
482 libvlc_exception_clear(&ex);
\r
483 return INVOKERESULT_GENERIC_ERROR;
\r
485 DOUBLE_TO_NPVARIANT(val, result);
\r
486 return INVOKERESULT_NO_ERROR;
\r
488 case ID_input_time:
\r
490 double val = (double)libvlc_input_get_time(p_input, &ex);
\r
491 libvlc_input_free(p_input);
\r
492 if( libvlc_exception_raised(&ex) )
\r
494 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
495 libvlc_exception_clear(&ex);
\r
496 return INVOKERESULT_GENERIC_ERROR;
\r
498 DOUBLE_TO_NPVARIANT(val, result);
\r
499 return INVOKERESULT_NO_ERROR;
\r
501 case ID_input_state:
\r
503 int val = libvlc_input_get_state(p_input, &ex);
\r
504 libvlc_input_free(p_input);
\r
505 if( libvlc_exception_raised(&ex) )
\r
507 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
508 libvlc_exception_clear(&ex);
\r
509 return INVOKERESULT_GENERIC_ERROR;
\r
511 INT32_TO_NPVARIANT(val, result);
\r
512 return INVOKERESULT_NO_ERROR;
\r
514 case ID_input_rate:
\r
516 float val = libvlc_input_get_rate(p_input, &ex);
\r
517 libvlc_input_free(p_input);
\r
518 if( libvlc_exception_raised(&ex) )
\r
520 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
521 libvlc_exception_clear(&ex);
\r
522 return INVOKERESULT_GENERIC_ERROR;
\r
524 DOUBLE_TO_NPVARIANT(val, result);
\r
525 return INVOKERESULT_NO_ERROR;
\r
529 double val = libvlc_input_get_fps(p_input, &ex);
\r
530 libvlc_input_free(p_input);
\r
531 if( libvlc_exception_raised(&ex) )
\r
533 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
534 libvlc_exception_clear(&ex);
\r
535 return INVOKERESULT_GENERIC_ERROR;
\r
537 DOUBLE_TO_NPVARIANT(val, result);
\r
538 return INVOKERESULT_NO_ERROR;
\r
540 case ID_input_hasvout:
\r
542 vlc_bool_t val = libvlc_input_has_vout(p_input, &ex);
\r
543 libvlc_input_free(p_input);
\r
544 if( libvlc_exception_raised(&ex) )
\r
546 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
547 libvlc_exception_clear(&ex);
\r
548 return INVOKERESULT_GENERIC_ERROR;
\r
550 BOOLEAN_TO_NPVARIANT(val, result);
\r
551 return INVOKERESULT_NO_ERROR;
\r
556 libvlc_input_free(p_input);
\r
558 return INVOKERESULT_GENERIC_ERROR;
\r
561 RuntimeNPObject::InvokeResult LibvlcInputNPObject::setProperty(int index, const NPVariant &value)
\r
563 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
566 libvlc_exception_t ex;
\r
567 libvlc_exception_init(&ex);
\r
569 libvlc_input_t *p_input = libvlc_playlist_get_input(p_plugin->getVLC(), &ex);
\r
570 if( libvlc_exception_raised(&ex) )
\r
572 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
573 libvlc_exception_clear(&ex);
\r
574 return INVOKERESULT_GENERIC_ERROR;
\r
579 case ID_input_position:
\r
581 if( ! NPVARIANT_IS_DOUBLE(value) )
\r
583 libvlc_input_free(p_input);
\r
584 return INVOKERESULT_INVALID_VALUE;
\r
587 float val = (float)NPVARIANT_TO_DOUBLE(value);
\r
588 libvlc_input_set_position(p_input, val, &ex);
\r
589 libvlc_input_free(p_input);
\r
590 if( libvlc_exception_raised(&ex) )
\r
592 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
593 libvlc_exception_clear(&ex);
\r
594 return INVOKERESULT_GENERIC_ERROR;
\r
596 return INVOKERESULT_NO_ERROR;
\r
598 case ID_input_time:
\r
601 if( NPVARIANT_IS_INT32(value) )
\r
602 val = (vlc_int64_t)NPVARIANT_TO_INT32(value);
\r
603 else if( NPVARIANT_IS_DOUBLE(value) )
\r
604 val = (vlc_int64_t)NPVARIANT_TO_DOUBLE(value);
\r
607 libvlc_input_free(p_input);
\r
608 return INVOKERESULT_INVALID_VALUE;
\r
611 libvlc_input_set_time(p_input, val, &ex);
\r
612 libvlc_input_free(p_input);
\r
613 if( libvlc_exception_raised(&ex) )
\r
615 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
616 libvlc_exception_clear(&ex);
\r
617 return INVOKERESULT_GENERIC_ERROR;
\r
619 return INVOKERESULT_NO_ERROR;
\r
621 case ID_input_rate:
\r
624 if( NPVARIANT_IS_INT32(value) )
\r
625 val = (float)NPVARIANT_TO_INT32(value);
\r
626 else if( NPVARIANT_IS_DOUBLE(value) )
\r
627 val = (float)NPVARIANT_TO_DOUBLE(value);
\r
630 libvlc_input_free(p_input);
\r
631 return INVOKERESULT_INVALID_VALUE;
\r
634 libvlc_input_set_rate(p_input, val, &ex);
\r
635 libvlc_input_free(p_input);
\r
636 if( libvlc_exception_raised(&ex) )
\r
638 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
639 libvlc_exception_clear(&ex);
\r
640 return INVOKERESULT_GENERIC_ERROR;
\r
642 return INVOKERESULT_NO_ERROR;
\r
647 libvlc_input_free(p_input);
\r
649 return INVOKERESULT_GENERIC_ERROR;
\r
652 const NPUTF8 * const LibvlcInputNPObject::methodNames[] =
\r
657 const int LibvlcInputNPObject::methodCount = sizeof(LibvlcInputNPObject::methodNames)/sizeof(NPUTF8 *);
\r
660 ** implementation of libvlc message object
\r
663 const NPUTF8 * const LibvlcMessageNPObject::propertyNames[] =
\r
672 const int LibvlcMessageNPObject::propertyCount = sizeof(LibvlcMessageNPObject::propertyNames)/sizeof(NPUTF8 *);
\r
674 enum LibvlcMessageNPObjectPropertyIds
\r
676 ID_message_severity,
\r
680 ID_message_message,
\r
683 RuntimeNPObject::InvokeResult LibvlcMessageNPObject::getProperty(int index, NPVariant &result)
\r
685 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
690 case ID_message_severity:
\r
692 INT32_TO_NPVARIANT(_msg.i_severity, result);
\r
693 return INVOKERESULT_NO_ERROR;
\r
695 case ID_message_type:
\r
697 if( _msg.psz_type )
\r
699 int len = strlen(_msg.psz_type);
\r
700 NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len);
\r
703 memcpy(retval, _msg.psz_type, len);
\r
704 STRINGN_TO_NPVARIANT(retval, len, result);
\r
709 NULL_TO_NPVARIANT(result);
\r
711 return INVOKERESULT_NO_ERROR;
\r
713 case ID_message_name:
\r
715 if( _msg.psz_name )
\r
717 int len = strlen(_msg.psz_name);
\r
718 NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len);
\r
721 memcpy(retval, _msg.psz_name, len);
\r
722 STRINGN_TO_NPVARIANT(retval, len, result);
\r
727 NULL_TO_NPVARIANT(result);
\r
729 return INVOKERESULT_NO_ERROR;
\r
731 case ID_message_header:
\r
733 if( _msg.psz_header )
\r
735 int len = strlen(_msg.psz_header);
\r
736 NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len);
\r
739 memcpy(retval, _msg.psz_header, len);
\r
740 STRINGN_TO_NPVARIANT(retval, len, result);
\r
745 NULL_TO_NPVARIANT(result);
\r
747 return INVOKERESULT_NO_ERROR;
\r
749 case ID_message_message:
\r
751 if( _msg.psz_message )
\r
753 int len = strlen(_msg.psz_message);
\r
754 NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len);
\r
757 memcpy(retval, _msg.psz_message, len);
\r
758 STRINGN_TO_NPVARIANT(retval, len, result);
\r
763 NULL_TO_NPVARIANT(result);
\r
765 return INVOKERESULT_NO_ERROR;
\r
771 return INVOKERESULT_GENERIC_ERROR;
\r
774 const NPUTF8 * const LibvlcMessageNPObject::methodNames[] =
\r
779 const int LibvlcMessageNPObject::methodCount = sizeof(LibvlcMessageNPObject::methodNames)/sizeof(NPUTF8 *);
\r
782 ** implementation of libvlc message iterator object
\r
785 LibvlcMessageIteratorNPObject::LibvlcMessageIteratorNPObject(NPP instance, const NPClass *aClass) :
\r
786 RuntimeNPObject(instance, aClass),
\r
789 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
792 libvlc_log_t *p_log = p_plugin->getLog();
\r
795 _p_iter = libvlc_log_get_iterator(p_log, NULL);
\r
800 LibvlcMessageIteratorNPObject::~LibvlcMessageIteratorNPObject()
\r
803 libvlc_log_iterator_free(_p_iter, NULL);
\r
806 const NPUTF8 * const LibvlcMessageIteratorNPObject::propertyNames[] =
\r
811 const int LibvlcMessageIteratorNPObject::propertyCount = sizeof(LibvlcMessageIteratorNPObject::propertyNames)/sizeof(NPUTF8 *);
\r
813 enum LibvlcMessageIteratorNPObjectPropertyIds
\r
815 ID_messageiterator_hasNext,
\r
818 RuntimeNPObject::InvokeResult LibvlcMessageIteratorNPObject::getProperty(int index, NPVariant &result)
\r
820 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
825 case ID_messageiterator_hasNext:
\r
827 if( _p_iter && p_plugin->getLog() )
\r
829 libvlc_exception_t ex;
\r
830 libvlc_exception_init(&ex);
\r
832 BOOLEAN_TO_NPVARIANT(libvlc_log_iterator_has_next(_p_iter, &ex), result);
\r
833 if( libvlc_exception_raised(&ex) )
\r
835 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
836 libvlc_exception_clear(&ex);
\r
837 return INVOKERESULT_GENERIC_ERROR;
\r
842 BOOLEAN_TO_NPVARIANT(0, result);
\r
844 return INVOKERESULT_NO_ERROR;
\r
850 return INVOKERESULT_GENERIC_ERROR;
\r
853 const NPUTF8 * const LibvlcMessageIteratorNPObject::methodNames[] =
\r
858 const int LibvlcMessageIteratorNPObject::methodCount = sizeof(LibvlcMessageIteratorNPObject::methodNames)/sizeof(NPUTF8 *);
\r
860 enum LibvlcMessageIteratorNPObjectMethodIds
\r
862 ID_messageiterator_next,
\r
865 RuntimeNPObject::InvokeResult LibvlcMessageIteratorNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)
\r
867 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
870 libvlc_exception_t ex;
\r
871 libvlc_exception_init(&ex);
\r
875 case ID_messageiterator_next:
\r
876 if( argCount == 0 )
\r
878 if( _p_iter && p_plugin->getLog() )
\r
880 struct libvlc_log_message_t buffer;
\r
882 buffer.sizeof_msg = sizeof(buffer);
\r
884 libvlc_log_iterator_next(_p_iter, &buffer, &ex);
\r
885 if( libvlc_exception_raised(&ex) )
\r
887 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
888 libvlc_exception_clear(&ex);
\r
889 return INVOKERESULT_GENERIC_ERROR;
\r
893 LibvlcMessageNPObject* message =
\r
894 static_cast<LibvlcMessageNPObject*>(NPN_CreateObject(_instance, RuntimeNPClass<LibvlcMessageNPObject>::getClass()));
\r
897 message->setMessage(buffer);
\r
898 OBJECT_TO_NPVARIANT(message, result);
\r
899 return INVOKERESULT_NO_ERROR;
\r
901 return INVOKERESULT_OUT_OF_MEMORY;
\r
904 return INVOKERESULT_GENERIC_ERROR;
\r
906 return INVOKERESULT_NO_SUCH_METHOD;
\r
911 return INVOKERESULT_GENERIC_ERROR;
\r
915 ** implementation of libvlc message object
\r
918 const NPUTF8 * const LibvlcMessagesNPObject::propertyNames[] =
\r
923 const int LibvlcMessagesNPObject::propertyCount = sizeof(LibvlcMessagesNPObject::propertyNames)/sizeof(NPUTF8 *);
\r
925 enum LibvlcMessagesNPObjectPropertyIds
\r
930 RuntimeNPObject::InvokeResult LibvlcMessagesNPObject::getProperty(int index, NPVariant &result)
\r
932 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
937 case ID_messages_count:
\r
939 libvlc_log_t *p_log = p_plugin->getLog();
\r
942 libvlc_exception_t ex;
\r
943 libvlc_exception_init(&ex);
\r
945 INT32_TO_NPVARIANT(libvlc_log_count(p_log, &ex), result);
\r
946 if( libvlc_exception_raised(&ex) )
\r
948 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
949 libvlc_exception_clear(&ex);
\r
950 return INVOKERESULT_GENERIC_ERROR;
\r
955 INT32_TO_NPVARIANT(0, result);
\r
957 return INVOKERESULT_NO_ERROR;
\r
963 return INVOKERESULT_GENERIC_ERROR;
\r
966 const NPUTF8 * const LibvlcMessagesNPObject::methodNames[] =
\r
972 const int LibvlcMessagesNPObject::methodCount = sizeof(LibvlcMessagesNPObject::methodNames)/sizeof(NPUTF8 *);
\r
974 enum LibvlcMessagesNPObjectMethodIds
\r
977 ID_messages_iterator,
\r
980 RuntimeNPObject::InvokeResult LibvlcMessagesNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)
\r
982 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
985 libvlc_exception_t ex;
\r
986 libvlc_exception_init(&ex);
\r
990 case ID_messages_clear:
\r
991 if( argCount == 0 )
\r
993 libvlc_log_t *p_log = p_plugin->getLog();
\r
996 libvlc_log_clear(p_log, &ex);
\r
997 if( libvlc_exception_raised(&ex) )
\r
999 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1000 libvlc_exception_clear(&ex);
\r
1001 return INVOKERESULT_GENERIC_ERROR;
\r
1004 return INVOKERESULT_NO_ERROR;
\r
1006 return INVOKERESULT_NO_SUCH_METHOD;
\r
1008 case ID_messages_iterator:
\r
1009 if( argCount == 0 )
\r
1011 LibvlcMessageIteratorNPObject* iter =
\r
1012 static_cast<LibvlcMessageIteratorNPObject*>(NPN_CreateObject(_instance, RuntimeNPClass<LibvlcMessageIteratorNPObject>::getClass()));
\r
1015 OBJECT_TO_NPVARIANT(iter, result);
\r
1016 return INVOKERESULT_NO_ERROR;
\r
1018 return INVOKERESULT_OUT_OF_MEMORY;
\r
1020 return INVOKERESULT_NO_SUCH_METHOD;
\r
1026 return INVOKERESULT_GENERIC_ERROR;
\r
1031 ** implementation of libvlc message object
\r
1035 LibvlcLogNPObject::LibvlcLogNPObject(NPP instance, const NPClass *aClass) :
\r
1036 RuntimeNPObject(instance, aClass)
\r
1038 _p_vlcmessages = static_cast<LibvlcMessagesNPObject*>(NPN_CreateObject(instance, RuntimeNPClass<LibvlcMessagesNPObject>::getClass()));
\r
1041 LibvlcLogNPObject::~LibvlcLogNPObject()
\r
1043 NPN_ReleaseObject(_p_vlcmessages);
\r
1046 const NPUTF8 * const LibvlcLogNPObject::propertyNames[] =
\r
1052 const int LibvlcLogNPObject::propertyCount = sizeof(LibvlcLogNPObject::propertyNames)/sizeof(NPUTF8 *);
\r
1054 enum LibvlcLogNPObjectPropertyIds
\r
1060 RuntimeNPObject::InvokeResult LibvlcLogNPObject::getProperty(int index, NPVariant &result)
\r
1062 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
1065 libvlc_exception_t ex;
\r
1066 libvlc_exception_init(&ex);
\r
1070 case ID_log_messages:
\r
1072 OBJECT_TO_NPVARIANT(NPN_RetainObject(_p_vlcmessages), result);
\r
1073 return INVOKERESULT_NO_ERROR;
\r
1075 case ID_log_verbosity:
\r
1077 if( p_plugin->getLog() )
\r
1079 INT32_TO_NPVARIANT(libvlc_get_log_verbosity(p_plugin->getVLC(),
\r
1081 if( libvlc_exception_raised(&ex) )
\r
1083 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1084 libvlc_exception_clear(&ex);
\r
1085 return INVOKERESULT_GENERIC_ERROR;
\r
1090 /* log is not enabled, return -1 */
\r
1091 DOUBLE_TO_NPVARIANT(-1.0, result);
\r
1093 return INVOKERESULT_NO_ERROR;
\r
1099 return INVOKERESULT_GENERIC_ERROR;
\r
1102 RuntimeNPObject::InvokeResult LibvlcLogNPObject::setProperty(int index, const NPVariant &value)
\r
1104 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
1107 libvlc_exception_t ex;
\r
1108 libvlc_exception_init(&ex);
\r
1112 case ID_log_verbosity:
\r
1113 if( isNumberValue(value) )
\r
1115 libvlc_instance_t* p_libvlc = p_plugin->getVLC();
\r
1116 libvlc_log_t *p_log = p_plugin->getLog();
\r
1117 int verbosity = numberValue(value);
\r
1118 if( verbosity >= 0 )
\r
1122 p_log = libvlc_log_open(p_libvlc, &ex);
\r
1123 if( libvlc_exception_raised(&ex) )
\r
1125 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1126 libvlc_exception_clear(&ex);
\r
1127 return INVOKERESULT_GENERIC_ERROR;
\r
1129 p_plugin->setLog(p_log);
\r
1131 libvlc_set_log_verbosity(p_libvlc, (unsigned)verbosity, &ex);
\r
1132 if( libvlc_exception_raised(&ex) )
\r
1134 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1135 libvlc_exception_clear(&ex);
\r
1136 return INVOKERESULT_GENERIC_ERROR;
\r
1141 /* close log when verbosity is set to -1 */
\r
1142 p_plugin->setLog(NULL);
\r
1143 libvlc_log_close(p_log, &ex);
\r
1144 if( libvlc_exception_raised(&ex) )
\r
1146 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1147 libvlc_exception_clear(&ex);
\r
1148 return INVOKERESULT_GENERIC_ERROR;
\r
1151 return INVOKERESULT_NO_ERROR;
\r
1153 return INVOKERESULT_INVALID_VALUE;
\r
1158 return INVOKERESULT_GENERIC_ERROR;
\r
1161 const NPUTF8 * const LibvlcLogNPObject::methodNames[] =
\r
1166 const int LibvlcLogNPObject::methodCount = sizeof(LibvlcLogNPObject::methodNames)/sizeof(NPUTF8 *);
\r
1169 ** implementation of libvlc playlist items object
\r
1172 const NPUTF8 * const LibvlcPlaylistItemsNPObject::propertyNames[] =
\r
1177 const int LibvlcPlaylistItemsNPObject::propertyCount = sizeof(LibvlcPlaylistItemsNPObject::propertyNames)/sizeof(NPUTF8 *);
\r
1179 enum LibvlcPlaylistItemsNPObjectPropertyIds
\r
1181 ID_playlistitems_count,
\r
1184 RuntimeNPObject::InvokeResult LibvlcPlaylistItemsNPObject::getProperty(int index, NPVariant &result)
\r
1186 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
1189 libvlc_exception_t ex;
\r
1190 libvlc_exception_init(&ex);
\r
1194 case ID_playlistitems_count:
\r
1196 int val = libvlc_playlist_items_count(p_plugin->getVLC(), &ex);
\r
1197 if( libvlc_exception_raised(&ex) )
\r
1199 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1200 libvlc_exception_clear(&ex);
\r
1201 return INVOKERESULT_GENERIC_ERROR;
\r
1203 INT32_TO_NPVARIANT(val, result);
\r
1204 return INVOKERESULT_NO_ERROR;
\r
1210 return INVOKERESULT_GENERIC_ERROR;
\r
1213 const NPUTF8 * const LibvlcPlaylistItemsNPObject::methodNames[] =
\r
1219 const int LibvlcPlaylistItemsNPObject::methodCount = sizeof(LibvlcPlaylistItemsNPObject::methodNames)/sizeof(NPUTF8 *);
\r
1221 enum LibvlcPlaylistItemsNPObjectMethodIds
\r
1223 ID_playlistitems_clear,
\r
1224 ID_playlistitems_remove,
\r
1227 RuntimeNPObject::InvokeResult LibvlcPlaylistItemsNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)
\r
1229 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
1232 libvlc_exception_t ex;
\r
1233 libvlc_exception_init(&ex);
\r
1237 case ID_playlistitems_clear:
\r
1238 if( argCount == 0 )
\r
1240 libvlc_playlist_clear(p_plugin->getVLC(), &ex);
\r
1241 if( libvlc_exception_raised(&ex) )
\r
1243 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1244 libvlc_exception_clear(&ex);
\r
1245 return INVOKERESULT_GENERIC_ERROR;
\r
1249 VOID_TO_NPVARIANT(result);
\r
1250 return INVOKERESULT_NO_ERROR;
\r
1253 return INVOKERESULT_NO_SUCH_METHOD;
\r
1254 case ID_playlistitems_remove:
\r
1255 if( (argCount == 1) && isNumberValue(args[0]) )
\r
1257 libvlc_playlist_delete_item(p_plugin->getVLC(), numberValue(args[0]), &ex);
\r
1258 if( libvlc_exception_raised(&ex) )
\r
1260 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1261 libvlc_exception_clear(&ex);
\r
1262 return INVOKERESULT_GENERIC_ERROR;
\r
1266 VOID_TO_NPVARIANT(result);
\r
1267 return INVOKERESULT_NO_ERROR;
\r
1270 return INVOKERESULT_NO_SUCH_METHOD;
\r
1275 return INVOKERESULT_GENERIC_ERROR;
\r
1279 ** implementation of libvlc playlist object
\r
1283 LibvlcPlaylistNPObject::LibvlcPlaylistNPObject(NPP instance, const NPClass *aClass) :
\r
1284 RuntimeNPObject(instance, aClass)
\r
1286 _p_vlcplaylistitems = static_cast<LibvlcPlaylistItemsNPObject*>(NPN_CreateObject(instance, RuntimeNPClass<LibvlcPlaylistItemsNPObject>::getClass()));
\r
1289 LibvlcPlaylistNPObject::~LibvlcPlaylistNPObject()
\r
1291 NPN_ReleaseObject(_p_vlcplaylistitems);
\r
1294 const NPUTF8 * const LibvlcPlaylistNPObject::propertyNames[] =
\r
1296 "itemCount", /* deprecated */
\r
1301 const int LibvlcPlaylistNPObject::propertyCount = sizeof(LibvlcPlaylistNPObject::propertyNames)/sizeof(NPUTF8 *);
\r
1303 enum LibvlcPlaylistNPObjectPropertyIds
\r
1305 ID_playlist_itemcount,
\r
1306 ID_playlist_isplaying,
\r
1307 ID_playlist_items,
\r
1310 RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::getProperty(int index, NPVariant &result)
\r
1312 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
1315 libvlc_exception_t ex;
\r
1316 libvlc_exception_init(&ex);
\r
1320 case ID_playlist_itemcount: /* deprecated */
\r
1322 int val = libvlc_playlist_items_count(p_plugin->getVLC(), &ex);
\r
1323 if( libvlc_exception_raised(&ex) )
\r
1325 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1326 libvlc_exception_clear(&ex);
\r
1327 return INVOKERESULT_GENERIC_ERROR;
\r
1329 INT32_TO_NPVARIANT(val, result);
\r
1330 return INVOKERESULT_NO_ERROR;
\r
1332 case ID_playlist_isplaying:
\r
1334 int val = libvlc_playlist_isplaying(p_plugin->getVLC(), &ex);
\r
1335 if( libvlc_exception_raised(&ex) )
\r
1337 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1338 libvlc_exception_clear(&ex);
\r
1339 return INVOKERESULT_GENERIC_ERROR;
\r
1341 BOOLEAN_TO_NPVARIANT(val, result);
\r
1342 return INVOKERESULT_NO_ERROR;
\r
1344 case ID_playlist_items:
\r
1346 OBJECT_TO_NPVARIANT(NPN_RetainObject(_p_vlcplaylistitems), result);
\r
1347 return INVOKERESULT_NO_ERROR;
\r
1353 return INVOKERESULT_GENERIC_ERROR;
\r
1356 const NPUTF8 * const LibvlcPlaylistNPObject::methodNames[] =
\r
1365 "clear", /* deprecated */
\r
1366 "removeItem", /* deprecated */
\r
1369 const int LibvlcPlaylistNPObject::methodCount = sizeof(LibvlcPlaylistNPObject::methodNames)/sizeof(NPUTF8 *);
\r
1371 enum LibvlcPlaylistNPObjectMethodIds
\r
1375 ID_playlist_playItem,
\r
1376 ID_playlist_togglepause,
\r
1380 ID_playlist_clear,
\r
1381 ID_playlist_removeitem
\r
1384 RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)
\r
1386 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
1389 libvlc_exception_t ex;
\r
1390 libvlc_exception_init(&ex);
\r
1394 case ID_playlist_add:
\r
1396 if( (argCount < 1) || (argCount > 3) )
\r
1397 return INVOKERESULT_NO_SUCH_METHOD;
\r
1402 if( NPVARIANT_IS_STRING(args[0]) )
\r
1404 char *s = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
1407 url = p_plugin->getAbsoluteURL(s);
\r
1411 // problem with combining url, use argument
\r
1415 return INVOKERESULT_OUT_OF_MEMORY;
\r
1418 return INVOKERESULT_NO_SUCH_METHOD;
\r
1420 char *name = NULL;
\r
1422 // grab name if available
\r
1423 if( argCount > 1 )
\r
1425 if( NPVARIANT_IS_NULL(args[1]) )
\r
1429 else if( NPVARIANT_IS_STRING(args[1]) )
\r
1431 name = stringValue(NPVARIANT_TO_STRING(args[0]));
\r
1434 return INVOKERESULT_NO_SUCH_METHOD;
\r
1437 int i_options = 0;
\r
1438 char** ppsz_options = NULL;
\r
1440 // grab options if available
\r
1441 if( argCount > 2 )
\r
1443 if( NPVARIANT_IS_NULL(args[2]) )
\r
1447 else if( NPVARIANT_IS_STRING(args[2]) )
\r
1449 parseOptions(NPVARIANT_TO_STRING(args[2]), &i_options, &ppsz_options);
\r
1452 else if( NPVARIANT_IS_OBJECT(args[2]) )
\r
1454 parseOptions(NPVARIANT_TO_OBJECT(args[2]), &i_options, &ppsz_options);
\r
1458 int item = libvlc_playlist_add_extended(p_plugin->getVLC(),
\r
1462 const_cast<const char **>(ppsz_options),
\r
1466 for( int i=0; i< i_options; ++i )
\r
1468 if( ppsz_options[i] )
\r
1469 free(ppsz_options[i]);
\r
1471 if( ppsz_options )
\r
1472 free(ppsz_options);
\r
1473 if( libvlc_exception_raised(&ex) )
\r
1475 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1476 libvlc_exception_clear(&ex);
\r
1477 return INVOKERESULT_GENERIC_ERROR;
\r
1481 INT32_TO_NPVARIANT(item, result);
\r
1482 return INVOKERESULT_NO_ERROR;
\r
1485 case ID_playlist_play:
\r
1486 if( argCount == 0 )
\r
1488 libvlc_playlist_play(p_plugin->getVLC(), -1, 0, NULL, &ex);
\r
1489 if( libvlc_exception_raised(&ex) )
\r
1491 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1492 libvlc_exception_clear(&ex);
\r
1493 return INVOKERESULT_GENERIC_ERROR;
\r
1497 VOID_TO_NPVARIANT(result);
\r
1498 return INVOKERESULT_NO_ERROR;
\r
1501 return INVOKERESULT_NO_SUCH_METHOD;
\r
1502 case ID_playlist_playItem:
\r
1503 if( (argCount == 1) && isNumberValue(args[0]) )
\r
1505 libvlc_playlist_play(p_plugin->getVLC(), numberValue(args[0]), 0, NULL, &ex);
\r
1506 if( libvlc_exception_raised(&ex) )
\r
1508 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1509 libvlc_exception_clear(&ex);
\r
1510 return INVOKERESULT_GENERIC_ERROR;
\r
1514 VOID_TO_NPVARIANT(result);
\r
1515 return INVOKERESULT_NO_ERROR;
\r
1518 return INVOKERESULT_NO_SUCH_METHOD;
\r
1519 case ID_playlist_togglepause:
\r
1520 if( argCount == 0 )
\r
1522 libvlc_playlist_pause(p_plugin->getVLC(), &ex);
\r
1523 if( libvlc_exception_raised(&ex) )
\r
1525 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1526 libvlc_exception_clear(&ex);
\r
1527 return INVOKERESULT_GENERIC_ERROR;
\r
1531 VOID_TO_NPVARIANT(result);
\r
1532 return INVOKERESULT_NO_ERROR;
\r
1535 return INVOKERESULT_NO_SUCH_METHOD;
\r
1536 case ID_playlist_stop:
\r
1537 if( argCount == 0 )
\r
1539 libvlc_playlist_stop(p_plugin->getVLC(), &ex);
\r
1540 if( libvlc_exception_raised(&ex) )
\r
1542 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1543 libvlc_exception_clear(&ex);
\r
1544 return INVOKERESULT_GENERIC_ERROR;
\r
1548 VOID_TO_NPVARIANT(result);
\r
1549 return INVOKERESULT_NO_ERROR;
\r
1552 return INVOKERESULT_NO_SUCH_METHOD;
\r
1553 case ID_playlist_next:
\r
1554 if( argCount == 0 )
\r
1556 libvlc_playlist_next(p_plugin->getVLC(), &ex);
\r
1557 if( libvlc_exception_raised(&ex) )
\r
1559 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1560 libvlc_exception_clear(&ex);
\r
1561 return INVOKERESULT_GENERIC_ERROR;
\r
1565 VOID_TO_NPVARIANT(result);
\r
1566 return INVOKERESULT_NO_ERROR;
\r
1569 return INVOKERESULT_NO_SUCH_METHOD;
\r
1570 case ID_playlist_prev:
\r
1571 if( argCount == 0 )
\r
1573 libvlc_playlist_prev(p_plugin->getVLC(), &ex);
\r
1574 if( libvlc_exception_raised(&ex) )
\r
1576 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1577 libvlc_exception_clear(&ex);
\r
1578 return INVOKERESULT_GENERIC_ERROR;
\r
1582 VOID_TO_NPVARIANT(result);
\r
1583 return INVOKERESULT_NO_ERROR;
\r
1586 return INVOKERESULT_NO_SUCH_METHOD;
\r
1587 case ID_playlist_clear: /* deprecated */
\r
1588 if( argCount == 0 )
\r
1590 libvlc_playlist_clear(p_plugin->getVLC(), &ex);
\r
1591 if( libvlc_exception_raised(&ex) )
\r
1593 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1594 libvlc_exception_clear(&ex);
\r
1595 return INVOKERESULT_GENERIC_ERROR;
\r
1599 VOID_TO_NPVARIANT(result);
\r
1600 return INVOKERESULT_NO_ERROR;
\r
1603 return INVOKERESULT_NO_SUCH_METHOD;
\r
1604 case ID_playlist_removeitem: /* deprecated */
\r
1605 if( (argCount == 1) && isNumberValue(args[0]) )
\r
1607 libvlc_playlist_delete_item(p_plugin->getVLC(), numberValue(args[0]), &ex);
\r
1608 if( libvlc_exception_raised(&ex) )
\r
1610 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1611 libvlc_exception_clear(&ex);
\r
1612 return INVOKERESULT_GENERIC_ERROR;
\r
1616 VOID_TO_NPVARIANT(result);
\r
1617 return INVOKERESULT_NO_ERROR;
\r
1620 return INVOKERESULT_NO_SUCH_METHOD;
\r
1625 return INVOKERESULT_GENERIC_ERROR;
\r
1628 void LibvlcPlaylistNPObject::parseOptions(const NPString &s, int *i_options, char*** ppsz_options)
\r
1630 if( s.utf8length )
\r
1632 char *val = stringValue(s);
\r
1635 long capacity = 16;
\r
1636 char **options = (char **)malloc(capacity*sizeof(char *));
\r
1641 char *end = val + s.utf8length;
\r
1642 while( val < end )
\r
1644 // skip leading blanks
\r
1645 while( (val < end)
\r
1646 && ((*val == ' ' ) || (*val == '\t')) )
\r
1649 char *start = val;
\r
1650 // skip till we get a blank character
\r
1651 while( (val < end)
\r
1653 && (*val != '\t') )
\r
1655 char c = *(val++);
\r
1656 if( ('\'' == c) || ('"' == c) )
\r
1658 // skip till end of string
\r
1659 while( (val < end) && (*(val++) != c ) );
\r
1665 if( nOptions == capacity )
\r
1668 char **moreOptions = (char **)realloc(options, capacity*sizeof(char*));
\r
1669 if( ! moreOptions )
\r
1671 /* failed to allocate more memory */
\r
1673 /* return what we got so far */
\r
1674 *i_options = nOptions;
\r
1675 *ppsz_options = options;
\r
1678 options = moreOptions;
\r
1681 options[nOptions++] = strdup(start);
\r
1684 // must be end of string
\r
1687 *i_options = nOptions;
\r
1688 *ppsz_options = options;
\r
1695 void LibvlcPlaylistNPObject::parseOptions(NPObject *obj, int *i_options, char*** ppsz_options)
\r
1697 /* WARNING: Safari does not implement NPN_HasProperty/NPN_HasMethod */
\r
1701 /* we are expecting to have a Javascript Array object */
\r
1702 NPIdentifier propId = NPN_GetStringIdentifier("length");
\r
1703 if( NPN_GetProperty(_instance, obj, propId, &value) )
\r
1705 int count = numberValue(value);
\r
1706 NPN_ReleaseVariantValue(&value);
\r
1710 long capacity = 16;
\r
1711 char **options = (char **)malloc(capacity*sizeof(char *));
\r
1716 while( nOptions < count )
\r
1718 propId = NPN_GetIntIdentifier(nOptions);
\r
1719 if( ! NPN_GetProperty(_instance, obj, propId, &value) )
\r
1720 /* return what we got so far */
\r
1723 if( ! NPVARIANT_IS_STRING(value) )
\r
1725 /* return what we got so far */
\r
1726 NPN_ReleaseVariantValue(&value);
\r
1730 if( nOptions == capacity )
\r
1733 char **moreOptions = (char **)realloc(options, capacity*sizeof(char*));
\r
1734 if( ! moreOptions )
\r
1736 /* failed to allocate more memory */
\r
1737 NPN_ReleaseVariantValue(&value);
\r
1738 /* return what we got so far */
\r
1739 *i_options = nOptions;
\r
1740 *ppsz_options = options;
\r
1743 options = moreOptions;
\r
1746 options[nOptions++] = stringValue(value);
\r
1748 *i_options = nOptions;
\r
1749 *ppsz_options = options;
\r
1756 ** implementation of libvlc video object
\r
1759 const NPUTF8 * const LibvlcVideoNPObject::propertyNames[] =
\r
1768 enum LibvlcVideoNPObjectPropertyIds
\r
1770 ID_video_fullscreen,
\r
1773 ID_video_aspectratio,
\r
1777 const int LibvlcVideoNPObject::propertyCount = sizeof(LibvlcVideoNPObject::propertyNames)/sizeof(NPUTF8 *);
\r
1779 RuntimeNPObject::InvokeResult LibvlcVideoNPObject::getProperty(int index, NPVariant &result)
\r
1781 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
1784 libvlc_exception_t ex;
\r
1785 libvlc_exception_init(&ex);
\r
1787 libvlc_input_t *p_input = libvlc_playlist_get_input(p_plugin->getVLC(), &ex);
\r
1788 if( libvlc_exception_raised(&ex) )
\r
1790 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1791 libvlc_exception_clear(&ex);
\r
1792 return INVOKERESULT_GENERIC_ERROR;
\r
1797 case ID_video_fullscreen:
\r
1799 int val = libvlc_get_fullscreen(p_input, &ex);
\r
1800 libvlc_input_free(p_input);
\r
1801 if( libvlc_exception_raised(&ex) )
\r
1803 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1804 libvlc_exception_clear(&ex);
\r
1805 return INVOKERESULT_GENERIC_ERROR;
\r
1807 BOOLEAN_TO_NPVARIANT(val, result);
\r
1808 return INVOKERESULT_NO_ERROR;
\r
1810 case ID_video_height:
\r
1812 int val = libvlc_video_get_height(p_input, &ex);
\r
1813 libvlc_input_free(p_input);
\r
1814 if( libvlc_exception_raised(&ex) )
\r
1816 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1817 libvlc_exception_clear(&ex);
\r
1818 return INVOKERESULT_GENERIC_ERROR;
\r
1820 INT32_TO_NPVARIANT(val, result);
\r
1821 return INVOKERESULT_NO_ERROR;
\r
1823 case ID_video_width:
\r
1825 int val = libvlc_video_get_width(p_input, &ex);
\r
1826 libvlc_input_free(p_input);
\r
1827 if( libvlc_exception_raised(&ex) )
\r
1829 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1830 libvlc_exception_clear(&ex);
\r
1831 return INVOKERESULT_GENERIC_ERROR;
\r
1833 INT32_TO_NPVARIANT(val, result);
\r
1834 return INVOKERESULT_NO_ERROR;
\r
1836 case ID_video_aspectratio:
\r
1838 NPUTF8 *psz_aspect = libvlc_video_get_aspect_ratio(p_input, &ex);
\r
1839 libvlc_input_free(p_input);
\r
1840 if( libvlc_exception_raised(&ex) )
\r
1842 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1843 libvlc_exception_clear(&ex);
\r
1844 return INVOKERESULT_GENERIC_ERROR;
\r
1847 return INVOKERESULT_GENERIC_ERROR;
\r
1849 STRINGZ_TO_NPVARIANT(psz_aspect, result);
\r
1850 return INVOKERESULT_NO_ERROR;
\r
1852 case ID_video_crop:
\r
1854 NPUTF8 *psz_geometry = libvlc_video_get_crop_geometry(p_input, &ex);
\r
1855 libvlc_input_free(p_input);
\r
1856 if( libvlc_exception_raised(&ex) )
\r
1858 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1859 libvlc_exception_clear(&ex);
\r
1860 return INVOKERESULT_GENERIC_ERROR;
\r
1862 if( !psz_geometry )
\r
1863 return INVOKERESULT_GENERIC_ERROR;
\r
1865 STRINGZ_TO_NPVARIANT(psz_geometry, result);
\r
1866 return INVOKERESULT_NO_ERROR;
\r
1869 libvlc_input_free(p_input);
\r
1871 return INVOKERESULT_GENERIC_ERROR;
\r
1874 RuntimeNPObject::InvokeResult LibvlcVideoNPObject::setProperty(int index, const NPVariant &value)
\r
1876 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
1879 libvlc_exception_t ex;
\r
1880 libvlc_exception_init(&ex);
\r
1882 libvlc_input_t *p_input = libvlc_playlist_get_input(p_plugin->getVLC(), &ex);
\r
1883 if( libvlc_exception_raised(&ex) )
\r
1885 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1886 libvlc_exception_clear(&ex);
\r
1887 return INVOKERESULT_GENERIC_ERROR;
\r
1892 case ID_video_fullscreen:
\r
1894 if( ! NPVARIANT_IS_BOOLEAN(value) )
\r
1896 libvlc_input_free(p_input);
\r
1897 return INVOKERESULT_INVALID_VALUE;
\r
1900 int val = NPVARIANT_TO_BOOLEAN(value);
\r
1901 libvlc_set_fullscreen(p_input, val, &ex);
\r
1902 libvlc_input_free(p_input);
\r
1904 if( libvlc_exception_raised(&ex) )
\r
1906 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1907 libvlc_exception_clear(&ex);
\r
1908 return INVOKERESULT_GENERIC_ERROR;
\r
1910 return INVOKERESULT_NO_ERROR;
\r
1912 case ID_video_aspectratio:
\r
1914 char *psz_aspect = NULL;
\r
1916 if( ! NPVARIANT_IS_STRING(value) )
\r
1918 libvlc_input_free(p_input);
\r
1919 return INVOKERESULT_INVALID_VALUE;
\r
1922 psz_aspect = stringValue(NPVARIANT_TO_STRING(value));
\r
1925 libvlc_input_free(p_input);
\r
1926 return INVOKERESULT_GENERIC_ERROR;
\r
1929 libvlc_video_set_aspect_ratio(p_input, psz_aspect, &ex);
\r
1930 free(psz_aspect );
\r
1931 libvlc_input_free(p_input);
\r
1933 if( libvlc_exception_raised(&ex) )
\r
1935 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1936 libvlc_exception_clear(&ex);
\r
1937 return INVOKERESULT_GENERIC_ERROR;
\r
1939 return INVOKERESULT_NO_ERROR;
\r
1941 case ID_video_crop:
\r
1943 char *psz_geometry = NULL;
\r
1945 if( ! NPVARIANT_IS_STRING(value) )
\r
1947 libvlc_input_free(p_input);
\r
1948 return INVOKERESULT_INVALID_VALUE;
\r
1951 psz_geometry = stringValue(NPVARIANT_TO_STRING(value));
\r
1952 if( !psz_geometry )
\r
1954 libvlc_input_free(p_input);
\r
1955 return INVOKERESULT_GENERIC_ERROR;
\r
1958 libvlc_video_set_crop_geometry(p_input, psz_geometry, &ex);
\r
1959 free(psz_geometry );
\r
1960 libvlc_input_free(p_input);
\r
1962 if( libvlc_exception_raised(&ex) )
\r
1964 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
1965 libvlc_exception_clear(&ex);
\r
1966 return INVOKERESULT_GENERIC_ERROR;
\r
1968 return INVOKERESULT_NO_ERROR;
\r
1971 libvlc_input_free(p_input);
\r
1973 return INVOKERESULT_GENERIC_ERROR;
\r
1976 const NPUTF8 * const LibvlcVideoNPObject::methodNames[] =
\r
1978 "toggleFullscreen",
\r
1981 enum LibvlcVideoNPObjectMethodIds
\r
1983 ID_video_togglefullscreen,
\r
1986 const int LibvlcVideoNPObject::methodCount = sizeof(LibvlcVideoNPObject::methodNames)/sizeof(NPUTF8 *);
\r
1988 RuntimeNPObject::InvokeResult LibvlcVideoNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)
\r
1990 VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);
\r
1993 libvlc_exception_t ex;
\r
1994 libvlc_exception_init(&ex);
\r
1996 libvlc_input_t *p_input = libvlc_playlist_get_input(p_plugin->getVLC(), &ex);
\r
1997 if( libvlc_exception_raised(&ex) )
\r
1999 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
2000 libvlc_exception_clear(&ex);
\r
2001 return INVOKERESULT_GENERIC_ERROR;
\r
2006 case ID_video_togglefullscreen:
\r
2007 if( argCount == 0 )
\r
2009 libvlc_toggle_fullscreen(p_input, &ex);
\r
2010 libvlc_input_free(p_input);
\r
2011 if( libvlc_exception_raised(&ex) )
\r
2013 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
2014 libvlc_exception_clear(&ex);
\r
2015 return INVOKERESULT_GENERIC_ERROR;
\r
2019 VOID_TO_NPVARIANT(result);
\r
2020 return INVOKERESULT_NO_ERROR;
\r
2025 /* cannot get input, probably not playing */
\r
2026 if( libvlc_exception_raised(&ex) )
\r
2028 NPN_SetException(this, libvlc_exception_get_message(&ex));
\r
2029 libvlc_exception_clear(&ex);
\r
2031 return INVOKERESULT_GENERIC_ERROR;
\r
2033 return INVOKERESULT_NO_SUCH_METHOD;
\r
2035 return INVOKERESULT_NO_SUCH_METHOD;
\r
2038 return INVOKERESULT_GENERIC_ERROR;
\r