Update GSM SMS.

This commit is contained in:
bossiel 2010-04-13 17:02:52 +00:00
parent 258f06c826
commit f2bb8be258
21 changed files with 1507 additions and 391 deletions

View File

@ -82,8 +82,8 @@ TSK_BEGIN_DECLS
* Gets a the internal buffer as a pointer to an unsigned string (uint8_t*).
* @param self @ref tsk_buffer_t object.
*/
#define TSK_BUFFER_TO_STRING(self) (self ? (const char*)TSK_BUFFER_DATA(self) : 0)
#define TSK_BUFFER_TO_U8(self) (self ? (uint8_t*)TSK_BUFFER_DATA(self) : 0)
#define TSK_BUFFER_TO_STRING(self) (self ? (const char*)TSK_BUFFER_DATA(self) : tsk_null)
#define TSK_BUFFER_TO_U8(self) (self ? (uint8_t*)TSK_BUFFER_DATA(self) : tsk_null)
/**@ingroup tsk_buffer_group
* Buffer object.

View File

@ -37,7 +37,7 @@
*/
#if defined (_DEBUG) || defined (DEBUG)
# define TSK_DEBUG_OBJECTS 0
# define TSK_DEBUG_OBJECTS 1
static int tsk_objects_count = 0;
#else
# define TSK_DEBUG_OBJECTS 0

View File

@ -22,4 +22,9 @@
#include "tinySMS/tsms_packing.h"
#include "tinySMS/rpdu/tsms_rpdu.h"
#include "tinySMS/tpdu/tsms_tpdu.h"
#include "tinySMS/tpdu/tsms_tpdu_submit.h"
#include "tinySMS/tpdu/tsms_tpdu_deliver.h"
#include "tinySMS/tpdu/tsms_tpdu_report.h"
#include "tinySMS/tpdu/tsms_tpdu_command.h"
#include "tinySMS/tpdu/tsms_tpdu_status_report.h"

View File

@ -1,65 +1,65 @@
/*
* Copyright (C) 2009 Mamadou Diop.
*
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
*
* This file is part of Open Source Doubango Framework.
*
* DOUBANGO is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* DOUBANGO is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with DOUBANGO.
*
*/
/**@file tsms_tpdu.h
* @brief SMS TPDU encoder/decoder as per 3GPP TS 23.040.
*
* @author Mamadou Diop <diopmamadou(at)doubango.org>
*
* @date Created: Sat Nov 8 16:54:58 2009 mdiop
*/
#ifndef TINYSMS_TSMS_TPDU_H
#define TINYSMS_TSMS_TPDU_H
#include "tinysms_config.h"
#include "tinySMS/tsms_common.h"
#include "tsk_buffer.h"
TSMS_BEGIN_DECLS
typedef struct tsms_tpdu_ctx_s
{
TSK_DECLARE_OBJECT;
uint8_t mr;
tsms_address_t* smsc; /**< SMSC*/
tsms_address_t* phone; /**< Remote Phone number. */
tsms_alphabet_t alphabet; /**< User data. */
tsk_buffer_t* usrdata; /**< User data. */
}
tsms_tpdu_ctx_t;
typedef void tsms_tpdu_ctx_handle_t;
TINYSMS_API tsms_tpdu_ctx_handle_t* tsms_pdu_ctx_create(uint8_t mr, tsms_address_string_t smsc, tsms_address_string_t phone);
TINYSMS_API int tsms_pdu_ctx_set_alphabet(tsms_tpdu_ctx_handle_t* handle, tsms_alphabet_t alphabet);
TINYSMS_API int tsms_pdu_ctx_set_usrdata(tsms_tpdu_ctx_handle_t* handle, const void* data, size_t size);
TINYSMS_API tsk_buffer_t* tsms_pdu_ctx_getSUBMIT(tsms_tpdu_ctx_handle_t* handle);
TINYSMS_GEXTERN const tsk_object_def_t *tsms_tpdu_ctx_def_t;
TSMS_END_DECLS
#endif /* TINYSMS_TSMS_TPDU_H */
///*
//* Copyright (C) 2009 Mamadou Diop.
//*
//* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
//*
//* This file is part of Open Source Doubango Framework.
//*
//* DOUBANGO is free software: you can redistribute it and/or modify
//* it under the terms of the GNU General Public License as published by
//* the Free Software Foundation, either version 3 of the License, or
//* (at your option) any later version.
//*
//* DOUBANGO is distributed in the hope that it will be useful,
//* but WITHOUT ANY WARRANTY; without even the implied warranty of
//* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//* GNU General Public License for more details.
//*
//* You should have received a copy of the GNU General Public License
//* along with DOUBANGO.
//*
//*/
//
///**@file tsms_tpdu.h
// * @brief SMS TPDU encoder/decoder as per 3GPP TS 23.040.
// *
// * @author Mamadou Diop <diopmamadou(at)doubango.org>
// *
// * @date Created: Sat Nov 8 16:54:58 2009 mdiop
// */
//#ifndef TINYSMS_TSMS_TPDU_H
//#define TINYSMS_TSMS_TPDU_H
//
//#include "tinysms_config.h"
//
//#include "tinySMS/tsms_common.h"
//
//#include "tsk_buffer.h"
//
//
//TSMS_BEGIN_DECLS
//
//typedef struct tsms_tpdu_ctx_s
//{
// TSK_DECLARE_OBJECT;
//
// uint8_t mr;
// tsms_address_t* smsc; /**< SMSC*/
// tsms_address_t* phone; /**< Remote Phone number. */
// tsms_alphabet_t alphabet; /**< User data. */
// tsk_buffer_t* usrdata; /**< User data. */
//}
//tsms_tpdu_ctx_t;
//
//typedef void tsms_tpdu_ctx_handle_t;
//
//TINYSMS_API tsms_tpdu_ctx_handle_t* tsms_tpdu_ctx_create(uint8_t mr, tsms_address_string_t smsc, tsms_address_string_t phone);
//TINYSMS_API int tsms_tpdu_ctx_set_usrdata(tsms_tpdu_ctx_handle_t* handle, tsms_alphabet_t alphabet, const void* data, size_t size);
//TINYSMS_API tsk_buffer_t* tsms_tpdu_ctx_getSUBMIT(tsms_tpdu_ctx_handle_t* handle);
//TINYSMS_API tsk_buffer_t* tsms_tpdu_ctx_getDELIVER(tsms_tpdu_ctx_handle_t* handle);
//
//TINYSMS_GEXTERN const tsk_object_def_t *tsms_tpdu_ctx_def_t;
//
//TSMS_END_DECLS
//
//#endif /* TINYSMS_TSMS_TPDU_H */

View File

@ -36,7 +36,20 @@
TSMS_BEGIN_DECLS
#define TSMS_TPDU_COMMAND_CREATE() tsk_object_new(tsms_tpdu_command_def_t)
/** TP-Command-Type (TP-CT) as per 3GPP TS 23.040 section 9.2.3.19.
* An 8-bit field.
*/
typedef enum tsms_tpdu_cmd_e
{
tsms_tpdu_cmd_rel = 0x00, /**< Enquiry relating to previously submitted short message. */
tsms_tpdu_cmd_cancel = 0x01, /**< Cancel Status Report Request relating to previously submitted short message. */
tsms_tpdu_cmd_delete = 0x02, /**< Delete previously submitted Short Message. */
tsms_tpdu_cmd_enable_status = 0x03, /**< Enable Status Report Request relating to previously submitted short message. */
/* 00000100..00011111 ==> Reserved */
/* 11100000..11111111 ==> Values specific for each SC */
}
tsms_tpdu_cmd_t;
/** SMS TPDU SMS-COMMAND message as per 3GPP TS 23.040 section 9.2.2.4.
*/
@ -44,6 +57,8 @@ typedef struct tsms_tpdu_command_s
{
TSMS_DECLARE_TPDU_MESSAGE;
tsms_address_t* smsc;
/** TP-User-Data-Header-Indication (O - 1b)
* Parameter indicating that the TP-CD field contains a Header. */
unsigned udhi:1;
@ -52,28 +67,39 @@ typedef struct tsms_tpdu_command_s
unsigned srr:1;
/** TP Message Reference (M - I)
* Parameter identifying the SMS COMMAND. */
unsigned mr;
uint8_t mr;
/** TP Protocol Identifier (M - o)
* Parameter identifying the above layer protocol, if any. */
uint8_t pid;
//(base)uint8_t pid;
/** TP Command Type (M - o)
* Parameter specifying which operation is to be performed on a SM. */
uint8_t ct;
* Parameter specifying which operation is to be performed on a SM.
* See section 9.2.3.19 */
tsms_tpdu_cmd_t ct;
/** TP Message Number (M - o)
* Parameter indicating which SM in the SC to operate on. */
* Parameter indicating which SM in the SC to operate on.
* See section 9.2.3.18 */
uint8_t mn;
/** TP Destination Address (M - 2-12o)
* Parameter indicating the Destination Address to which the TP Command refers. */
tsms_address_t* da;
/** TP Command Data Length (M - o)
* Parameter indicating the length of the TP-CD field in octets. */
uint8_t cdl;
//(base)uint8_t cdl;
/** TP Command Data (O - o)
* Parameter containing user data. */
uint8_t cd;
//(base)uint8_t cd;
}
tsms_tpdu_command_t;
typedef void tsms_tpdu_command_handle_t;
TINYSMS_API tsms_tpdu_command_handle_t* tsms_tpdu_command_create(uint8_t mr, tsms_address_string_t smsc, tsms_address_string_t dest, uint8_t msg_num, tsms_tpdu_cmd_t cmd);
#define tsms_tpdu_command_serialize(self, output) tsms_tpdu_message_serialize(TSMS_TPDU_MESSAGE(self), output, tsk_true)
#define tsms_tpdu_command_tostring(self) tsms_tpdu_message_tostring(TSMS_TPDU_MESSAGE(self), tsk_true)
#define tsms_tpdu_command_tohexastring(self) tsms_tpdu_message_tohexastring(TSMS_TPDU_MESSAGE(self), tsk_true)
#define tsms_tpdu_command_set_cmddata(self, cdata) tsms_tpdu_message_set_userdata(TSMS_TPDU_MESSAGE(self), cdata, tsms_alpha_8bit)
TINYSMS_GEXTERN const tsk_object_def_t *tsms_tpdu_command_def_t;
#endif /* TINYSMS_TSMS_TPDU_COMMAND_H */

View File

