Asterisk - The Open Source Telephony Project  18.5.0
func_iconv.c
Go to the documentation of this file.
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (c) 2005,2006,2007 Sven Slezak <[email protected]>
5  *
6  * See http://www.asterisk.org for more information about
7  * the Asterisk project. Please do not directly contact
8  * any of the maintainers of this project for assistance;
9  * the project provides a web site, mailing lists and IRC
10  * channels for your use.
11  *
12  * This program is free software, distributed under the terms of
13  * the GNU General Public License Version 2. See the LICENSE file
14  * at the top of the source tree.
15  */
16 
17 /*!
18  * \file
19  *
20  * \brief Charset conversions
21  *
22  * \author Sven Slezak <[email protected]>
23  *
24  * \ingroup functions
25  */
26 
27 /*** MODULEINFO
28  <depend>iconv</depend>
29  <support_level>core</support_level>
30  ***/
31 
32 #include "asterisk.h"
33 
34 #include <ctype.h>
35 #include <iconv.h>
36 
37 #include "asterisk/module.h"
38 #include "asterisk/channel.h"
39 #include "asterisk/pbx.h"
40 #include "asterisk/utils.h"
41 #include "asterisk/app.h"
42 
43 /*** DOCUMENTATION
44  <function name="ICONV" language="en_US">
45  <synopsis>
46  Converts charsets of strings.
47  </synopsis>
48  <syntax>
49  <parameter name="in-charset" required="true">
50  <para>Input charset</para>
51  </parameter>
52  <parameter name="out-charset" required="true">
53  <para>Output charset</para>
54  </parameter>
55  <parameter name="string" required="true">
56  <para>String to convert, from <replaceable>in-charset</replaceable> to <replaceable>out-charset</replaceable></para>
57  </parameter>
58  </syntax>
59  <description>
60  <para>Converts string from <replaceable>in-charset</replaceable> into <replaceable>out-charset</replaceable>.
61  For available charsets, use <literal>iconv -l</literal> on your shell command line.</para>
62  <note><para>Due to limitations within the API, ICONV will not currently work with
63  charsets with embedded NULLs. If found, the string will terminate.</para></note>
64  </description>
65  </function>
66  ***/
67 
68 
69 /*!
70  * Some systems define the second arg to iconv() as (const char *),
71  * while others define it as (char *). Cast it to a (void *) to
72  * suppress compiler warnings about it.
73  */
74 #define AST_ICONV_CAST void *
75 
76 static int iconv_read(struct ast_channel *chan, const char *cmd, char *arguments, char *buf, size_t len)
77 {
79  AST_APP_ARG(in_charset);
80  AST_APP_ARG(out_charset);
82  );
83  iconv_t cd;
84  size_t incount, outcount = len - 1;
85  char *parse;
86 
87  if (ast_strlen_zero(arguments)) {
88  ast_log(LOG_WARNING, "Syntax: ICONV(<in-charset>,<out-charset>,<text>) - missing arguments!\n");
89  return -1;
90  }
91 
92  parse = ast_strdupa(arguments);
94 
95  if (args.argc < 3) {
96  ast_log(LOG_WARNING, "Syntax: ICONV(<in-charset>,<out-charset>,<text>) %u\n", args.argc);
97  return -1;
98  }
99 
100  incount = strlen(args.text);
101 
102  ast_debug(1, "Iconv: \"%s\" %s -> %s\n", args.text, args.in_charset, args.out_charset);
103 
104  cd = iconv_open(args.out_charset, args.in_charset);
105 
106  if (cd == (iconv_t) -1) {
107  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);
108  return -1;
109  }
110 
111  if (iconv(cd, (AST_ICONV_CAST) &args.text, &incount, &buf, &outcount) == (size_t) -1) {
112  if (errno == E2BIG)
113  ast_log(LOG_WARNING, "Iconv: output buffer too small.\n");
114  else if (errno == EILSEQ)
115  ast_log(LOG_WARNING, "Iconv: illegal character.\n");
116  else if (errno == EINVAL)
117  ast_log(LOG_WARNING, "Iconv: incomplete character sequence.\n");
118  else
119  ast_log(LOG_WARNING, "Iconv: error %d: %s.\n", errno, strerror(errno));
120  }
121  *buf = '\0';
122  iconv_close(cd);
123 
124  return 0;
125 }
126 
127 
129  .name = "ICONV",
130  .read = iconv_read
131 };
132 
133 static int unload_module(void)
134 {
135  return ast_custom_function_unregister(&iconv_function);
136 }
137 
138 static int load_module(void)
139 {
140  return ast_custom_function_register(&iconv_function);
141 }
142 
const char * name
Definition: pbx.h:119
Main Channel structure associated with a channel.
#define AST_MODULE_INFO_STANDARD(keystr, desc)
Definition: module.h:567
Asterisk main include file. File version handling, generic pbx functions.
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the &#39;standard&#39; argument separation process for an application.
#define LOG_WARNING
Definition: logger.h:274
static int load_module(void)
Definition: func_iconv.c:138
const ast_string_field arguments
Definition: pbx.h:126
char * text
Definition: app_queue.c:1508
const char * args
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.
Utility functions.
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
General Asterisk PBX channel definitions.
#define AST_ICONV_CAST
Definition: func_iconv.c:74
static int unload_module(void)
Definition: func_iconv.c:133
Data structure associated with a custom dialplan function.
Definition: pbx.h:118
static int iconv_read(struct ast_channel *chan, const char *cmd, char *arguments, char *buf, size_t len)
Definition: func_iconv.c:76
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
Core PBX routines and definitions.
#define LOG_ERROR
Definition: logger.h:285
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
int errno
static void parse(struct mgcp_request *req)
Definition: chan_mgcp.c:1872
static struct ast_custom_function iconv_function
Definition: func_iconv.c:128
#define ASTERISK_GPL_KEY
The text the key() function should return.
Definition: module.h:46
Asterisk module definitions.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application&#39;s arguments.
Application convenience functions, designed to give consistent look and feel to Asterisk apps...
#define ast_custom_function_register(acf)
Register a custom function.
Definition: pbx.h:1508
#define AST_APP_ARG(name)
Define an application argument.