blob: 62e847074632d9484213bf65019663dd56273847 [file]
/*
*
* 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
*
*/
enum wsp_header_iter_flag {
WSP_HEADER_ITER_FLAG_REJECT_CP = 0x1,
WSP_HEADER_ITER_FLAG_DETECT_MMS_MULTIPART = 0x2,
};
enum wsp_header_type {
WSP_HEADER_TYPE_WELL_KNOWN,
WSP_HEADER_TYPE_APPLICATION
};
enum wsp_value_type {
WSP_VALUE_TYPE_LONG,
WSP_VALUE_TYPE_SHORT,
WSP_VALUE_TYPE_TEXT,
};
enum wsp_header_token {
WSP_HEADER_TOKEN_APP_ID = 0x2F,
};
enum wsp_parameter_type {
WSP_PARAMETER_TYPE_Q = 0x00,
WSP_PARAMETER_TYPE_CHARSET = 0x01,
WSP_PARAMETER_TYPE_LEVEL = 0x02,
WSP_PARAMETER_TYPE_TYPE = 0x03,
WSP_PARAMETER_TYPE_NAME_DEFUNCT = 0x05,
WSP_PARAMETER_TYPE_FILENAME_DEFUNCT = 0x06,
WSP_PARAMETER_TYPE_DIFFERENCES = 0x07,
WSP_PARAMETER_TYPE_PADDING = 0x08,
WSP_PARAMETER_TYPE_CONTENT_TYPE = 0x09,
WSP_PARAMETER_TYPE_START_DEFUNCT = 0x0A,
WSP_PARAMETER_TYPE_START_INFO_DEFUNCT = 0x0B,
WSP_PARAMETER_TYPE_COMMENT_DEFUNCT = 0x0C,
WSP_PARAMETER_TYPE_DOMAIN_DEFUNCT = 0x0D,
WSP_PARAMETER_TYPE_MAX_AGE = 0x0E,
WSP_PARAMETER_TYPE_PATH_DEFUNCT = 0x0F,
WSP_PARAMETER_TYPE_SECURE = 0x10,
WSP_PARAMETER_TYPE_SEC = 0x11,
WSP_PARAMETER_TYPE_MAC = 0x12,
WSP_PARAMETER_TYPE_CREATION_DATE = 0x13,
WSP_PARAMETER_TYPE_MODIFICATION_DATE = 0x14,
WSP_PARAMETER_TYPE_READ_DATE = 0x15,
WSP_PARAMETER_TYPE_SIZE = 0x16,
WSP_PARAMETER_TYPE_NAME = 0x17,
WSP_PARAMETER_TYPE_FILENAME = 0x18,
WSP_PARAMETER_TYPE_START = 0x19,
WSP_PARAMETER_TYPE_START_INFO = 0x1A,
WSP_PARAMETER_TYPE_COMMENT = 0x1B,
WSP_PARAMETER_TYPE_DOMAIN = 0x1C,
WSP_PARAMETER_TYPE_PATH = 0x1D,
WSP_PARAMETER_TYPE_UNTYPED = 0xFF,
};
enum wsp_parameter_value {
WSP_PARAMETER_VALUE_TEXT,
WSP_PARAMETER_VALUE_INT,
WSP_PARAMETER_VALUE_DATE,
WSP_PARAMETER_VALUE_Q,
};
struct wsp_parameter {
enum wsp_parameter_type type;
enum wsp_parameter_value value;
const char *untyped;
union {
const char *text;
unsigned int integer;
time_t date;
float q;
};
};
struct wsp_header_iter {
const unsigned char *pdu;
unsigned int max;
unsigned int pos;
unsigned int flags;
unsigned char code_page;
enum wsp_header_type header_type;
const void *header;
enum wsp_value_type value_type;
const void *value;
unsigned int len;
};
struct wsp_multipart_iter {
const unsigned char *pdu;
unsigned int max;
unsigned int pos;
const void *content_type;
const void *headers;
const void *body;
unsigned int content_type_len;
unsigned int headers_len;
unsigned int body_len;
};
struct wsp_parameter_iter {
const unsigned char *pdu;
unsigned int max;
unsigned int pos;
};
#define MAX_TEXT_HEADER_SIZE 4096
struct wsp_text_header_iter {
char hdr[MAX_TEXT_HEADER_SIZE + 1];
unsigned int pos;
const char *key;
const char *value;
};
gboolean wsp_decode_uintvar(const unsigned char *pdu, unsigned int len,
unsigned int *out_len, unsigned int *consumed);
gboolean wsp_decode_integer(const unsigned char *pdu, unsigned int len,
unsigned int *out_val, unsigned int *consumed);
gboolean wsp_decode_field(const unsigned char *pdu, unsigned int max,
enum wsp_value_type *out_type,
const void **out_value,
unsigned int *out_len,
unsigned int *consumed);
gboolean wsp_get_well_known_content_type(const char *text,
unsigned int *out_val);
gboolean wsp_get_well_known_charset(const char *text, unsigned int *out_val);
const char *wsp_decode_token_text(const unsigned char *pdu, unsigned int len,
unsigned int *consumed);
const char *wsp_decode_text(const unsigned char *pdu, unsigned int len,
unsigned int *consumed);
const char *wsp_decode_quoted_string(const unsigned char *pdu, unsigned int len,
unsigned int *consumed);
gboolean wsp_decode_content_type(const unsigned char *pdu, unsigned int max,
const void **out_value,
unsigned int *out_read,
unsigned int *out_param_len);
gboolean wsp_decode_application_id(struct wsp_header_iter *iter,
const void **out_value);
gboolean wsp_encode_uintvar(unsigned int value, unsigned char *dest,
unsigned int dest_size, unsigned int *written);
gboolean wsp_encode_value_length(unsigned int len, unsigned char *dest,
unsigned int dest_size, unsigned int *written);
gboolean wsp_encode_integer(unsigned int value, unsigned char *dest,
unsigned int dest_size, unsigned int *written);
void wsp_header_iter_init(struct wsp_header_iter *iter,
const unsigned char *pdu, unsigned int len,
unsigned int flags);
gboolean wsp_header_iter_next(struct wsp_header_iter *iter);
unsigned char wsp_header_iter_get_code_page(struct wsp_header_iter *iter);
gboolean wsp_header_iter_at_end(struct wsp_header_iter *iter);
gboolean wsp_header_iter_is_multipart(struct wsp_header_iter *iter);
enum wsp_header_type wsp_header_iter_get_hdr_type(struct wsp_header_iter *iter);
const unsigned char *wsp_header_iter_get_pdu(struct wsp_header_iter *iter);
const void *wsp_header_iter_get_hdr(struct wsp_header_iter *iter);
enum wsp_value_type wsp_header_iter_get_val_type(struct wsp_header_iter *iter);
const void *wsp_header_iter_get_val(struct wsp_header_iter *iter);
unsigned int wsp_header_iter_get_val_len(struct wsp_header_iter *iter);
gboolean wsp_multipart_iter_init(struct wsp_multipart_iter *mi,
struct wsp_header_iter *hi,
const void **out_content_type,
unsigned int *out_content_type_len);
gboolean wsp_multipart_iter_next(struct wsp_multipart_iter *mi);
const void *wsp_multipart_iter_get_content_type(struct wsp_multipart_iter *mi);
unsigned int wsp_multipart_iter_get_content_type_len(
struct wsp_multipart_iter *mi);
const void *wsp_multipart_iter_get_hdr(struct wsp_multipart_iter *mi);
unsigned int wsp_multipart_iter_get_hdr_len(struct wsp_multipart_iter *mi);
const void *wsp_multipart_iter_get_body(struct wsp_multipart_iter *mi);
unsigned int wsp_multipart_iter_get_body_len(struct wsp_multipart_iter *mi);
gboolean wsp_multipart_iter_close(struct wsp_multipart_iter *mi,
struct wsp_header_iter *hi);
void wsp_parameter_iter_init(struct wsp_parameter_iter *pi,
const unsigned char *pdu, unsigned int len);
gboolean wsp_parameter_iter_next(struct wsp_parameter_iter *pi,
struct wsp_parameter *out_param);
gboolean wsp_text_header_iter_init(struct wsp_text_header_iter *iter,
const char *hdr);
gboolean wsp_text_header_iter_param_next(struct wsp_text_header_iter *iter);
const char *wsp_text_header_iter_get_key(struct wsp_text_header_iter *iter);
const char *wsp_text_header_iter_get_value(struct wsp_text_header_iter *iter);