191 lines
5.7 KiB
C
191 lines
5.7 KiB
C
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This program 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 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* 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:
|
|
*
|
|
* Copyright (C) 2011 - 2012 Red Hat, Inc.
|
|
* Copyright (C) 2012 Google, Inc.
|
|
*/
|
|
|
|
#include <ctype.h>
|
|
#include <string.h>
|
|
|
|
#include <glib.h>
|
|
|
|
#include <ModemManager.h>
|
|
#define _LIBMM_INSIDE_MM
|
|
#include <libmm-glib.h>
|
|
|
|
#include "mm-sms-part.h"
|
|
#include "mm-charsets.h"
|
|
#include "mm-log.h"
|
|
|
|
struct _MMSmsPart {
|
|
guint index;
|
|
MMSmsPduType pdu_type;
|
|
gchar *smsc;
|
|
gchar *timestamp;
|
|
gchar *discharge_timestamp;
|
|
gchar *number;
|
|
gchar *text;
|
|
MMSmsEncoding encoding;
|
|
GByteArray *data;
|
|
gint class;
|
|
guint validity_relative;
|
|
gboolean delivery_report_request;
|
|
guint message_reference;
|
|
/* NOT a MMSmsDeliveryState, which just includes the known values */
|
|
guint delivery_state;
|
|
|
|
gboolean should_concat;
|
|
guint concat_reference;
|
|
guint concat_max;
|
|
guint concat_sequence;
|
|
|
|
/* CDMA specific */
|
|
MMSmsCdmaTeleserviceId cdma_teleservice_id;
|
|
MMSmsCdmaServiceCategory cdma_service_category;
|
|
};
|
|
|
|
void
|
|
mm_sms_part_free (MMSmsPart *self)
|
|
{
|
|
g_free (self->discharge_timestamp);
|
|
g_free (self->timestamp);
|
|
g_free (self->smsc);
|
|
g_free (self->number);
|
|
g_free (self->text);
|
|
if (self->data)
|
|
g_byte_array_unref (self->data);
|
|
g_slice_free (MMSmsPart, self);
|
|
}
|
|
|
|
#define PART_GET_FUNC(type, name) \
|
|
type \
|
|
mm_sms_part_get_##name (MMSmsPart *self) \
|
|
{ \
|
|
return self->name; \
|
|
}
|
|
|
|
#define PART_SET_FUNC(type, name) \
|
|
void \
|
|
mm_sms_part_set_##name (MMSmsPart *self, \
|
|
type value) \
|
|
{ \
|
|
self->name = value; \
|
|
}
|
|
|
|
#define PART_SET_TAKE_STR_FUNC(name) \
|
|
void \
|
|
mm_sms_part_set_##name (MMSmsPart *self, \
|
|
const gchar *value) \
|
|
{ \
|
|
g_free (self->name); \
|
|
self->name = g_strdup (value); \
|
|
} \
|
|
\
|
|
void \
|
|
mm_sms_part_take_##name (MMSmsPart *self, \
|
|
gchar *value) \
|
|
{ \
|
|
g_free (self->name); \
|
|
self->name = value; \
|
|
}
|
|
|
|
PART_GET_FUNC (guint, index)
|
|
PART_SET_FUNC (guint, index)
|
|
PART_GET_FUNC (MMSmsPduType, pdu_type)
|
|
PART_SET_FUNC (MMSmsPduType, pdu_type)
|
|
PART_GET_FUNC (const gchar *, smsc)
|
|
PART_SET_TAKE_STR_FUNC (smsc)
|
|
PART_GET_FUNC (const gchar *, number)
|
|
PART_SET_TAKE_STR_FUNC (number)
|
|
PART_GET_FUNC (const gchar *, timestamp)
|
|
PART_SET_TAKE_STR_FUNC (timestamp)
|
|
PART_GET_FUNC (const gchar *, discharge_timestamp)
|
|
PART_SET_TAKE_STR_FUNC (discharge_timestamp)
|
|
PART_GET_FUNC (guint, concat_max)
|
|
PART_SET_FUNC (guint, concat_max)
|
|
PART_GET_FUNC (guint, concat_sequence)
|
|
PART_SET_FUNC (guint, concat_sequence)
|
|
PART_GET_FUNC (const gchar *, text)
|
|
PART_SET_TAKE_STR_FUNC (text)
|
|
PART_GET_FUNC (MMSmsEncoding, encoding)
|
|
PART_SET_FUNC (MMSmsEncoding, encoding)
|
|
PART_GET_FUNC (gint, class)
|
|
PART_SET_FUNC (gint, class)
|
|
PART_GET_FUNC (guint, validity_relative)
|
|
PART_SET_FUNC (guint, validity_relative)
|
|
PART_GET_FUNC (gboolean, delivery_report_request)
|
|
PART_SET_FUNC (gboolean, delivery_report_request)
|
|
PART_GET_FUNC (guint, message_reference)
|
|
PART_SET_FUNC (guint, message_reference)
|
|
PART_GET_FUNC (guint, delivery_state)
|
|
PART_SET_FUNC (guint, delivery_state)
|
|
|
|
PART_GET_FUNC (guint, concat_reference)
|
|
|
|
void
|
|
mm_sms_part_set_concat_reference (MMSmsPart *self,
|
|
guint value)
|
|
{
|
|
self->should_concat = TRUE;
|
|
self->concat_reference = value;
|
|
}
|
|
|
|
PART_GET_FUNC (const GByteArray *, data)
|
|
|
|
void
|
|
mm_sms_part_set_data (MMSmsPart *self,
|
|
GByteArray *value)
|
|
{
|
|
if (self->data)
|
|
g_byte_array_unref (self->data);
|
|
self->data = (value ? g_byte_array_ref (value) : NULL);
|
|
}
|
|
|
|
void
|
|
mm_sms_part_take_data (MMSmsPart *self,
|
|
GByteArray *value)
|
|
{
|
|
if (self->data)
|
|
g_byte_array_unref (self->data);
|
|
self->data = value;
|
|
}
|
|
|
|
gboolean
|
|
mm_sms_part_should_concat (MMSmsPart *self)
|
|
{
|
|
return self->should_concat;
|
|
}
|
|
|
|
PART_GET_FUNC (MMSmsCdmaTeleserviceId, cdma_teleservice_id)
|
|
PART_SET_FUNC (MMSmsCdmaTeleserviceId, cdma_teleservice_id)
|
|
PART_GET_FUNC (MMSmsCdmaServiceCategory, cdma_service_category)
|
|
PART_SET_FUNC (MMSmsCdmaServiceCategory, cdma_service_category)
|
|
|
|
MMSmsPart *
|
|
mm_sms_part_new (guint index,
|
|
MMSmsPduType pdu_type)
|
|
{
|
|
MMSmsPart *sms_part;
|
|
|
|
sms_part = g_slice_new0 (MMSmsPart);
|
|
sms_part->index = index;
|
|
sms_part->pdu_type = pdu_type;
|
|
sms_part->encoding = MM_SMS_ENCODING_UNKNOWN;
|
|
sms_part->delivery_state = MM_SMS_DELIVERY_STATE_UNKNOWN;
|
|
sms_part->cdma_teleservice_id = MM_SMS_CDMA_TELESERVICE_ID_UNKNOWN;
|
|
sms_part->cdma_service_category = MM_SMS_CDMA_SERVICE_CATEGORY_UNKNOWN;
|
|
sms_part->class = -1;
|
|
|
|
return sms_part;
|
|
}
|