/***************************************************************************** * misc.c ***************************************************************************** * Copyright (C) 2007-2008 the VideoLAN team * $Id$ * * Authors: Antoine Cellerier * Pierre d'Herbemont * RĂ©mi Duraffort * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ #ifndef _GNU_SOURCE # define _GNU_SOURCE #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include #include #include "../vlc.h" #include "../libs.h" #include "misc.h" /***************************************************************************** * Internal lua<->vlc utils *****************************************************************************/ void vlclua_set_object( lua_State *L, void *id, void *value ) { lua_pushlightuserdata( L, id ); lua_pushlightuserdata( L, value ); lua_rawset( L, LUA_REGISTRYINDEX ); } void *vlclua_get_object( lua_State *L, void *id ) { lua_pushlightuserdata( L, id ); lua_rawget( L, LUA_REGISTRYINDEX ); const void *p = lua_topointer( L, -1 ); lua_pop( L, 1 ); return (void *)p; } #undef vlclua_set_this void vlclua_set_this( lua_State *L, vlc_object_t *p_this ) { vlclua_set_object( L, vlclua_set_this, p_this ); } vlc_object_t * vlclua_get_this( lua_State *L ) { return vlclua_get_object( L, vlclua_set_this ); } /***************************************************************************** * VLC error code translation *****************************************************************************/ int vlclua_push_ret( lua_State *L, int i_error ) { lua_pushnumber( L, i_error ); lua_pushstring( L, vlc_error( i_error ) ); return 2; } /***************************************************************************** * Get the VLC version string *****************************************************************************/ static int vlclua_version( lua_State *L ) { lua_pushstring( L, VERSION_MESSAGE ); return 1; } /***************************************************************************** * Get the VLC copyright *****************************************************************************/ static int vlclua_copyright( lua_State *L ) { lua_pushliteral( L, COPYRIGHT_MESSAGE ); return 1; } /***************************************************************************** * Get the VLC license msg/disclaimer *****************************************************************************/ static int vlclua_license( lua_State *L ) { lua_pushstring( L, LICENSE_MSG ); return 1; } /***************************************************************************** * Quit VLC *****************************************************************************/ static int vlclua_quit( lua_State *L ) { vlc_object_t *p_this = vlclua_get_this( L ); /* The rc.c code also stops the playlist ... not sure if this is needed * though. */ libvlc_Quit( p_this->obj.libvlc ); return 0; } static int vlclua_mdate( lua_State *L ) { lua_pushnumber( L, mdate() ); return 1; } static int vlclua_mwait( lua_State *L ) { double f = luaL_checknumber( L, 1 ); vlc_interrupt_t *oint = vlclua_set_interrupt( L ); int ret = vlc_mwait_i11e( llround(f) ); vlc_interrupt_set( oint ); if( ret ) return luaL_error( L, "Interrupted." ); return 0; } static int vlclua_action_id( lua_State *L ) { vlc_action_id_t i_key = vlc_actions_get_id( luaL_checkstring( L, 1 ) ); if (i_key == 0) return 0; lua_pushnumber( L, i_key ); return 1; } /***************************************************************************** * *****************************************************************************/ static const luaL_Reg vlclua_misc_reg[] = { { "version", vlclua_version }, { "copyright", vlclua_copyright }, { "license", vlclua_license }, { "action_id", vlclua_action_id }, { "mdate", vlclua_mdate }, { "mwait", vlclua_mwait }, { "quit", vlclua_quit }, { NULL, NULL } }; void luaopen_misc( lua_State *L ) { lua_newtable( L ); luaL_register( L, NULL, vlclua_misc_reg ); lua_setfield( L, -2, "misc" ); }