/* Copyright (C) 2007-2008 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program 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.
*/

#pragma once

#include <time.h>

#ifdef __cplusplus
extern "C" {
#endif

/** MESSAGE TEXT
 **/
/* convert a quoted message text into a utf8 string. Note: you can use 'str' as the destination buffer
 * with the current implementation. always return the number of utf8 bytes corresponding to the original
 * message string, even if utf8 is NULL and utf8len is 0
 */
extern int  sms_utf8_from_message_str( const char*  str, int  strlen, unsigned char*  utf8, int  utf8len );

/* the equivalent in the opposite direction
 */
extern int  sms_utf8_to_message_str( const unsigned char*  utf8, int  utf8len, char*  str, int  strlen );

/** TIMESTAMPS
 **/

/* An SMS timestamp structure */
typedef struct {
    unsigned char  data[7];
} SmsTimeStampRec, *SmsTimeStamp;

extern void  sms_timestamp_now( SmsTimeStamp  stamp );
extern int   sms_timestamp_to_tm( SmsTimeStamp  stamp, struct tm*  tm );

/** SMS ADDRESSES
 **/

#define  SMS_ADDRESS_MAX_SIZE  16

typedef struct {
    unsigned char  len;
    unsigned char  toa;
    unsigned char  data[ SMS_ADDRESS_MAX_SIZE ];
} SmsAddressRec, *SmsAddress;

extern int  sms_address_from_str( SmsAddress  address, const char*  src, int  srclen );
extern int  sms_address_to_str( SmsAddress  address, char*  src, int  srclen );

extern int  sms_address_from_bytes( SmsAddress  address, const unsigned char*  buf, int  buflen );
extern int  sms_address_to_bytes  ( SmsAddress  address, unsigned char*  buf, int  bufsize );
extern int  sms_address_from_hex  ( SmsAddress  address, const char*  hex, int  hexlen );
extern int  sms_address_to_hex    ( SmsAddress  address, char*   hex, int  hexsize );

/** SMS PROTOCOL DATA UNITS
 **/

typedef struct SmsPDURec*   SmsPDU;

extern SmsPDU*  smspdu_create_deliver_utf8( const unsigned char*   utf8,
                                            int                    utf8len,
                                            const SmsAddressRec*   sender_address,
                                            const SmsTimeStampRec* timestamp );

extern void     smspdu_free_list( SmsPDU*  pdus );

extern SmsPDU   smspdu_create_from_hex( const char*  hex, int  hexlen );

extern int      smspdu_to_hex( SmsPDU  pdu, char*  hex, int  hexsize );

/* free a given SMS PDU */
extern void     smspdu_free( SmsPDU  pdu );

typedef enum {
    SMS_PDU_INVALID = 0,
    SMS_PDU_DELIVER,
    SMS_PDU_SUBMIT,
    SMS_PDU_STATUS_REPORT
} SmsPduType;

extern SmsPduType    smspdu_get_type( SmsPDU  pdu );

/* retrieve the sender address of a SMS-DELIVER pdu, returns -1 otherwise */
extern int  smspdu_get_sender_address( SmsPDU  pdu, SmsAddress  address );

/* retrieve the service center timestamp of a SMS-DELIVER pdu, return -1 otherwise */
extern int  smspdu_get_sc_timestamp( SmsPDU  pdu, SmsTimeStamp  timestamp );

/* retrieve the receiver address of a SMS-SUBMIT pdu, return -1 otherwise */
extern int  smspdu_get_receiver_address( SmsPDU  pdu, SmsAddress  address );

extern int  smspdu_get_ref      ( SmsPDU  pdu );
extern int  smspdu_get_max_index( SmsPDU  pdu );
extern int  smspdu_get_cur_index( SmsPDU  pdu );

/* get the message embedded in a SMS PDU as a utf8 byte array, returns the length of the message in bytes */
/* or -1 in case of error */
extern int  smspdu_get_text_message( SmsPDU  pdu, unsigned char*  utf8, int  utf8len );

/** SMS SUBMIT RECEIVER
 ** collects one or more SMS-SUBMIT PDUs to generate a single message to deliver
 **/

typedef struct SmsReceiverRec  *SmsReceiver;

extern SmsReceiver   sms_receiver_create( void );
extern void          sms_receiver_destroy( SmsReceiver  rec );

extern int           sms_receiver_add_submit_pdu( SmsReceiver  rec, SmsPDU       submit_pdu );
extern int           sms_receiver_get_text_message( SmsReceiver  rec, int  index, unsigned char*  utf8, int  utf8len );
extern SmsPDU*       sms_receiver_create_deliver( SmsReceiver  rec, int  index, const SmsAddressRec*  from );

#ifdef __cplusplus
}
#endif
