2006-09-10 23:20:44 +00:00
/*
* FreeSWITCH Modular Media Switching Software Library / Soft - Switch Application
* Copyright ( C ) 2005 / 2006 , Anthony Minessale II < anthmct @ yahoo . com >
*
* Version : MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 ( the " License " ) ; you may not use this file except in compliance with
* the License . You may obtain a copy of the License at
* http : //www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an " AS IS " basis ,
* WITHOUT WARRANTY OF ANY KIND , either express or implied . See the License
* for the specific language governing rights and limitations under the
* License .
*
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft - Switch Application
*
* The Initial Developer of the Original Code is
* Anthony Minessale II < anthmct @ yahoo . com >
* Portions created by the Initial Developer are Copyright ( C )
* the Initial Developer . All Rights Reserved .
*
* Contributor ( s ) :
*
* Brian Fertig < brian . fertig @ convergencetek . com >
2006-12-21 17:11:43 +00:00
* Johny Kadarisman < jkr888 @ gmail . com >
2006-09-10 23:20:44 +00:00
*
* mod_python . c - - Python Module
*
*/
2006-09-17 21:28:31 +00:00
# include <Python.h>
2006-09-10 23:20:44 +00:00
# ifndef _REENTRANT
# define _REENTRANT
# endif
# ifndef _GNU_SOURCE
# define _GNU_SOURCE
# endif
# include <switch.h>
2006-11-14 06:13:04 +00:00
void init_freeswitch ( void ) ;
2006-12-21 17:11:43 +00:00
static switch_api_interface_t python_run_interface ;
2006-09-10 23:20:44 +00:00
2006-11-14 06:13:04 +00:00
const char modname [ ] = " mod_python " ;
2006-09-10 23:20:44 +00:00
static void python_function ( switch_core_session_t * session , char * data )
{
char * uuid = switch_core_session_get_uuid ( session ) ;
2007-03-29 22:31:56 +00:00
char * argv [ 1 ] ;
FILE * pythonfile ;
2006-09-10 23:20:44 +00:00
2007-03-29 22:31:56 +00:00
argv [ 0 ] = uuid ;
pythonfile = fopen ( data , " r " ) ;
2006-09-10 23:20:44 +00:00
2007-03-29 22:31:56 +00:00
Py_Initialize ( ) ;
PySys_SetArgv ( 1 , argv ) ;
init_freeswitch ( ) ;
PyRun_SimpleFile ( pythonfile , " " ) ;
Py_Finalize ( ) ;
2006-09-10 23:20:44 +00:00
}
2006-12-21 17:11:43 +00:00
static switch_status_t launch_python ( char * text , switch_core_session_t * session , switch_stream_handle_t * stream )
{
2007-03-29 22:31:56 +00:00
FILE * pythonfile ;
2006-12-21 17:11:43 +00:00
2007-03-29 22:31:56 +00:00
if ( switch_strlen_zero ( text ) ) {
stream - > write_function ( stream , " USAGE: %s \n " , python_run_interface . syntax ) ;
return SWITCH_STATUS_SUCCESS ;
}
2006-12-21 17:11:43 +00:00
2007-03-29 22:31:56 +00:00
pythonfile = fopen ( text , " r " ) ;
2006-12-21 17:11:43 +00:00
2007-03-29 22:31:56 +00:00
Py_Initialize ( ) ;
init_freeswitch ( ) ;
PyRun_SimpleFile ( pythonfile , " " ) ;
Py_Finalize ( ) ;
2006-12-21 17:11:43 +00:00
2007-03-29 22:31:56 +00:00
stream - > write_function ( stream , " OK \n " ) ;
return SWITCH_STATUS_SUCCESS ;
2006-12-21 17:11:43 +00:00
}
2006-09-10 23:20:44 +00:00
static const switch_application_interface_t python_application_interface = {
/*.interface_name */ " python " ,
2007-02-26 21:38:10 +00:00
/*.application_function */ python_function ,
NULL , NULL , NULL ,
2007-03-29 22:31:56 +00:00
/* flags */ SAF_NONE ,
/* should we support no media mode here? If so, we need to detect the mode, and either disable the media functions or indicate media if/when we need */
/*.next */ NULL
2006-09-10 23:20:44 +00:00
} ;
2006-12-21 17:11:43 +00:00
static switch_api_interface_t python_run_interface = {
2007-03-29 22:31:56 +00:00
/*.interface_name */ " python " ,
/*.desc */ " run a python script " ,
/*.function */ launch_python ,
/*.syntax */ " python </path/to/script> " ,
/*.next */ NULL
2006-12-21 17:11:43 +00:00
} ;
2006-09-10 23:20:44 +00:00
static switch_loadable_module_interface_t python_module_interface = {
/*.module_name */ modname ,
/*.endpoint_interface */ NULL ,
/*.timer_interface */ NULL ,
/*.dialplan_interface */ NULL ,
/*.codec_interface */ NULL ,
/*.application_interface */ & python_application_interface ,
2006-12-21 17:11:43 +00:00
/*.api_interface */ & python_run_interface ,
2006-09-10 23:20:44 +00:00
/*.file_interface */ NULL ,
/*.speech_interface */ NULL ,
/*.directory_interface */ NULL
} ;
2007-03-29 22:31:56 +00:00
SWITCH_MOD_DECLARE ( switch_status_t ) switch_module_load ( const switch_loadable_module_interface_t * * module_interface ,
char * filename )
2006-09-10 23:20:44 +00:00
{
/* connect my internal structure to the blank pointer passed to me */
* module_interface = & python_module_interface ;
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_NOTICE , " Python Framework Loading... \n " ) ;
/* indicate that the module should continue to be loaded */
return SWITCH_STATUS_SUCCESS ;
}
/*
Called when the system shuts down
SWITCH_MOD_DECLARE ( switch_status ) switch_module_shutdown ( void )
{
return SWITCH_STATUS_SUCCESS ;
}
*/
/*
If it exists , this is called in it ' s own thread when the module - load completes
SWITCH_MOD_DECLARE ( switch_status ) switch_module_shutdown ( void )
{
return SWITCH_STATUS_SUCCESS ;
}
*/
/* Return the number of arguments of the application command line */