yasnd/yasnd-gammu.c

173 lines
4.6 KiB
C
Raw Normal View History

#include "yasnd.h"
GSM_Error error; // structure to store possible gammu errors
2011-11-30 16:21:34 +04:00
GSM_StateMachine *state_machine=NULL; // structure to interact with mobile phones
volatile gboolean gammu_shutdown=FALSE; // variable that indicates gammu shutdown
volatile GSM_Error sms_send_status;
bool check_gammu_error(GSM_Error err)
{
if (err == ERR_NONE) {
2011-11-30 16:21:34 +04:00
// No error, return OK('true')
return true;
}
char tmp[150];
sprintf(tmp,"gammu failure: %s\n", GSM_ErrorString(err));
log_event(tmp);
2011-11-30 16:21:34 +04:00
return false;
}
bool gammu_init()
{
GSM_InitLocales(NULL);
state_machine = GSM_AllocStateMachine();
/* Set gammu configuration */
GSM_Config *gammu_cfg = GSM_GetConfig(state_machine, 0);
// first, free old values and set new one
free(gammu_cfg->Device);
gammu_cfg->Device = strdup(phone_device);
2011-11-30 16:21:34 +04:00
free(gammu_cfg->Connection);
gammu_cfg->Connection = strdup(phone_connection);
strcpy(gammu_cfg->Model, phone_model);
2011-11-30 16:21:34 +04:00
/* We care only about first configuration */
GSM_SetConfigNum(state_machine, 1);
return true;
}
/* Handler for SMS send reply */
void send_sms_callback (GSM_StateMachine *sm, int status, int MessageReference, void * user_data)
{
char tmp[100];
if (status==0) {
sprintf(tmp,"Sent SMS on device '%s' - OK\n", GSM_GetConfig(sm, -1)->Device);
sms_send_status = ERR_NONE;
log_debug(tmp,DEBUG_BASE);
2011-11-30 16:21:34 +04:00
} else {
sprintf(tmp,"Sent SMS on device '%s' - FAILURE\n", GSM_GetConfig(sm, -1)->Device);
sms_send_status = ERR_UNKNOWN;
log_event(tmp);
2011-11-30 16:21:34 +04:00
}
}
bool gammu_send_sms(const char* message)
{
GSM_SMSMessage sms;
GSM_SMSC PhoneSMSC;
int return_value = 0;
/* Prepare message */
// Cleanup the structure
memset(&sms, 0, sizeof(sms));
// Encode message text
EncodeUnicode(sms.Text, message, strlen(message));
// Encode recipient numbe
EncodeUnicode(sms.Number, recipient_number, strlen(recipient_number));
/* We want to submit message */
sms.PDU = SMS_Submit;
/* No UDH, just a plain message */
sms.UDH.Type = UDH_NoUDH;
/* We used default coding for text */
sms.Coding = SMS_Coding_Default_No_Compression;
/* Class 1 message (normal) */
sms.Class = 1;
/* Connect to phone */
/* 1 means number of replies you want to wait for */
error = GSM_InitConnection(state_machine, 1);
if (!check_gammu_error(error))
return false;
/* Set callback for message sending */
/* This needs to be done after initiating connection */
GSM_SetSendSMSStatusCallback(state_machine, send_sms_callback, NULL);
/* We need to know SMSC number */
PhoneSMSC.Location = 1;
error = GSM_GetSMSC(state_machine, &PhoneSMSC);
if (!check_gammu_error(error))
return false;
/* Set SMSC number in message */
CopyUnicodeString(sms.SMSC.Number, PhoneSMSC.Number);
log_debug("Prepare to send SMS...",DEBUG_ALL);
/* Send message */
error = GSM_SendSMS(state_machine, &sms);
if (!check_gammu_error(error))
return false;
while (!gammu_shutdown) {
GSM_ReadDevice(state_machine, TRUE);
if (sms_send_status == ERR_NONE) {
/* Message sent OK */
return true;
}
if (sms_send_status != ERR_TIMEOUT) {
/* Message sending failed */
return false;
}
}
return true;
}
2011-12-17 19:47:58 +04:00
bool gammu_read_sms()
{
GSM_MultiSMSMessage sms;
// Variable for SMS sender number
char sender_number[20];
memset(&sender_number, 0, sizeof(sender_number));
/* Connect to phone */
/* 1 means number of replies you want to wait for */
error = GSM_InitConnection(state_machine, 1);
if (!check_gammu_error(error))
return false;
/* Prepare for reading message */
error = ERR_NONE;
sms.Number = 0;
sms.SMS[0].Location = 0;
sms.SMS[0].Folder = 0;
log_debug("Trying to read SMS...",DEBUG_ALL);
error = GSM_GetNextSMS(state_machine, &sms, TRUE);
if (error == ERR_EMPTY) return true;
if (!check_gammu_error(error))
return false;
// Now we can do something with the message
for (int i = 0; i < sms.Number; i++)
{
strncpy(sender_number,DecodeUnicodeConsole(sms.SMS[i].Number),19);
char dbg_tmp[100];
sprintf(dbg_tmp,"Number: '%s'", sender_number);
log_debug(dbg_tmp,DEBUG_ALL);
// special hack for Motorola L7
sms.SMS[i].Location-=100000;
if (sms.SMS[i].Coding == SMS_Coding_8bit) {
log_event("gammu sms error: 8-bit message, can not read");
// remove SMS
GSM_DeleteSMS(state_machine,&sms.SMS[i]);
return false;
} else {
sprintf(dbg_tmp,"Text: \"%s\"\n", DecodeUnicodeConsole(sms.SMS[i].Text));
log_debug(dbg_tmp,DEBUG_ALL);
}
// remove SMS after reading
error = GSM_DeleteSMS(state_machine,&sms.SMS[i]);
if (!check_gammu_error(error))
return false;
}
/* Terminate connection */
error = GSM_TerminateConnection(state_machine);
if (!check_gammu_error(error))
return false;
return true;
}