2 * Copyright (c) 2012, 2013 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 #include "mtp_gdbus_manager.h"
24 #include "mtp_gdbus_objectinfo.h"
25 #include "mtp_gdbus_deviceinfo.h"
26 #include "mtp_gdbus_storageinfo.h"
28 typedef struct _event_cb_s {
33 mtpgdbuslibManager *manager_proxy = NULL;
34 static __thread GSList *event_cb_list = NULL;
37 static void __mtp_event_cb(mtpgdbuslibManager *object,
38 gint event, gint arg1, gpointer user_data)
43 for (l = event_cb_list; l != NULL; l = l->next) {
44 event_s = (event_cb_s *)l->data;
45 event_s->cb(event, arg1, event_s->user_data);
50 static void __manager_proxy_init(void)
54 manager_proxy = mtp_gdbuslib_manager_proxy_new_for_bus_sync(
56 G_DBUS_PROXY_FLAGS_NONE,
58 MTP_DBUS_MANAGER_PATH,
62 g_signal_connect(manager_proxy, "mtp-event", G_CALLBACK(__mtp_event_cb), NULL);
65 static void __manager_proxy_deinit(void)
70 mtp_error_e mtp_gdbus_manager_add_event_cb(mtp_event_cb callback, void *user_data)
74 event_s = g_try_new0(event_cb_s, 1);
76 return MTP_ERROR_OUT_OF_MEMORY;
78 event_s->cb = callback;
79 event_s->user_data = user_data;
81 event_cb_list = g_slist_prepend(event_cb_list, event_s);
83 return MTP_ERROR_NONE;
86 mtp_error_e mtp_gdbus_manager_remove_event_cb(mtp_event_cb callback)
91 for (l = event_cb_list; l != NULL; l = l->next) {
93 event_s = (event_cb_s *)l->data;
94 if (callback == event_s->cb)
95 event_cb_list = g_slist_delete_link(event_cb_list, l);
99 return MTP_ERROR_NONE;
102 mtp_error_e mtp_gdbus_manager_remove_all_event_cb(void)
104 g_slist_free_full(event_cb_list, g_free);
105 event_cb_list = NULL;
107 return MTP_ERROR_NONE;
110 mtp_error_e mtp_gdbus_manager_initialize(void)
112 mtp_error_e result = MTP_ERROR_NONE;
114 __manager_proxy_init();
115 mtp_gdbus_deviceinfo_proxy_init();
116 mtp_gdbus_storageinfo_proxy_init();
117 mtp_gdbus_objectinfo_proxy_init();
119 if (manager_proxy == NULL)
120 result = MTP_ERROR_NOT_COMM_INITIALIZED; /* LCOV_EXCL_LINE */
125 /* LCOV_EXCL_START */
126 mtp_error_e mtp_gdbus_manager_get_devices(int **mtp_devices, int *device_num)
129 mtp_error_e result = MTP_ERROR_NONE;
130 GError *error = NULL;
132 if (manager_proxy == NULL)
133 return MTP_ERROR_NOT_COMM_INITIALIZED;
135 if (mtp_gdbuslib_manager_call_get_devices_sync(
142 result = MTP_ERROR_COMM_ERROR;
148 if (*device_num != 0 && (g_variant_n_children(va) == *device_num)) {
149 GVariantIter *iter = NULL, *iter_row = NULL;
154 *mtp_devices = g_new(int, *device_num);
156 g_variant_get(va, "aa{sv}", &iter);
157 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
158 while (g_variant_iter_loop(iter_row, "{sv}", &key, &key_value)) {
159 if (g_strcmp0(key, "mtp_device") == 0)
160 (*mtp_devices)[i] = g_variant_get_int32(key_value);
164 if (iter_row != NULL) {
165 g_variant_iter_free(iter_row);
171 g_variant_iter_free(iter);
181 mtp_error_e mtp_gdbus_manager_get_storages(int mtp_device,
182 int **mtp_storages, int *storage_num)
185 mtp_error_e result = MTP_ERROR_NONE;
186 GError *error = NULL;
188 if (manager_proxy == NULL)
189 return MTP_ERROR_NOT_COMM_INITIALIZED;
191 if (mtp_gdbuslib_manager_call_get_storages_sync(
199 result = MTP_ERROR_COMM_ERROR;
205 if (*storage_num != 0 && (g_variant_n_children(va) == *storage_num)) {
206 GVariantIter *iter = NULL, *iter_row = NULL;
211 *mtp_storages = g_new(int, *storage_num);
213 g_variant_get(va, "aa{sv}", &iter);
214 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
215 while (g_variant_iter_loop(iter_row, "{sv}", &key, &key_value)) {
216 if (g_strcmp0(key, "mtp_storage") == 0)
217 (*mtp_storages)[i] = g_variant_get_int32(key_value);
221 if (iter_row != NULL) {
222 g_variant_iter_free(iter_row);
228 g_variant_iter_free(iter);
238 mtp_error_e mtp_gdbus_manager_get_object_handles(int mtp_device,
239 int mtp_storage, int file_type, int parent_object_handle, int **object_handles, int *object_num)
242 mtp_error_e result = MTP_ERROR_NONE;
243 GError *error = NULL;
245 if (manager_proxy == NULL)
246 return MTP_ERROR_NOT_COMM_INITIALIZED;
248 if (mtp_gdbuslib_manager_call_get_object_handles_sync(
253 parent_object_handle,
259 result = MTP_ERROR_COMM_ERROR;
265 if (*object_num != 0 && (g_variant_n_children(va) == *object_num)) {
266 GVariantIter *iter = NULL, *iter_row = NULL;
271 *object_handles = g_new(int, *object_num);
273 g_variant_get(va, "aa{sv}", &iter);
274 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
275 while (g_variant_iter_loop(iter_row, "{sv}", &key, &key_value)) {
276 if (g_strcmp0(key, "object_handle") == 0)
277 (*object_handles)[i] = g_variant_get_int32(key_value);
281 if (iter_row != NULL) {
282 g_variant_iter_free(iter_row);
288 g_variant_iter_free(iter);
298 mtp_error_e mtp_gdbus_manager_delete_object(int mtp_device,
301 mtp_error_e result = MTP_ERROR_NONE;
302 GError *error = NULL;
304 if (manager_proxy == NULL)
305 return MTP_ERROR_NOT_COMM_INITIALIZED;
307 if (mtp_gdbuslib_manager_call_delete_object_sync(
314 result = MTP_ERROR_COMM_ERROR;
322 mtp_error_e mtp_gdbus_manager_get_object(int mtp_device,
323 int object_handle, char *dest_path)
325 mtp_error_e result = MTP_ERROR_NONE;
326 GError *error = NULL;
328 if (manager_proxy == NULL)
329 return MTP_ERROR_NOT_COMM_INITIALIZED;
331 if (mtp_gdbuslib_manager_call_get_object_sync(
339 result = MTP_ERROR_COMM_ERROR;
347 mtp_error_e mtp_gdbus_manager_get_partial_object(int mtp_device,
348 int object_handle, char *dest_path, int offset, int max_bytes, int *actual_written)
350 mtp_error_e result = MTP_ERROR_NONE;
351 GError *error = NULL;
353 if (manager_proxy == NULL)
354 return MTP_ERROR_NOT_COMM_INITIALIZED;
356 if (mtp_gdbuslib_manager_call_get_partial_object_sync(
367 result = MTP_ERROR_COMM_ERROR;
375 mtp_error_e mtp_gdbus_manager_get_thumbnail(int mtp_device,
376 int object_handle, char *dest_path)
378 mtp_error_e result = MTP_ERROR_NONE;
379 GError *error = NULL;
381 if (manager_proxy == NULL)
382 return MTP_ERROR_NOT_COMM_INITIALIZED;
384 if (mtp_gdbuslib_manager_call_get_thumbnail_sync(
392 result = MTP_ERROR_COMM_ERROR;
401 mtp_error_e mtp_gdbus_manager_deinitialize(void)
403 mtp_error_e result = MTP_ERROR_NONE;
405 __manager_proxy_deinit();
406 mtp_gdbus_deviceinfo_proxy_deinit();
407 mtp_gdbus_storageinfo_proxy_deinit();
408 mtp_gdbus_objectinfo_proxy_deinit();