sms: Only copy when there is actual data
[libsamsung-ipc.git] / samsung-ipc / sms.c
1 /*
2  * This file is part of libsamsung-ipc.
3  *
4  * Copyright (C) 2011 Simon Busch <morphis@gravedo.de>
5  * Copyright (C) 2014 Paul Kocialkowski <contact@paulk.fr>
6  *
7  * libsamsung-ipc is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * libsamsung-ipc is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with libsamsung-ipc.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <stdlib.h>
22 #include <string.h>
23
24 #include <samsung-ipc.h>
25
26 void *ipc_sms_send_msg_setup(struct ipc_sms_send_msg_request_header *header,
27     const void *smsc, size_t smsc_size, const void *pdu, size_t pdu_size)
28 {
29     void *data;
30     size_t size;
31     unsigned char smsc_length;
32     unsigned char *p;
33
34         if (header == NULL || smsc == NULL || smsc_size == 0 || pdu == NULL || pdu_size == 0)
35                 return NULL;
36
37     smsc_length = (unsigned char) smsc_size;
38
39     header->length = (unsigned char) (sizeof(smsc_length) + smsc_size + pdu_size);
40
41     size = sizeof(struct ipc_sms_send_msg_request_header) + sizeof(smsc_length) + smsc_size + pdu_size;
42     data = calloc(1, size);
43
44     p = (unsigned char *) data;
45
46     memcpy(p, header, sizeof(struct ipc_sms_send_msg_request_header));
47     p += sizeof(struct ipc_sms_send_msg_request_header);
48
49     memcpy(p, &smsc_length, sizeof(smsc_length));
50     p += sizeof(smsc_length);
51
52     memcpy(p, smsc, smsc_size);
53     p += smsc_size;
54
55     memcpy(p, pdu, pdu_size);
56     p += pdu_size;
57
58     return data;
59 }
60
61 char *ipc_sms_incoming_msg_pdu_extract(const void *data, size_t size)
62 {
63     struct ipc_sms_incoming_msg_header *header;
64     char *string;
65     void *pdu;
66
67     if (data == NULL || size < sizeof(struct ipc_sms_incoming_msg_header))
68         return NULL;
69
70     header = (struct ipc_sms_incoming_msg_header *) data;
71     if (header->length == 0 || header->length > size - sizeof(struct ipc_sms_incoming_msg_header))
72         return NULL;
73
74     pdu = (void *) ((unsigned char *) data + sizeof(struct ipc_sms_incoming_msg_header));
75
76     string = data2string(pdu, header->length);
77
78     return string;
79 }
80
81 void *ipc_sms_save_msg_setup(struct ipc_sms_save_msg_request_header *header,
82     const void *smsc, size_t smsc_size, const void *pdu, size_t pdu_size)
83 {
84     void *data;
85     size_t size;
86     unsigned char smsc_length;
87     unsigned char *p;
88
89     if (header == NULL || pdu == NULL || pdu_size == 0)
90         return NULL;
91
92     if (smsc == NULL)
93         smsc_size = 0;
94
95     smsc_length = (unsigned char) smsc_size;
96
97     header->magic = 2;
98     header->index = 12 - 1,
99     header->length = (unsigned char) (sizeof(smsc_length) + smsc_size + pdu_size);
100
101     size = sizeof(struct ipc_sms_save_msg_request_header) + sizeof(smsc_length) + smsc_size + pdu_size;
102     data = calloc(1, size);
103
104     p = (unsigned char *) data;
105
106     memcpy(p, header, sizeof(struct ipc_sms_save_msg_request_header));
107     p += sizeof(struct ipc_sms_save_msg_request_header);
108
109     memcpy(p, &smsc_length, sizeof(smsc_length));
110     p += sizeof(smsc_length);
111
112     if (smsc != NULL && smsc_size > 0) {
113         memcpy(p, smsc, smsc_size);
114         p += smsc_size;
115     }
116
117     memcpy(p, pdu, pdu_size);
118     p += pdu_size;
119
120     return data;
121 }
122
123 int ipc_sms_del_msg_setup(struct ipc_sms_del_msg_request_data *data,
124     unsigned short index)
125 {
126    if (data == NULL)
127         return -1;
128
129     memset(data, 0, sizeof(struct ipc_sms_del_msg_request_data));
130     data->magic = 2;
131     data->index = index;
132
133     return 0;
134 }
135
136 // vim:ts=4:sw=4:expandtab