Extract in helpers naming
[libsamsung-ipc.git] / samsung-ipc / call.c
1 /*
2  * This file is part of libsamsung-ipc.
3  *
4  * Copyright (C) 2011 Simon Busch <morphis@gravedo.de>
5  * Copyright (C) 2013-2014 Paul Kocialkowsk <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 int ipc_call_outgoing_setup(struct ipc_call_outgoing_data *data,
27     unsigned char type, unsigned char identity, unsigned char prefix,
28     const char *number)
29 {
30     size_t number_length;
31
32     if (data == NULL || number == NULL)
33         return -1;
34
35     number_length = strlen(number);
36     if (number_length > sizeof(data->number))
37         number_length = sizeof(data->number);
38
39     memset(data, 0, sizeof(struct ipc_call_outgoing_data));
40     data->type = type;
41     data->identity = identity;
42     data->prefix = prefix;
43     data->number_length = (unsigned char) number_length;
44
45     strncpy((char *) data->number, number, number_length);
46
47     return 0;
48 }
49
50 unsigned char ipc_call_list_count_extract(const void *data, size_t size)
51 {
52     struct ipc_call_list_header *header;
53
54     if (data == NULL || size < sizeof(struct ipc_call_list_header))
55         return 0;
56
57     header = (struct ipc_call_list_header *) data;
58
59     return header->count;
60 }
61
62 struct ipc_call_list_entry *ipc_call_list_entry_extract(const void *data,
63     size_t size, unsigned int index)
64 {
65     struct ipc_call_list_entry *entry = NULL;
66     unsigned char count;
67     unsigned char i;
68     size_t offset;
69
70     if (data == NULL)
71         return NULL;
72
73     count = ipc_call_list_count_extract(data, size);
74     if (count == 0)
75         return NULL;
76
77     offset = sizeof(struct ipc_call_list_header);
78
79     for (i = 0; i < (index + 1); i++) {
80         entry = (struct ipc_call_list_entry *) ((unsigned char *) data + offset);
81         offset += sizeof(struct ipc_call_list_entry) + entry->number_length;
82     }
83
84     if (offset > size)
85         return NULL;
86
87     return entry;
88 }
89
90 char *ipc_call_list_entry_number_extract(const struct ipc_call_list_entry *entry)
91 {
92     char *number;
93     size_t number_length;
94
95     if (entry == NULL)
96         return NULL;
97
98     // entry->number_length doesn't count the final null character
99     number_length = entry->number_length + sizeof(char);
100
101     number = (char *) calloc(1, number_length);
102
103     strncpy(number, (char *) entry + sizeof(struct ipc_call_list_entry), entry->number_length);
104     number[entry->number_length] = '\0';
105
106     return number;
107 }
108
109 void *ipc_call_burst_dtmf_setup(const struct ipc_call_burst_dtmf_entry *entries,
110     unsigned char count)
111 {
112     struct ipc_call_burst_dtmf_header *header;
113     void *data;
114     size_t size;
115
116     if (entries == NULL)
117         return NULL;
118
119     size = sizeof(struct ipc_call_burst_dtmf_header) + count * sizeof(struct ipc_call_burst_dtmf_entry);
120
121     data = calloc(1, size);
122
123     header = (struct ipc_call_burst_dtmf_header *) data;
124     header->count = count;
125
126     memcpy((void *) ((unsigned char *) data + sizeof(struct ipc_call_burst_dtmf_header)), entries, count * sizeof(struct ipc_call_burst_dtmf_entry));
127
128     return data;
129 }
130
131 // vim:ts=4:sw=4:expandtab