@ -43,6 +43,8 @@ typedef struct tsms_tpdu_deliver_s
{
TSMS_DECLARE_TPDU_MESSAGE;
tsms_address_t* smsc;
/** TP More Messages to Send (M - 1b)
* Parameter indicating whether or not there are more messages to send. */
unsigned mms:1;
@ -50,10 +52,11 @@ typedef struct tsms_tpdu_deliver_s
* Parameter indicating that SMS applications should inhibit forwarding or automatic message generation that could cause infinite looping. */
unsigned lp:2;
/** TP Reply Path (M - 1b)
* Parameter indicating the request for Reply Path. */
* Parameter indicating the request for Reply Path.
Section 9.2.3.28 */
unsigned rp:1;
/** TP User Data Header Indicator (O - 1b)
* Parameter indicating that Reply Path exists. */
* Parameter indicating that the TP UD field contains a Header. */
unsigned udhi:1;
/** TP Status Report Indicator (O - 1b)
* Parameter indicating if the SME has requested a status report. */
@ -63,22 +66,33 @@ typedef struct tsms_tpdu_deliver_s
tsms_address_t* oa;
/** TP Protocol Identifier (M - o)
* Parameter identifying the above layer protocol, if any. */
uint8_t pid;
//(base)uint8_t pid;
/** TP Data Coding Scheme (M - o)
* Parameter identifying the coding scheme within the TP-User-Data. */
uint8_t dcs;
//(base)uint8_t dcs;
/** TP Service Centre Time Stamp (M - 7o)
* Parameter identifying time when the SC received the message. */
uint8_t scts[7];
/** TP User Data Length (M - I)
* Parameter indicating the length of the TP User Data field to follow. */
unsigned udl;
//(base)uint8_t udl;
/** TP User Data (O - v)
* User data. */
uint8_t* ud;
//(base)tsk_buffer_t* ud;
}
tsms_tpdu_deliver_t;
typedef void tsms_tpdu_deliver_handle_t;
TINYSMS_API tsms_tpdu_deliver_handle_t* tsms_tpdu_deliver_create(tsms_address_string_t smsc, tsms_address_string_t orig);
#define tsms_tpdu_deliver_serialize(self, output) tsms_tpdu_message_serialize(TSMS_TPDU_MESSAGE(self), output, tsk_false)
#define tsms_tpdu_deliver_tostring(self) tsms_tpdu_message_tostring(TSMS_TPDU_MESSAGE(self), tsk_false)
#define tsms_tpdu_deliver_tohexastring(self) tsms_tpdu_message_tohexastring(TSMS_TPDU_MESSAGE(self), tsk_false)
#define tsms_tpdu_deliver_set_userdata(self, udata, alpha) tsms_tpdu_message_set_userdata(TSMS_TPDU_MESSAGE(self), udata, alpha)
TINYSMS_GEXTERN const tsk_object_def_t *tsms_tpdu_deliver_def_t;
TSMS_END_DECLS
#endif /* TINYSMS_TSMS_TPDU_DELIVER_H */

View File

@ -44,6 +44,8 @@ typedef struct tsms_tpdu_report_s
{
TSMS_DECLARE_TPDU_MESSAGE;
tsms_address_t* smsc;
/** Indicates whether the Report is for RP-ERROR or not (RP-ACK).*/
tsk_bool_t error;
@ -51,8 +53,9 @@ typedef struct tsms_tpdu_report_s
* Parameter indicating that the TP-UD field contains a Header. */
unsigned udhi:1;
/** TP Failure Cause (M - I)
* Parameter indicating the reason for SMS DELIVER/SUBMIT failure. */
unsigned fcs;
* Parameter indicating the reason for SMS DELIVER/SUBMIT failure.
See clause 9.2.3.22 */
uint8_t fcs;
/** TP Parameter Indicator (M - o)
* Parameter indicating the presence of any of the optional parameters which follow. */
uint8_t pi;
@ -62,19 +65,33 @@ typedef struct tsms_tpdu_report_s
uint8_t scts[7];
/** TP Protocol Identifier (O - o)
* See clause 9.2.3.9. */
uint8_t pid;
//(base)uint8_t pid;
/** TP Data Coding Scheme (O - o)
* See clause 9.2.3.10. */
uint8_t dcs;
//(base)uint8_t dcs;
/** TP User Data Length (O- o)
* See clause 9.2.3.16. */
uint8_t udl;
//(base)uint8_t udl;
/** TP User Data (O - v)
* User data. */
uint8_t* ud;
//(base)tsk_buffer_t* ud;
}
tsms_tpdu_report_t;
typedef void tsms_tpdu_report_handle_t;
TINYSMS_API tsms_tpdu_report_handle_t* tsms_tpdu_report_create(tsms_address_string_t smsc, tsk_bool_t submit, tsk_bool_t error);
TINYSMS_API int tsms_tpdu_report_set_fcs(tsms_tpdu_report_handle_t* self, uint8_t code);
#define TSMS_TPDU_REPORT_IS_MO(self) (TSMS_TPDU_MESSAGE(self)->mti == tsms_tpdu_mti_deliver_report_mo)
#define tsms_tpdu_report_serialize(self, output) tsms_tpdu_message_serialize(TSMS_TPDU_MESSAGE(self), output, TSMS_TPDU_REPORT_IS_MO(self))
#define tsms_tpdu_report_tostring(self) tsms_tpdu_message_tostring(TSMS_TPDU_MESSAGE(self), TSMS_TPDU_REPORT_IS_MO(self))
#define tsms_tpdu_report_tohexastring(self) tsms_tpdu_message_tohexastring(TSMS_TPDU_MESSAGE(self), TSMS_TPDU_REPORT_IS_MO(self))
#define tsms_tpdu_report_set_userdata(self, udata, alpha) tsms_tpdu_message_set_userdata(TSMS_TPDU_MESSAGE(self), udata, alpha)
TINYSMS_GEXTERN const tsk_object_def_t *tsms_tpdu_report_def_t;
TSMS_END_DECLS
#endif /* TINYSMS_TSMS_TPDU_REPORT_H */

View File

@ -37,12 +37,64 @@
TSMS_BEGIN_DECLS
/** 3GPP TS 23.040 v910 section 9.2.3.15 (TP-ST).
* Used in SMS-STATUS-REPORT message.
*/
typedef enum tsms_tpdu_status_type_e
{
/*== Short message transaction completed ==*/
tsms_tpdu_status_received = 0x00, /**< Short message received by the SME. */
tsms_tpdu_status_forwarded = 0x01, /**< Short message forwarded by the SC to the SME but the SC is unable to confirm delivery. */
tsms_tpdu_status_replaced = 0x02, /**< Short message replaced by the SC. */
/* 0000011..0001111 Reserved */
/* 0010000..0011111 Values specific to each SC */
/*== Temporary error, SC still trying to transfer SM ==*/
tsms_tpdu_status_congestion = 0x20, /**< Congestion. */
tsms_tpdu_status_busy = 0x21, /**< ME busy. */
tsms_tpdu_status_no_response = 0x22, /**< No response from SME. */
tsms_tpdu_status_serv_rejected = 0x23, /**< Service rejected. */
tsms_tpdu_status_no_qos = 0x24, /**< Quality of service not available. */
tsms_tpdu_status_error_in_sme= 0x25, /**< Error in SME. */
/* 0100110..0101111 Reserved */
/* 0110000..0111111 Values specific to each SC */
/*== Permanent error, SC is not making any more transfer attempts ==*/
tsms_tpdu_status_remote_error = 0x40, /**< Remote procedure error. */
tsms_tpdu_status_incompatible_dest = 0x41, /**< Incompatible destination. */
tsms_tpdu_status_conn_rejected = 0x42, /**< Connection rejected by SME. */
tsms_tpdu_status_not_obtainable = 0x43, /**< Not obtainable. */
tsms_tpdu_status_no_qos_2 = 0x44, /**< Quality of service not available. */
tsms_tpdu_status_no_inter_avail = 0x45, /**< No interworking available. */
tsms_tpdu_status_vp_expired = 0x46, /**< SM Validity Period Expired. */
tsms_tpdu_status_deleted_by_orig = 0x47, /**< SM Deleted by originating SME. */
tsms_tpdu_status_deleted_by_admin = 0x48, /**< SM Deleted by SC Administration. */
tsms_tpdu_status_sm_not_exist = 0x49, /**< SM does not exist (The SM may have previously existed in the SC but the SC no longer has knowledge of it or the SM may never have previously existed in the SC). */
/* 1001010..1001111 Reserved */
/* 1010000..1011111 Values specific to each SC */
/*== Temporary error, SC is not making any more transfer attempts ==*/
tsms_tpdu_status_congestion_3 = 0x50, /**< Congestion. */
tsms_tpdu_status_busy_3 = 0x51, /**< SME busy. */
tsms_tpdu_status_no_response_3 = 0x52, /**< No response from SME. */
tsms_tpdu_status_serv_rejected_3 = 0x53, /**< Service rejected. */
tsms_tpdu_status_temp_no_qos_3 = 0x54, /**< Quality of service not available. */
tsms_tpdu_status_error_in_sme_3 = 0x55, /**< Error in SME. */
/* 1100110..1101001 Reserved */
/* 1101010..1101111 Reserved */
/* 1110000..1111111 Values specific to each SC */
}
tsms_tpdu_status_type_t;
/** SMS TPDU SMS-STATUS-REPORT message as per 3GPP TS 23.040 section 9.2.2.3.
*/
typedef struct tsms_tpdu_status_report_s
{
TSMS_DECLARE_TPDU_MESSAGE;
tsms_address_t* smsc;
/** TP User Data Header Indicator (O - 1b)
* Parameter indicating that the TP UD field contains a Header. */
unsigned udhi:1;
@ -50,13 +102,15 @@ typedef struct tsms_tpdu_status_report_s
* Parameter indicating whether or not there are more messages to send. */
unsigned mms:1;
/** TP-Loop-Prevention (O - 1b)
* Parameter indicating that SMS applications should inhibit forwarding or automatic message generation that could cause infinite looping. */
* Parameter indicating that SMS applications should inhibit forwarding or automatic message generation that could cause infinite looping.
Section 9.2.3.28 */
unsigned lp:1;
/** TP Status Report Qualifier (M - 1b)
* Parameter indicating whether the previously submitted TPDU was an SMS-SUBMIT or an SMS COMMAND. */
unsigned srq:1;
/** TP Message Reference (M - I)
* Parameter identifying the previously submitted SMS SUBMIT or SMS COMMAND. */
* Parameter identifying the previously submitted SMS SUBMIT or SMS COMMAND.
* See section 9.2.3.26. */
unsigned mr;
/** TP Recipient Address (M - 2-12o)
* Address of the recipient of the previously submitted mobile originated short message. */
@ -69,25 +123,35 @@ typedef struct tsms_tpdu_status_report_s
uint8_t dt[7];
/** TP Status (M - o)
* Parameter identifying the status of the previously sent mobile originated short message. */
uint8_t st;
tsms_tpdu_status_type_t st;
/** TP-Parameter-Indicator (O - o)
* Parameter indicating the presence of any of the optional parameters which follow. */
uint8_t pi;
/** TP Protocol Identifier (O - o)
* See clause 9.2.3.9. TP-PID of original SMS-SUBMIT. */
uint8_t pid;
//(base)uint8_t pid;
/** TP Data Coding Scheme (O - o)
* See clause 9.2.3.10. */
uint8_t dcs;
//(base)uint8_t dcs;
/** TP User Data Length (O- o)
* See clause 9.2.3.16. */
uint8_t udl;
//(base)uint8_t udl;
/** TP User Data (O - v)
* User data. See clause 9.2.3.24. */
uint8_t* ud;
//(base)uint8_t* ud;
}
tsms_tpdu_status_report_t;
typedef void tsms_tpdu_status_report_handle_t;
TINYSMS_API tsms_tpdu_status_report_handle_t* tsms_tpdu_status_report_create(uint8_t mr, tsms_address_string_t smsc, tsms_address_string_t recipient, tsms_tpdu_status_type_t status, tsk_bool_t submit);
#define tsms_tpdu_status_report_serialize(self, output) tsms_tpdu_message_serialize(TSMS_TPDU_MESSAGE(self), output)
#define tsms_tpdu_status_report_tostring(self) tsms_tpdu_message_tostring(TSMS_TPDU_MESSAGE(self))
#define tsms_tpdu_status_report_tohexastring(self) tsms_tpdu_message_tohexastring(TSMS_TPDU_MESSAGE(self))
#define tsms_tpdu_status_report_set_userdata(self, udata, alpha) tsms_tpdu_message_set_userdata(TSMS_TPDU_MESSAGE(self), udata, alpha)
TINYSMS_GEXTERN const tsk_object_def_t *tsms_tpdu_status_report_def_t;
TSMS_END_DECLS

