Add omitted TIZEN_EXT
[platform/upstream/connman.git] / client / ins.c
1 /*
2  *
3  *  Connection Manager
4  *
5  *  Copyright (C) 2020  Intel Corporation. All rights reserved.
6  *
7  *  This program 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  *  This program 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 this program; if not, write to the Free Software
19  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  *
21  */
22
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <stdint.h>
30 #include <string.h>
31 #include <unistd.h>
32 #include <errno.h>
33
34 #include <glib.h>
35
36 #include "ins.h"
37
38 struct bssid_info_s {
39         char *bssid;
40         unsigned int strength;
41         unsigned int frequency;
42         int score_ins;
43         int score_last_connected;
44         int score_assoc_reject;
45         int score_frequency;
46         int score_strength;
47 };
48
49 static void print_bssid_info(gpointer value, gpointer user_data)
50 {
51         struct bssid_info_s *bssid_info = value;
52         int *bssid_rank = user_data;
53
54         fprintf(stdout, "     %2d) %-20s total[%2d] last_conn[%2d] "
55                         "assoc_reject[%2d] freq[%2d(%4d)] strength[%2d(%2d)]\n",
56                         *bssid_rank, bssid_info->bssid, bssid_info->score_ins,
57                         bssid_info->score_last_connected, bssid_info->score_assoc_reject,
58                         bssid_info->score_frequency, bssid_info->frequency,
59                         bssid_info->score_strength, bssid_info->strength);
60
61         (*bssid_rank)++;
62 }
63
64 static GSList *get_bssid_list(DBusMessageIter *iter)
65 {
66         char *property;
67         DBusMessageIter entry, val;
68         GSList *bssid_list = NULL;
69         struct bssid_info_s *bssid_info = NULL;
70
71         while (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) {
72                 dbus_message_iter_recurse(iter, &entry);
73                 dbus_message_iter_get_basic(&entry, &property);
74
75                 if (strcmp(property, "BSSID") == 0) {
76                         bssid_info = g_try_new0(struct bssid_info_s, 1);
77                         if (!bssid_info)
78                                 continue;
79
80                         dbus_message_iter_next(&entry);
81                         dbus_message_iter_recurse(&entry, &val);
82                         dbus_message_iter_get_basic(&val, &(bssid_info->bssid));
83
84                 } else if (strcmp(property, "ScoreINS") == 0) {
85                         dbus_message_iter_next(&entry);
86                         dbus_message_iter_recurse(&entry, &val);
87                         dbus_message_iter_get_basic(&val, &(bssid_info->score_ins));
88
89                 } else if (strcmp(property, "ScoreLastConnected") == 0) {
90                         dbus_message_iter_next(&entry);
91                         dbus_message_iter_recurse(&entry, &val);
92                         dbus_message_iter_get_basic(&val, &(bssid_info->score_last_connected));
93
94                 } else if (strcmp(property, "ScoreAssocReject") == 0) {
95                         dbus_message_iter_next(&entry);
96                         dbus_message_iter_recurse(&entry, &val);
97                         dbus_message_iter_get_basic(&val, &(bssid_info->score_assoc_reject));
98
99                 } else if (strcmp(property, "Frequency") == 0) {
100                         dbus_message_iter_next(&entry);
101                         dbus_message_iter_recurse(&entry, &val);
102                         dbus_message_iter_get_basic(&val, &(bssid_info->frequency));
103
104                 } else if (strcmp(property, "ScoreFrequency") == 0) {
105                         dbus_message_iter_next(&entry);
106                         dbus_message_iter_recurse(&entry, &val);
107                         dbus_message_iter_get_basic(&val, &(bssid_info->score_frequency));
108
109                 } else if (strcmp(property, "Strength") == 0) {
110                         dbus_message_iter_next(&entry);
111                         dbus_message_iter_recurse(&entry, &val);
112                         dbus_message_iter_get_basic(&val, &(bssid_info->strength));
113
114                 } else if (strcmp(property, "ScoreStrength") == 0) {
115                         dbus_message_iter_next(&entry);
116                         dbus_message_iter_recurse(&entry, &val);
117                         dbus_message_iter_get_basic(&val, &(bssid_info->score_strength));
118
119                         bssid_list = g_slist_append(bssid_list, bssid_info);
120                 }
121
122                 dbus_message_iter_next(iter);
123         }
124
125         return bssid_list;
126 }
127
128 static void print_ins_info(int *rank, char *path, char *filter, DBusMessageIter *iter)
129 {
130         char *name = "";
131         char *security;
132         char *str = NULL;
133         int count = 0;
134         char *property;
135         unsigned char strength;
136         unsigned int frequency;
137         int score_INS;
138         int score_last_user_selection;
139         int score_last_connected;
140         int score_frequency;
141         int score_security_priority;
142         int score_internet_connection;
143         int score_strength;
144         GSList *bssid_list = NULL;
145         DBusMessageIter entry, val, dict;
146
147         while (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) {
148                 dbus_message_iter_recurse(iter, &entry);
149                 dbus_message_iter_get_basic(&entry, &property);
150
151                 if (strcmp(property, "Name") == 0) {
152                         dbus_message_iter_next(&entry);
153                         dbus_message_iter_recurse(&entry, &val);
154                         dbus_message_iter_get_basic(&val, &name);
155
156                 } else if (strcmp(property, "ScoreINS") == 0) {
157                         dbus_message_iter_next(&entry);
158                         dbus_message_iter_recurse(&entry, &val);
159                         dbus_message_iter_get_basic(&val, &score_INS);
160
161                 } else if (strcmp(property, "ScoreLastUserSelection") == 0) {
162                         dbus_message_iter_next(&entry);
163                         dbus_message_iter_recurse(&entry, &val);
164                         dbus_message_iter_get_basic(&val, &score_last_user_selection);
165
166                 } else if (strcmp(property, "ScoreLastConnected") == 0) {
167                         dbus_message_iter_next(&entry);
168                         dbus_message_iter_recurse(&entry, &val);
169                         dbus_message_iter_get_basic(&val, &score_last_connected);
170
171                 } else if (strcmp(property, "Security") == 0) {
172                         dbus_message_iter_next(&entry);
173                         dbus_message_iter_recurse(&entry, &val);
174                         dbus_message_iter_get_basic(&val, &security);
175
176                 } else if (strcmp(property, "ScoreSecurityPriority") == 0) {
177                         dbus_message_iter_next(&entry);
178                         dbus_message_iter_recurse(&entry, &val);
179                         dbus_message_iter_get_basic(&val, &score_security_priority);
180
181                 } else if (strcmp(property, "Strength") == 0) {
182                         dbus_message_iter_next(&entry);
183                         dbus_message_iter_recurse(&entry, &val);
184                         dbus_message_iter_get_basic(&val, &strength);
185
186                 } else if (strcmp(property, "ScoreStrength") == 0) {
187                         dbus_message_iter_next(&entry);
188                         dbus_message_iter_recurse(&entry, &val);
189                         dbus_message_iter_get_basic(&val, &score_strength);
190
191                 } else if (strcmp(property, "ScoreInternetConnection") == 0) {
192                         dbus_message_iter_next(&entry);
193                         dbus_message_iter_recurse(&entry, &val);
194                         dbus_message_iter_get_basic(&val, &score_internet_connection);
195
196                 } else if (strcmp(property, "Frequency") == 0) {
197                         dbus_message_iter_next(&entry);
198                         dbus_message_iter_recurse(&entry, &val);
199                         dbus_message_iter_get_basic(&val, &frequency);
200
201                 } else if (strcmp(property, "ScoreFrequency") == 0) {
202                         dbus_message_iter_next(&entry);
203                         dbus_message_iter_recurse(&entry, &val);
204                         dbus_message_iter_get_basic(&val, &score_frequency);
205
206                 } else if (strcmp(property, "BSSID.List") == 0) {
207                         dbus_message_iter_next(&entry);
208                         dbus_message_iter_recurse(&entry, &val);
209                         if (dbus_message_iter_get_arg_type(&val)
210                                 == DBUS_TYPE_ARRAY) {
211                                 dbus_message_iter_recurse(&val, &dict);
212                                 bssid_list = get_bssid_list(&dict);
213                         }
214
215                 }
216
217                 count++;
218                 dbus_message_iter_next(iter);
219         }
220
221         str = strrchr(path, '/');
222         if (str)
223                 str++;
224         else
225                 str = path;
226
227         if (count > 0) {
228                 if (!filter || strcmp(filter, name) == 0 || strcmp(filter, "ssid") == 0) {
229                         fprintf(stdout, "  [%2d] %-20s total[%2d] last_usr[%2d] last_conn[%2d] "
230                                 "internet[%2d] sec[%2d(%9s)] freq[%2d(%4d)] strength[%2d(%2d)]\n  %s\n",
231                                 *rank, name, score_INS, score_last_user_selection, score_last_connected,
232                                 score_internet_connection, score_security_priority, security,
233                                 score_frequency, frequency, score_strength, strength, str);
234
235                         if (!filter || strcmp(filter, "ssid") != 0) {
236                                 int bssid_rank = 1;
237                                 g_slist_foreach(bssid_list, print_bssid_info, &bssid_rank);
238                         }
239
240                         (*rank)++;
241                 }
242
243         } else {
244                 fprintf(stdout, "%-24s %s", "unchanged\n", str);
245         }
246
247 }
248
249 static void list_ins_array(DBusMessageIter *iter, char *filter)
250 {
251         DBusMessageIter array, dict;
252         char *path = NULL;
253         int rank = 1;
254
255         while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRUCT) {
256
257                 dbus_message_iter_recurse(iter, &array);
258                 if (dbus_message_iter_get_arg_type(&array)
259                                 != DBUS_TYPE_OBJECT_PATH)
260                         return;
261
262                 dbus_message_iter_get_basic(&array, &path);
263
264                 dbus_message_iter_next(&array);
265                 if (dbus_message_iter_get_arg_type(&array)
266                                 == DBUS_TYPE_ARRAY) {
267                         dbus_message_iter_recurse(&array, &dict);
268                         print_ins_info(&rank, path, filter, &dict);
269                 }
270
271                 dbus_message_iter_next(iter);
272         }
273 }
274
275 void __connmanctl_ins_list(DBusMessageIter *iter, char *filter)
276 {
277         DBusMessageIter array;
278         char *path;
279
280         if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
281                 return;
282
283         dbus_message_iter_recurse(iter, &array);
284         list_ins_array(&array, filter);
285
286         dbus_message_iter_next(iter);
287         if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
288                 return;
289
290         fprintf(stdout, "\n}, {");
291
292         dbus_message_iter_recurse(iter, &array);
293         while (dbus_message_iter_get_arg_type(&array)
294                         == DBUS_TYPE_OBJECT_PATH) {
295                 dbus_message_iter_get_basic(&array, &path);
296                 fprintf(stdout, "\n%-24s %s", "removed", path);
297
298                 dbus_message_iter_next(&array);
299         }
300
301 }