blob: 4efbbcc5e09f09760db3c164bac40ca345ddfb54 [file] [log] [blame]
/*
*
* Multimedia Messaging Service
*
* Copyright (C) 2010-2011 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <glib.h>
#include <glib/gprintf.h>
#include "mmsutil.h"
static const char *message_type_to_string(enum mms_message_type type)
{
switch (type) {
case MMS_MESSAGE_TYPE_SEND_REQ:
return "send-req";
case MMS_MESSAGE_TYPE_SEND_CONF:
return "send-conf";
case MMS_MESSAGE_TYPE_NOTIFICATION_IND:
return "notification-ind";
case MMS_MESSAGE_TYPE_NOTIFYRESP_IND:
return "notifyresp-ind";
case MMS_MESSAGE_TYPE_RETRIEVE_CONF:
return "retrieve-conf";
case MMS_MESSAGE_TYPE_ACKNOWLEDGE_IND:
return "acknowledge-ind";
case MMS_MESSAGE_TYPE_DELIVERY_IND:
return "delivery-ind";
}
return NULL;
}
static const char *message_rsp_status_to_string(
enum mms_message_rsp_status status)
{
switch (status) {
case MMS_MESSAGE_RSP_STATUS_OK:
return "ok";
case MMS_MESSAGE_RSP_STATUS_ERR_UNSUPPORTED_MESSAGE:
return "error-unsupported-message";
case MMS_MESSAGE_RSP_STATUS_ERR_TRANS_FAILURE:
return "error-transient-failure";
case MMS_MESSAGE_RSP_STATUS_ERR_TRANS_NETWORK_PROBLEM:
return "error-transient-network-problem";
case MMS_MESSAGE_RSP_STATUS_ERR_PERM_FAILURE:
return "error-permanent-failure";
case MMS_MESSAGE_RSP_STATUS_ERR_PERM_SERVICE_DENIED:
return "error-permanent-service-denied";
case MMS_MESSAGE_RSP_STATUS_ERR_PERM_MESSAGE_FORMAT_CORRUPT:
return "error-permanent-message-format-corrupt";
case MMS_MESSAGE_RSP_STATUS_ERR_PERM_SENDING_ADDRESS_UNRESOLVED:
return "error-permanent-sending-address-unresolved";
case MMS_MESSAGE_RSP_STATUS_ERR_PERM_CONTENT_NOT_ACCEPTED:
return "error-permanent-content-not-accepted";
case MMS_MESSAGE_RSP_STATUS_ERR_PERM_LACK_OF_PREPAID:
return "error-permanent-lack-of-prepaid";
}
return NULL;
}
static void dump_notification_ind(struct mms_message *msg)
{
char buf[128];
strftime(buf, 127, "%Y-%m-%dT%H:%M:%S%z", localtime(&msg->ni.expiry));
buf[127] = '\0';
g_print("From: %s\n", msg->ni.from);
g_print("Subject: %s\n", msg->ni.subject);
g_print("Class: %s\n", msg->ni.cls);
g_print("Size: %d\n", msg->ni.size);
g_print("Expiry: %s\n", buf);
g_print("Location: %s\n", msg->ni.location);
}
static void dump_attachment(gpointer data, gpointer user_data)
{
struct mms_attachment *attach = data;
g_print("Attachment:\n");
g_print("\tOffset: %zd\n", attach->offset);
g_print("\tLength: %zd\n", attach->length);
g_print("\tContent-type: %s\n", attach->content_type);
g_print("\tContent-id: %s\n", attach->content_id);
}
static void dump_retrieve_conf(struct mms_message *msg)
{
char buf[128];
strftime(buf, 127, "%Y-%m-%dT%H:%M:%S%z", localtime(&msg->rc.date));
buf[127] = '\0';
g_print("From: %s\n", msg->rc.from);
g_print("To: %s\n", msg->rc.to);
g_print("Subject: %s\n", msg->rc.subject);
g_print("Class: %s\n", msg->rc.cls);
g_print("Priority: %s\n", msg->rc.priority);
g_print("Msg-Id: %s\n", msg->rc.msgid);
g_print("Date: %s\n", buf);
g_slist_foreach(msg->attachments, dump_attachment, NULL);
}
static void dump_send_conf(struct mms_message *msg)
{
g_print("Response-Status: %s\n",
message_rsp_status_to_string(msg->sc.rsp_status));
g_print("Msg-Id: %s\n", msg->sc.msgid);
}
static void dump_send_req(struct mms_message *msg)
{
g_print("To: %s\n", msg->sr.to);
g_slist_foreach(msg->attachments, dump_attachment, NULL);
}
static gboolean check_encoded_msg(const char *filename,
const unsigned char *msg_pdu)
{
struct stat st;
unsigned char *pdu;
int fd;
int i;
int ret;
fd = open(filename, O_RDONLY);
if (fd < 0) {
g_printerr("Failed to open %s\n", filename);
return FALSE;
}
if (fstat(fd, &st) < 0) {
g_printerr("Failed to stat %s\n", filename);
close(fd);
return FALSE;
}
pdu = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (!pdu || pdu == MAP_FAILED) {
g_printerr("Failed to mmap %s\n", filename);
close(fd);
return FALSE;
}
if (g_test_verbose()) {
for (i = 0; i < st.st_size; i++)
g_print("%02x ", pdu[i]);
g_print("\n");
}
ret = memcmp(msg_pdu, pdu, st.st_size);
munmap(pdu, st.st_size);
close(fd);
return ret == 0;
}
/*
* MMS M-Notify.Ind PDU 1
* This PDU shows the decoding of a M-Notify.Ind PDU with below content:
* Overall message size: 68
* MMS message type: notification-ind
* MMS transaction id: OgQKKB
* MMS version: 1.0
* From: Erotik
* Subject: Pin-Ups
* Class: Personal
* Size: 16384
* Expiry: 2011-05-19T10:56:340200
* Location: http://eps3.de/O/Z9IZO
*/
static const unsigned char mms_m_notify_ind_1[] = {
0x8C, 0x82, 0x98, 0x4F, 0x67, 0x51, 0x4B, 0x4B,
0x42, 0x00, 0x8D, 0x90, 0x89, 0x08, 0x80, 0x45,
0x72, 0x6F, 0x74, 0x69, 0x6B, 0x00, 0x96, 0x50,
0x69, 0x6E, 0x2D, 0x55, 0x70, 0x73, 0x00, 0x8A,
0x80, 0x8E, 0x02, 0x40, 0x00, 0x88, 0x05, 0x81,
0x03, 0x03, 0xF4, 0x80, 0x83, 0x68, 0x74, 0x74,
0x70, 0x3A, 0x2F, 0x2F, 0x65, 0x70, 0x73, 0x33,
0x2E, 0x64, 0x65, 0x2F, 0x4F, 0x2F, 0x5A, 0x39,
0x49, 0x5A, 0x4F, 0x00
};
/*
* MMS M-Notify.Ind PDU 2
* This PDU shows the decoding of a M-Notify.Ind PDU without "subject" field
* and below content:
* Overall message size: 93
* MMS message type: notification-ind
* MMS transaction id: wLJeT7THu
* MMS version: 1.0
* From: 15551230000/TYPE=PLMN
* Subject: (null)
* Class: Personal
* Size: 23069
* Expiry: 2011-05-19T14:32:320200
* Location: http://mmsc11:10021/mmsc/1_1?wLJeT7THu
*/
static const unsigned char mms_m_notify_ind_2[] = {
0x8C, 0x82, 0x98, 0x77, 0x4C, 0x4A, 0x65, 0x54,
0x37, 0x54, 0x48, 0x75, 0x00, 0x8D, 0x90, 0x89,
0x17, 0x80, 0x31, 0x35, 0x35, 0x35, 0x31, 0x32,
0x33, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x54, 0x59,
0x50, 0x45, 0x3D, 0x50, 0x4C, 0x4D, 0x4E, 0x00,
0x8A, 0x80, 0x8E, 0x02, 0x5A, 0x1D, 0x88, 0x05,
0x81, 0x03, 0x03, 0xF4, 0x80, 0x83, 0x68, 0x74,
0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6D, 0x6D, 0x73,
0x63, 0x31, 0x31, 0x3A, 0x31, 0x30, 0x30, 0x32,
0x31, 0x2F, 0x6D, 0x6D, 0x73, 0x63, 0x2F, 0x31,
0x5F, 0x31, 0x3F, 0x77, 0x4C, 0x4A, 0x65, 0x54,
0x37, 0x54, 0x48, 0x75, 0x00
};
/*
* MMS M-Notify.Ind PDU 3
* MMS-1.3-con-271: Long Subject field.
* This PDU shows the decoding of a M-Notify.Ind PDU with a maximum length
* "us-ascii" encoded "subject" field value (40 characters) and below content:
* Overall message size: 121
* MMS message type: notification-ind
* MMS transaction id: OgQKKB
* MMS version: 1.0
* From: +44123989100/TYPE=PLMN
* Subject: abcdefghijklmnopqrstuvwxyz0123456789/-+@
* Class: Personal
* Size: 23069
* Expiry: 2011-05-27T10:39:58+0200
* Location: http://eps3.de/O/Z9IZO
*/
static const char mms_m_notify_ind_3[] = "./unit/ni-mms-1-3-con-271.mms";
/*
* MMS M-Notify.Ind PDU 4
* MMS-1.3-con-272: Long X-Mms-Content-Location field in Notification.
* This PDU shows the decoding of a M-Notify.Ind PDU with a maximum length
* "X-Mms-Content-Location field value (100 characters) and below content:
* Overall message size: 170
* MMS message type: notification-ind
* MMS transaction id: OgQKKB
* MMS version: 1.0
* From: +44123989100/TYPE=PLMN
* Subject: MMS-1.3-con-272
* Class: Personal
* Size: 23069
* Expiry: 2011-05-27T10:39:58+0200
* Location: http://abcdefghi/abcdefghi/abcdefghi/abcdefghi/abcdefghi/abcdefghi
* /abcdefghi/abcdefghi/abcdefghi.mms
*/
static const char mms_m_notify_ind_4[] = "./unit/ni-mms-1-3-con-272.mms";
/*
* MMS M-Retrieve.Conf PDU 1
* This PDU shows the decoding of a M-Retrieve.Conf PDU with an "us-ascii"
* encoded text "subject" field and below content:
* Overall message size: 200
* MMS message type: retrieve-conf
* MMS transaction id: 1201657238
* MMS version: 1.3
* From: 49891000/TYPE=PLMN
* To: (null)
* Subject: MMS-1.3-con-212
* Class: (null)
* Priority: (null)
* Msg-Id: mt-212
* Date: 2008-01-30T02:40:380100
*/
static const unsigned char mms_m_retrieve_conf_1[] = {
0x8C, 0x84, 0x98, 0x31, 0x32, 0x30, 0x31, 0x36,
0x35, 0x37, 0x32, 0x33, 0x38, 0x00, 0x8D, 0x93,
0x8B, 0x6D, 0x74, 0x2D, 0x32, 0x31, 0x32, 0x00,
0x85, 0x04, 0x47, 0x9F, 0xD5, 0x96, 0x89, 0x15,
0x80, 0x2B, 0x34, 0x39, 0x38, 0x39, 0x31, 0x30,
0x30, 0x30, 0x2F, 0x54, 0x59, 0x50, 0x45, 0x3D,
0x50, 0x4C, 0x4D, 0x4E, 0x00, 0x96, 0x11, 0x83,
0x4D, 0x4D, 0x53, 0x2D, 0x31, 0x2E, 0x33, 0x2D,
0x63, 0x6F, 0x6E, 0x2D, 0x32, 0x31, 0x32, 0x00,
0x84, 0xA3, 0x01, 0x40, 0x3B, 0x14, 0x83, 0x85,
0x54, 0x65, 0x78, 0x74, 0x5F, 0x75, 0x73, 0x2D,
0x61, 0x73, 0x63, 0x69, 0x69, 0x2E, 0x74, 0x78,
0x74, 0x00, 0x81, 0x83, 0xC0, 0x22, 0x3C, 0x54,
0x65, 0x78, 0x74, 0x5F, 0x75, 0x73, 0x2D, 0x61,
0x73, 0x63, 0x69, 0x69, 0x2E, 0x74, 0x78, 0x74,
0x3E, 0x00, 0x8E, 0x54, 0x65, 0x78, 0x74, 0x5F,
0x75, 0x73, 0x2D, 0x61, 0x73, 0x63, 0x69, 0x69,
0x2E, 0x74, 0x78, 0x74, 0x00, 0x54, 0x68, 0x65,
0x20, 0x71, 0x75, 0x69, 0x63, 0x6B, 0x20, 0x62,
0x72, 0x6F, 0x77, 0x6E, 0x20, 0x66, 0x6F, 0x78,
0x20, 0x6A, 0x75, 0x6D, 0x70, 0x65, 0x64, 0x20,
0x6F, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65,
0x20, 0x6C, 0x61, 0x7A, 0x79, 0x20, 0x64, 0x6F,
0x67, 0x20, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,
0x37, 0x38, 0x39, 0x30, 0x2F, 0x21, 0x28, 0x29,
};
/*
* MMS M-Retrieve.Conf PDU 2
* This PDU shows the decoding of a M-Retrieve.Conf PDU with multiple "To"
* fields and below content:
* Overall message size: 192
* MMS message type: retrieve-conf
* MMS transaction id: 1201657238
* MMS version: 1.0
* From: 1234567890/TYPE=PLMN
* To: 1111111111/TYPE=PLMN,2222222222/TYPE=PLMN,3333333333/TYPE=PLMN
* Subject: multito
* Class: Personal
* Priority: Normal
* Msg-Id: (null)
* Date: 2011-04-04T11:41:500200
*/
static const unsigned char mms_m_retrieve_conf_2[] = {
0x8C, 0x84, 0x98, 0x31, 0x32, 0x30, 0x31, 0x36,
0x35, 0x37, 0x32, 0x33, 0x38, 0x00, 0x8D, 0x90,
0x85, 0x04, 0x4D, 0x99, 0x92, 0x5E, 0x96, 0x6D,
0x75, 0x6C, 0x74, 0x69, 0x74, 0x6F, 0x00, 0x89,
0x17, 0x80, 0x2B, 0x31, 0x32, 0x33, 0x34, 0x35,
0x36, 0x37, 0x38, 0x39, 0x30, 0x2F, 0x54, 0x59,
0x50, 0x45, 0x3D, 0x50, 0x4C, 0x4D, 0x4E, 0x00,
0x97, 0x2B, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31,
0x31, 0x31, 0x31, 0x31, 0x2F, 0x54, 0x59, 0x50,
0x45, 0x3D, 0x50, 0x4C, 0x4D, 0x4E, 0x00, 0x97,
0x2B, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32,
0x32, 0x32, 0x32, 0x2F, 0x54, 0x59, 0x50, 0x45,
0x3D, 0x50, 0x4C, 0x4D, 0x4E, 0x00, 0x97, 0x2B,
0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
0x33, 0x33, 0x2F, 0x54, 0x59, 0x50, 0x45, 0x3D,
0x50, 0x4C, 0x4D, 0x4E, 0x00, 0x8A, 0x80, 0x8F,
0x81, 0x94, 0x80, 0x86, 0x81, 0x90, 0x81, 0x84,
0xA3, 0x01, 0x26, 0x0E, 0x83, 0xC0, 0x22, 0x3C,
0x47, 0x65, 0x6E, 0x65, 0x72, 0x69, 0x63, 0x5F,
0x54, 0x65, 0x78, 0x74, 0x2E, 0x74, 0x78, 0x74,
0x3E, 0x00, 0x8E, 0x2F, 0x74, 0x6D, 0x70, 0x2F,
0x70, 0x68, 0x70, 0x38, 0x76, 0x6C, 0x66, 0x79,
0x42, 0x00, 0xEF, 0xBB, 0xBF, 0x48, 0x65, 0x6C,
0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64
};
/*
* MMS M-Retrieve.Conf PDU 3
* Overall message size: 147
* MMS message type: retrieve-conf
* MMS transaction id: (null)
* MMS version: 1.0
* From: 1234567890/TYPE=PLMN
* To: 6666666666/TYPE=PLMN
* Subject: test without transaction ID
* Class: Personal
* Priority: Normal
* Msg-Id: (null)
* Date: 2011-04-08T12:27:050200
*/
static const unsigned char mms_m_retrieve_conf_3[] = {
0x8C, 0x84, 0x8D, 0x90, 0x85, 0x04, 0x4D, 0x9E,
0xE2, 0xF9, 0x96, 0x74, 0x65, 0x73, 0x74, 0x20,
0x77, 0x69, 0x74, 0x68, 0x6F, 0x75, 0x74, 0x20,
0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74,
0x69, 0x6F, 0x6E, 0x20, 0x49, 0x44, 0x00, 0x89,
0x17, 0x80, 0x2B, 0x31, 0x32, 0x33, 0x34, 0x35,
0x36, 0x37, 0x38, 0x39, 0x30, 0x2F, 0x54, 0x59,
0x50, 0x45, 0x3D, 0x50, 0x4C, 0x4D, 0x4E, 0x00,
0x97, 0x2B, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x2F, 0x54, 0x59, 0x50,
0x45, 0x3D, 0x50, 0x4C, 0x4D, 0x4E, 0x00, 0x8A,
0x80, 0x8F, 0x81, 0x94, 0x80, 0x86, 0x81, 0x90,
0x81, 0x84, 0xA3, 0x01, 0x1F, 0x0E, 0x83, 0xC0,
0x22, 0x3C, 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x2E,
0x74, 0x78, 0x74, 0x3E, 0x00, 0x8E, 0x2F, 0x74,
0x6D, 0x70, 0x2F, 0x70, 0x68, 0x70, 0x32, 0x49,
0x6E, 0x74, 0x53, 0x37, 0x00, 0x48, 0x65, 0x6C,
0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64,
0x20, 0x21, 0x0A
};
/*
* MMS M-Retrieve.Conf PDU 4
* MMS-1.3-con-210: Long Media Content-Location header field value.
* This PDU shows the decoding of a M-Retrieve.Conf PDU where a SMIL part
* references an object using a long "Content-Location" field value.
* Overall message size: 2767
* MMS message type: retrieve-conf
* MMS transaction id: 00000000210
* MMS version: 1.3
* From: +33611111111/TYPE=PLMN
* To: +33622222222/TYPE=PLMN
* Subject: MMS-1.3-con-210
* Class: (null)
* Priority: (null)
* Msg-Id: (null)
* Date: 2011-05-31T10:42:30+0200
*/
static const char mms_m_retrieve_conf_4[] = "./unit/rc-mms-1-3-con-210.mms";
/*
* MMS M-Retrieve.Conf PDU 5
* MMS-1.3-con-271: Long Subject field.
* This PDU shows the decoding of a M-Retrieve.Conf PDU with a maximum length
* "us-ascii" encoded "subject" field value (40 characters) and below content:
* Overall message size: 556
* MMS message type: retrieve-conf
* MMS transaction id: 00000000271
* MMS version: 1.3
* From: +33622222222/TYPE=PLMN
* To: +33666565565/TYPE=PLMN
* Subject: abcdefghijklmnopqrstuvwxyz0123456789/-+@
* Class: (null)
* Priority: (null)
* Msg-Id: (null)
* Date: 2011-06-03T11:23:30+0200
*/
static const char mms_m_retrieve_conf_5[] = "./unit/rc-mms-1-3-con-271.mms";
/*
* MMS M-Retrieve.Conf PDU 6
* MMS-1.3-con-212: Text with US-ASCII encoding.
* This PDU shows the decoding of a M-Retrieve.Conf PDU with a text object
* with "us-ascii" encoding and below content:
* Overall message size: 198
* MMS message type: retrieve-conf
* MMS transaction id: 00000000212
* MMS version: 1.3
* From: +33622222222/TYPE=PLMN
* To: +33666565565/TYPE=PLMN
* Subject: MMS-1.3-con-212
* Class: (null)
* Priority: (null)
* Msg-Id: (null)
* Date: 2011-06-03T11:45:21+0200
*/
static const char mms_m_retrieve_conf_6[] = "./unit/rc-mms-1-3-con-212.mms";
/*
* MMS M-Retrieve.Conf PDU 7
* MMS-1.3-con-213: Text with UTF-8 encoding.
* This PDU shows the decoding of a M-Retrieve.Conf PDU with a text object
* with "utf-8" encoding and below content:
* Overall message size: 249
* MMS message type: retrieve-conf
* MMS transaction id: 00000000213
* MMS version: 1.3
* From: +33622222222/TYPE=PLMN
* To: +33666565565/TYPE=PLMN
* Subject: MMS-1.3-con-213
* Class: (null)
* Priority: (null)
* Msg-Id: (null)
* Date: 2011-06-03T11:52:45+0200
*/
static const char mms_m_retrieve_conf_7[] = "./unit/rc-mms-1-3-con-213.mms";
/*
* MMS M-Retrieve.Conf PDU 8
* MMS-1.3-con-214: Text with UTF-16 encoding.
* This PDU shows the decoding of a M-Retrieve.Conf PDU with a text object
* with "utf-16" encoding and below content:
* Overall message size: 356
* MMS message type: retrieve-conf
* MMS transaction id: 00000000214
* MMS version: 1.3
* From: +33622222222/TYPE=PLMN
* To: +33666565565/TYPE=PLMN
* Subject: MMS-1.3-con-214
* Class: (null)
* Priority: (null)
* Msg-Id: (null)
* Date: 2011-06-03T14:41:16+0200
*/
static const char mms_m_retrieve_conf_8[] = "./unit/rc-mms-1-3-con-214.mms";
/*
* MMS M-Retrieve.Conf PDU 9
* MMS-1.3-con-216: JPG Image size 160x120.
* This PDU shows the decoding of a M-Retrieve.Conf PDU with a 160x120 JPG
* Image object and below content:
* Overall message size: 114440
* MMS message type: retrieve-conf
* MMS transaction id: 00000000216
* MMS version: 1.3
* From: +33622222222/TYPE=PLMN
* To: +33666565565/TYPE=PLMN
* Subject: MMS-1.3-con-216
* Class: (null)
* Priority: (null)
* Msg-Id: (null)
* Date: 2011-06-03T15:08:09+0200
*/
static const char mms_m_retrieve_conf_9[] = "./unit/rc-mms-1-3-con-216.mms";
/*
* MMS M-Retrieve.Conf PDU 10
* MMS-1.3-con-220: GIF Image size 160x120.
* This PDU shows the decoding of a M-Retrieve.Conf PDU with a 160x120 GIF87a
* Image object and below content:
* Overall message size: 4460
* MMS message type: retrieve-conf
* MMS transaction id: 00000000220
* MMS version: 1.3
* From: +33622222222/TYPE=PLMN
* To: +33666565565/TYPE=PLMN
* Subject: MMS-1.3-con-220
* Class: (null)
* Priority: (null)
* Msg-Id: (null)
* Date: 2011-06-03T15:27:27+0200
*/
static const char mms_m_retrieve_conf_10[] = "./unit/rc-mms-1-3-con-220.mms";
/*
* MMS M-Retrieve.Conf PDU 11
* MMS-1.3-con-224: Animated GIF Image size 160x120.
* This PDU shows the decoding of a M-Retrieve.Conf PDU with a 160x120 animated
* GIF87a Image object and below content:
* Overall message size: 4265
* MMS message type: retrieve-conf
* MMS transaction id: 00000000224
* MMS version: 1.3
* From: +33622222222/TYPE=PLMN
* To: +33666565565/TYPE=PLMN
* Subject: MMS-1.3-con-224
* Class: (null)
* Priority: (null)
* Msg-Id: (null)
* Date: 2011-06-03T15:38:00+0200
*/
static const char mms_m_retrieve_conf_11[] = "./unit/rc-mms-1-3-con-224.mms";
/*
* MMS M-Retrieve.Conf PDU 12
* MMS-1.3-con-228: WBMP Image size 160x120.
* This PDU shows the decoding of a M-Retrieve.Conf PDU with a 160x120 WBMP
* Image object and below content:
* Overall message size: 2921
* MMS message type: retrieve-conf
* MMS transaction id: 00000000228
* MMS version: 1.3
* From: +33622222222/TYPE=PLMN
* To: +33666565565/TYPE=PLMN
* Subject: MMS-1.3-con-228
* Class: (null)
* Priority: (null)
* Msg-Id: (null)
* Date: 2011-06-03T15:46:42+020
*/
static const char mms_m_retrieve_conf_12[] = "./unit/rc-mms-1-3-con-228.mms";
/*
* MMS M-Retrieve.Conf PDU 13
* MMS-1.3-con-211: Subject field with UTF8 encoding.
* This PDU shows the decoding of a M-Retrieve.Conf PDU with Subject field
* with UTF8 encoding and below content:
* Overall message size: 544
* MMS message type: retrieve-conf
* MMS transaction id: 00000000211
* MMS version: 1.3
* From: +33622222222/TYPE=PLMN
* To: +33666565565/TYPE=PLMN
* Subject: Shõrt Téxt - ¥üëäÿ
* Class: (null)
* Priority: (null)
* Msg-Id: (null)
* Date: 2011-06-03T16:01:31+0200
*/
static const char mms_m_retrieve_conf_13[] = "./unit/rc-mms-1-3-con-211.mms";
/*
* MMS M-Retrieve.Conf PDU 14
* MMS-1.3-con-282: Receive recognised fields with unrecognised values.
* This PDU shows the decoding of a M-Retrieve.Conf PDU with recognised field
* but with an unrecognised value (X-Mms-Message-Class: "NewMessageClass") and
* below content:
* Overall message size: 6231
* MMS message type: retrieve-conf
* MMS transaction id: 00000000282
* MMS version: 1.3
* From: +33622222222/TYPE=PLMN
* To: +33666565565/TYPE=PLMN
* Subject: MMS-1.3-con-282
* Class: NewMessageClass
* Priority: (null)
* Msg-Id: (null)
* Date: 2011-06-03T16:25:07+0200
*/
static const char mms_m_retrieve_conf_14[] = "./unit/rc-mms-1-3-con-282.mms";
/*
* MMS M-Retrieve.Conf PDU 15
* MMS-1.3-con-281: Receive unrecognised header field.
* This PDU shows the decoding of a M-Retrieve.Conf PDU with an unrecognised
* header field (X-MMS-Unrecognised-Header-Field: "Yes") and below content:
* Overall message size: 6250
* MMS message type: retrieve-conf
* MMS transaction id: 00000000281
* MMS version: 1.3
* From: +33622222222/TYPE=PLMN
* To: +33666565565/TYPE=PLMN
* Subject: MMS-1.3-con-281
* Class: (null)
* Priority: (null)
* Msg-Id: (null)
* Date: 2011-06-03T16:37:02+0200
*/
static const char mms_m_retrieve_conf_15[] = "./unit/rc-mms-1-3-con-281.mms";
/*
* MMS M-Send.Req PDU 1
* This PDU shows the decoding of a M-Send.Req PDU with a content-type
* value "application/vnd.wap.multipart.mixed" and below content:
* Overall message size: 90
* MMS message type: send-req
* MMS transaction id: 000000000001
* MMS version: 1.0
* To: +33612345678/TYPE=PLMN
* Attachment:
* Offset: 75
* Length: 15
* Content-type: text/plain;charset=utf-8
* Content-id: <Generic_Text.txt>
*/
static const char mms_m_send_req_1[] = "./unit/sr-mms-mixed.mms";
/*
* MMS M-Send.Req PDU 2
* This PDU shows the decoding of a M-Send.Req PDU with a content-type
* value "application/vnd.wap.multipart.related" and multiple TO fields.
* Overall message size: 476
* MMS message type: send-req
* MMS transaction id: 000000000002
* MMS version: 1.0
* To: +33612345678/TYPE=PLMN,+33612345679/TYPE=PLMN
* Attachment:
* Offset: 129
* Length: 305
* Content-type: application/smil
* Content-id: <SMIL>
* Attachment:
* Offset: 461
* Length: 15
* Content-type: text/plain;charset=utf-8
* Content-id: <Generic_Text.txt>
*/
static const char mms_m_send_req_2[] = "./unit/sr-mms-related-multi-to.mms";
/*
* MMS M-Send.Conf PDU 1
* This PDU shows the decoding of a M-Send.Conf PDU with an accepted "response
* status" and a below content:
* Overall message size: 28
* MMS message type: send-conf
* MMS transaction id: 31887
* MMS version: 1.0
* Response-Status: ok
* Msg-Id: 4dc268d71438a
*/
static const unsigned char mms_m_send_conf_1[] = {
0x8C, 0x81, 0x98, 0x33, 0x31, 0x38, 0x38, 0x37,
0x00, 0x8D, 0x90, 0x92, 0x80, 0x8B, 0x34, 0x64,
0x63, 0x32, 0x36, 0x38, 0x64, 0x37, 0x31, 0x34,
0x33, 0x38, 0x61, 0x00
};
/*
* MMS M-Send.Conf PDU 2
* This PDU shows the decoding of a M-Send.Conf PDU with an rejected "response
* status" and a below content:
* Overall message size: 13
* MMS message type: send-conf
* MMS transaction id: 31888
* MMS version: 1.0
* Response-Status: error-permanent-message-format-corrupt
* Msg-Id: (null)
*/
static const unsigned char mms_m_send_conf_2[] = {
0x8C, 0x81, 0x98, 0x33, 0x31, 0x38, 0x38, 0x38,
0x00, 0x8D, 0x90, 0x92, 0xE2
};
struct mms_test {
const char *pathname;
const unsigned char *pdu;
unsigned int len;
};
static const struct mms_test mms_m_notify_ind_test_1 = {
.pdu = mms_m_notify_ind_1,
.len = sizeof(mms_m_notify_ind_1),
};
static const struct mms_test mms_m_notify_ind_test_2 = {
.pdu = mms_m_notify_ind_2,
.len = sizeof(mms_m_notify_ind_2),
};
static const struct mms_test mms_m_notify_ind_test_3 = {
.pathname = mms_m_notify_ind_3,
};
static const struct mms_test mms_m_notify_ind_test_4 = {
.pathname = mms_m_notify_ind_4,
};
static const struct mms_test mms_m_retrieve_conf_test_1 = {
.pdu = mms_m_retrieve_conf_1,
.len = sizeof(mms_m_retrieve_conf_1),
};
static const struct mms_test mms_m_retrieve_conf_test_2 = {
.pdu = mms_m_retrieve_conf_2,
.len = sizeof(mms_m_retrieve_conf_2),
};
static const struct mms_test mms_m_retrieve_conf_test_3 = {
.pdu = mms_m_retrieve_conf_3,
.len = sizeof(mms_m_retrieve_conf_3),
};
static const struct mms_test mms_m_retrieve_conf_test_4 = {
.pathname = mms_m_retrieve_conf_4,
};
static const struct mms_test mms_m_retrieve_conf_test_5 = {
.pathname = mms_m_retrieve_conf_5,
};
static const struct mms_test mms_m_retrieve_conf_test_6 = {
.pathname = mms_m_retrieve_conf_6,
};
static const struct mms_test mms_m_retrieve_conf_test_7 = {
.pathname = mms_m_retrieve_conf_7,
};
static const struct mms_test mms_m_retrieve_conf_test_8 = {
.pathname = mms_m_retrieve_conf_8,
};
static const struct mms_test mms_m_retrieve_conf_test_9 = {
.pathname = mms_m_retrieve_conf_9,
};
static const struct mms_test mms_m_retrieve_conf_test_10 = {
.pathname = mms_m_retrieve_conf_10,
};
static const struct mms_test mms_m_retrieve_conf_test_11 = {
.pathname = mms_m_retrieve_conf_11,
};
static const struct mms_test mms_m_retrieve_conf_test_12 = {
.pathname = mms_m_retrieve_conf_12,
};
static const struct mms_test mms_m_retrieve_conf_test_13 = {
.pathname = mms_m_retrieve_conf_13,
};
static const struct mms_test mms_m_retrieve_conf_test_14 = {
.pathname = mms_m_retrieve_conf_14,
};
static const struct mms_test mms_m_retrieve_conf_test_15 = {
.pathname = mms_m_retrieve_conf_15,
};
static const struct mms_test mms_m_send_req_dec_test_1 = {
.pathname = mms_m_send_req_1,
};
static const struct mms_test mms_m_send_req_dec_test_2 = {
.pathname = mms_m_send_req_2,
};
static const struct mms_test mms_m_send_conf_test_1 = {
.pdu = mms_m_send_conf_1,
.len = sizeof(mms_m_send_conf_1),
};
static const struct mms_test mms_m_send_conf_test_2 = {
.pdu = mms_m_send_conf_2,
.len = sizeof(mms_m_send_conf_2),
};
static void test_decode_mms(gconstpointer data)
{
const struct mms_test *test = data;
struct mms_message *msg;
unsigned int len;
gboolean ret;
msg = g_try_new0(struct mms_message, 1);
if (msg == NULL) {
g_printerr("Failed allocate message");
return;
}
if (test->pathname != NULL) {
struct stat st;
unsigned char *pdu;
int fd;
fd = open(test->pathname, O_RDONLY);
if (fd < 0) {
g_printerr("Failed to open %s\n", test->pathname);
goto out;
}
if (fstat(fd, &st) < 0) {
g_printerr("Failed to stat %s\n", test->pathname);
close(fd);
goto out;
}
len = st.st_size;
pdu = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);
if (!pdu || pdu == MAP_FAILED) {
g_printerr("Failed to mmap %s\n", test->pathname);
close(fd);
goto out;
}
ret = mms_message_decode(pdu, len, msg);
munmap(pdu, len);
close(fd);
} else {
const unsigned char *pdu = test->pdu;
len = test->len;
ret = mms_message_decode(pdu, len, msg);
}
g_assert(ret == TRUE);
if (g_test_verbose()) {
g_print("Overall message size: %d\n", len);
g_print("MMS message type: %s\n",
message_type_to_string(msg->type));
g_print("MMS transaction id: %s\n", msg->transaction_id);
g_print("MMS version: %u.%u\n", (msg->version & 0x70) >> 4,
msg->version & 0x0f);
switch (msg->type) {
case MMS_MESSAGE_TYPE_NOTIFICATION_IND:
dump_notification_ind(msg);
break;
case MMS_MESSAGE_TYPE_RETRIEVE_CONF:
dump_retrieve_conf(msg);
break;
case MMS_MESSAGE_TYPE_SEND_CONF:
dump_send_conf(msg);
break;
case MMS_MESSAGE_TYPE_SEND_REQ:
dump_send_req(msg);
break;
default:
break;
}
}
out:
mms_message_free(msg);
}
struct mms_encode_test {
struct mms_message msg;
const unsigned char pdu[];
};
static const struct mms_encode_test mms_m_notifyresp_ind_test_1 = {
.msg = {
.type = MMS_MESSAGE_TYPE_NOTIFYRESP_IND,
.uuid = NULL,
.path = NULL,
.transaction_id = "0123456789abcdef",
.version = MMS_MESSAGE_VERSION_1_2,
.attachments = NULL,
{.nri = {
.notify_status = MMS_MESSAGE_NOTIFY_STATUS_RETRIEVED,
} }
},
.pdu = { 0x8C, 0x83, 0x98, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65,
0x66, 0x00, 0x8D, 0x92, 0x95, 0x81
}
};
#define CT_MUTLIPART "Content-Type: \"application/vnd.wap.multipart."
#define CT_TYPE ";type=\"application/smil\""
#define CT_START ";start=\"<SMIL>\""
#define CT_MULTIPART_RELATED CT_MUTLIPART "related\"" CT_TYPE CT_START
#define CT_MULTIPART_MIXED CT_MUTLIPART "mixed\""
static const struct mms_encode_test mms_m_send_req_test_1 = {
.msg = {
.type = MMS_MESSAGE_TYPE_SEND_REQ,
.uuid = NULL,
.path = NULL,
.transaction_id = "0123456789abcdef_sr1",
.version = MMS_MESSAGE_VERSION_1_2,
.attachments = NULL,
{.sr = {
.status = MMS_MESSAGE_STATUS_DRAFT,
.to = "0123456789",
.dr = TRUE,
.content_type = CT_MULTIPART_MIXED,
} }
},
.pdu = { 0x8C, 0x80, 0x98, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65,
0x66, 0x5F, 0x73, 0x72, 0x31, 0x00, 0x8D, 0x92, 0x89,
0x01, 0x81, 0x97, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
0x36, 0x37, 0x38, 0x39, 0x00, 0x86, 0x80, 0x84, 0xA3
}
};
static void test_encode_mms(gconstpointer data)
{
struct mms_encode_test *test_msg = (struct mms_encode_test *) data;
char *filepath;
gboolean ret;
int fd;
filepath = g_strdup_printf("%s/.mms/mms_XXXXXX.tmp",
g_get_home_dir());
if (filepath == NULL)
return;
fd = g_mkstemp_full(filepath, O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR);
if (fd < 0) {
g_free(filepath);
return;
}
if (g_test_verbose())
g_print("tmp filename : %s\n", filepath);
ret = mms_message_encode(&test_msg->msg, fd);
close(fd);
if (ret == TRUE)
ret = check_encoded_msg(filepath, test_msg->pdu);
unlink(filepath);
g_free(filepath);
g_assert(ret == TRUE);
}
int main(int argc, char **argv)
{
g_test_init(&argc, &argv, NULL);
g_test_add_data_func("/mmsutil/Decode MMS M-Notify.Ind PDU 1",
&mms_m_notify_ind_test_1, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Notify.Ind PDU 2",
&mms_m_notify_ind_test_2, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Notify.Ind PDU 3",
&mms_m_notify_ind_test_3, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Notify.Ind PDU 4",
&mms_m_notify_ind_test_4, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 1",
&mms_m_retrieve_conf_test_1, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 2",
&mms_m_retrieve_conf_test_2, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 3",
&mms_m_retrieve_conf_test_3, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 4",
&mms_m_retrieve_conf_test_4, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 5",
&mms_m_retrieve_conf_test_5, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 6",
&mms_m_retrieve_conf_test_6, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 7",
&mms_m_retrieve_conf_test_7, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 8",
&mms_m_retrieve_conf_test_8, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 9",
&mms_m_retrieve_conf_test_9, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 10",
&mms_m_retrieve_conf_test_10, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 11",
&mms_m_retrieve_conf_test_11, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 12",
&mms_m_retrieve_conf_test_12, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 13",
&mms_m_retrieve_conf_test_13, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 14",
&mms_m_retrieve_conf_test_14, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Retrieve.Conf PDU 15",
&mms_m_retrieve_conf_test_15, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Send.Req PDU 1",
&mms_m_send_req_dec_test_1, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Send.Req PDU 2",
&mms_m_send_req_dec_test_2, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Send.Conf PDU 1",
&mms_m_send_conf_test_1, test_decode_mms);
g_test_add_data_func("/mmsutil/Decode MMS M-Send.Conf PDU 2",
&mms_m_send_conf_test_2, test_decode_mms);
g_test_add_data_func("/mmsutil/Encode MMS M-NotifyResp.Ind 1",
&mms_m_notifyresp_ind_test_1, test_encode_mms);
g_test_add_data_func("/mmsutil/Encode MMS M-SendReq 1",
&mms_m_send_req_test_1, test_encode_mms);
return g_test_run();
}