2007-05-28 15:59:17 +00:00
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (c) 2005,2006,2007 Sven Slezak <sunny@mezzo.net>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*!
* \file
*
* \brief Charset conversions
*
* \author Sven Slezak <sunny@mezzo.net>
*
* \ingroup functions
*/
/*** MODULEINFO
2011-07-14 20:28:54 +00:00
<depend>iconv</depend>
<support_level>core</support_level>
2007-05-28 15:59:17 +00:00
***/
# include "asterisk.h"
# include <ctype.h>
# include <iconv.h>
# include "asterisk/module.h"
# include "asterisk/channel.h"
# include "asterisk/pbx.h"
# include "asterisk/utils.h"
# include "asterisk/app.h"
2008-11-01 21:10:07 +00:00
/*** DOCUMENTATION
<function name="ICONV" language="en_US">
<synopsis>
2017-12-22 09:23:22 -05:00
Converts charsets of strings.
2008-11-01 21:10:07 +00:00
</synopsis>
<syntax>
<parameter name="in-charset" required="true">
<para>Input charset</para>
</parameter>
<parameter name="out-charset" required="true">
<para>Output charset</para>
</parameter>
<parameter name="string" required="true">
<para>String to convert, from <replaceable>in-charset</replaceable> to <replaceable>out-charset</replaceable></para>
</parameter>
</syntax>
<description>
<para>Converts string from <replaceable>in-charset</replaceable> into <replaceable>out-charset</replaceable>.
For available charsets, use <literal>iconv -l</literal> on your shell command line.</para>
<note><para>Due to limitations within the API, ICONV will not currently work with
charsets with embedded NULLs. If found, the string will terminate.</para></note>
</description>
</function>
***/
2017-12-22 09:23:22 -05:00
/*!
2007-07-16 02:44:49 +00:00
* Some systems define the second arg to iconv() as (const char *),
2017-12-22 09:23:22 -05:00
* while others define it as (char *). Cast it to a (void *) to
* suppress compiler warnings about it.
2007-07-16 02:44:49 +00:00
*/
# define AST_ICONV_CAST void *
2007-05-28 15:59:17 +00:00
static int iconv_read ( struct ast_channel * chan , const char * cmd , char * arguments , char * buf , size_t len )
{
AST_DECLARE_APP_ARGS ( args ,
AST_APP_ARG ( in_charset ) ;
AST_APP_ARG ( out_charset ) ;
AST_APP_ARG ( text ) ;
) ;
iconv_t cd ;
2016-02-11 12:21:42 -05:00
size_t incount , outcount = len - 1 ;
2007-05-28 15:59:17 +00:00
char * parse ;
if ( ast_strlen_zero ( arguments ) ) {
ast_log ( LOG_WARNING , " Syntax: ICONV(<in-charset>,<out-charset>,<text>) - missing arguments! \n " ) ;
return - 1 ;
}
parse = ast_strdupa ( arguments ) ;
AST_STANDARD_APP_ARGS ( args , parse ) ;
if ( args . argc < 3 ) {
2014-05-09 22:49:26 +00:00
ast_log ( LOG_WARNING , " Syntax: ICONV(<in-charset>,<out-charset>,<text>) %u \n " , args . argc ) ;
2007-05-28 15:59:17 +00:00
return - 1 ;
}
incount = strlen ( args . text ) ;
2007-06-14 19:39:12 +00:00
ast_debug ( 1 , " Iconv: \" %s \" %s -> %s \n " , args . text , args . in_charset , args . out_charset ) ;
2007-05-28 15:59:17 +00:00
cd = iconv_open ( args . out_charset , args . in_charset ) ;
if ( cd = = ( iconv_t ) - 1 ) {
ast_log ( LOG_ERROR , " conversion from '%s' to '%s' not available. type 'iconv -l' in a shell to list the supported charsets. \n " , args . in_charset , args . out_charset ) ;
return - 1 ;
}
2007-07-16 02:44:49 +00:00
if ( iconv ( cd , ( AST_ICONV_CAST ) & args . text , & incount , & buf , & outcount ) = = ( size_t ) - 1 ) {
2007-05-28 15:59:17 +00:00
if ( errno = = E2BIG )
ast_log ( LOG_WARNING , " Iconv: output buffer too small. \n " ) ;
else if ( errno = = EILSEQ )
ast_log ( LOG_WARNING , " Iconv: illegal character. \n " ) ;
else if ( errno = = EINVAL )
ast_log ( LOG_WARNING , " Iconv: incomplete character sequence. \n " ) ;
else
ast_log ( LOG_WARNING , " Iconv: error %d: %s. \n " , errno , strerror ( errno ) ) ;
}
2016-02-11 12:21:42 -05:00
* buf = ' \0 ' ;
2007-05-28 15:59:17 +00:00
iconv_close ( cd ) ;
return 0 ;
}
static struct ast_custom_function iconv_function = {
. name = " ICONV " ,
2008-11-01 21:10:07 +00:00
. read = iconv_read
2007-05-28 15:59:17 +00:00
} ;
static int unload_module ( void )
{
return ast_custom_function_unregister ( & iconv_function ) ;
}
static int load_module ( void )
{
return ast_custom_function_register ( & iconv_function ) ;
}
AST_MODULE_INFO_STANDARD ( ASTERISK_GPL_KEY , " Charset conversions " ) ;