View File

@ -37,14 +37,14 @@
TSMS_BEGIN_DECLS
#define TSMS_TPDU_SUBMIT_CREATE() tsk_object_new(tsms_tpdu_submit_def_t)
/** SMS TPDU SMS-SUBMIT message as per 3GPP TS 23.040 section 9.2.2.2
*/
typedef struct tsms_tpdu_submit_s
{
TSMS_DECLARE_TPDU_MESSAGE;
tsms_address_t* smsc;
/** TP Reject Duplicates (M - 1b)
* Parameter indicating whether or not the SC shall accept an SMS SUBMIT for an
* SM still held in the SC which has the same TP MR and the same TP DA as a
@ -52,7 +52,7 @@ typedef struct tsms_tpdu_submit_s
unsigned rd:1;
/** TP Validity Period Format (M - 2b)
* Parameter indicating whether or not the TP VP field is present. */
unsigned vpf:2;
tsms_tpdu_vpf_t vpf;
/** TP Reply Path (M - 1b)
* Parameter indicating the request for Reply Path. */
unsigned rp:1;
@ -64,30 +64,36 @@ typedef struct tsms_tpdu_submit_s
unsigned srr:1;
/** TP Message Reference (M - I)
* Parameter identifying the SMS SUBMIT. */
unsigned mr;
uint8_t mr;
/** TP Destination Address (M - 2-12o)
* Address of the destination SME. */
tsms_address_t* da;
/** TP Protocol Identifier (M - o)
* Parameter identifying the above layer protocol, if any. */
uint8_t pid;
//(base)uint8_t pid;
/** TP Data Coding Scheme (M - o)
* Parameter identifying the coding scheme within the TP User Data. */
uint8_t dcs;
//(base)uint8_t dcs;
/** TP Validity Period (O - o/7o)
* Parameter identifying the time from where the message is no longer valid. */
uint8_t vp[7];
/** TP User Data Length (M - I)
* Parameter indicating the length of the TP User Data field to follow. */
unsigned udl;
//(base)uint8_t udl;
/** TP User Data (O - v)
* User data. */
tsk_buffer_t* ud;
//(base)tsk_buffer_t* ud;
}
tsms_tpdu_submit_t;
int tsms_submit_set_alpha(tsms_tpdu_submit_t* self, tsms_alphabet_t alpha);
int tsms_submit_set_usrdata(tsms_tpdu_submit_t* self, const char* ascii, tsms_alphabet_t alpha);
typedef void tsms_tpdu_submit_handle_t;
TINYSMS_API tsms_tpdu_submit_handle_t* tsms_tpdu_submit_create(uint8_t mr, tsms_address_string_t smsc, tsms_address_string_t dest);
#define tsms_tpdu_submit_serialize(self, output) tsms_tpdu_message_serialize(TSMS_TPDU_MESSAGE(self), output, tsk_true)
#define tsms_tpdu_submit_tostring(self) tsms_tpdu_message_tostring(TSMS_TPDU_MESSAGE(self), tsk_true)
#define tsms_tpdu_submit_tohexastring(self) tsms_tpdu_message_tohexastring(TSMS_TPDU_MESSAGE(self), tsk_true)
#define tsms_tpdu_submit_set_userdata(self, udata, alpha) tsms_tpdu_message_set_userdata(TSMS_TPDU_MESSAGE(self), udata, alpha)
TINYSMS_GEXTERN const tsk_object_def_t *tsms_tpdu_submit_def_t;

View File

@ -38,8 +38,6 @@
TSMS_BEGIN_DECLS
typedef int (*tsms_tpdu_message_serialize_f)(const tsms_address_t* smsc, const struct tsms_tpdu_message_s* self, tsk_buffer_t* output);
/** SMS alphabet values as per 3GPP TS 23.038 v911 section 4.
* Part of TP-DCS (SMS Data Coding Scheme).
*/
@ -55,8 +53,7 @@ tsms_alphabet_t;
/* 3GPP TS 23.038 v911 section 4 */
#define TSMS_ALPHA_FROM_DCS(dcs) (((dcs) & 0x0C) >> 2) /* Bit3 and Bit2 */
/** 3GPP TS 23.040 - 9.2.3.1 TP Message Type Indicator (TP MTI)
*/
/** 3GPP TS 23.040 - 9.2.3.1 TP Message Type Indicator (TP MTI) */
typedef enum tsms_tpdu_mti_e
{
/*0 0*/ tsms_tpdu_mti_deliver_mt = 0x00, /**< SMS-DELIVER (in the direction SC to MS)*/
@ -69,20 +66,66 @@ typedef enum tsms_tpdu_mti_e
}
tsms_tpdu_mti_t;
#define TSMS_TPDU_MTI_IS_RESERVED(mti) ((mti) == tsms_tpdu_mti_reserved)
#define TSMS_TPDU_MTI_IS_MO(mti) (((mti) == tsms_tpdu_mti_deliver_report_mo) || ((mti) == tsms_tpdu_mti_command_mo) || ((mti) == tsms_tpdu_mti_submit_mo))
/** 3GPP TS 23.040 - 9.2.3.1 TP Message Type Indicator (TP MTI) */
typedef enum tsms_tpdu_vpf_e
{
// Bit4 and Bit3
/*0 0*/ tsms_tpdu_vpf_not_present = 0x00, /**< TP VP field not present */
/*1 0*/ tsms_tpdu_vpf_relative = 0x02, /**< TP VP field present - relative format*/
/*0 1*/ tsms_tpdu_vpf_enhanced = 0x01, /**< TP-VP field present - enhanced format */
/*1 1*/ tsms_tpdu_vpf_absolute = 0x03, /**< TP VP field present - absolute format */
}
tsms_tpdu_vpf_t;
/** SM-TL base type as per 3GPP TS 23.040 section 9.2.
*/
typedef struct tsms_tpdu_message_s
{
TSK_DECLARE_OBJECT;
tsms_tpdu_mti_t mti; /**< TP Message Type Indicator (TP MTI) as per TS 23.040 section 9.2.3.1. 2-bit field. */
tsms_tpdu_message_serialize_f serialize;
/** TP Message Type Indicator (TP MTI) as per TS 23.040 section 9.2.3.1. 2-bit field. */
tsms_tpdu_mti_t mti;
/** TP Protocol Identifier (M - o)
* Parameter identifying the above layer protocol, if any. */
uint8_t pid;
/** TP Data Coding Scheme (M - o)
* Parameter identifying the coding scheme within the TP-User-Data. */
uint8_t dcs;
/** TP User Data Length (M - I)
* Parameter indicating the length of the TP User Data field to follow. */
uint8_t udl;
/** TP User Data (O - v)
* User data. */
tsk_buffer_t* ud;
}
tsms_tpdu_message_t;
#define TSMS_DECLARE_TPDU_MESSAGE tsms_tpdu_message_t tpdu
#define TSMS_TPDU_MESSAGE(self) ((tsms_tpdu_message_t*)(self))
#define TSMS_TPDU_MESSAGE_SERIALIZE_F(self) ((tsms_tpdu_message_serialize_f)(self))
int tsms_tpdu_message_init(tsms_tpdu_message_t* self, tsms_tpdu_mti_t mti);
TINYSMS_API int tsms_tpdu_message_serialize(const tsms_tpdu_message_t* self, tsk_buffer_t* output, tsk_bool_t MobOrig);
TINYSMS_API tsms_tpdu_message_t* tsms_tpdu_message_deserialize(const void* data, size_t size, tsk_bool_t MobOrig);
TINYSMS_API char* tsms_tpdu_message_tostring(const tsms_tpdu_message_t* self, tsk_bool_t MobOrig);
TINYSMS_API char* tsms_tpdu_message_tohexastring(const tsms_tpdu_message_t* self, tsk_bool_t MobOrig);
TINYSMS_API int tsms_tpdu_message_set_userdata(tsms_tpdu_message_t* self, const tsk_buffer_t* udata, tsms_alphabet_t alpha);
int tsms_tpdu_message_deinit(tsms_tpdu_message_t* self);
/* ========== TPDU default values ========== */
#define TSMS_TPDU_DEFAULT_PID 0x00 /**< 3GPP TS 23.040 section 9.2.3.9 - TP-Protocol-Identifier (TP-PID) */
#define TSMS_TPDU_DEFAULT_DCS 0x00 /**< 3GPP TS 23.040 section 9.2.3.10 - TP-Data-Coding-Scheme (TP-DCS) (default class, 7 bit message) + GSM 03.38*/
#define TSMS_TPDU_DEFAULT_VP 0xAA /**< 3GPP TS 23.040 section 9.2.3.12 - TP-Validity-Period */
#define TSMS_TPDU_DEFAULT_VPF tsms_tpdu_vpf_relative /**< 3GPP TS 23.040 section 9.2.3.3 - TP Validity Period Format (TP VPF) */
#define TSMS_TPDU_DEFAULT_FCS 0xFF /**< 3GPP TS 23.040 section 9.2.3.22 - TP-Failure-Cause (TP-FCS) */
#define TSMS_TPDU_DEFAULT_PI 0x00 /**< 3GPP TS 23.040 section 9.2.3.27 - TP-Parameter-Indicator (TP-PI) */
#define TSMS_TPDU_DEFAULT_SCTS "00000000000000" /**< 3GPP TS 23.040 section 9.2.3.11 - TP-Service-Centre-Time-Stamp (TP-SCTS) */
#define TSMS_TPDU_DEFAULT_MMS 0x01 /**< 3GPP TS 23.040 section 9.2.3.2 - TP More Messages to Send (TP-MMS) */
/**< Indicates whether to append SMSC address at the begining of the TPDU content.
*/
#define TSMS_TPDU_APPEND_SMSC 1
TSMS_END_DECLS

View File

