svc: Helpers
[libsamsung-ipc.git] / samsung-ipc / svc.c
1 /*
2  * This file is part of libsamsung-ipc.
3  *
4  * Copyright (C) 2014 Paul Kocialkowski <contact@paulk.fr>
5  *
6  * libsamsung-ipc is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * libsamsung-ipc is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with libsamsung-ipc.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <stdlib.h>
21
22 #include <samsung-ipc.h>
23
24 int ipc_svc_enter_setup(struct ipc_svc_enter_data *data,
25     unsigned char mode, unsigned char type)
26 {
27    if (data == NULL)
28         return -1;
29
30     memset(data, 0, sizeof(struct ipc_svc_enter_data));
31     data->mode = mode;
32     data->type = type;
33
34     if (mode == IPC_SVC_MODE_MONITOR)
35         data->magic = 0x00;
36     else
37         data->magic = 0x10;
38
39     return 0;
40 }
41
42 unsigned char ipc_svc_display_screen_count_extract(const void *data, size_t size)
43 {
44     struct ipc_svc_display_screen_header *header;
45
46     if (data == NULL || size < sizeof(struct ipc_svc_display_screen_header))
47         return 0;
48
49     header = (struct ipc_svc_display_screen_header *) data;
50
51     return header->count;
52 }
53
54 struct ipc_svc_display_screen_entry *ipc_svc_display_screen_extract(const void *data,
55     size_t size, unsigned int index)
56 {
57     struct ipc_svc_display_screen_entry *entry = NULL;
58     unsigned char count;
59     unsigned char i;
60     unsigned int offset;
61
62     if (data == NULL)
63         return NULL;
64
65     count = ipc_svc_display_screen_count_extract(data, size);
66     if (count == 0 || index >= count)
67         return NULL;
68
69     offset = sizeof(struct ipc_svc_display_screen_header);
70
71     for (i = 0; i < (index + 1); i++) {
72         entry = (struct ipc_svc_display_screen_entry *) ((unsigned char *) data + offset);
73         offset += sizeof(struct ipc_svc_display_screen_entry);
74     }
75
76     if (offset > size)
77         return NULL;
78
79     return entry;
80 }
81
82 // vim:ts=4:sw=4:expandtab