[asterisk-commits] may: branch may/smpp r411580 - in /team/may/smpp/trunk: ./ addons/ addons/smpp/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Mar 31 13:21:36 CDT 2014
Author: may
Date: Mon Mar 31 13:21:30 2014
New Revision: 411580
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=411580
Log:
add smpp_recode function to transcode smpp data from/to utf8
add gsm.c/.h helper files for that from android sources
........
Merged revisions 411579 from http://svn.asterisk.org/svn/asterisk/team/may/smpp/branches/10
Added:
team/may/smpp/trunk/addons/smpp/
- copied from r411579, team/may/smpp/branches/10/addons/smpp/
Modified:
team/may/smpp/trunk/ (props changed)
team/may/smpp/trunk/addons/Makefile
team/may/smpp/trunk/addons/res_smpp.c
Propchange: team/may/smpp/trunk/
------------------------------------------------------------------------------
--- smpp-10-merge (original)
+++ smpp-10-merge Mon Mar 31 13:21:30 2014
@@ -1,1 +1,1 @@
-/team/may/smpp/branches/10:1-410963
+/team/may/smpp/branches/10:1-411579
Propchange: team/may/smpp/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Mar 31 13:21:30 2014
@@ -1,1 +1,1 @@
-/team/may/smpp/branches/10:400905-401373,401882,402222,403011,404526,404528-404529,410963
+/team/may/smpp/branches/10:400905-401373,401882,402222,403011,404526,404528-404529,410963,411579
Modified: team/may/smpp/trunk/addons/Makefile
URL: http://svnview.digium.com/svn/asterisk/team/may/smpp/trunk/addons/Makefile?view=diff&rev=411580&r1=411579&r2=411580
==============================================================================
--- team/may/smpp/trunk/addons/Makefile (original)
+++ team/may/smpp/trunk/addons/Makefile Mon Mar 31 13:21:30 2014
@@ -25,6 +25,8 @@
h323/MULTIMEDIA-SYSTEM-CONTROLDec.o h323/MULTIMEDIA-SYSTEM-CONTROLEnc.o
H323CFLAGS:=-Iooh323c/src -Iooh323c/src/h323
+
+GSMOBJS:=gsm.o
ALL_C_MODS:=app_mysql \
app_saycountpl \
@@ -66,11 +68,13 @@
$(if $(filter format_mp3,$(EMBEDDED_MODS)),modules.link,format_mp3.so): mp3/common.o mp3/dct64_i386.o mp3/decode_ntom.o mp3/layer3.o mp3/tabinit.o mp3/interface.o
chan_ooh323.o: _ASTCFLAGS+=$(H323CFLAGS)
-res_smpp.o: _ASTCFLAGS+=-I/usr/local/include
-res_smpp.so: LIBS+=-L/usr/local/lib -lsmpp34
+res_smpp.o: _ASTCFLAGS+=-I.
+res_smpp.so: LIBS+=-lsmpp34
$(if $(filter chan_ooh323,$(EMBEDDED_MODS)),modules.link,chan_ooh323.so): _ASTCFLAGS+=$(H323CFLAGS)
$(if $(filter chan_ooh323,$(EMBEDDED_MODS)),modules.link,chan_ooh323.so): $(addprefix ooh323c/src/,$(H323OBJS)) chan_ooh323.o ooh323cDriver.o
$(addprefix ooh323c/src/,$(H323OBJS)) chan_ooh323.o ooh323cDriver.o: _ASTCFLAGS+=$(call MOD_ASTCFLAGS,chan_ooh323)
+$(if $(filter res_smpp,$(EMBEDDED_MODS)),modules.link,res_smpp.so): $(addprefix smpp/,$(GSMOBJS)) res_smpp.o
+$(addprefix smpp/,$(GSMOBJS)) res_smpp.o: _ASTCFLAGS+=$(call MOD_ASTCFLAGS,res_smpp)
.PHONY: check_mp3
Modified: team/may/smpp/trunk/addons/res_smpp.c
URL: http://svnview.digium.com/svn/asterisk/team/may/smpp/trunk/addons/res_smpp.c?view=diff&rev=411580&r1=411579&r2=411580
==============================================================================
--- team/may/smpp/trunk/addons/res_smpp.c (original)
+++ team/may/smpp/trunk/addons/res_smpp.c Mon Mar 31 13:21:30 2014
@@ -55,12 +55,36 @@
#include "asterisk/causes.h"
#include "asterisk/message.h"
+/*** DOCUMENTATION
+ <function name="smpp_recode" language="en_US">
+ <synopsis>
+ transcode message base64 content from/to UTF-8
+ </synopsis>
+ <syntax>
+ <parameter name="direction" required="true">
+ <para>from or to UTF8</para>
+ </parameter>
+ <parameter name="smpp encdoning" required="true">
+ <para>ucs-2 or gsm8</para>
+ </parameter>
+ <parameter name="string" required="true">
+ <para>input string</para>
+ </parameter>
+ </syntax>
+ <description>
+ <para>Returns the transcoded string in base64.</para>
+ </description>
+
+ </function>
+***/
+
#define MODULE_DESCRIPTION "SMPP messaging resource module"
#include "smpp34.h"
#include "smpp34_structs.h"
#include "smpp34_params.h"
+#include "smpp/gsm.h"
#define TRUE 1
#define FALSE 0
@@ -162,9 +186,10 @@
snprintf(tmp2, tmp2len, "tlv.%d.tag", tlvnum);
tmp[0] = 0;
for (k = 0; tlvs[k].tlvid; k++) {
+ char *space;
if (tlvs[k].tlvid == tlv->tag) {
strcpy(tmp, tlvs[k].tlv);
- char *space = strchr(tmp, ' ');
+ space = strchr(tmp, ' ');
if (space) {
*space = 0;
}
@@ -1664,6 +1689,7 @@
static char *handle_cli_smpp_show_peers(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
+ struct smpp_smsc* smsc;
#define FORMAT "%24s %18s %9s %9s %12s %12s\n"
#define FORMAT2 "%24s %18s %9s %9s %12s %12d\n"
switch (cmd) {
@@ -1683,7 +1709,7 @@
ast_cli(a->fd, FORMAT, "Peer Name", "IP addr", "IP Port", "SMPP type", "Connected", "Sequence");
ast_mutex_lock(&smpp_lock);
- struct smpp_smsc* smsc = smsc_list;
+ smsc = smsc_list;
while (smsc) {
char *host = smsc->host;
char port[9];
@@ -1708,6 +1734,97 @@
#undef FORMAT2
}
+
+static int smpp_recode(struct ast_channel *chan, const char *cmd, char *arguments, char *buf, size_t len)
+{
+ AST_DECLARE_APP_ARGS(args,
+ AST_APP_ARG(direction);
+ AST_APP_ARG(smpp_charset);
+ AST_APP_ARG(text);
+ );
+
+ int incount = 0, outcount = 0;
+ char *parse;
+ char *text = NULL;
+ unsigned char *tmpin, *tmp;
+ char esm_class[1024] = "";
+ int offset = 0;
+
+
+
+
+ if (ast_strlen_zero(arguments)) {
+ ast_log(LOG_WARNING, "Syntax: SMPP_RECODE(<from/to>,<CHARSET>,<text>) - missing arguments!\n");
+ return -1;
+ }
+
+ parse = ast_strdupa(arguments);
+ AST_STANDARD_APP_ARGS(args, parse);
+ if (args.argc < 3) {
+ ast_log(LOG_WARNING, "Syntax: SMPP_RECODE(<from/to>,<CHARSET>,<text>) - missing arguments!\n");
+ return -1;
+ }
+
+ text = args.text;
+ if (!(tmpin = ast_alloca(strlen(text)))) {
+ ast_log(LOG_ERROR, "can't allocate buffer memory\n");
+ return -1;
+ }
+ if (!(tmp = ast_alloca(strlen(text)*2))) {
+ ast_log(LOG_ERROR, "can't allocate buffer memory\n");
+ return -1;
+ }
+ incount = ast_base64decode(tmpin, text, sizeof(tmpin)-1);
+
+// check UDH header on message data
+
+ if (ast_func_read(chan, "MESSAGE_DATA(esm_class)", esm_class, sizeof(esm_class)) != -1) {
+ if (atoi(esm_class) & 0x40) {
+ offset = tmpin[0] + 1;
+ if (offset >= incount) {
+ offset = 0; // the case of incorrect message
+ } else {
+ incount -= offset;
+ }
+ }
+ }
+
+ if (!strcasecmp(args.direction, "from")) {
+ if (!strcasecmp(args.smpp_charset, "ucs2")) {
+ outcount = ucs2_to_utf8(tmpin + offset, incount, tmp);
+ ast_base64encode(buf, (void *)tmp, outcount, len);
+ goto doneok;
+ }
+ if (!strcasecmp(args.smpp_charset, "gsm8")) {
+ outcount = utf8_from_gsm8(tmpin + offset, incount, tmp);
+ ast_base64encode(buf, (void *)tmp, outcount, len);
+ goto doneok;
+ }
+ }
+ if (!strcasecmp(args.direction, "to")) {
+ if (!strcasecmp(args.smpp_charset, "ucs2")) {
+ outcount = utf8_to_ucs2(tmpin + offset, incount, tmp) * 2; // 2 bytes on UCS2 char
+ ast_base64encode(buf, (void *)tmp, outcount, len);
+ goto doneok;
+ }
+ if (!strcasecmp(args.smpp_charset, "gsm8")) {
+ outcount = utf8_to_gsm8(tmpin + offset, incount, tmp);
+ ast_base64encode(buf, (void *)tmp, outcount, len);
+ goto doneok;
+ }
+ }
+
+ ast_log(LOG_WARNING, "Wrong direction: %s\n", args.direction);
+ return -1;
+
+doneok:
+
+ ast_free(tmp);
+ ast_free(tmpin);
+ return 0;
+}
+
+
static const struct ast_msg_tech smpp_msg_tech = {
.name = "smpp",
.msg_send = smpp_msg_send,
@@ -1719,9 +1836,18 @@
AST_CLI_DEFINE(handle_cli_smpp_show_peers, "Show SMPP peers"),
};
+static struct ast_custom_function acf_smpprecode = {
+ .name = "SMPP_RECODE",
+ .read = smpp_recode,
+};
+
static int load_module(void)
{
if (ast_msg_tech_register(&smpp_msg_tech)) {
+ return AST_MODULE_LOAD_FAILURE;
+ }
+
+ if (ast_custom_function_register(&acf_smpprecode)) {
return AST_MODULE_LOAD_FAILURE;
}
@@ -1755,6 +1881,7 @@
ast_msg_tech_unregister(&smpp_msg_tech);
ast_cli_unregister_multiple(cli_smpp, sizeof(cli_smpp) / sizeof(struct ast_cli_entry));
+ ast_custom_function_unregister(&acf_smpprecode);
stop_monitor_threads();
destroy_smscs();
More information about the asterisk-commits
mailing list