@ -1,161 +1,195 @@
/*
* Copyright (C) 2009 Mamadou Diop.
*
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
*
* This file is part of Open Source Doubango Framework.
*
* DOUBANGO is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* DOUBANGO is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with DOUBANGO.
*
*/
/**@file tsms_tpdu_ctx.c
* @brief SMS TPDU encoder/decoder as per 3GPP TS 23.040.
*
* @author Mamadou Diop <diopmamadou(at)doubango.org>
*
* @date Created: Sat Nov 8 16:54:58 2009 mdiop
*/
#include "tinySMS/tpdu/tsms_tpdu.h"
#include "tinySMS/tpdu/tsms_tpdu_submit.h"
#include "tsk_string.h"
#include "tsk_memory.h"
#include "tsk_debug.h"
/**@defgroup tsms_pdu_group SMS TPDU encoder/decoder
*/
/**@ingroup tsms_pdu_group
*/
tsms_tpdu_ctx_handle_t* tsms_pdu_ctx_create(uint8_t mr, tsms_address_string_t smsc, tsms_address_string_t phone)
{
tsms_tpdu_ctx_t* ret = tsk_null;
if(!smsc){
TSK_DEBUG_ERROR("SMSC is Null.");
goto bail;
}
if(!(ret = tsk_object_new(tsms_tpdu_ctx_def_t, mr, smsc, phone))){
goto bail;
}
bail:
return ret;
}
/**@ingroup tsms_pdu_group
*/
int tsms_pdu_ctx_set_alphabet(tsms_tpdu_ctx_handle_t* handle, tsms_alphabet_t alphabet)
{
tsms_tpdu_ctx_t* ctx = handle;
if(ctx){
ctx->alphabet = alphabet;
return 0;
}
return -1;
}
/**@ingroup tsms_pdu_group
*/
int tsms_pdu_ctx_set_usrdata(tsms_tpdu_ctx_handle_t* handle, const void* data, size_t size)
{
tsms_tpdu_ctx_t* ctx = handle;
if(ctx && data && size){
TSK_OBJECT_SAFE_FREE(ctx->usrdata);
ctx->usrdata = TSK_BUFFER_CREATE(data, size);
return 0;
}
return -1;
}
/**@ingroup tsms_pdu_group
*/
tsk_buffer_t* tsms_pdu_ctx_getSUBMIT(tsms_tpdu_ctx_handle_t* handle)
{
tsk_buffer_t* output = tsk_null;
tsms_tpdu_submit_t* submit = tsk_null;
tsms_tpdu_ctx_t* ctx = handle;
if(!ctx){
TSK_DEBUG_ERROR("TPDU handle is Null.");
goto bail;
}
if((submit = TSMS_TPDU_SUBMIT_CREATE())){
output = TSK_BUFFER_CREATE_NULL();
TSMS_TPDU_MESSAGE(submit)->serialize(ctx->smsc, TSMS_TPDU_MESSAGE(submit), output);
}
else{
goto bail;
}
bail:
TSK_OBJECT_SAFE_FREE(submit);
return output;
}
//=================================================================================================
// SMS TPDU object definition
///*
//* Copyright (C) 2009 Mamadou Diop.
//*
//* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
//*
//* This file is part of Open Source Doubango Framework.
//*
//* DOUBANGO is free software: you can redistribute it and/or modify
//* it under the terms of the GNU General Public License as published by
//* the Free Software Foundation, either version 3 of the License, or
//* (at your option) any later version.
//*
//* DOUBANGO is distributed in the hope that it will be useful,
//* but WITHOUT ANY WARRANTY; without even the implied warranty of
//* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//* GNU General Public License for more details.
//*
//* You should have received a copy of the GNU General Public License
//* along with DOUBANGO.
//*
//*/
//
///**@file tsms_tpdu_ctx.c
// * @brief SMS TPDU encoder/decoder as per 3GPP TS 23.040.
// *
// * @author Mamadou Diop <diopmamadou(at)doubango.org>
// *
// * @date Created: Sat Nov 8 16:54:58 2009 mdiop
// */
//#include "tinySMS/tpdu/tsms_tpdu.h"
//
//#include "tinySMS/tpdu/tsms_tpdu_submit.h"
//#include "tinySMS/tpdu/tsms_tpdu_deliver.h"
//
//#include "tsk_string.h"
//#include "tsk_memory.h"
//#include "tsk_debug.h"
//
///**@defgroup tsms_tpdu_group SMS TPDU encoder/decoder
//*/
//
///**@ingroup tsms_tpdu_group
//* If smsc is null, then the one stored in the phone will be used.
//* phone: OA for SMS-DELIVER and DA for SMS-SUBMIT
//* mr: not used for SMS-DELIVER
//*/
//tsms_tpdu_ctx_handle_t* tsms_tpdu_ctx_create(uint8_t mr, tsms_address_string_t smsc, tsms_address_string_t phone)
//{
// tsms_tpdu_ctx_t* ret = tsk_null;
//
// if(!(ret = tsk_object_new(tsms_tpdu_ctx_def_t, mr, smsc, phone))){
// goto bail;
// }
//
//bail:
// return ret;
//}
//
///**@ingroup tsms_tpdu_group
//*/
//int tsms_tpdu_ctx_set_usrdata(tsms_tpdu_ctx_handle_t* handle, tsms_alphabet_t alphabet, const void* data, size_t size)
//{
// tsms_tpdu_ctx_t* ctx = handle;
// if(ctx && data && size){
// ctx->alphabet = alphabet;
// TSK_OBJECT_SAFE_FREE(ctx->usrdata);
// ctx->usrdata = TSK_BUFFER_CREATE(data, size);
// return 0;
// }
// return -1;
//}
//
///**@ingroup tsms_tpdu_group
//*/
//tsk_buffer_t* tsms_tpdu_ctx_getSUBMIT(tsms_tpdu_ctx_handle_t* handle)
//{
// tsk_buffer_t* output = tsk_null;
// tsms_tpdu_submit_t* submit = tsk_null;
//
// tsms_tpdu_ctx_t* ctx = handle;
//
// if(!ctx){
// TSK_DEBUG_ERROR("TPDU handle is Null.");
// goto bail;
// }
// if(!ctx->usrdata){
// TSK_DEBUG_ERROR("SMS-SUBMIT need user-data.");
// goto bail;
// }
//
// if((submit = TSMS_TPDU_SUBMIT_CREATE())){
// output = TSK_BUFFER_CREATE_NULL();
// /*=== initialize SMS-SUBMIT ===*/
// /* message reference */
// submit->mr = ctx->mr;
// /* distination address */
// submit->da = tsk_object_ref(ctx->phone);
// /* user-data */
// tsms_tpdu_message_set_usrdata(TSMS_TPDU_MESSAGE(submit), ctx->usrdata->data, ctx->alphabet);
//
// TSMS_TPDU_MESSAGE(submit)->serialize(ctx->smsc, TSMS_TPDU_MESSAGE(submit), output);
// }
// else{
// goto bail;
// }
//
//bail:
// TSK_OBJECT_SAFE_FREE(submit);
// return output;
//}
//
///**@ingroup tsms_tpdu_group
//*/
//tsk_buffer_t* tsms_tpdu_ctx_getDELIVER(tsms_tpdu_ctx_handle_t* handle)
//{
// tsk_buffer_t* output = tsk_null;
// tsms_tpdu_deliver_t* deliver = tsk_null;
//
// tsms_tpdu_ctx_t* ctx = handle;
//
// if(!ctx){
// TSK_DEBUG_ERROR("TPDU handle is Null.");
// goto bail;
// }
// if(!ctx->usrdata){
// TSK_DEBUG_ERROR("SMS-DELIVER need user-data.");
// goto bail;
// }
//
// if((deliver = TSMS_TPDU_DELIVER_CREATE())){
// output = TSK_BUFFER_CREATE_NULL();
// /*=== initialize SMS-SUBMIT ===*/
// /* distination address */
// deliver->oa = tsk_object_ref(ctx->phone);
// /* user-data */
// tsms_tpdu_message_set_usrdata(TSMS_TPDU_MESSAGE(deliver), ctx->usrdata->data, ctx->alphabet);
//
// TSMS_TPDU_MESSAGE(deliver)->serialize(ctx->smsc, TSMS_TPDU_MESSAGE(deliver), output);
// }
// else{
// goto bail;
// }
//
//bail:
// TSK_OBJECT_SAFE_FREE(deliver);
// return output;
//}
//
////=================================================================================================
//// SMS TPDU object definition
////
//static tsk_object_t* _tsms_tpdu_ctx_create(tsk_object_t * self, va_list * app)
//{
// tsms_tpdu_ctx_t *ctx = self;
// if(ctx){
// const char* smsc, *phone;
// uint8_t mr;
//
static tsk_object_t* _tsms_tpdu_ctx_create(tsk_object_t * self, va_list * app)
{
tsms_tpdu_ctx_t *ctx = self;
if(ctx){
const char* smsc, *phone;
uint8_t mr;
#if defined(__GNUC__)
mr = (uint8_t)va_arg(*app, unsigned);
#else
mr = va_arg(*app, uint8_t);
#endif
smsc = va_arg(*app, const char*);
phone = va_arg(*app, const char*);
ctx->mr = mr;
ctx->smsc = TSMS_ADDRESS_SMSC_CREATE(smsc);
ctx->phone = TSMS_ADDRESS_DA_CREATE(phone);
ctx->alphabet = tsms_alpha_7bit;
}
return self;
}
static tsk_object_t* tsms_tpdu_ctx_destroy(tsk_object_t * self)
{
tsms_tpdu_ctx_t *ctx = self;
if(ctx){
TSK_OBJECT_SAFE_FREE(ctx->smsc);
TSK_OBJECT_SAFE_FREE(ctx->phone);
TSK_OBJECT_SAFE_FREE(ctx->usrdata);
}
return self;
}
static const tsk_object_def_t tsms_tpdu_ctx_def_s =
{
sizeof(tsms_tpdu_ctx_t),
_tsms_tpdu_ctx_create,
tsms_tpdu_ctx_destroy,
tsk_null,
};
const tsk_object_def_t *tsms_tpdu_ctx_def_t = &tsms_tpdu_ctx_def_s;
//#if defined(__GNUC__)
// mr = (uint8_t)va_arg(*app, unsigned);
//#else
// mr = va_arg(*app, uint8_t);
//#endif
// smsc = va_arg(*app, const char*);
// phone = va_arg(*app, const char*);
//
// ctx->mr = mr;
// ctx->smsc = TSMS_ADDRESS_SMSC_CREATE(smsc);
// ctx->phone = TSMS_ADDRESS_DA_CREATE(phone);
// ctx->alphabet = tsms_alpha_7bit;
// }
// return self;
//}
//
//static tsk_object_t* tsms_tpdu_ctx_destroy(tsk_object_t * self)
//{
// tsms_tpdu_ctx_t *ctx = self;
// if(ctx){
// TSK_OBJECT_SAFE_FREE(ctx->smsc);
// TSK_OBJECT_SAFE_FREE(ctx->phone);
//
// TSK_OBJECT_SAFE_FREE(ctx->usrdata);
// }
//
// return self;
//}
//
//static const tsk_object_def_t tsms_tpdu_ctx_def_s =
//{
// sizeof(tsms_tpdu_ctx_t),
// _tsms_tpdu_ctx_create,
// tsms_tpdu_ctx_destroy,
// tsk_null,
//};
//const tsk_object_def_t *tsms_tpdu_ctx_def_t = &tsms_tpdu_ctx_def_s;

View File

