#include <connman/session.h>
-struct service_entry;
-typedef connman_bool_t (* service_match_cb) (struct connman_session *session,
- struct connman_service *service);
-typedef struct service_entry* (* create_service_entry_cb) (
- struct connman_session *session,
- struct connman_service *service,
+typedef void (* service_iterate_cb) (struct connman_service *service,
const char *name,
- enum connman_service_state state);
+ enum connman_service_state state,
+ void *user_data);
-GSequence *__connman_service_get_list(struct connman_session *session,
- service_match_cb service_match,
- create_service_entry_cb create_service_entry,
- GDestroyNotify destroy_service_entry);
+int __connman_service_iterate_services(service_iterate_cb cb, void *user_data);
void __connman_service_session_inc(struct connman_service *service);
connman_bool_t __connman_service_session_dec(struct connman_service *service);
counter_list = g_slist_remove(counter_list, counter);
}
-GSequence *__connman_service_get_list(struct connman_session *session,
- service_match_cb service_match,
- create_service_entry_cb create_service_entry,
- GDestroyNotify destroy_service_entry)
+int __connman_service_iterate_services(service_iterate_cb cb, void *user_data)
{
- GSequence *list;
GSequenceIter *iter;
- struct connman_service *service;
- struct service_entry *entry;
-
- list = g_sequence_new(destroy_service_entry);
- if (list == NULL)
- return NULL;
iter = g_sequence_get_begin_iter(service_list);
while (g_sequence_iter_is_end(iter) == FALSE) {
- service = g_sequence_get(iter);
-
- if (service_match(session, service) == TRUE) {
- entry = create_service_entry(session, service,
- service->name, service->state);
- if (entry == NULL)
- return list;
+ struct connman_service *service = g_sequence_get(iter);
- g_sequence_append(list, entry);
- }
+ cb(service, service->name, service->state, user_data);
iter = g_sequence_iter_next(iter);
}
- return list;
+ return 0;
}
void __connman_service_session_inc(struct connman_service *service)
return entry;
}
+static void iterate_service_cb(struct connman_service *service,
+ const char *name,
+ enum connman_service_state state,
+ void *user_data)
+{
+ struct connman_session *session = user_data;
+ struct service_entry *entry;
+
+ if (service_match(session, service) == FALSE)
+ return;
+
+ entry = create_service_entry(session, service, name, state);
+ if (entry == NULL)
+ return;
+
+ g_sequence_append(session->service_list, entry);
+}
+
static void destroy_service_entry(gpointer data)
{
struct service_entry *entry = data;
session->service_hash =
g_hash_table_new_full(g_direct_hash, g_direct_equal,
NULL, NULL);
- session->service_list = __connman_service_get_list(session,
- service_match,
- create_service_entry,
- destroy_service_entry);
+ session->service_list = g_sequence_new(destroy_service_entry);
+ __connman_service_iterate_services(iterate_service_cb, session);
g_sequence_sort(session->service_list, sort_services, session);