5 * Copyright (C) 2020 Intel Corporation. All rights reserved.
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.
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.
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
40 unsigned int strength;
41 unsigned int frequency;
43 int score_last_connected;
44 int score_assoc_reject;
49 static void print_bssid_info(gpointer value, gpointer user_data)
51 struct bssid_info_s *bssid_info = value;
52 int *bssid_rank = user_data;
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);
64 static GSList *get_bssid_list(DBusMessageIter *iter)
67 DBusMessageIter entry, val;
68 GSList *bssid_list = NULL;
69 struct bssid_info_s *bssid_info = NULL;
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);
75 if (strcmp(property, "BSSID") == 0) {
76 bssid_info = g_try_new0(struct bssid_info_s, 1);
80 dbus_message_iter_next(&entry);
81 dbus_message_iter_recurse(&entry, &val);
82 dbus_message_iter_get_basic(&val, &(bssid_info->bssid));
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));
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));
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));
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));
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));
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));
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));
119 bssid_list = g_slist_append(bssid_list, bssid_info);
122 dbus_message_iter_next(iter);
128 static void print_ins_info(int *rank, char *path, char *filter, DBusMessageIter *iter)
135 unsigned char strength;
136 unsigned int frequency;
138 int score_last_user_selection;
139 int score_last_connected;
141 int score_security_priority;
142 int score_internet_connection;
144 GSList *bssid_list = NULL;
145 DBusMessageIter entry, val, dict;
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
218 dbus_message_iter_next(iter);
221 str = strrchr(path, '/');
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);
235 if (!filter || strcmp(filter, "ssid") != 0) {
237 g_slist_foreach(bssid_list, print_bssid_info, &bssid_rank);
244 fprintf(stdout, "%-24s %s", "unchanged\n", str);
249 static void list_ins_array(DBusMessageIter *iter, char *filter)
251 DBusMessageIter array, dict;
255 while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRUCT) {
257 dbus_message_iter_recurse(iter, &array);
258 if (dbus_message_iter_get_arg_type(&array)
259 != DBUS_TYPE_OBJECT_PATH)
262 dbus_message_iter_get_basic(&array, &path);
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);
271 dbus_message_iter_next(iter);
275 void __connmanctl_ins_list(DBusMessageIter *iter, char *filter)
277 DBusMessageIter array;
280 if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
283 dbus_message_iter_recurse(iter, &array);
284 list_ins_array(&array, filter);
286 dbus_message_iter_next(iter);
287 if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
290 fprintf(stdout, "\n}, {");
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);
298 dbus_message_iter_next(&array);