@ -29,22 +29,115 @@
*/
#include "tinySMS/tpdu/tsms_tpdu_command.h"
tsms_tpdu_message_t* _tsms_tpdu_command_deserialize(const void* data, size_t size)
{
return tsk_null;
}
int _tsms_tpdu_command_serialize(const tsms_tpdu_command_t* self, tsk_buffer_t* output)
{
uint8_t _1byte;
if(!self){
return -1;
}
/* SMSC address */
#if TSMS_TPDU_APPEND_SMSC
tsms_address_serialize(self->smsc, output);
#endif
/* SMS-COMMAND first Octect:
- TP-Message-Type-Indicator(2b)
- TP-User-Data-Header-Indicator(1b)
- TP-Status-Report-Request(1b)
+----+----+----+----+----+----+----+----+
| |UDHI|SRR | | | RD | MTI |
+----+----+----+----+----+----+----+----+
*/
_1byte = (TSMS_TPDU_MESSAGE(self)->mti & 0xF3); /*2b*/
_1byte |=
/*1b*/
/*2b*/
((uint8_t)self->srr) << 5 /*1b*/
| ((uint8_t)self->udhi) << 6; /*1b*/
tsk_buffer_append(output, &_1byte, 1);
/* 3GPP TS 23.040 ==> 9.2.3.6 TP-Message-Reference (TP-MR) */
tsk_buffer_append(output, &self->mr, 1); /*0-255 ==> 1o*/
/* 3GPP TS 23.040 ==> 9.2.3.9 TP-Protocol-Identifier (TP-PID) */
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->pid, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.19 TP-Command-Type (TP-CT) */
tsk_buffer_append(output, &self->ct, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.18 TP-Message-Number (TP-MN) */
tsk_buffer_append(output, &self->mn, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.8 TP-Destination-Address (TP-DA) */
tsms_address_serialize(self->da, output);
/* 3GPP TS 23.040 ==> 9.2.3.20 TP Command Data Length (TP CDL) */
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->udl, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.21 TP Command Data (TP CD) */
tsk_buffer_append(output, TSK_BUFFER_DATA(TSMS_TPDU_MESSAGE(self)->ud), TSK_BUFFER_SIZE(TSMS_TPDU_MESSAGE(self)->ud));
return 0;
}
tsms_tpdu_command_handle_t* tsms_tpdu_command_create(uint8_t mr, tsms_address_string_t smsc, tsms_address_string_t dest, uint8_t msg_num, tsms_tpdu_cmd_t cmd)
{
tsms_tpdu_command_t* ret = tsk_null;
if(!(ret = tsk_object_new(tsms_tpdu_command_def_t, mr, smsc, dest, msg_num, cmd))){
goto bail;
}
bail:
return ret;
}
//=================================================================================================
// SMS TPDU SMS-COMMAND object definition
//
static tsk_object_t* tsms_tpdu_command_create(tsk_object_t * self, va_list * app)
static tsk_object_t* _tsms_tpdu_command_create(tsk_object_t * self, va_list * app)
{
tsms_tpdu_command_t *command = self;
if(command){
//tsk_bool_t orig = va_arg(*app, tsk_bool_t);
TSMS_TPDU_MESSAGE(command)->mti = tsms_tpdu_mti_command_mo;
const char* smsc, *dest;
uint8_t mr, msg_num;
tsms_tpdu_cmd_t cmd;
#if defined(__GNUC__)
mr = (uint8_t)va_arg(*app, unsigned);
#else
mr = va_arg(*app, uint8_t);
#endif
smsc = va_arg(*app, const char*);
dest = va_arg(*app, const char*);
#if defined(__GNUC__)
msg_num = (uint8_t)va_arg(*app, unsigned);
#else
msg_num = va_arg(*app, uint8_t);
#endif
cmd = va_arg(*app, tsms_tpdu_cmd_t);
/* init base*/
tsms_tpdu_message_init(TSMS_TPDU_MESSAGE(command), tsms_tpdu_mti_command_mo);
/* init self */
command->mr = mr;
command->smsc = TSMS_ADDRESS_SMSC_CREATE(smsc);
command->da = TSMS_ADDRESS_DA_CREATE(dest);
command->mn = msg_num;
command->ct = cmd;
}
return self;
}
@ -53,6 +146,7 @@ static tsk_object_t* tsms_tpdu_command_destroy(tsk_object_t * self)
{
tsms_tpdu_command_t *command = self;
if(command){
TSK_OBJECT_SAFE_FREE(command->smsc);
TSK_OBJECT_SAFE_FREE(command->da);
}
@ -62,7 +156,7 @@ static tsk_object_t* tsms_tpdu_command_destroy(tsk_object_t * self)
static const tsk_object_def_t tsms_tpdu_command_def_s =
{
sizeof(tsms_tpdu_command_t),
tsms_tpdu_command_create,
_tsms_tpdu_command_create,
tsms_tpdu_command_destroy,
tsk_null,
};

View File

@ -0,0 +1,150 @@
/*
* Copyright (C) 2009 Mamadou Diop.
*
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
*
* This file is part of Open Source Doubango Framework.
*
* DOUBANGO is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* DOUBANGO is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with DOUBANGO.
*
*/
/**@file tsms_tpdu_deliver.c
* @brief SMS TPDU SMS-DELIVER message as per 3GPP TS 23.040 section 9.2.2.1.
*
* @author Mamadou Diop <diopmamadou(at)doubango.org>
*
* @date Created: Sat Nov 8 16:54:58 2009 mdiop
*/
#include "tinySMS/tpdu/tsms_tpdu_deliver.h"
#include "tsk_string.h"
#include "tsk_memory.h"
#include "tsk_debug.h"
tsms_tpdu_message_t* _tsms_tpdu_deliver_deserialize(const void* data, size_t size)
{
return tsk_null;
}
int _tsms_tpdu_deliver_serialize(const tsms_tpdu_deliver_t* self, tsk_buffer_t* output)
{
uint8_t _1byte;
if(!self){
return -1;
}
/* SMSC address */
#if TSMS_TPDU_APPEND_SMSC
tsms_address_serialize(self->smsc, output);
#endif
/* SMS-DELIVER first Octect:
- TP-Message-Type-Indicator(2b)
- TP-More-Messages-to-Send(1b)
- TP-Loop-Prevention(1b)
- TP-Reply-Path(1b)
- TP-User-Data-Header-Indicator(1b)
- TP-Status-Report-Indication(1b)
+----+----+----+----+----+----+----+----+
| RP|UDHI|SRI | |LP |MMS | MTI |
+----+----+----+----+----+----+----+----+
*/
_1byte = (TSMS_TPDU_MESSAGE(self)->mti & 0xF3); /*2b*/
_1byte |= ((uint8_t)self->mms) << 2 /*1b*/
| ((uint8_t)self->lp) << 3 /*1b*/
/*1b (unused)*/
| ((uint8_t)self->sri) << 5 /*1b*/
| ((uint8_t)self->udhi) << 6 /*1b*/
| ((uint8_t)self->rp) << 7; /*1b*/
tsk_buffer_append(output, &_1byte, 1);
/* 3GPP TS 23.040 ==> TP-Originating-Address (TP-OA)*/
tsms_address_serialize(self->oa, output);
/* 3GPP TS 23.040 ==> TP-Protocol-Identifier (TP-PI)*/
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->pid, 1); /*1o*/
/* 3GPP TS 23.040 ==> TP-Data-Coding-Scheme (TP-DCS)*/
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->dcs, 1); /*1o*/
/* 3GPP TS 23.040 ==> TP-Service-Centre-Time-Stamp (TP-SCTS)*/
tsk_buffer_append(output, self->scts, sizeof(self->scts)); /*7o*/
/* 3GPP TS 23.040 ==> 9.2.3.16 TP-User-Data-Length (TP-UDL) */
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->udl, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.24 TP-User Data (TP-UD) */
tsk_buffer_append(output, TSK_BUFFER_DATA(TSMS_TPDU_MESSAGE(self)->ud), TSK_BUFFER_SIZE(TSMS_TPDU_MESSAGE(self)->ud));
return 0;
}
tsms_tpdu_deliver_handle_t* tsms_tpdu_deliver_create(tsms_address_string_t smsc, tsms_address_string_t orig)
{
tsms_tpdu_deliver_t* ret = tsk_null;
if(!(ret = tsk_object_new(tsms_tpdu_deliver_def_t, smsc, orig))){
goto bail;
}
bail:
return ret;
}
//=================================================================================================
// SMS TPDU SMS-DELIVER object definition
//
static tsk_object_t* _tsms_tpdu_deliver_create(tsk_object_t * self, va_list * app)
{
tsms_tpdu_deliver_t *deliver = self;
if(deliver){
const char* smsc, *orig;
smsc = va_arg(*app, const char*);
orig = va_arg(*app, const char*);
/* init base*/
tsms_tpdu_message_init(TSMS_TPDU_MESSAGE(deliver), tsms_tpdu_mti_deliver_mt);
/* init self */
deliver->mms = TSMS_TPDU_DEFAULT_MMS;
deliver->smsc = TSMS_ADDRESS_SMSC_CREATE(smsc);
deliver->oa = TSMS_ADDRESS_DA_CREATE(orig);
}
return self;
}
static tsk_object_t* tsms_tpdu_deliver_destroy(tsk_object_t * self)
{
tsms_tpdu_deliver_t *deliver = self;
if(deliver){
/*deinit base*/
tsms_tpdu_message_deinit(TSMS_TPDU_MESSAGE(deliver));
/*deinit self*/
TSK_OBJECT_SAFE_FREE(deliver->oa);
TSK_OBJECT_SAFE_FREE(deliver->smsc);
}
return self;
}
static const tsk_object_def_t tsms_tpdu_deliver_def_s =
{
sizeof(tsms_tpdu_deliver_t),
_tsms_tpdu_deliver_create,
tsms_tpdu_deliver_destroy,
tsk_null,
};
const tsk_object_def_t *tsms_tpdu_deliver_def_t = &tsms_tpdu_deliver_def_s;

View File

@ -0,0 +1,165 @@
/*
* Copyright (C) 2009 Mamadou Diop.
*
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
*
* This file is part of Open Source Doubango Framework.
*
* DOUBANGO is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* DOUBANGO is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with DOUBANGO.
*
*/
/**@file tsms_tpdu_report.c
* @brief SMS TPDU SMS-DELIVER-REPORT and SMS-SUBMIT-REPORT message as per 3GPP TS 23.040 section 9.2.2.1a and 9.2.2.2a.
*
* @author Mamadou Diop <diopmamadou(at)doubango.org>
*
* @date Created: Sat Nov 8 16:54:58 2009 mdiop
*/
#include "tinySMS/tpdu/tsms_tpdu_report.h"
#include "tsk_string.h"
#include "tsk_memory.h"
#include "tsk_debug.h"
tsms_tpdu_message_t* _tsms_tpdu_report_deserialize(const void* data, size_t size)
{
return tsk_null;
}
int _tsms_tpdu_report_serialize(const tsms_tpdu_report_t* self, tsk_buffer_t* output)
{
uint8_t _1byte;
if(!self){
return -1;
}
/* SMSC address */
#if TSMS_TPDU_APPEND_SMSC
tsms_address_serialize(self->smsc, output);
#endif
/* SMS-DELIVER-REPORT/MS-SUBMIT-REPORT (both ACK and ERROR) first Octect:
- TP-Message-Type-Indicator(2b)
- TP-User-Data-Header-Indication(1b)
+----+----+----+----+----+----+----+----+
| |UDHI| | | | | MTI |
+----+----+----+----+----+----+----+----+
*/
_1byte = (TSMS_TPDU_MESSAGE(self)->mti & 0xF3); /*2b*/
_1byte |= ((uint8_t)self->udhi) << 6; /*1b*/
tsk_buffer_append(output, &_1byte, 1);
if(self->error){
/* 3GPP TS 23.040 ==> 9.2.3.22 TP-Failure-Cause(TP-FCS) */
tsk_buffer_append(output, &self->fcs, 1); /*0x00-0xFF ==> 1o*/
}
/* 3GPP TS 23.040 ==> xxxx TP-Parameter-Indicator (TP-PI) */
tsk_buffer_append(output, &self->pi, 1); /* 1o*/
if(TSMS_TPDU_MESSAGE(self)->mti == tsms_tpdu_mti_submit_report_mt){
/* 3GPP TS 23.040 ==> TP-Service-Centre-Time-Stamp (TP-SCTS) */
tsk_buffer_append(output, self->scts, sizeof(self->scts)); /*7o*/
}
/* 3GPP TS 23.040 ==> 9.2.3.9 TP-Protocol-Identifier (TP-PID) */
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->pid, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.10 TP-Data-Coding-Scheme (TP-DCS) */
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->dcs, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.16 TP-User-Data-Length (TP-UDL) */
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->udl, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.24 TP-User Data (TP-UD) */
tsk_buffer_append(output, TSK_BUFFER_DATA(TSMS_TPDU_MESSAGE(self)->ud), TSK_BUFFER_SIZE(TSMS_TPDU_MESSAGE(self)->ud));
return 0;
}
tsms_tpdu_report_handle_t* tsms_tpdu_report_create(tsms_address_string_t smsc, tsk_bool_t submit, tsk_bool_t error)
{
tsms_tpdu_report_t* ret = tsk_null;
if(!(ret = tsk_object_new(tsms_tpdu_report_def_t, smsc, submit, error))){
goto bail;
}
bail:
return ret;
}
int tsms_tpdu_report_set_fcs(tsms_tpdu_report_handle_t* self, uint8_t code)
{
if(self){
tsms_tpdu_report_t* report = self;
report->fcs = code;
return 0;
}
return -1;
}
//=================================================================================================
// SMS TPDU SMS-DELIVER-REPORT/SMS-SUBMIT-REPORT object definition
//
static tsk_object_t* _tsms_tpdu_report_create(tsk_object_t * self, va_list * app)
{
tsms_tpdu_report_t *report = self;
if(report){
const char* smsc;
tsk_bool_t error, submit;
smsc = va_arg(*app, const char*);
submit = va_arg(*app, tsk_bool_t);
error = va_arg(*app, tsk_bool_t);
/* init base*/
tsms_tpdu_message_init(TSMS_TPDU_MESSAGE(report), submit?tsms_tpdu_mti_submit_report_mt
:tsms_tpdu_mti_deliver_report_mo);
/* init self */
report->smsc = TSMS_ADDRESS_SMSC_CREATE(smsc);
}
else{
TSK_DEBUG_ERROR("Null");
}
return self;
}
static tsk_object_t* tsms_tpdu_report_destroy(tsk_object_t * self)
{
tsms_tpdu_report_t *report = self;
if(report){
/*deinit base*/
tsms_tpdu_message_deinit(TSMS_TPDU_MESSAGE(report));
/*deinit self*/
TSK_OBJECT_SAFE_FREE(report->smsc);
}
else{
TSK_DEBUG_ERROR("Null");
}
return self;
}
static const tsk_object_def_t tsms_tpdu_report_def_s =
{
sizeof(tsms_tpdu_report_t),
_tsms_tpdu_report_create,
tsms_tpdu_report_destroy,
tsk_null,
};
const tsk_object_def_t *tsms_tpdu_report_def_t = &tsms_tpdu_report_def_s;

View File

@ -0,0 +1,179 @@
/*
* Copyright (C) 2009 Mamadou Diop.
*
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
*
* This file is part of Open Source Doubango Framework.
*
* DOUBANGO is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* DOUBANGO is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with DOUBANGO.
*
*/
/**@file tsms_tpdu_status_report.c
* @brief SMS TPDU SMS-STATUS-REPORT message as per 3GPP TS 23.040 section 9.2.2.3.
*
* @author Mamadou Diop <diopmamadou(at)doubango.org>
*
* @date Created: Sat Nov 8 16:54:58 2009 mdiop
*/
#include "tinySMS/tpdu/tsms_tpdu_status_report.h"
#include "tsk_string.h"
#include "tsk_memory.h"
#include "tsk_debug.h"
tsms_tpdu_message_t* _tsms_tpdu_status_report_deserialize(const void* data, size_t size)
{
return tsk_null;
}
int _tsms_tpdu_status_report_serialize(const tsms_tpdu_status_report_t* self, tsk_buffer_t* output)
{
uint8_t _1byte;
if(!self){
return -1;
}
/* SMSC address */
#if TSMS_TPDU_APPEND_SMSC
tsms_address_serialize(self->smsc, output);
#endif
/* SMS-STATUS-REPORT first Octect:
- TP-Message-Type-Indicator(2b)
- TP-More-Messages-to-Send(1b)
- TP-Loop-Prevention(1b)
- TP-User-Data-Header-Indicator(1b)
- TP-Status-Report-Qualifier(1b)
+----+----+----+----+----+----+----+----+
| |UDHI| SRQ| |LP |MMS | MTI |
+----+----+----+----+----+----+----+----+
*/
_1byte = (TSMS_TPDU_MESSAGE(self)->mti & 0xF3); /*2b*/
_1byte |= ((uint8_t)self->mms) << 2 /*1b*/
| ((uint8_t)self->lp) << 3 /*1b*/
/*1b (unused)*/
| ((uint8_t)self->srq) << 5 /*1b*/
| ((uint8_t)self->udhi) << 6; /*1b*/
tsk_buffer_append(output, &_1byte, 1);
/* 3GPP TS 23.040 ==> 9.2.3.6 TP-Message-Reference (TP-MR) */
tsk_buffer_append(output, &self->mr, 1); /*0-255 ==> 1o*/
/* 3GPP TS 23.040 ==> xxxx TP-Recipient-Address (TP-RA) */
tsms_address_serialize(self->ra, output);
/* 3GPP TS 23.040 ==> TP-Service-Centre-Time-Stamp (TP-SCTS) */
tsk_buffer_append(output, self->scts, sizeof(self->scts)); /*7o*/
/* 3GPP TS 23.040 ==> xxxx TP Discharge Time(TP-DT) */
tsk_buffer_append(output, self->dt, sizeof(self->dt)); /*7o*/
/* 3GPP TS 23.040 ==> 9.2.3.15 TP Status(TP-ST) */
tsk_buffer_append(output, &self->st, 1); /*0-255 ==> 1o*/
/* 3GPP TS 23.040 ==> xxxx TP-Parameter-Indicator (TP-PI) */
tsk_buffer_append(output, &self->pi, 1); /* 1o*/
/* 3GPP TS 23.040 ==> 9.2.3.9 TP-Protocol-Identifier (TP-PID) */
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->pid, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.10 TP-Data-Coding-Scheme (TP-DCS) */
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->dcs, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.16 TP-User-Data-Length (TP-UDL) */
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->udl, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.24 TP-User Data (TP-UD) */
tsk_buffer_append(output, TSK_BUFFER_DATA(TSMS_TPDU_MESSAGE(self)->ud), TSK_BUFFER_SIZE(TSMS_TPDU_MESSAGE(self)->ud));
return 0;
}
// submit=0->SMS-COMMAND else SMS-COMMAND see 23.04 section 9.2.3.26 (TP-SRQ)
tsms_tpdu_status_report_handle_t* tsms_tpdu_status_report_create(uint8_t mr, tsms_address_string_t smsc, tsms_address_string_t recipient, tsms_tpdu_status_type_t status, tsk_bool_t submit)
{
tsms_tpdu_status_report_t* ret = tsk_null;
if(!(ret = tsk_object_new(tsms_tpdu_status_report_def_t, mr, smsc, recipient, status))){
goto bail;
}
bail:
return ret;
}
//=================================================================================================
// SMS TPDU SMS-SUMBIT object definition
//
static tsk_object_t* _tsms_tpdu_status_report_create(tsk_object_t * self, va_list * app)
{
tsms_tpdu_status_report_t *status_report = self;
if(status_report){
const char* smsc, *recipient;
uint8_t mr;
tsms_tpdu_status_type_t status;
tsk_bool_t submit;
#if defined(__GNUC__)
mr = (uint8_t)va_arg(*app, unsigned);
#else
mr = va_arg(*app, uint8_t);
#endif
smsc = va_arg(*app, const char*);
recipient = va_arg(*app, const char*);
status = va_arg(*app, tsms_tpdu_status_type_t);
submit = va_arg(*app, tsk_bool_t);
/* init base*/
tsms_tpdu_message_init(TSMS_TPDU_MESSAGE(status_report), tsms_tpdu_mti_status_report_mt);
/* init self */
status_report->mr = mr;
status_report->smsc = TSMS_ADDRESS_SMSC_CREATE(smsc);
status_report->ra = TSMS_ADDRESS_DA_CREATE(recipient);
status_report->st = status;
status_report->mms = TSMS_TPDU_DEFAULT_MMS;
status_report->srq = submit?0:1/*SMS-COMAND*/;
}
else{
TSK_DEBUG_ERROR("Null");
}
return self;
}
static tsk_object_t* tsms_tpdu_status_report_destroy(tsk_object_t * self)
{
tsms_tpdu_status_report_t *status_report = self;
if(status_report){
/*deinit base*/
tsms_tpdu_message_deinit(TSMS_TPDU_MESSAGE(status_report));
/*deinit self*/
TSK_OBJECT_SAFE_FREE(status_report->smsc);
TSK_OBJECT_SAFE_FREE(status_report->ra);
}
else{
TSK_DEBUG_ERROR("Null");
}
return self;
}
static const tsk_object_def_t tsms_tpdu_status_report_def_s =
{
sizeof(tsms_tpdu_status_report_t),
_tsms_tpdu_status_report_create,
tsms_tpdu_status_report_destroy,
tsk_null,
};
const tsk_object_def_t *tsms_tpdu_status_report_def_t = &tsms_tpdu_status_report_def_s;

View File

@ -29,21 +29,26 @@
*/
#include "tinySMS/tpdu/tsms_tpdu_submit.h"
#include "tinySMS/tsms_packing.h"
#include "tsk_string.h"
#include "tsk_memory.h"
#include "tsk_debug.h"
#include <string.h> /* strlen() */
tsms_tpdu_message_t* _tsms_tpdu_submit_deserialize(const void* data, size_t size)
{
return tsk_null;
}
int tsms_tpdu_submit_serialize(const tsms_address_t* smsc, const tsms_tpdu_submit_t* self, tsk_buffer_t* output)
int _tsms_tpdu_submit_serialize(const tsms_tpdu_submit_t* self, tsk_buffer_t* output)
{
uint8_t _1byte;
if(!self){
return -1;
}
/* SMSC address */
#if TSMS_TPDU_APPEND_SMSC
tsms_address_serialize(smsc, output);
tsms_address_serialize(self->smsc, output);
#endif
/* SMS-SUBMIT first Octect:
@ -54,16 +59,15 @@ int tsms_tpdu_submit_serialize(const tsms_address_t* smsc, const tsms_tpdu_submi
- TP-User-Data-Header-Indicator(1b)
- TP-Status-Report-Request(1b)
+----+----+----+--------+----+--------+
|RP |UDHI|SRR |VPF | RD | MTI |
+----+----+----+--------+----+--------+
+----+----+----+----+----+----+----+----+
|RP |UDHI|SRR |VPF | RD | MTI |
+----+----+----+----+----+----+----+----+
*/
_1byte = (TSMS_TPDU_MESSAGE(self)->mti & 0xF3); /*2b*/
_1byte |= ((uint8_t)self->rd) << 2; /*1b*/
_1byte |= ((uint8_t)self->vpf) << 3; /*2b*/
_1byte |= ((uint8_t)self->srr) << 5; /*1b*/
_1byte |= ((uint8_t)self->udhi) << 6; /*1b*/
//_1byte |= ((uint8_t)self->) << 7; /*1b*/
_1byte |= ((uint8_t)self->rd) << 2 /*1b*/
| ((uint8_t)self->vpf) << 3 /*2b*/
| ((uint8_t)self->srr) << 5 /*1b*/
| ((uint8_t)self->udhi) << 6; /*1b*/
tsk_buffer_append(output, &_1byte, 1);
/* 3GPP TS 23.040 ==> 9.2.3.6 TP-Message-Reference (TP-MR) */
@ -72,102 +76,67 @@ int tsms_tpdu_submit_serialize(const tsms_address_t* smsc, const tsms_tpdu_submi
/* 3GPP TS 23.040 ==> 9.2.3.8 TP-Destination-Address (TP-DA) */
tsms_address_serialize(self->da, output);
/* GSM 03.40 ==> 9.2.3.9 TP-Protocol-Identifier (TP-PID) */
tsk_buffer_append(output, &self->pid, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.9 TP-Protocol-Identifier (TP-PID) */
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->pid, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.10 TP-Data-Coding-Scheme (TP-DCS) */
tsk_buffer_append(output, &self->dcs, 1); /*1o*/
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->dcs, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.12 TP-Validity-Period
* Only TP-VP (Relative format) is supported.*/
* Only TP-VP (Relative format) is supported. This field is used in conjonction with TP-VPF. */
tsk_buffer_append(output, &self->vp, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.16 TP-User-Data-Length (TP-UDL) */
tsk_buffer_append(output, &self->udl, 1); /*1o*/
tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->udl, 1); /*1o*/
/* 3GPP TS 23.040 ==> 9.2.3.24 TP-User Data (TP-UD) */
tsk_buffer_append(output, TSK_BUFFER_DATA(self->ud), TSK_BUFFER_SIZE(self->ud));
tsk_buffer_append(output, TSK_BUFFER_DATA(TSMS_TPDU_MESSAGE(self)->ud), TSK_BUFFER_SIZE(TSMS_TPDU_MESSAGE(self)->ud));
return 0;
}
int tsms_submit_set_alpha(tsms_tpdu_submit_t* self, tsms_alphabet_t alpha)
tsms_tpdu_submit_handle_t* tsms_tpdu_submit_create(uint8_t mr, tsms_address_string_t smsc, tsms_address_string_t dest)
{
/* SMS alphabet values as per 3GPP TS 23.038 v911 section 4.
* Part of TP-DCS (SMS Data Coding Scheme).
*/
if(self){
self->dcs = ((self->dcs & 0xF3) | (alpha << 2)); /* Bit3 and Bit2 */
return 0;
tsms_tpdu_submit_t* ret = tsk_null;
if(!(ret = tsk_object_new(tsms_tpdu_submit_def_t, mr, smsc, dest))){
goto bail;
}
return -1;
}
int tsms_submit_set_usrdata(tsms_tpdu_submit_t* self, const char* ascii, tsms_alphabet_t alpha)
{
if(tsk_strnullORempty(ascii)){
TSK_DEBUG_WARN("User data is Null or Empty");
return -1;
}
// update DCS
tsms_submit_set_alpha(self, alpha);
// remove old ud
TSK_OBJECT_SAFE_FREE(self->ud);
/* 3GPP TS 23.040 ==> 9.2.3.16 TP-User-Data-Length (TP-UDL)
* (alpha = SMS_ALPHA_7bit) ==> number of septets.
* ((alpha == SMS_ALPHA_8bit) || (alpha == SMS_ALPHA_UCS2)) ==> number of octes.
*/
/* 3GPP TS 23.040 ==> 9.2.3.24 TP-User Data (TP-UD) */
switch(alpha){
case tsms_alpha_7bit:
{
self->udl = strlen(ascii);
self->ud = tsms_pack_to_7bit(ascii);
}
break;
case tsms_alpha_8bit:
{
if((self->ud = tsms_pack_to_8bit(ascii))){
self->udl = self->ud->size;
}
else{
self->udl = 0;
}
}
break;
case tsms_alpha_ucs2:
{
if((self->ud = tsms_pack_to_ucs2(ascii))){
self->udl = self->ud->size;
}
else{
self->udl = 0;
}
}
break;
default:
{
TSK_DEBUG_ERROR("Invalid Alphabet.");
return -2;
}
}
return 0;
bail:
return ret;
}
//=================================================================================================
// SMS TPDU SMS-COMMAND object definition
// SMS TPDU SMS-SUMBIT object definition
//
static tsk_object_t* tsms_tpdu_submit_create(tsk_object_t * self, va_list * app)
static tsk_object_t* _tsms_tpdu_submit_create(tsk_object_t * self, va_list * app)
{
tsms_tpdu_submit_t *submit = self;
if(submit){
//tsk_bool_t orig = va_arg(*app, tsk_bool_t);
TSMS_TPDU_MESSAGE(submit)->mti = tsms_tpdu_mti_submit_mo;
TSMS_TPDU_MESSAGE(submit)->serialize = TSMS_TPDU_MESSAGE_SERIALIZE_F(tsms_tpdu_submit_serialize);
const char* smsc, *dest;
uint8_t mr;
#if defined(__GNUC__)
mr = (uint8_t)va_arg(*app, unsigned);
#else
mr = va_arg(*app, uint8_t);
#endif
smsc = va_arg(*app, const char*);
dest = va_arg(*app, const char*);
/* init base*/
tsms_tpdu_message_init(TSMS_TPDU_MESSAGE(submit), tsms_tpdu_mti_submit_mo);
/* init self */
submit->mr = mr;
submit->smsc = TSMS_ADDRESS_SMSC_CREATE(smsc);
submit->da = TSMS_ADDRESS_DA_CREATE(dest);
submit->vp[0] = TSMS_TPDU_DEFAULT_VP;
submit->vpf = TSMS_TPDU_DEFAULT_VPF;
}
else{
TSK_DEBUG_ERROR("Null");
}
return self;
}
@ -176,17 +145,22 @@ static tsk_object_t* tsms_tpdu_submit_destroy(tsk_object_t * self)
{
tsms_tpdu_submit_t *submit = self;
if(submit){
TSK_OBJECT_SAFE_FREE(submit->ud);
/*deinit base*/
tsms_tpdu_message_deinit(TSMS_TPDU_MESSAGE(submit));
/*deinit self*/
TSK_OBJECT_SAFE_FREE(submit->smsc);
TSK_OBJECT_SAFE_FREE(submit->da);
}
else{
TSK_DEBUG_ERROR("Null");
}
return self;
}
static const tsk_object_def_t tsms_tpdu_submit_def_s =
{
sizeof(tsms_tpdu_submit_t),
tsms_tpdu_submit_create,
_tsms_tpdu_submit_create,
tsms_tpdu_submit_destroy,
tsk_null,
};

View File

@ -66,7 +66,7 @@ bail:
int tsms_address_serialize(const tsms_address_t* address, tsk_buffer_t* output)
{
char* number = tsk_null;
size_t len = 0;
size_t i, num_len/*real len*/;
uint8_t type_of_address;
if(!address ||!output){
return -1;
@ -84,19 +84,34 @@ int tsms_address_serialize(const tsms_address_t* address, tsk_buffer_t* output)
number = tsms_address_swap(address->digits);
if(number){
len = (address->type == tsms_addr_smsc) ?
size_t len = (address->type == tsms_addr_smsc) ?
((strlen(number)/2) + 1) /* Number of octets plus 1. */
: strlen(number); /* Number of BCD digits */
: strlen(address->digits); /* Number of BCD digits */
/* 1 - Address-Length */
tsk_buffer_append(output, &len, 1);
}
/* 1 - Address-Length */
tsk_buffer_append(output, &len, 1);
else{
/* 1 - Address-Length */
static uint8_t _1bytes = 0x00;
tsk_buffer_append(output, &_1bytes, 1);
goto bail;
}
/* 2 - Type-of-Address */
type_of_address = (address->npi | (((address->ton << 4) | 0x80)));
tsk_buffer_append(output, &type_of_address, 1);
/* 3 - Phone number in semi octets */
tsk_buffer_append(output, number, len);
/* 3 - Phone number in semi octets (BCD digits) */
if(((num_len = strlen(number)))){
unsigned _1bytes; /* do not use neither int8_t nor uint8_t */
/* as number comes from swap ==> num_len not odd */
for(i=0; i<num_len; i+=2){
if(sscanf(&number[i], "%2x", &_1bytes)){ /*do not use tsk_atox(str), because str should end with '\0'.*/
tsk_buffer_append(output, &_1bytes, 1);
}
}
}
bail:
TSK_FREE(number);
return 0;
}

View File

@ -0,0 +1,226 @@
/*
* Copyright (C) 2009 Mamadou Diop.
*
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
*
* This file is part of Open Source Doubango Framework.
*
* DOUBANGO is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* DOUBANGO is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with DOUBANGO.
*
*/
/**@file tsms_common.c
* @brief SMS Commons (3GPP TS 23.038 and al.).
*
* @author Mamadou Diop <diopmamadou(at)doubango.org>
*
* @date Created: Sat Nov 8 16:54:58 2009 mdiop
*/
#include "tinySMS/tsms_common.h"
#include "tinySMS/tsms_packing.h"
#include "tsk_object.h"
#include "tsk_string.h"
#include "tsk_debug.h"
#include <string.h> /* strlen() */
extern tsms_tpdu_message_t* _tsms_tpdu_submit_deserialize(const void* data, size_t size);
extern tsms_tpdu_message_t* _tsms_tpdu_deliver_deserialize(const void* data, size_t size);
extern tsms_tpdu_message_t* _tsms_tpdu_command_deserialize(const void* data, size_t size);
extern tsms_tpdu_message_t* _tsms_tpdu_report_deserialize(const void* data, size_t size);
extern tsms_tpdu_message_t* _tsms_tpdu_status_report_deserialize(const void* data, size_t size);
extern int _tsms_tpdu_submit_serialize(const tsms_tpdu_message_t* self, tsk_buffer_t* output);
extern int _tsms_tpdu_deliver_serialize(const tsms_tpdu_message_t* self, tsk_buffer_t* output);
extern int _tsms_tpdu_command_serialize(const tsms_tpdu_message_t* self, tsk_buffer_t* output);
extern int _tsms_tpdu_report_serialize(const tsms_tpdu_message_t* self, tsk_buffer_t* output);
extern int _tsms_tpdu_status_report_serialize(const tsms_tpdu_message_t* self, tsk_buffer_t* output);
int tsms_tpdu_message_init(tsms_tpdu_message_t* self, tsms_tpdu_mti_t mti)
{
if(self){
self->mti = mti;
self->pid = TSMS_TPDU_DEFAULT_PID;
self->dcs = TSMS_TPDU_DEFAULT_DCS;
return 0;
}
return -1;
}
/**
*/
int tsms_tpdu_message_serialize(const tsms_tpdu_message_t* self, tsk_buffer_t* output, tsk_bool_t MobOrig)
{
if(!self){
return -1;
}
/* 3GPP TS 23.040 - 9.2.3.1 TP Message Type Indicator (TP MTI)
bit1 bit0 Message type
0 0 SMS-DELIVER (in the direction SC to MS)
0 0 SMS-DELIVER-REPORT (in the direction MS to SC)
1 0 SMS-STATUS-REPORT (in the direction SC to MS)
1 0 SMS-COMMAND (in the direction MS to SC)
0 1 SMS-SUBMIT (in the direction MS to SC)
0 1 SMS-SUBMIT-REPORT (in the direction SC to MS)
1 1 Reserved
*/
if(MobOrig){ /* MO */
switch(self->mti){
case tsms_tpdu_mti_deliver_report_mo: return _tsms_tpdu_report_serialize(self, output); /* SMS-DELIVER-REPORT */
case tsms_tpdu_mti_command_mo: return _tsms_tpdu_command_serialize(self, output); /* SMS-COMMAND */
case tsms_tpdu_mti_submit_mo: return _tsms_tpdu_submit_serialize(self, output); /* SMS-SUBMIT */
default: return -2;
}
}
else{ /* MT */
switch(self->mti){
case tsms_tpdu_mti_deliver_mt: return _tsms_tpdu_deliver_serialize(self, output); /* SMS-DELIVER */
case tsms_tpdu_mti_status_report_mt: return _tsms_tpdu_status_report_serialize(self, output); /* SMS-STATUS-REPORT */
case tsms_tpdu_mti_submit_report_mt: return _tsms_tpdu_report_serialize(self, output); /* SMS-SUBMIT-REPORT */
default: return -2;
}
}
}
tsms_tpdu_message_t* tsms_tpdu_message_deserialize(const void* data, size_t size, tsk_bool_t MobOrig)
{
tsms_tpdu_mti_t mti;
if(!data || size<=1){
TSK_DEBUG_ERROR("Invalid parameter.");
return tsk_null;
}
mti = (*((uint8_t*)data) & 0x03);
/* 3GPP TS 23.040 - 9.2.3.1 TP Message Type Indicator (TP MTI)
bit1 bit0 Message type
0 0 SMS-DELIVER (in the direction SC to MS)
0 0 SMS-DELIVER-REPORT (in the direction MS to SC)
1 0 SMS-STATUS-REPORT (in the direction SC to MS)
1 0 SMS-COMMAND (in the direction MS to SC)
0 1 SMS-SUBMIT (in the direction MS to SC)
0 1 SMS-SUBMIT-REPORT (in the direction SC to MS)
1 1 Reserved
*/
if(MobOrig){ /* MO */
switch(mti){
case tsms_tpdu_mti_deliver_report_mo: return _tsms_tpdu_report_deserialize(data, size); /* SMS-DELIVER-REPORT */
case tsms_tpdu_mti_command_mo: return _tsms_tpdu_command_deserialize(data, size); /* SMS-COMMAND */
case tsms_tpdu_mti_submit_mo: return _tsms_tpdu_submit_deserialize(data, size); /* SMS-SUBMIT */
default: return tsk_null;
}
}
else{ /* MT */
switch(mti){
case tsms_tpdu_mti_deliver_mt: return _tsms_tpdu_deliver_deserialize(data, size); /* SMS-DELIVER */
case tsms_tpdu_mti_status_report_mt: return _tsms_tpdu_status_report_deserialize(data, size); /* SMS-STATUS-REPORT */
case tsms_tpdu_mti_submit_report_mt: return _tsms_tpdu_report_deserialize(data, size); /* SMS-SUBMIT-REPORT */
default: return tsk_null;
}
}
}
char* tsms_tpdu_message_tostring(const tsms_tpdu_message_t* self, tsk_bool_t MobOrig)
{
char* ret = tsk_null;
tsk_buffer_t* output = tsk_null;
if(!self){
goto bail;
}
if((output = TSK_BUFFER_CREATE_NULL())){
if(!tsms_tpdu_message_serialize(self, output, MobOrig)){
ret = tsk_strndup(output->data, output->size);
}
TSK_OBJECT_SAFE_FREE(output);
}
bail:
return ret;
}
char* tsms_tpdu_message_tohexastring(const tsms_tpdu_message_t* self, tsk_bool_t MobOrig)
{
char* ret = tsk_null;
tsk_buffer_t* output = tsk_null;
if(!self){
goto bail;
}
if((output = TSK_BUFFER_CREATE_NULL())){
if(!tsms_tpdu_message_serialize(self, output, MobOrig)){
size_t i;
for(i=0;i<output->size;i++){
tsk_strcat_2(&ret, "%.2X", *(TSK_BUFFER_TO_U8(output)+i));
}
}
TSK_OBJECT_SAFE_FREE(output);
}
bail:
return ret;
}
int tsms_tpdu_message_set_userdata(tsms_tpdu_message_t* self, const tsk_buffer_t* udata, tsms_alphabet_t alpha)
{
if(!self || !udata){
return -1;
}
/* SMS alphabet values as per 3GPP TS 23.038 v911 section 4.
* Part of TP-DCS (SMS Data Coding Scheme).
*/
self->dcs = ((self->dcs & 0xF3) | (alpha << 2)); /* Bit3 and Bit2 */
TSK_OBJECT_SAFE_FREE(self->ud);
/* 3GPP TS 23.040 ==> 9.2.3.16 TP-User-Data-Length (TP-UDL)
* (alpha = SMS_ALPHA_7bit) ==> number of septets.
* ((alpha == SMS_ALPHA_8bit) || (alpha == SMS_ALPHA_UCS2)) ==> number of octes.
*/
/* 3GPP TS 23.040 ==> 9.2.3.24 TP-User Data (TP-UD) */
switch(alpha){
case tsms_alpha_7bit: {
self->udl = (udata->size) + (udata->size/7);
self->ud = TSK_BUFFER_CREATE(udata->data, udata->size);
}
break;
case tsms_alpha_8bit:
case tsms_alpha_ucs2: {
self->udl = udata->size;
self->ud = TSK_BUFFER_CREATE(udata->data, udata->size);
}
break;
default:
{
TSK_DEBUG_ERROR("Invalid Alphabet.");
return -2;
}
}
return 0;
}
int tsms_tpdu_message_deinit(tsms_tpdu_message_t* self)
{
if(self){
TSK_OBJECT_SAFE_FREE(self->ud);
return 0;
}
return -1;
}

View File

@ -30,7 +30,7 @@ char* tohex(uint8_t* ptr, size_t size)
char* ret = tsk_null;
size_t i;
for(i=0;i<size;i++){
tsk_strcat_2(&ret, "%.2x", *ptr++);
tsk_strcat_2(&ret, "%.2X", *ptr++);
}
return ret;
}

View File

@ -22,22 +22,114 @@
#ifndef _TEST_SMSTPDU_H
#define _TEST_SMSTPDU_H
#define USER_DATA "hellohello"
static uint8_t __pdu_last_mr = 0;
void test_submit()
{
int ret;
tsms_tpdu_submit_handle_t* submit = tsk_null;
tsk_buffer_t* udata = tsk_null;
char* hex;
submit = tsms_tpdu_submit_create(__pdu_last_mr++, "+331000000", "+3361234567");
/* set user data */
if((udata = tsms_pack_to_7bit(USER_DATA))){
ret = tsms_tpdu_submit_set_userdata(submit, udata, tsms_alpha_7bit);
if((hex = tsms_tpdu_submit_tohexastring(submit))){
TSK_DEBUG_INFO("SMS-SUBMIT=%s", hex);
TSK_FREE(hex);
}
TSK_OBJECT_SAFE_FREE(udata);
}
TSK_OBJECT_SAFE_FREE(submit);
}
void test_deliver()
{
int ret;
tsms_tpdu_deliver_handle_t* deliver = tsk_null;
tsk_buffer_t* udata = tsk_null;
char* hex;
deliver = tsms_tpdu_deliver_create("+27381000015", "+46708251358");
/* set user data */
if((udata = tsms_pack_to_7bit(USER_DATA))){
ret = tsms_tpdu_deliver_set_userdata(deliver, udata, tsms_alpha_7bit);
if((hex = tsms_tpdu_deliver_tohexastring(deliver))){
TSK_DEBUG_INFO("SMS-DELIVER=%s", hex);
TSK_FREE(hex);
}
TSK_OBJECT_SAFE_FREE(udata);
}
TSK_OBJECT_SAFE_FREE(deliver);
}
void test_report()
{
int ret;
tsms_tpdu_report_handle_t* report = tsk_null;
tsk_buffer_t* udata = tsk_null;
char* hex;
report = tsms_tpdu_report_create("+27381000015", tsk_false, tsk_true);
/* set user data */
if((udata = tsms_pack_to_7bit(USER_DATA))){
ret = tsms_tpdu_deliver_set_userdata(report, udata, tsms_alpha_7bit);
if((hex = tsms_tpdu_deliver_tohexastring(report))){
TSK_DEBUG_INFO("SMS-DELIVER-REPORT for RP-ERROR=%s", hex);
TSK_FREE(hex);
}
TSK_OBJECT_SAFE_FREE(udata);
}
TSK_OBJECT_SAFE_FREE(report);
}
void test_command()
{
tsms_tpdu_command_handle_t* command = tsk_null;
char* hex;
command = tsms_tpdu_command_create(__pdu_last_mr++, "+3310000", "+332666", 0xF8, tsms_tpdu_cmd_delete);
if((hex = tsms_tpdu_command_tohexastring(command))){
TSK_DEBUG_INFO("SMS-COMMAND=%s", hex);
TSK_FREE(hex);
}
TSK_OBJECT_SAFE_FREE(command);
}
void test_sreport()
{
tsms_tpdu_status_report_handle_t* sreport = tsk_null;
char* hex;
sreport = tsms_tpdu_status_report_create(__pdu_last_mr++, "+3310000", "+332666", tsms_tpdu_status_busy, tsk_true);
if((hex = tsms_tpdu_command_tohexastring(sreport))){
TSK_DEBUG_INFO("SMS-STATUS-REPORT=%s", hex);
TSK_FREE(hex);
}
TSK_OBJECT_SAFE_FREE(sreport);
}
void test_tpdu()
{
static uint8_t __pdu_last_mr = 1;
tsms_tpdu_ctx_handle_t* handle;
tsk_buffer_t* buffer = tsk_null;
char* temp;
handle = tsms_pdu_ctx_create(__pdu_last_mr++, "+331000000", "+3361234567");
if((buffer = tsms_pdu_ctx_getSUBMIT(handle))){
TSK_OBJECT_SAFE_FREE(buffer);
}
TSK_OBJECT_SAFE_FREE(handle);
test_submit();
test_deliver();
test_report();
test_command();
test_sreport();
}
#endif /* _TEST_SMSTPDU_H */

View File

@ -193,6 +193,10 @@
RelativePath="..\..\tinySMS\include\tinysms\tsms.h"
>
</File>
<File
RelativePath="..\..\tinySMS\include\tinysms\tsms_address.h"
>
</File>
<File
RelativePath="..\..\tinySMS\include\tinysms\tsms_common.h"
>
@ -251,6 +255,14 @@
RelativePath="..\..\tinySMS\src\tsms.c"
>
</File>
<File
RelativePath="..\..\tinySMS\src\tsms_address.c"
>
</File>
<File
RelativePath="..\..\tinySMS\src\tsms_common.c"
>
</File>
<File
RelativePath="..\..\tinySMS\src\tsms_packing.c"
>