227 lines
4.9 KiB
C
227 lines
4.9 KiB
C
|
/* Required outside the BUILD_APPLICATIONS #ifdef! */
|
||
|
#include "ast_config.h"
|
||
|
|
||
|
#ifdef BUILD_APPLICATIONS
|
||
|
/*
|
||
|
Copyright (C) 2009 - 2010
|
||
|
|
||
|
Artem Makhutov <artem@makhutov.org>
|
||
|
http://www.makhutov.org
|
||
|
|
||
|
Dmitry Vagin <dmitry2004@yandex.ru>
|
||
|
|
||
|
bg <bg_one@mail.ru>
|
||
|
*/
|
||
|
|
||
|
#include <asterisk/app.h> /* AST_DECLARE_APP_ARGS() ... */
|
||
|
#include <asterisk/pbx.h> /* pbx_builtin_setvar_helper() */
|
||
|
#include <asterisk/module.h> /* ast_register_application2() ast_unregister_application() */
|
||
|
|
||
|
#include "ast_compat.h" /* asterisk compatibility fixes */
|
||
|
|
||
|
#include "app.h" /* app_register() app_unregister() */
|
||
|
#include "chan_dongle.h" /* struct pvt */
|
||
|
#include "helpers.h" /* send_sms() ITEMS_OF() */
|
||
|
#include "error.h"
|
||
|
|
||
|
struct ast_channel;
|
||
|
|
||
|
static int app_status_exec (struct ast_channel* channel, const char* data)
|
||
|
{
|
||
|
struct pvt * pvt;
|
||
|
char * parse;
|
||
|
int stat;
|
||
|
char status[2];
|
||
|
int exists = 0;
|
||
|
|
||
|
AST_DECLARE_APP_ARGS (args,
|
||
|
AST_APP_ARG (resource);
|
||
|
AST_APP_ARG (variable);
|
||
|
);
|
||
|
|
||
|
if (ast_strlen_zero (data))
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
parse = ast_strdupa (data);
|
||
|
|
||
|
AST_STANDARD_APP_ARGS (args, parse);
|
||
|
|
||
|
if (ast_strlen_zero (args.resource) || ast_strlen_zero (args.variable))
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
/* TODO: including options number */
|
||
|
pvt = find_device_by_resource(args.resource, 0, NULL, &exists);
|
||
|
if(pvt)
|
||
|
{
|
||
|
/* ready for outgoing call */
|
||
|
ast_mutex_unlock (&pvt->lock);
|
||
|
stat = 2;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
stat = exists ? 3 : 1;
|
||
|
}
|
||
|
|
||
|
snprintf (status, sizeof (status), "%d", stat);
|
||
|
pbx_builtin_setvar_helper (channel, args.variable, status);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int app_send_sms_exec (attribute_unused struct ast_channel* channel, const char* data)
|
||
|
{
|
||
|
char* parse;
|
||
|
|
||
|
AST_DECLARE_APP_ARGS (args,
|
||
|
AST_APP_ARG (device);
|
||
|
AST_APP_ARG (number);
|
||
|
AST_APP_ARG (message);
|
||
|
AST_APP_ARG (validity);
|
||
|
AST_APP_ARG (report);
|
||
|
AST_APP_ARG (payload);
|
||
|
);
|
||
|
|
||
|
if (ast_strlen_zero (data))
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
parse = ast_strdupa (data);
|
||
|
|
||
|
AST_STANDARD_APP_ARGS (args, parse);
|
||
|
|
||
|
if (ast_strlen_zero (args.device))
|
||
|
{
|
||
|
ast_log (LOG_ERROR, "NULL device for message -- SMS will not be sent\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if (ast_strlen_zero (args.number))
|
||
|
{
|
||
|
ast_log (LOG_ERROR, "NULL destination for message -- SMS will not be sent\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if (ast_strlen_zero(args.payload))
|
||
|
{
|
||
|
ast_log(LOG_ERROR, "NULL payload for message -- SMS will not be sent\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if (send_sms(args.device, args.number, args.message, args.validity, args.report, args.payload, strlen(args.payload) + 1) < 0) {
|
||
|
ast_log(LOG_ERROR, "[%s] %s\n", args.device, error2str(chan_dongle_err));
|
||
|
return -1;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int app_send_ussd_exec(attribute_unused struct ast_channel* channel, const char* data)
|
||
|
{
|
||
|
char* parse;
|
||
|
|
||
|
AST_DECLARE_APP_ARGS(args,
|
||
|
AST_APP_ARG(device);
|
||
|
AST_APP_ARG(ussd);
|
||
|
);
|
||
|
|
||
|
if (ast_strlen_zero(data))
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
parse = ast_strdupa(data);
|
||
|
|
||
|
AST_STANDARD_APP_ARGS(args, parse);
|
||
|
|
||
|
if (ast_strlen_zero(args.device))
|
||
|
{
|
||
|
ast_log(LOG_ERROR, "NULL device for ussd -- USSD will not be sent\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if (ast_strlen_zero(args.ussd))
|
||
|
{
|
||
|
ast_log(LOG_ERROR, "NULL ussd command -- USSD will not be sent\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if (send_ussd(args.device, args.ussd) < 0) {
|
||
|
ast_log(LOG_ERROR, "[%s] %s\n", args.device, error2str(chan_dongle_err));
|
||
|
return -1;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
static const struct dongle_application
|
||
|
{
|
||
|
const char* name;
|
||
|
|
||
|
int (*func)(struct ast_channel* channel, const char* data);
|
||
|
const char* synopsis;
|
||
|
const char* desc;
|
||
|
} dca[] =
|
||
|
{
|
||
|
{
|
||
|
"DongleStatus",
|
||
|
app_status_exec,
|
||
|
"DongleStatus(Resource,Variable)",
|
||
|
"DongleStatus(Resource,Variable)\n"
|
||
|
" Resource - Resource string as for Dial()\n"
|
||
|
" Variable - Variable to store status in will be 1-3.\n"
|
||
|
" In order, Disconnected, Connected & Free, Connected & Busy.\n"
|
||
|
},
|
||
|
{
|
||
|
"DongleSendSMS",
|
||
|
app_send_sms_exec,
|
||
|
"DongleSendSMS(Device,Dest,Message,Validity,Report,Payload)",
|
||
|
"DongleSendSMS(Device,Dest,Message,Validity,Report,Payload)\n"
|
||
|
" Device - Id of device from dongle.conf\n"
|
||
|
" Dest - destination\n"
|
||
|
" Message - text of the message\n"
|
||
|
" Validity - Validity period in minutes\n"
|
||
|
" Report - Boolean flag for report request\n"
|
||
|
" Payload - Unstructured data that will be included in delivery report\n"
|
||
|
},
|
||
|
{
|
||
|
"DongleSendUSSD",
|
||
|
app_send_ussd_exec,
|
||
|
"DongleSendUSSD(Device,USSD)",
|
||
|
"DongleSendUSSD(Device,USSD)\n"
|
||
|
" Device - Id of device from dongle.conf\n"
|
||
|
" USSD - ussd command\n"
|
||
|
}
|
||
|
};
|
||
|
|
||
|
#if ASTERISK_VERSION_NUM >= 10800 /* 1.8+ */
|
||
|
typedef int (*app_func_t)(struct ast_channel *channel, const char *data);
|
||
|
#else /* 1.8- */
|
||
|
typedef int (*app_func_t)(struct ast_channel *channel, void *data);
|
||
|
#endif /* ^1.8- */
|
||
|
|
||
|
#/* */
|
||
|
EXPORT_DEF void app_register()
|
||
|
{
|
||
|
unsigned i;
|
||
|
for(i = 0; i < ITEMS_OF(dca); i++)
|
||
|
{
|
||
|
ast_register_application2 (dca[i].name, (app_func_t)(dca[i].func), dca[i].synopsis, dca[i].desc, self_module());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#/* */
|
||
|
EXPORT_DEF void app_unregister()
|
||
|
{
|
||
|
int i;
|
||
|
for(i = ITEMS_OF(dca)-1; i >= 0; i--)
|
||
|
{
|
||
|
ast_unregister_application(dca[i].name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif /* BUILD_APPLICATIONS */
|