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.
26 #include "mtp_internal.h"
28 #include "mtp_debug.h"
29 #include "mtp_private.h"
31 #include "mtp_gdbus_manager.h"
32 #include "mtp_gdbus_deviceinfo.h"
33 #include "mtp_gdbus_storageinfo.h"
34 #include "mtp_gdbus_objectinfo.h"
38 pthread_mutex_lock(&mutex); \
43 pthread_mutex_unlock(&mutex); \
46 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
48 #define CHECK_INIT() \
52 if (__is_initialized == false) { \
54 return MTP_ERROR_NOT_INITIALIZED; \
61 bool __is_initialized = false;
63 static bool __is_mtp_supported()
68 static bool __is_mtp_activated()
74 int mtp_initialize(void)
76 int ret = MTP_ERROR_NONE;
80 /* precondition check start */
84 /* precondition check end */
88 if (__is_initialized == false) {
89 ret = mtp_gdbus_manager_initialize();
91 __is_initialized = true;
102 int mtp_get_raw_devices(mtp_raw_device_h **raw_devices, int *device_count)
104 int ret = MTP_ERROR_NONE;
108 /* precondition check start */
113 cond_expr_ret(device_count == NULL, MTP_ERROR_INVALID_PARAMETER);
115 /* precondition check end */
118 ret = mtp_gdbus_manager_get_raw_devices((mtp_raw_device ***)raw_devices, device_count);
125 int mtp_get_bus_location(mtp_raw_device_h raw_device, int *bus_location)
127 int ret = MTP_ERROR_NONE;
131 /* precondition check start */
135 cond_expr_ret(raw_device == NULL, MTP_ERROR_INVALID_PARAMETER);
136 cond_expr_ret(bus_location == NULL, MTP_ERROR_INVALID_PARAMETER);
138 /* precondition check end */
140 *bus_location = ((mtp_raw_device *)raw_device)->bus_location;
147 int mtp_get_device_number(mtp_raw_device_h raw_device, int *device_number)
149 int ret = MTP_ERROR_NONE;
153 /* precondition check start */
157 cond_expr_ret(raw_device == NULL, MTP_ERROR_INVALID_PARAMETER);
158 cond_expr_ret(device_number == NULL, MTP_ERROR_INVALID_PARAMETER);
160 /* precondition check end */
162 *device_number = ((mtp_raw_device *)raw_device)->device_number;
169 int mtp_get_device_name(mtp_raw_device_h raw_device, char **model_name)
171 int ret = MTP_ERROR_NONE;
173 /* precondition check start */
177 cond_expr_ret(raw_device == NULL, MTP_ERROR_INVALID_PARAMETER);
178 cond_expr_ret(model_name == NULL, MTP_ERROR_INVALID_PARAMETER);
180 /* precondition check end */
182 *model_name = g_strdup(((mtp_raw_device *)raw_device)->model_name);
187 int mtp_destroy_raw_devices(mtp_raw_device_h *raw_devices)
190 int ret = MTP_ERROR_NONE;
192 mtp_raw_device *first_device = (mtp_raw_device *)raw_devices[0];
196 /* precondition check start */
199 cond_expr_ret(raw_devices == NULL, MTP_ERROR_INVALID_PARAMETER);
200 cond_expr_ret(first_device == NULL, MTP_ERROR_INVALID_PARAMETER);
202 /* precondition check end */
203 dev_count = first_device->dev_count;
204 if (dev_count <= 0 || dev_count > 6)
205 return MTP_ERROR_INVALID_PARAMETER;
207 for (i = 0; i < dev_count; i++) {
208 mtp_raw_device *r_device = (mtp_raw_device *)raw_devices[i];
210 if (r_device != NULL && r_device->model_name != NULL) {
211 free(r_device->model_name);
223 int mtp_get_device(int bus_location, int device_number, int *mtp_device)
225 int ret = MTP_ERROR_NONE;
229 /* precondition check start */
234 cond_expr_ret(bus_location == 0, MTP_ERROR_INVALID_PARAMETER);
236 /* precondition check end */
238 ret = mtp_gdbus_manager_get_device(bus_location, device_number, mtp_device);
240 TC_PRT("mtp_device %d", *mtp_device);
247 int mtp_get_storages(int mtp_device, int **mtp_storages, int* storage_num)
249 int ret = MTP_ERROR_NONE;
253 /* precondition check start */
258 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
260 /* precondition check end */
262 ret = mtp_gdbus_manager_get_storages(mtp_device, mtp_storages, storage_num);
264 TC_PRT("storage number %d", *storage_num);
271 int mtp_get_object_handles(int mtp_device, int mtp_storage, mtp_filetype_e file_type,
272 int parent, int **object_handles, int* object_num)
274 int ret = MTP_ERROR_NONE;
278 /* precondition check start */
283 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
284 cond_expr_ret(mtp_storage == 0, MTP_ERROR_INVALID_PARAMETER);
286 /* precondition check end */
288 ret = mtp_gdbus_manager_get_object_handles(mtp_device,
289 mtp_storage, file_type, parent, object_handles, object_num);
296 int mtp_delete_object(int mtp_device, int object_handle)
298 int ret = MTP_ERROR_NONE;
302 /* precondition check start */
307 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
308 cond_expr_ret(object_handle == 0, MTP_ERROR_INVALID_PARAMETER);
310 /* precondition check end */
312 ret = mtp_gdbus_manager_delete_object(mtp_device, object_handle);
319 int mtp_get_object(int mtp_device, int object_handle, char *dest_path)
321 int ret = MTP_ERROR_NONE;
325 /* precondition check start */
330 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
331 cond_expr_ret(dest_path == NULL, MTP_ERROR_INVALID_PARAMETER);
333 /* precondition check end */
335 ret = mtp_gdbus_manager_get_object(mtp_device, object_handle, dest_path);
342 int mtp_get_thumbnail(int mtp_device, int object_handle, char *dest_path)
344 int ret = MTP_ERROR_NONE;
348 /* precondition check start */
353 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
354 cond_expr_ret(dest_path == NULL, MTP_ERROR_INVALID_PARAMETER);
356 /* precondition check end */
358 ret = mtp_gdbus_manager_get_thumbnail(mtp_device, object_handle, dest_path);
365 int mtp_set_mtp_event_cb(mtp_event_cb callback, void *user_data)
367 int ret = MTP_ERROR_NONE;
371 /* precondition check start */
375 cond_expr_ret(callback == NULL, MTP_ERROR_INVALID_PARAMETER);
377 /* precondition check end */
379 ret = mtp_gdbus_manager_set_event_cb(callback, user_data);
386 int mtp_unset_mtp_event_cb(void)
388 int ret = MTP_ERROR_NONE;
392 /* precondition check start */
397 /* precondition check end */
399 ret = mtp_gdbus_manager_unset_event_cb();
406 int mtp_deinitialize(void)
408 int ret = MTP_ERROR_NONE;
412 /* precondition check start */
416 /* precondition check end */
423 if (__is_initialized == true && ref_count == 0) {
425 ret = mtp_gdbus_manager_deinitialize();
426 __is_initialized = false;
437 int mtp_deviceinfo_get_manufacturer_name(int mtp_device, char **manufacturer_name)
439 int ret = MTP_ERROR_NONE;
443 /* precondition check start */
448 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
450 /* precondition check end */
452 ret = mtp_gdbus_deviceinfo_get_manufacturername(mtp_device, manufacturer_name);
454 TC_PRT("manufacturername %s", *manufacturer_name);
461 int mtp_deviceinfo_get_model_name(int mtp_device, char **model_name)
463 int ret = MTP_ERROR_NONE;
467 /* precondition check start */
472 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
474 /* precondition check end */
476 ret = mtp_gdbus_deviceinfo_get_modelname(mtp_device, model_name);
478 TC_PRT("modelname %s", *model_name);
485 int mtp_deviceinfo_get_serial_number(int mtp_device, char **serial_number)
487 int ret = MTP_ERROR_NONE;
491 /* precondition check start */
496 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
498 /* precondition check end */
500 ret = mtp_gdbus_deviceinfo_get_serialnumber(mtp_device, serial_number);
502 TC_PRT("serialnumber %s", *serial_number);
509 int mtp_deviceinfo_get_device_version(int mtp_device, char **device_version)
511 int ret = MTP_ERROR_NONE;
515 /* precondition check start */
520 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
522 /* precondition check end */
524 ret = mtp_gdbus_deviceinfo_get_deviceversion(mtp_device, device_version);
526 TC_PRT("deviceversion %s", *device_version);
534 int mtp_storageinfo_get_description(int mtp_device, int mtp_storage, char **description)
536 int ret = MTP_ERROR_NONE;
540 /* precondition check start */
545 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
546 cond_expr_ret(mtp_storage == 0, MTP_ERROR_INVALID_PARAMETER);
548 /* precondition check end */
550 ret = mtp_gdbus_storageinfo_get_description(mtp_device, mtp_storage, description);
552 TC_PRT("description %s", *description);
559 int mtp_storageinfo_get_free_space(int mtp_device, int mtp_storage, unsigned long long *free_space)
561 int ret = MTP_ERROR_NONE;
565 /* precondition check start */
570 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
571 cond_expr_ret(mtp_storage == 0, MTP_ERROR_INVALID_PARAMETER);
573 /* precondition check end */
575 ret = mtp_gdbus_storageinfo_get_freespace(mtp_device, mtp_storage, (guint64 *)free_space);
577 TC_PRT("freespace %llu", *free_space);
584 int mtp_storageinfo_get_max_capacity(int mtp_device, int mtp_storage, unsigned long long *max_capacity)
586 int ret = MTP_ERROR_NONE;
590 /* precondition check start */
595 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
596 cond_expr_ret(mtp_storage == 0, MTP_ERROR_INVALID_PARAMETER);
598 /* precondition check end */
600 ret = mtp_gdbus_storageinfo_get_maxcapacity(mtp_device, mtp_storage, (guint64 *)max_capacity);
602 TC_PRT("maxcapacity %llu", *max_capacity);
609 int mtp_storageinfo_get_storage_type(int mtp_device, int mtp_storage, mtp_storage_type_e *storage_type)
611 int ret = MTP_ERROR_NONE;
615 /* precondition check start */
620 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
621 cond_expr_ret(mtp_storage == 0, MTP_ERROR_INVALID_PARAMETER);
623 /* precondition check end */
625 ret = mtp_gdbus_storageinfo_get_storagetype(mtp_device, mtp_storage, (int *)storage_type);
627 TC_PRT("storagetype %d", *storage_type);
634 int mtp_storageinfo_get_volume_identifier(int mtp_device, int mtp_storage, char **volume_identifier)
636 int ret = MTP_ERROR_NONE;
640 /* precondition check start */
645 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
646 cond_expr_ret(mtp_storage == 0, MTP_ERROR_INVALID_PARAMETER);
648 /* precondition check end */
650 ret = mtp_gdbus_storageinfo_get_volumeidentifier(mtp_device, mtp_storage, volume_identifier);
652 TC_PRT("volumeidentifier %s", *volume_identifier);
660 int mtp_objectinfo_get_parent_object_handle(int mtp_device, int object_handle,
661 int *parent_object_handle)
663 int ret = MTP_ERROR_NONE;
667 /* precondition check start */
672 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
674 /* precondition check end */
676 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
677 object_handle, MTP_PROPERTY_PARENT_OBJECT_HANDLE, parent_object_handle);
679 TC_PRT("parent object id %d", *parent_object_handle);
686 int mtp_objectinfo_get_storage(int mtp_device, int object_handle,
689 int ret = MTP_ERROR_NONE;
693 /* precondition check start */
698 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
700 /* precondition check end */
702 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
703 object_handle, MTP_PROPERTY_STORAGE, mtp_storage);
710 int mtp_objectinfo_get_association_desc(int mtp_device,
711 int object_handle, int *asso_desc)
713 int ret = MTP_ERROR_NONE;
717 /* precondition check start */
722 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
724 /* precondition check end */
726 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
727 object_handle, MTP_PROPERTY_ASSOCIATION_DESC, asso_desc);
734 int mtp_objectinfo_get_association_type(int mtp_device,
735 int object_handle, int *asso_type)
737 int ret = MTP_ERROR_NONE;
741 /* precondition check start */
746 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
748 /* precondition check end */
750 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
751 object_handle, MTP_PROPERTY_ASSOCIATION_TYPE, asso_type);
758 int mtp_objectinfo_get_size(int mtp_device, int object_handle, int *size)
760 int ret = MTP_ERROR_NONE;
764 /* precondition check start */
769 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
771 /* precondition check end */
773 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
774 object_handle, MTP_PROPERTY_SIZE, size);
781 int mtp_objectinfo_get_date_created(int mtp_device,
782 int object_handle, int *data_created)
784 int ret = MTP_ERROR_NONE;
788 /* precondition check start */
793 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
795 /* precondition check end */
797 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
798 object_handle, MTP_PROPERTY_DATE_CREATED, data_created);
805 int mtp_objectinfo_get_date_modified(int mtp_device,
806 int object_handle, int *data_modified)
808 int ret = MTP_ERROR_NONE;
812 /* precondition check start */
817 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
819 /* precondition check end */
821 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
822 object_handle, MTP_PROPERTY_DATE_MODIFIED, data_modified);
829 int mtp_objectinfo_get_file_type(int mtp_device, int object_handle, mtp_filetype_e *file_type)
831 int ret = MTP_ERROR_NONE;
835 /* precondition check start */
840 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
842 /* precondition check end */
844 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
845 object_handle, MTP_PROPERTY_FORMAT, (int*)file_type);
852 int mtp_objectinfo_get_image_bit_depth(int mtp_device,
853 int object_handle, int *depth)
855 int ret = MTP_ERROR_NONE;
859 /* precondition check start */
864 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
866 /* precondition check end */
868 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
869 object_handle, MTP_PROPERTY_IMAGE_BIT_DEPTH, depth);
876 int mtp_objectinfo_get_image_pix_width(int mtp_device,
877 int object_handle, int *width)
879 int ret = MTP_ERROR_NONE;
883 /* precondition check start */
888 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
890 /* precondition check end */
892 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
893 object_handle, MTP_PROPERTY_IMAGE_PIX_WIDTH, width);
900 int mtp_objectinfo_get_image_pix_height(int mtp_device,
901 int object_handle, int *height)
903 int ret = MTP_ERROR_NONE;
907 /* precondition check start */
912 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
914 /* precondition check end */
916 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
917 object_handle, MTP_PROPERTY_IMAGE_PIX_HEIGHT, height);
924 int mtp_objectinfo_get_thumbnail_size(int mtp_device,
925 int object_handle, int *size)
927 int ret = MTP_ERROR_NONE;
931 /* precondition check start */
936 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
938 /* precondition check end */
940 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
941 object_handle, MTP_PROPERTY_THUMBNAIL_SIZE, size);
948 int mtp_objectinfo_get_thumbnail_file_type(int mtp_device,
949 int object_handle, mtp_filetype_e *file_type)
951 int ret = MTP_ERROR_NONE;
955 /* precondition check start */
960 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
962 /* precondition check end */
964 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
965 object_handle, MTP_PROPERTY_THUMBNAIL_FORMAT, (int*)file_type);
972 int mtp_objectinfo_get_thumbnail_pix_height(int mtp_device,
973 int object_handle, int *height)
975 int ret = MTP_ERROR_NONE;
979 /* precondition check start */
984 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
986 /* precondition check end */
988 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
989 object_handle, MTP_PROPERTY_THUMBNAIL_HEIGHT, height);
996 int mtp_objectinfo_get_thumbnail_pix_width(int mtp_device,
997 int object_handle, int *width)
999 int ret = MTP_ERROR_NONE;
1003 /* precondition check start */
1008 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
1010 /* precondition check end */
1012 ret = mtp_gdbus_objectinfo_get_property(mtp_device,
1013 object_handle, MTP_PROPERTY_THUMBNAIL_WIDTH, width);
1020 int mtp_objectinfo_get_file_name(int mtp_device,
1021 int object_handle, char **filename)
1023 int ret = MTP_ERROR_NONE;
1027 /* precondition check start */
1032 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
1034 /* precondition check end */
1036 ret = mtp_gdbus_objectinfo_get_property_string(mtp_device,
1037 object_handle, MTP_PROPERTY_FILENAME, filename);
1044 int mtp_objectinfo_get_keywords(int mtp_device,
1045 int object_handle, char **keywords)
1047 int ret = MTP_ERROR_NONE;
1051 /* precondition check start */
1056 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
1058 /* precondition check end */
1060 ret = mtp_gdbus_objectinfo_get_property_string(mtp_device,
1061 object_handle, MTP_PROPERTY_KEYWORDS, keywords);
1068 int mtp_objectinfo_get_object_info(int mtp_device,
1069 int object_handle, mtp_object_info **object_info)
1071 int ret = MTP_ERROR_NONE;
1075 /* precondition check start */
1080 cond_expr_ret(mtp_device == 0, MTP_ERROR_INVALID_PARAMETER);
1082 /* precondition check end */
1084 ret = mtp_db_get_object_info(mtp_device, object_handle, object_info);