4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Ja-young Gu <jygu@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
30 struct tcore_udev_type {
34 GUdevEnumerator *enumer;
35 GSList *enumer_callbacks;
39 struct udev_enumer_callback_type {
40 TcoreUdevEnumerCallback func;
44 struct udev_callback_type {
45 TcoreUdevCallback func;
51 static const gchar *_default_subsystems[] = { NULL, };
53 static void _on_uevent(GUdevClient *client, gchar *action, GUdevDevice *device, gpointer user_data)
55 TcoreUdev *udev = user_data;
57 struct udev_callback_type *node;
62 dbg("action = '%s'", action);
64 for (cb = udev->callbacks; cb; cb = cb->next) {
70 if (g_strcmp0(node->action, action) != 0)
74 if (g_strcmp0(node->subsystem, g_udev_device_get_subsystem(device)) != 0)
80 node->func(udev, device, node->user_data);
84 TcoreUdev *tcore_udev_new(Server *s, const gchar **subsystems)
88 udev = calloc(1, sizeof(struct tcore_udev_type));
93 subsystems = _default_subsystems;
97 udev->client = g_udev_client_new(subsystems);
103 g_signal_connect(udev->client, "uevent", G_CALLBACK(_on_uevent), udev);
105 udev->enumer = g_udev_enumerator_new(udev->client);
110 void tcore_udev_free(TcoreUdev *udev)
116 g_object_unref(udev->client);
119 g_object_unref(udev->enumer);
124 Server *tcore_udev_ref_server(TcoreUdev *udev)
132 GUdevClient *tcore_udev_ref_client(TcoreUdev *udev)
140 GUdevEnumerator *tcore_udev_ref_enumerator(TcoreUdev *udev)
148 TReturn tcore_udev_add_enumerator_callback(TcoreUdev *udev, TcoreUdevEnumerCallback func, void *user_data)
150 struct udev_enumer_callback_type *node;
153 return TCORE_RETURN_FAILURE;
155 node = calloc(1, sizeof(struct udev_enumer_callback_type));
157 return TCORE_RETURN_ENOMEM;
160 node->user_data = user_data;
162 udev->enumer_callbacks = g_slist_append(udev->enumer_callbacks, node);
164 return TCORE_RETURN_SUCCESS;
167 GList *tcore_udev_exec_enumerator(TcoreUdev *udev, gboolean event_emit_flag)
171 struct udev_enumer_callback_type *node;
177 list = g_udev_enumerator_execute(udev->enumer);
182 if (event_emit_flag == FALSE)
185 for (cb = udev->enumer_callbacks; cb; cb = cb->next) {
194 node->func(udev, list, node->user_data);
200 TReturn tcore_udev_add_callback(TcoreUdev *udev, const char *subsystem, const char *action, TcoreUdevCallback func, void *user_data)
202 struct udev_callback_type *node;
205 return TCORE_RETURN_FAILURE;
207 node = calloc(1, sizeof(struct udev_callback_type));
209 return TCORE_RETURN_ENOMEM;
212 node->user_data = user_data;
215 node->subsystem = strdup(subsystem);
218 node->action = strdup(action);
220 udev->callbacks = g_slist_append(udev->callbacks, node);
222 dbg("subsystem = [%s]", node->subsystem);
223 dbg("action = [%s]", node->action);
224 dbg("callbacks length = %d", g_slist_length(udev->callbacks));
226 return TCORE_RETURN_SUCCESS;